3dPrinting :

- gestione regioni con numero diverso di passate.
This commit is contained in:
SaraP
2022-08-12 12:27:41 +02:00
parent ffd86bd009
commit ff84fd21c3
9 changed files with 784 additions and 271 deletions
+58 -35
View File
@@ -47,12 +47,30 @@ local function ComputeMaxH( nStmId, frSlicing, HMax)
local b3Box = EgtGetBBoxGlob( nGrpTmp, GDB_BB.STANDARD)
EgtErase( nGrpTmp)
local ptMin = b3Box:getMin()
ptMin:toLoc( frSlicing)
ptMin:toLoc( frSlicing)
return ptMin:getZ()
end
return GEO.INFINITO
end
--------------------------------------------------------------------
local function AdjustRibs( nRibsLay)
-- recupero le superfici che definiscono le nervature
local vRibsIds = EgtGetAllInGroup( nRibsLay or GDB_ID.NULL)
if not vRibsIds or #vRibsIds == 0 then return end
-- sistemo la direzione normale dei piani
for i = 1, #vRibsIds do
if EgtGetType( vRibsIds[i]) == GDB_TY.SRF_MESH then
local vtN = EgtSurfTmFacetNormVersor( vRibsIds[i], 0)
local dVal = EgtIf( abs( vtN:getX()) > abs( vtN:getY()) - GEO.EPS_SMALL, vtN:getX(), vtN:getY())
if dVal < - GEO.EPS_SMALL then
EgtInvertSurf( vRibsIds[i])
end
end
end
end
--------------------------------------------------------------------
local function ReadParam( nId, sKey, sType, table)
local info = EgtGetInfo( nId, sKey, sType) or EgtGetInfo( s_nPartId, sKey, sType)
@@ -85,32 +103,27 @@ local function GetRibParams( nId)
end
--------------------------------------------------------------------
local function SlicingRibs( vtSlicing)
local nRibsShells = EgtGetInfo( s_nPartId, KEY_RIBS_SHELLS_NBR, 'i') or 0
if nRibsShells == 0 then return end
local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName)
-- recupero le superfici che definiscono le nervature
local nRibsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_RIBS)
local vRibsIds = EgtGetAllInGroup( nRibsLay or GDB_ID.NULL)
if not vRibsIds or #vRibsIds == 0 then return end
-- sistemo la direzione normale dei piani
for i = 1, #vRibsIds do
if EgtGetType( vRibsIds[i]) == GDB_TY.SRF_MESH then
local vtN = EgtSurfTmFacetNormVersor( vRibsIds[i], 0)
local dVal = EgtIf( abs( vtN:getX()) > abs( vtN:getY()) - GEO.EPS_SMALL, vtN:getX(), vtN:getY())
if dVal < - GEO.EPS_SMALL then
EgtInvertSurf( vRibsIds[i])
end
end
end
-- recupero i parametri di ogni costolatura
-- recupero gli oggeti di cui fare slicing
local vIds = EgtGetAllInGroup( nLay)
if not vIds or #vIds == 0 then return end
-- recupero i parametri di ogni oggetto
local tabParams = {}
for i = 1, #vRibsIds do
local vRibParams = GetRibParams( vRibsIds[i])
table.insert( tabParams, vRibParams)
local vToBeDone = {}
for i = 1, #vIds do
local vParams = {}
local bToBeDone = true
if nType == TYPE.RIB then
vParams = GetRibParams( vIds[i])
if vParams[ KEY_RIBS_SHELLS_NBR] == 0 then bToBeDone = false end
elseif nType == TYPE.EXTRA_SHELL then
vParams[KEY_SHELL_NBR_DIFF] = EgtGetInfo( vIds[i], KEY_SHELL_NBR_DIFF, 'i') or EgtGetInfo( s_nPartId, KEY_SHELL_NBR_DIFF, 'i')
if vParams[KEY_SHELL_NBR_DIFF] == 0 then bToBeDone = false end
end
table.insert( tabParams, vParams)
table.insert( vToBeDone, bToBeDone)
end
local nLayId = EgtGetFirstNameInGroup( s_nPartId, SLICE_LAYER .. '*')
@@ -120,13 +133,13 @@ local function SlicingRibs( vtSlicing)
local dDeltaZ = EgtGetInfo( nLayId, KEY_SLICE_DELTAZ, 'd')
-- creo gruppo per le costolature
local nGrp = EgtGroup( nLayId)
EgtSetName( nGrp, RIBS_GRP)
EgtSetName( nGrp, sNameGrp)
EgtSetStatus( nGrp, GDB_ST.OFF)
for i = 1, #vRibsIds do
if EgtGetType( vRibsIds[i]) == GDB_TY.SRF_MESH then
-- slicing costolatura
local nNewId, nPntCnt, nCrvCnt, nSrfCnt = EgtPlaneSurfTmInters( ORIG() + ( dZ + dDeltaZ) * vtSlicing, vtSlicing, vRibsIds[i], nGrp, GDB_RT.GLOB, TOLER)
for i = 1, #vIds do
if EgtGetType( vIds[i]) == GDB_TY.SRF_MESH and vToBeDone[i] then
-- slicing oggetto
local nNewId, nPntCnt, nCrvCnt, nSrfCnt = EgtPlaneSurfTmInters( ORIG() + ( dZ + dDeltaZ) * vtSlicing, vtSlicing, vIds[i], nGrp, GDB_RT.GLOB, TOLER)
if nNewId then
-- rimuovo punti
for nId = nNewId, nNewId + nPntCnt -1 do
@@ -134,7 +147,7 @@ local function SlicingRibs( vtSlicing)
end
-- rinomino le curve, correggo di DeltaZ e assegno parametri
for nId = nNewId + nPntCnt, nNewId + nPntCnt + nCrvCnt - 1 do
EgtSetName( nId, RIBS_CRV .. tostring( i))
EgtSetName( nId, sName .. tostring( i))
EgtMove( nId, - dDeltaZ * vtSlicing)
for sKey, sVal in pairs( tabParams[i]) do
EgtSetInfo( nId, sKey, sVal)
@@ -155,7 +168,7 @@ local function SlicingRibs( vtSlicing)
nLayId = EgtGetNextName( nLayId, SLICE_LAYER .. '*')
end
return true
return true
end
---------------------------------------------------------------------
@@ -202,8 +215,8 @@ function CalcSlices.Exec( nPartId, nStmId, HMax)
local dZmax = b3Box:getMax():getZ()
local dMaxH = ComputeMaxH( nStmId, frSlicing, HMax)
dZmax = min( dZmax, dMaxH)
--dZmin = 227
--dZmax = 230
-- dZmin = 20
-- dZmax = 230
-- Eseguo slicing
local nLayCnt = 1
@@ -426,7 +439,17 @@ function CalcSlices.Exec( nPartId, nStmId, HMax)
end
-- costolature
SlicingRibs( vtSlicing)
local nRibsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_RIBS)
if nRibsLay then
AdjustRibs( nRibsLay)
SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV)
end
-- solidi per regioni con diverso numero di passate
local nShellNbrLay = EgtGetFirstNameInGroup( s_nPartId, LAY_SHELL_NBR)
if nShellNbrLay then
SlicingExtraObjects( vtSlicing, nShellNbrLay, TYPE.EXTRA_SHELL, SHELL_NBR_GRP, SHELL_NBR_CRV)
end
-- eventuale segnalazione errori
if #vErr > 0 then