3dPrinting 3.1b1 :
- prime modifiche per slicing Multi Planare.
This commit is contained in:
@@ -221,6 +221,7 @@ SLICING_TYPE = {
|
||||
DEG45_X = 2,
|
||||
DEG45_Y = 3,
|
||||
HORIZONTAL = 4,
|
||||
MULTIPLANAR = 5,
|
||||
}
|
||||
|
||||
TYPE = {
|
||||
@@ -303,6 +304,7 @@ LAY_RIBS = "Ribs"
|
||||
LAY_AUX_SOLIDS = "AuxSolids"
|
||||
LAY_SHELL_NBR = "ShellNumber"
|
||||
LAY_AUX = "Aux"
|
||||
SPINE_CURVE = "Spine"
|
||||
LAY_FRAME = "Frame"
|
||||
VIEWPARAMS = 'ViewParams'
|
||||
IMPORTED_SOLID = 'ImportedSolid'
|
||||
|
||||
@@ -4343,12 +4343,17 @@ function CalcPaths.Exec( nPartId)
|
||||
local LayerParams = GetLayerParamsForPathCalc()
|
||||
local nFirstSolidLay = EgtGetInfo( s_nPartId, KEY_FIRST_SOLID_LAY, 'i') or -1
|
||||
local nLastSolidLay = EgtGetInfo( s_nPartId, KEY_LAST_SOLID_LAY, 'i') or -1
|
||||
local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i')
|
||||
|
||||
-- scorro tutti i suoi layer
|
||||
for nIdx = 1, #vLayIds do
|
||||
|
||||
s_nCurrIdx = nIdx
|
||||
|
||||
|
||||
if nSlicingType == SLICING_TYPE.MULTIPLANAR then
|
||||
s_vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICING_DIR, 'v')
|
||||
end
|
||||
|
||||
local nRibsGrp = EgtGetFirstNameInGroup( vLayIds[nIdx], RIBS_GRP)
|
||||
local bIgnoreMergedRibs = true
|
||||
local nAuxSolidsGrp = EgtGetFirstNameInGroup( vLayIds[nIdx], AUX_SOLIDS_GRP)
|
||||
|
||||
+54
-8
@@ -775,13 +775,55 @@ local function SlicingNoSolid( nRibsLay, vZSlices, dDeltaZStart, dZmin, frSlicin
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing)
|
||||
local function MultiPlanarSlicing( nStmId)
|
||||
|
||||
-- recupero la curva guida
|
||||
local nAuxLayId = EgtGetFirstNameInGroup( s_nPartId, LAY_AUX)
|
||||
local nSpineId = EgtGetFirstNameInGroup( nAuxLayId or GDB_ID.NULL, SPINE_CURVE)
|
||||
if not nSpineId or ( EgtGetType( nSpineId) & GDB_FY.GEO_CURVE) == 0 then
|
||||
return nil
|
||||
end
|
||||
-- step lungo la curva
|
||||
local dSliceStep = EgtGetInfo( s_nPartId, KEY_SLICE_STEP, 'd')
|
||||
-- massimo numero di layer da generare
|
||||
local nMaxSlicesNbr = EgtGetInfo( s_nPartId, KEY_MAX_SLICES_NBR, 'i') or 0
|
||||
if nMaxSlicesNbr == 0 then
|
||||
nMaxSlicesNbr = GEO.INFINITO -- da gestire come caso illimitato
|
||||
end
|
||||
-- ciclo sulla curva
|
||||
local nFirstGrpId
|
||||
local dCrvLen = EgtCurveLength( nSpineId)
|
||||
for i = 0, nMaxSlicesNbr - 1 do
|
||||
local dCurrLen = max( i * dSliceStep, 100 * GEO.EPS_SMALL)
|
||||
if dCurrLen > dCrvLen then
|
||||
break
|
||||
end
|
||||
local dU = EgtCurveParamAtLength( nSpineId, dCurrLen)
|
||||
local ptOn = EgtUP( nSpineId, dU, GDB_ID.ROOT)
|
||||
local vtN = EgtUV( nSpineId, dU, -1, GDB_ID.ROOT)
|
||||
local nGrpId = EgtGroup( s_nPartId)
|
||||
if not nFirstGrpId then
|
||||
nFirstGrpId = nGrpId
|
||||
end
|
||||
local nEntId = EgtPlaneSurfTmInters( ptOn, vtN, nStmId, nGrpId, GDB_RT.GLOB, TOLER)
|
||||
EgtSetInfo( nGrpId, KEY_SLICING_DIR, vtN)
|
||||
end
|
||||
return nFirstGrpId
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing, nSlicingType)
|
||||
|
||||
local vtSlicing = frSlicing:getVersZ()
|
||||
|
||||
-- calcolo delle intersezioni
|
||||
if EgtProcessEvents( 1, 0) == 1 then return false end
|
||||
local nLayId = EgtParPlanesSurfTmInters( ORIG(), vtSlicing, vZSlices, nStmId, s_nPartId, GDB_RT.GLOB, TOLER)
|
||||
local nLayId
|
||||
if nSlicingType ~= SLICING_TYPE.MULTIPLANAR then
|
||||
nLayId = EgtParPlanesSurfTmInters( ORIG(), vtSlicing, vZSlices, nStmId, s_nPartId, GDB_RT.GLOB, TOLER)
|
||||
else
|
||||
nLayId = MultiPlanarSlicing( nStmId)
|
||||
end
|
||||
if EgtProcessEvents( 100, 0) == 1 then return false end
|
||||
|
||||
local vPrevCen = {}
|
||||
@@ -799,7 +841,11 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin
|
||||
EgtSetInfo( nLayId, KEY_SLICE_Z, dPosZ - dZmin)
|
||||
EgtSetInfo( nLayId, KEY_SLICE_REAL_Z, dPosZ)
|
||||
EgtSetInfo( nLayId, KEY_SLICE_NBR, nLayCnt)
|
||||
|
||||
|
||||
if nSlicingType == SLICING_TYPE.MULTIPLANAR then
|
||||
vtSlicing = EgtGetInfo( nLayId, KEY_SLICING_DIR, 'v')
|
||||
end
|
||||
|
||||
-- verifico se necessario ricalcolo
|
||||
local nId = EgtGetLastInGroup( nLayId)
|
||||
local bRecalc = not nId
|
||||
@@ -910,13 +956,10 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin
|
||||
EgtSetColor( vOpenId or {}, 'RED')
|
||||
|
||||
-- creo flat region a partire dalle curve chiuse ottenute con lo slicing
|
||||
local nGrp = EgtGroup( nLayId, frSlicing, GDB_RT.GLOB)
|
||||
for i = 1, #vClosedId do
|
||||
EgtRelocateGlob( vClosedId[i], nGrp)
|
||||
EgtModifyCurveExtrusion( vClosedId[i], vtSlicing, GDB_RT.GLOB)
|
||||
EgtApproxCurve( vClosedId[i], GDB_CA.ARCS, MID_TOLER)
|
||||
EgtRelocateGlob( vClosedId[i], nLayId)
|
||||
end
|
||||
EgtErase( nGrp)
|
||||
local nSurfFR, nSrfNbr = EgtSurfFlatRegion( nLayId, vClosedId)
|
||||
|
||||
if nSurfFR then
|
||||
@@ -1105,6 +1148,9 @@ function CalcSlices.Exec( nPartId, nStmId)
|
||||
vtSlicing = VectorFromSpherical( 1, 45, dHorAng)
|
||||
elseif nSlicingType == SLICING_TYPE.HORIZONTAL then
|
||||
vtSlicing = X_AX()
|
||||
elseif nSlicingType == SLICING_TYPE.MULTIPLANAR then
|
||||
-- la direzione può cambiare da un piano all'altro
|
||||
vtSlicing = Z_AX()
|
||||
end
|
||||
|
||||
EgtSetInfo( s_nPartId, KEY_SLICING_DIR, vtSlicing)
|
||||
@@ -1167,7 +1213,7 @@ function CalcSlices.Exec( nPartId, nStmId)
|
||||
bOk = SlicingNoSolid( nRibsLay, vZSlices, dDeltaZStart, dZmin, frSlicing)
|
||||
else
|
||||
-- caso con solido
|
||||
bOk = SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing)
|
||||
bOk = SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing, nSlicingType)
|
||||
end
|
||||
|
||||
-- eventuale segnalazione errori
|
||||
|
||||
@@ -89,6 +89,11 @@ end
|
||||
------------------------------------------------------------------
|
||||
local function AddZCorrection( b3Box, LayerParams)
|
||||
|
||||
local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i')
|
||||
if nSlicingType == SLICING_TYPE.MULTIPLANAR then
|
||||
LayerParams.vtSlicing = Z_AX()
|
||||
end
|
||||
|
||||
local dNxy = sqrt( LayerParams.vtSlicing:getX() * LayerParams.vtSlicing:getX() + LayerParams.vtSlicing:getY() * LayerParams.vtSlicing:getY())
|
||||
local dNz = LayerParams.vtSlicing:getZ()
|
||||
-- altezza necessaria per lo strand
|
||||
@@ -2041,6 +2046,10 @@ local function SpiralVaseFull( vLayIds, LayerParams)
|
||||
-- ciclo sui layer
|
||||
for nIdx = 1, #vLayIds do
|
||||
|
||||
if nSlicingType == SLICING_TYPE.MULTIPLANAR then
|
||||
LayerParams.vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICING_DIR, 'v')
|
||||
end
|
||||
|
||||
-- cerco i gruppi di contorni
|
||||
local vCrvGrpIds = EgtGetNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*")
|
||||
if #vCrvGrpIds > 1 then
|
||||
@@ -2244,6 +2253,7 @@ local function SpiralVasePartial( vLayIds, LayerParams)
|
||||
-- la continuità tra i layers viene risolta sul tratto finale del layer percedente
|
||||
|
||||
local bFirst = true
|
||||
local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i')
|
||||
-- individuo l'ultimo layer ( alcuni potrebbero essere vuoti)
|
||||
local nLastLay = 1
|
||||
for nIdx = #vLayIds, 1, -1 do
|
||||
@@ -2258,7 +2268,11 @@ local function SpiralVasePartial( vLayIds, LayerParams)
|
||||
-- ciclo sui layer
|
||||
local nOldId
|
||||
for nIdx = 1, #vLayIds do
|
||||
|
||||
|
||||
if nSlicingType == SLICING_TYPE.MULTIPLANAR then
|
||||
LayerParams.vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICING_DIR, 'v')
|
||||
end
|
||||
|
||||
-- cerco i gruppi di contorni
|
||||
local vCrvGrpIds = EgtGetNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*")
|
||||
if #vCrvGrpIds > 1 then
|
||||
@@ -2444,6 +2458,7 @@ function CalcToolPath.Exec( nPartId)
|
||||
|
||||
-- recupero i parametri per calcolo dei toolpath
|
||||
local LayerParams = GetLayerParamsForToolPathCalc()
|
||||
local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i')
|
||||
|
||||
-- caso spiral vase
|
||||
if LayerParams.bSpiralVase then
|
||||
@@ -2456,7 +2471,11 @@ function CalcToolPath.Exec( nPartId)
|
||||
for nIdx = 1, #vLayIds do
|
||||
|
||||
s_nCurrIdx = nIdx
|
||||
|
||||
|
||||
if nSlicingType == SLICING_TYPE.MULTIPLANAR then
|
||||
LayerParams.vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICING_DIR, 'v')
|
||||
end
|
||||
|
||||
-- scorro tutti i gruppi di contorni
|
||||
local nCrvGrpId = EgtGetFirstNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*")
|
||||
while nCrvGrpId do
|
||||
|
||||
@@ -410,11 +410,17 @@ function RunCalcSolids.Exec()
|
||||
end
|
||||
|
||||
EgtSetInfo( nPartId, KEY_HAS_SOLIDS, 1)
|
||||
local nSlicingType = EgtGetInfo( nPartId, KEY_SLICING_TYPE, 'i')
|
||||
|
||||
-- recupero i parametri necessari al calcolo dei solidi
|
||||
local LayerParams = GetLayerParamsForSolidCalc( nPartId)
|
||||
|
||||
for nIdx = 1, #vLayIds do
|
||||
|
||||
if nSlicingType == SLICING_TYPE.MULTIPLANAR then
|
||||
LayerParams.vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICING_DIR, 'v')
|
||||
end
|
||||
|
||||
-- flag di interruzione perchè trovati solidi già ok
|
||||
local bSolidsOk = false
|
||||
-- indice layer (per log)
|
||||
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
-- Version.lua by Egaltech s.r.l. 2025/09/12
|
||||
-- Version.lua by Egaltech s.r.l. 2026/02/11
|
||||
-- Gestione della versione di 3dPrinting
|
||||
|
||||
VERSION = '3.1a1'
|
||||
VERSION = '3.1b1'
|
||||
Reference in New Issue
Block a user