3dPrinting :
- gestione regioni con numero diverso di passate.
This commit is contained in:
+58
-35
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user