3dPrinting 3.1g2 :
- aggiunta possibilità di creare un unico percorso a partire da due shells - correzioni minori.
This commit is contained in:
@@ -88,6 +88,8 @@ KEY_WIPE_FEEDPU = 'WipeFeedPu'
|
||||
KEY_TOOL_DIAM = 'ToolDiam'
|
||||
KEY_MAX_STRANDH_FACTOR = 'MaxStrandHFactor'
|
||||
KEY_MIN_STRANDH_FACTOR = 'MinStrandHFactor'
|
||||
KEY_JOIN_SHELLS = 'JoinShells'
|
||||
KEY_SHELLS_JOINT_OVERLAP = 'ShellsJointOverlap'
|
||||
|
||||
-- Solid Fill
|
||||
KEY_FLOOR_NBR = 'FloorCount'
|
||||
@@ -309,6 +311,7 @@ TABLE = 'Table'
|
||||
PART = 'Part'
|
||||
PRINT_SOLID = 'PrintSolid'
|
||||
LAY_MACH_START = 'MachStart'
|
||||
JOINT_POSITION = 'JointPosition'
|
||||
LAY_RIBS = 'Ribs'
|
||||
LAY_AUX_SOLIDS = 'AuxSolids'
|
||||
LAY_SHELL_NBR = 'ShellNumber'
|
||||
|
||||
+117
-33
@@ -34,6 +34,8 @@ local function GetLayerParamsForPathCalc()
|
||||
s_vtSlicing = EgtGetInfo( s_nPartId, KEY_SLICE_DIR, 'v')
|
||||
LayerParams.bPrintInvert = ( EgtGetInfo( s_nPartId, KEY_PRINT_DIRECTION, 'i') == PRINT_DIRECTION.CW)
|
||||
LayerParams.vPrintOrder = EgtGetInfo( s_nPartId, KEY_PRINT_ORDER, 'vi') or { 1, 2, 3, 4, 5, 6, 7, 8}
|
||||
LayerParams.bJoinShells = EgtGetInfo( s_nPartId, KEY_JOIN_SHELLS, 'b') or false
|
||||
LayerParams.dJointOverlap = EgtGetInfo( s_nPartId, KEY_SHELLS_JOINT_OVERLAP, 'd') or 0
|
||||
-- parametri costolature
|
||||
LayerParams.bRibsInvertOrder = EgtGetInfo( s_nPartId, KEY_RIBS_INVERT_ORDER, 'b') or false
|
||||
LayerParams.bInvertRibsMergedShellLink = EgtGetInfo( s_nPartId, KEY_INVERT_RIBS_MERGED_SHELL_LINK, 'b') or false
|
||||
@@ -115,46 +117,42 @@ local function ComputeTrimSurf( nSrf, nGrpId, dStrand, dOverlap)
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function GetLayerStartPoint( nLayId)
|
||||
local function GetReferenceOnLayer( vIds, nLayId)
|
||||
|
||||
-- creo un layer dove salvare i punti e le curve da usare come riferimento per le partenze dello slice corrente
|
||||
-- creo un layer dove salvare i punti e le curve da usare come riferimento per lo slice corrente
|
||||
-- assegno un frame diretto come vtSlicing per poterlo utilizzare per il calcolo delle intersezioni con le curve del path ( fatte sul piano xy)
|
||||
local nStartLayer = EgtGroup( nLayId, Frame3d( ORIG(), s_vtSlicing), GDB_RT.GLOB)
|
||||
|
||||
local nMachStartGrp = EgtGetFirstNameInGroup( s_nPartId, LAY_MACH_START)
|
||||
local nLayer = EgtGroup( nLayId, Frame3d( ORIG(), s_vtSlicing), GDB_RT.GLOB)
|
||||
|
||||
local ptOn = EgtGetInfo( nLayId, KEY_SLICE_POS, 'p')
|
||||
local nStartId = EgtGetFirstInGroup( nMachStartGrp)
|
||||
while nStartId do
|
||||
local nType = EgtGetType( nStartId)
|
||||
for i = 1, #vIds do
|
||||
local nType = EgtGetType( vIds[i])
|
||||
|
||||
-- se punto lo salvo direttamente
|
||||
if nType == GDB_TY.GEO_POINT then
|
||||
EgtCopyGlob( nStartId, nStartLayer)
|
||||
EgtCopyGlob( vIds[i], nLayer)
|
||||
|
||||
-- se curva la interseco con il piano
|
||||
elseif nType & GDB_FY.GEO_CURVE ~= 0 then
|
||||
local nId, nCnt = EgtPlaneCurveInters( ptOn, s_vtSlicing, nStartId, nStartLayer, GDB_RT.GLOB)
|
||||
local nId, nCnt = EgtPlaneCurveInters( ptOn, s_vtSlicing, vIds[i], nLayer, GDB_RT.GLOB)
|
||||
if not nId or nCnt == 0 then
|
||||
-- se non ha intersezioni salvo l'estremo della curva più vicino al piano
|
||||
local ptS = EgtSP( nStartId, GDB_ID.ROOT)
|
||||
local ptE = EgtEP( nStartId, GDB_ID.ROOT)
|
||||
local ptS = EgtSP( vIds[i], GDB_ID.ROOT)
|
||||
local ptE = EgtEP( vIds[i], GDB_ID.ROOT)
|
||||
local dDistS = abs(( ptS - ptOn) * s_vtSlicing)
|
||||
local dDistE = abs(( ptE - ptOn) * s_vtSlicing)
|
||||
if abs( dDistS - dDistE) < GEO.EPS_SMALL then
|
||||
EgtPoint( nStartLayer, ptS, GDB_RT.GLOB)
|
||||
EgtPoint( nStartLayer, ptE, GDB_RT.GLOB)
|
||||
EgtPoint( nLayer, ptS, GDB_RT.GLOB)
|
||||
EgtPoint( nLayer, ptE, GDB_RT.GLOB)
|
||||
elseif dDistS < dDistE then
|
||||
EgtPoint( nStartLayer, ptS, GDB_RT.GLOB)
|
||||
EgtPoint( nLayer, ptS, GDB_RT.GLOB)
|
||||
else
|
||||
EgtPoint( nStartLayer, ptE, GDB_RT.GLOB)
|
||||
EgtPoint( nLayer, ptE, GDB_RT.GLOB)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
nStartId = EgtGetNext( nStartId)
|
||||
end
|
||||
|
||||
return nStartLayer
|
||||
return nLayer
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
@@ -355,6 +353,47 @@ local function AdjustTrimSurfExtraAngleChunks( nTrimSurf, dOffs, dStrand)
|
||||
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------
|
||||
local function JoinShells( vShells, vJointIds, nStartLay, nLayId, dStrand, dOverlap)
|
||||
-- recupero punti e curve dove fare la giunzione sul layer corrente
|
||||
local nJointsLay = GetReferenceOnLayer( vJointIds, nLayId)
|
||||
|
||||
-- taglio le shell in corrispondenza del punto ottimale
|
||||
local dTrimDist = 0.5 * dStrand * ( 1 - dOverlap / 100)
|
||||
|
||||
local nShell1 = EgtCopyGlob( vShells[1], EgtGetParent( vShells[1]))
|
||||
ModifyStartPoint( nShell1, nJointsLay)
|
||||
EgtTrimCurveStartAtLen( nShell1, dTrimDist)
|
||||
EgtTrimCurveEndAtLen( nShell1, EgtCurveLength( nShell1) - dTrimDist)
|
||||
|
||||
local nShell2 = EgtCopyGlob( vShells[2], EgtGetParent( vShells[1]))
|
||||
ModifyStartPoint( nShell2, nJointsLay)
|
||||
EgtTrimCurveStartAtLen( nShell2, dTrimDist)
|
||||
EgtTrimCurveEndAtLen( nShell2, EgtCurveLength( nShell2) - dTrimDist)
|
||||
EgtInvertCurve( nShell2)
|
||||
|
||||
-- verifico che il collegamento sia sensato
|
||||
local ptS1 = EgtSP( nShell1, GDB_ID.ROOT)
|
||||
local ptE1 = EgtEP( nShell1, GDB_ID.ROOT)
|
||||
local ptS2 = EgtSP( nShell2, GDB_ID.ROOT)
|
||||
local ptE2 = EgtEP( nShell2, GDB_ID.ROOT)
|
||||
if dist( ptE1, ptS2) > 2 * dStrand or dist( ptS1, ptE2) > 2 * dStrand then
|
||||
EgtOutLog( 'Warning : shell junction is not possibile (layer '.. EgtNumToString( s_nCurrIdx) ..') - CalcPaths')
|
||||
EgtErase( { nShell1, nShell2, nJointsLay})
|
||||
return
|
||||
end
|
||||
|
||||
-- unisco
|
||||
EgtAddCurveCompoLine( nShell1, ptS2, GDB_RT.GLOB)
|
||||
EgtAddCurveCompoCurve( nShell1, nShell2)
|
||||
EgtCloseCurveCompo( nShell1)
|
||||
-- sistemo il punto iniziale
|
||||
ModifyStartPoint( nShell1, nStartLay)
|
||||
|
||||
EgtErase( vShells)
|
||||
EgtErase( nJointsLay)
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------
|
||||
------------------------- INFILL -----------------------------------
|
||||
--------------------------------------------------------------------
|
||||
@@ -3533,6 +3572,8 @@ local function CalcRibsMergedShells( nSlicedRibsGrp, nPathGrp, LayerParams, nSta
|
||||
-- ripristino orientamento originale
|
||||
if EgtCurveIsClosed( nId) then
|
||||
local vtCrv = EgtCurveArea( nId)
|
||||
local frLoc = EgtGetGlobFrame( nId)
|
||||
vtCrv:toGlob( frLoc)
|
||||
if AreOppositeVectorApprox( vtCrv, s_vtSlicing) then
|
||||
EgtInvertCurve( nId)
|
||||
end
|
||||
@@ -3810,7 +3851,7 @@ local function UpdateExtraShellRetractionParamsAfterMerge( nCrv1, nCrv2, nCase)
|
||||
|
||||
end
|
||||
---------------------------------------------------------------------
|
||||
local function ReorderExtraShells( nPathGrp, nStartLay, LayerParams)
|
||||
local function ReorderExtraShells( nPathGrp, nStartLay, nMaxShellNbrDiff, LayerParams)
|
||||
|
||||
local dAlpha = 1.2
|
||||
|
||||
@@ -3864,19 +3905,28 @@ local function ReorderExtraShells( nPathGrp, nStartLay, LayerParams)
|
||||
end
|
||||
end
|
||||
|
||||
-- verifico se le curve si possono chiudere
|
||||
-- verifico se le curve si possono chiudere ed essere gestite come shell
|
||||
vShells = EgtGetNameInGroup( nPathGrp, sName)
|
||||
for i = 1, #vShells do
|
||||
if not EgtCurveIsClosed( vShells[i]) then
|
||||
if dist( EgtSP( vShells[i]), EgtEP( vShells[i])) < dAlpha * dStrand + GEO.EPS_SMALL then
|
||||
EgtCloseCurveCompo( vShells[i])
|
||||
-- ripristino orientamento originale
|
||||
local vtCrv = EgtCurveArea( vShells[i])
|
||||
if AreOppositeVectorApprox( vtCrv, s_vtSlicing) then
|
||||
EgtInvertCurve( vShells[i])
|
||||
UpdateInvertInfo( vShells[i])
|
||||
end
|
||||
if #vShells == 1 then
|
||||
if not EgtCurveIsClosed( vShells[1]) and dist( EgtSP( vShells[1]), EgtEP( vShells[1])) < dAlpha * dStrand + GEO.EPS_SMALL then
|
||||
EgtCloseCurveCompo( vShells[1])
|
||||
end
|
||||
|
||||
if EgtCurveIsClosed( vShells[1]) then
|
||||
-- ripristino orientamento originale
|
||||
local vtCrv = EgtCurveArea( vShells[1])
|
||||
local frLoc = EgtGetGlobFrame( vShells[1])
|
||||
vtCrv:toGlob( frLoc)
|
||||
if AreOppositeVectorApprox( vtCrv, s_vtSlicing) then
|
||||
EgtInvertCurve( vShells[1])
|
||||
UpdateInvertInfo( vShells[1])
|
||||
end
|
||||
-- sistemo punto iniziale
|
||||
ModifyStartPoint( vShells[1], nStartLay)
|
||||
-- modifico il nome per unificarlo alle shell
|
||||
local nDelta = tonumber( sName:sub( #( EXTRA_SHELL_CRV) + 1))
|
||||
local nShellNbr = LayerParams.nShellsNbr - nMaxShellNbrDiff - 1 + nDelta
|
||||
EgtSetName( vShells[1], SHELL_CRV .. tostring( nShellNbr))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -4441,6 +4491,24 @@ function CalcPaths.Exec( nPartId)
|
||||
-- recupero i parametri per calcolo dei path
|
||||
local LayerParams = GetLayerParamsForPathCalc()
|
||||
local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i')
|
||||
|
||||
-- recupero elementi di inizio percorso e di giunzione dal layer start
|
||||
local nMachStartGrp = EgtGetFirstNameInGroup( s_nPartId, LAY_MACH_START)
|
||||
local vMachStartIds = EgtGetAllInGroup( nMachStartGrp)
|
||||
local vStartIds = {}
|
||||
local vJointIds = {}
|
||||
for i = 1, #vMachStartIds do
|
||||
if EgtGetName( vMachStartIds[i]) == JOINT_POSITION or EgtGetInfo( vMachStartIds[i], KEY_ENTITY_NAME) == JOINT_POSITION then
|
||||
table.insert( vJointIds, vMachStartIds[i])
|
||||
else
|
||||
table.insert( vStartIds, vMachStartIds[i])
|
||||
end
|
||||
end
|
||||
if LayerParams.bJoinShells and #vJointIds == 0 then
|
||||
EgtOutBox( 'No joint position for joining shells', 'Error', 'ERROR')
|
||||
EgtOutLog( 'Error : no joint position for joining shells - CalcPaths')
|
||||
return false
|
||||
end
|
||||
|
||||
-- scorro tutti i suoi layer
|
||||
for nIdx = 1, #vLayIds do
|
||||
@@ -4461,7 +4529,7 @@ function CalcPaths.Exec( nPartId)
|
||||
local nShellNbrSurfGrp = CreateShellNbrSurfaces( nShellNbrGrp, LayerParams.nShellsNbr)
|
||||
|
||||
-- creo un layer con gli start da considerare per lo slice corrente
|
||||
local nStartLay = GetLayerStartPoint( vLayIds[nIdx])
|
||||
local nStartLay = GetReferenceOnLayer( vStartIds, vLayIds[nIdx])
|
||||
|
||||
-- scorro tutti i gruppi di contorni
|
||||
local nCrvGrpId = EgtGetFirstNameInGroup( vLayIds[nIdx], CONTOUR_GRP.."*") or GDB_ID.NULL
|
||||
@@ -4576,7 +4644,23 @@ function CalcPaths.Exec( nPartId)
|
||||
bIgnoreMergedRibs = CalcRibsMergedShells( nRibsGrp, nGrpId, LayerParams, nStartLay)
|
||||
|
||||
-- riordino extra shells
|
||||
ReorderExtraShells( nGrpId, nStartLay, LayerParams)
|
||||
ReorderExtraShells( nGrpId, nStartLay, nMaxShellNbrDiff, LayerParams)
|
||||
|
||||
-- eventuale unione
|
||||
if LayerParams.bJoinShells then
|
||||
-- verifico che nel path ci siano solo due shell ( shell0 e shell1)
|
||||
local vShells = EgtGetNameInGroup( nGrpId, SHELL_CRV .. '*')
|
||||
local vExtraShells = EgtGetNameInGroup( nGrpId, EXTRA_SHELL_CRV .. '*')
|
||||
if #vShells == 2 and #vExtraShells == 0 and EgtGetName( vShells[1]) == SHELL_CRV .. '0' and EgtGetName( vShells[2]) == SHELL_CRV .. '1' then
|
||||
JoinShells( vShells, vJointIds, nStartLay, vLayIds[nIdx], LayerParams.dStrand, LayerParams.dJointOverlap)
|
||||
else
|
||||
if #vExtraShells > 0 then
|
||||
EgtOutLog( 'Warning : shell junction is not possibile since there are extra shells (layer '.. EgtNumToString( s_nCurrIdx) ..') - CalcPaths')
|
||||
else
|
||||
EgtOutLog( 'Warning : in order to join shells there must be only two complete shells (layer '.. EgtNumToString( s_nCurrIdx) ..') - CalcPaths')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- gestione solidi ausiliari ( se no floor o ceil)
|
||||
|
||||
@@ -1503,19 +1503,19 @@ local function SlicingWithSolid( vStmIds, nSlicingType, dMaxH, vSlicingVal, vSli
|
||||
SlicingExtraObjects( nRibsLay, vSlicingDir, vSlicingVal, nSlicingType, TYPE.RIB, RIBS_CRV, RIBS_GRP, vStmIds)
|
||||
if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vLayers + 3) / nCounterTot * 100, 0) == 1 then return false end
|
||||
|
||||
-- solidi per regioni con diverso numero di passate
|
||||
local nShellNbrLay = EgtGetFirstNameInGroup( s_nPartId, LAY_SHELL_NBR)
|
||||
SlicingExtraObjects( nShellNbrLay, vSlicingDir, vSlicingVal, nSlicingType, TYPE.EXTRA_SHELL, SHELL_NBR_CRV, SHELL_NBR_GRP)
|
||||
if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vLayers + 6) / nCounterTot * 100, 0) == 1 then return false end
|
||||
|
||||
local bSpiralVase = EgtGetInfo( s_nPartId, KEY_SPIRAL_VASE, 'b') or false
|
||||
if not bSpiralVase then
|
||||
-- infill
|
||||
if nSlicingType ~= SLICING_TYPE.MULTIPLANAR and nSlicingType ~= SLICING_TYPE.MULTIPLANAR_DEG45 and nSlicingType ~= SLICING_TYPE.MULTIPLANAR_HOR then
|
||||
PrepareInfill( vStmIds, vSlicingDir[1])
|
||||
end
|
||||
if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vLayers + 6) / nCounterTot * 100, 0) == 1 then return false end
|
||||
|
||||
-- solidi per regioni con diverso numero di passate
|
||||
local nShellNbrLay = EgtGetFirstNameInGroup( s_nPartId, LAY_SHELL_NBR)
|
||||
SlicingExtraObjects( nShellNbrLay, vSlicingDir, vSlicingVal, nSlicingType, TYPE.EXTRA_SHELL, SHELL_NBR_CRV, SHELL_NBR_GRP)
|
||||
if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vLayers + 9) / nCounterTot * 100, 0) == 1 then return false end
|
||||
|
||||
|
||||
-- solidi ausiliari
|
||||
local nAuxSolidsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_AUX_SOLIDS)
|
||||
SlicingExtraObjects( nAuxSolidsLay, vSlicingDir, vSlicingVal, nSlicingType, TYPE.AUX_SOLID, AUX_SOLIDS_CRV, AUX_SOLIDS_GRP)
|
||||
|
||||
@@ -2192,6 +2192,10 @@ local function SpiralVaseFullMultiPlanar( vLayIds, LayerParams)
|
||||
EgtOutBox( 'Error in spiral vase : layer ' .. tostring( nSliceNbr) .. ' has more than one toolpath', 'ToolPathCalc')
|
||||
return false
|
||||
end
|
||||
if not EgtCurveIsClosed( vEntIds[1]) then
|
||||
EgtOutBox( 'Error in spiral vase : open toolpath at layer ' .. tostring( nSliceNbr), 'ToolPathCalc')
|
||||
return false
|
||||
end
|
||||
|
||||
local nNewEntId = EgtCopyGlob( vEntIds[1] or GDB_ID.NULL, nTpathGrpId, GDB_IN.LAST_SON)
|
||||
if nNewEntId then
|
||||
@@ -2481,6 +2485,10 @@ local function SpiralVaseFull( vLayIds, LayerParams)
|
||||
EgtOutBox( 'Error in spiral vase : layer ' .. tostring( nSliceNbr) .. ' has more than one toolpath', 'ToolPathCalc')
|
||||
return false
|
||||
end
|
||||
if not EgtCurveIsClosed( vEntIds[1]) then
|
||||
EgtOutBox( 'Error in spiral vase : open toolpath at layer ' .. tostring( nSliceNbr), 'ToolPathCalc')
|
||||
return false
|
||||
end
|
||||
|
||||
local nNewEntId = EgtCopyGlob( vEntIds[1] or GDB_ID.NULL, nTpathGrpId, GDB_IN.LAST_SON)
|
||||
if nNewEntId then
|
||||
@@ -2713,6 +2721,10 @@ local function SpiralVasePartialMultiPlanar( vLayIds, LayerParams)
|
||||
EgtOutBox( 'Error in spiral vase : layer ' .. tostring( nSliceNbr) .. ' has more than one toolpath', 'ToolPathCalc')
|
||||
return false
|
||||
end
|
||||
if not EgtCurveIsClosed( vEntIds[1]) then
|
||||
EgtOutBox( 'Error in spiral vase : open toolpath at layer ' .. tostring( nSliceNbr), 'ToolPathCalc')
|
||||
return false
|
||||
end
|
||||
|
||||
local nNewEntId = EgtCopyGlob( vEntIds[1] or GDB_ID.NULL, nTpathGrpId, GDB_IN.LAST_SON)
|
||||
if nNewEntId then
|
||||
@@ -2917,6 +2929,10 @@ local function SpiralVasePartial( vLayIds, LayerParams)
|
||||
EgtOutBox( 'Error in spiral vase : layer ' .. tostring( nSliceNbr) .. ' has more than one toolpath', 'ToolPathCalc')
|
||||
return false
|
||||
end
|
||||
if not EgtCurveIsClosed( vEntIds[1]) then
|
||||
EgtOutBox( 'Error in spiral vase : open toolpath at layer ' .. tostring( nSliceNbr), 'ToolPathCalc')
|
||||
return false
|
||||
end
|
||||
|
||||
local nNewEntId = EgtCopyGlob( vEntIds[1] or GDB_ID.NULL, nTpathGrpId, GDB_IN.LAST_SON)
|
||||
if nNewEntId then
|
||||
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
-- Version.lua by Egaltech s.r.l. 2026/07/01
|
||||
-- Version.lua by Egaltech s.r.l. 2026/07/07
|
||||
-- Gestione della versione di 3dPrinting
|
||||
|
||||
VERSION = '3.1g1'
|
||||
VERSION = '3.1g2'
|
||||
Reference in New Issue
Block a user