From d775e0fe499138e89f8290ae230fc8cae033e7fc Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 16 Sep 2022 11:55:15 +0200 Subject: [PATCH 01/79] 3dPrinting : - aggiunto overlap tra passate. --- LuaLibs/AddManData.lua | 1 + LuaLibs/CalcPaths.lua | 35 +++++++++++++++++++++++------------ LuaLibs/CalcToolPath.lua | 4 ++-- LuaLibs/RunSlicing.lua | 1 + 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 1d1454c..9530770 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -40,6 +40,7 @@ KEY_SLICING_DIR="SlicingDir" KEY_SLICE_STEP = "StrandH" KEY_SHELLS_NBR = "StrandCount" KEY_STRAND = "StrandW" +KEY_STRAND_OVERLAP = "StrandOverlap" KEY_OFFSET_SLICE ="Offset" KEY_SP_OFFSET_ON_SLICE = "StartPointOffsetOnSlice" KEY_PRINT_ORDER = "StrandOrder" diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 8a2394e..6f0102c 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -19,8 +19,9 @@ local s_dOffsCorr = 10 * GEO.EPS_SMALL --------------------------------------------------------------------- local function GetLayerParamsForPathCalc() local LayerParams = {} - LayerParams.nShellsNbr = EgtGetInfo( s_nPartId, KEY_SHELLS_NBR, 'i') - LayerParams.dStrand = EgtGetInfo( s_nPartId, KEY_STRAND, 'd') + LayerParams.nShellsNbr = EgtGetInfo( s_nPartId, KEY_SHELLS_NBR, 'i') + LayerParams.dStrand = EgtGetInfo( s_nPartId, KEY_STRAND, 'd') + LayerParams.nStrandOverlap = EgtGetInfo( s_nPartId, KEY_STRAND_OVERLAP, 'i') or 0 LayerParams.dOffs = EgtGetInfo( s_nPartId, KEY_OFFSET_SLICE, 'd') LayerParams.nFloorNbr = EgtGetInfo( s_nPartId, KEY_FLOOR_NBR, 'i') or 0 LayerParams.nFloorType = EgtGetInfo( s_nPartId, KEY_FLOOR_TYPE, 'i') or INFILL_TYPE.ZIGZAG @@ -30,7 +31,7 @@ local function GetLayerParamsForPathCalc() LayerParams.bPrintInvert = ( EgtGetInfo( s_nPartId, KEY_PRINT_DIRECTION, 'i') == PRINT_DIRECTION.CW) -- parametri costolature LayerParams.bRibsInvertOrder = EgtGetInfo( s_nPartId, KEY_RIBS_INVERT_ORDER, 'b') - return LayerParams + return LayerParams end ---------------------------------------------------------------------- @@ -157,7 +158,7 @@ local function VerifyPath( nCrvId, dStrand, vtSlicing, nGrp) -- verifico se fattibile con una sola passata -- TODO da sistemare con medial axis per curva generica local bSingleStrand = false - if EgtCurveIsClosed( nCrvId) then + if EgtCurveIsClosed( nCrvId) then local nGrpTmp = EgtGroup( nGrp, Frame3d( ORIG(), vtSlicing)) EgtRelocateGlob( nCrvId, nGrpTmp) local frLoc, dDimX, dDimY = EgtCurveMinAreaRectangleXY( nCrvId) @@ -1104,7 +1105,7 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d end for nInd = nMaxShellNbrDiff, 1, -1 do - dOffs = dOffs + LayerParams.dStrand + dOffs = dOffs + LayerParams.dStrand * ( 1 - LayerParams.nStrandOverlap / 100) local nSrfDiff = EgtGetFirstNameInGroup( nShellNbrGrp, SHELL_NBR_SURF .. tostring( nInd)) local nOuterCrv = EgtGetFirstNameInGroup( nCrvGrpId, OUTER_CRV) @@ -1121,12 +1122,12 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d EgtChangeId( nNewId, nTrimCrv) nTrimCnt = nTrimCnt - 1 end - + for nCrvT = nTrimCrv, nTrimCrv + nTrimCnt - 1 do -- calcolo offset della curva ( è il percorso della shell) EgtModifyCurveExtrusion( nCrvT, LayerParams.vtSlicing) local nOffs, nOffsCnt = EgtOffsetCurveAdv( nCrvT, - dOffs) - EgtErase( nCrvT) + EgtErase( nCrvT) for nCrvOffs = nOffs, nOffs + nOffsCnt - 1 do -- trim con la regione già occupata dal altre shell local nCrv, nCnt = EgtTrimCurveWithRegion( nCrvOffs, nSrfTrim, true, true) @@ -1147,8 +1148,8 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_SHELL) end - -- aggiorno la superficie occupata dalle shell con quella appena calcolata - UpdateTotalShellSurf( nSrfTrim, nId, LayerParams.dStrand, nGrpId) + -- aggiorno la superficie occupata dalle shell con quella appena calcolata (tenendo conto dell'overlap) + UpdateTotalShellSurf( nSrfTrim, nId, ( 1 - LayerParams.nStrandOverlap / 100) * LayerParams.dStrand, nGrpId) -- se la superficie si annulla non è possibile realizzare altro, quindi cancello tutte le curve rimaste if EgtSurfFrChunkCount( nSrfTrim) == 0 then for j = nId + 1, nCrv + nCnt - 1 do @@ -1157,6 +1158,9 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d for j = nCrvT + 1, nTrimCrv + nTrimCnt - 1 do EgtErase( j) end + -- aggiorno superficie + EgtSurfFrOffset( nSrfTrim, - LayerParams.nStrandOverlap / 100 * LayerParams.dStrand) + -- riordino le curve appena create e se possibile creo percorsi chiusi ReorderExtraShells( nGrpId, LayerParams.dStrand, vPtStart, LayerParams.bPrintInvert) return end @@ -1172,6 +1176,8 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d end end + -- aggiorno superificie + EgtSurfFrOffset( nSrfTrim, - LayerParams.nStrandOverlap / 100 * LayerParams.dStrand) -- riordino le curve appena create e se possibile creo percorsi chiusi ReorderExtraShells( nGrpId, LayerParams.dStrand, vPtStart, LayerParams.bPrintInvert) @@ -1414,7 +1420,7 @@ function CalcPaths.Exec( nPartId) -- parete esterna local dOffs = - LayerParams.dOffs - 0.5 * LayerParams.dStrand if nMaxShellNbrDiff < LayerParams.nShellsNbr then - dOffs = dOffs + LayerParams.dStrand + dOffs = dOffs + LayerParams.dStrand * ( 1 - LayerParams.nStrandOverlap / 100) local bOk, bExists, nSrfId = ComputeSurfOffset( nSrf, nCrvGrpId, - dOffs) if not bOk then EgtOutLog( 'Error on ExtOffset (layer '..tostring( nIdx)..') - CalcPaths') @@ -1437,7 +1443,7 @@ function CalcPaths.Exec( nPartId) -- pareti interne complete for nInd = 1, LayerParams.nShellsNbr - 1 - nMaxShellNbrDiff do -- offset della superficie originale - dOffs = dOffs + LayerParams.dStrand + dOffs = dOffs + LayerParams.dStrand * ( 1 - LayerParams.nStrandOverlap / 100) local bOk, bExists, nSrfId = ComputeSurfOffset( nSrf, nCrvGrpId, - dOffs) if not bOk then EgtOutLog( 'Error on IntOffset (layer '..tostring( nIdx)..') - CalcPaths') @@ -1451,7 +1457,12 @@ function CalcPaths.Exec( nPartId) end -- preparo superficie occupata dalle shell da usare per trim - local bOkTrim, bExistsTrim, nSrfTrim = ComputeSurfOffset( nSrf, nCrvGrpId, - dOffs - LayerParams.dStrand + s_dOffsCorr) + local dSurfTrimOffs = dOffs + LayerParams.dStrand + if nMaxShellNbrDiff > 0 then + -- se hai extra shell tieni conto anche dell'overlap ammesso + dSurfTrimOffs = dOffs + ( 1 - LayerParams.nStrandOverlap / 100) * LayerParams.dStrand - s_dOffsCorr + end + local bOkTrim, bExistsTrim, nSrfTrim = ComputeSurfOffset( nSrf, nCrvGrpId, - dSurfTrimOffs) if not bOkTrim then EgtOutLog( 'Error on IntOffset (layer '..tostring( nIdx)..') - CalcPaths') elseif bExistsTrim then diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index b4389df..5293ba3 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -248,7 +248,7 @@ local function AddRetraction( nCrvId, LayerParams, dCoastingLen, dWipeLen, dWipe EgtSetName( nWipeId, WIPE_CRV) EgtSetInfo( nWipeId, KEY_TYPE, TYPE.WIPE) - EgtSetColor( nWipeId, EgtStdColor('TEAL')) + EgtSetColor( nWipeId, EgtStdColor('AQUA')) end EgtErase( nCopyId) @@ -658,7 +658,7 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand) EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER) EgtSetName( nWipe, WIPE_CRV) EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE) - EgtSetColor( nWipe, EgtStdColor('TEAL')) + EgtSetColor( nWipe, EgtStdColor('AQUA')) end return diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 02d10f1..8051f91 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -40,6 +40,7 @@ local function LoadParams( sFile, nPartId) SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SLICE_STEP, '1.0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_STRAND, '6.0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SHELLS_NBR, '3') + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_STRAND_OVERLAP, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_OFFSET_SLICE, '0.0') local sStrandOrder = EgtGetStringFromIni( SEC_DEFAULT, KEY_PRINT_ORDER, 'InToOut', sFile) From 2d8ee96d5f758c8adc1fdafbe575874dc9fd3531 Mon Sep 17 00:00:00 2001 From: DarioS Date: Fri, 16 Sep 2022 17:50:31 +0200 Subject: [PATCH 02/79] =?UTF-8?q?3dPrinting=20:=20-=20miglioria=20per=20ri?= =?UTF-8?q?conoscimento=20necessit=C3=A0=20salvataggio=20progetto=20prima?= =?UTF-8?q?=20di=20slicing.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LuaLibs/RunSlicing.lua | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 8051f91..0d5b261 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -1,4 +1,4 @@ --- RunSlicing.lua by Egaltech s.r.l. 2022/09/15 +-- RunSlicing.lua by Egaltech s.r.l. 2022/09/16 -- Calcoli prima fase per Stampa 3d -- Tabella per definizione modulo @@ -234,14 +234,29 @@ local function SetViewInfo() EgtSetInfo( nViewId, TOOLPATH_GRP, true) end +--------------------------------------------------------------------- +local function VerifyNgeFile( sFilePath) + if not sFilePath or type( sFilePath) ~= 'string' then + return false + end + if EgtGetFileType then + return ( EgtGetFileType( sFilePath) == EEX_FT.NGE) + else + local _, _, sExt = EgtSplitPath( sFilePath or '') + return ( sExt:lower() == '.nge') + end +end + --------------------------------------------------------------------- function RunSlicing.Exec() - -- Verifico che il progetto abbia un nome + -- Verifico che il progetto abbia un nome valido local sCurrProjectPath = EgtGetCurrFilePath() - if not sCurrProjectPath or sCurrProjectPath == '' then - EgtOutBox( 'Save project before calculating slices!', 'Warning', 'WARNING') - return + if not PRINT or PRINT.PROGRAM ~= 1 then + if not VerifyNgeFile( sCurrProjectPath) then + EgtOutBox( 'Save project before calculating slices!', 'Warning', 'WARNING') + return + end end -- Recupero il primo pezzo già posizionato in macchina @@ -285,8 +300,10 @@ function RunSlicing.Exec() end -- Elimino eventuale precedente file dei risultati - local sResultFile = EgtChangePathExtension( sCurrProjectPath, '.csv') - EgtEraseFile( sResultFile) + if not PRINT or PRINT.PROGRAM ~= 1 then + local sResultFile = EgtChangePathExtension( sCurrProjectPath, '.csv') + EgtEraseFile( sResultFile) + end -- Elimino eventuale precedente lavorazione EgtSetCurrMachGroup() From f1490bfaf08ffedd260295a2d0be8c11da79fd4d Mon Sep 17 00:00:00 2001 From: DarioS Date: Sun, 18 Sep 2022 19:12:53 +0200 Subject: [PATCH 03/79] 3dPrinting : - tolleranza di approssimazione portata a 0.5 da 0.02 - piccola miglioria nella segnalazione errori. --- LuaLibs/CalcSlices.lua | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index ece2511..754c69d 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -1,4 +1,4 @@ --- CalcSlices.lua by Egaltech s.r.l. 2022/07/06 +-- CalcSlices.lua by Egaltech s.r.l. 2022/09/18 -- Calcolo percorsi di lavoro per Stampa 3d -- Tabella per definizione modulo @@ -297,7 +297,7 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) -- costanti local TOLER = 0.2 - local SMALL_TOLER = 0.02 + local SMALL_TOLER = 0.5 local BIG_TOLER = 2.0 local MIN_LEN = 20.0 local MIN_AREA = 25.0 @@ -457,11 +457,12 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) end EgtErase( nGrp) local nSurfFR, nSrfNbr = EgtSurfFlatRegion( nLayId, vClosedId) - for i = 1, #vClosedId do - EgtErase( vClosedId[i]) - end if nSurfFR then + -- elimino le curve originali + for i = 1, #vClosedId do + EgtErase( vClosedId[i]) + end -- esplodo in superfici elementari local vSrfId = {} for j = 1, nSrfNbr do @@ -539,9 +540,22 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) end end else - -- errore + local bErr = true + -- se nessuna curva + if #vClosedId == 0 then + bErr = false + -- se una sola curva, ne verifico larghezza media + elseif #vClosedId == 1 then + local dLen = EgtCurveLength( vClosedId[1]) + local _, _, dArea = EgtCurveArea( vClosedId[1]) + if not dArea or dArea / dLen < SMALL_TOLER then bErr = false end + end + -- cambio nome al layer EgtSetName( nLayId, '__' .. SLICE_LAYER .. EgtNumToString( nLayCnt)) - table.insert( vErr, nLayCnt) + -- se vero errore lo segnalo + if bErr then + table.insert( vErr, nLayCnt) + end end -- passo al layer successivo From 11457644aa2ee701fea2fd65394a3323af3b2876 Mon Sep 17 00:00:00 2001 From: DarioS Date: Wed, 21 Sep 2022 12:54:51 +0200 Subject: [PATCH 04/79] =?UTF-8?q?3dPrinting=20:=20-=20messa=20tolleranza?= =?UTF-8?q?=20di=20interpolazione=20dopo=20slicing=20a=200.02=20(si=20dovr?= =?UTF-8?q?=C3=A0=20mettere=200.02=20dopo=20rilascio=20nuovo=20EgtCAM5)=20?= =?UTF-8?q?-=20nella=20CalcRibsLink=20impostato=20vettore=20estrusione=20s?= =?UTF-8?q?ul=20collegamento=20aggiunto=20(fondamentale=20per=20non=20camb?= =?UTF-8?q?iare=20inclinazione=20dell'estrusore).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LuaLibs/CalcSlices.lua | 2 +- LuaLibs/CalcToolPath.lua | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 754c69d..e39075f 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -297,7 +297,7 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) -- costanti local TOLER = 0.2 - local SMALL_TOLER = 0.5 + local SMALL_TOLER = 0.02 -- da portare a 0.5 local BIG_TOLER = 2.0 local MIN_LEN = 20.0 local MIN_AREA = 25.0 diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 5293ba3..c26e0f8 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -1,4 +1,4 @@ --- CalcToolPath.lua by Egaltech s.r.l. 2022/08/29 +-- CalcToolPath.lua by Egaltech s.r.l. 2022/09/21 -- Calcolo percorsi di lavoro per Stampa 3d -- Tabella per definizione modulo @@ -313,7 +313,7 @@ local function VerifyRibsLink( nLinkId, nCurr, nNext, dStrand) end -------------------------------------------------------------------- -local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink) +local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlicing) local ptS = EgtEP( nCurr) local ptE = EgtSP( nNext) @@ -383,6 +383,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink) local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand) if bValid then EgtSetInfo( nLinkId, KEY_TYPE, TYPE.RIB) + EgtModifyCurveExtrusion( nLinkId, vtSlicing, GDB_RT.GLOB) EgtRelocateGlob( nLinkId, nCurr, GDB_IN.AFTER) else EgtErase( nLinkId) @@ -763,15 +764,15 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) -- collego le passate di una stessa costolatura for i = 1, #tabRibs do for j = 1, #tabRibs[i] - 1 do - CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, true) + CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, true, LayerParams.vtSlicing) if not bSpecialCase then -- creo link fittizio per eliminare tratto corrispondente sulla curva di offset - local nFakeLink = CalcRibsLink( tabRibs[i][j + 1], tabRibs[i][j], nLoopGrp, LayerParams.dStrand, false) + local nFakeLink = CalcRibsLink( tabRibs[i][j + 1], tabRibs[i][j], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing) EgtErase( nFakeLink) end end if bSpecialCase then - local nFakeLink = CalcRibsLink( tabRibs[i][#tabRibs[i]], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false) + local nFakeLink = CalcRibsLink( tabRibs[i][#tabRibs[i]], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing) EgtErase( nFakeLink) end end @@ -779,7 +780,7 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) if LayerParams.bRibsLink then for i = 1, #tabRibs - 1 do local nCnt = #tabRibs[i] - CalcRibsLink( tabRibs[i][nCnt], tabRibs[i + 1][1], nLoopGrp, LayerParams.dStrand, false) + CalcRibsLink( tabRibs[i][nCnt], tabRibs[i + 1][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing) end end From 4a769ffc6f080a280d973519eb9fc4a8f9742139 Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 26 Sep 2022 16:02:05 +0200 Subject: [PATCH 05/79] =?UTF-8?q?3dPrinting=20:=20-=20aggiunta=20possibili?= =?UTF-8?q?t=C3=A0=20di=20generare=20lo=20slicing=20senza=20calcolo=20dei?= =?UTF-8?q?=20solidi.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CalcSolids.lua | 18 +++++++ LuaLibs/AddManData.lua | 2 + LuaLibs/CalcSlices.lua | 1 + LuaLibs/{CalcSolids.lua => RunCalcSolids.lua} | 47 +++++++++++-------- LuaLibs/RunShowManager.lua | 10 ++++ LuaLibs/RunSliceAdvancement.lua | 11 +++++ LuaLibs/RunSlicePalette.lua | 10 ++++ LuaLibs/RunSlicing.lua | 18 ++++--- 8 files changed, 92 insertions(+), 25 deletions(-) create mode 100644 CalcSolids.lua rename LuaLibs/{CalcSolids.lua => RunCalcSolids.lua} (92%) diff --git a/CalcSolids.lua b/CalcSolids.lua new file mode 100644 index 0000000..c0adffa --- /dev/null +++ b/CalcSolids.lua @@ -0,0 +1,18 @@ +-- CalcSolids.lua by Egaltech s.r.l. 2022/09/26 +-- Calcola i solidi a partire dallo slicing + +-- Intestazioni +require( 'EgtBase') +_ENV = EgtProtectGlobal() +EgtEnableDebug( false) + +-- Imposto direttorio libreria specializzata per Stampa 3d +local sBaseDir = EgtGetSourceDir() +EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') + +-- Librerie +_G.package.loaded.RunCalcSolids = nil +local RCS = require( 'RunCalcSolids') + +-- Calcolo +RCS.Exec() \ No newline at end of file diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 9530770..07ace81 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -35,6 +35,7 @@ MIN_RIBS_LEN = 2 -- Parametri di lavorazione SEC_DEFAULT = "Default" KEY_PARAMS = "Params" +KEY_CALC_SOLIDS = "CalcSolids" KEY_SLICING_45 = "Slicing45" KEY_SLICING_DIR="SlicingDir" KEY_SLICE_STEP = "StrandH" @@ -127,6 +128,7 @@ KEY_ZIG_ZAG_DIR = "ZigZagDir" KEY_INVERTED_CRV = "InvertedCrv" KEY_CLOSED_CRV = "ClosedCrv" KEY_ASSOCIATED_SURF = "AssociatedSurf" +KEY_HAS_SOLIDS = "Solids" TYPE = { OUTER_SHELL = 1, diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index e39075f..1a864c8 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -536,6 +536,7 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) local nCsId, nCsCnt = EgtExtractSurfFrChunkLoops( nId, 0, nGrpCrv) for nId2 = nCsId, nCsId + nCsCnt - 1 do EgtSetName( nId2, OUTER_CRV) + EgtSetStatus( nId2, GDB_ST.OFF) EgtSetColor( nId2, 'BLACK') end end diff --git a/LuaLibs/CalcSolids.lua b/LuaLibs/RunCalcSolids.lua similarity index 92% rename from LuaLibs/CalcSolids.lua rename to LuaLibs/RunCalcSolids.lua index e1e2e46..35f2d87 100644 --- a/LuaLibs/CalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -1,17 +1,19 @@ --- CalcSolids.lua by Egaltech s.r.l. 2022/07/01 +-- RunCalcSolids.lua by Egaltech s.r.l. 2022/07/01 -- Calcolo percorsi di lavoro per Stampa 3d -- Tabella per definizione modulo -local CalcSolids = {} +local RunCalcSolids = {} -- Intestazioni require( 'EgtBase') -EgtOutLog( ' CalcSolids started', 1) +EgtOutLog( ' RunCalcSolids started', 1) -- Dati local AMD = require( 'AddManData') +-- PROG_PARTID = 1 + --------------------------------------------------------------------- local s_nPartId @@ -203,15 +205,22 @@ local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams) end --------------------------------------------------------------------- -function CalcSolids.Exec( nPartId) - - s_nPartId = nPartId - - local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER.."*") - if not vLayIds then - EgtOutBox( 'Error no slice', 'SolidCalc') - return +function RunCalcSolids.Exec( nPartId) + + s_nPartId = nPartId or PROG_PARTID + if not s_nPartId then + EgtOutBox( 'No part for solid calc', 'Error', 'ERROR') + return end + + -- recupero i suoi slice + local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER .. '*') + if not vLayIds then + EgtOutBox( 'No sliced part in this project!', 'Error', 'ERROR') + return + end + + EgtSetInfo( s_nPartId, KEY_HAS_SOLIDS, 1) local vErr = {} -- recupero i parametri necessari al calcolo dei solidi @@ -249,12 +258,6 @@ function CalcSolids.Exec( nPartId) nId = EgtGetNext( nId) end - -- nascondo ExternCurve del gruppo - local vExtCrvs = EgtGetNameInGroup( nCrvGrpId, OUTER_CRV) - for nInd = 1, #vExtCrvs do - EgtSetStatus( vExtCrvs[nInd], GDB_ST.OFF) - end - -- processo gli eventi if ( nIdx % 20) == 0 then EgtDraw() @@ -267,7 +270,7 @@ function CalcSolids.Exec( nPartId) nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") or GDB_ID.NULL end EgtDraw() - if EgtProcessEvents( EgtIf( PRINT, 300, 0) + nIdx / #vLayIds * 100, 0) == 1 then + if EgtProcessEvents( nIdx / #vLayIds * 100, 0) == 1 then return end end @@ -281,7 +284,13 @@ function CalcSolids.Exec( nPartId) EgtOutLog( 'Error on solid creation (layer ' .. vErr[i] .. ') - SolidCalc') end + -- eventuale aggiornamento delle ViewInfo + local nViewId = EgtGetFirstNameInGroup( GDB_ID.ROOT, VIEWPARAMS) + if nViewId then + EgtSetInfo( nViewId, SOLID_GRP, true) + end + end --------------------------------------------------------------------- -return CalcSolids +return RunCalcSolids diff --git a/LuaLibs/RunShowManager.lua b/LuaLibs/RunShowManager.lua index f4f257f..7f62893 100644 --- a/LuaLibs/RunShowManager.lua +++ b/LuaLibs/RunShowManager.lua @@ -12,6 +12,10 @@ EgtOutLog( ' RunShowManager started', 1) -- Costanti generali local AMD = require( 'AddManData') +-- Librerie +_G.package.loaded.RunCalcSolids = nil +local CSOLIDS = require( 'RunCalcSolids') + --------------------------------------------------------------------- local function ShowImportedSolid( nPartId, bShow) local nSolidLayId = EgtGetFirstNameInGroup( nPartId, PRINT_SOLID) @@ -78,6 +82,12 @@ function RunShowManager.Exec() local nPartIndex = 1 local nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) while nPartId do + -- eventuale calcolo dei solidi + local bHasSolids = EgtGetInfo( nPartId, KEY_HAS_SOLIDS, 'b') or false + if not bHasSolids and bCurrSolid then + CSOLIDS.Exec( nPartId) + end + if bImportedSolid ~= bCurrImportedSolid then ShowImportedSolid( nPartId, bCurrImportedSolid) end diff --git a/LuaLibs/RunSliceAdvancement.lua b/LuaLibs/RunSliceAdvancement.lua index 89b52d0..d644fc4 100644 --- a/LuaLibs/RunSliceAdvancement.lua +++ b/LuaLibs/RunSliceAdvancement.lua @@ -12,6 +12,10 @@ EgtOutLog( ' RunSliceAdvancement started', 1) -- Costanti generali local AMD = require( 'AddManData') +-- Librerie +_G.package.loaded.RunCalcSolids = nil +local CSOLIDS = require( 'RunCalcSolids') + --------------------------------------------------------------------- local function ManageSegmentVisibility( SegmentList, nLastActiveIndex, ToHideList) for Index = 1, #SegmentList do @@ -90,6 +94,13 @@ function RunSliceAdvancement.Exec() local nPartIndex = 1 local nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) while nPartId do + + -- eventuale calcolo dei solidi + local bHasSolids = EgtGetInfo( nPartId, KEY_HAS_SOLIDS, 'b') or false + if not bHasSolids then + CSOLIDS.Exec( nPartId) + end + local nPrintOrder = EgtGetInfo( nPartId, KEY_PRINT_ORDER, 'i') -- ciclo sui layer per dis/attivare il resto local nLayerIndex = 1 diff --git a/LuaLibs/RunSlicePalette.lua b/LuaLibs/RunSlicePalette.lua index beb3af9..b20610b 100644 --- a/LuaLibs/RunSlicePalette.lua +++ b/LuaLibs/RunSlicePalette.lua @@ -12,12 +12,22 @@ EgtOutLog( ' RunSlicePalette started', 1) -- Costanti generali local AMD = require( 'AddManData') +-- Librerie +_G.package.loaded.RunCalcSolids = nil +local CSOLIDS = require( 'RunCalcSolids') + --------------------------------------------------------------------- function RunSlicePalette.UpdateColors( nPaletteType) -- ciclo sui pezzi local nPartIndex = 1 local nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) while nPartId do + -- eventuale calcolo dei solidi + local bHasSolids = EgtGetInfo( nPartId, KEY_HAS_SOLIDS, 'b') or false + if not bHasSolids then + CSOLIDS.Exec( nPartId) + end + -- ciclo sui layer per dis/attivare il resto local nLayerIndex = 1 local nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 0d5b261..1b252d5 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -20,8 +20,8 @@ _G.package.loaded.CalcSlices = nil local CSLICES = require( 'CalcSlices') _G.package.loaded.CalcPaths = nil local CPATHS = require( 'CalcPaths') -_G.package.loaded.CalcSolids = nil -local CSOLIDS = require( 'CalcSolids') +_G.package.loaded.RunCalcSolids = nil +local CSOLIDS = require( 'RunCalcSolids') _G.package.loaded.CalcToolPath = nil local CTP = require( 'CalcToolPath') @@ -36,6 +36,7 @@ local function LoadParams( sFile, nPartId) EgtSetInfo( nPartId, KEY_PARAMS, sFile) + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_CALC_SOLIDS, '1') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SLICING_45, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SLICE_STEP, '1.0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_STRAND, '6.0') @@ -220,7 +221,7 @@ local function RemoveOldTFS() end --------------------------------------------------------------------- -local function SetViewInfo() +local function SetViewInfo( bCalcSolids) local nViewId = EgtGetFirstNameInGroup( GDB_ID.ROOT, VIEWPARAMS) if not nViewId then nViewId = EgtGroup( GDB_ID.ROOT) @@ -230,7 +231,7 @@ local function SetViewInfo() EgtSetInfo( nViewId, IMPORTED_SOLID, false) EgtSetInfo( nViewId, OUTER_CRV, false) EgtSetInfo( nViewId, PATH_GRP, false) - EgtSetInfo( nViewId, SOLID_GRP, true) + EgtSetInfo( nViewId, SOLID_GRP, bCalcSolids) EgtSetInfo( nViewId, TOOLPATH_GRP, true) end @@ -340,7 +341,12 @@ function RunSlicing.Exec() EgtDraw() -- Calcolo dei solidi degli strand a partire dai percorsi di lavoro - CSOLIDS.Exec( nPartId) + local bCalcSolids = EgtGetInfo( nPartId, KEY_CALC_SOLIDS, 'b') + EgtRemoveInfo( nPartId, KEY_HAS_SOLIDS) + if bCalcSolids or bCalcSolids == nil then + CSOLIDS.Exec( nPartId) + end + EgtSetStatus( nSolidLayId, GDB_ST.OFF) EgtSetStatus( nRibsLayId or GDB_ID.NULL, GDB_ST.OFF) EgtSetStatus( nShellNbrLay or GDB_ID.NULL, GDB_ST.OFF) @@ -349,7 +355,7 @@ function RunSlicing.Exec() EgtDraw() -- Aggiorno impostazioni di visibilita' per ShowManager - SetViewInfo() + SetViewInfo( bCalcSolids) end From 0d356741ae47f5fa31efff75ff8eb9d77afc8ac8 Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 26 Sep 2022 17:19:02 +0200 Subject: [PATCH 06/79] 3dPrinting : - modifiche al calcolo dei solidi. --- LuaLibs/RunCalcSolids.lua | 180 +++++++++++++++++--------------- LuaLibs/RunShowManager.lua | 3 +- LuaLibs/RunSliceAdvancement.lua | 3 +- LuaLibs/RunSlicePalette.lua | 3 +- LuaLibs/RunSlicing.lua | 4 +- 5 files changed, 102 insertions(+), 91 deletions(-) diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index 35f2d87..6a872af 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -12,19 +12,14 @@ EgtOutLog( ' RunCalcSolids started', 1) -- Dati local AMD = require( 'AddManData') --- PROG_PARTID = 1 - --------------------------------------------------------------------- -local s_nPartId - ---------------------------------------------------------------------- -local function GetLayerParamsForSolidCalc() +local function GetLayerParamsForSolidCalc( nPartId) local LayerParams = {} - LayerParams.bInvert = EgtGetInfo( s_nPartId, KEY_PRINT_DIRECTION, 'b') - LayerParams.dLayHeight = EgtGetInfo( s_nPartId, KEY_SLICE_STEP, 'd') - LayerParams.dStrand = EgtGetInfo( s_nPartId, KEY_STRAND, 'd') - LayerParams.nOrder = EgtGetInfo( s_nPartId, KEY_PRINT_ORDER, 'i') - LayerParams.vtSlicing = EgtGetInfo( s_nPartId, KEY_SLICING_DIR, 'v') + LayerParams.bInvert = EgtGetInfo( nPartId, KEY_PRINT_DIRECTION, 'b') + LayerParams.dLayHeight = EgtGetInfo( nPartId, KEY_SLICE_STEP, 'd') + LayerParams.dStrand = EgtGetInfo( nPartId, KEY_STRAND, 'd') + LayerParams.nOrder = EgtGetInfo( nPartId, KEY_PRINT_ORDER, 'i') + LayerParams.vtSlicing = EgtGetInfo( nPartId, KEY_SLICING_DIR, 'v') return LayerParams end @@ -205,89 +200,102 @@ local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams) end --------------------------------------------------------------------- -function RunCalcSolids.Exec( nPartId) +function RunCalcSolids.Exec() - s_nPartId = nPartId or PROG_PARTID - if not s_nPartId then - EgtOutBox( 'No part for solid calc', 'Error', 'ERROR') - return - end - - -- recupero i suoi slice - local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER .. '*') - if not vLayIds then - EgtOutBox( 'No sliced part in this project!', 'Error', 'ERROR') - return - end - - EgtSetInfo( s_nPartId, KEY_HAS_SOLIDS, 1) - - local vErr = {} - -- recupero i parametri necessari al calcolo dei solidi - local LayerParams = GetLayerParamsForSolidCalc() - - for nIdx = 1, #vLayIds do + local nPartIndex = 1 + local nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) + while nPartId do - -- scorro tutti i gruppi di contorni - local nCrvGrpId = EgtGetFirstNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*") or GDB_ID.NULL - while nCrvGrpId ~= GDB_ID.NULL do - - -- recupero il gruppo dei percorsi utensile - local nTPathGrpId = EgtGetFirstNameInGroup( nCrvGrpId, TOOLPATH_GRP) or GDB_ID.NULL - if nTPathGrpId == GDB_ID.NULL then - EgtOutBox( 'Error no tool paths', 'SolidCalc') - return - end - - -- recupero il gruppo dei solidi - local nSolidGrpId = EgtGetFirstNameInGroup( nCrvGrpId, SOLID_GRP) or GDB_ID.NULL - if nSolidGrpId == GDB_ID.NULL then - nSolidGrpId = EgtGroup( nCrvGrpId) - EgtSetName( nSolidGrpId, SOLID_GRP) - else - EgtEmptyGroup( nSolidGrpId) - end - - -- scorro le curve del percorso utensile - local nId = EgtGetFirstInGroup( nTPathGrpId) - while nId do - local bOk = CreateSolidFromCurve( nId, nSolidGrpId, LayerParams) - if not bOk then - table.insert( vErr, nIdx) - end - nId = EgtGetNext( nId) - end + if EgtGetInfo( nPartId, KEY_PART_ON_TABLE, 'b') then + -- verifico se necessario calcolare il solido + local bCalcSolid = EgtGetInfo( nPartId, KEY_CALC_SOLIDS, 'b') or false + local bHasSolids = EgtGetInfo( nPartId, KEY_HAS_SOLIDS, 'b') or false - -- processo gli eventi - if ( nIdx % 20) == 0 then - EgtDraw() - if EgtProcessEvents( nIdx / #vLayIds * 100, 0) == 1 then + if bCalcSolid and not bHasSolids then + + -- recupero i suoi slice + local vLayIds = EgtGetNameInGroup( nPartId, SLICE_LAYER .. '*') + if not vLayIds then + EgtOutBox( 'No sliced part in this project!', 'Error', 'ERROR') return end + + EgtSetInfo( nPartId, KEY_HAS_SOLIDS, 1) + + local vErr = {} + -- recupero i parametri necessari al calcolo dei solidi + local LayerParams = GetLayerParamsForSolidCalc( nPartId) + + for nIdx = 1, #vLayIds do + + -- scorro tutti i gruppi di contorni + local nCrvGrpId = EgtGetFirstNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*") or GDB_ID.NULL + while nCrvGrpId ~= GDB_ID.NULL do + + -- recupero il gruppo dei percorsi utensile + local nTPathGrpId = EgtGetFirstNameInGroup( nCrvGrpId, TOOLPATH_GRP) or GDB_ID.NULL + if nTPathGrpId == GDB_ID.NULL then + EgtOutBox( 'Error no tool paths', 'SolidCalc') + return + end + + -- recupero il gruppo dei solidi + local nSolidGrpId = EgtGetFirstNameInGroup( nCrvGrpId, SOLID_GRP) or GDB_ID.NULL + if nSolidGrpId == GDB_ID.NULL then + nSolidGrpId = EgtGroup( nCrvGrpId) + EgtSetName( nSolidGrpId, SOLID_GRP) + EgtSetLevel( nSolidGrpId, GDB_LV.TEMP) + else + EgtEmptyGroup( nSolidGrpId) + end + + -- scorro le curve del percorso utensile + local nId = EgtGetFirstInGroup( nTPathGrpId) + while nId do + local bOk = CreateSolidFromCurve( nId, nSolidGrpId, LayerParams) + if not bOk then + table.insert( vErr, nIdx) + end + nId = EgtGetNext( nId) + end + + -- processo gli eventi + if ( nIdx % 20) == 0 then + EgtDraw() + if EgtProcessEvents( nIdx / #vLayIds * 100, 0) == 1 then + return + end + end + + --passo al gruppo di contorni successivo + nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") or GDB_ID.NULL + end + EgtDraw() + if EgtProcessEvents( nIdx / #vLayIds * 100, 0) == 1 then + return + end + end + + -- eventuale segnalazione errori + -- if #vErr > 0 then + -- EgtOutBox( 'Error on layers :\n' .. table.concat( vErr, ','), 'SolidCalc') + -- end + + for i = 1, #vErr do + EgtOutLog( 'Error on solid creation (layer ' .. vErr[i] .. ') - SolidCalc') + end + + -- eventuale aggiornamento delle ViewInfo + local nViewId = EgtGetFirstNameInGroup( GDB_ID.ROOT, VIEWPARAMS) + if nViewId then + EgtSetInfo( nViewId, SOLID_GRP, true) + end end - --passo al gruppo di contorni successivo - nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") or GDB_ID.NULL end - EgtDraw() - if EgtProcessEvents( nIdx / #vLayIds * 100, 0) == 1 then - return - end - end - - -- eventuale segnalazione errori - -- if #vErr > 0 then - -- EgtOutBox( 'Error on layers :\n' .. table.concat( vErr, ','), 'SolidCalc') - -- end - - for i = 1, #vErr do - EgtOutLog( 'Error on solid creation (layer ' .. vErr[i] .. ') - SolidCalc') - end - - -- eventuale aggiornamento delle ViewInfo - local nViewId = EgtGetFirstNameInGroup( GDB_ID.ROOT, VIEWPARAMS) - if nViewId then - EgtSetInfo( nViewId, SOLID_GRP, true) + + nPartIndex = nPartIndex + 1 + nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) end end diff --git a/LuaLibs/RunShowManager.lua b/LuaLibs/RunShowManager.lua index 7f62893..8c19016 100644 --- a/LuaLibs/RunShowManager.lua +++ b/LuaLibs/RunShowManager.lua @@ -85,7 +85,8 @@ function RunShowManager.Exec() -- eventuale calcolo dei solidi local bHasSolids = EgtGetInfo( nPartId, KEY_HAS_SOLIDS, 'b') or false if not bHasSolids and bCurrSolid then - CSOLIDS.Exec( nPartId) + EgtSetInfo( nPartId, KEY_CALC_SOLIDS, true) + CSOLIDS.Exec() end if bImportedSolid ~= bCurrImportedSolid then diff --git a/LuaLibs/RunSliceAdvancement.lua b/LuaLibs/RunSliceAdvancement.lua index d644fc4..b172f97 100644 --- a/LuaLibs/RunSliceAdvancement.lua +++ b/LuaLibs/RunSliceAdvancement.lua @@ -98,7 +98,8 @@ function RunSliceAdvancement.Exec() -- eventuale calcolo dei solidi local bHasSolids = EgtGetInfo( nPartId, KEY_HAS_SOLIDS, 'b') or false if not bHasSolids then - CSOLIDS.Exec( nPartId) + EgtSetInfo( nPartId, KEY_CALC_SOLIDS, true) + CSOLIDS.Exec() end local nPrintOrder = EgtGetInfo( nPartId, KEY_PRINT_ORDER, 'i') diff --git a/LuaLibs/RunSlicePalette.lua b/LuaLibs/RunSlicePalette.lua index b20610b..b3b2bab 100644 --- a/LuaLibs/RunSlicePalette.lua +++ b/LuaLibs/RunSlicePalette.lua @@ -25,7 +25,8 @@ function RunSlicePalette.UpdateColors( nPaletteType) -- eventuale calcolo dei solidi local bHasSolids = EgtGetInfo( nPartId, KEY_HAS_SOLIDS, 'b') or false if not bHasSolids then - CSOLIDS.Exec( nPartId) + EgtSetInfo( nPartId, KEY_CALC_SOLIDS, true) + CSOLIDS.Exec() end -- ciclo sui layer per dis/attivare il resto diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 1b252d5..6afb327 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -36,7 +36,7 @@ local function LoadParams( sFile, nPartId) EgtSetInfo( nPartId, KEY_PARAMS, sFile) - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_CALC_SOLIDS, '1') + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_CALC_SOLIDS, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SLICING_45, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SLICE_STEP, '1.0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_STRAND, '6.0') @@ -343,7 +343,7 @@ function RunSlicing.Exec() -- Calcolo dei solidi degli strand a partire dai percorsi di lavoro local bCalcSolids = EgtGetInfo( nPartId, KEY_CALC_SOLIDS, 'b') EgtRemoveInfo( nPartId, KEY_HAS_SOLIDS) - if bCalcSolids or bCalcSolids == nil then + if bCalcSolids then CSOLIDS.Exec( nPartId) end From b285e3c8aa3878c73e35d65e93035f3ff1701a0d Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 27 Sep 2022 15:33:16 +0200 Subject: [PATCH 07/79] 3dPrinting : - corretto errore progress bar. --- LuaLibs/RunCalcSolids.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index 6a872af..c810f3a 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -270,8 +270,8 @@ function RunCalcSolids.Exec() --passo al gruppo di contorni successivo nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") or GDB_ID.NULL end - EgtDraw() - if EgtProcessEvents( nIdx / #vLayIds * 100, 0) == 1 then + EgtDraw() + if EgtProcessEvents( EgtIf( PRINT, 300, 0) + nIdx / #vLayIds * 100, 0) == 1 then return end end From f84c491295fb61f906d970ec6a382d4a43fce4cd Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Tue, 27 Sep 2022 17:20:33 +0200 Subject: [PATCH 08/79] - Aggiunti ProcessEvents su calcolo solido - Lettura pezzi per Icarus --- LuaLibs/RunCalcSolids.lua | 4 ++-- LuaLibs/RunGcodeGenerate.lua | 27 ++++++++++++++++++++++++++- LuaLibs/RunMachParamFromSWCalc.lua | 5 +++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index 6a872af..5687256 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -203,7 +203,7 @@ end function RunCalcSolids.Exec() local nPartIndex = 1 - local nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) + local nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) or EgtGetFirstNameInGroup( GDB_ID.ROOT, PART) while nPartId do if EgtGetInfo( nPartId, KEY_PART_ON_TABLE, 'b') then @@ -295,7 +295,7 @@ function RunCalcSolids.Exec() end nPartIndex = nPartIndex + 1 - nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) + nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) or EgtGetNextName( nPartId, PART) end end diff --git a/LuaLibs/RunGcodeGenerate.lua b/LuaLibs/RunGcodeGenerate.lua index e5918c4..d1c1870 100644 --- a/LuaLibs/RunGcodeGenerate.lua +++ b/LuaLibs/RunGcodeGenerate.lua @@ -23,6 +23,9 @@ end --------------------------------------------------------------------- function RunGcodeGenerate.Exec() + -- aggiorno interfaccia + EgtProcessEvents( 501, 0) + -- Recupero il pezzo (per ora primo e unico) local nPartIndex = 1 local nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) or EgtGetFirstNameInGroup( GDB_ID.ROOT, PART) @@ -41,6 +44,9 @@ function RunGcodeGenerate.Exec() -- Recupero i parametri relativi al layer local LayerParams = GetLayerParamsForGcodeGenerate( nPartId) + -- aggiorno interfaccia + EgtProcessEvents( 505, 0) + -- Ciclo sui layer local vEntId = {} for nIdx = 1, #vLayIds do @@ -50,7 +56,7 @@ function RunGcodeGenerate.Exec() -- recupero il gruppo dei percorsi utensile local nTpathGrpId = EgtGetFirstNameInGroup( nCrvGrpId, TOOLPATH_GRP) if not nTpathGrpId then - EgtOutBox( 'Error missing toolpaths', 'GcodeGenerate') + EgtOutBox( 'Error missing toolpaths', 'GcodeGenerate') return end -- recupero le entità nel gruppo @@ -68,6 +74,9 @@ function RunGcodeGenerate.Exec() return end + -- aggiorno interfaccia + EgtProcessEvents( 510, 0) + -- Imposto gruppo di lavoro EgtSetCurrMachGroup() @@ -87,6 +96,9 @@ function RunGcodeGenerate.Exec() return end + -- aggiorno interfaccia + EgtProcessEvents( 520, 0) + EgtSetMachiningGeometry( vEntId) local sNotes = EgtAdjustNotes( '', 'LinkZup', LayerParams.LinkZup) @@ -103,12 +115,18 @@ function RunGcodeGenerate.Exec() return end + -- aggiorno interfaccia + EgtProcessEvents( 550, 0) + -- Salvo il progetto local sFilePath = EgtGetCurrFilePath() sFilePath = EgtChangePathExtension( sFilePath, 'nge') EgtSetCurrFilePath( sFilePath) EgtSaveFile() + -- aggiorno interfaccia + EgtProcessEvents( 580, 0) + -- Genero il programma CN local sInfo = 'EgtCAM5 ver.' .. EgtGetExeVersion() .. ' - ' .. sPath local bGenOk = EgtGenerate( '', sInfo) @@ -116,6 +134,9 @@ function RunGcodeGenerate.Exec() EgtEstimate('') end + -- aggiorno interfaccia + EgtProcessEvents( 590, 0) + EgtResetCurrMachGroup() if PRINT and PRINT.PROGRAM == 1 then @@ -131,6 +152,10 @@ function RunGcodeGenerate.Exec() EgtOutBox( 'Generation failed.', 'GcodeGeneration', 'ERROR') end end + + -- aggiorno interfaccia + EgtProcessEvents( 600, 0) + end --------------------------------------------------------------------- diff --git a/LuaLibs/RunMachParamFromSWCalc.lua b/LuaLibs/RunMachParamFromSWCalc.lua index 22fb09e..d281bd0 100644 --- a/LuaLibs/RunMachParamFromSWCalc.lua +++ b/LuaLibs/RunMachParamFromSWCalc.lua @@ -57,6 +57,9 @@ function RunMachParamFromSWCalc.Exec() local dSliceStep = EgtGetInfo( nPartId, KEY_SLICE_STEP, 'd') local dStrand = EgtGetInfo( nPartId, KEY_STRAND, 'd') local dStrandCount = EgtGetInfo( nPartId, KEY_SHELLS_NBR, 'd') + -- recupero numero di strati per progress + local nLastLayerId = EgtGetLastNameInGroup( nPartId, SLICE_LAYER .. '*') + local nLayerQty = EgtGetInfo( nLastLayerId, KEY_SLICE_NBR, 'i') -- ciclo sui layer local nLayerIndex = 1 local nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) @@ -166,6 +169,8 @@ function RunMachParamFromSWCalc.Exec() EgtSetInfo( nLayerResultId, KEY_FCUR, dLayerFeed) EgtSetInfo( nLayerResultId, KEY_LENGTH, dTotLayerLength) EgtSetInfo( nLayerResultId, KEY_SPEED, dSpeed) + -- aggiorno interfaccia + EgtProcessEvents( 400 + ( nLayerIndex / nLayerQty * 100), 0) nLayerIndex = nLayerIndex + 1 nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) end From 2a324175bddf84a25c8c8e90d7c7444fdd4910eb Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 29 Sep 2022 09:56:23 +0200 Subject: [PATCH 09/79] 3dPrinting : - corretta gestione dell'orientamento dei setti. --- LuaLibs/CalcPaths.lua | 15 ++++++++++----- LuaLibs/CalcSlices.lua | 3 ++- LuaLibs/CalcToolPath.lua | 10 ++++------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 6f0102c..b7e4e35 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -589,15 +589,17 @@ local function ReorderRibs( nGrp, bInvertOrder, dStrand, nMaxNbr) end -- aggiusto tutte le costolature divise + local tabSplitted = {} for i = 1, #vSplitRibs do local nPrevId = EgtGetInfo( vSplitRibs[i], KEY_SPLIT_RIB, 'i') local bInverted = EgtGetInfo( vSplitRibs[i], KEY_INVERTED_CRV, 'b') or false -- aggiungo come successiva alla costolatura da cui si è generata EgtRelocateGlob( vSplitRibs[i], nPrevId, EgtIf( bInverted, GDB_IN.BEFORE, GDB_IN.AFTER)) -- correggo le info per gestire correttamente nel calcolo toolpath - if bInverted then + if bInverted and not tabSplitted[nPrevId] then EgtRemoveInfo( vSplitRibs[i], KEY_SPLIT_RIB) EgtSetInfo( nPrevId, KEY_SPLIT_RIB, vSplitRibs[i]) + tabSplitted[nPrevId] = 1 end end @@ -820,14 +822,14 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, nMaxStrand local nSrfBase = EgtGetFirstNameInGroup( nCrvGrp, TOT_SHELL_TRIM_SURF) if not nSrfBase then EgtOutLog( 'Warning : Ribs not possible (layer '..tostring( nIdx)..') - CalcPaths') - else + else local vSurfOffs = ComputeTrimSurfWithOverlaps( vRibs, nSrfBase, KEY_RIBS_OVERLAP, LayerParams.dStrand, nRibsPathGrp) -- gestisco eventuali intersezioni fra costolature local bInters = HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands) EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_INTERS, bInters) EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_TWO_STRANDS, bAllTwoStrands) - + -- eseguo il trim delle costole con la regione offsettata local tOldNewIds = {} local vOrderedRibs = EgtGetNameInGroup( nRibsPathGrp, RIBS_CRV ..'*') @@ -855,7 +857,10 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, nMaxStrand local dXl = sqrt( sqr( vtDir:getX()) + sqr( vtDir:getZ())) local dYl = abs( vtDir:getY()) local dVal = EgtIf( dXl > dYl - GEO.EPS_SMALL, vtDir:getX(), vtDir:getY()) - if dVal < - GEO.EPS_SMALL then + local bInvert = dVal < - GEO.EPS_SMALL + -- inversione della curva + local bInvertInfo = EgtGetInfo( nCrv + nInd, KEY_RIBS_INVERT_DIR, 'b') or false + if bInvert ~= bInvertInfo then EgtInvertCurve( nCrv + nInd) EgtSetInfo( nCrv + nInd, KEY_INVERTED_CRV, 1) end @@ -1420,7 +1425,7 @@ function CalcPaths.Exec( nPartId) -- parete esterna local dOffs = - LayerParams.dOffs - 0.5 * LayerParams.dStrand if nMaxShellNbrDiff < LayerParams.nShellsNbr then - dOffs = dOffs + LayerParams.dStrand * ( 1 - LayerParams.nStrandOverlap / 100) + dOffs = dOffs + LayerParams.dStrand local bOk, bExists, nSrfId = ComputeSurfOffset( nSrf, nCrvGrpId, - dOffs) if not bOk then EgtOutLog( 'Error on ExtOffset (layer '..tostring( nIdx)..') - CalcPaths') diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 1a864c8..9126850 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -90,7 +90,8 @@ end -------------------------------------------------------------------- local function ReadParam( nId, sKey, sType, table) - local info = EgtGetInfo( nId, sKey, sType) or EgtGetInfo( s_nPartId, sKey, sType) + local info = EgtGetInfo( nId, sKey, sType) + if info == nil then info = EgtGetInfo( s_nPartId, sKey, sType) end table[sKey] = info end diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index c26e0f8..fb027a4 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -715,16 +715,14 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) local bAllTwoStrands = EgtGetInfo( nRibsGrp, KEY_RIBS_TWO_STRANDS, 'b') or false local bSpecialCase = bInters and bAllTwoStrands local bSwap = false - -- orientamento del primo gruppo di curve - local bInvert = EgtGetInfo( tabRibs[1][1], KEY_RIBS_INVERT_DIR, 'b') + + local bInvert = false -- curve già orientate in CalcPaths if not bSpecialCase then for i = 1, #tabRibs do local nInfo = EgtGetInfo( tabRibs[i][1], KEY_SPLIT_RIB, 'i') local nShellsNbr = EgtGetInfo( tabRibs[i][1], KEY_RIBS_SHELLS_NBR, 'i') - -- aggiorno bInvert per il gruppo di costolature analizzato - if not LayerParams.bRibsLink then - bInvert = EgtGetInfo( tabRibs[i][1], KEY_RIBS_INVERT_DIR, 'b') - else + -- se link aggiorno bInvert per il gruppo di costolature corrente in modo da essere coerente con il collegamento + if LayerParams.bRibsLink then if i > 1 and not nInfo then local nPrevShellsNbr = EgtGetInfo( tabRibs[i-1][1], KEY_RIBS_SHELLS_NBR, 'i') if nPrevShellsNbr % 2 == 1 then From d1fb754cda25b4beb2746f7a4185bf27715ef50e Mon Sep 17 00:00:00 2001 From: DarioS Date: Thu, 29 Sep 2022 23:03:32 +0200 Subject: [PATCH 10/79] 3dPrinting : - tolleranza di slicing portata a 0.5. --- LuaLibs/CalcSlices.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 9126850..2541d49 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -298,7 +298,7 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) -- costanti local TOLER = 0.2 - local SMALL_TOLER = 0.02 -- da portare a 0.5 + local SMALL_TOLER = 0.5 local BIG_TOLER = 2.0 local MIN_LEN = 20.0 local MIN_AREA = 25.0 From 276f8de4f8d16facbaf5e9156a1430d54bb4942e Mon Sep 17 00:00:00 2001 From: DarioS Date: Fri, 30 Sep 2022 01:10:52 +0200 Subject: [PATCH 11/79] 3dPrinting : - correzione a calcolo TFS per layer con errori (nome preceduto da __). --- LuaLibs/RunMachParamFromSWCalc.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LuaLibs/RunMachParamFromSWCalc.lua b/LuaLibs/RunMachParamFromSWCalc.lua index d281bd0..bb57aa2 100644 --- a/LuaLibs/RunMachParamFromSWCalc.lua +++ b/LuaLibs/RunMachParamFromSWCalc.lua @@ -62,7 +62,7 @@ function RunMachParamFromSWCalc.Exec() local nLayerQty = EgtGetInfo( nLastLayerId, KEY_SLICE_NBR, 'i') -- ciclo sui layer local nLayerIndex = 1 - local nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) + local nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex) while nLayerId do -- rimuovo eventuale info precedente del tempo di attesa EgtRemoveInfo( nLayerId, KEY_WAITING_TIME) @@ -172,7 +172,7 @@ function RunMachParamFromSWCalc.Exec() -- aggiorno interfaccia EgtProcessEvents( 400 + ( nLayerIndex / nLayerQty * 100), 0) nLayerIndex = nLayerIndex + 1 - nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) + nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex) end if nMaxIndex < nLayerIndex then nMaxIndex = nLayerIndex end nPartId = EgtGetNextPart( nPartId) From 00c504c58b804731f16db4bba9c1b86a5a3b349d Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 30 Sep 2022 15:44:52 +0200 Subject: [PATCH 12/79] 3dPrinting : - correzione errori per regioni con diverse passate. --- LuaLibs/CalcPaths.lua | 9 +++++---- LuaLibs/CalcToolPath.lua | 6 +++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index b7e4e35..53d63ed 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -946,10 +946,11 @@ local function CreateShellNbrSurfaces( nGrp, nShellsNbr) end end -- costruisco la surf - local nSrfId, nCnt = EgtSurfFlatRegion( nSrfGrp, vCrvIds) - for nIdSrf = nSrfId + 1, nSrfId + nCnt - 1 do - EgtSurfFrAdd( nSrfId, nIdSrf) - EgtErase( nIdSrf) + local nSrfId = EgtSurfFlatRegion( nSrfGrp, vCrvIds[1]) + for i = 2, #vCrvIds do + local nSrfTmp = EgtSurfFlatRegion( nSrfGrp, vCrvIds[i]) + EgtSurfFrAdd( nSrfId, nSrfTmp) + EgtErase( nSrfTmp) end EgtSetName( nSrfId, SHELL_NBR_SURF .. tostring( nDiff)) end diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index fb027a4..02f1714 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -996,9 +996,9 @@ function CalcToolPath.Exec( nPartId) -- recupero i parametri local nType = EgtGetInfo( nId, KEY_TYPE, 'i') local bClosed = EgtGetInfo( nId, KEY_CLOSED_CRV, 'b') or false - local dCoastingLen = EgtIf( nType == TYPE.EXTRA_SHELL and not bClosed, LayerParams.dShellNbrCoasting, LayerParams.dCoastingLen) - local dWipeLen = EgtIf( nType == TYPE.EXTRA_SHELL and not bClosed, LayerParams.dShellNbrWipe, LayerParams.dWipeLen) - local dWipeDir = EgtIf( nType == TYPE.EXTRA_SHELL and not bClosed, LayerParams.dShellNbrWipeDir, 0) + local dCoastingLen = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrCoasting, LayerParams.dCoastingLen) + local dWipeLen = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrWipe, LayerParams.dWipeLen) + local dWipeDir = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrWipeDir, 0) if nId == nLastId then AddRetractionOnLastCrv( nId, nTpathGrpId, LayerParams, dCoastingLen, dWipeLen, dWipeDir) From 6b2c1834d2335dccd86a2e3fc1bcba8e47ac3be8 Mon Sep 17 00:00:00 2001 From: DarioS Date: Sun, 2 Oct 2022 00:39:42 +0200 Subject: [PATCH 13/79] 3dPrinting : - correzioni per Extra Shell (estrusione su link e visualizzazione toolpath). --- LuaLibs/AddManData.lua | 1 + LuaLibs/CalcToolPath.lua | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 07ace81..2b96f3b 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -24,6 +24,7 @@ COASTING_CRV = "Coasting" WIPE_CRV = "Wipe" LEAD_IN_CRV = "LeadIn" LEAD_OUT_CRV = "LeadOut" +LINK_CRV = "Link" FRAME_PART = "FramePart" START_GEOM = "Start" TOT_SHELL_TRIM_SURF = "TotalShellSurfForTrim" diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 02f1714..0d202e3 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -1,4 +1,4 @@ --- CalcToolPath.lua by Egaltech s.r.l. 2022/09/21 +-- CalcToolPath.lua by Egaltech s.r.l. 2022/10/01 -- Calcolo percorsi di lavoro per Stampa 3d -- Tabella per definizione modulo @@ -120,6 +120,7 @@ local function AddLink( vCrv, nTpathGrpId, nLinkType, dLinkParam, dSPOffs, dStra EgtRelocate( nLinkId, vCrv[i], GDB_IN.BEFORE) EgtModifyCurveExtrusion( nLinkId, vtSlicing, GDB_RT.GLOB) EgtSetInfo( nLinkId, KEY_TYPE, TYPE.LINK) + EgtSetName( nLinkId, LINK_CRV) end end end @@ -822,18 +823,18 @@ local function CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGr local dCoastingLen = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_COASTING_LEN, 'd') local dWipeLen = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_WIPE_LEN, 'd') local dWipeDir = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_WIPE_DIR, 'd') - + -- copio i percorsi nel gruppo toolpath local nPrev = EgtGetLastInGroup( nTpathGrpId) for i = 1, #vEntIds do local nNewEnt = EgtCopyGlob( vEntIds[i], nPrev, EgtIf( i == 1 or nOrder == PRINT_ORDER.EXT_INT_INF, GDB_IN.AFTER, GDB_IN.BEFORE)) - + -- correggo posizione EgtMove( nNewEnt, dCorrZ * Z_AX(), GDB_RT.GLOB) EgtMove( nNewEnt, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) EgtModifyCurveExtrusion( nNewEnt, LayerParams.vtSlicing, GDB_RT.GLOB) EgtSetInfo( nNewEnt, KEY_TYPE, TYPE.AUX_SOLID) - + if EgtCurveIsClosed( nNewEnt) then EgtSetInfo( nNewEnt, KEY_CLOSED_CRV, 1) -- eventuale inversione curva @@ -949,6 +950,7 @@ function CalcToolPath.Exec( nPartId) EgtModifyCurveExtrusion( nNewEntId, LayerParams.vtSlicing, GDB_RT.GLOB) EgtSetColor( nNewEntId, EgtStdColor('GRAY')) + EgtSetStatus( nNewEntId, GDB_ST.ON) nEntId = EgtGetNext( nEntId) end @@ -967,7 +969,9 @@ function CalcToolPath.Exec( nPartId) local ptE = EgtSP( nCurr) local nLinkId = EgtCurveCompoFromPoints( nTpathGrpId, {ptS, ptE}) EgtRelocateGlob( nLinkId, nCurr, GDB_IN.BEFORE) + EgtModifyCurveExtrusion( nLinkId, LayerParams.vtSlicing, GDB_RT.GLOB) EgtSetInfo( nLinkId, KEY_TYPE, TYPE.LINK) + EgtSetName( nLinkId, LINK_CRV) end sPrevName = sCurrName nPrev = nCurr From 5e65055e86e1d942d8f27fabc90262fce3b186c4 Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 3 Oct 2022 12:07:43 +0200 Subject: [PATCH 14/79] 3dPrinting : - correzioni varie. --- LuaLibs/CalcPaths.lua | 2 +- LuaLibs/CalcToolPath.lua | 27 +++++++++++++++++------ LuaLibs/RunCalcSolids.lua | 45 ++++++++++++++++++--------------------- 3 files changed, 43 insertions(+), 31 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 53d63ed..b6f475d 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -1111,7 +1111,7 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d end for nInd = nMaxShellNbrDiff, 1, -1 do - dOffs = dOffs + LayerParams.dStrand * ( 1 - LayerParams.nStrandOverlap / 100) + dOffs = dOffs + LayerParams.dStrand * ( 1 - EgtIf( nInd == LayerParams.nShellsNbr, 0, LayerParams.nStrandOverlap / 100)) local nSrfDiff = EgtGetFirstNameInGroup( nShellNbrGrp, SHELL_NBR_SURF .. tostring( nInd)) local nOuterCrv = EgtGetFirstNameInGroup( nCrvGrpId, OUTER_CRV) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 0d202e3..df8373c 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -213,6 +213,7 @@ local function AddRetraction( nCrvId, LayerParams, dCoastingLen, dWipeLen, dWipe else EgtErase( nCrvId) end + EgtModifyCurveExtrusion( nCoastingId, LayerParams.vtSlicing) EgtSetName( nCoastingId, COASTING_CRV) EgtSetInfo( nCoastingId, KEY_TYPE, TYPE.COASTING) EgtSetColor( nCoastingId, EgtStdColor('ORANGE')) @@ -242,6 +243,15 @@ local function AddRetraction( nCrvId, LayerParams, dCoastingLen, dWipeLen, dWipe vtDir:rotate( LayerParams.vtSlicing, EgtIf( bChangeSign, - dAng, dAng)) local ptS = EgtEP( nCoastingId or nCrvId) local ptE = ptS + vtDir * dWipeLen + -- verifico soddisfi altezza minima per dimensioni utensile + local dHMin = 0.5 * LayerParams.dTDiam * sqrt( LayerParams.vtSlicing:getX() * LayerParams.vtSlicing:getX() + LayerParams.vtSlicing:getY() * LayerParams.vtSlicing:getY()) + local k = 1 + while ptE:getZ() < dHMin + GEO.EPS_SMALL and k < 36 do + vtDir:rotate( LayerParams.vtSlicing, EgtIf( bChangeSign, 10, -10)) + ptE = ptS + vtDir * dWipeLen + k = k + 1 + end + nWipeId = EgtCurveCompoFromPoints( EgtGetParent( nCrvId), {ptS, ptE}) EgtModifyCurveExtrusion( nWipeId, LayerParams.vtSlicing, GDB_RT.GLOB) EgtRelocateGlob( nWipeId, nCoastingId or nCrvId, GDB_IN.AFTER) @@ -561,7 +571,7 @@ local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, end -------------------------------------------------------------------- -local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand) +local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing) local dLILen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_LEN, 'd') local bLIInvert = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_INVERT, 'b') @@ -578,6 +588,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand) local nLeadIn = FindCorrectRibsLead( dParS, nCrv, nCrvOffs, bLIInvert, dLILen, dStrand, true) -- se lead in possibile if nLeadIn then + EgtModifyCurveExtrusion( nLeadIn, vtSlicing) EgtSetInfo( nLeadIn, KEY_TYPE, TYPE.RIB) EgtSetName( nLeadIn, LEAD_IN_CRV) end @@ -626,6 +637,7 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand) if dRibsLOLen > GEO.EPS_SMALL and not bSkip then nCrvLO = EgtCopyGlob( nCrvRef, nCrv, GDB_IN.AFTER) EgtTrimCurveEndAtLen( nCrvLO, dRibsLOLen) + EgtModifyCurveExtrusion( nCrvLO, vtSlicing) EgtSetInfo( nCrvLO, KEY_TYPE, TYPE.RIB) EgtSetName( nCrvLO, LEAD_OUT_CRV) -- aggiorno ptE e vtE @@ -638,6 +650,7 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand) nCoasting = EgtCopyGlob( nCrvRef, nCrvLO or nCrv, GDB_IN.AFTER) EgtTrimCurveStartAtLen( nCoasting, dRibsLOLen) EgtTrimCurveEndAtLen( nCoasting, dRibsLOCoasting) + EgtModifyCurveExtrusion( nCoasting, vtSlicing) EgtSetName( nCoasting, COASTING_CRV) EgtSetInfo( nCoasting, KEY_TYPE, TYPE.COASTING) @@ -789,7 +802,7 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) -- verifico se necessario lead in local nPrev = EgtGetPrev( nCrvRib) if not nPrev or EgtGetName( nPrev) then - AddRibsLeadIn( nCrvRib, nLoopGrp, LayerParams.dStrand) + AddRibsLeadIn( nCrvRib, nLoopGrp, LayerParams.dStrand, LayerParams.vtSlicing) end -- verifico se necessario lead out local nNext = EgtGetNext( nCrvRib) @@ -968,10 +981,12 @@ function CalcToolPath.Exec( nPartId) local ptS = EgtEP( nPrev) local ptE = EgtSP( nCurr) local nLinkId = EgtCurveCompoFromPoints( nTpathGrpId, {ptS, ptE}) - EgtRelocateGlob( nLinkId, nCurr, GDB_IN.BEFORE) - EgtModifyCurveExtrusion( nLinkId, LayerParams.vtSlicing, GDB_RT.GLOB) - EgtSetInfo( nLinkId, KEY_TYPE, TYPE.LINK) - EgtSetName( nLinkId, LINK_CRV) + if nLinkId then + EgtRelocateGlob( nLinkId, nCurr, GDB_IN.BEFORE) + EgtModifyCurveExtrusion( nLinkId, LayerParams.vtSlicing, GDB_RT.GLOB) + EgtSetInfo( nLinkId, KEY_TYPE, TYPE.LINK) + EgtSetName( nLinkId, LINK_CRV) + end end sPrevName = sCurrName nPrev = nCurr diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index ae95d20..e668170 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -209,9 +209,8 @@ function RunCalcSolids.Exec() if EgtGetInfo( nPartId, KEY_PART_ON_TABLE, 'b') then -- verifico se necessario calcolare il solido local bCalcSolid = EgtGetInfo( nPartId, KEY_CALC_SOLIDS, 'b') or false - local bHasSolids = EgtGetInfo( nPartId, KEY_HAS_SOLIDS, 'b') or false - - if bCalcSolid and not bHasSolids then + + if bCalcSolid then -- recupero i suoi slice local vLayIds = EgtGetNameInGroup( nPartId, SLICE_LAYER .. '*') @@ -221,7 +220,7 @@ function RunCalcSolids.Exec() end EgtSetInfo( nPartId, KEY_HAS_SOLIDS, 1) - + local vErr = {} -- recupero i parametri necessari al calcolo dei solidi local LayerParams = GetLayerParamsForSolidCalc( nPartId) @@ -238,39 +237,37 @@ function RunCalcSolids.Exec() EgtOutBox( 'Error no tool paths', 'SolidCalc') return end - + -- recupero il gruppo dei solidi local nSolidGrpId = EgtGetFirstNameInGroup( nCrvGrpId, SOLID_GRP) or GDB_ID.NULL if nSolidGrpId == GDB_ID.NULL then nSolidGrpId = EgtGroup( nCrvGrpId) EgtSetName( nSolidGrpId, SOLID_GRP) EgtSetLevel( nSolidGrpId, GDB_LV.TEMP) - else - EgtEmptyGroup( nSolidGrpId) - end - - -- scorro le curve del percorso utensile - local nId = EgtGetFirstInGroup( nTPathGrpId) - while nId do - local bOk = CreateSolidFromCurve( nId, nSolidGrpId, LayerParams) - if not bOk then - table.insert( vErr, nIdx) + + -- scorro le curve del percorso utensile + local nId = EgtGetFirstInGroup( nTPathGrpId) + while nId do + local bOk = CreateSolidFromCurve( nId, nSolidGrpId, LayerParams) + if not bOk then + table.insert( vErr, nIdx) + end + nId = EgtGetNext( nId) end - nId = EgtGetNext( nId) - end - - -- processo gli eventi - if ( nIdx % 20) == 0 then - EgtDraw() - if EgtProcessEvents( nIdx / #vLayIds * 100, 0) == 1 then - return + + -- processo gli eventi + if ( nIdx % 20) == 0 then + EgtDraw() + if EgtProcessEvents( nIdx / #vLayIds * 100, 0) == 1 then + return + end end end --passo al gruppo di contorni successivo nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") or GDB_ID.NULL end - EgtDraw() + EgtDraw() if EgtProcessEvents( EgtIf( PRINT, 300, 0) + nIdx / #vLayIds * 100, 0) == 1 then return end From a94474869c15b39fb166f6f30cc61ce7e18ace89 Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 3 Oct 2022 16:08:25 +0200 Subject: [PATCH 15/79] 3dPrinting : - modifiche progress bar. --- LuaLibs/CalcPaths.lua | 2 +- LuaLibs/CalcSlices.lua | 14 +++++++++----- LuaLibs/CalcToolPath.lua | 2 +- LuaLibs/RunCalcSolids.lua | 8 ++++---- LuaLibs/RunGcodeGenerate.lua | 16 ++++++++-------- LuaLibs/RunMachParamFromSWCalc.lua | 2 +- 6 files changed, 24 insertions(+), 20 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index b6f475d..fc35c94 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -1518,7 +1518,7 @@ function CalcPaths.Exec( nPartId) end end - if EgtProcessEvents( EgtIf( PRINT, 100, 0) + nIdx / #vLayIds * 100, 0) == 1 then + if EgtProcessEvents( EgtIf( PRINT, 200, 0) + nIdx / #vLayIds * 100, 0) == 1 then EgtDraw() return end diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 2541d49..b9c07da 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -335,8 +335,12 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) local nRecalc = 0 local dDeltaZStart = 0.2 --dDeltaZStart = 0 + local vZSlices = ComputeZSlices( dZmin, dDeltaZStart, dZmax) - local nLayId = EgtParPlanesSurfTmInters( ORIG(), vtSlicing, vZSlices, nStmId, nPartId, GDB_RT.GLOB, TOLER) + if EgtProcessEvents( 1, 0) == 1 then return end + local nLayId = EgtParPlanesSurfTmInters( ORIG(), vtSlicing, vZSlices, nStmId, nPartId, GDB_RT.GLOB, TOLER) + if EgtProcessEvents( 100, 0) == 1 then return end + local vErr = {} local vPrevCen = {} -- scorro i risultati dello slicing @@ -561,7 +565,7 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) end -- passo al layer successivo - if EgtProcessEvents( nLayCnt / ( #vZSlices + 3) * 100, 0) == 1 then + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + nLayCnt / ( #vZSlices + 3) * 100, 0) == 1 then EgtDraw() return end @@ -574,14 +578,14 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) if nRibsLay then SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV) end - if EgtProcessEvents( ( #vZSlices + 1) / ( #vZSlices + 3) * 100, 0) == 1 then return end + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 1) / ( #vZSlices + 3) * 100, 0) == 1 then return 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 - if EgtProcessEvents( ( #vZSlices + 2) / ( #vZSlices + 3) * 100, 0) == 1 then return end + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 2) / ( #vZSlices + 3) * 100, 0) == 1 then return end -- solidi ausiliari local nAuxSolidsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_AUX_SOLIDS) @@ -589,7 +593,7 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) AdjustAuxSolids( nAuxSolidsLay) SlicingExtraObjects( vtSlicing, nAuxSolidsLay, TYPE.AUX_SOLID, AUX_SOLIDS_GRP, AUX_SOLIDS_CRV) end - if EgtProcessEvents( ( #vZSlices + 3) / ( #vZSlices + 3) * 100, 0) == 1 then return end + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 3) / ( #vZSlices + 3) * 100, 0) == 1 then return end -- eventuale segnalazione errori if #vErr > 0 then diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index df8373c..df34eea 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -1050,7 +1050,7 @@ function CalcToolPath.Exec( nPartId) nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") end - if EgtProcessEvents( EgtIf( PRINT, 200, 0) + nIdx / #vLayIds * 100, 0) == 1 then + if EgtProcessEvents( EgtIf( PRINT, 300, 0) + nIdx / #vLayIds * 100, 0) == 1 then EgtDraw() return end diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index e668170..61b6088 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -258,9 +258,9 @@ function RunCalcSolids.Exec() -- processo gli eventi if ( nIdx % 20) == 0 then EgtDraw() - if EgtProcessEvents( nIdx / #vLayIds * 100, 0) == 1 then - return - end + -- if EgtProcessEvents( nIdx / #vLayIds * 100, 0) == 1 then + -- return + -- end end end @@ -268,7 +268,7 @@ function RunCalcSolids.Exec() nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") or GDB_ID.NULL end EgtDraw() - if EgtProcessEvents( EgtIf( PRINT, 300, 0) + nIdx / #vLayIds * 100, 0) == 1 then + if EgtProcessEvents( EgtIf( PRINT, 400, 0) + nIdx / #vLayIds * 100, 0) == 1 then return end end diff --git a/LuaLibs/RunGcodeGenerate.lua b/LuaLibs/RunGcodeGenerate.lua index d1c1870..b019cb6 100644 --- a/LuaLibs/RunGcodeGenerate.lua +++ b/LuaLibs/RunGcodeGenerate.lua @@ -24,7 +24,7 @@ end function RunGcodeGenerate.Exec() -- aggiorno interfaccia - EgtProcessEvents( 501, 0) + EgtProcessEvents( 601, 0) -- Recupero il pezzo (per ora primo e unico) local nPartIndex = 1 @@ -45,7 +45,7 @@ function RunGcodeGenerate.Exec() local LayerParams = GetLayerParamsForGcodeGenerate( nPartId) -- aggiorno interfaccia - EgtProcessEvents( 505, 0) + EgtProcessEvents( 605, 0) -- Ciclo sui layer local vEntId = {} @@ -75,7 +75,7 @@ function RunGcodeGenerate.Exec() end -- aggiorno interfaccia - EgtProcessEvents( 510, 0) + EgtProcessEvents( 610, 0) -- Imposto gruppo di lavoro EgtSetCurrMachGroup() @@ -97,7 +97,7 @@ function RunGcodeGenerate.Exec() end -- aggiorno interfaccia - EgtProcessEvents( 520, 0) + EgtProcessEvents( 620, 0) EgtSetMachiningGeometry( vEntId) @@ -116,7 +116,7 @@ function RunGcodeGenerate.Exec() end -- aggiorno interfaccia - EgtProcessEvents( 550, 0) + EgtProcessEvents( 650, 0) -- Salvo il progetto local sFilePath = EgtGetCurrFilePath() @@ -125,7 +125,7 @@ function RunGcodeGenerate.Exec() EgtSaveFile() -- aggiorno interfaccia - EgtProcessEvents( 580, 0) + EgtProcessEvents( 680, 0) -- Genero il programma CN local sInfo = 'EgtCAM5 ver.' .. EgtGetExeVersion() .. ' - ' .. sPath @@ -135,7 +135,7 @@ function RunGcodeGenerate.Exec() end -- aggiorno interfaccia - EgtProcessEvents( 590, 0) + EgtProcessEvents( 690, 0) EgtResetCurrMachGroup() @@ -154,7 +154,7 @@ function RunGcodeGenerate.Exec() end -- aggiorno interfaccia - EgtProcessEvents( 600, 0) + EgtProcessEvents( 700, 0) end diff --git a/LuaLibs/RunMachParamFromSWCalc.lua b/LuaLibs/RunMachParamFromSWCalc.lua index bb57aa2..286115d 100644 --- a/LuaLibs/RunMachParamFromSWCalc.lua +++ b/LuaLibs/RunMachParamFromSWCalc.lua @@ -170,7 +170,7 @@ function RunMachParamFromSWCalc.Exec() EgtSetInfo( nLayerResultId, KEY_LENGTH, dTotLayerLength) EgtSetInfo( nLayerResultId, KEY_SPEED, dSpeed) -- aggiorno interfaccia - EgtProcessEvents( 400 + ( nLayerIndex / nLayerQty * 100), 0) + EgtProcessEvents( 500 + ( nLayerIndex / nLayerQty * 100), 0) nLayerIndex = nLayerIndex + 1 nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex) end From d50277011463d92dd783cee5be20b6a370347f04 Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Mon, 10 Oct 2022 16:28:01 +0200 Subject: [PATCH 16/79] - Aggiunta gestione attesa su layer --- LuaLibs/RunMachParamFromSWCalc.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/LuaLibs/RunMachParamFromSWCalc.lua b/LuaLibs/RunMachParamFromSWCalc.lua index 286115d..f29fc2c 100644 --- a/LuaLibs/RunMachParamFromSWCalc.lua +++ b/LuaLibs/RunMachParamFromSWCalc.lua @@ -92,9 +92,11 @@ function RunMachParamFromSWCalc.Exec() end -- recupero feed del layer local dLayerFeed = 0 + local dLayerWait = 0 local nLayerResultId = EgtGetFirstNameInGroup( nResultLayerId, nLayerIndex) if nLayerResultId then dLayerFeed = EgtGetInfo( nLayerResultId, KEY_FCUR, 'd') or 0 + dLayerWait = EgtGetInfo( nLayerResultId, KEY_WAITING_TIME, 'd') or 0 else nLayerResultId = EgtGroup( nResultLayerId) EgtSetName( nLayerResultId, nLayerIndex) @@ -123,6 +125,7 @@ function RunMachParamFromSWCalc.Exec() local dLayerTime = dTTrg if dLayerFeed == 0 then dLayerFeed = dFTrg + dLayerWait = dTMin - dLayerTime else dLayerTime = dTotLayerLength / dLayerFeed * 60 end @@ -157,6 +160,11 @@ function RunMachParamFromSWCalc.Exec() EgtSetInfo( nToolPathId, KEY_SPEED, dSpeed) nCrvId = EgtGetNextName( nCrvId, CONTOUR_GRP .. '*') end + -- scrivo info attesa + if dLayerWait > 0 then + EgtSetInfo( nLayerId, KEY_WAITING_TIME, dLayerWait) + EgtSetInfo( nLayerResultId, KEY_WAITING_TIME, dLayerWait) + end -- scrivo valori in struttura dati --local nLayerResultId = EgtGetFirstNameInGroup( nResultLayerId, nLayerIndex) EgtSetInfo( nLayerResultId, KEY_TMIN, dTMin) From 2288078e49dba61d2a11f8a4be49833fab57a570 Mon Sep 17 00:00:00 2001 From: DarioS Date: Tue, 11 Oct 2022 09:46:47 +0200 Subject: [PATCH 17/79] =?UTF-8?q?3dPrinting=20:=20-=20corretta=20verifica?= =?UTF-8?q?=20necessit=C3=A0=20ricalcolo=20solidi.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LuaLibs/RunCalcSolids.lua | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index 61b6088..785c189 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -1,4 +1,4 @@ --- RunCalcSolids.lua by Egaltech s.r.l. 2022/07/01 +-- RunCalcSolids.lua by Egaltech s.r.l. 2022/10/10 -- Calcolo percorsi di lavoro per Stampa 3d -- Tabella per definizione modulo @@ -226,7 +226,8 @@ function RunCalcSolids.Exec() local LayerParams = GetLayerParamsForSolidCalc( nPartId) for nIdx = 1, #vLayIds do - + -- flag di interruzione perchè trovati solidi già ok + local bSolidsOk = false -- scorro tutti i gruppi di contorni local nCrvGrpId = EgtGetFirstNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*") or GDB_ID.NULL while nCrvGrpId ~= GDB_ID.NULL do @@ -258,15 +259,18 @@ function RunCalcSolids.Exec() -- processo gli eventi if ( nIdx % 20) == 0 then EgtDraw() - -- if EgtProcessEvents( nIdx / #vLayIds * 100, 0) == 1 then - -- return - -- end end + else + bSolidsOk = true + break end --passo al gruppo di contorni successivo nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") or GDB_ID.NULL end + if bSolidsOk then + break + end EgtDraw() if EgtProcessEvents( EgtIf( PRINT, 400, 0) + nIdx / #vLayIds * 100, 0) == 1 then return From 7792f2224243b1f0182ad5950474839cd1b56559 Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 11 Oct 2022 16:06:30 +0200 Subject: [PATCH 18/79] 3dPrinting : - spiral vase (prima versione) - aggiunto controllo sui wipe dei setti. --- LuaLibs/AddManData.lua | 2 + LuaLibs/CalcPaths.lua | 19 ++-- LuaLibs/CalcSlices.lua | 45 +++++---- LuaLibs/CalcToolPath.lua | 202 ++++++++++++++++++++++++++++++++------ LuaLibs/RunCalcSolids.lua | 174 +++++++++++++++++++++++++------- LuaLibs/RunSlicing.lua | 2 + 6 files changed, 349 insertions(+), 95 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 2b96f3b..fa21986 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -37,6 +37,7 @@ MIN_RIBS_LEN = 2 SEC_DEFAULT = "Default" KEY_PARAMS = "Params" KEY_CALC_SOLIDS = "CalcSolids" +KEY_SPIRAL_VASE = "SpiralVase" KEY_SLICING_45 = "Slicing45" KEY_SLICING_DIR="SlicingDir" KEY_SLICE_STEP = "StrandH" @@ -75,6 +76,7 @@ KEY_OFFSET_LEAD_POINT = "OffsetLeadPoint" KEY_COASTING_LEN = "CoastingLen" KEY_COASTING_FEED = "CoastingFeed" KEY_WIPE_LEN = "WipeLen" +KEY_WIPE_DIR = "WipeDir" KEY_WIPE_FEEDPU = "WipeFeedPu" KEY_TOOL_DIAM = "ToolDiam" diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index fc35c94..dbf3aaa 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -18,7 +18,8 @@ local s_dOffsCorr = 10 * GEO.EPS_SMALL --------------------------------------------------------------------- local function GetLayerParamsForPathCalc() - local LayerParams = {} + local LayerParams = {} + LayerParams.bSpiralVase = EgtGetInfo( s_nPartId, KEY_SPIRAL_VASE, 'b') or false LayerParams.nShellsNbr = EgtGetInfo( s_nPartId, KEY_SHELLS_NBR, 'i') LayerParams.dStrand = EgtGetInfo( s_nPartId, KEY_STRAND, 'd') LayerParams.nStrandOverlap = EgtGetInfo( s_nPartId, KEY_STRAND_OVERLAP, 'i') or 0 @@ -31,6 +32,14 @@ local function GetLayerParamsForPathCalc() LayerParams.bPrintInvert = ( EgtGetInfo( s_nPartId, KEY_PRINT_DIRECTION, 'i') == PRINT_DIRECTION.CW) -- parametri costolature LayerParams.bRibsInvertOrder = EgtGetInfo( s_nPartId, KEY_RIBS_INVERT_ORDER, 'b') + + -- eventuale modifica dei parametri per gestire correttamente il caso spiral vase + if LayerParams.bSpiralVase then + LayerParams.nShellsNbr = 1 + LayerParams.nFloorNbr = 0 + LayerParams.nCeilNbr = 0 + end + return LayerParams end @@ -1362,7 +1371,7 @@ local function CalcAuxSolidsPaths( nSliceGrp, nSolidGrp, LayerParams, vPtStart) -- verifico se il gruppo contine qualcosa if not EgtGetFirstNameInGroup( nSolidPathGrp, AUX_SOLIDS_CRV .. '*') then - EgtErase( nSolidPathGrp) + EgtErase( nSolidPathGrp) end -- passo al gruppo di contorni successivo @@ -1402,7 +1411,7 @@ function CalcPaths.Exec( nPartId) local nCrvGrpId = EgtGetFirstNameInGroup( vLayIds[nIdx], CONTOUR_GRP.."*") or GDB_ID.NULL while nCrvGrpId ~= GDB_ID.NULL do - -- verifico se il path e il solido sono già stati calcolati + -- verifico se il path è già stato calcolato local nGrpId = EgtGetFirstNameInGroup( nCrvGrpId, PATH_GRP) or GDB_ID.NULL if nGrpId == GDB_ID.NULL then nGrpId = EgtGroup( nCrvGrpId) @@ -1411,10 +1420,6 @@ function CalcPaths.Exec( nPartId) EgtEmptyGroup( nGrpId) EgtSetStatus( nGrpId, GDB_ST.ON) end - local nSolidGrpId = EgtGetFirstNameInGroup( nCrvGrpId, SOLID_GRP) or GDB_ID.NULL - if nSolidGrpId ~= GDB_ID.NULL then - EgtErase( nSolidGrpId) - end -- recupero la superficie ottenuta dallo slicing local nSrf = EgtGetFirstNameInGroup( nCrvGrpId, LAYER_SRF) diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index b9c07da..f659ad2 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -572,28 +572,31 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) nLayCnt = nLayCnt + 1 nLayId = EgtGetNext( nLayId) end - - -- costolature - local nRibsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_RIBS) - if nRibsLay then - SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV) + + local bSpiralVase = EgtGetInfo( s_nPartId, KEY_SPIRAL_VASE, 'b') or false + if not bSpiralVase then + -- costolature + local nRibsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_RIBS) + if nRibsLay then + SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV) + end + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 1) / ( #vZSlices + 3) * 100, 0) == 1 then return 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 + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 2) / ( #vZSlices + 3) * 100, 0) == 1 then return end + + -- solidi ausiliari + local nAuxSolidsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_AUX_SOLIDS) + if nAuxSolidsLay then + AdjustAuxSolids( nAuxSolidsLay) + SlicingExtraObjects( vtSlicing, nAuxSolidsLay, TYPE.AUX_SOLID, AUX_SOLIDS_GRP, AUX_SOLIDS_CRV) + end + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 3) / ( #vZSlices + 3) * 100, 0) == 1 then return end end - if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 1) / ( #vZSlices + 3) * 100, 0) == 1 then return 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 - if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 2) / ( #vZSlices + 3) * 100, 0) == 1 then return end - - -- solidi ausiliari - local nAuxSolidsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_AUX_SOLIDS) - if nAuxSolidsLay then - AdjustAuxSolids( nAuxSolidsLay) - SlicingExtraObjects( vtSlicing, nAuxSolidsLay, TYPE.AUX_SOLID, AUX_SOLIDS_GRP, AUX_SOLIDS_CRV) - end - if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 3) / ( #vZSlices + 3) * 100, 0) == 1 then return end -- eventuale segnalazione errori if #vErr > 0 then diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index df34eea..8de55bb 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -19,6 +19,7 @@ local s_nDefaultWipeAng = -90 -- angolo = 0° per wipe significa che esce orto --------------------------------------------------------------------- local function GetLayerParamsForToolPathCalc() local LayerParams = {} + LayerParams.bSpiralVase = EgtGetInfo( s_nPartId, KEY_SPIRAL_VASE, 'b') or false LayerParams.dStrand = EgtGetInfo( s_nPartId, KEY_STRAND, 'd') LayerParams.dLayHeight = EgtGetInfo( s_nPartId, KEY_SLICE_STEP, 'd') LayerParams.dOffs = EgtGetInfo( s_nPartId, KEY_OFFSET_SLICE, 'd') @@ -36,6 +37,7 @@ local function GetLayerParamsForToolPathCalc() LayerParams.dSPOffs = EgtGetInfo( s_nPartId, KEY_SP_OFFSET_ON_SLICE, 'd') LayerParams.dCoastingLen = EgtGetInfo( s_nPartId, KEY_COASTING_LEN, 'd') LayerParams.dWipeLen = EgtGetInfo( s_nPartId, KEY_WIPE_LEN, 'd') + LayerParams.dWipeDir = EgtGetInfo( s_nPartId, KEY_WIPE_DIR, 'd') or 0.0 LayerParams.vtSlicing = EgtGetInfo( s_nPartId, KEY_SLICING_DIR, 'v') LayerParams.dTDiam = EgtGetInfo( s_nPartId, KEY_TOOL_DIAM, 'd') -- Parametri costolature @@ -143,18 +145,23 @@ local function AddLeadIn( nCrvId, LayerParams, nGrpId) vtOrtho:rotate( LayerParams.vtSlicing, dAng) local ptS = ptE - LayerParams.dLeadInTangDist * vtTang + LayerParams.dLeadInOrthoDist * vtOrtho + -- verifico che non affondi nella tavola + if ptS:getZ() < GEO.EPS_SMALL then return end - local nLeadInCrv = GDB_ID.NULL + local nLeadInCrv if LayerParams.nLeadInType == LEAD_TYPE.LINEAR then nLeadInCrv = EgtCurveCompoFromPoints( nGrpId, {ptS, ptE}) elseif LayerParams.nLeadInType == LEAD_TYPE.ARC then nLeadInCrv = EgtArc2PV( nGrpId, ptE, ptS, -vtTang) EgtInvertCurve( nLeadInCrv) - end - EgtRelocate( nLeadInCrv, nGrpId, GDB_IN.FIRST_SON) - EgtModifyCurveExtrusion( nLeadInCrv, LayerParams.vtSlicing, GDB_RT.GLOB) - EgtSetInfo( nLeadInCrv, KEY_TYPE, TYPE.LINK) - EgtSetName( nLeadInCrv, LEAD_IN_CRV) + end + + if nLeadIn then + EgtRelocate( nLeadInCrv, nGrpId, GDB_IN.FIRST_SON) + EgtModifyCurveExtrusion( nLeadInCrv, LayerParams.vtSlicing, GDB_RT.GLOB) + EgtSetInfo( nLeadInCrv, KEY_TYPE, TYPE.LINK) + EgtSetName( nLeadInCrv, LEAD_IN_CRV) + end end -------------------------------------------------------------------- @@ -172,16 +179,20 @@ local function AddLeadOut( nCrvId, LayerParams, nGrpId) vtOrtho:rotate( LayerParams.vtSlicing, dAng) local ptE = ptS + LayerParams.dLeadOutTangDist * vtTang + LayerParams.dLeadOutOrthoDist * vtOrtho - local nLeadOutCrv = GDB_ID.NULL + local nLeadOutCrv if LayerParams.nLeadOutType == LEAD_TYPE.LINEAR then nLeadOutCrv = EgtCurveCompoFromPoints( nGrpId, {ptS, ptE}) elseif LayerParams.nLeadOutType == LEAD_TYPE.ARC then - nLeadOutCrv = EgtArc2PV( nGrpId, ptS, ptE, vtTang) + nLeadOutCrv = EgtArc2PV( nGrpId, ptS, ptE, vtTang) end - EgtRelocate( nLeadOutCrv, nGrpId, GDB_IN.LAST_SON) - EgtModifyCurveExtrusion( nLeadOutCrv, LayerParams.vtSlicing, GDB_RT.GLOB) - EgtSetInfo( nLeadOutCrv, KEY_TYPE, TYPE.LINK) - EgtSetName( nLeadOutCrv, LEAD_OUT_CRV) + + if nLeadOutCrv then + EgtRelocate( nLeadOutCrv, nGrpId, GDB_IN.LAST_SON) + EgtModifyCurveExtrusion( nLeadOutCrv, LayerParams.vtSlicing, GDB_RT.GLOB) + EgtSetInfo( nLeadOutCrv, KEY_TYPE, TYPE.LINK) + EgtSetName( nLeadOutCrv, LEAD_OUT_CRV) + end + return nLeadOutCrv end -------------------------------------------------------------------- @@ -228,17 +239,17 @@ local function AddRetraction( nCrvId, LayerParams, dCoastingLen, dWipeLen, dWipe EgtTrimCurveEndAtLen( nWipeId, dWipeLen) else - -- se extra shell o infill a zigzag + -- se extra shell, infill a zigzag o spiral vase local vtDir = EgtEV( nCoastingId or nCrvId) local dAng = dWipeDir + s_nDefaultWipeAng -- verifico se necessario cambiare il segno all'angolo local bChangeSign = false - if nType == TYPE.EXTRA_SHELL then - bChangeSign = bInverted - else + if nType == TYPE.INFILL then local vtS = EgtGetInfo( nCrvId, KEY_ZIG_ZAG_DIR, 'v') local bSameDir = AreSameVectorApprox( vtS, vtDir) - bChangeSign = ( bInverted == bSameDir) + bChangeSign = ( bInverted == bSameDir) + else + bChangeSign = bInverted end vtDir:rotate( LayerParams.vtSlicing, EgtIf( bChangeSign, - dAng, dAng)) local ptS = EgtEP( nCoastingId or nCrvId) @@ -277,12 +288,14 @@ local function AddRetractionOnLastCrv( nCrvId, nTpathGrpId, LayerParams, dCoasti if dLen > dCoastingLen - 500 * GEO.EPS_SMALL then -- coinvolge solo la curva di lead out local dNewCoastingLen = EgtIf( abs( dCoastingLen - dLen) < 500 * GEO.EPS_SMALL, dLen, dCoastingLen) -- verifico se interamente coinvolta - AddRetraction( nLeadOutId, LayerParams, dNewCoastingLen, 0.0, dWipeDir) + AddRetraction( nLeadOutId, LayerParams, dNewCoastingLen, dWipeLen, dWipeDir) else -- coinvolge parte dell'ultima shell crv local dNewCoastingLen = dCoastingLen - dLen local nCoastingId = AddRetraction( nCrvId, LayerParams, dNewCoastingLen, 0.0, dWipeDir) EgtAddCurveCompoCurve( nCoastingId, nLeadOutId) + -- wipe + AddRetraction( nCoastingId, LayerParams, 0, dWipeLen, dWipeDir) end end end @@ -600,7 +613,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing) end -------------------------------------------------------------------- -local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand) +local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, dTDiam) local dRibsLOLen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_LEN, 'd') local dRibsLOCoasting = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_COASTING, 'd') @@ -618,7 +631,7 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand) -- recupero la curva di offset su cui calcolare lead out local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) while nCrvOffs do - local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE) + local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE) if dParE then local nCrvLO @@ -668,6 +681,15 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand) local dAng = dRibsLOWipeAng + s_nDefaultWipeAng vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng)) local ptFinal = ptE + vtE * dRibsLOWipe + -- verifico soddisfi altezza minima per dimensioni utensile + local dHMin = 0.5 * dTDiam * sqrt( vtSlicing:getX() * vtSlicing:getX() + vtSlicing:getY() * vtSlicing:getY()) + local k = 1 + while ptFinal:getZ() < dHMin + GEO.EPS_SMALL and k < 36 do + vtE:rotate( vtSlicing, EgtIf( bInvert, - 10, 10)) + ptFinal = ptE + vtE * dRibsLOWipe + k = k + 1 + end + nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}) EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB) EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER) @@ -676,7 +698,7 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand) EgtSetColor( nWipe, EgtStdColor('AQUA')) end - return + return end nCrvOffs = EgtGetNext( nCrvOffs) @@ -807,7 +829,7 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) -- verifico se necessario lead out local nNext = EgtGetNext( nCrvRib) if not nNext or EgtGetName( nNext) then - AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand) + AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand, LayerParams.dTDiam) end nCrvRib = EgtGetNextName( nCrvRib, RIBS_CRV .. '*') end @@ -837,14 +859,14 @@ local function CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGr local dWipeLen = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_WIPE_LEN, 'd') local dWipeDir = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_WIPE_DIR, 'd') - -- copio i percorsi nel gruppo toolpath + -- copio i percorsi nel gruppo toolpath local nPrev = EgtGetLastInGroup( nTpathGrpId) for i = 1, #vEntIds do local nNewEnt = EgtCopyGlob( vEntIds[i], nPrev, EgtIf( i == 1 or nOrder == PRINT_ORDER.EXT_INT_INF, GDB_IN.AFTER, GDB_IN.BEFORE)) -- correggo posizione EgtMove( nNewEnt, dCorrZ * Z_AX(), GDB_RT.GLOB) - EgtMove( nNewEnt, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) + EgtMove( nNewEnt, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) EgtModifyCurveExtrusion( nNewEnt, LayerParams.vtSlicing, GDB_RT.GLOB) EgtSetInfo( nNewEnt, KEY_TYPE, TYPE.AUX_SOLID) @@ -879,6 +901,118 @@ local function CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGr end end +--------------------------------------------------------------------- +local function AddSpiralVaseLeadOut( nOldId, LayerParams) + + if LayerParams.nLeadOutType ~= LEAD_TYPE.NONE then + EgtTrimCurveEndAtLen( nOldId, EgtCurveLength( nOldId) - LayerParams.dOffsetLP) + local nLeadOut = AddLeadOut( nOldId, LayerParams, EgtGetParent( nOldId)) + if nLeadOut then + local dDelta = LayerParams.dLayHeight / EgtCurveLength( nOldId) * EgtCurveLength( nLeadOut) + EgtSpiralizeCurve( nLeadOut, dDelta) + end + AddRetractionOnLastCrv( nOldId, EgtGetParent( nOldId), LayerParams, LayerParams.dCoastingLen, LayerParams.dWipeLen, LayerParams.dWipeDir) + else + AddRetraction( nOldId, LayerParams, LayerParams.dCoastingLen, LayerParams.dWipeLen, LayerParams.dWipeDir) + end + +end + +--------------------------------------------------------------------- +local function SpiralVase( vLayIds, dCorrZ, LayerParams) + + local nOldId + local bFirst = true + + -- ciclo sui layer + for nIdx = 1, #vLayIds do + + -- cerco i gruppi di contorni + local vCrvGrpIds = EgtGetNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*") + if #vCrvGrpIds > 1 then + -- se più di un gruppo di curve warning + EgtOutLog( 'Warning : in spiral vase mode more than one curve (layer '..tostring( nIdx)..') - CalcToolPath') + end + + for i = 1, #vCrvGrpIds do + -- recupero il gruppo dei percorsi + local nPathGrpId = EgtGetFirstNameInGroup( vCrvGrpIds[i], PATH_GRP) + if not nPathGrpId then + EgtOutBox( 'Error missing paths', 'ToolPathCalc') + return + else + EgtSetStatus( nPathGrpId, GDB_ST.OFF) + end + + -- recupero il gruppo dei percorsi utensile + local nTpathGrpId = EgtGetFirstNameInGroup( vCrvGrpIds[i], TOOLPATH_GRP) + if not nTpathGrpId then + nTpathGrpId = EgtGroup( vCrvGrpIds[i]) + EgtSetName( nTpathGrpId, TOOLPATH_GRP) + else + EgtEmptyGroup( nTpathGrpId) + end + + -- creo il percorso di lavoro : + -- copio le curve, le ordino, le oriento e le muovo in Z + local nEntId = EgtGetFirstInGroup( nPathGrpId) + while nEntId do + local nNewEntId = EgtCopyGlob( nEntId, nTpathGrpId, GDB_IN.LAST_SON) + + -- correggo posizione in Z ( per essere sicuri di appoggiare sul piano) + EgtMove( nNewEntId, dCorrZ * Z_AX(), GDB_RT.GLOB) + -- mi sposto dell'altezza layer + EgtMove( nNewEntId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) + + EgtModifyCurveExtrusion( nNewEntId, LayerParams.vtSlicing, GDB_RT.GLOB) + -- eventuale inversione + if LayerParams.bInvert then + EgtInvertCurve( nNewEntId) + EgtSetInfo( nNewEntId, KEY_INVERTED_CRV, 1) + end + EgtSetColor( nNewEntId, EgtStdColor('GRAY')) + + -- se primo layer devo farne copia + if bFirst and nNewEntId then + local nFirstCrv = EgtCopyGlob( nNewEntId, nTpathGrpId, GDB_IN.FIRST_SON) + EgtModifyCurveExtrusion( nFirstCrv, LayerParams.vtSlicing, GDB_RT.GLOB) + -- eventuale lead in + if LayerParams.nLeadInType ~= LEAD_TYPE.NONE then + EgtTrimCurveStartAtLen( nFirstCrv, LayerParams.dOffsetLP) + AddLeadIn( nFirstCrv, LayerParams, nTpathGrpId) + end + nOldId = nNewEntId + bFirst = false + end + + -- modifico lo start point per collegarlo alla curva precedente + local ptOld = EgtEP( nOldId) + if dist( EgtSP( nNewEntId), ptOld) < LayerParams.dStrand + 10 then + EgtChangeClosedCurveStartPoint( nNewEntId, ptOld) + EgtModifyCurveStartPoint( nNewEntId, ptOld) + else + EgtOutLog( 'Warning : in spiral vase mode no link betweeen toolpaths (layer '..tostring( nIdx)..') - CalcToolPath') + -- aggiungo uscita, coasting e wipe sulla curva precedente + AddSpiralVaseLeadOut( nOldId, LayerParams) + end + + nOldId = nNewEntId + EgtSpiralizeCurve( nNewEntId, LayerParams.dLayHeight) + nEntId = EgtGetNext( nEntId) + end + end + + if EgtProcessEvents( EgtIf( PRINT, 300, 0) + nIdx / #vLayIds * 100, 0) == 1 then + EgtDraw() + return + end + end + + -- aggiungo uscita, coasting e wipe su ultima curva + AddSpiralVaseLeadOut( nOldId, LayerParams) + +end + --------------------------------------------------------------------- function CalcToolPath.Exec( nPartId) @@ -887,11 +1021,11 @@ function CalcToolPath.Exec( nPartId) -- Verifico il pezzo if not s_nPartId then EgtOutBox( 'Error missing part', 'ToolPathCalc') - return + return end -- Recupero i layer da processare - local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER.."*") + local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER.."*") if not vLayIds then EgtOutBox( 'Error missing slices', 'ToolPathCalc') return @@ -910,10 +1044,16 @@ function CalcToolPath.Exec( nPartId) local EntId = EgtGetFirstInGroup( SolidLayId) while EntId do EgtMove( EntId, vtMove) - EntId = EgtGetNext( EntId) + EntId = EgtGetNext( EntId) end end end + + -- caso spiral vase + if LayerParams.bSpiralVase then + SpiralVase( vLayIds, dCorrZ, LayerParams) + return + end -- Ciclo sui layer for nIdx = 1, #vLayIds do @@ -950,7 +1090,7 @@ function CalcToolPath.Exec( nPartId) EgtMove( nNewEntId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) -- eventuale inversione local nType = EgtGetInfo( nNewEntId, KEY_TYPE, 'i') - if LayerParams.bInvert then + if LayerParams.bInvert then if nType == TYPE.OUTER_SHELL or nType == TYPE.INNER_SHELL or ( nType == TYPE.INFILL and EgtCurveIsClosed( nNewEntId)) then EgtInvertCurve( nNewEntId) EgtSetInfo( nNewEntId, KEY_INVERTED_CRV, 1) @@ -1042,7 +1182,7 @@ function CalcToolPath.Exec( nPartId) end -- sistemo le costolature local nRibsGrp = EgtGetFirstNameInGroup( nCrvGrpId, RIBS_GRP) - if nRibsGrp then + if nRibsGrp then CalcRibsToolPath( nCrvGrpId, nTpathGrpId, LayerParams, dCorrZ) end @@ -1052,9 +1192,9 @@ function CalcToolPath.Exec( nPartId) if EgtProcessEvents( EgtIf( PRINT, 300, 0) + nIdx / #vLayIds * 100, 0) == 1 then EgtDraw() - return + return end - end + end end --------------------------------------------------------------------- diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index 785c189..4c37269 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -12,13 +12,15 @@ EgtOutLog( ' RunCalcSolids started', 1) -- Dati local AMD = require( 'AddManData') +-------------------------------------------------------------------- +s_dTol = 0.1 + --------------------------------------------------------------------- local function GetLayerParamsForSolidCalc( nPartId) - local LayerParams = {} - LayerParams.bInvert = EgtGetInfo( nPartId, KEY_PRINT_DIRECTION, 'b') + local LayerParams = {} + LayerParams.bSpiralVase = EgtGetInfo( nPartId, KEY_SPIRAL_VASE, 'b') or false LayerParams.dLayHeight = EgtGetInfo( nPartId, KEY_SLICE_STEP, 'd') LayerParams.dStrand = EgtGetInfo( nPartId, KEY_STRAND, 'd') - LayerParams.nOrder = EgtGetInfo( nPartId, KEY_PRINT_ORDER, 'i') LayerParams.vtSlicing = EgtGetInfo( nPartId, KEY_SLICING_DIR, 'v') return LayerParams end @@ -63,7 +65,7 @@ local function CreateSection( ptS, vtDir, dStrand, dH, vtSlicing, nSolidGrp) local ptF = ptC - 2 * ( dD1 + dD2) * vtDir local ptG = ptB - 2 * ( dD1 + dD2) * vtDir local ptH = ptA - 2 * dD1 * vtDir - + local nId = EgtCurveCompoFromPoints( nSolidGrp, {ptA, ptB, ptC, ptD, ptE, ptF, ptG, ptH, ptA}) EgtInvertCurve( nId) @@ -84,34 +86,135 @@ local function CreateHalfSection( ptS, vtDir, dStrand, dH, vtSlicing, nSolidGrp) return nId end --------------------------------------------------------------------- -local function CreateSolid( nCrvId, nSolidGrp, dStrand, dH, vtSlicing) - -- punti e direzioni all'inizio e fine della curva guida - local ptS = EgtSP( nCrvId) +------------------------------------------------------------------------------ +local function CreateSpiralVaseCap( nSectId, vtDir, nSolidGrp) + + local vPt = {} + for i = 0, 7 do + vPt[i + 1] = EgtUP( nSectId, i) + end + + local vCrvs = {} + vCrvs[1] = EgtArc2PV( nSolidGrp, vPt[1], vPt[2], vtDir) + vCrvs[2] = EgtArc2PV( nSolidGrp, vPt[8], vPt[3], vtDir) + vCrvs[3] = EgtArc2PV( nSolidGrp, vPt[7], vPt[4], vtDir) + vCrvs[4] = EgtArc2PV( nSolidGrp, vPt[6], vPt[5], vtDir) + vCrvs[5] = EgtCurveCompo( nSolidGrp, {vCrvs[1]}, false) + EgtCloseCurveCompo( vCrvs[5]) + vCrvs[6] = EgtCurveCompo( nSolidGrp, {vCrvs[4]}, false) + EgtCloseCurveCompo( vCrvs[6]) + local nSurf1 = EgtSurfTmRuled( nSolidGrp, vCrvs[1], vCrvs[2], GDB_RUL.ISOPAR, s_dTol) + local nSurf2 = EgtSurfTmRuled( nSolidGrp, vCrvs[2], vCrvs[3], GDB_RUL.ISOPAR, s_dTol) + local nSurf3 = EgtSurfTmRuled( nSolidGrp, vCrvs[3], vCrvs[4], GDB_RUL.ISOPAR, s_dTol) + local nSurf4 = EgtSurfTmByRegion( nSolidGrp, vCrvs[5], s_dTol) + local nSurf5 = EgtSurfTmByRegion( nSolidGrp, vCrvs[6], s_dTol) + local nCapSrf = EgtSurfTmBySewing( nSolidGrp, {nSurf1, nSurf2, nSurf3, nSurf4, nSurf5}) + + for i = 1, #vCrvs do + EgtErase( vCrvs[i]) + end + + return nCapSrf +end + +------------------------------------------------------------------------------- +local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) + + -- gruppo temporaneo per conti + local nGrpTmp = EgtGroup( nSolidGrp) + + local ptS = EgtSP( nCrvId) local vtS = EgtSV( nCrvId) - vtS:rotate( vtSlicing, 90) - local ptE = EgtEP( nCrvId) + local ptE = EgtEP( nCrvId) local vtE = EgtEV( nCrvId) - vtE:rotate( vtSlicing, -90) + -- appiattisco la curva + local nCrvCopy = EgtCopyGlob( nCrvId, nGrpTmp) + local dDelta = ( ptE - ptS) * LayerParams.vtSlicing + EgtSpiralizeCurve( nCrvCopy, - dDelta) + + -- calcolo la sezione + local vtDir = EgtSV( nCrvCopy) + vtDir:rotate( LayerParams.vtSlicing, 90) + local nSectId = CreateSection( ptS, vtDir, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nGrpTmp) + + -- creo il solido aperto (tubo) + local vCrvs = {} + local _, dParE = EgtCurveDomain( nSectId) + for i = 0, dParE do + local ptRef = EgtUP( nSectId, i) + local dOffs = ( ptRef - ptS) * vtDir + vCrvs[i+1] = EgtOffsetCurveAdv( nCrvCopy, dOffs) + if not vCrvs[i+1] or vCrvs[i+1] == GDB_ID.NULL then + EgtErase( nGrpTmp) + return nil + end + local dMove = ( ptRef - ptS) * LayerParams.vtSlicing + EgtMove( vCrvs[i+1], LayerParams.vtSlicing * dMove) + EgtSpiralizeCurve( vCrvs[i+1], dDelta) + end + local vSurfs = {} + for i = 1, #vCrvs - 1 do + vSurfs[i] = EgtSurfTmRuled( nGrpTmp, vCrvs[i], vCrvs[i+1], GDB_RUL.MINDIST, s_dTol) + if not vSurfs[i] or vSurfs[i] == GDB_ID.NULL then + EgtErase( nGrpTmp) + return nil + end + end + local nSrfId = EgtSurfTmBySewing( nSolidGrp, vSurfs) + EgtInvertSurf( nSrfId) + + -- creazione del mezzo disco iniziale + local nCap1 = CreateSpiralVaseCap( nSectId, - vtS, nSolidGrp) + -- creazione del mezzo disco finale + local vtDir2 = EgtEV( nCrvCopy) + vtDir2:rotate( LayerParams.vtSlicing, 90) + local nSectE = CreateSection( ptE, vtDir2, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nGrpTmp) + local nCap2 = CreateSpiralVaseCap( nSectE, vtE, nSolidGrp) + EgtInvertSurf( nCap2) + + -- cancello le curve usate per la costruzione + EgtErase( nGrpTmp) + + return EgtSurfTmBySewing( nSolidGrp, { nSrfId, nCap1, nCap2}) +end + +---------------------------------------------------------------------- +local function CreateStandardSolid( nCrvId, nSolidGrp, LayerParams, dStrand) + + local ptS = EgtSP( nCrvId) + local vtS = EgtSV( nCrvId) + vtS:rotate( LayerParams.vtSlicing, 90) + local ptE = EgtEP( nCrvId) + local vtE = EgtEV( nCrvId) + vtE:rotate( LayerParams.vtSlicing, -90) -- creazione del solido aperto (tubo) - local nSectId = CreateSection( ptS, vtS, dStrand, dH, vtSlicing, nSolidGrp) - local nSrfId = EgtSurfTmSwept( nSolidGrp, nSectId, nCrvId, false, 0.1) + local nSectId = CreateSection( ptS, vtS, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nSolidGrp) + local nSrfId = EgtSurfTmSwept( nSolidGrp, nSectId, nCrvId, false, s_dTol) EgtErase( nSectId) if not nSrfId then return nil end -- creazione del mezzo disco iniziale - local nSectS = CreateHalfSection( ptS, vtS, dStrand, dH, vtSlicing, nSolidGrp) - local nSrfS = EgtSurfTmByScrewing( nSolidGrp, nSectS, ptS, vtSlicing, 180, 0, false, 0.1) + local nSectS = CreateHalfSection( ptS, vtS, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nSolidGrp) + local nSrfS = EgtSurfTmByScrewing( nSolidGrp, nSectS, ptS, LayerParams.vtSlicing, 180, 0, false, s_dTol) EgtErase( nSectS) if not nSrfS then return nil end -- creazione del mezzo disco finale - local nSectE = CreateHalfSection( ptE, vtE, dStrand, dH, vtSlicing, nSolidGrp) - local nSrfE = EgtSurfTmByScrewing( nSolidGrp, nSectE, ptE, vtSlicing, 180, 0, false, 0.1) + local nSectE = CreateHalfSection( ptE, vtE, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nSolidGrp) + local nSrfE = EgtSurfTmByScrewing( nSolidGrp, nSectE, ptE, LayerParams.vtSlicing, 180, 0, false, s_dTol) EgtErase( nSectE) if not nSrfE then return nil end -- unione delle tre superfici return EgtSurfTmBySewing( nSolidGrp, { nSrfId, nSrfS, nSrfE}) end +-------------------------------------------------------------------------------------- +local function CreateSolid( nCrvId, nSolidGrp, LayerParams, dStrand) + if LayerParams.bSpiralVase then + return CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) + else + return CreateStandardSolid( nCrvId, nSolidGrp, LayerParams, dStrand) + end +end + --------------------------------------------------------------------- local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams) @@ -134,17 +237,17 @@ local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams) elseif nType == TYPE.RIB then Color = EgtStdColor( 'OLIVE') elseif nType == TYPE.AUX_SOLID then - Color = EgtStdColor( 'AQUA') + Color = EgtStdColor( 'AQUA') end - local nCopyId = EgtCopyGlob( nCrvId, nSolidGrp) + local nCopyId = EgtCopyGlob( nCrvId, nSolidGrp) local nId = GDB_ID.NULL local nParts = 1 local LEN_REF = 100 local bZigZagInfill = EgtGetInfo( nCopyId, KEY_ZIG_ZAG_INFILL, 'b') or false if bZigZagInfill then nId, nParts = EgtSplitCurveAtCorners( nCopyId, 80) - else + else local dLen = EgtCurveLength( nCrvId) if dLen > LEN_REF and nType ~= TYPE.LINK and nType ~= TYPE.COASTING then nParts = EgtClamp( floor( dLen / LEN_REF), 1, 10) @@ -155,34 +258,37 @@ local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams) if nId == GDB_ID.NULL then return false end local bOk = true for nInd = 0, nParts - 1 do - local nGuideId = nId + nInd - local nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams.dStrand - 2 * GEO.EPS_SMALL, LayerParams.dLayHeight, LayerParams.vtSlicing) + local nGuideId = nId + nInd + local nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams, LayerParams.dStrand - 2 * GEO.EPS_SMALL) if not nSrfId then - -- ritento con sezione leggermente modificata - nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams.dStrand - 100 * GEO.EPS_SMALL, LayerParams.dLayHeight, LayerParams.vtSlicing) + -- ritento con sezione leggermente modificata + nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams, LayerParams.dStrand - 100 * GEO.EPS_SMALL) if not nSrfId then - nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams.dStrand + 100 * GEO.EPS_SMALL, LayerParams.dLayHeight, LayerParams.vtSlicing) - if not nSrfId then + nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams, LayerParams.dStrand + 100 * GEO.EPS_SMALL) + if not nSrfId then -- ritento spezzando la curva local nGrp = EgtGroup( nSolidGrp, Frame3d( ORIG(), LayerParams.vtSlicing)) EgtRelocateGlob( nGuideId, nGrp) EgtApproxCurve( nGuideId, GDB_CA.LINES, 100 * GEO.EPS_SMALL) EgtRelocateGlob( nGuideId, nSolidGrp) local nFirstCrv, nCrvNbr = EgtSplitCurveAtCorners( nGuideId, 30) - if nFirstCrv and nCrvNbr > 1 then + if nFirstCrv and nCrvNbr > 1 then local nSrfIds = {} for nInd2 = 0, nCrvNbr-1 do - local nSrfId2 = CreateSolid( nFirstCrv + nInd2, nSolidGrp, LayerParams.dStrand - 100 * GEO.EPS_SMALL, LayerParams.dLayHeight, LayerParams.vtSlicing) + local nSrfId2 = CreateSolid( nFirstCrv + nInd2, nSolidGrp, LayerParams, LayerParams.dStrand - 100 * GEO.EPS_SMALL) EgtErase( nFirstCrv + nInd2) if nSrfId2 then table.insert( nSrfIds, nSrfId2) - end + end end - if #nSrfIds == nCrvNbr then - nSrfId = EgtSurfTmBySewing( nSolidGrp, nSrfIds) + if #nSrfIds == nCrvNbr then + nSrfId = EgtSurfTmBySewing( nSolidGrp, nSrfIds) end + else + EgtErase( nFirstCrv) end + EgtErase( nGrp) end end end @@ -192,7 +298,7 @@ local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams) EgtSetInfo( nSrfId, KEY_TYPE, nType) else bOk = false - end + end EgtErase( nGuideId) end @@ -278,10 +384,6 @@ function RunCalcSolids.Exec() end -- eventuale segnalazione errori - -- if #vErr > 0 then - -- EgtOutBox( 'Error on layers :\n' .. table.concat( vErr, ','), 'SolidCalc') - -- end - for i = 1, #vErr do EgtOutLog( 'Error on solid creation (layer ' .. vErr[i] .. ') - SolidCalc') end diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 6afb327..d50f48a 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -37,6 +37,7 @@ local function LoadParams( sFile, nPartId) EgtSetInfo( nPartId, KEY_PARAMS, sFile) SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_CALC_SOLIDS, '0') + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SPIRAL_VASE, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SLICING_45, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SLICE_STEP, '1.0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_STRAND, '6.0') @@ -123,6 +124,7 @@ local function LoadParams( sFile, nPartId) SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_COASTING_LEN, '0.0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_COASTING_FEED, '20000.0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_WIPE_LEN, '0.0') + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_WIPE_DIR, '0.0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_WIPE_FEEDPU, '0.9') -- parametri per costolature From f05f9c11aea8a4b0622903eb696c13ea39671347 Mon Sep 17 00:00:00 2001 From: DarioS Date: Wed, 12 Oct 2022 19:08:11 +0200 Subject: [PATCH 19/79] 3dPrinting : - aggiustamento tolleranze per slicing. --- LuaLibs/CalcSlices.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index f659ad2..c8bccc5 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -1,4 +1,4 @@ --- CalcSlices.lua by Egaltech s.r.l. 2022/09/18 +-- CalcSlices.lua by Egaltech s.r.l. 2022/10/12 -- Calcolo percorsi di lavoro per Stampa 3d -- Tabella per definizione modulo @@ -297,8 +297,8 @@ end function CalcSlices.Exec( nPartId, nStmId, HMax) -- costanti - local TOLER = 0.2 - local SMALL_TOLER = 0.5 + local TOLER = 0.05 + local MID_TOLER = 0.5 local BIG_TOLER = 2.0 local MIN_LEN = 20.0 local MIN_AREA = 25.0 @@ -457,7 +457,7 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) local nGrp = EgtGroup( nLayId, frSlicing) for i = 1, #vClosedId do EgtRelocateGlob( vClosedId[i], nGrp) - EgtApproxCurve( vClosedId[i], GDB_CA.ARCS, SMALL_TOLER) + EgtApproxCurve( vClosedId[i], GDB_CA.ARCS, MID_TOLER) EgtRelocateGlob( vClosedId[i], nLayId) end EgtErase( nGrp) @@ -554,7 +554,7 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) elseif #vClosedId == 1 then local dLen = EgtCurveLength( vClosedId[1]) local _, _, dArea = EgtCurveArea( vClosedId[1]) - if not dArea or dArea / dLen < SMALL_TOLER then bErr = false end + if not dArea or dArea / dLen < MID_TOLER then bErr = false end end -- cambio nome al layer EgtSetName( nLayId, '__' .. SLICE_LAYER .. EgtNumToString( nLayCnt)) From 217bb4f26eb9a4473fa1b2585cc69e943f0b7b07 Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 14 Oct 2022 10:55:20 +0200 Subject: [PATCH 20/79] 3dPrinting : - aggiunti coasting e wipe sui setti che non arrivano al bordo. --- LuaLibs/CalcToolPath.lua | 81 +++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 38 deletions(-) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 8de55bb..1a8a371 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -156,7 +156,7 @@ local function AddLeadIn( nCrvId, LayerParams, nGrpId) EgtInvertCurve( nLeadInCrv) end - if nLeadIn then + if nLeadInCrv then EgtRelocate( nLeadInCrv, nGrpId, GDB_IN.FIRST_SON) EgtModifyCurveExtrusion( nLeadInCrv, LayerParams.vtSlicing, GDB_RT.GLOB) EgtSetInfo( nLeadInCrv, KEY_TYPE, TYPE.LINK) @@ -196,7 +196,7 @@ local function AddLeadOut( nCrvId, LayerParams, nGrpId) end -------------------------------------------------------------------- -local function AddRetraction( nCrvId, LayerParams, dCoastingLen, dWipeLen, dWipeDir) +local function AddRetraction( nCrvId, vtSlicing, dTDiam, dCoastingLen, dWipeLen, dWipeDir) -- recupero i parametri per retrazione local nType = EgtGetInfo( nCrvId, KEY_TYPE, 'i') @@ -224,7 +224,7 @@ local function AddRetraction( nCrvId, LayerParams, dCoastingLen, dWipeLen, dWipe else EgtErase( nCrvId) end - EgtModifyCurveExtrusion( nCoastingId, LayerParams.vtSlicing) + EgtModifyCurveExtrusion( nCoastingId, vtSlicing) EgtSetName( nCoastingId, COASTING_CRV) EgtSetInfo( nCoastingId, KEY_TYPE, TYPE.COASTING) EgtSetColor( nCoastingId, EgtStdColor('ORANGE')) @@ -239,7 +239,7 @@ local function AddRetraction( nCrvId, LayerParams, dCoastingLen, dWipeLen, dWipe EgtTrimCurveEndAtLen( nWipeId, dWipeLen) else - -- se extra shell, infill a zigzag o spiral vase + -- se extra shell, infill a zigzag, spiral vase o rib che non termina sulla parete local vtDir = EgtEV( nCoastingId or nCrvId) local dAng = dWipeDir + s_nDefaultWipeAng -- verifico se necessario cambiare il segno all'angolo @@ -251,20 +251,20 @@ local function AddRetraction( nCrvId, LayerParams, dCoastingLen, dWipeLen, dWipe else bChangeSign = bInverted end - vtDir:rotate( LayerParams.vtSlicing, EgtIf( bChangeSign, - dAng, dAng)) + vtDir:rotate( vtSlicing, EgtIf( bChangeSign, - dAng, dAng)) local ptS = EgtEP( nCoastingId or nCrvId) local ptE = ptS + vtDir * dWipeLen -- verifico soddisfi altezza minima per dimensioni utensile - local dHMin = 0.5 * LayerParams.dTDiam * sqrt( LayerParams.vtSlicing:getX() * LayerParams.vtSlicing:getX() + LayerParams.vtSlicing:getY() * LayerParams.vtSlicing:getY()) + local dHMin = 0.5 * dTDiam * sqrt( vtSlicing:getX() * vtSlicing:getX() + vtSlicing:getY() * vtSlicing:getY()) local k = 1 while ptE:getZ() < dHMin + GEO.EPS_SMALL and k < 36 do - vtDir:rotate( LayerParams.vtSlicing, EgtIf( bChangeSign, 10, -10)) + vtDir:rotate( vtSlicing, EgtIf( bChangeSign, 10, -10)) ptE = ptS + vtDir * dWipeLen k = k + 1 end nWipeId = EgtCurveCompoFromPoints( EgtGetParent( nCrvId), {ptS, ptE}) - EgtModifyCurveExtrusion( nWipeId, LayerParams.vtSlicing, GDB_RT.GLOB) + EgtModifyCurveExtrusion( nWipeId, vtSlicing, GDB_RT.GLOB) EgtRelocateGlob( nWipeId, nCoastingId or nCrvId, GDB_IN.AFTER) end @@ -281,21 +281,21 @@ end local function AddRetractionOnLastCrv( nCrvId, nTpathGrpId, LayerParams, dCoastingLen, dWipeLen, dWipeDir) if LayerParams.nLeadOutType == LEAD_TYPE.NONE then - AddRetraction( nCrvId, LayerParams, dCoastingLen, dWipeLen, dWipeDir) + AddRetraction( nCrvId, LayerParams.vtSlicing, LayerParams.dTDiam, dCoastingLen, dWipeLen, dWipeDir) else local nLeadOutId = EgtGetLastInGroup( nTpathGrpId) local dLen = EgtCurveLength( nLeadOutId) if dLen > dCoastingLen - 500 * GEO.EPS_SMALL then -- coinvolge solo la curva di lead out local dNewCoastingLen = EgtIf( abs( dCoastingLen - dLen) < 500 * GEO.EPS_SMALL, dLen, dCoastingLen) -- verifico se interamente coinvolta - AddRetraction( nLeadOutId, LayerParams, dNewCoastingLen, dWipeLen, dWipeDir) + AddRetraction( nLeadOutId, LayerParams.vtSlicing, LayerParams.dTDiam, dNewCoastingLen, dWipeLen, dWipeDir) else -- coinvolge parte dell'ultima shell crv local dNewCoastingLen = dCoastingLen - dLen - local nCoastingId = AddRetraction( nCrvId, LayerParams, dNewCoastingLen, 0.0, dWipeDir) + local nCoastingId = AddRetraction( nCrvId, LayerParams.vtSlicing, LayerParams.dTDiam, dNewCoastingLen, 0.0, dWipeDir) EgtAddCurveCompoCurve( nCoastingId, nLeadOutId) -- wipe - AddRetraction( nCoastingId, LayerParams, 0, dWipeLen, dWipeDir) + AddRetraction( nCoastingId, LayerParams.vtSlicing, LayerParams.dTDiam, 0, dWipeLen, dWipeDir) end end end @@ -674,35 +674,40 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, d vtE = EgtEV( nCoasting) end EgtErase( nCrvRef) - end - - -- terzo tratto ( diretto verso esterno con ugello chiuso) - if dRibsLOWipe > GEO.EPS_SMALL then - local dAng = dRibsLOWipeAng + s_nDefaultWipeAng - vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng)) - local ptFinal = ptE + vtE * dRibsLOWipe - -- verifico soddisfi altezza minima per dimensioni utensile - local dHMin = 0.5 * dTDiam * sqrt( vtSlicing:getX() * vtSlicing:getX() + vtSlicing:getY() * vtSlicing:getY()) - local k = 1 - while ptFinal:getZ() < dHMin + GEO.EPS_SMALL and k < 36 do - vtE:rotate( vtSlicing, EgtIf( bInvert, - 10, 10)) - ptFinal = ptE + vtE * dRibsLOWipe - k = k + 1 - end - nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}) - EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB) - EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER) - EgtSetName( nWipe, WIPE_CRV) - EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE) - EgtSetColor( nWipe, EgtStdColor('AQUA')) + -- terzo tratto ( diretto verso esterno con ugello chiuso) + if dRibsLOWipe > GEO.EPS_SMALL then + local dAng = dRibsLOWipeAng + s_nDefaultWipeAng + vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng)) + local ptFinal = ptE + vtE * dRibsLOWipe + -- verifico soddisfi altezza minima per dimensioni utensile + local dHMin = 0.5 * dTDiam * sqrt( vtSlicing:getX() * vtSlicing:getX() + vtSlicing:getY() * vtSlicing:getY()) + local k = 1 + while ptFinal:getZ() < dHMin + GEO.EPS_SMALL and k < 36 do + vtE:rotate( vtSlicing, EgtIf( bInvert, - 10, 10)) + ptFinal = ptE + vtE * dRibsLOWipe + k = k + 1 + end + + nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}) + EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB) + EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER) + EgtSetName( nWipe, WIPE_CRV) + EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE) + EgtSetColor( nWipe, EgtStdColor('AQUA')) + end + else + -- aggiungo coasting e wipe come sulle shell normali + AddRetraction( nCrv, vtSlicing, dTDiam, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) end - return end nCrvOffs = EgtGetNext( nCrvOffs) end + + -- se non ho trovato curva sul bordo su cui fare il lead out aggiungo coasting e wipe come sulle shell normali + AddRetraction( nCrv, vtSlicing, dTDiam, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) end @@ -891,7 +896,7 @@ local function CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGr local nNextId = EgtGetNext( vNewEntIds[i]) or GDB_ID.NULL local nType = EgtGetInfo( nNextId, KEY_TYPE, 'i') if nType ~= TYPE.LINK then - AddRetraction( vNewEntIds[i], LayerParams, dCoastingLen, dWipeLen, dWipeDir) + AddRetraction( vNewEntIds[i], LayerParams.vtSlicing, LayerParams.dTDiam, dCoastingLen, dWipeLen, dWipeDir) end end end @@ -913,7 +918,7 @@ local function AddSpiralVaseLeadOut( nOldId, LayerParams) end AddRetractionOnLastCrv( nOldId, EgtGetParent( nOldId), LayerParams, LayerParams.dCoastingLen, LayerParams.dWipeLen, LayerParams.dWipeDir) else - AddRetraction( nOldId, LayerParams, LayerParams.dCoastingLen, LayerParams.dWipeLen, LayerParams.dWipeDir) + AddRetraction( nOldId, LayerParams.vtSlicing, LayerParams.dTDiam, LayerParams.dCoastingLen, LayerParams.dWipeLen, LayerParams.dWipeDir) end end @@ -1166,9 +1171,9 @@ function CalcToolPath.Exec( nPartId) if EgtGetInfo( nNextId, KEY_TYPE, 'i') ~= TYPE.LINK then -- aggiungo retrazione if nId == nFirstId then - AddRetraction( nId, LayerParams, dCoastingLen, EgtIf( LayerParams.nLeadInType == LEAD_TYPE.NONE, dWipeLen, 0), dWipeDir) + AddRetraction( nId, LayerParams.vtSlicing, LayerParams.dTDiam, dCoastingLen, EgtIf( LayerParams.nLeadInType == LEAD_TYPE.NONE, dWipeLen, 0), dWipeDir) else - AddRetraction( nId, LayerParams, dCoastingLen, dWipeLen, dWipeDir) + AddRetraction( nId, LayerParams.vtSlicing, LayerParams.dTDiam, dCoastingLen, dWipeLen, dWipeDir) end end end From d875e314913b33794eeb6cacb157fcbb7283ec98 Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 20 Oct 2022 17:23:48 +0200 Subject: [PATCH 21/79] =?UTF-8?q?3dPrinting=20:=20-=20slicing=20a=2090?= =?UTF-8?q?=C2=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LuaLibs/AddManData.lua | 7 +++ LuaLibs/CalcPaths.lua | 52 ++++++++++---------- LuaLibs/CalcSlices.lua | 18 ++++--- LuaLibs/CalcToolPath.lua | 99 +++++++++++++++++++++++---------------- LuaLibs/RunCalcSolids.lua | 2 +- LuaLibs/RunSlicing.lua | 11 ++++- 6 files changed, 113 insertions(+), 76 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index fa21986..2c68cb1 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -39,6 +39,7 @@ KEY_PARAMS = "Params" KEY_CALC_SOLIDS = "CalcSolids" KEY_SPIRAL_VASE = "SpiralVase" KEY_SLICING_45 = "Slicing45" +KEY_SLICING_TYPE = "SlicingType" KEY_SLICING_DIR="SlicingDir" KEY_SLICE_STEP = "StrandH" KEY_SHELLS_NBR = "StrandCount" @@ -133,6 +134,12 @@ KEY_CLOSED_CRV = "ClosedCrv" KEY_ASSOCIATED_SURF = "AssociatedSurf" KEY_HAS_SOLIDS = "Solids" +SLICING_TYPE = { + VERTICAL = 1, + HORIZONTAL = 2, + DEG45 = 3, +} + TYPE = { OUTER_SHELL = 1, INNER_SHELL = 2, diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index dbf3aaa..17440d3 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -444,26 +444,17 @@ end -------------------------------------------------------------------- -- Funzione che sistema le intersezioni fra costolature nel caso di 2 passate -local function AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, LayerParams, nOffsGrp, nOrigGrp) - - -- recupero gli offset originali delle due curve - local vOffsOrig1 = EgtGetNameInGroup( nOrigGrp, EgtGetName( nCrv1)) - local vOffsOrig2 = EgtGetNameInGroup( nOrigGrp, EgtGetName( nCrv2)) - +local function AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, LayerParams, nOffsGrp) + -- costruisco le superfici da usare per trim - local nOverlap = EgtGetInfo( nCrv1, KEY_RIBS_OVERLAP, 'i') - local dOffs = LayerParams.dStrand / 2 + ( 1 - nOverlap / 100) * LayerParams.dStrand - - local nRect1 = EgtRectangle3P( nOffsGrp, EgtSP( vOffsOrig1[1]), EgtEP( vOffsOrig1[2]), EgtEP( vOffsOrig1[1])) - local nSrf1 = EgtSurfFlatRegion( nOffsGrp, {nRect1}) - local vtN1 = EgtSurfFrNormVersor( nSrf1, GDB_ID.ROOT) + local nSrf1 = EgtSurfFrFatCurve( nOffsGrp, nCrv1, LayerParams.dStrand / 2, false) + local vtN1 = EgtSurfFrNormVersor( nSrf1, GDB_ID.ROOT) if LayerParams.vtSlicing * vtN1 < 0 then EgtInvertSurf( nSrf1) end - - local nRect2 = EgtRectangle3P( nOffsGrp, EgtSP( vOffsOrig2[1]), EgtEP( vOffsOrig2[2]), EgtEP( vOffsOrig2[1])) - local nSrf2 = EgtSurfFlatRegion( nOffsGrp, {nRect2}) - local vtN2 = EgtSurfFrNormVersor( nSrf2, GDB_ID.ROOT) + + local nSrf2 = EgtSurfFrFatCurve( nOffsGrp, nCrv2, LayerParams.dStrand / 2, false) + local vtN2 = EgtSurfFrNormVersor( nSrf2, GDB_ID.ROOT) if LayerParams.vtSlicing * vtN2 < 0 then EgtInvertSurf( nSrf2) end @@ -481,9 +472,7 @@ local function AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, LayerParams end EgtErase( nSrf1) - EgtErase( nRect1) EgtErase( nSrf2) - EgtErase( nRect2) end @@ -497,14 +486,22 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa EgtCopyGlob( vOffsRib[i], nRibsPathGrp) end + -- copio i setti in un gruppo con frame locale per calcolare le intersezioni + local frLoc = Frame3d( ORIG(), LayerParams.vtSlicing) + local nGrpTmp = EgtGroup( nRibsGrp, frLoc) + local vOrigRibsIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') + local vRibsIds = {} + for i = 1, #vOrigRibsIds do + table.insert( vRibsIds, EgtCopyGlob( vOrigRibsIds[i], nGrpTmp)) + end + -- calcolo la regione nella quale ha senso considerare l'intersezione local nSrf = EgtGetFirstNameInGroup( nCrvGrp, TOT_SHELL_TRIM_SURF) - local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrf, nCrvGrp, 2 * LayerParams.dStrand) + local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrf, nCrvGrp, 2 * LayerParams.dStrand) if not bOk or not bExists then nSrfOffs = EgtCopyGlob( nSrf, nCrvGrp) end - - local vRibsIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') + local bInters = false local vSplit = {} for i = 1, #vRibsIds do @@ -513,8 +510,8 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa local ptInt = EgtIP( vRibsIds[i], vRibsIds[j], ORIG()) if ptInt then - -- verifico se l'interserzione si trova nella regione dello slice - local nPtId = EgtPoint( nRibsPathGrp, ptInt) + -- verifico se l'interserzione si trova nella regione dello slice + local nPtId = EgtPoint( nGrpTmp, ptInt) if not EgtSurfFrTestExternal( nSrfOffs, nPtId) then bInters = true @@ -523,15 +520,15 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa local _, dParE1 = EgtCurveDomain( vRibsIds[i]) local _, dParE2 = EgtCurveDomain( vRibsIds[j]) - local nCrv1 = vRibsIds[i] -- curva principale che non viene tagliata - local nCrv2 = vRibsIds[j] -- curve secondaria da modificare + local nCrv1 = vOrigRibsIds[i] -- curva principale che non viene tagliata + local nCrv2 = vOrigRibsIds[j] -- curve secondaria da modificare if dPar1 < 10 * GEO.EPS_SMALL or abs( dPar1 - dParE1) < 10 * GEO.EPS_SMALL then nCrv1, nCrv2 = nCrv2, nCrv1 end if bAllTwoStrands then -- nel caso di 2 passate gestione speciale - AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, LayerParams, nRibsPathGrp, nOffsGrp) + AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, LayerParams, nRibsPathGrp) else AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nRibsPathGrp) end @@ -542,6 +539,7 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa end EgtErase( nSrfOffs) + EgtErase( nGrpTmp) return bInters end @@ -906,7 +904,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, nMaxStrand end if not EgtGetFirstNameInGroup( nRibsPathGrp, RIBS_CRV .. '*') then - EgtErase( nRibsPathGrp) + EgtErase( nRibsPathGrp) end nCrvGrp = EgtGetNextName( nCrvGrp, CONTOUR_GRP .. '*') end diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index c8bccc5..336c12f 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -68,7 +68,7 @@ local function AdjustAuxSolids( nSolidsLay) while bInters do bInters = false local nNext = EgtGetNext( nCurr) - while nNext do + while nNext do if EgtGetType( nNext) == GDB_TY.SRF_MESH then -- verifico se le due superfici si intersecano local nFirst = EgtSurfTmSurfTmInters( nCurr, nNext, nGrpTmp) @@ -85,7 +85,7 @@ local function AdjustAuxSolids( nSolidsLay) end nCurr = EgtGetNext( nCurr) end - EgtErase( nGrpTmp) + EgtErase( nGrpTmp) end -------------------------------------------------------------------- @@ -146,7 +146,7 @@ local function GetAuxSolidsParams( nId) AuxSolidsParam[KEY_AUX_SOLIDS_INFILL] = EgtGetInfo( s_nPartId, KEY_AUX_SOLIDS_INFILL, 'i') end - local sPrintOrder = EgtGetInfo( nId, KEY_AUX_SOLIDS_PRINT_ORDER, 's') + local sPrintOrder = EgtGetInfo( nId, KEY_AUX_SOLIDS_PRINT_ORDER, 's') if sPrintOrder then -- se parametro specifico per il solido if sPrintOrder == 'OutToIn' then @@ -159,7 +159,7 @@ local function GetAuxSolidsParams( nId) AuxSolidsParam[KEY_AUX_SOLIDS_PRINT_ORDER] = EgtGetInfo( s_nPartId, KEY_AUX_SOLIDS_PRINT_ORDER, 'i') end - local sLinkType = EgtGetInfo( nId, KEY_AUX_SOLIDS_LINK_TYPE, 's') + local sLinkType = EgtGetInfo( nId, KEY_AUX_SOLIDS_LINK_TYPE, 's') if sLinkType then -- se parametro specifico per il solido if sLinkType == 'None' then @@ -307,15 +307,19 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) -- recupero la direzione dello slicing local vtSlicing = Z_AX() - local bSlicing45 = EgtGetInfo( s_nPartId, KEY_SLICING_45, 'b') - if bSlicing45 then + local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') + local bSlicing45 = EgtGetInfo( s_nPartId, KEY_SLICING_45, 'b') or false -- da rimuovere + if nSlicingType == SLICING_TYPE.HORIZONTAL then + vtSlicing = X_AX() + elseif nSlicingType == SLICING_TYPE.DEG45 or bSlicing45 then vtSlicing = VectorFromSpherical( 1, 45, 0) end + EgtSetInfo( s_nPartId, KEY_SLICING_DIR, vtSlicing) local frSlicing = Frame3d( ORIG(), vtSlicing) -- recupero il box della superficie - local b3Box = EgtGetBBoxRef( nStmId, GDB_BB.STANDARD, frSlicing) + local b3Box = EgtGetBBoxRef( nStmId, GDB_BB.STANDARD, frSlicing) if not b3Box or b3Box:isEmpty() then EgtOutText( 'La superficie selezionata è vuota') EgtPause( 1000) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 1a8a371..4702d87 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -15,6 +15,7 @@ local AMD = require( 'AddManData') --------------------------------------------------------------------- local s_nPartId local s_nDefaultWipeAng = -90 -- angolo = 0° per wipe significa che esce ortogonalmente alla direzione del movimento +local s_dHMin --------------------------------------------------------------------- local function GetLayerParamsForToolPathCalc() @@ -33,7 +34,7 @@ local function GetLayerParamsForToolPathCalc() LayerParams.nLeadOutType = EgtGetInfo( s_nPartId, KEY_LEAD_OUT_TYPE, 'i') LayerParams.dLeadOutTangDist = EgtGetInfo( s_nPartId, KEY_LEAD_OUT_TANG_DIST, 'd') LayerParams.dLeadOutOrthoDist = EgtGetInfo( s_nPartId, KEY_LEAD_OUT_ORTHO_DIST, 'd') - LayerParams.dOffsetLP = EgtGetInfo( s_nPartId, KEY_OFFSET_LEAD_POINT, 'd') + LayerParams.dOffsetLP = EgtGetInfo( s_nPartId, KEY_OFFSET_LEAD_POINT, 'd') LayerParams.dSPOffs = EgtGetInfo( s_nPartId, KEY_SP_OFFSET_ON_SLICE, 'd') LayerParams.dCoastingLen = EgtGetInfo( s_nPartId, KEY_COASTING_LEN, 'd') LayerParams.dWipeLen = EgtGetInfo( s_nPartId, KEY_WIPE_LEN, 'd') @@ -56,6 +57,8 @@ local function ComputeZCorrection( LayerParams) local vtN = LayerParams.vtSlicing local dNxy = sqrt( vtN:getX() * vtN:getX() + vtN:getY() * vtN:getY()) local dNz = vtN:getZ() + -- altezza necessaria per ugello + s_dHMin = LayerParams.dTDiam / 2 * dNxy -- correzione per l'offset local dCorr1 = LayerParams.dOffs * dNxy -- correzione per il diametro dell'ugello @@ -146,7 +149,7 @@ local function AddLeadIn( nCrvId, LayerParams, nGrpId) vtOrtho:rotate( LayerParams.vtSlicing, dAng) local ptS = ptE - LayerParams.dLeadInTangDist * vtTang + LayerParams.dLeadInOrthoDist * vtOrtho -- verifico che non affondi nella tavola - if ptS:getZ() < GEO.EPS_SMALL then return end + if ptS:getZ() < s_dHMin + GEO.EPS_SMALL then return end local nLeadInCrv if LayerParams.nLeadInType == LEAD_TYPE.LINEAR then @@ -196,7 +199,7 @@ local function AddLeadOut( nCrvId, LayerParams, nGrpId) end -------------------------------------------------------------------- -local function AddRetraction( nCrvId, vtSlicing, dTDiam, dCoastingLen, dWipeLen, dWipeDir) +local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDir) -- recupero i parametri per retrazione local nType = EgtGetInfo( nCrvId, KEY_TYPE, 'i') @@ -255,9 +258,8 @@ local function AddRetraction( nCrvId, vtSlicing, dTDiam, dCoastingLen, dWipeLen, local ptS = EgtEP( nCoastingId or nCrvId) local ptE = ptS + vtDir * dWipeLen -- verifico soddisfi altezza minima per dimensioni utensile - local dHMin = 0.5 * dTDiam * sqrt( vtSlicing:getX() * vtSlicing:getX() + vtSlicing:getY() * vtSlicing:getY()) - local k = 1 - while ptE:getZ() < dHMin + GEO.EPS_SMALL and k < 36 do + local k = 1 + while ptE:getZ() < s_dHMin + GEO.EPS_SMALL and k < 36 do vtDir:rotate( vtSlicing, EgtIf( bChangeSign, 10, -10)) ptE = ptS + vtDir * dWipeLen k = k + 1 @@ -281,27 +283,28 @@ end local function AddRetractionOnLastCrv( nCrvId, nTpathGrpId, LayerParams, dCoastingLen, dWipeLen, dWipeDir) if LayerParams.nLeadOutType == LEAD_TYPE.NONE then - AddRetraction( nCrvId, LayerParams.vtSlicing, LayerParams.dTDiam, dCoastingLen, dWipeLen, dWipeDir) + AddRetraction( nCrvId, LayerParams.vtSlicing, dCoastingLen, dWipeLen, dWipeDir) else local nLeadOutId = EgtGetLastInGroup( nTpathGrpId) local dLen = EgtCurveLength( nLeadOutId) if dLen > dCoastingLen - 500 * GEO.EPS_SMALL then -- coinvolge solo la curva di lead out local dNewCoastingLen = EgtIf( abs( dCoastingLen - dLen) < 500 * GEO.EPS_SMALL, dLen, dCoastingLen) -- verifico se interamente coinvolta - AddRetraction( nLeadOutId, LayerParams.vtSlicing, LayerParams.dTDiam, dNewCoastingLen, dWipeLen, dWipeDir) + AddRetraction( nLeadOutId, LayerParams.vtSlicing, dNewCoastingLen, dWipeLen, dWipeDir) else -- coinvolge parte dell'ultima shell crv local dNewCoastingLen = dCoastingLen - dLen - local nCoastingId = AddRetraction( nCrvId, LayerParams.vtSlicing, LayerParams.dTDiam, dNewCoastingLen, 0.0, dWipeDir) + local nCoastingId = AddRetraction( nCrvId, LayerParams.vtSlicing, dNewCoastingLen, 0.0, dWipeDir) EgtAddCurveCompoCurve( nCoastingId, nLeadOutId) + EgtSetInfo( nCoastingId, KEY_CLOSED_CRV, 0) -- wipe - AddRetraction( nCoastingId, LayerParams.vtSlicing, LayerParams.dTDiam, 0, dWipeLen, dWipeDir) + AddRetraction( nCoastingId, LayerParams.vtSlicing, 0, dWipeLen, dWipeDir) end end end -------------------------------------------------------------------- -local function VerifyRibsLink( nLinkId, nCurr, nNext, dStrand) +local function VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) local nGrp = EgtGetParent( nCurr) @@ -323,9 +326,11 @@ local function VerifyRibsLink( nLinkId, nCurr, nNext, dStrand) -- verifico se il link interseca una delle altre costolature local vRibsIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*') + local nLinkLoc = EgtCopyGlob( nLinkId, nGrpTmp) for i = 1, #vRibsIds do if vRibsIds[i] ~= nCurr and vRibsIds[i] ~= nNext then - local ptInt = EgtIP( nLinkId, vRibsIds[i], ORIG()) + local nCrvLoc = EgtCopyGlob( vRibsIds[i], nGrpTmp) + local ptInt = EgtIP( nLinkLoc, nCrvLoc, ORIG()) if ptInt then return false end @@ -337,7 +342,7 @@ local function VerifyRibsLink( nLinkId, nCurr, nNext, dStrand) end -------------------------------------------------------------------- -local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlicing) +local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlicing, nGrpTmp) local ptS = EgtEP( nCurr) local ptE = EgtSP( nNext) @@ -380,7 +385,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlic EgtSetInfo( nLinkId, KEY_TYPE, TYPE.RIB) if bInvert then EgtInvertCurve( nLinkId) end -- verifico se è valido - local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand) + local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) if not bValid then EgtErase( nLinkId) EgtErase( nCopyId) @@ -404,7 +409,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlic -- se non ho trovato un collegamento sul bordo, creo una linea tra ptS e ptE if bForceLink then local nLinkId = EgtCurveCompoFromPoints( EgtGetParent( nCurr), {ptS, ptE}) - local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand) + local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) if bValid then EgtSetInfo( nLinkId, KEY_TYPE, TYPE.RIB) EgtModifyCurveExtrusion( nLinkId, vtSlicing, GDB_RT.GLOB) @@ -417,7 +422,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlic end -------------------------------------------------------------------- -local function VerifyRibsLead( nId, nRibId, dStrand, bInVsOut) +local function VerifyRibsLead( nId, nRibId, dStrand, bInVsOut, nGrpTmp) local nGrp = EgtGetParent( nRibId) local nLeadId = EgtCopyGlob( nId, nGrp) @@ -461,9 +466,11 @@ local function VerifyRibsLead( nId, nRibId, dStrand, bInVsOut) -- verifico non intersechi altri setti local vRibsIds = EgtGetNameInGroup( EgtGetParent( nRibId), RIBS_CRV .. '*') + local nLeadLoc = EgtCopyGlob( nLeadId, nGrpTmp) for i = 1, #vRibsIds do if vRibsIds[i] ~= nRibId then - local ptInt = EgtIP( nLeadId, vRibsIds[i], ORIG()) + local nCrvLoc = EgtCopyGlob( vRibsIds[i], nGrpTmp) + local ptInt = EgtIP( nLeadLoc, nCrvLoc, ORIG()) if ptInt then EgtErase( nLeadId) return false @@ -504,7 +511,7 @@ local function VerifyRibsLead( nId, nRibId, dStrand, bInVsOut) end ------------------------------------------------------------------- -local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, dStrand, bInVsOut) +local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, dStrand, bInVsOut, nGrpTmp) local nLeadId local bInvert = bLeadInvert -- valore di default è quello settato nel file dei parametri @@ -547,7 +554,7 @@ local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, if bInvert then EgtInvertCurve( nLeadId) end EgtTrimCurveEndAtLen( nLeadId, dLeadLen) if bInVsOut then EgtInvertCurve( nLeadId) end - if VerifyRibsLead( nLeadId, nCrv, dStrand, bInVsOut) then + if VerifyRibsLead( nLeadId, nCrv, dStrand, bInVsOut, nGrpTmp) then -- se valido aggiorno le curve per prossimi lead in/out if bInvert then EgtTrimCurveEndAtLen( nMainCrv, EgtCurveLength( nCrvOffs) - dLeadLen) @@ -565,7 +572,7 @@ local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, if not bInvert then EgtInvertCurve( nLeadId) end EgtTrimCurveEndAtLen( nLeadId, dLeadLen) if bInVsOut then EgtInvertCurve( nLeadId) end - if VerifyRibsLead( nLeadId, nCrv, dStrand, bInVsOut) then + if VerifyRibsLead( nLeadId, nCrv, dStrand, bInVsOut, nGrpTmp) then if bInvert then EgtTrimCurveStartAtLen( nOtherCrv, dLeadLen) else @@ -584,7 +591,7 @@ local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, end -------------------------------------------------------------------- -local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing) +local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp) local dLILen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_LEN, 'd') local bLIInvert = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_INVERT, 'b') @@ -598,7 +605,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing) local dParS = EgtCurveParamAtPoint( nCrvOffs, ptS) if dParS then - local nLeadIn = FindCorrectRibsLead( dParS, nCrv, nCrvOffs, bLIInvert, dLILen, dStrand, true) + local nLeadIn = FindCorrectRibsLead( dParS, nCrv, nCrvOffs, bLIInvert, dLILen, dStrand, true, nGrpTmp) -- se lead in possibile if nLeadIn then EgtModifyCurveExtrusion( nLeadIn, vtSlicing) @@ -613,7 +620,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing) end -------------------------------------------------------------------- -local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, dTDiam) +local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, nGrpTmp) local dRibsLOLen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_LEN, 'd') local dRibsLOCoasting = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_COASTING, 'd') @@ -639,7 +646,7 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, d local nWipe -- trovo curva opportuna per lead out - local nCrvRef, bInvert = FindCorrectRibsLead( dParE, nCrv, nCrvOffs, bRibsLOInvert, dRibsLOLen + dRibsLOCoasting, dStrand, false) + local nCrvRef, bInvert = FindCorrectRibsLead( dParE, nCrv, nCrvOffs, bRibsLOInvert, dRibsLOLen + dRibsLOCoasting, dStrand, false, nGrpTmp) if nCrvRef then -- verifico se la curva ha lunghezza sufficiente @@ -681,9 +688,8 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, d vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng)) local ptFinal = ptE + vtE * dRibsLOWipe -- verifico soddisfi altezza minima per dimensioni utensile - local dHMin = 0.5 * dTDiam * sqrt( vtSlicing:getX() * vtSlicing:getX() + vtSlicing:getY() * vtSlicing:getY()) local k = 1 - while ptFinal:getZ() < dHMin + GEO.EPS_SMALL and k < 36 do + while ptFinal:getZ() < s_dHMin + GEO.EPS_SMALL and k < 36 do vtE:rotate( vtSlicing, EgtIf( bInvert, - 10, 10)) ptFinal = ptE + vtE * dRibsLOWipe k = k + 1 @@ -698,7 +704,7 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, d end else -- aggiungo coasting e wipe come sulle shell normali - AddRetraction( nCrv, vtSlicing, dTDiam, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) + AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) end return end @@ -707,13 +713,17 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, d end -- se non ho trovato curva sul bordo su cui fare il lead out aggiungo coasting e wipe come sulle shell normali - AddRetraction( nCrv, vtSlicing, dTDiam, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) + AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) end --------------------------------------------------------------------- local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) + -- gruppo temporaneo con sistema di riferimento locale per conti + local frLoc = Frame3d( ORIG(), LayerParams.vtSlicing) + local nGrpTmp = EgtGroup( nCrvGrp, frLoc) + local nRibsGrp = EgtGetFirstNameInGroup( nCrvGrp, RIBS_GRP) -- aggiungo le costolature nel toolpath local vEntIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') @@ -803,15 +813,15 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) -- collego le passate di una stessa costolatura for i = 1, #tabRibs do for j = 1, #tabRibs[i] - 1 do - CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, true, LayerParams.vtSlicing) + CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, true, LayerParams.vtSlicing, nGrpTmp) if not bSpecialCase then -- creo link fittizio per eliminare tratto corrispondente sulla curva di offset - local nFakeLink = CalcRibsLink( tabRibs[i][j + 1], tabRibs[i][j], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing) + local nFakeLink = CalcRibsLink( tabRibs[i][j + 1], tabRibs[i][j], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) EgtErase( nFakeLink) end end if bSpecialCase then - local nFakeLink = CalcRibsLink( tabRibs[i][#tabRibs[i]], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing) + local nFakeLink = CalcRibsLink( tabRibs[i][#tabRibs[i]], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) EgtErase( nFakeLink) end end @@ -819,7 +829,7 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) if LayerParams.bRibsLink then for i = 1, #tabRibs - 1 do local nCnt = #tabRibs[i] - CalcRibsLink( tabRibs[i][nCnt], tabRibs[i + 1][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing) + CalcRibsLink( tabRibs[i][nCnt], tabRibs[i + 1][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) end end @@ -829,15 +839,18 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) -- verifico se necessario lead in local nPrev = EgtGetPrev( nCrvRib) if not nPrev or EgtGetName( nPrev) then - AddRibsLeadIn( nCrvRib, nLoopGrp, LayerParams.dStrand, LayerParams.vtSlicing) + AddRibsLeadIn( nCrvRib, nLoopGrp, LayerParams.dStrand, LayerParams.vtSlicing, nGrpTmp) end -- verifico se necessario lead out local nNext = EgtGetNext( nCrvRib) if not nNext or EgtGetName( nNext) then - AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand, LayerParams.dTDiam) + AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand, nGrpTmp) end nCrvRib = EgtGetNextName( nCrvRib, RIBS_CRV .. '*') end + + EgtErase( nGrpTmp) + end --------------------------------------------------------------------- @@ -896,7 +909,7 @@ local function CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGr local nNextId = EgtGetNext( vNewEntIds[i]) or GDB_ID.NULL local nType = EgtGetInfo( nNextId, KEY_TYPE, 'i') if nType ~= TYPE.LINK then - AddRetraction( vNewEntIds[i], LayerParams.vtSlicing, LayerParams.dTDiam, dCoastingLen, dWipeLen, dWipeDir) + AddRetraction( vNewEntIds[i], LayerParams.vtSlicing, dCoastingLen, dWipeLen, dWipeDir) end end end @@ -918,7 +931,7 @@ local function AddSpiralVaseLeadOut( nOldId, LayerParams) end AddRetractionOnLastCrv( nOldId, EgtGetParent( nOldId), LayerParams, LayerParams.dCoastingLen, LayerParams.dWipeLen, LayerParams.dWipeDir) else - AddRetraction( nOldId, LayerParams.vtSlicing, LayerParams.dTDiam, LayerParams.dCoastingLen, LayerParams.dWipeLen, LayerParams.dWipeDir) + AddRetraction( nOldId, LayerParams.vtSlicing, LayerParams.dCoastingLen, LayerParams.dWipeLen, LayerParams.dWipeDir) end end @@ -1042,7 +1055,13 @@ function CalcToolPath.Exec( nPartId) -- se necessario sposto anche il solido di partenza if dCorrZ > 10 * GEO.EPS_SMALL then - local vtMove = Vector3d( 0, 0, dCorrZ) + LayerParams.dLayHeight / 2 * LayerParams.vtSlicing + local vtMove = Vector3d( 0, 0, dCorrZ) + -- se slicing a 45° aggiungo correzione anche in direzione dello slicing + local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') or 1 + local bSlicing45 = EgtGetInfo( s_nPartId, KEY_SLICING_45, 'b') or false -- da rimuovere + if nSlicingType == SLICING_TYPE.DEG45 or bSlicing45 then + vtMove = vtMove + LayerParams.dLayHeight / 2 * LayerParams.vtSlicing + end local SolidLayId = EgtGetFirstNameInGroup( s_nPartId, PRINT_SOLID) if SolidLayId then EgtSetInfo( s_nPartId, KEY_MOVED_PART, vtMove) @@ -1162,7 +1181,7 @@ function CalcToolPath.Exec( nPartId) local bClosed = EgtGetInfo( nId, KEY_CLOSED_CRV, 'b') or false local dCoastingLen = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrCoasting, LayerParams.dCoastingLen) local dWipeLen = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrWipe, LayerParams.dWipeLen) - local dWipeDir = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrWipeDir, 0) + local dWipeDir = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrWipeDir, LayerParams.dWipeDir) if nId == nLastId then AddRetractionOnLastCrv( nId, nTpathGrpId, LayerParams, dCoastingLen, dWipeLen, dWipeDir) @@ -1171,9 +1190,9 @@ function CalcToolPath.Exec( nPartId) if EgtGetInfo( nNextId, KEY_TYPE, 'i') ~= TYPE.LINK then -- aggiungo retrazione if nId == nFirstId then - AddRetraction( nId, LayerParams.vtSlicing, LayerParams.dTDiam, dCoastingLen, EgtIf( LayerParams.nLeadInType == LEAD_TYPE.NONE, dWipeLen, 0), dWipeDir) + AddRetraction( nId, LayerParams.vtSlicing, dCoastingLen, EgtIf( LayerParams.nLeadInType == LEAD_TYPE.NONE, dWipeLen, 0), dWipeDir) else - AddRetraction( nId, LayerParams.vtSlicing, LayerParams.dTDiam, dCoastingLen, dWipeLen, dWipeDir) + AddRetraction( nId, LayerParams.vtSlicing, dCoastingLen, dWipeLen, dWipeDir) end end end diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index 4c37269..1459b84 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -259,7 +259,7 @@ local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams) local bOk = true for nInd = 0, nParts - 1 do local nGuideId = nId + nInd - local nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams, LayerParams.dStrand - 2 * GEO.EPS_SMALL) + local nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams, LayerParams.dStrand - 5 * GEO.EPS_SMALL) if not nSrfId then -- ritento con sezione leggermente modificata diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index d50f48a..ab6baa2 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -38,7 +38,16 @@ local function LoadParams( sFile, nPartId) SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_CALC_SOLIDS, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SPIRAL_VASE, '0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SLICING_45, '0') + + local sSlicingType = EgtGetStringFromIni( SEC_DEFAULT, KEY_SLICING_TYPE, 'Vertical', sFile) + if sSlicingType == 'Horizontal' then + EgtSetInfo( nPartId, KEY_SLICING_TYPE, SLICING_TYPE.HORIZONTAL) + elseif sSlicingType == 'Deg45' then + EgtSetInfo( nPartId, KEY_SLICING_TYPE, SLICING_TYPE.DEG45) + else + EgtSetInfo( nPartId, KEY_SLICING_TYPE, SLICING_TYPE.VERTICAL) + end + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SLICE_STEP, '1.0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_STRAND, '6.0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SHELLS_NBR, '3') From 7ced9ec2f412ed50e366779ab238457308706c6c Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Mon, 24 Oct 2022 12:58:26 +0200 Subject: [PATCH 22/79] - modifiche per assegnazione nome iso da programma --- LuaLibs/RunGcodeGenerate.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/LuaLibs/RunGcodeGenerate.lua b/LuaLibs/RunGcodeGenerate.lua index b019cb6..6d3ead1 100644 --- a/LuaLibs/RunGcodeGenerate.lua +++ b/LuaLibs/RunGcodeGenerate.lua @@ -129,7 +129,11 @@ function RunGcodeGenerate.Exec() -- Genero il programma CN local sInfo = 'EgtCAM5 ver.' .. EgtGetExeVersion() .. ' - ' .. sPath - local bGenOk = EgtGenerate( '', sInfo) + local sISOFilePath = '' + if PRINT and PRINT.PROGRAM == 1 and PRINT.ISOFILEPATH then + sISOFilePath = PRINT.ISOFILEPATH + end + local bGenOk = EgtGenerate( sISOFilePath, sInfo) if bGenOk then EgtEstimate('') end From aa750ff93318be7a0bcfab50eedb50ecc8a71cc6 Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Wed, 26 Oct 2022 12:28:36 +0200 Subject: [PATCH 23/79] - Cambio formule per costante k passata da unitaria in aggiunta a percentuale totale --- LuaLibs/RunMachParamFromSWCalc.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/LuaLibs/RunMachParamFromSWCalc.lua b/LuaLibs/RunMachParamFromSWCalc.lua index f29fc2c..837e76d 100644 --- a/LuaLibs/RunMachParamFromSWCalc.lua +++ b/LuaLibs/RunMachParamFromSWCalc.lua @@ -14,7 +14,7 @@ local AMD = require( 'AddManData') --local MATERIAL = {} --MATERIAL.Name = 'AKROMID® B3 ICF 40' ---MATERIAL.K = 0.1 +--MATERIAL.K = 110 --MATERIAL.C1 = 0.8742 --MATERIAL.C2 = 0.8964 --MATERIAL.Density = 1.31 @@ -132,7 +132,7 @@ function RunMachParamFromSWCalc.Exec() -- calcolo la portata local Vf = dLayerFeed * ( ( dStrand - dSliceStep) * dSliceStep + pi * pow( dSliceStep / 2, 2)) / 1000 -- calcolo speed - local dSpeed = ( 1 + MATERIAL.K) * pow( Vf / MATERIAL.C1, 1 / MATERIAL.C2) + local dSpeed = ( MATERIAL.K / 100.0) * pow( Vf / MATERIAL.C1, 1 / MATERIAL.C2) -- verifico se speed esce da minimo e massimo della macchina local bSpeedOk = true if dSpeed < dSMin then @@ -144,7 +144,7 @@ function RunMachParamFromSWCalc.Exec() dSpeed = dSMax end if not bSpeedOk then - dLayerFeed = ( MATERIAL.C1 * pow( ( dSpeed / ( 1 + MATERIAL.K)), MATERIAL.C2)) * 1000 / ( ( dStrand - dSliceStep) * dSliceStep + pi * pow( dSliceStep / 2, 2)) + dLayerFeed = ( MATERIAL.C1 * pow( ( dSpeed / ( MATERIAL.K / 100.0)), MATERIAL.C2)) * 1000 / ( ( dStrand - dSliceStep) * dSliceStep + pi * pow( dSliceStep / 2, 2)) dLayerTime = dTotLayerLength / dLayerFeed * 60 end -- calcolo massa dello strato From 213e6ac6ed6b433d10dd2009435cf4791ef1111c Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 26 Oct 2022 16:12:25 +0200 Subject: [PATCH 24/79] 3dPrinting : - aggiunte tipologie per ribs ( interni, esterni, illimitati) - migliorie per ordinamento ribs. --- LuaLibs/AddManData.lua | 9 +- LuaLibs/CalcPaths.lua | 483 ++++++++++++++++++++++++++++----------- LuaLibs/CalcSlices.lua | 61 +---- LuaLibs/CalcToolPath.lua | 43 ++-- LuaLibs/RunSlicing.lua | 9 + 5 files changed, 397 insertions(+), 208 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 2c68cb1..8f3134b 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -38,7 +38,6 @@ SEC_DEFAULT = "Default" KEY_PARAMS = "Params" KEY_CALC_SOLIDS = "CalcSolids" KEY_SPIRAL_VASE = "SpiralVase" -KEY_SLICING_45 = "Slicing45" KEY_SLICING_TYPE = "SlicingType" KEY_SLICING_DIR="SlicingDir" KEY_SLICE_STEP = "StrandH" @@ -82,6 +81,7 @@ KEY_WIPE_FEEDPU = "WipeFeedPu" KEY_TOOL_DIAM = "ToolDiam" -- Ribs +KEY_RIBS_TYPE = "RibsType" KEY_RIBS_OVERLAP = "RibsOverlap" KEY_RIBS_SHELLS_NBR = "RibsStrandCount" KEY_RIBS_LINK = "RibsLink" @@ -95,6 +95,7 @@ KEY_RIBS_LEAD_OUT_COASTING = "RibsLeadOutCoasting" KEY_RIBS_LEAD_OUT_WIPE = "RibsLeadOutWipe" KEY_RIBS_LEAD_OUT_WIPE_DIR = "RibsLeadOutWipeDir" KEY_RIBS_INTERS = "RibsHaveIntersections" +KEY_SPLIT_ORDER = "SplitOrder" KEY_SPLIT_RIB = "SplitRib" KEY_RIBS_TWO_STRANDS = "RibsHaveAll2Strands" @@ -181,6 +182,12 @@ INFILL_TYPE = { ZIGZAG = 3, } +RIB_TYPE = { + INTERNAL = 1, + EXTERNAL = 2, + UNBOUNDED = 3, +} + --------------------------------------------------------------------- TABLE = "Table" PART = "Part" diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 17440d3..5948265 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -43,15 +43,21 @@ local function GetLayerParamsForPathCalc() return LayerParams end +-------------------------------------------------------------------------------------------- +local function CopyInfo( nSouId, nDestId, sInfo, sType) + local info = EgtGetInfo( nSouId, sInfo, sType) + EgtSetInfo( nDestId, sInfo, info) +end + ---------------------------------------------------------------------- local function ComputeSurfOffset( nSrf, nGrpId, dOffs) - local nCopySrf = EgtCopy( nSrf, nGrpId) + local nCopySrf = EgtCopy( nSrf, nGrpId) or GDB_ID.NULL local bOk = EgtSurfFrOffset( nCopySrf, dOffs) local bExists = EgtSurfFrChunkCount( nCopySrf) > 0 if not bOk or not bExists then EgtErase( nCopySrf) - nCopySrf = EgtCopyGlob( nSrf, nGrpId) + nCopySrf = EgtCopyGlob( nSrf, nGrpId) or GDB_ID.NULL bOk = EgtSurfFrOffset( nCopySrf, dOffs + 0.05) bExists = EgtSurfFrChunkCount( nCopySrf) > 0 end @@ -339,7 +345,7 @@ local function ComputeOffsetInfill( nSrf, dStrand, vtSlicing, sName, nType, vPtS EgtErase( nSrfOffs) -- offset successivo dOffs = dOffs - dStrand - bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrf, nGrp, dOffs) + bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrf, nGrp, dOffs) end end @@ -416,6 +422,59 @@ end ------------------------------------------------------------------- --------------------------- RIBS ----------------------------------- -------------------------------------------------------------------- +local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOffs, dStrand, nGrp) + + -- per ogni tipologia e overlap creo le superfici con cui fare i trim + local tSurfOffs = {{}, {}, {}} + for i = 1, #vIds do + local nOverlap = EgtGetInfo( vIds[i], KEY_RIBS_OVERLAP, 'i') + local nType = EgtGetInfo( vIds[i], KEY_RIBS_TYPE, 'i') + if not tSurfOffs[nType][nOverlap] then + if nType == RIB_TYPE.INTERNAL then + if nSrfBase then + local dNewOffs = nOverlap / 100 * dStrand + local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfBase, nGrp, dNewOffs) + if bOk then + tSurfOffs[nType][nOverlap] = nSrfOffs + end + end + elseif nType == RIB_TYPE.EXTERNAL then + if nSrfExt then + local dNewOffs = dOffs + ( 0.5 - nOverlap / 100) * dStrand + local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfExt, nGrp, dNewOffs) + if bOk then + tSurfOffs[nType][nOverlap] = nSrfOffs + EgtSetName( nSrfOffs, TOT_SHELL_TRIM_SURF) + end + end + else + tSurfOffs[nType][nOverlap] = GDB_ID.NULL + end + end + end + return tSurfOffs +end + +-------------------------------------------------------------------- +local function VerifyRibsIntersection( ptInt, nType1, nType2, nSrf1, nSrf2, nGrp) + + local bValid = false + local nPtId = EgtPoint( nGrp, ptInt) + + if nType1 == RIB_TYPE.INTERNAL or nType2 == RIB_TYPE.INTERNAL then + -- l'intersezione deve essere interna + if nSrf1 and not EgtSurfFrTestExternal( nSrf1, nPtId) then bValid = true end + elseif nType1 == RIB_TYPE.EXTERNAL or nType2 == RIB_TYPE.EXTERNAL then + -- l'intersezione deve essere esterna + if nSrf2 and EgtSurfFrTestExternal( nSrf2, nPtId) then bValid = true end + else + bValid = true + end + + return bValid +end + +--------------------------------------------------------------------------------- -- Funzione che sistema le intersezioni fra costolature nel caso generico local function AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nOffsGrp) @@ -426,15 +485,18 @@ local function AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nOffs local nOverlap = min( nOverlap1, nOverlap2) local dOffs = ( nShells - 1) * LayerParams.dStrand / 2 local nSrf = EgtSurfFrFatCurve( nOffsGrp, nCrv1, dOffs + ( 1 - nOverlap / 100) * LayerParams.dStrand, false) - - -- recupero gli offset della curva secondaria ( nCrv2) + if not nSrf then return end + + -- trim degli offset della curva secondaria ( nCrv2) local vOffs2 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv2)) - -- trim degli offset della curva secondaria for i = 1, #vOffs2 do local nId, nCnt = EgtTrimCurveWithRegion( vOffs2[i], nSrf, false, true) EgtChangeId( nId, vOffs2[i]) + -- aggiorno ordine di split copiandolo da nCrv2 + CopyInfo( nCrv2, vOffs2[i], KEY_SPLIT_ORDER, 'i') if nCnt > 1 then - EgtSetInfo( nId + 1, KEY_SPLIT_RIB, vOffs2[i]) + EgtSetInfo( nId + 1, KEY_SPLIT_RIB, vOffs2[i]) -- curva da cui deriva + CopyInfo( nCrv2, nId + 1, KEY_SPLIT_ORDER, 'i') -- ordine di split EgtRelocateGlob( nId + 1, nOffsGrp, GDB_IN.LAST_SON) end end @@ -476,6 +538,30 @@ local function AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, LayerParams end +------------------------------------------------------------------ +local function UpdateSplitOrder( nCrv, tInters, nOffsGrp) + local nOrder = EgtGetInfo( nCrv, KEY_SPLIT_ORDER, 'i') or 0 + local nNewOrder = nOrder + 1 + + -- aggiorno tutte le curve che dipendono da nCrv + if tInters[nCrv] then + for i = 1, #tInters[nCrv] do + local nOldOrder = EgtGetInfo( tInters[nCrv][i], KEY_SPLIT_ORDER, 'i') + if nOldOrder < nNewOrder then + EgtSetInfo( tInters[nCrv][i], KEY_SPLIT_ORDER, nNewOrder) + -- aggiorno i suoi offset + local vOffs = EgtGetNameInGroup( nOffsGrp, EgtGetName( tInters[nCrv][i])) + for j = 1, #vOffs do + EgtSetInfo( vOffs[j], KEY_SPLIT_ORDER, nNewOrder) + end + -- aggiorno eventuali dipendenze + UpdateSplitOrder( tInters[nCrv][i], tInters, nOffsGrp) + end + end + end + +end + -------------------------------------------------------------------- local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands) @@ -495,45 +581,85 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa table.insert( vRibsIds, EgtCopyGlob( vOrigRibsIds[i], nGrpTmp)) end - -- calcolo la regione nella quale ha senso considerare l'intersezione - local nSrf = EgtGetFirstNameInGroup( nCrvGrp, TOT_SHELL_TRIM_SURF) - local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrf, nCrvGrp, 2 * LayerParams.dStrand) - if not bOk or not bExists then - nSrfOffs = EgtCopyGlob( nSrf, nCrvGrp) + -- calcolo le regioni nella quali ha senso considerare l'intersezione + local nSrfOffs1, nSrfOffs2 + local bOk, bExists + local nSrf1 = EgtGetFirstNameInGroup( nCrvGrp, TOT_SHELL_TRIM_SURF) + if nSrf1 then + bOk, bExists, nSrfOffs1 = ComputeSurfOffset( nSrf1, nCrvGrp, 2 * LayerParams.dStrand) + if not bOk or not bExists then + nSrfOffs1 = EgtCopyGlob( nSrf1, nCrvGrp) + end end - + local nSrf2 = EgtGetFirstNameInGroup( nCrvGrp, LAYER_SRF) + if nSrf2 then + bOk, bExists, nSrfOffs2 = ComputeSurfOffset( nSrf2, nCrvGrp, - 2 * LayerParams.dStrand) + if not bOk or not bExists then + nSrfOffs2 = EgtCopyGlob( nSrf2, nCrvGrp) + end + end + local bInters = false local vSplit = {} + local tInters = {} -- tabella che tiene traccia delle intersezioni trovate for i = 1, #vRibsIds do + + local nType1 = EgtGetInfo( vRibsIds[i], KEY_RIBS_TYPE, 'i') -- verifico se interseca uno dei setti successivi for j = i + 1, #vRibsIds do - local ptInt = EgtIP( vRibsIds[i], vRibsIds[j], ORIG()) - if ptInt then + -- verifico se i due setti possono intersecarsi in base alla loro tipologia + local nType2 = EgtGetInfo( vRibsIds[j], KEY_RIBS_TYPE, 'i') + if not ( ( nType1 == RIB_TYPE.INTERNAL and nType2 == RIB_TYPE.EXTERNAL) or ( nType1 == RIB_TYPE.EXTERNAL and nType2 == RIB_TYPE.INTERNAL)) then - -- verifico se l'interserzione si trova nella regione dello slice - local nPtId = EgtPoint( nGrpTmp, ptInt) - if not EgtSurfFrTestExternal( nSrfOffs, nPtId) then - bInters = true + local ptInt = EgtIP( vRibsIds[i], vRibsIds[j], ORIG()) + if ptInt then - local dPar1 = EgtCurveParamAtPoint( vRibsIds[i], ptInt) - local dPar2 = EgtCurveParamAtPoint( vRibsIds[j], ptInt) - local _, dParE1 = EgtCurveDomain( vRibsIds[i]) - local _, dParE2 = EgtCurveDomain( vRibsIds[j]) - - local nCrv1 = vOrigRibsIds[i] -- curva principale che non viene tagliata - local nCrv2 = vOrigRibsIds[j] -- curve secondaria da modificare - if dPar1 < 10 * GEO.EPS_SMALL or abs( dPar1 - dParE1) < 10 * GEO.EPS_SMALL then - nCrv1, nCrv2 = nCrv2, nCrv1 - end - - if bAllTwoStrands then - -- nel caso di 2 passate gestione speciale - AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, LayerParams, nRibsPathGrp) - else - AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nRibsPathGrp) + -- verifico se l'interserzione è valida + if VerifyRibsIntersection( ptInt, nType1, nType2, nSrfOffs1, nSrfOffs2, nGrpTmp) then + bInters = true + + local dPar1 = EgtCurveParamAtPoint( vRibsIds[i], ptInt) + local dPar2 = EgtCurveParamAtPoint( vRibsIds[j], ptInt) + local _, dParE1 = EgtCurveDomain( vRibsIds[i]) + local _, dParE2 = EgtCurveDomain( vRibsIds[j]) + + local nCrv1 = vOrigRibsIds[i] -- curva principale che non viene tagliata + local nCrv2 = vOrigRibsIds[j] -- curve secondaria da modificare + local nSplitOrder1 = EgtGetInfo( nCrv1, KEY_SPLIT_ORDER, 'i') or 0 + local nSplitOrder2 = EgtGetInfo( nCrv2, KEY_SPLIT_ORDER, 'i') or 0 + if dPar1 < 10 * GEO.EPS_SMALL or abs( dPar1 - dParE1) < 10 * GEO.EPS_SMALL then + nCrv1, nCrv2 = nCrv2, nCrv1 + nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 + else + -- prediligo setto già splittato più volte + if nSplitOrder1 > nSplitOrder2 then + nCrv1, nCrv2 = nCrv2, nCrv1 + nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 + end + end + + -- aggiorno tabella delle intersezioni + if tInters[nCrv1] then + table.insert( tInters[nCrv1], nCrv2) + else + tInters[nCrv1] = {nCrv2} + end + + -- aggiorno ordine di split + if nSplitOrder2 < nSplitOrder1 + 1 then + EgtSetInfo( nCrv2, KEY_SPLIT_ORDER, nSplitOrder1 + 1) + UpdateSplitOrder( nCrv2, tInters, nRibsPathGrp) + end + + if bAllTwoStrands then + -- nel caso di 2 passate gestione speciale + AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, LayerParams, nRibsPathGrp) + else + AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nRibsPathGrp) + end end + EgtErase( nPtId) end - EgtErase( nPtId) end end end @@ -545,37 +671,80 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa end -------------------------------------------------------------------- +local function ShortestPathForRibs( vIds, nGrp, bInvertOrder) + + if not vIds or #vIds == 0 then return end + + -- se solo un setto ordinamento banale + if #vIds == 1 then + EgtRelocateGlob( vIds[1], nGrp, GDB_IN.LAST_SON) + return + elseif #vIds == 2 then + EgtRelocateGlob( vIds[1], nGrp, GDB_IN.LAST_SON) + EgtRelocateGlob( vIds[2], vIds[1], EgtIf( bInvertOrder, GDB_IN.BEFORE, GDB_IN.AFTER)) + return + else + -- se più setti ordinamento con shortest path + EgtSpInit() + for i = 1, #vIds do + local pt = EgtMP( vIds[i], GDB_RT.GLOB) + EgtSpAddPoint( pt:getX(), pt:getY(), pt:getZ(), 0, 0, pt:getX(), pt:getY(), pt:getZ(), 0, 0) + end + local vOrd, dLen = EgtSpCalculate( SHP_TY.OPEN) + EgtSpTerminate() + + EgtRelocateGlob( vIds[vOrd[1]], nGrp, GDB_IN.LAST_SON) + for i = 2, #vOrd do + EgtRelocateGlob( vIds[vOrd[i]], vIds[vOrd[i-1]], EgtIf( bInvertOrder, GDB_IN.BEFORE, GDB_IN.AFTER)) + end + end +end + +--------------------------------------------------------------------- -- Funzione che riordina le costolature nel caso generico local function ReorderRibs( nGrp, bInvertOrder, dStrand, nMaxNbr) - EgtSpInit() + -- raggruppo per tipologia + local tRibs = {{}, {}, {}} local vIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*') if not vIds or #vIds == 0 then return end - - local vSplitRibs = {} - local vSPRibs = {} for i = 1, #vIds do - local nInfo = EgtGetInfo( vIds[i], KEY_SPLIT_RIB, 'i') - local nShells = EgtGetInfo( vIds[i], KEY_RIBS_SHELLS_NBR, 'i') - -- se è ottenuto dalla divisione di una costolatura non va considerato per il TSP ( viene aggiunto in seguito) - if nInfo and nShells == 1 then - table.insert( vSplitRibs, vIds[i]) - else - local pt = EgtMP( vIds[i], GDB_RT.GLOB) - EgtSpAddPoint( pt:getX(), pt:getY(), pt:getZ(), 0, 0, pt:getX(), pt:getY(), pt:getZ(), 0, 0) - table.insert( vSPRibs, vIds[i]) - end + local nType = EgtGetInfo( vIds[i], KEY_RIBS_TYPE, 'i') + table.insert( tRibs[nType], vIds[i]) end - local vOrd, dLen = EgtSpCalculate( SHP_TY.OPEN) - EgtSpTerminate() - EgtRelocateGlob( vSPRibs[vOrd[1]], nGrp, EgtIf( bInvertOrder, GDB_IN.LAST, GDB_IN.FIRST)) - for i = 2, #vOrd do - EgtRelocateGlob( vSPRibs[vOrd[i]], vSPRibs[vOrd[i-1]], EgtIf( bInvertOrder, GDB_IN.BEFORE, GDB_IN.AFTER)) + -- riordino ogni tipologia con shortest path + local vSplitRibs = {} + for i = 1, 3 do + local tSplitOrder = {} + local nMax = 0 + -- suddivido i ribs in base allo SplitOrder + for j = 1, #tRibs[i] do + local nInfoSplit = EgtGetInfo( tRibs[i][j], KEY_SPLIT_RIB, 'i') + local nShells = EgtGetInfo( tRibs[i][j], KEY_RIBS_SHELLS_NBR, 'i') + if nInfoSplit and nShells == 1 then + -- se è ottenuto dalla divisione di una costolatura + table.insert( vSplitRibs, tRibs[i][j]) + else + -- classifico in base all'ordine di split + local nSplitOrder = EgtGetInfo( tRibs[i][j], KEY_SPLIT_ORDER, 'i') or 0 + if nSplitOrder > nMax then nMax = nSplitOrder end + if tSplitOrder[nSplitOrder] then + table.insert( tSplitOrder[nSplitOrder], tRibs[i][j]) + else + tSplitOrder[nSplitOrder] = {tRibs[i][j]} + end + end + end + + -- riordino ogni ordine di split + for i = 0, nMax do + ShortestPathForRibs( tSplitOrder[i], nGrp, bInvertOrder) + end end -- sistemo nomi - local kMax = nMaxNbr + 1 + local kMax = nMaxNbr + 1 local dTol = 500 * GEO.EPS_SMALL for i = 1, nMaxNbr do local vIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. tostring(i)) or {} @@ -593,29 +762,26 @@ local function ReorderRibs( nGrp, bInvertOrder, dStrand, nMaxNbr) kMax = kMax + 1 end end - end + end -- aggiusto tutte le costolature divise - local tabSplitted = {} for i = 1, #vSplitRibs do local nPrevId = EgtGetInfo( vSplitRibs[i], KEY_SPLIT_RIB, 'i') local bInverted = EgtGetInfo( vSplitRibs[i], KEY_INVERTED_CRV, 'b') or false -- aggiungo come successiva alla costolatura da cui si è generata EgtRelocateGlob( vSplitRibs[i], nPrevId, EgtIf( bInverted, GDB_IN.BEFORE, GDB_IN.AFTER)) + -- se necessario rinomino + if EgtGetName( vSplitRibs[i]) == EgtGetName(nPrevId) then + EgtSetName( vSplitRibs[i], RIBS_CRV .. tostring( kMax)) + kMax = kMax + 1 + end -- correggo le info per gestire correttamente nel calcolo toolpath - if bInverted and not tabSplitted[nPrevId] then + local nPrevInfo = EgtGetInfo( nPrevId, KEY_SPLIT_RIB, 'i') + if bInverted and not nPrevInfo then EgtRemoveInfo( vSplitRibs[i], KEY_SPLIT_RIB) EgtSetInfo( nPrevId, KEY_SPLIT_RIB, vSplitRibs[i]) - tabSplitted[nPrevId] = 1 end end - -end - --------------------------------------------------------------------------------------------- -local function CopyInfo( nSouId, nDestId, sInfo, sType) - local info = EgtGetInfo( nSouId, sInfo, sType) - EgtSetInfo( nDestId, sInfo, info) end -------------------------------------------------------------------------------------------- @@ -642,6 +808,7 @@ local function ReassignInfo( nCrv, nCnt, vOrig) CopyInfo( vOrig[i], nId, KEY_RIBS_LEAD_IN_INVERT, 'b') CopyInfo( vOrig[i], nId, KEY_RIBS_LEAD_IN_LEN, 'd') CopyInfo( vOrig[i], nId, KEY_ASSOCIATED_SURF, 'i') + CopyInfo( vOrig[i], nId, KEY_RIBS_TYPE, 'i') bStart = true end -- verifico se corrisponde al suo end @@ -668,11 +835,16 @@ end local function ReorderRibsInters2Shells( nOffsGrp, dStrand) local vOffs = EgtGetNameInGroup( nOffsGrp, RIBS_CRV .. '*') + local bUnboundedRib = false -- copio le curve originali ( per recuperarne le info) local vCopy = {} for i = 1, #vOffs do local nNewId = EgtCopy( vOffs[i], nOffsGrp) table.insert( vCopy, nNewId) + local nType = EgtGetInfo( nNewId, KEY_RIBS_TYPE, 'i') + if nType == RIB_TYPE.UNBOUNDED then + bUnboundedRib = true + end end -- concateno le curve @@ -777,10 +949,45 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand) -- Recupero le info dalle curve originali ReassignInfo( nCrv, nCnt, vCopy) + + -- riordino per tipologia ( prima iterni poi esterni) nel caso senza unbounded + if not bUnboundedRib then + local vCrvs = EgtGetNameInGroup( nOffsGrp, RIBS_CRV .. '*') + for nId = 1, #vCrvs do + local nType = EgtGetInfo( vCrvs[nId], KEY_RIBS_TYPE, 'i') + if nType == RIB_TYPE.EXTERNAL then + EgtRelocateGlob( vCrvs[nId], EgtGetParent( nCrv), GDB_IN.LAST_SON) + end + end + end + +end + +------------------------------------------------------------------- +local function UpdateRibSplitInfo( nGrp, tIds) + + local vIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*') + if not vIds then return end + + for i = 1, #vIds do + + -- info SplitRib + local nInfo = EgtGetInfo( vIds[i], KEY_SPLIT_RIB, 'i') + if nInfo then + if tIds[nInfo] and #tIds[nInfo] > 0 then + -- aggiorno info con nuovo id della costolatura da cui deriva + local nLast = #tIds[nInfo] + EgtSetInfo( vIds[i], KEY_SPLIT_RIB, tIds[nInfo][nLast]) + else + -- se la costolatura da cui deriva è stata eliminata, tolgo l'info che le associava + EgtRemoveInfo( vIds[i], KEY_SPLIT_RIB) + end + end + end end -------------------------------------------------------------------- -local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, nMaxStrandDiff) +local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx) local vRibs = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') -- verifico se tutte le costolature vengono fatte con 2 passate @@ -827,80 +1034,78 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, nMaxStrand -- creo le superfici con cui fare i trim local nSrfBase = EgtGetFirstNameInGroup( nCrvGrp, TOT_SHELL_TRIM_SURF) - if not nSrfBase then - EgtOutLog( 'Warning : Ribs not possible (layer '..tostring( nIdx)..') - CalcPaths') - else - local vSurfOffs = ComputeTrimSurfWithOverlaps( vRibs, nSrfBase, KEY_RIBS_OVERLAP, LayerParams.dStrand, nRibsPathGrp) + local nSrfExt = EgtGetFirstNameInGroup( nCrvGrp, LAYER_SRF) + local tSurfOffs = ComputeTrimSurfWithOverlapsForRibs( vRibs, nSrfBase, nSrfExt, LayerParams.dOffs, LayerParams.dStrand, nRibsPathGrp) + + -- gestisco eventuali intersezioni fra costolature + local bInters = HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands) + EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_INTERS, bInters) + EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_TWO_STRANDS, bAllTwoStrands) - -- gestisco eventuali intersezioni fra costolature - local bInters = HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands) - EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_INTERS, bInters) - EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_TWO_STRANDS, bAllTwoStrands) - - -- eseguo il trim delle costole con la regione offsettata - local tOldNewIds = {} - local vOrderedRibs = EgtGetNameInGroup( nRibsPathGrp, RIBS_CRV ..'*') - for i = 1, #vOrderedRibs do - -- trim con superficie opportuna - local nOverlap = EgtGetInfo( vOrderedRibs[i], KEY_RIBS_OVERLAP, 'i') - if not vSurfOffs[ nOverlap] then - -- la costolatura non è fattibile - EgtOutLog( 'Warning: Ribs not possibile (layer '..tostring( nIdx)..') - CalcPaths') - EgtErase( vOrderedRibs[i]) + -- eseguo il trim delle costole con la regione offsettata + local tOldNewIds = {} + local vOrderedRibs = EgtGetNameInGroup( nRibsPathGrp, RIBS_CRV ..'*') + for i = 1, #vOrderedRibs do + -- trim con superficie opportuna + local nOverlap = EgtGetInfo( vOrderedRibs[i], KEY_RIBS_OVERLAP, 'i') + local nType = EgtGetInfo( vOrderedRibs[i], KEY_RIBS_TYPE, 'i') + if not tSurfOffs[nType][nOverlap] then + -- la costolatura non è fattibile + EgtOutLog( 'Warning: Ribs not possibile (layer '..tostring( nIdx)..') - CalcPaths') + EgtErase( vOrderedRibs[i]) + else + local nCrv, nCnt + if tSurfOffs[nType][nOverlap] == GDB_ID.NULL then + -- caso unbounded + nCrv = vOrderedRibs[i] + nCnt = 1 else - local nCrv, nCnt = EgtTrimCurveWithRegion( vOrderedRibs[i], vSurfOffs[nOverlap], true, false) - tOldNewIds[ vOrderedRibs[i]] = {} - - -- elimino tratti troppo corti - for nInd = 0, nCnt - 1 do - local dLen = EgtCurveLength( nCrv + nInd) - if dLen < MIN_RIBS_LEN then - EgtErase( nCrv + nInd) - else - table.insert( tOldNewIds[ vOrderedRibs[i]], nCrv + nInd) - - -- controllo la direzione (consideriamo inclinazione solo lungo X) - local vtDir = EgtMV( nCrv + nInd) - local dXl = sqrt( sqr( vtDir:getX()) + sqr( vtDir:getZ())) - local dYl = abs( vtDir:getY()) - local dVal = EgtIf( dXl > dYl - GEO.EPS_SMALL, vtDir:getX(), vtDir:getY()) - local bInvert = dVal < - GEO.EPS_SMALL - -- inversione della curva - local bInvertInfo = EgtGetInfo( nCrv + nInd, KEY_RIBS_INVERT_DIR, 'b') or false - if bInvert ~= bInvertInfo then - EgtInvertCurve( nCrv + nInd) - EgtSetInfo( nCrv + nInd, KEY_INVERTED_CRV, 1) - end - - -- salvo info della superficie di trim associata - EgtSetInfo( nCrv + nInd, KEY_ASSOCIATED_SURF, vSurfOffs[nOverlap]) - - if nInd == 0 then - -- aggiorno la info - local nInfo = EgtGetInfo( nCrv + nInd, KEY_SPLIT_RIB, 'i') - if nInfo then - -- aggiorno info - if #tOldNewIds[nInfo] > 0 then - local nLast = #tOldNewIds[nInfo] - EgtSetInfo( nCrv + nInd, KEY_SPLIT_RIB, tOldNewIds[nInfo][nLast]) - else - -- se la costolatura da cui deriva è stata eliminata, tolgo l'info che le associava - EgtRemoveInfo( nCrv + nInd, KEY_SPLIT_RIB) - end - end - end + nCrv, nCnt = EgtTrimCurveWithRegion( vOrderedRibs[i], tSurfOffs[nType][nOverlap], EgtIf( nType == RIB_TYPE.INTERNAL, true, false), false) + end + + tOldNewIds[ vOrderedRibs[i]] = {} + + -- elimino tratti troppo corti + for nInd = 0, nCnt - 1 do + local dLen = EgtCurveLength( nCrv + nInd) + if dLen < MIN_RIBS_LEN then + EgtErase( nCrv + nInd) + else + table.insert( tOldNewIds[ vOrderedRibs[i]], nCrv + nInd) + + -- controllo la direzione (consideriamo inclinazione solo lungo X) + local vtDir = EgtMV( nCrv + nInd) + local dXl = sqrt( sqr( vtDir:getX()) + sqr( vtDir:getZ())) + local dYl = abs( vtDir:getY()) + local dVal = EgtIf( dXl > dYl - GEO.EPS_SMALL, vtDir:getX(), vtDir:getY()) + local bInvert = dVal < - GEO.EPS_SMALL + -- inversione della curva + local bInvertInfo = EgtGetInfo( nCrv + nInd, KEY_RIBS_INVERT_DIR, 'b') or false + if bInvert ~= bInvertInfo then + EgtInvertCurve( nCrv + nInd) + EgtSetInfo( nCrv + nInd, KEY_INVERTED_CRV, 1) end - end + + -- salvo info della superficie di trim associata + EgtSetInfo( nCrv + nInd, KEY_ASSOCIATED_SURF, tSurfOffs[nType][nOverlap]) + + if nInd > 0 then + EgtRemoveInfo( nCrv + nInd, KEY_SPLIT_RIB) + end + end end end - - -- riordino le costolature - if bAllTwoStrands and bInters then - -- gestione caso speciale di intersezione e 2 passate - ReorderRibsInters2Shells( nRibsPathGrp, LayerParams.dStrand) - else - ReorderRibs( nRibsPathGrp, LayerParams.bRibsInvertOrder, LayerParams.dStrand, nMaxNbr) - end + end + + -- aggiorno le info di split con i nuovi id + UpdateRibSplitInfo( nRibsPathGrp, tOldNewIds) + + -- riordino le costolature + if bAllTwoStrands and bInters then + -- gestione caso speciale di intersezione e 2 passate + ReorderRibsInters2Shells( nRibsPathGrp, LayerParams.dStrand) + else + ReorderRibs( nRibsPathGrp, LayerParams.bRibsInvertOrder, LayerParams.dStrand, nMaxNbr) end if not EgtGetFirstNameInGroup( nRibsPathGrp, RIBS_CRV .. '*') then @@ -972,7 +1177,7 @@ local function ComputeMaxShellNbrDiff( nSrf, nShellNbrSurfGrp) local nShellNbrSrf = EgtGetFirstNameInGroup( nShellNbrSurfGrp, SHELL_NBR_SURF .. tostring( nId)) while nShellNbrSrf do -- se interessa la regione considerata aggiorno il nMaxShellNbrDiff - if not EgtSurfFrTestExternal( nSrf, nShellNbrSrf) then + if not EgtSurfFrTestExternal( nSrf, nShellNbrSrf) then nMaxShellNbrDiff = nId end @@ -1517,7 +1722,7 @@ function CalcPaths.Exec( nPartId) -- sistemo eventuali costolature if nRibsGrp then - CalcRibsPaths( vLayIds[nIdx], nRibsGrp, LayerParams, nIdx, nMaxStrandDiff) + CalcRibsPaths( vLayIds[nIdx], nRibsGrp, LayerParams, nIdx) end end diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 336c12f..0dbcc4f 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -89,10 +89,10 @@ local function AdjustAuxSolids( nSolidsLay) end -------------------------------------------------------------------- -local function ReadParam( nId, sKey, sType, table) +local function ReadParam( nId, sKey, sType, table, defVal) local info = EgtGetInfo( nId, sKey, sType) if info == nil then info = EgtGetInfo( s_nPartId, sKey, sType) end - table[sKey] = info + table[sKey] = info or defVal end -------------------------------------------------------------------- @@ -108,14 +108,9 @@ local function GetRibParams( nId) ReadParam( nId, KEY_RIBS_LEAD_OUT_COASTING, 'd', RibParam) ReadParam( nId, KEY_RIBS_LEAD_OUT_WIPE, 'd', RibParam) ReadParam( nId, KEY_RIBS_LEAD_OUT_WIPE_DIR, 'd', RibParam) + ReadParam( nId, KEY_RIBS_OVERLAP, 'i', RibParam) - -- overlap può essere diverso tra le varie costolature solo se non sono collegate - local bLink = EgtGetInfo( s_nPartId, KEY_RIBS_LINK, 'b') or false - if bLink then - RibParam[ KEY_RIBS_OVERLAP] = EgtGetInfo( s_nPartId, KEY_RIBS_OVERLAP, 'i') -- parametro generico - else - ReadParam( nId, KEY_RIBS_OVERLAP, 'i', RibParam) -- parametro specifico della costolatura - end + ReadParam( nId, KEY_RIBS_TYPE, 'i', RibParam, RIB_TYPE.INTERNAL) return RibParam end @@ -131,48 +126,9 @@ local function GetAuxSolidsParams( nId) ReadParam( nId, KEY_AUX_SOLIDS_WIPE_LEN, 'd', AuxSolidsParam) ReadParam( nId, KEY_AUX_SOLIDS_WIPE_DIR, 'd', AuxSolidsParam) - local sInfill = EgtGetInfo( nId, KEY_AUX_SOLIDS_INFILL, 's') - if sInfill then - -- se parametro specifico per il solido - if sInfill == 'ZigZag' then - AuxSolidsParam[KEY_AUX_SOLIDS_INFILL] = INFILL_TYPE.ZIGZAG - elseif sInfill == 'Offset' then - AuxSolidsParam[KEY_AUX_SOLIDS_INFILL] = INFILL_TYPE.OFFSET - else - AuxSolidsParam[KEY_AUX_SOLIDS_INFILL] = INFILL_TYPE.NONE - end - else - -- altrimenti recupero il parametro generale dal pezzo - AuxSolidsParam[KEY_AUX_SOLIDS_INFILL] = EgtGetInfo( s_nPartId, KEY_AUX_SOLIDS_INFILL, 'i') - end - - local sPrintOrder = EgtGetInfo( nId, KEY_AUX_SOLIDS_PRINT_ORDER, 's') - if sPrintOrder then - -- se parametro specifico per il solido - if sPrintOrder == 'OutToIn' then - AuxSolidsParam[KEY_AUX_SOLIDS_PRINT_ORDER] = PRINT_ORDER.EXT_INT_INF - else - AuxSolidsParam[KEY_AUX_SOLIDS_PRINT_ORDER] = PRINT_ORDER.INF_INT_EXT - end - else - -- altrimenti recupero il parametro generale dal pezzo - AuxSolidsParam[KEY_AUX_SOLIDS_PRINT_ORDER] = EgtGetInfo( s_nPartId, KEY_AUX_SOLIDS_PRINT_ORDER, 'i') - end - - local sLinkType = EgtGetInfo( nId, KEY_AUX_SOLIDS_LINK_TYPE, 's') - if sLinkType then - -- se parametro specifico per il solido - if sLinkType == 'None' then - AuxSolidsParam[KEY_AUX_SOLIDS_LINK_TYPE] = LINK_TYPE.NONE - elseif sLinkType == 'BiArc' then - AuxSolidsParam[KEY_AUX_SOLIDS_LINK_TYPE] = LINK_TYPE.BIARC - else - AuxSolidsParam[KEY_AUX_SOLIDS_LINK_TYPE] = LINK_TYPE.LINEAR - end - else - -- altrimenti recupero il parametro generale dal pezzo - AuxSolidsParam[KEY_AUX_SOLIDS_LINK_TYPE] = EgtGetInfo( s_nPartId, KEY_AUX_SOLIDS_LINK_TYPE, 'i') - end + ReadParam( nId, KEY_AUX_SOLIDS_INFILL, 'i', AuxSolidsParam) + ReadParam( nId, KEY_AUX_SOLIDS_PRINT_ORDER, 'i', AuxSolidsParam) + ReadParam( nId, KEY_AUX_SOLIDS_LINK_TYPE, 'i', AuxSolidsParam) return AuxSolidsParam end @@ -308,10 +264,9 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) -- recupero la direzione dello slicing local vtSlicing = Z_AX() local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') - local bSlicing45 = EgtGetInfo( s_nPartId, KEY_SLICING_45, 'b') or false -- da rimuovere if nSlicingType == SLICING_TYPE.HORIZONTAL then vtSlicing = X_AX() - elseif nSlicingType == SLICING_TYPE.DEG45 or bSlicing45 then + elseif nSlicingType == SLICING_TYPE.DEG45 then vtSlicing = VectorFromSpherical( 1, 45, 0) end diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 4702d87..feb82e5 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -320,24 +320,29 @@ local function VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) -- verifico se si trova nella regione ammissibile local nSurfId = EgtGetInfo( nCurr, KEY_ASSOCIATED_SURF, 'i') local nRes = EgtCurveWithRegionClassify( nLinkId, nSurfId) - if nRes == GDB_CRC.OUT or nRes == GDB_CRC.INTERS then - return false + local nType1 = EgtGetInfo( nCurr, KEY_RIBS_TYPE, 'i') + local nType2 = EgtGetInfo( nNext, KEY_RIBS_TYPE, 'i') + if nType1 == RIB_TYPE.INTERNAL and nType2 == RIB_TYPE.INTERNAL then + if nRes == GDB_CRC.OUT or nRes == GDB_CRC.INTERS then + return false + end + elseif nType1 == RIB_TYPE.EXTERNAL and nType2 == RIB_TYPE.EXTERNAL then + if nRes == GDB_CRC.IN or nRes == GDB_CRC.INTERS then + return false + end end - + -- verifico se il link interseca una delle altre costolature local vRibsIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*') - local nLinkLoc = EgtCopyGlob( nLinkId, nGrpTmp) + local nLinkSrf = EgtSurfFrFatCurve( nGrpTmp, nLinkId, 0.5 * dStrand, false) or GDB_ID.NULL for i = 1, #vRibsIds do if vRibsIds[i] ~= nCurr and vRibsIds[i] ~= nNext then - local nCrvLoc = EgtCopyGlob( vRibsIds[i], nGrpTmp) - local ptInt = EgtIP( nLinkLoc, nCrvLoc, ORIG()) - if ptInt then + local nRes = EgtCurveWithRegionClassify( vRibsIds[i], nLinkSrf) + if nRes == GDB_CRC.INTERS then return false end end end - - EgtErase( nTotLink) return true end @@ -685,6 +690,8 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n -- terzo tratto ( diretto verso esterno con ugello chiuso) if dRibsLOWipe > GEO.EPS_SMALL then local dAng = dRibsLOWipeAng + s_nDefaultWipeAng + local nType = EgtGetInfo( nCrv, KEY_RIBS_TYPE, 'i') + if nType == RIB_TYPE.EXTERNAL then dAng = - dAng end vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng)) local ptFinal = ptE + vtE * dRibsLOWipe -- verifico soddisfi altezza minima per dimensioni utensile @@ -774,10 +781,17 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) local nShellsNbr = EgtGetInfo( tabRibs[i][1], KEY_RIBS_SHELLS_NBR, 'i') -- se link aggiorno bInvert per il gruppo di costolature corrente in modo da essere coerente con il collegamento if LayerParams.bRibsLink then - if i > 1 and not nInfo then - local nPrevShellsNbr = EgtGetInfo( tabRibs[i-1][1], KEY_RIBS_SHELLS_NBR, 'i') - if nPrevShellsNbr % 2 == 1 then - bInvert = not bInvert + if i > 1 then + nPrevType = EgtGetInfo( tabRibs[i-1][1], KEY_RIBS_TYPE, 'i') + nCurrType = EgtGetInfo( tabRibs[i][1], KEY_RIBS_TYPE, 'i') + -- se cambio tipologia di setto, l'orientamento della curva è già corretto + if nPrevType ~= nCurrType then + bInvert = false + elseif not nInfo then + local nPrevShellsNbr = EgtGetInfo( tabRibs[i-1][1], KEY_RIBS_SHELLS_NBR, 'i') + if nPrevShellsNbr % 2 == 1 then + bInvert = not bInvert + end end end end @@ -1058,8 +1072,7 @@ function CalcToolPath.Exec( nPartId) local vtMove = Vector3d( 0, 0, dCorrZ) -- se slicing a 45° aggiungo correzione anche in direzione dello slicing local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') or 1 - local bSlicing45 = EgtGetInfo( s_nPartId, KEY_SLICING_45, 'b') or false -- da rimuovere - if nSlicingType == SLICING_TYPE.DEG45 or bSlicing45 then + if nSlicingType == SLICING_TYPE.DEG45 then vtMove = vtMove + LayerParams.dLayHeight / 2 * LayerParams.vtSlicing end local SolidLayId = EgtGetFirstNameInGroup( s_nPartId, PRINT_SOLID) diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index ab6baa2..460e8c2 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -137,6 +137,15 @@ local function LoadParams( sFile, nPartId) SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_WIPE_FEEDPU, '0.9') -- parametri per costolature + local sRibType = EgtGetStringFromIni( SEC_DEFAULT, KEY_RIBS_TYPE, 'Internal', sFile) + if sRibType == 'External' then + EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.EXTERNAL) + elseif sRibType == 'Unbounded' then + EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.UNBOUNDED) + else -- 'Internal' + EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.INTERNAL) + end + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_OVERLAP, '0.0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_SHELLS_NBR, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_DIR, '0') From 781e2d527467655d173377206b664ae77c3e910a Mon Sep 17 00:00:00 2001 From: DarioS Date: Thu, 27 Oct 2022 22:24:37 +0200 Subject: [PATCH 25/79] 3dPrinting : - piccole modifiche estetiche - salvataggio in TFS di MF e TotalArea. --- LuaLibs/AddManData.lua | 6 ++++-- LuaLibs/RunGcodeGenerate.lua | 2 +- LuaLibs/RunMachParamFromSWCalc.lua | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 8f3134b..41623da 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -39,12 +39,12 @@ KEY_PARAMS = "Params" KEY_CALC_SOLIDS = "CalcSolids" KEY_SPIRAL_VASE = "SpiralVase" KEY_SLICING_TYPE = "SlicingType" -KEY_SLICING_DIR="SlicingDir" +KEY_SLICING_DIR = "SlicingDir" KEY_SLICE_STEP = "StrandH" KEY_SHELLS_NBR = "StrandCount" KEY_STRAND = "StrandW" KEY_STRAND_OVERLAP = "StrandOverlap" -KEY_OFFSET_SLICE ="Offset" +KEY_OFFSET_SLICE = "Offset" KEY_SP_OFFSET_ON_SLICE = "StartPointOffsetOnSlice" KEY_PRINT_ORDER = "StrandOrder" KEY_PRINT_DIRECTION = "Direction" @@ -272,6 +272,8 @@ KEY_FCUR = "FCur" KEY_LENGTH = "Length" KEY_SLICEID = "SliceId" KEY_MASS = "PrintMass" +KEY_MF = "MF" +KEY_TOTAREA = "TotArea" --------------------------------------------------------------------- return AddManData diff --git a/LuaLibs/RunGcodeGenerate.lua b/LuaLibs/RunGcodeGenerate.lua index 6d3ead1..2258340 100644 --- a/LuaLibs/RunGcodeGenerate.lua +++ b/LuaLibs/RunGcodeGenerate.lua @@ -128,7 +128,7 @@ function RunGcodeGenerate.Exec() EgtProcessEvents( 680, 0) -- Genero il programma CN - local sInfo = 'EgtCAM5 ver.' .. EgtGetExeVersion() .. ' - ' .. sPath + local sInfo = 'Icarus ver.' .. EgtGetExeVersion() .. ' - ' .. sPath local sISOFilePath = '' if PRINT and PRINT.PROGRAM == 1 and PRINT.ISOFILEPATH then sISOFilePath = PRINT.ISOFILEPATH diff --git a/LuaLibs/RunMachParamFromSWCalc.lua b/LuaLibs/RunMachParamFromSWCalc.lua index 837e76d..15c2b6c 100644 --- a/LuaLibs/RunMachParamFromSWCalc.lua +++ b/LuaLibs/RunMachParamFromSWCalc.lua @@ -177,6 +177,8 @@ function RunMachParamFromSWCalc.Exec() EgtSetInfo( nLayerResultId, KEY_FCUR, dLayerFeed) EgtSetInfo( nLayerResultId, KEY_LENGTH, dTotLayerLength) EgtSetInfo( nLayerResultId, KEY_SPEED, dSpeed) + EgtSetInfo( nLayerResultId, KEY_MF, dMF) + EgtSetInfo( nLayerResultId, KEY_TOTAREA, dTotLayerArea) -- aggiorno interfaccia EgtProcessEvents( 500 + ( nLayerIndex / nLayerQty * 100), 0) nLayerIndex = nLayerIndex + 1 From 9c438d11b6a85fabfb7daa445cbf02a4747fbf41 Mon Sep 17 00:00:00 2001 From: DarioS Date: Fri, 28 Oct 2022 11:46:56 +0200 Subject: [PATCH 26/79] 3dPrinting : - cambiato valore delle costanti SLICING_TYPE.DEG45 = 2 e SLICING_TYPE.HORIZONTAL = 3. --- LuaLibs/AddManData.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 41623da..f6ad970 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -137,8 +137,8 @@ KEY_HAS_SOLIDS = "Solids" SLICING_TYPE = { VERTICAL = 1, - HORIZONTAL = 2, - DEG45 = 3, + DEG45 = 2, + HORIZONTAL = 3, } TYPE = { From 8e75cf21dac0b1709f1f71324455306121d58bcb Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 28 Oct 2022 11:50:19 +0200 Subject: [PATCH 27/79] 3dPrinting : - correzione errori nel caso di pezzo ruotato. --- LuaLibs/CalcPaths.lua | 22 ++++++++--------- LuaLibs/CalcSlices.lua | 6 ++++- LuaLibs/CalcToolPath.lua | 52 +++++++++++++++++++-------------------- LuaLibs/RunCalcSolids.lua | 48 ++++++++++++++++++------------------ 4 files changed, 66 insertions(+), 62 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 5948265..f07e5ca 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -174,7 +174,7 @@ local function VerifyPath( nCrvId, dStrand, vtSlicing, nGrp) -- TODO da sistemare con medial axis per curva generica local bSingleStrand = false if EgtCurveIsClosed( nCrvId) then - local nGrpTmp = EgtGroup( nGrp, Frame3d( ORIG(), vtSlicing)) + local nGrpTmp = EgtGroup( nGrp, Frame3d( ORIG(), vtSlicing), GDB_RT.GLOB) EgtRelocateGlob( nCrvId, nGrpTmp) local frLoc, dDimX, dDimY = EgtCurveMinAreaRectangleXY( nCrvId) if dDimY < 0.5 then @@ -363,7 +363,7 @@ local function ComputeZigZagInfill( nSrf, dStrand, vtSlicing, sName, nType, vPtS local frLoc = Frame3d( ORIG(), vtSlicing) local vIds = {} for nId = nFirst, nFirst + nCnt - 1 do - local nGrpTmp = EgtGroup( nGrp, frLoc) + local nGrpTmp = EgtGroup( nGrp, frLoc, GDB_RT.GLOB) -- recupero outer curve local nCrvGrpId = EgtGetParent( nGrp) @@ -410,7 +410,7 @@ local function ComputeZigZagInfill( nSrf, dStrand, vtSlicing, sName, nType, vPtS EgtSetInfo( j, KEY_TYPE, nType) EgtSetInfo( j, KEY_ZIG_ZAG_DIR, vtDir) EgtSetInfo( j, KEY_ZIG_ZAG_INFILL, 1) - EgtModifyCurveExtrusion( j, vtSlicing) + EgtModifyCurveExtrusion( j, vtSlicing, GDB_RT.GLOB) table.insert( vIds, j) end local vtS = EgtSV( nInd) @@ -574,7 +574,7 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa -- copio i setti in un gruppo con frame locale per calcolare le intersezioni local frLoc = Frame3d( ORIG(), LayerParams.vtSlicing) - local nGrpTmp = EgtGroup( nRibsGrp, frLoc) + local nGrpTmp = EgtGroup( nRibsGrp, frLoc, GDB_RT.GLOB) local vOrigRibsIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') local vRibsIds = {} for i = 1, #vOrigRibsIds do @@ -1343,7 +1343,7 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d for nCrvT = nTrimCrv, nTrimCrv + nTrimCnt - 1 do -- calcolo offset della curva ( è il percorso della shell) - EgtModifyCurveExtrusion( nCrvT, LayerParams.vtSlicing) + EgtModifyCurveExtrusion( nCrvT, LayerParams.vtSlicing, GDB_RT.GLOB) local nOffs, nOffsCnt = EgtOffsetCurveAdv( nCrvT, - dOffs) EgtErase( nCrvT) for nCrvOffs = nOffs, nOffs + nOffsCnt - 1 do @@ -1358,7 +1358,7 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d end -- verifico se soddisfa vincolo sulla lunghezza if dLen > MIN_LEN and bValid then - EgtModifyCurveExtrusion( nId, LayerParams.vtSlicing) + EgtModifyCurveExtrusion( nId, LayerParams.vtSlicing, GDB_RT.GLOB) EgtSetName( nId, EXTRA_SHELL_CRV .. tostring( nMaxShellNbrDiff - nInd + 1)) if nInd == LayerParams.nShellsNbr then EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_OUTER_SHELL) @@ -1486,23 +1486,23 @@ end local function AddExtraZigZag( nSrf, sName, dStrand, vtSlicing, nGrp, nSrfTrim) local vIds = EgtGetNameInGroup( nGrp, sName) - local vtDir = EgtSV( vIds[1]) + local vtDir = EgtSV( vIds[1], GDB_ID.ROOT) local vtYLoc = vtSlicing ^ vtDir local nOuterLoop = EgtExtractSurfFrChunkLoops( nSrf, 0, nGrp) for i = 1, #vIds do local _, dParE = EgtCurveDomain( vIds[i]) - local ptS = EgtUP( vIds[i], dParE - 1) + dStrand * vtYLoc - local ptE = EgtEP( vIds[i]) + dStrand * vtYLoc - local nExtraCrv = EgtLine( nGrp, ptS, ptE) + local ptS = EgtUP( vIds[i], dParE - 1, GDB_ID.ROOT) + dStrand * vtYLoc + local ptE = EgtEP( vIds[i], GDB_ID.ROOT) + dStrand * vtYLoc + local nExtraCrv = EgtLine( nGrp, ptS, ptE, GDB_RT.GLOB) -- verifico se la linea aggiuntiva serve local dDist = EgtPointCurveDist( EgtMP( nExtraCrv), nOuterLoop) if dDist < dStrand - 1 then -- verifico se si trova nella regione ammissibile if EgtCurveWithRegionClassify( nExtraCrv, nSrfTrim) == GDB_CRC.IN then EgtInvertCurve( nExtraCrv) - EgtAddCurveCompoLine( vIds[i], ptE) + EgtAddCurveCompoLine( vIds[i], ptE, GDB_RT.GLOB) EgtAddCurveCompoCurve( vIds[i], nExtraCrv) end end diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 0dbcc4f..3c0cbd4 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -18,6 +18,10 @@ local s_nPartId --------------------------------------------------------------------- local function ComputeZSlices( dZmin, dDeltaZ, dZmax) local dSliceStep = EgtGetInfo( s_nPartId, KEY_SLICE_STEP, 'd') or 10000 + if dSliceStep < GEO.EPS_SMALL then + EgtOutLog( 'Warning : SliceStep is 0') + return + end local ptSlices = { dZmin + dDeltaZ} local dPosZ = dZmin + dSliceStep while dPosZ < dZmax do @@ -413,7 +417,7 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) EgtSetColor( vOpenId or {}, 'RED') -- creo flat region a partire dalle curve chiuse ottenute con lo slicing - local nGrp = EgtGroup( nLayId, frSlicing) + local nGrp = EgtGroup( nLayId, frSlicing, GDB_RT.GLOB) for i = 1, #vClosedId do EgtRelocateGlob( vClosedId[i], nGrp) EgtApproxCurve( vClosedId[i], GDB_CA.ARCS, MID_TOLER) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index feb82e5..c40caa3 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -113,7 +113,7 @@ local function AddLink( vCrv, nTpathGrpId, nLinkType, dLinkParam, dSPOffs, dStra nLinkId = EgtCurveCompoFromPoints( nTpathGrpId, {EgtEP( vCrv[i-1]), EgtSP( vCrv[i])}) elseif nLinkType == LINK_TYPE.BIARC then local frLoc = Frame3d( ORIG(), vtSlicing) - local nGrpTmp = EgtGroup( nTpathGrpId, frLoc) + local nGrpTmp = EgtGroup( nTpathGrpId, frLoc, GDB_RT.GLOB) local _, _, dAngIni = SphericalFromVector( EgtEV( vCrv[i-1], nGrpTmp)) local _, _, dAngFin = SphericalFromVector( EgtSV( vCrv[i], nGrpTmp)) nLinkId = EgtBiArc( nGrpTmp, EgtEP( vCrv[i-1], nGrpTmp), EgtSP( vCrv[i], nGrpTmp), dAngIni, dAngFin, 0.5) @@ -137,8 +137,8 @@ end -------------------------------------------------------------------- local function AddLeadIn( nCrvId, LayerParams, nGrpId) - local ptE = EgtSP( nCrvId) - local vtTang = EgtSV( nCrvId) + local ptE = EgtSP( nCrvId, GDB_ID.ROOT) + local vtTang = EgtSV( nCrvId, GDB_ID.ROOT) local vtOrtho = Vector3d( vtTang) local dAng = 90 if ( LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.INF_INT_EXT) or @@ -153,9 +153,9 @@ local function AddLeadIn( nCrvId, LayerParams, nGrpId) local nLeadInCrv if LayerParams.nLeadInType == LEAD_TYPE.LINEAR then - nLeadInCrv = EgtCurveCompoFromPoints( nGrpId, {ptS, ptE}) + nLeadInCrv = EgtCurveCompoFromPoints( nGrpId, {ptS, ptE}, GDB_RT.GLOB) elseif LayerParams.nLeadInType == LEAD_TYPE.ARC then - nLeadInCrv = EgtArc2PV( nGrpId, ptE, ptS, -vtTang) + nLeadInCrv = EgtArc2PV( nGrpId, ptE, ptS, -vtTang, GDB_RT.GLOB) EgtInvertCurve( nLeadInCrv) end @@ -170,8 +170,8 @@ end -------------------------------------------------------------------- local function AddLeadOut( nCrvId, LayerParams, nGrpId) - local ptS = EgtEP( nCrvId) - local vtTang = EgtEV( nCrvId) + local ptS = EgtEP( nCrvId, GDB_ID.ROOT) + local vtTang = EgtEV( nCrvId, GDB_ID.ROOT) local vtOrtho = Vector3d( vtTang) local dAng = - 90 if ( LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.INF_INT_EXT) or @@ -184,9 +184,9 @@ local function AddLeadOut( nCrvId, LayerParams, nGrpId) local nLeadOutCrv if LayerParams.nLeadOutType == LEAD_TYPE.LINEAR then - nLeadOutCrv = EgtCurveCompoFromPoints( nGrpId, {ptS, ptE}) + nLeadOutCrv = EgtCurveCompoFromPoints( nGrpId, {ptS, ptE}, GDB_RT.GLOB) elseif LayerParams.nLeadOutType == LEAD_TYPE.ARC then - nLeadOutCrv = EgtArc2PV( nGrpId, ptS, ptE, vtTang) + nLeadOutCrv = EgtArc2PV( nGrpId, ptS, ptE, vtTang, GDB_RT.GLOB) end if nLeadOutCrv then @@ -227,7 +227,7 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi else EgtErase( nCrvId) end - EgtModifyCurveExtrusion( nCoastingId, vtSlicing) + EgtModifyCurveExtrusion( nCoastingId, vtSlicing, GDB_RT.GLOB) EgtSetName( nCoastingId, COASTING_CRV) EgtSetInfo( nCoastingId, KEY_TYPE, TYPE.COASTING) EgtSetColor( nCoastingId, EgtStdColor('ORANGE')) @@ -243,11 +243,11 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi else -- se extra shell, infill a zigzag, spiral vase o rib che non termina sulla parete - local vtDir = EgtEV( nCoastingId or nCrvId) + local vtDir = EgtEV( nCoastingId or nCrvId, GDB_ID.ROOT) local dAng = dWipeDir + s_nDefaultWipeAng -- verifico se necessario cambiare il segno all'angolo local bChangeSign = false - if nType == TYPE.INFILL then + if nType == TYPE.INFILL or nType == TYPE.AUX_SOLID then local vtS = EgtGetInfo( nCrvId, KEY_ZIG_ZAG_DIR, 'v') local bSameDir = AreSameVectorApprox( vtS, vtDir) bChangeSign = ( bInverted == bSameDir) @@ -255,7 +255,7 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi bChangeSign = bInverted end vtDir:rotate( vtSlicing, EgtIf( bChangeSign, - dAng, dAng)) - local ptS = EgtEP( nCoastingId or nCrvId) + local ptS = EgtEP( nCoastingId or nCrvId, GDB_ID.ROOT) local ptE = ptS + vtDir * dWipeLen -- verifico soddisfi altezza minima per dimensioni utensile local k = 1 @@ -265,7 +265,7 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi k = k + 1 end - nWipeId = EgtCurveCompoFromPoints( EgtGetParent( nCrvId), {ptS, ptE}) + nWipeId = EgtCurveCompoFromPoints( EgtGetParent( nCrvId), {ptS, ptE}, GDB_RT.GLOB) EgtModifyCurveExtrusion( nWipeId, vtSlicing, GDB_RT.GLOB) EgtRelocateGlob( nWipeId, nCoastingId or nCrvId, GDB_IN.AFTER) end @@ -613,7 +613,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp) local nLeadIn = FindCorrectRibsLead( dParS, nCrv, nCrvOffs, bLIInvert, dLILen, dStrand, true, nGrpTmp) -- se lead in possibile if nLeadIn then - EgtModifyCurveExtrusion( nLeadIn, vtSlicing) + EgtModifyCurveExtrusion( nLeadIn, vtSlicing, GDB_RT.GLOB) EgtSetInfo( nLeadIn, KEY_TYPE, TYPE.RIB) EgtSetName( nLeadIn, LEAD_IN_CRV) end @@ -637,13 +637,13 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n abs( dRibsLOCoasting) < GEO.EPS_SMALL and abs( dRibsLOWipe) < GEO.EPS_SMALL then return end - local ptE = EgtEP( nCrv) - local vtE = EgtEV( nCrv) + local ptE = EgtEP( nCrv, GDB_ID.ROOT) + local vtE = EgtEV( nCrv, GDB_ID.ROOT) -- recupero la curva di offset su cui calcolare lead out local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) while nCrvOffs do - local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE) + local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE, GDB_RT.GLOB) if dParE then local nCrvLO @@ -662,12 +662,12 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n if dRibsLOLen > GEO.EPS_SMALL and not bSkip then nCrvLO = EgtCopyGlob( nCrvRef, nCrv, GDB_IN.AFTER) EgtTrimCurveEndAtLen( nCrvLO, dRibsLOLen) - EgtModifyCurveExtrusion( nCrvLO, vtSlicing) + EgtModifyCurveExtrusion( nCrvLO, vtSlicing, GDB_RT.GLOB) EgtSetInfo( nCrvLO, KEY_TYPE, TYPE.RIB) EgtSetName( nCrvLO, LEAD_OUT_CRV) -- aggiorno ptE e vtE - ptE = EgtEP( nCrvLO) - vtE = EgtEV( nCrvLO) + ptE = EgtEP( nCrvLO, GDB_ID.ROOT) + vtE = EgtEV( nCrvLO, GDB_ID.ROOT) end -- secondo tratto ( segue offset con flusso chiuso) @@ -675,15 +675,15 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n nCoasting = EgtCopyGlob( nCrvRef, nCrvLO or nCrv, GDB_IN.AFTER) EgtTrimCurveStartAtLen( nCoasting, dRibsLOLen) EgtTrimCurveEndAtLen( nCoasting, dRibsLOCoasting) - EgtModifyCurveExtrusion( nCoasting, vtSlicing) + EgtModifyCurveExtrusion( nCoasting, vtSlicing, GDB_RT.GLOB) EgtSetName( nCoasting, COASTING_CRV) EgtSetInfo( nCoasting, KEY_TYPE, TYPE.COASTING) EgtSetColor( nCoasting, EgtStdColor('ORANGE')) -- aggiorno ptE e vtE - ptE = EgtEP( nCoasting) - vtE = EgtEV( nCoasting) + ptE = EgtEP( nCoasting, GDB_ID.ROOT) + vtE = EgtEV( nCoasting, GDB_ID.ROOT) end EgtErase( nCrvRef) @@ -702,7 +702,7 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n k = k + 1 end - nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}) + nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}, GDB_RT.GLOB) EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB) EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER) EgtSetName( nWipe, WIPE_CRV) @@ -729,7 +729,7 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) -- gruppo temporaneo con sistema di riferimento locale per conti local frLoc = Frame3d( ORIG(), LayerParams.vtSlicing) - local nGrpTmp = EgtGroup( nCrvGrp, frLoc) + local nGrpTmp = EgtGroup( nCrvGrp, frLoc, GDB_RT.GLOB) local nRibsGrp = EgtGetFirstNameInGroup( nCrvGrp, RIBS_GRP) -- aggiungo le costolature nel toolpath diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index 1459b84..d38c36b 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -66,7 +66,7 @@ local function CreateSection( ptS, vtDir, dStrand, dH, vtSlicing, nSolidGrp) local ptG = ptB - 2 * ( dD1 + dD2) * vtDir local ptH = ptA - 2 * dD1 * vtDir - local nId = EgtCurveCompoFromPoints( nSolidGrp, {ptA, ptB, ptC, ptD, ptE, ptF, ptG, ptH, ptA}) + local nId = EgtCurveCompoFromPoints( nSolidGrp, {ptA, ptB, ptC, ptD, ptE, ptF, ptG, ptH, ptA}, GDB_RT.GLOB) EgtInvertCurve( nId) return nId @@ -81,7 +81,7 @@ local function CreateHalfSection( ptS, vtDir, dStrand, dH, vtSlicing, nSolidGrp) local ptC = ptB + dD4 * vtSlicing local ptD = ptA + dH * vtSlicing - local nId = EgtCurveCompoFromPoints( nSolidGrp, { ptS - dH * vtSlicing, ptA, ptB, ptC, ptD, ptS}) + local nId = EgtCurveCompoFromPoints( nSolidGrp, { ptS - dH * vtSlicing, ptA, ptB, ptC, ptD, ptS}, GDB_RT.GLOB) return nId end @@ -91,17 +91,17 @@ local function CreateSpiralVaseCap( nSectId, vtDir, nSolidGrp) local vPt = {} for i = 0, 7 do - vPt[i + 1] = EgtUP( nSectId, i) + vPt[i + 1] = EgtUP( nSectId, i, GDB_ID.ROOT) end local vCrvs = {} - vCrvs[1] = EgtArc2PV( nSolidGrp, vPt[1], vPt[2], vtDir) - vCrvs[2] = EgtArc2PV( nSolidGrp, vPt[8], vPt[3], vtDir) - vCrvs[3] = EgtArc2PV( nSolidGrp, vPt[7], vPt[4], vtDir) - vCrvs[4] = EgtArc2PV( nSolidGrp, vPt[6], vPt[5], vtDir) - vCrvs[5] = EgtCurveCompo( nSolidGrp, {vCrvs[1]}, false) + vCrvs[1] = EgtArc2PV( nSolidGrp, vPt[1], vPt[2], vtDir, GDB_RT.GLOB) + vCrvs[2] = EgtArc2PV( nSolidGrp, vPt[8], vPt[3], vtDir, GDB_RT.GLOB) + vCrvs[3] = EgtArc2PV( nSolidGrp, vPt[7], vPt[4], vtDir, GDB_RT.GLOB) + vCrvs[4] = EgtArc2PV( nSolidGrp, vPt[6], vPt[5], vtDir, GDB_RT.GLOB) + vCrvs[5] = EgtCurveCompo( nSolidGrp, {vCrvs[1]}, false, GDB_RT.GLOB) EgtCloseCurveCompo( vCrvs[5]) - vCrvs[6] = EgtCurveCompo( nSolidGrp, {vCrvs[4]}, false) + vCrvs[6] = EgtCurveCompo( nSolidGrp, {vCrvs[4]}, false, GDB_RT.GLOB) EgtCloseCurveCompo( vCrvs[6]) local nSurf1 = EgtSurfTmRuled( nSolidGrp, vCrvs[1], vCrvs[2], GDB_RUL.ISOPAR, s_dTol) local nSurf2 = EgtSurfTmRuled( nSolidGrp, vCrvs[2], vCrvs[3], GDB_RUL.ISOPAR, s_dTol) @@ -123,17 +123,17 @@ local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) -- gruppo temporaneo per conti local nGrpTmp = EgtGroup( nSolidGrp) - local ptS = EgtSP( nCrvId) - local vtS = EgtSV( nCrvId) - local ptE = EgtEP( nCrvId) - local vtE = EgtEV( nCrvId) + local ptS = EgtSP( nCrvId, GDB_ID.ROOT) + local vtS = EgtSV( nCrvId, GDB_ID.ROOT) + local ptE = EgtEP( nCrvId, GDB_ID.ROOT) + local vtE = EgtEV( nCrvId, GDB_ID.ROOT) -- appiattisco la curva local nCrvCopy = EgtCopyGlob( nCrvId, nGrpTmp) local dDelta = ( ptE - ptS) * LayerParams.vtSlicing EgtSpiralizeCurve( nCrvCopy, - dDelta) -- calcolo la sezione - local vtDir = EgtSV( nCrvCopy) + local vtDir = EgtSV( nCrvCopy, GDB_ID.ROOT) vtDir:rotate( LayerParams.vtSlicing, 90) local nSectId = CreateSection( ptS, vtDir, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nGrpTmp) @@ -141,7 +141,7 @@ local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) local vCrvs = {} local _, dParE = EgtCurveDomain( nSectId) for i = 0, dParE do - local ptRef = EgtUP( nSectId, i) + local ptRef = EgtUP( nSectId, i, GDB_ID.ROOT) local dOffs = ( ptRef - ptS) * vtDir vCrvs[i+1] = EgtOffsetCurveAdv( nCrvCopy, dOffs) if not vCrvs[i+1] or vCrvs[i+1] == GDB_ID.NULL then @@ -149,7 +149,7 @@ local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) return nil end local dMove = ( ptRef - ptS) * LayerParams.vtSlicing - EgtMove( vCrvs[i+1], LayerParams.vtSlicing * dMove) + EgtMove( vCrvs[i+1], LayerParams.vtSlicing * dMove, GDB_RT.GLOB) EgtSpiralizeCurve( vCrvs[i+1], dDelta) end local vSurfs = {} @@ -166,7 +166,7 @@ local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) -- creazione del mezzo disco iniziale local nCap1 = CreateSpiralVaseCap( nSectId, - vtS, nSolidGrp) -- creazione del mezzo disco finale - local vtDir2 = EgtEV( nCrvCopy) + local vtDir2 = EgtEV( nCrvCopy, GDB_ID.ROOT) vtDir2:rotate( LayerParams.vtSlicing, 90) local nSectE = CreateSection( ptE, vtDir2, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nGrpTmp) local nCap2 = CreateSpiralVaseCap( nSectE, vtE, nSolidGrp) @@ -181,11 +181,11 @@ end ---------------------------------------------------------------------- local function CreateStandardSolid( nCrvId, nSolidGrp, LayerParams, dStrand) - local ptS = EgtSP( nCrvId) - local vtS = EgtSV( nCrvId) + local ptS = EgtSP( nCrvId, GDB_ID.ROOT) + local vtS = EgtSV( nCrvId, GDB_ID.ROOT) vtS:rotate( LayerParams.vtSlicing, 90) - local ptE = EgtEP( nCrvId) - local vtE = EgtEV( nCrvId) + local ptE = EgtEP( nCrvId, GDB_ID.ROOT) + local vtE = EgtEV( nCrvId, GDB_ID.ROOT) vtE:rotate( LayerParams.vtSlicing, -90) -- creazione del solido aperto (tubo) local nSectId = CreateSection( ptS, vtS, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nSolidGrp) @@ -194,12 +194,12 @@ local function CreateStandardSolid( nCrvId, nSolidGrp, LayerParams, dStrand) if not nSrfId then return nil end -- creazione del mezzo disco iniziale local nSectS = CreateHalfSection( ptS, vtS, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nSolidGrp) - local nSrfS = EgtSurfTmByScrewing( nSolidGrp, nSectS, ptS, LayerParams.vtSlicing, 180, 0, false, s_dTol) + local nSrfS = EgtSurfTmByScrewing( nSolidGrp, nSectS, ptS, LayerParams.vtSlicing, 180, 0, false, s_dTol, GDB_RT.GLOB) EgtErase( nSectS) if not nSrfS then return nil end -- creazione del mezzo disco finale local nSectE = CreateHalfSection( ptE, vtE, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nSolidGrp) - local nSrfE = EgtSurfTmByScrewing( nSolidGrp, nSectE, ptE, LayerParams.vtSlicing, 180, 0, false, s_dTol) + local nSrfE = EgtSurfTmByScrewing( nSolidGrp, nSectE, ptE, LayerParams.vtSlicing, 180, 0, false, s_dTol, GDB_RT.GLOB) EgtErase( nSectE) if not nSrfE then return nil end -- unione delle tre superfici @@ -268,7 +268,7 @@ local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams) nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams, LayerParams.dStrand + 100 * GEO.EPS_SMALL) if not nSrfId then -- ritento spezzando la curva - local nGrp = EgtGroup( nSolidGrp, Frame3d( ORIG(), LayerParams.vtSlicing)) + local nGrp = EgtGroup( nSolidGrp, Frame3d( ORIG(), LayerParams.vtSlicing), GDB_RT.GLOB) EgtRelocateGlob( nGuideId, nGrp) EgtApproxCurve( nGuideId, GDB_CA.LINES, 100 * GEO.EPS_SMALL) EgtRelocateGlob( nGuideId, nSolidGrp) From e18e57e7c26ee34fab40299199e9227fc7338913 Mon Sep 17 00:00:00 2001 From: DarioS Date: Wed, 2 Nov 2022 15:19:09 +0100 Subject: [PATCH 28/79] 3dPrinting : - modifiche e migliorie per calcolo solidi con uso della nuova funzione lua EgtSurfTmRectSwept. --- LuaLibs/RunCalcSolids.lua | 186 +++++++++++++++++--------------------- 1 file changed, 84 insertions(+), 102 deletions(-) diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index d38c36b..f6f1b2c 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -1,4 +1,4 @@ --- RunCalcSolids.lua by Egaltech s.r.l. 2022/10/10 +-- RunCalcSolids.lua by Egaltech s.r.l. 2022/11/02 -- Calcolo percorsi di lavoro per Stampa 3d -- Tabella per definizione modulo @@ -13,7 +13,7 @@ EgtOutLog( ' RunCalcSolids started', 1) local AMD = require( 'AddManData') -------------------------------------------------------------------- -s_dTol = 0.1 +local s_dTol = 0.1 --------------------------------------------------------------------- local function GetLayerParamsForSolidCalc( nPartId) @@ -30,22 +30,6 @@ local function CalcSectionParams( dStrand, dH) local dL = dStrand local dLm = dStrand / 10 local dHm = dH / 6 - -- recupero offset - --local dOffs = EgtGetInfo( s_nPartId, KEY_OFFSET_SLICE, 'd') - dOffs = 0 - if dOffs and dOffs > 0 then - -- calcolo area originale - local dArea = ( dL * dH) - ( dLm * dHm) - local dLM = ( dArea / dH) - ( dLm / 6) - if dOffs / 2 <= ( dL - dLM) then - dL = dL - dOffs / 2 - dLm = dL / 10 - dHm = (( dL * dH) - dArea) / dLm - else - EgtOutLog( 'Strand section not calculated on area. Too much overlap?') - end - end - local dD1 = 0.5 * dL - dLm local dD2 = 0.5 * dL - dD1 local dD3 = dHm @@ -180,30 +164,10 @@ end ---------------------------------------------------------------------- local function CreateStandardSolid( nCrvId, nSolidGrp, LayerParams, dStrand) - - local ptS = EgtSP( nCrvId, GDB_ID.ROOT) - local vtS = EgtSV( nCrvId, GDB_ID.ROOT) - vtS:rotate( LayerParams.vtSlicing, 90) - local ptE = EgtEP( nCrvId, GDB_ID.ROOT) - local vtE = EgtEV( nCrvId, GDB_ID.ROOT) - vtE:rotate( LayerParams.vtSlicing, -90) - -- creazione del solido aperto (tubo) - local nSectId = CreateSection( ptS, vtS, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nSolidGrp) - local nSrfId = EgtSurfTmSwept( nSolidGrp, nSectId, nCrvId, false, s_dTol) - EgtErase( nSectId) - if not nSrfId then return nil end - -- creazione del mezzo disco iniziale - local nSectS = CreateHalfSection( ptS, vtS, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nSolidGrp) - local nSrfS = EgtSurfTmByScrewing( nSolidGrp, nSectS, ptS, LayerParams.vtSlicing, 180, 0, false, s_dTol, GDB_RT.GLOB) - EgtErase( nSectS) - if not nSrfS then return nil end - -- creazione del mezzo disco finale - local nSectE = CreateHalfSection( ptE, vtE, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nSolidGrp) - local nSrfE = EgtSurfTmByScrewing( nSolidGrp, nSectE, ptE, LayerParams.vtSlicing, 180, 0, false, s_dTol, GDB_RT.GLOB) - EgtErase( nSectE) - if not nSrfE then return nil end - -- unione delle tre superfici - return EgtSurfTmBySewing( nSolidGrp, { nSrfId, nSrfS, nSrfE}) + + local dD1, dD2, dD3, dD4 = CalcSectionParams( dStrand, LayerParams.dLayHeight) + local nSrfId = EgtSurfTmRectSwept( nSolidGrp, dStrand, LayerParams.dLayHeight, dD2, dD3, nCrvId, GDB_RSCT.BEVEL, s_dTol) + return nSrfId end -------------------------------------------------------------------------------------- @@ -216,7 +180,7 @@ local function CreateSolid( nCrvId, nSolidGrp, LayerParams, dStrand) end --------------------------------------------------------------------- -local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams) +local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams, nLayer) local nType = EgtGetInfo( nCrvId, KEY_TYPE, 'i') if nType == TYPE.WIPE then return true end @@ -260,44 +224,57 @@ local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams) for nInd = 0, nParts - 1 do local nGuideId = nId + nInd local nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams, LayerParams.dStrand - 5 * GEO.EPS_SMALL) - - if not nSrfId then - -- ritento con sezione leggermente modificata - nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams, LayerParams.dStrand - 100 * GEO.EPS_SMALL) - if not nSrfId then - nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams, LayerParams.dStrand + 100 * GEO.EPS_SMALL) - if not nSrfId then - -- ritento spezzando la curva - local nGrp = EgtGroup( nSolidGrp, Frame3d( ORIG(), LayerParams.vtSlicing), GDB_RT.GLOB) - EgtRelocateGlob( nGuideId, nGrp) - EgtApproxCurve( nGuideId, GDB_CA.LINES, 100 * GEO.EPS_SMALL) - EgtRelocateGlob( nGuideId, nSolidGrp) - local nFirstCrv, nCrvNbr = EgtSplitCurveAtCorners( nGuideId, 30) - if nFirstCrv and nCrvNbr > 1 then - local nSrfIds = {} - for nInd2 = 0, nCrvNbr-1 do - local nSrfId2 = CreateSolid( nFirstCrv + nInd2, nSolidGrp, LayerParams, LayerParams.dStrand - 100 * GEO.EPS_SMALL) - EgtErase( nFirstCrv + nInd2) - if nSrfId2 then - table.insert( nSrfIds, nSrfId2) - end - end - if #nSrfIds == nCrvNbr then - nSrfId = EgtSurfTmBySewing( nSolidGrp, nSrfIds) - end - else - EgtErase( nFirstCrv) + if not nSrfId then + EgtOutLog( 'Warning : CreateSolid failed '.. '(layer '..tostring( nLayer)..', curve '..tostring( nCrvId)..')') + -- se non ultima, provo a spostare l'estremità finale + if nInd < nParts - 1 then + local nCopyId = EgtCopy( nGuideId + 1, nGuideId, GDB_IN.AFTER) + if nCopyId then + local LEN_TRIM = 10 + local bOk1 = EgtTrimCurveEndAtLen( nCopyId, LEN_TRIM) + local bOk2 = EgtAddCurveCompoCurve( nGuideId, nCopyId) + local bOk3 = EgtTrimCurveStartAtLen( nGuideId + 1, LEN_TRIM) + nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams, LayerParams.dStrand - 5 * GEO.EPS_SMALL) + if not nSrfId then + nSrfId = CreateSolid( nGuideId, nSolidGrp, LayerParams, LayerParams.dStrand - 50 * GEO.EPS_SMALL) end - EgtErase( nGrp) end end + -- ritento spezzando la curva + if not nSrfId then + EgtOutLog( 'Warning : CreateSolid_2 failed') + local nGrp = EgtGroup( nSolidGrp, Frame3d( ORIG(), LayerParams.vtSlicing), GDB_RT.GLOB) + EgtRelocateGlob( nGuideId, nGrp) + EgtApproxCurve( nGuideId, GDB_CA.LINES, 100 * GEO.EPS_SMALL) + EgtRelocateGlob( nGuideId, nSolidGrp) + local nFirstCrv, nCrvNbr = EgtSplitCurveAtCorners( nGuideId, 30) + if nFirstCrv and nCrvNbr > 1 then + local nSrfIds = {} + for nInd2 = 0, nCrvNbr-1 do + local nSrfId2 = CreateSolid( nFirstCrv + nInd2, nSolidGrp, LayerParams, LayerParams.dStrand - 50 * GEO.EPS_SMALL) + EgtErase( nFirstCrv + nInd2) + if nSrfId2 then + table.insert( nSrfIds, nSrfId2) + end + end + if #nSrfIds == nCrvNbr then + nSrfId = EgtSurfTmBySewing( nSolidGrp, nSrfIds) + else + EgtOutLog( 'Warning : CreateSolid_3 failed') + end + else + EgtErase( nFirstCrv) + end + EgtErase( nGrp) + end end - + if nSrfId then EgtSetColor( nSrfId, Color) EgtSetInfo( nSrfId, KEY_TYPE, nType) else - bOk = false + bOk = false + EgtOutLog( 'Warning : CreateSolid_Sewing failed') end EgtErase( nGuideId) end @@ -307,37 +284,41 @@ end --------------------------------------------------------------------- function RunCalcSolids.Exec() - + + -- per determinare il tempo di calcolo + EgtStartCounter() + local nPartIndex = 1 local nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) or EgtGetFirstNameInGroup( GDB_ID.ROOT, PART) while nPartId do - + if EgtGetInfo( nPartId, KEY_PART_ON_TABLE, 'b') then -- verifico se necessario calcolare il solido local bCalcSolid = EgtGetInfo( nPartId, KEY_CALC_SOLIDS, 'b') or false - + if bCalcSolid then - + -- recupero i suoi slice local vLayIds = EgtGetNameInGroup( nPartId, SLICE_LAYER .. '*') if not vLayIds then EgtOutBox( 'No sliced part in this project!', 'Error', 'ERROR') return end - + EgtSetInfo( nPartId, KEY_HAS_SOLIDS, 1) - - local vErr = {} + -- recupero i parametri necessari al calcolo dei solidi local LayerParams = GetLayerParamsForSolidCalc( nPartId) - + for nIdx = 1, #vLayIds do -- flag di interruzione perchè trovati solidi già ok local bSolidsOk = false + -- indice layer (per log) + local nLayer = EgtGetInfo( vLayIds[ nIdx], KEY_SLICE_NBR, 'i') -- scorro tutti i gruppi di contorni local nCrvGrpId = EgtGetFirstNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*") or GDB_ID.NULL while nCrvGrpId ~= GDB_ID.NULL do - + -- recupero il gruppo dei percorsi utensile local nTPathGrpId = EgtGetFirstNameInGroup( nCrvGrpId, TOOLPATH_GRP) or GDB_ID.NULL if nTPathGrpId == GDB_ID.NULL then @@ -351,43 +332,39 @@ function RunCalcSolids.Exec() nSolidGrpId = EgtGroup( nCrvGrpId) EgtSetName( nSolidGrpId, SOLID_GRP) EgtSetLevel( nSolidGrpId, GDB_LV.TEMP) - -- scorro le curve del percorso utensile local nId = EgtGetFirstInGroup( nTPathGrpId) while nId do - local bOk = CreateSolidFromCurve( nId, nSolidGrpId, LayerParams) - if not bOk then - table.insert( vErr, nIdx) - end + local bOk = CreateSolidFromCurve( nId, nSolidGrpId, LayerParams, nLayer) nId = EgtGetNext( nId) end - - -- processo gli eventi - if ( nIdx % 20) == 0 then - EgtDraw() - end else bSolidsOk = true break end - + --passo al gruppo di contorni successivo nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") or GDB_ID.NULL end if bSolidsOk then break end - EgtDraw() + local nStep = 10 + if nIdx > 400 then + nStep = 80 + elseif nIdx > 200 then + nStep = 40 + elseif nIdx > 100 then + nStep = 20 + end + if ( nIdx % nStep) == 0 then + EgtDraw() + end if EgtProcessEvents( EgtIf( PRINT, 400, 0) + nIdx / #vLayIds * 100, 0) == 1 then return end end - - -- eventuale segnalazione errori - for i = 1, #vErr do - EgtOutLog( 'Error on solid creation (layer ' .. vErr[i] .. ') - SolidCalc') - end - + -- eventuale aggiornamento delle ViewInfo local nViewId = EgtGetFirstNameInGroup( GDB_ID.ROOT, VIEWPARAMS) if nViewId then @@ -396,11 +373,16 @@ function RunCalcSolids.Exec() end end - + nPartIndex = nPartIndex + 1 nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) or EgtGetNextName( nPartId, PART) end - + + EgtDraw() + + -- report tempo di calcolo in log + EgtOutLog( string.format( ' CalcSolidsTime = %.2f ms', EgtStopCounter())) + end --------------------------------------------------------------------- From 15c656315770bb78d9762e28cadbcb25a67a09b4 Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 2 Nov 2022 15:46:27 +0100 Subject: [PATCH 29/79] 3dPrinting : - in spiral vase corretta gestione primo layer. --- LuaLibs/CalcToolPath.lua | 56 +++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index c40caa3..294bdee 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -955,6 +955,17 @@ local function SpiralVase( vLayIds, dCorrZ, LayerParams) local nOldId local bFirst = true + local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') + + -- copio ultimo layer + if nSlicingType ~= SLICING_TYPE.DEG45 then + local nNewLay = EgtCopyGlob( vLayIds[#vLayIds], vLayIds[#vLayIds], GDB_IN.AFTER) + table.insert( vLayIds, nNewLay) + local sOldIdx = string.sub( EgtGetName( vLayIds[#vLayIds]), 6) + local nNewIdx = tonumber( sOldIdx) + 1 + EgtSetName( nNewLay, SLICE_LAYER .. EgtNumToString( nNewIdx)) + EgtMove( nNewLay, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) + end -- ciclo sui layer for nIdx = 1, #vLayIds do @@ -986,16 +997,16 @@ local function SpiralVase( vLayIds, dCorrZ, LayerParams) end -- creo il percorso di lavoro : - -- copio le curve, le ordino, le oriento e le muovo in Z local nEntId = EgtGetFirstInGroup( nPathGrpId) while nEntId do local nNewEntId = EgtCopyGlob( nEntId, nTpathGrpId, GDB_IN.LAST_SON) - + -- correggo posizione in Z ( per essere sicuri di appoggiare sul piano) EgtMove( nNewEntId, dCorrZ * Z_AX(), GDB_RT.GLOB) - -- mi sposto dell'altezza layer - EgtMove( nNewEntId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) - + if nSlicingType == SLICING_TYPE.DEG45 then + -- eventuale spostamento dell'altezza layer + EgtMove( nNewEntId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) + end EgtModifyCurveExtrusion( nNewEntId, LayerParams.vtSlicing, GDB_RT.GLOB) -- eventuale inversione if LayerParams.bInvert then @@ -1004,32 +1015,31 @@ local function SpiralVase( vLayIds, dCorrZ, LayerParams) end EgtSetColor( nNewEntId, EgtStdColor('GRAY')) - -- se primo layer devo farne copia + -- se primo layer if bFirst and nNewEntId then - local nFirstCrv = EgtCopyGlob( nNewEntId, nTpathGrpId, GDB_IN.FIRST_SON) - EgtModifyCurveExtrusion( nFirstCrv, LayerParams.vtSlicing, GDB_RT.GLOB) + -- mi sposto dell'altezza layer + EgtMove( nNewEntId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) -- eventuale lead in if LayerParams.nLeadInType ~= LEAD_TYPE.NONE then - EgtTrimCurveStartAtLen( nFirstCrv, LayerParams.dOffsetLP) - AddLeadIn( nFirstCrv, LayerParams, nTpathGrpId) + EgtTrimCurveStartAtLen( nNewEntId, LayerParams.dOffsetLP) + AddLeadIn( nNewEntId, LayerParams, nTpathGrpId) end - nOldId = nNewEntId bFirst = false - end - - -- modifico lo start point per collegarlo alla curva precedente - local ptOld = EgtEP( nOldId) - if dist( EgtSP( nNewEntId), ptOld) < LayerParams.dStrand + 10 then - EgtChangeClosedCurveStartPoint( nNewEntId, ptOld) - EgtModifyCurveStartPoint( nNewEntId, ptOld) else - EgtOutLog( 'Warning : in spiral vase mode no link betweeen toolpaths (layer '..tostring( nIdx)..') - CalcToolPath') - -- aggiungo uscita, coasting e wipe sulla curva precedente - AddSpiralVaseLeadOut( nOldId, LayerParams) + -- modifico lo start point per collegarlo alla curva precedente + local ptOld = EgtEP( nOldId, GDB_ID.ROOT) + if dist( EgtSP( nNewEntId, GDB_ID.ROOT), ptOld) < LayerParams.dStrand + 10 then + EgtChangeClosedCurveStartPoint( nNewEntId, ptOld, GDB_RT.GLOB) + EgtModifyCurveStartPoint( nNewEntId, ptOld, GDB_RT.GLOB) + else + EgtOutLog( 'Warning : in spiral vase mode no link betweeen toolpaths (layer '..tostring( nIdx)..') - CalcToolPath') + -- aggiungo uscita, coasting e wipe sulla curva precedente + AddSpiralVaseLeadOut( nOldId, LayerParams) + end + EgtSpiralizeCurve( nNewEntId, LayerParams.dLayHeight) end nOldId = nNewEntId - EgtSpiralizeCurve( nNewEntId, LayerParams.dLayHeight) nEntId = EgtGetNext( nEntId) end end @@ -1042,7 +1052,7 @@ local function SpiralVase( vLayIds, dCorrZ, LayerParams) -- aggiungo uscita, coasting e wipe su ultima curva AddSpiralVaseLeadOut( nOldId, LayerParams) - + end --------------------------------------------------------------------- From 549f38822797820c868074813370e4847f239512 Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 3 Nov 2022 09:30:00 +0100 Subject: [PATCH 30/79] 3dPrinting : - in spiral vase corrette info dell'ultimo layer. --- LuaLibs/CalcToolPath.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 294bdee..52ae064 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -961,10 +961,14 @@ local function SpiralVase( vLayIds, dCorrZ, LayerParams) if nSlicingType ~= SLICING_TYPE.DEG45 then local nNewLay = EgtCopyGlob( vLayIds[#vLayIds], vLayIds[#vLayIds], GDB_IN.AFTER) table.insert( vLayIds, nNewLay) + EgtMove( nNewLay, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) + -- aggiorno nome e info local sOldIdx = string.sub( EgtGetName( vLayIds[#vLayIds]), 6) local nNewIdx = tonumber( sOldIdx) + 1 EgtSetName( nNewLay, SLICE_LAYER .. EgtNumToString( nNewIdx)) - EgtMove( nNewLay, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) + EgtSetInfo( nNewLay, KEY_SLICE_NBR, nNewIdx) + local dZOld = EgtGetInfo( vLayIds[#vLayIds], KEY_SLICE_Z, 'd') or 0 + EgtSetInfo( nNewLay, KEY_SLICE_Z, dZOld + LayerParams.dLayHeight) end -- ciclo sui layer From 4d741346711f9a429e3eb598228d312d23fda53f Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 3 Nov 2022 11:11:23 +0100 Subject: [PATCH 31/79] 3dPrinting : - correzione lead out setti. --- LuaLibs/CalcToolPath.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 52ae064..76eb9a2 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -643,7 +643,7 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n -- recupero la curva di offset su cui calcolare lead out local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) while nCrvOffs do - local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE, GDB_RT.GLOB) + local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE, GEO.EPS_SMALL, GDB_RT.GLOB) if dParE then local nCrvLO From f834d006f66c6dddb56ea5be935395a8cd3f1a1f Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 7 Nov 2022 10:09:12 +0100 Subject: [PATCH 32/79] 3dPrinting : - gestione uscite differenziate per regioni con diverse passate. --- LuaLibs/AddManData.lua | 4 + LuaLibs/CalcPaths.lua | 166 ++++++++++++++++++++++++++------------- LuaLibs/CalcSlices.lua | 14 +++- LuaLibs/CalcToolPath.lua | 22 ++++-- 4 files changed, 142 insertions(+), 64 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index f6ad970..aeee3b3 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -104,6 +104,9 @@ KEY_SHELL_NBR_DIFF = "ShellNbrDifference" KEY_SHELL_NBR_COASTING = "ShellNbrCoasting" KEY_SHELL_NBR_WIPE = "ShellNbrWipe" KEY_SHELL_NBR_WIPE_DIR = "ShellNbrWipeDir" +KEY_EXTRA_SHELL_COASTING = "ExtraShellCoasting" +KEY_EXTRA_SHELL_WIPE = "ExtraShellWipe" +KEY_EXTRA_SHELL_WIPE_DIR = "ExtraShellWipeDir" -- Solidi ausiliari KEY_AUX_SOLIDS_INFILL = "AuxSolidsInfill" @@ -133,6 +136,7 @@ KEY_ZIG_ZAG_DIR = "ZigZagDir" KEY_INVERTED_CRV = "InvertedCrv" KEY_CLOSED_CRV = "ClosedCrv" KEY_ASSOCIATED_SURF = "AssociatedSurf" +KEY_ASSOCIATED_CRVS = "AssociatedCrvs" KEY_HAS_SOLIDS = "Solids" SLICING_TYPE = { diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index f07e5ca..19ddcf8 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -32,7 +32,11 @@ local function GetLayerParamsForPathCalc() LayerParams.bPrintInvert = ( EgtGetInfo( s_nPartId, KEY_PRINT_DIRECTION, 'i') == PRINT_DIRECTION.CW) -- parametri costolature LayerParams.bRibsInvertOrder = EgtGetInfo( s_nPartId, KEY_RIBS_INVERT_ORDER, 'b') - + -- parametri regioni con diverse passate + LayerParams.dShellNbrCoasting = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_COASTING, 'd') + LayerParams.dShellNbrWipe = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE, 'd') + LayerParams.dShellNbrWipeDir = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE_DIR, 'd') + -- eventuale modifica dei parametri per gestire correttamente il caso spiral vase if LayerParams.bSpiralVase then LayerParams.nShellsNbr = 1 @@ -1165,6 +1169,8 @@ local function CreateShellNbrSurfaces( nGrp, nShellsNbr) EgtErase( nSrfTmp) end EgtSetName( nSrfId, SHELL_NBR_SURF .. tostring( nDiff)) + -- salvo come info gli id delle curve che la definiscono + EgtSetInfo( nSrfId, KEY_ASSOCIATED_CRVS, vCrvIds) end end @@ -1190,10 +1196,68 @@ local function ComputeMaxShellNbrDiff( nSrf, nShellNbrSurfGrp) return nMaxShellNbrDiff end +---------------------------------------------------------------- +local function FindExtraShellRetractionParams( ptP, vIds, LayerParams) + + local dCoasting, dWipe, dWipeDir + -- cerco la curva sulla quale si ferma + for i = 1, #vIds do + local dPar = EgtCurveParamAtPoint( vIds[i], ptP, 10 * GEO.EPS_SMALL) + if dPar then + dCoasting = EgtGetInfo( vIds[i], KEY_SHELL_NBR_COASTING, 'd') + dWipe = EgtGetInfo( vIds[i], KEY_SHELL_NBR_WIPE, 'd') + dWipeDir = EgtGetInfo( vIds[i], KEY_SHELL_NBR_WIPE_DIR, 'd') + break + end + end + + if not dCoasting then + -- se non ho trovato una curva considero i parametri generali + return LayerParams.dShellNbrCoasting, LayerParams.dShellNbrWipe, LayerParams.dShellNbrWipeDir + else + return dCoasting, dWipe, dWipeDir + end +end + +----------------------------------------------------------------- +local function TrimOuterCurveForExtraShellCalc( nOuterCrv, nSrfDiff, nGrpId, vPtStart, LayerParams) + + local nCopy = EgtCopyGlob( nOuterCrv, nGrpId) + ModifyStartPoint( nCopy, vPtStart) + -- recupero tutte le curve delle ShellNumber coinvolte + local vShellNbrCrvs = EgtGetInfo( nSrfDiff, KEY_ASSOCIATED_CRVS, 'vi') + + -- trim della curva + local nCrv, nCnt = EgtTrimCurveWithRegion( nCopy, nSrfDiff, false, false) + if nCrv and nCnt ~= 0 then + + -- verifico se prima e ultima curva possono essere unite + if nCnt > 1 and AreSamePointApprox( EgtEP( nCrv + nCnt - 1), EgtSP( nCrv)) then + local nNewId = EgtCurveCompo( nGrpId, { nCrv + nCnt - 1, nCrv}) + EgtChangeId( nNewId, nCrv) + nCnt = nCnt - 1 + end + + -- assegno le info in base alla curva che li delimita + for nId = nCrv, nCrv + nCnt - 1 do + local ptS = EgtSP( nId) + local dCoastingS, dWipeS, dWipeDirS = FindExtraShellRetractionParams( ptS, vShellNbrCrvs, LayerParams) + local ptE = EgtEP( nId) + local dCoastingE, dWipeE, dWipeDirE = FindExtraShellRetractionParams( ptE, vShellNbrCrvs, LayerParams) + EgtSetInfo( nId, KEY_EXTRA_SHELL_COASTING, {dCoastingS, dCoastingE}) + EgtSetInfo( nId, KEY_EXTRA_SHELL_WIPE, {dWipeS, dWipeE}) + EgtSetInfo( nId, KEY_EXTRA_SHELL_WIPE_DIR, {dWipeDirS, dWipeDirE}) + end + return nCrv, nCnt + else + return nOuterCrv, 0 + end +end + -------------------------------------------------------------------- local function UpdateTotalShellSurf( nSrf, nCrv, dStrand, nGrpId) - local nSrfExtraShell = EgtSurfFrFatCurve( nGrpId, nCrv, dStrand - s_dOffsCorr, false) + local nSrfExtraShell = EgtSurfFrFatCurve( nGrpId, nCrv, dStrand - s_dOffsCorr, false) if nSrfExtraShell then local vtSrfN = EgtSurfFrNormVersor( nSrf, GDB_ID.ROOT) local vtSrfExShN = EgtSurfFrNormVersor( nSrfExtraShell, GDB_ID.ROOT) @@ -1328,68 +1392,58 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d local nSrfDiff = EgtGetFirstNameInGroup( nShellNbrGrp, SHELL_NBR_SURF .. tostring( nInd)) local nOuterCrv = EgtGetFirstNameInGroup( nCrvGrpId, OUTER_CRV) while nOuterCrv do - local nCopy = EgtCopyGlob( nOuterCrv, nGrpId) - ModifyStartPoint( nCopy, vPtStart) + -- trim della curva con la superficie + local nTrimCrv, nTrimCnt = TrimOuterCurveForExtraShellCalc( nOuterCrv, nSrfDiff, nGrpId, vPtStart, LayerParams) - -- trim della curva con la regione con diverso numero di passate - local nTrimCrv, nTrimCnt = EgtTrimCurveWithRegion( nCopy, nSrfDiff, false, false) - if nTrimCnt ~= 0 then - -- verifico se prima e ultima curva possono essere unite - if nTrimCnt > 1 and AreSamePointApprox( EgtEP( nTrimCrv + nTrimCnt - 1), EgtSP( nTrimCrv)) then - local nNewId = EgtCurveCompo( nGrpId, { nTrimCrv + nTrimCnt - 1, nTrimCrv}) - EgtChangeId( nNewId, nTrimCrv) - nTrimCnt = nTrimCnt - 1 - end - - for nCrvT = nTrimCrv, nTrimCrv + nTrimCnt - 1 do - -- calcolo offset della curva ( è il percorso della shell) - EgtModifyCurveExtrusion( nCrvT, LayerParams.vtSlicing, GDB_RT.GLOB) - local nOffs, nOffsCnt = EgtOffsetCurveAdv( nCrvT, - dOffs) - EgtErase( nCrvT) - for nCrvOffs = nOffs, nOffs + nOffsCnt - 1 do - -- trim con la regione già occupata dal altre shell - local nCrv, nCnt = EgtTrimCurveWithRegion( nCrvOffs, nSrfTrim, true, true) - if nCrv and nCnt ~= 0 then - for nId = nCrv, nCrv + nCnt - 1 do - local dLen = EgtCurveLength( nId) - local bValid = true - if EgtCurveIsClosed( nId) then - bValid = VerifyPath( nId, LayerParams.dStrand, LayerParams.vtSlicing, nGrpId) - end - -- verifico se soddisfa vincolo sulla lunghezza - if dLen > MIN_LEN and bValid then - EgtModifyCurveExtrusion( nId, LayerParams.vtSlicing, GDB_RT.GLOB) - EgtSetName( nId, EXTRA_SHELL_CRV .. tostring( nMaxShellNbrDiff - nInd + 1)) - if nInd == LayerParams.nShellsNbr then - EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_OUTER_SHELL) - else - EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_SHELL) - end - - -- aggiorno la superficie occupata dalle shell con quella appena calcolata (tenendo conto dell'overlap) - UpdateTotalShellSurf( nSrfTrim, nId, ( 1 - LayerParams.nStrandOverlap / 100) * LayerParams.dStrand, nGrpId) - -- se la superficie si annulla non è possibile realizzare altro, quindi cancello tutte le curve rimaste - if EgtSurfFrChunkCount( nSrfTrim) == 0 then - for j = nId + 1, nCrv + nCnt - 1 do - EgtErase( j) - end - for j = nCrvT + 1, nTrimCrv + nTrimCnt - 1 do - EgtErase( j) - end - -- aggiorno superficie - EgtSurfFrOffset( nSrfTrim, - LayerParams.nStrandOverlap / 100 * LayerParams.dStrand) - -- riordino le curve appena create e se possibile creo percorsi chiusi - ReorderExtraShells( nGrpId, LayerParams.dStrand, vPtStart, LayerParams.bPrintInvert) - return - end + for nCrvT = nTrimCrv, nTrimCrv + nTrimCnt - 1 do + -- calcolo offset della curva ( è il percorso della shell) + EgtModifyCurveExtrusion( nCrvT, LayerParams.vtSlicing, GDB_RT.GLOB) + local nOffs, nOffsCnt = EgtOffsetCurveAdv( nCrvT, - dOffs) + EgtErase( nCrvT) + for nCrvOffs = nOffs, nOffs + nOffsCnt - 1 do + -- trim con la regione già occupata dal altre shell + local nCrv, nCnt = EgtTrimCurveWithRegion( nCrvOffs, nSrfTrim, true, true) + if nCrv and nCnt ~= 0 then + for nId = nCrv, nCrv + nCnt - 1 do + local dLen = EgtCurveLength( nId) + local bValid = true + if EgtCurveIsClosed( nId) then + bValid = VerifyPath( nId, LayerParams.dStrand, LayerParams.vtSlicing, nGrpId) + end + -- verifico se soddisfa vincolo sulla lunghezza + if dLen > MIN_LEN and bValid then + EgtModifyCurveExtrusion( nId, LayerParams.vtSlicing, GDB_RT.GLOB) + EgtSetName( nId, EXTRA_SHELL_CRV .. tostring( nMaxShellNbrDiff - nInd + 1)) + if nInd == LayerParams.nShellsNbr then + EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_OUTER_SHELL) else - EgtErase( nId) + EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_SHELL) end + + -- aggiorno la superficie occupata dalle shell con quella appena calcolata (tenendo conto dell'overlap) + UpdateTotalShellSurf( nSrfTrim, nId, ( 1 - LayerParams.nStrandOverlap / 100) * LayerParams.dStrand, nGrpId) + -- se la superficie si annulla non è possibile realizzare altro, quindi cancello tutte le curve rimaste + if EgtSurfFrChunkCount( nSrfTrim) == 0 then + for j = nId + 1, nCrv + nCnt - 1 do + EgtErase( j) + end + for j = nCrvT + 1, nTrimCrv + nTrimCnt - 1 do + EgtErase( j) + end + -- aggiorno superficie + EgtSurfFrOffset( nSrfTrim, - LayerParams.nStrandOverlap / 100 * LayerParams.dStrand) + -- riordino le curve appena create e se possibile creo percorsi chiusi + ReorderExtraShells( nGrpId, LayerParams.dStrand, vPtStart, LayerParams.bPrintInvert) + return + end + else + EgtErase( nId) end end end end end + nOuterCrv = EgtGetNextName( nOuterCrv, OUTER_CRV) end end diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 3c0cbd4..f98da32 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -119,6 +119,18 @@ local function GetRibParams( nId) return RibParam end +------------------------------------------------------------------- +local function GetShellNumberParams( nId) + + local ShellNumberParam = {} + ReadParam( nId, KEY_SHELL_NBR_DIFF, 'i', ShellNumberParam) + ReadParam( nId, KEY_SHELL_NBR_COASTING, 'd', ShellNumberParam) + ReadParam( nId, KEY_SHELL_NBR_WIPE, 'd', ShellNumberParam) + ReadParam( nId, KEY_SHELL_NBR_WIPE_DIR, 'd', ShellNumberParam) + + return ShellNumberParam +end + -------------------------------------------------------------------- local function GetAuxSolidsParams( nId) @@ -166,7 +178,7 @@ local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName) 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') + vParams = GetShellNumberParams( vIds[i]) if vParams[KEY_SHELL_NBR_DIFF] == 0 then bToBeDone = false end elseif nType == TYPE.AUX_SOLID then vParams = GetAuxSolidsParams( vIds[i]) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 76eb9a2..d70d05e 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -43,10 +43,6 @@ local function GetLayerParamsForToolPathCalc() LayerParams.dTDiam = EgtGetInfo( s_nPartId, KEY_TOOL_DIAM, 'd') -- Parametri costolature LayerParams.bRibsLink = EgtGetInfo( s_nPartId, KEY_RIBS_LINK, 'b') - -- Parametri regioni con diverse passate - LayerParams.dShellNbrCoasting = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_COASTING, 'd') - LayerParams.dShellNbrWipe = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE, 'd') - LayerParams.dShellNbrWipeDir = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE_DIR, 'd') return LayerParams end @@ -1204,11 +1200,23 @@ function CalcToolPath.Exec( nPartId) if EgtGetName( nLastId or GDB_ID.NULL) == LEAD_OUT_CRV then nLastId = EgtGetPrev( nLastId) end while nId do -- recupero i parametri + local dCoastingLen, dWipeLen, dWipeDir local nType = EgtGetInfo( nId, KEY_TYPE, 'i') local bClosed = EgtGetInfo( nId, KEY_CLOSED_CRV, 'b') or false - local dCoastingLen = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrCoasting, LayerParams.dCoastingLen) - local dWipeLen = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrWipe, LayerParams.dWipeLen) - local dWipeDir = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrWipeDir, LayerParams.dWipeDir) + if ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed then + local bInverted = EgtGetInfo( nId, KEY_INVERTED_CRV, 'b') or false + local vCoastLen = EgtGetInfo( nId, KEY_EXTRA_SHELL_COASTING, 'vd') + local vWipeLen = EgtGetInfo( nId, KEY_EXTRA_SHELL_WIPE, 'vd') + local vWipeDir = EgtGetInfo( nId, KEY_EXTRA_SHELL_WIPE_DIR, 'vd') + -- se curva è stata invertita devo prendere le info legate a quello che era il suo punto di inizio, altrimenti prendo le info legate al punto finale + dCoastingLen = EgtIf( bInverted, vCoastLen[1], vCoastLen[2]) + dWipeLen = EgtIf( bInverted, vWipeLen[1], vWipeLen[2]) + dWipeDir = EgtIf( bInverted, vWipeDir[1], vWipeDir[2]) + else + dCoastingLen = LayerParams.dCoastingLen + dWipeLen = LayerParams.dWipeLen + dWipeDir = LayerParams.dWipeDir + end if nId == nLastId then AddRetractionOnLastCrv( nId, nTpathGrpId, LayerParams, dCoastingLen, dWipeLen, dWipeDir) From 5494e92e9de16fe5055ad9cdcebc54b772476a67 Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 11 Nov 2022 09:57:04 +0100 Subject: [PATCH 33/79] =?UTF-8?q?3dPrinting=20:=20-=20aggiunta=20la=20poss?= =?UTF-8?q?ibilit=C3=A0=20di=20collegare=20solo=20alcuni=20setti=20(=20pri?= =?UTF-8?q?ma=20versione)=20-=20correzioni=20varie.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LuaLibs/AddManData.lua | 1 + LuaLibs/CalcPaths.lua | 98 ++++++++++++++++++++++++++-------------- LuaLibs/CalcSlices.lua | 2 +- LuaLibs/CalcToolPath.lua | 25 ++++++---- LuaLibs/RunSlicing.lua | 3 +- 5 files changed, 83 insertions(+), 46 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index aeee3b3..4f14bc7 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -87,6 +87,7 @@ KEY_RIBS_SHELLS_NBR = "RibsStrandCount" KEY_RIBS_LINK = "RibsLink" KEY_RIBS_INVERT_DIR = "RibsInvertDirection" KEY_RIBS_INVERT_ORDER = "RibsInvertOrder" +KEY_RIBS_DO_LINK_FIRST = "RibsDoLinkFirst" KEY_RIBS_LEAD_IN_INVERT = "RibsLeadInInvert" KEY_RIBS_LEAD_IN_LEN = "RibsLeadInLen" KEY_RIBS_LEAD_OUT_INVERT = "RibsLeadOutInvert" diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 19ddcf8..1c1db1d 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -32,6 +32,7 @@ local function GetLayerParamsForPathCalc() LayerParams.bPrintInvert = ( EgtGetInfo( s_nPartId, KEY_PRINT_DIRECTION, 'i') == PRINT_DIRECTION.CW) -- parametri costolature LayerParams.bRibsInvertOrder = EgtGetInfo( s_nPartId, KEY_RIBS_INVERT_ORDER, 'b') + LayerParams.bRibsDoLinkFirst = EgtGetInfo( s_nPartId, KEY_RIBS_DO_LINK_FIRST, 'b') or false -- parametri regioni con diverse passate LayerParams.dShellNbrCoasting = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_COASTING, 'd') LayerParams.dShellNbrWipe = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE, 'd') @@ -54,17 +55,20 @@ local function CopyInfo( nSouId, nDestId, sInfo, sType) end ---------------------------------------------------------------------- -local function ComputeSurfOffset( nSrf, nGrpId, dOffs) - - local nCopySrf = EgtCopy( nSrf, nGrpId) or GDB_ID.NULL +local function ComputeSurfOffset( nSrf, nGrpId, dOffs, vtSlicing) + -- gruppo temporaneo locale + local nGrpTmp = EgtGroup( nGrpId, Frame3d( ORIG(), vtSlicing, GDB_RT.GLOB)) + local nCopySrf = EgtCopyGlob( nSrf, nGrpTmp) or GDB_ID.NULL local bOk = EgtSurfFrOffset( nCopySrf, dOffs) local bExists = EgtSurfFrChunkCount( nCopySrf) > 0 if not bOk or not bExists then EgtErase( nCopySrf) - nCopySrf = EgtCopyGlob( nSrf, nGrpId) or GDB_ID.NULL + nCopySrf = EgtCopyGlob( nSrf, nGrpTmp) or GDB_ID.NULL bOk = EgtSurfFrOffset( nCopySrf, dOffs + 0.05) bExists = EgtSurfFrChunkCount( nCopySrf) > 0 end + EgtRelocateGlob( nCopySrf, nGrpId) + EgtErase( nGrpTmp) return bOk, bExists, nCopySrf end @@ -212,7 +216,7 @@ local function VerifyPath( nCrvId, dStrand, vtSlicing, nGrp) end ------------------------------------------------------------------- -local function ComputeTrimSurfWithOverlaps( vIds, nSrfBase, sKeyOverlap, dStrand, nGrp) +local function ComputeTrimSurfWithOverlaps( vIds, nSrfBase, sKeyOverlap, dStrand, nGrp, vtSlicing) -- per ogni overlap creo le superfici con cui fare i trim local vSurfOffs = {} @@ -220,7 +224,7 @@ local function ComputeTrimSurfWithOverlaps( vIds, nSrfBase, sKeyOverlap, dStrand local nOverlap = EgtGetInfo( vIds[i], sKeyOverlap, 'i') if not vSurfOffs[nOverlap] then local dNewOffs = nOverlap / 100 * dStrand - local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfBase, nGrp, dNewOffs) + local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfBase, nGrp, dNewOffs, vtSlicing) if bOk then vSurfOffs[nOverlap] = nSrfOffs end @@ -326,7 +330,7 @@ local function ComputeOffsetInfill( nSrf, dStrand, vtSlicing, sName, nType, vPtS -- estraggo i contorni della superficie local vOldIds = GetPathsFromSurf( nSrf, sName, nType, nGrp, vPtStart) local dOffs = - dStrand - local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrf, nGrp, dOffs) + local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrf, nGrp, dOffs, vtSlicing) while bOk and bExists do -- estraggo i contorni local vNewIds = GetPathsFromSurf( nSrfOffs, sName, nType, nGrp, vPtStart) @@ -349,7 +353,7 @@ local function ComputeOffsetInfill( nSrf, dStrand, vtSlicing, sName, nType, vPtS EgtErase( nSrfOffs) -- offset successivo dOffs = dOffs - dStrand - bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrf, nGrp, dOffs) + bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrf, nGrp, dOffs, vtSlicing) end end @@ -426,7 +430,7 @@ end ------------------------------------------------------------------- --------------------------- RIBS ----------------------------------- -------------------------------------------------------------------- -local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOffs, dStrand, nGrp) +local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOffs, dStrand, nGrp, vtSlicing) -- per ogni tipologia e overlap creo le superfici con cui fare i trim local tSurfOffs = {{}, {}, {}} @@ -437,7 +441,7 @@ local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOff if nType == RIB_TYPE.INTERNAL then if nSrfBase then local dNewOffs = nOverlap / 100 * dStrand - local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfBase, nGrp, dNewOffs) + local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfBase, nGrp, dNewOffs, vtSlicing) if bOk then tSurfOffs[nType][nOverlap] = nSrfOffs end @@ -445,7 +449,7 @@ local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOff elseif nType == RIB_TYPE.EXTERNAL then if nSrfExt then local dNewOffs = dOffs + ( 0.5 - nOverlap / 100) * dStrand - local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfExt, nGrp, dNewOffs) + local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfExt, nGrp, dNewOffs, vtSlicing) if bOk then tSurfOffs[nType][nOverlap] = nSrfOffs EgtSetName( nSrfOffs, TOT_SHELL_TRIM_SURF) @@ -590,14 +594,14 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa local bOk, bExists local nSrf1 = EgtGetFirstNameInGroup( nCrvGrp, TOT_SHELL_TRIM_SURF) if nSrf1 then - bOk, bExists, nSrfOffs1 = ComputeSurfOffset( nSrf1, nCrvGrp, 2 * LayerParams.dStrand) + bOk, bExists, nSrfOffs1 = ComputeSurfOffset( nSrf1, nCrvGrp, 2 * LayerParams.dStrand, LayerParams.vtSlicing) if not bOk or not bExists then nSrfOffs1 = EgtCopyGlob( nSrf1, nCrvGrp) end end local nSrf2 = EgtGetFirstNameInGroup( nCrvGrp, LAYER_SRF) if nSrf2 then - bOk, bExists, nSrfOffs2 = ComputeSurfOffset( nSrf2, nCrvGrp, - 2 * LayerParams.dStrand) + bOk, bExists, nSrfOffs2 = ComputeSurfOffset( nSrf2, nCrvGrp, - 2 * LayerParams.dStrand, LayerParams.vtSlicing) if not bOk or not bExists then nSrfOffs2 = EgtCopyGlob( nSrf2, nCrvGrp) end @@ -668,7 +672,8 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa end end - EgtErase( nSrfOffs) + EgtErase( nSrfOffs1) + EgtErase( nSrfOffs2) EgtErase( nGrpTmp) return bInters @@ -706,7 +711,7 @@ end --------------------------------------------------------------------- -- Funzione che riordina le costolature nel caso generico -local function ReorderRibs( nGrp, bInvertOrder, dStrand, nMaxNbr) +local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr) -- raggruppo per tipologia local tRibs = {{}, {}, {}} @@ -721,8 +726,8 @@ local function ReorderRibs( nGrp, bInvertOrder, dStrand, nMaxNbr) local vSplitRibs = {} for i = 1, 3 do local tSplitOrder = {} - local nMax = 0 - -- suddivido i ribs in base allo SplitOrder + local nMax = -1 + -- raggruppo i ribs for j = 1, #tRibs[i] do local nInfoSplit = EgtGetInfo( tRibs[i][j], KEY_SPLIT_RIB, 'i') local nShells = EgtGetInfo( tRibs[i][j], KEY_RIBS_SHELLS_NBR, 'i') @@ -730,20 +735,31 @@ local function ReorderRibs( nGrp, bInvertOrder, dStrand, nMaxNbr) -- se è ottenuto dalla divisione di una costolatura table.insert( vSplitRibs, tRibs[i][j]) else - -- classifico in base all'ordine di split + -- classifico in base all'ordine di split e al link local nSplitOrder = EgtGetInfo( tRibs[i][j], KEY_SPLIT_ORDER, 'i') or 0 + local bLink = EgtGetInfo( tRibs[i][j], KEY_RIBS_LINK, 'b') or false if nSplitOrder > nMax then nMax = nSplitOrder end - if tSplitOrder[nSplitOrder] then - table.insert( tSplitOrder[nSplitOrder], tRibs[i][j]) + if not tSplitOrder[nSplitOrder] then + tSplitOrder[nSplitOrder]= {{}, {}} + end + + if bLink then + table.insert( tSplitOrder[nSplitOrder][2], tRibs[i][j]) else - tSplitOrder[nSplitOrder] = {tRibs[i][j]} + table.insert( tSplitOrder[nSplitOrder][1], tRibs[i][j]) end end end + local bLinkFirst = bDoLinkFirst -- riordino ogni ordine di split - for i = 0, nMax do - ShortestPathForRibs( tSplitOrder[i], nGrp, bInvertOrder) + for k = 0, nMax do + ShortestPathForRibs( EgtIf( bLinkFirst, tSplitOrder[k][2], tSplitOrder[k][1]), nGrp, bInvertOrder) + ShortestPathForRibs( EgtIf( bLinkFirst, tSplitOrder[k][1], tSplitOrder[k][2]), nGrp, bInvertOrder) + -- eventuale aggiornamento di bLinkFirst per l'ordine successivo + if not ( ( not bLinkFirst and #tSplitOrder[k][2] == 0) or ( bLinkFirst and #tSplitOrder[k][1] == 0)) then + bLinkFirst = not bLinkFirst + end end end @@ -791,7 +807,7 @@ end -------------------------------------------------------------------------------------------- local function ReassignInfo( nCrv, nCnt, vOrig) - for nId = nCrv, nCrv + nCnt - 1 do + for nId = nCrv, nCrv + nCnt - 1 do local ptS = EgtSP( nId) local ptE = EgtEP( nId) @@ -968,7 +984,7 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand) end ------------------------------------------------------------------- -local function UpdateRibSplitInfo( nGrp, tIds) +local function UpdateRibSplitInfo( nGrp, tIds, tRemoved) local vIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*') if not vIds then return end @@ -978,6 +994,11 @@ local function UpdateRibSplitInfo( nGrp, tIds) -- info SplitRib local nInfo = EgtGetInfo( vIds[i], KEY_SPLIT_RIB, 'i') if nInfo then + -- verifico se va aggiornata ereditandola da rib che sono stati eliminati per vincolo sulla lunghezza + while tRemoved[nInfo] do + nInfo = tRemoved[nInfo] + end + if tIds[nInfo] and #tIds[nInfo] > 0 then -- aggiorno info con nuovo id della costolatura da cui deriva local nLast = #tIds[nInfo] @@ -1039,7 +1060,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx) -- creo le superfici con cui fare i trim local nSrfBase = EgtGetFirstNameInGroup( nCrvGrp, TOT_SHELL_TRIM_SURF) local nSrfExt = EgtGetFirstNameInGroup( nCrvGrp, LAYER_SRF) - local tSurfOffs = ComputeTrimSurfWithOverlapsForRibs( vRibs, nSrfBase, nSrfExt, LayerParams.dOffs, LayerParams.dStrand, nRibsPathGrp) + local tSurfOffs = ComputeTrimSurfWithOverlapsForRibs( vRibs, nSrfBase, nSrfExt, LayerParams.dOffs, LayerParams.dStrand, nRibsPathGrp, LayerParams.vtSlicing) -- gestisco eventuali intersezioni fra costolature local bInters = HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands) @@ -1048,6 +1069,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx) -- eseguo il trim delle costole con la regione offsettata local tOldNewIds = {} + local tRemoved = {} local vOrderedRibs = EgtGetNameInGroup( nRibsPathGrp, RIBS_CRV ..'*') for i = 1, #vOrderedRibs do -- trim con superficie opportuna @@ -1073,6 +1095,12 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx) for nInd = 0, nCnt - 1 do local dLen = EgtCurveLength( nCrv + nInd) if dLen < MIN_RIBS_LEN then + -- conservo eventuale info di split + local nSplitRib = EgtGetInfo( nCrv + nInd, KEY_SPLIT_RIB, 'i') + if nSplitRib then + tRemoved[vOrderedRibs[i]] = nSplitRib + end + -- cancello la curva EgtErase( nCrv + nInd) else table.insert( tOldNewIds[ vOrderedRibs[i]], nCrv + nInd) @@ -1102,14 +1130,14 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx) end -- aggiorno le info di split con i nuovi id - UpdateRibSplitInfo( nRibsPathGrp, tOldNewIds) + UpdateRibSplitInfo( nRibsPathGrp, tOldNewIds, tRemoved) -- riordino le costolature if bAllTwoStrands and bInters then -- gestione caso speciale di intersezione e 2 passate ReorderRibsInters2Shells( nRibsPathGrp, LayerParams.dStrand) else - ReorderRibs( nRibsPathGrp, LayerParams.bRibsInvertOrder, LayerParams.dStrand, nMaxNbr) + ReorderRibs( nRibsPathGrp, LayerParams.bRibsInvertOrder, LayerParams.bRibsDoLinkFirst, LayerParams.dStrand, nMaxNbr) end if not EgtGetFirstNameInGroup( nRibsPathGrp, RIBS_CRV .. '*') then @@ -1458,10 +1486,10 @@ end -------------------------------------------------------------------- ------------------ AUX SOLIDS ------------------------------------- -------------------------------------------------------------------- -local function UpdateTrimSurfWithAuxSolidsOffset( nSrfSolid, nSrfBase, dStrand, nCrvGrp) +local function UpdateTrimSurfWithAuxSolidsOffset( nSrfSolid, nSrfBase, dStrand, nCrvGrp, vtSlicing) -- offset della superifice del solido - local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfSolid, nCrvGrp, dStrand) + local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfSolid, nCrvGrp, dStrand, vtSlicing) if nSrfOffs then EgtSurfFrSubtract( nSrfBase, nSrfOffs) EgtErase( nSrfOffs) @@ -1591,7 +1619,7 @@ local function CalcAuxSolidsPaths( nSliceGrp, nSolidGrp, LayerParams, vPtStart) if not nSrfBase then EgtOutLog( 'Warning : AuxSolids not possible (layer '..tostring( nIdx)..') - CalcPaths') else - local vSurfOffs = ComputeTrimSurfWithOverlaps( vSolidIds, nSrfBase, KEY_AUX_SOLIDS_OVERLAP, LayerParams.dStrand, nSolidPathGrp) + local vSurfOffs = ComputeTrimSurfWithOverlaps( vSolidIds, nSrfBase, KEY_AUX_SOLIDS_OVERLAP, LayerParams.dStrand, nSolidPathGrp, LayerParams.vtSlicing) for i = 1, #vSolidIds do -- creo la flat region corrispondente al solido ausiliario @@ -1609,7 +1637,7 @@ local function CalcAuxSolidsPaths( nSliceGrp, nSolidGrp, LayerParams, vPtStart) if nInfillType == INFILL_TYPE.OFFSET then ComputeOffsetInfill( nFirst + j, LayerParams.dStrand, LayerParams.vtSlicing, sNewName, TYPE.AUX_SOLID, vPtStart, nSolidPathGrp) -- aggiorno la trim surf - UpdateTrimSurfWithAuxSolidsOffset( nFirst + j, nSrfBase, LayerParams.dStrand, nSolidPathGrp) + UpdateTrimSurfWithAuxSolidsOffset( nFirst + j, nSrfBase, LayerParams.dStrand, nSolidPathGrp, LayerParams.vtSlicing) else ComputeZigZagInfill( nFirst + j, LayerParams.dStrand, LayerParams.vtSlicing, sNewName, TYPE.AUX_SOLID, vPtStart, nSolidPathGrp) -- aggiungo eventuale passata extra @@ -1689,7 +1717,7 @@ function CalcPaths.Exec( nPartId) local dOffs = - LayerParams.dOffs - 0.5 * LayerParams.dStrand if nMaxShellNbrDiff < LayerParams.nShellsNbr then dOffs = dOffs + LayerParams.dStrand - local bOk, bExists, nSrfId = ComputeSurfOffset( nSrf, nCrvGrpId, - dOffs) + local bOk, bExists, nSrfId = ComputeSurfOffset( nSrf, nCrvGrpId, - dOffs, LayerParams.vtSlicing) if not bOk then EgtOutLog( 'Error on ExtOffset (layer '..tostring( nIdx)..') - CalcPaths') elseif not bExists then @@ -1712,7 +1740,7 @@ function CalcPaths.Exec( nPartId) for nInd = 1, LayerParams.nShellsNbr - 1 - nMaxShellNbrDiff do -- offset della superficie originale dOffs = dOffs + LayerParams.dStrand * ( 1 - LayerParams.nStrandOverlap / 100) - local bOk, bExists, nSrfId = ComputeSurfOffset( nSrf, nCrvGrpId, - dOffs) + local bOk, bExists, nSrfId = ComputeSurfOffset( nSrf, nCrvGrpId, - dOffs, LayerParams.vtSlicing) if not bOk then EgtOutLog( 'Error on IntOffset (layer '..tostring( nIdx)..') - CalcPaths') elseif not bExists then @@ -1730,7 +1758,7 @@ function CalcPaths.Exec( nPartId) -- se hai extra shell tieni conto anche dell'overlap ammesso dSurfTrimOffs = dOffs + ( 1 - LayerParams.nStrandOverlap / 100) * LayerParams.dStrand - s_dOffsCorr end - local bOkTrim, bExistsTrim, nSrfTrim = ComputeSurfOffset( nSrf, nCrvGrpId, - dSurfTrimOffs) + local bOkTrim, bExistsTrim, nSrfTrim = ComputeSurfOffset( nSrf, nCrvGrpId, - dSurfTrimOffs, LayerParams.vtSlicing) if not bOkTrim then EgtOutLog( 'Error on IntOffset (layer '..tostring( nIdx)..') - CalcPaths') elseif bExistsTrim then diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index f98da32..e013caf 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -113,7 +113,7 @@ local function GetRibParams( nId) ReadParam( nId, KEY_RIBS_LEAD_OUT_WIPE, 'd', RibParam) ReadParam( nId, KEY_RIBS_LEAD_OUT_WIPE_DIR, 'd', RibParam) ReadParam( nId, KEY_RIBS_OVERLAP, 'i', RibParam) - + ReadParam( nId, KEY_RIBS_LINK, 'b', RibParam) ReadParam( nId, KEY_RIBS_TYPE, 'i', RibParam, RIB_TYPE.INTERNAL) return RibParam diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index d70d05e..796f637 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -41,8 +41,6 @@ local function GetLayerParamsForToolPathCalc() LayerParams.dWipeDir = EgtGetInfo( s_nPartId, KEY_WIPE_DIR, 'd') or 0.0 LayerParams.vtSlicing = EgtGetInfo( s_nPartId, KEY_SLICING_DIR, 'v') LayerParams.dTDiam = EgtGetInfo( s_nPartId, KEY_TOOL_DIAM, 'd') - -- Parametri costolature - LayerParams.bRibsLink = EgtGetInfo( s_nPartId, KEY_RIBS_LINK, 'b') return LayerParams end @@ -180,7 +178,7 @@ local function AddLeadOut( nCrvId, LayerParams, nGrpId) local nLeadOutCrv if LayerParams.nLeadOutType == LEAD_TYPE.LINEAR then - nLeadOutCrv = EgtCurveCompoFromPoints( nGrpId, {ptS, ptE}, GDB_RT.GLOB) + nLeadOutCrv = EgtCurveCompoFromPoints( nGrpId, {ptS, ptE}, GDB_RT.GLOB) elseif LayerParams.nLeadOutType == LEAD_TYPE.ARC then nLeadOutCrv = EgtArc2PV( nGrpId, ptS, ptE, vtTang, GDB_RT.GLOB) end @@ -775,20 +773,26 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) for i = 1, #tabRibs do local nInfo = EgtGetInfo( tabRibs[i][1], KEY_SPLIT_RIB, 'i') local nShellsNbr = EgtGetInfo( tabRibs[i][1], KEY_RIBS_SHELLS_NBR, 'i') - -- se link aggiorno bInvert per il gruppo di costolature corrente in modo da essere coerente con il collegamento - if LayerParams.bRibsLink then - if i > 1 then + + if i > 1 then + -- verifico se link + local bPrevLink = EgtGetInfo( tabRibs[i-1][1], KEY_RIBS_LINK, 'b') + local bCurrLink = EgtGetInfo( tabRibs[i][1], KEY_RIBS_LINK, 'b') + if bPrevLink and bCurrLink then nPrevType = EgtGetInfo( tabRibs[i-1][1], KEY_RIBS_TYPE, 'i') nCurrType = EgtGetInfo( tabRibs[i][1], KEY_RIBS_TYPE, 'i') -- se cambio tipologia di setto, l'orientamento della curva è già corretto if nPrevType ~= nCurrType then bInvert = false elseif not nInfo then + -- aggiorno bInvert per il gruppo di costolature corrente in modo da essere coerente con il collegamento local nPrevShellsNbr = EgtGetInfo( tabRibs[i-1][1], KEY_RIBS_SHELLS_NBR, 'i') if nPrevShellsNbr % 2 == 1 then bInvert = not bInvert end end + else + bInvert = false end end @@ -798,7 +802,7 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) EgtRelocateGlob( tabRibs[i][1], tabRibs[i-1][1], GDB_IN.BEFORE) end - -- oriento tutte le passate relative ad una stessa costolatura + -- oriento tutte le passate relative ad una stessa costolatura for j = 1, #tabRibs[i] do if ( bInvert and j % 2 == 1) or ( not bInvert and j % 2 == 0) then EgtInvertCurve( tabRibs[i][j]) @@ -835,9 +839,12 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) EgtErase( nFakeLink) end end + -- se necessario collego le diverse costolature - if LayerParams.bRibsLink then - for i = 1, #tabRibs - 1 do + for i = 1, #tabRibs - 1 do + local bLink1 = EgtGetInfo( tabRibs[i][1], KEY_RIBS_LINK, 'b') + local bLink2 = EgtGetInfo( tabRibs[i + 1][1], KEY_RIBS_LINK, 'b') + if bLink1 and bLink2 then local nCnt = #tabRibs[i] CalcRibsLink( tabRibs[i][nCnt], tabRibs[i + 1][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) end diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 460e8c2..4e2e44d 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -150,6 +150,7 @@ local function LoadParams( sFile, nPartId) SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_SHELLS_NBR, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_DIR, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_ORDER, '0') + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_DO_LINK_FIRST, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LINK, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_IN_INVERT, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_IN_LEN, '0.0') @@ -157,7 +158,7 @@ local function LoadParams( sFile, nPartId) SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_OUT_LEN, '0.0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_OUT_COASTING, '0.0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_OUT_WIPE, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_OUT_WIPE_DIR, '0.0') + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_OUT_WIPE_DIR, '0.0') -- parametri per regioni con diverso numero di passate SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SHELL_NBR_DIFF, '0') From c0230eccf70cb12bebdc4af89735c7aae4b9841c Mon Sep 17 00:00:00 2001 From: DarioS Date: Mon, 14 Nov 2022 09:27:42 +0100 Subject: [PATCH 34/79] 3dPrinting : - tolleranza di approssimazione curve di slicing portata a 0.1 (MID_TOLER). --- LuaLibs/CalcSlices.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index e013caf..e63b8e5 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -270,7 +270,7 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) -- costanti local TOLER = 0.05 - local MID_TOLER = 0.5 + local MID_TOLER = 0.1 local BIG_TOLER = 2.0 local MIN_LEN = 20.0 local MIN_AREA = 25.0 From 0a78833f61b40c8c11a2e7ae11e87baed6e7c63d Mon Sep 17 00:00:00 2001 From: DarioS Date: Tue, 22 Nov 2022 20:01:58 +0100 Subject: [PATCH 35/79] 3dPrinting : - corretto calcolo TFS quando si estrudono solo i Ribs e non il Pezzo. --- LuaLibs/RunMachParamFromSWCalc.lua | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/LuaLibs/RunMachParamFromSWCalc.lua b/LuaLibs/RunMachParamFromSWCalc.lua index 15c2b6c..eec4539 100644 --- a/LuaLibs/RunMachParamFromSWCalc.lua +++ b/LuaLibs/RunMachParamFromSWCalc.lua @@ -1,4 +1,4 @@ --- RunMachParamFromSWCalc.lua by Egaltech s.r.l. 2022/09/15 +-- RunMachParamFromSWCalc.lua by Egaltech s.r.l. 2022/11/22 -- Calcolo dei parametri di stampa -- Tabella per definizione modulo @@ -82,12 +82,14 @@ function RunMachParamFromSWCalc.Exec() dTotLayerLength = dTotLayerLength + dTotCrvLength -- recupero area local nOuterCrvId = EgtGetFirstNameInGroup( nCrvId, OUTER_CRV) - local _, _, dTotCrvArea = EgtCurveArea( nOuterCrvId) - local dOuterLength = EgtCurveLength( nOuterCrvId) - -- recupero offset del part per aggiungerlo all'area interna - local dOffset = EgtGetInfo( nPartId, KEY_OFFSET_SLICE, 'd') - dTotCrvArea = dTotCrvArea + ( dOffset * dOuterLength) - dTotLayerArea = dTotLayerArea + dTotCrvArea + if nOuterCrvId and dStrandCount > 0.5 then + local _, _, dTotCrvArea = EgtCurveArea( nOuterCrvId) + local dOuterLength = EgtCurveLength( nOuterCrvId) + -- recupero offset del part per aggiungerlo all'area interna + local dOffset = EgtGetInfo( nPartId, KEY_OFFSET_SLICE, 'd') + dTotCrvArea = dTotCrvArea + ( dOffset * dOuterLength) + dTotLayerArea = dTotLayerArea + dTotCrvArea + end nCrvId = EgtGetNextName( nCrvId, CONTOUR_GRP .. '*') end -- recupero feed del layer @@ -114,11 +116,16 @@ function RunMachParamFromSWCalc.Exec() end EgtSetInfo( nLayerResultId, KEY_SLICEID, nOrigLayers) -- calcolo costante MF - local dMF = dTotLayerLength * dStrand / dTotLayerArea * 100 + local dMF = 1 + local dSC = 1 + if dTotLayerArea > 1 then + dMF = dTotLayerLength * dStrand / dTotLayerArea * 100 + dSC = dStrandCount + end -- calcolo tempi stimati del layer - local dTMin = ( dMF + MATERIAL.AMin) / MATERIAL.BMin * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dStrandCount, MATERIAL.KN) - local dTTrg = ( dMF + MATERIAL.ATrg) / MATERIAL.BTrg * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dStrandCount, MATERIAL.KN) - local dTMax = ( dMF + MATERIAL.AMax) / MATERIAL.BMax * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dStrandCount, MATERIAL.KN) + local dTMin = ( dMF + MATERIAL.AMin) / MATERIAL.BMin * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dSC, MATERIAL.KN) + local dTTrg = ( dMF + MATERIAL.ATrg) / MATERIAL.BTrg * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dSC, MATERIAL.KN) + local dTMax = ( dMF + MATERIAL.AMax) / MATERIAL.BMax * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dSC, MATERIAL.KN) local dFMin = dTotLayerLength / dTMax * 60 local dFTrg = dTotLayerLength / dTTrg * 60 local dFMax = dTotLayerLength / dTMin * 60 From 8622fc89197490a27d3cbccb61466db5e8e84c5a Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 24 Nov 2022 16:09:16 +0100 Subject: [PATCH 36/79] 3dPrinting : - migliorata intersezione setti - aggiunto ordine di realizzazione per tipologie setti. --- LuaLibs/AddManData.lua | 10 ++ LuaLibs/CalcPaths.lua | 292 ++++++++++++++++++++++++----------------- LuaLibs/RunSlicing.lua | 1 + 3 files changed, 180 insertions(+), 123 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 4f14bc7..b8f9032 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -99,6 +99,7 @@ KEY_RIBS_INTERS = "RibsHaveIntersections" KEY_SPLIT_ORDER = "SplitOrder" KEY_SPLIT_RIB = "SplitRib" KEY_RIBS_TWO_STRANDS = "RibsHaveAll2Strands" +KEY_RIBS_PRINT_ORDER = "RibsPrintOrder" -- Regioni con diverso numero di passate KEY_SHELL_NBR_DIFF = "ShellNbrDifference" @@ -193,6 +194,15 @@ RIB_TYPE = { UNBOUNDED = 3, } +RIB_PRINT_ORDER = { + INT_EXT_UNBDD = 1, + INT_UNBDD_EXT = 2, + EXT_INT_UNBDD = 3, + EXT_UNBDD_INT = 4, + UNBDD_INT_EXT = 5, + UNBDD_EXT_INT = 6, +} + --------------------------------------------------------------------- TABLE = "Table" PART = "Part" diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 1c1db1d..1e410b6 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -33,6 +33,7 @@ local function GetLayerParamsForPathCalc() -- parametri costolature LayerParams.bRibsInvertOrder = EgtGetInfo( s_nPartId, KEY_RIBS_INVERT_ORDER, 'b') LayerParams.bRibsDoLinkFirst = EgtGetInfo( s_nPartId, KEY_RIBS_DO_LINK_FIRST, 'b') or false + LayerParams.nRibsPrintOrder = EgtGetInfo( s_nPartId, KEY_RIBS_PRINT_ORDER, 'i') or 1 -- parametri regioni con diverse passate LayerParams.dShellNbrCoasting = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_COASTING, 'd') LayerParams.dShellNbrWipe = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE, 'd') @@ -464,22 +465,62 @@ local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOff end -------------------------------------------------------------------- -local function VerifyRibsIntersection( ptInt, nType1, nType2, nSrf1, nSrf2, nGrp) +local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf2, nGrp, nOffsGrp) - local bValid = false - local nPtId = EgtPoint( nGrp, ptInt) - - if nType1 == RIB_TYPE.INTERNAL or nType2 == RIB_TYPE.INTERNAL then - -- l'intersezione deve essere interna - if nSrf1 and not EgtSurfFrTestExternal( nSrf1, nPtId) then bValid = true end - elseif nType1 == RIB_TYPE.EXTERNAL or nType2 == RIB_TYPE.EXTERNAL then - -- l'intersezione deve essere esterna - if nSrf2 and EgtSurfFrTestExternal( nSrf2, nPtId) then bValid = true end - else - bValid = true + -- setti interni ed esterni non si possono intersecare per definizione + if ( nType1 == RIB_TYPE.INTERNAL and nType2 == RIB_TYPE.EXTERNAL) or ( nType1 == RIB_TYPE.EXTERNAL and nType2 == RIB_TYPE.INTERNAL) then + return false + end + -- se hanno lo stesso nome derivano dalla stessa costolatura quindi non ha senso controllare intersezione + if EgtGetName( nRib1) == EgtGetName( nRib2) then + return false end - return bValid + local bInters = false + local ptInt + + -- porto le curve nel gruppo locale + local nCrv1 = EgtCopyGlob( nRib1, nGrp) + local nCrv2 = EgtCopyGlob( nRib2, nGrp) + -- verifico se si intersecano + ptInt = EgtIP( nCrv1, nCrv2, ORIG(), GDB_ID.ROOT) + + -- se non si intersecano, verifico se si intersecano i loro offset + if not ptInt then + local bFound = false + local vOffs1 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv1)) + local vOffs2 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv2)) + for i = 1, #vOffs1 do + local nOffs1 = EgtCopyGlob( vOffs1[i], nGrp) + for j = 1, #vOffs2 do + -- porto nel gruppo locale e verifico se intersezione + local nOffs2 = EgtCopyGlob( vOffs2[j], nGrp) + ptInt = EgtIP( nOffs1, nOffs2, ORIG(), GDB_ID.ROOT) + if ptInt then + bFound = true + break + end + end + if bFound then break end + end + end + + -- se intersezione verifico se valida + if ptInt then + local nPtId = EgtPoint( nGrp, ptInt, GDB_RT.GLOB) + if nType1 == RIB_TYPE.INTERNAL or nType2 == RIB_TYPE.INTERNAL then + -- l'intersezione deve essere interna + if nSrf1 and not EgtSurfFrTestExternal( nSrf1, nPtId) then bInters = true end + elseif nType1 == RIB_TYPE.EXTERNAL or nType2 == RIB_TYPE.EXTERNAL then + -- l'intersezione deve essere esterna + if nSrf2 and EgtSurfFrTestExternal( nSrf2, nPtId) then bInters = true end + else + -- nel caso unbounded l'intersezione può essere ovunque + bInters = true + end + end + + return bInters, ptInt end --------------------------------------------------------------------------------- @@ -492,11 +533,11 @@ local function AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nOffs local nOverlap2 = EgtGetInfo( nCrv2, KEY_RIBS_OVERLAP, 'i') local nOverlap = min( nOverlap1, nOverlap2) local dOffs = ( nShells - 1) * LayerParams.dStrand / 2 - local nSrf = EgtSurfFrFatCurve( nOffsGrp, nCrv1, dOffs + ( 1 - nOverlap / 100) * LayerParams.dStrand, false) + local nSrf = EgtSurfFrFatCurve( nOffsGrp, nCrv1, dOffs + ( 1 - nOverlap / 100) * LayerParams.dStrand, false) if not nSrf then return end -- trim degli offset della curva secondaria ( nCrv2) - local vOffs2 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv2)) + local vOffs2 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv2)) or {} for i = 1, #vOffs2 do local nId, nCnt = EgtTrimCurveWithRegion( vOffs2[i], nSrf, false, true) EgtChangeId( nId, vOffs2[i]) @@ -513,7 +554,7 @@ local function AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nOffs end -------------------------------------------------------------------- --- Funzione che sistema le intersezioni fra costolature nel caso di 2 passate +-- Funzione che sistema le intersezioni fra costolature nel caso di 2 passate local function AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, LayerParams, nOffsGrp) -- costruisco le superfici da usare per trim @@ -536,7 +577,7 @@ local function AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, LayerParams end -- trim degli offset di nCrv2 - local vOffs2 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv2)) + local vOffs2 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv2)) for i = 1, #vOffs2 do local nId, nCnt = EgtTrimCurveWithRegion( vOffs2[i], nSrf1, false, true) end @@ -567,28 +608,23 @@ local function UpdateSplitOrder( nCrv, tInters, nOffsGrp) end end end - end -------------------------------------------------------------------- local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands) - local nCrvGrp = EgtGetParent( nRibsPathGrp) + local vRibsIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') -- copio gli offset delle costolature nel RibsPathGrp + local nCrvGrp = EgtGetParent( nRibsPathGrp) local vOffsRib = EgtGetAllInGroup( nOffsGrp) for i = 1, #vOffsRib do EgtCopyGlob( vOffsRib[i], nRibsPathGrp) end - -- copio i setti in un gruppo con frame locale per calcolare le intersezioni + -- creo un gruppo con frame locale per calcolare le intersezioni local frLoc = Frame3d( ORIG(), LayerParams.vtSlicing) local nGrpTmp = EgtGroup( nRibsGrp, frLoc, GDB_RT.GLOB) - local vOrigRibsIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') - local vRibsIds = {} - for i = 1, #vOrigRibsIds do - table.insert( vRibsIds, EgtCopyGlob( vOrigRibsIds[i], nGrpTmp)) - end - + -- calcolo le regioni nella quali ha senso considerare l'intersezione local nSrfOffs1, nSrfOffs2 local bOk, bExists @@ -611,62 +647,56 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa local vSplit = {} local tInters = {} -- tabella che tiene traccia delle intersezioni trovate for i = 1, #vRibsIds do - local nType1 = EgtGetInfo( vRibsIds[i], KEY_RIBS_TYPE, 'i') + -- verifico se interseca uno dei setti successivi for j = i + 1, #vRibsIds do - -- verifico se i due setti possono intersecarsi in base alla loro tipologia local nType2 = EgtGetInfo( vRibsIds[j], KEY_RIBS_TYPE, 'i') - if not ( ( nType1 == RIB_TYPE.INTERNAL and nType2 == RIB_TYPE.EXTERNAL) or ( nType1 == RIB_TYPE.EXTERNAL and nType2 == RIB_TYPE.INTERNAL)) then + + local bRibInters, ptInt = VerifyRibsIntersection( vRibsIds[i], vRibsIds[j], nType1, nType2, nSrfOffs1, nSrfOffs2, nGrpTmp, nOffsGrp) + if bRibInters then + bInters = true - local ptInt = EgtIP( vRibsIds[i], vRibsIds[j], ORIG()) - if ptInt then - - -- verifico se l'interserzione è valida - if VerifyRibsIntersection( ptInt, nType1, nType2, nSrfOffs1, nSrfOffs2, nGrpTmp) then - bInters = true - - local dPar1 = EgtCurveParamAtPoint( vRibsIds[i], ptInt) - local dPar2 = EgtCurveParamAtPoint( vRibsIds[j], ptInt) - local _, dParE1 = EgtCurveDomain( vRibsIds[i]) - local _, dParE2 = EgtCurveDomain( vRibsIds[j]) - - local nCrv1 = vOrigRibsIds[i] -- curva principale che non viene tagliata - local nCrv2 = vOrigRibsIds[j] -- curve secondaria da modificare - local nSplitOrder1 = EgtGetInfo( nCrv1, KEY_SPLIT_ORDER, 'i') or 0 - local nSplitOrder2 = EgtGetInfo( nCrv2, KEY_SPLIT_ORDER, 'i') or 0 - if dPar1 < 10 * GEO.EPS_SMALL or abs( dPar1 - dParE1) < 10 * GEO.EPS_SMALL then - nCrv1, nCrv2 = nCrv2, nCrv1 - nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 - else - -- prediligo setto già splittato più volte - if nSplitOrder1 > nSplitOrder2 then - nCrv1, nCrv2 = nCrv2, nCrv1 - nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 - end - end - - -- aggiorno tabella delle intersezioni - if tInters[nCrv1] then - table.insert( tInters[nCrv1], nCrv2) - else - tInters[nCrv1] = {nCrv2} - end - - -- aggiorno ordine di split - if nSplitOrder2 < nSplitOrder1 + 1 then - EgtSetInfo( nCrv2, KEY_SPLIT_ORDER, nSplitOrder1 + 1) - UpdateSplitOrder( nCrv2, tInters, nRibsPathGrp) - end - - if bAllTwoStrands then - -- nel caso di 2 passate gestione speciale - AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, LayerParams, nRibsPathGrp) - else - AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nRibsPathGrp) - end + local dPar1 = EgtCurveParamAtPoint( vRibsIds[i], ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) + local dPar2 = EgtCurveParamAtPoint( vRibsIds[j], ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) + local _, dParE1 = EgtCurveDomain( vRibsIds[i]) + local _, dParE2 = EgtCurveDomain( vRibsIds[j]) + + local nCrv1 = vRibsIds[i] -- curva principale che non viene tagliata + local nCrv2 = vRibsIds[j] -- curve secondaria da modificare + local nSplitOrder1 = EgtGetInfo( nCrv1, KEY_SPLIT_ORDER, 'i') or 0 + local nSplitOrder2 = EgtGetInfo( nCrv2, KEY_SPLIT_ORDER, 'i') or 0 + local bCrv1OnExtr = dPar1 and ( dPar1 < 10 * GEO.EPS_SMALL or abs( dPar1 - dParE1) < 10 * GEO.EPS_SMALL) + local bCrv2OnExtr = dPar2 and ( dPar2 < 10 * GEO.EPS_SMALL or abs( dPar2 - dParE2) < 10 * GEO.EPS_SMALL) + if ( dPar1 and not dPar2) or ( bCrv1OnExtr and not bCrv2OnExtr) then + nCrv1, nCrv2 = nCrv2, nCrv1 + nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 + else + -- prediligo setto già splittato più volte + if nSplitOrder1 > nSplitOrder2 then + nCrv1, nCrv2 = nCrv2, nCrv1 + nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 end - EgtErase( nPtId) + end + + -- aggiorno tabella delle intersezioni + if tInters[nCrv1] then + table.insert( tInters[nCrv1], nCrv2) + else + tInters[nCrv1] = {nCrv2} + end + + -- aggiorno ordine di split + if nSplitOrder2 < nSplitOrder1 + 1 then + EgtSetInfo( nCrv2, KEY_SPLIT_ORDER, nSplitOrder1 + 1) + UpdateSplitOrder( nCrv2, tInters, nRibsPathGrp) + end + + if bAllTwoStrands and ( nType1 == nType2) then + -- nel caso di 2 passate e stessa tipologia gestione speciale per creare unico percorso + AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, LayerParams, nRibsPathGrp) + else + AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nRibsPathGrp) end end end @@ -711,12 +741,13 @@ end --------------------------------------------------------------------- -- Funzione che riordina le costolature nel caso generico -local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr) +local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr, vTypeSequence) + + local vIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*') + if not vIds or #vIds == 0 then return end -- raggruppo per tipologia local tRibs = {{}, {}, {}} - local vIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*') - if not vIds or #vIds == 0 then return end for i = 1, #vIds do local nType = EgtGetInfo( vIds[i], KEY_RIBS_TYPE, 'i') table.insert( tRibs[nType], vIds[i]) @@ -725,28 +756,29 @@ local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr) -- riordino ogni tipologia con shortest path local vSplitRibs = {} for i = 1, 3 do + local nCurrType = vTypeSequence[i] local tSplitOrder = {} local nMax = -1 -- raggruppo i ribs - for j = 1, #tRibs[i] do - local nInfoSplit = EgtGetInfo( tRibs[i][j], KEY_SPLIT_RIB, 'i') - local nShells = EgtGetInfo( tRibs[i][j], KEY_RIBS_SHELLS_NBR, 'i') + for j = 1, #tRibs[nCurrType] do + local nInfoSplit = EgtGetInfo( tRibs[nCurrType][j], KEY_SPLIT_RIB, 'i') + local nShells = EgtGetInfo( tRibs[nCurrType][j], KEY_RIBS_SHELLS_NBR, 'i') if nInfoSplit and nShells == 1 then -- se è ottenuto dalla divisione di una costolatura - table.insert( vSplitRibs, tRibs[i][j]) + table.insert( vSplitRibs, tRibs[nCurrType][j]) else -- classifico in base all'ordine di split e al link - local nSplitOrder = EgtGetInfo( tRibs[i][j], KEY_SPLIT_ORDER, 'i') or 0 - local bLink = EgtGetInfo( tRibs[i][j], KEY_RIBS_LINK, 'b') or false + local nSplitOrder = EgtGetInfo( tRibs[nCurrType][j], KEY_SPLIT_ORDER, 'i') or 0 + local bLink = EgtGetInfo( tRibs[nCurrType][j], KEY_RIBS_LINK, 'b') or false if nSplitOrder > nMax then nMax = nSplitOrder end if not tSplitOrder[nSplitOrder] then tSplitOrder[nSplitOrder]= {{}, {}} end if bLink then - table.insert( tSplitOrder[nSplitOrder][2], tRibs[i][j]) + table.insert( tSplitOrder[nSplitOrder][2], tRibs[nCurrType][j]) else - table.insert( tSplitOrder[nSplitOrder][1], tRibs[i][j]) + table.insert( tSplitOrder[nSplitOrder][1], tRibs[nCurrType][j]) end end end @@ -754,11 +786,13 @@ local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr) local bLinkFirst = bDoLinkFirst -- riordino ogni ordine di split for k = 0, nMax do - ShortestPathForRibs( EgtIf( bLinkFirst, tSplitOrder[k][2], tSplitOrder[k][1]), nGrp, bInvertOrder) - ShortestPathForRibs( EgtIf( bLinkFirst, tSplitOrder[k][1], tSplitOrder[k][2]), nGrp, bInvertOrder) - -- eventuale aggiornamento di bLinkFirst per l'ordine successivo - if not ( ( not bLinkFirst and #tSplitOrder[k][2] == 0) or ( bLinkFirst and #tSplitOrder[k][1] == 0)) then - bLinkFirst = not bLinkFirst + if tSplitOrder[k] then + ShortestPathForRibs( EgtIf( bLinkFirst, tSplitOrder[k][2], tSplitOrder[k][1]), nGrp, bInvertOrder) + ShortestPathForRibs( EgtIf( bLinkFirst, tSplitOrder[k][1], tSplitOrder[k][2]), nGrp, bInvertOrder) + -- eventuale aggiornamento di bLinkFirst per l'ordine successivo + if not ( ( not bLinkFirst and #tSplitOrder[k][2] == 0) or ( bLinkFirst and #tSplitOrder[k][1] == 0)) then + bLinkFirst = not bLinkFirst + end end end end @@ -811,9 +845,7 @@ local function ReassignInfo( nCrv, nCnt, vOrig) local ptS = EgtSP( nId) local ptE = EgtEP( nId) - -- info overlap - local nOverlap = EgtGetInfo( s_nPartId, KEY_RIBS_OVERLAP, 'i') - EgtSetInfo( nId, KEY_RIBS_OVERLAP, nOverlap) + EgtSetInfo( nId, KEY_TYPE, TYPE.RIB) local bStart = false local bEnd = false @@ -828,6 +860,7 @@ local function ReassignInfo( nCrv, nCnt, vOrig) CopyInfo( vOrig[i], nId, KEY_RIBS_LEAD_IN_INVERT, 'b') CopyInfo( vOrig[i], nId, KEY_RIBS_LEAD_IN_LEN, 'd') CopyInfo( vOrig[i], nId, KEY_ASSOCIATED_SURF, 'i') + CopyInfo( vOrig[i], nId, KEY_RIBS_OVERLAP, 'i') CopyInfo( vOrig[i], nId, KEY_RIBS_TYPE, 'i') bStart = true end @@ -852,29 +885,24 @@ end --------------------------------------------------------------------------------------------- -- Funzione che riordina le costolature nel caso di intersezioni e 2 passate -local function ReorderRibsInters2Shells( nOffsGrp, dStrand) +local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vTypeSequence) local vOffs = EgtGetNameInGroup( nOffsGrp, RIBS_CRV .. '*') - local bUnboundedRib = false -- copio le curve originali ( per recuperarne le info) local vCopy = {} for i = 1, #vOffs do local nNewId = EgtCopy( vOffs[i], nOffsGrp) table.insert( vCopy, nNewId) - local nType = EgtGetInfo( nNewId, KEY_RIBS_TYPE, 'i') - if nType == RIB_TYPE.UNBOUNDED then - bUnboundedRib = true - end end -- concateno le curve local nCrv, nCnt = EgtCurveCompoByChain( nOffsGrp, vOffs, ORIG()) - local vIds = {} for i = nCrv, nCrv + nCnt - 1 do - EgtSetInfo( i, KEY_TYPE, TYPE.RIB) table.insert( vIds, i) end + -- recupero le info dalle curve originali + ReassignInfo( nCrv, nCnt, vCopy) local k = 0 -- indice da utilizzare per i nomi while #vIds > 0 do @@ -888,9 +916,12 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand) local nCnt = 0 -- scorro alla ricerca di una curva che posso collegare alla corrente while nCurrCrv do + local nCurrType = EgtGetInfo( nCurrCrv, KEY_RIBS_TYPE, 'i') local bFound = false for j = 1, #vIds do - if vIds[j] ~= nCrv and not EgtCurveIsClosed(vIds[j]) then + local nType = EgtGetInfo( vIds[j], KEY_RIBS_TYPE, 'i') + + if vIds[j] ~= nCrv and not EgtCurveIsClosed(vIds[j]) and nCurrType == nType then -- verifico se il collegamento è possibile local bAdd = false @@ -917,7 +948,7 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand) if dParE - dParMinDist < 500 * GEO.EPS_SMALL then bAdd = true -- altrimenti può essere vicino allo start - elseif dParMinDist < 500 * GEO.EPS_SMALL and nCnt == 0 then + elseif dParMinDist < 500 * GEO.EPS_SMALL and nCnt == 0 then bAdd = true EgtInvertCurve( nCurrCrv) end @@ -937,7 +968,7 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand) end end - if bAdd then + if bAdd then bFound = true nCnt = nCnt + 1 EgtRelocateGlob( vIds[j], nCurrCrv, GDB_IN.AFTER) @@ -967,20 +998,21 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand) end end - -- Recupero le info dalle curve originali - ReassignInfo( nCrv, nCnt, vCopy) - - -- riordino per tipologia ( prima iterni poi esterni) nel caso senza unbounded - if not bUnboundedRib then - local vCrvs = EgtGetNameInGroup( nOffsGrp, RIBS_CRV .. '*') - for nId = 1, #vCrvs do - local nType = EgtGetInfo( vCrvs[nId], KEY_RIBS_TYPE, 'i') - if nType == RIB_TYPE.EXTERNAL then - EgtRelocateGlob( vCrvs[nId], EgtGetParent( nCrv), GDB_IN.LAST_SON) - end + -- classifico in base alla tipologia + local vCrvs = EgtGetNameInGroup( nOffsGrp, RIBS_CRV .. '*') + local tRibs = {{}, {}, {}} + for nId = 1, #vCrvs do + local nType = EgtGetInfo( vCrvs[nId], KEY_RIBS_TYPE, 'i') + table.insert( tRibs[nType], vCrvs[nId]) + end + -- riordino per tipologia + for i = 1, 3 do + nCurrType = vTypeSequence[i] + for j = 1, #tRibs[nCurrType] do + EgtRelocateGlob( tRibs[nCurrType][j], nOffsGrp, GDB_IN.LAST_SON) end end - + end ------------------------------------------------------------------- @@ -1131,15 +1163,29 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx) -- aggiorno le info di split con i nuovi id UpdateRibSplitInfo( nRibsPathGrp, tOldNewIds, tRemoved) - + + -- stabilisco ordine di realizzazione delle varie tipologie + local vTypeSequence = {RIB_TYPE.INTERNAL, RIB_TYPE.EXTERNAL, RIB_TYPE.UNBOUNDED} + if LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.INT_UNBDD_EXT then + vTypeSequence = {RIB_TYPE.INTERNAL, RIB_TYPE.UNBOUNDED, RIB_TYPE.EXTERNAL} + elseif LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.EXT_INT_UNBDD then + vTypeSequence = {RIB_TYPE.EXTERNAL, RIB_TYPE.INTERNAL, RIB_TYPE.UNBOUNDED} + elseif LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.EXT_UNBDD_INT then + vTypeSequence = {RIB_TYPE.EXTERNAL, RIB_TYPE.UNBOUNDED, RIB_TYPE.INTERNAL} + elseif LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.UNBDD_INT_EXT then + vTypeSequence = {RIB_TYPE.UNBOUNDED, RIB_TYPE.INTERNAL, RIB_TYPE.EXTERNAL} + elseif LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.UNBDD_EXT_INT then + vTypeSequence = {RIB_TYPE.UNBOUNDED, RIB_TYPE.EXTERNAL, RIB_TYPE.INTERNAL} + end + -- riordino le costolature if bAllTwoStrands and bInters then -- gestione caso speciale di intersezione e 2 passate - ReorderRibsInters2Shells( nRibsPathGrp, LayerParams.dStrand) + ReorderRibsInters2Shells( nRibsPathGrp, LayerParams.dStrand, vTypeSequence) else - ReorderRibs( nRibsPathGrp, LayerParams.bRibsInvertOrder, LayerParams.bRibsDoLinkFirst, LayerParams.dStrand, nMaxNbr) + ReorderRibs( nRibsPathGrp, LayerParams.bRibsInvertOrder, LayerParams.bRibsDoLinkFirst, LayerParams.dStrand, nMaxNbr, vTypeSequence) end - + if not EgtGetFirstNameInGroup( nRibsPathGrp, RIBS_CRV .. '*') then EgtErase( nRibsPathGrp) end @@ -1361,7 +1407,7 @@ local function ReorderExtraShells( nPathGrp, dStrand, vPtStart, bPrintInvert) local bFound = false for j = 1, #vIds do - if not EgtCurveIsClosed( vIds[j]) then + if not EgtCurveIsClosed( vIds[j]) then local ptS = EgtSP( vIds[j]) local ptE = EgtEP( vIds[j]) diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 4e2e44d..05113a8 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -147,6 +147,7 @@ local function LoadParams( sFile, nPartId) end SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_OVERLAP, '0.0') + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_PRINT_ORDER, '1') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_SHELLS_NBR, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_DIR, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_ORDER, '0') From 693746d6e3c875fa4bdf6679e295ba81dadf350e Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 29 Nov 2022 10:21:14 +0100 Subject: [PATCH 37/79] =?UTF-8?q?3dPrinting=20:=20-=20aggiunto=20slicing?= =?UTF-8?q?=20a=2045=C2=B0=20lungo=20Y.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LuaLibs/AddManData.lua | 5 +++-- LuaLibs/CalcSlices.lua | 4 +++- LuaLibs/CalcToolPath.lua | 8 ++++---- LuaLibs/RunSlicing.lua | 6 ++++-- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index b8f9032..6e3c77f 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -143,8 +143,9 @@ KEY_HAS_SOLIDS = "Solids" SLICING_TYPE = { VERTICAL = 1, - DEG45 = 2, - HORIZONTAL = 3, + DEG45_X = 2, + DEG45_Y = 3, + HORIZONTAL = 4, } TYPE = { diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index e63b8e5..38e838e 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -282,8 +282,10 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') if nSlicingType == SLICING_TYPE.HORIZONTAL then vtSlicing = X_AX() - elseif nSlicingType == SLICING_TYPE.DEG45 then + elseif nSlicingType == SLICING_TYPE.DEG45_X then vtSlicing = VectorFromSpherical( 1, 45, 0) + elseif nSlicingType == SLICING_TYPE.DEG45_Y then + vtSlicing = VectorFromSpherical( 1, 45, 90) end EgtSetInfo( s_nPartId, KEY_SLICING_DIR, vtSlicing) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 796f637..72e6d33 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -961,7 +961,7 @@ local function SpiralVase( vLayIds, dCorrZ, LayerParams) local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') -- copio ultimo layer - if nSlicingType ~= SLICING_TYPE.DEG45 then + if nSlicingType ~= SLICING_TYPE.DEG45_X and nSlicingType ~= SLICING_TYPE.DEG45_Y then local nNewLay = EgtCopyGlob( vLayIds[#vLayIds], vLayIds[#vLayIds], GDB_IN.AFTER) table.insert( vLayIds, nNewLay) EgtMove( nNewLay, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) @@ -1010,7 +1010,7 @@ local function SpiralVase( vLayIds, dCorrZ, LayerParams) -- correggo posizione in Z ( per essere sicuri di appoggiare sul piano) EgtMove( nNewEntId, dCorrZ * Z_AX(), GDB_RT.GLOB) - if nSlicingType == SLICING_TYPE.DEG45 then + if nSlicingType == SLICING_TYPE.DEG45_X or nSlicingType == SLICING_TYPE.DEG45_Y then -- eventuale spostamento dell'altezza layer EgtMove( nNewEntId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) end @@ -1089,7 +1089,7 @@ function CalcToolPath.Exec( nPartId) local vtMove = Vector3d( 0, 0, dCorrZ) -- se slicing a 45° aggiungo correzione anche in direzione dello slicing local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') or 1 - if nSlicingType == SLICING_TYPE.DEG45 then + if nSlicingType == SLICING_TYPE.DEG45_X or nSlicingType == SLICING_TYPE.DEG45_Y then vtMove = vtMove + LayerParams.dLayHeight / 2 * LayerParams.vtSlicing end local SolidLayId = EgtGetFirstNameInGroup( s_nPartId, PRINT_SOLID) @@ -1124,7 +1124,7 @@ function CalcToolPath.Exec( nPartId) return else EgtSetStatus( nPathGrpId, GDB_ST.OFF) - end + end -- recupero il gruppo dei percorsi utensile local nTpathGrpId = EgtGetFirstNameInGroup( nCrvGrpId, TOOLPATH_GRP) if not nTpathGrpId then diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 05113a8..6f07362 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -42,8 +42,10 @@ local function LoadParams( sFile, nPartId) local sSlicingType = EgtGetStringFromIni( SEC_DEFAULT, KEY_SLICING_TYPE, 'Vertical', sFile) if sSlicingType == 'Horizontal' then EgtSetInfo( nPartId, KEY_SLICING_TYPE, SLICING_TYPE.HORIZONTAL) - elseif sSlicingType == 'Deg45' then - EgtSetInfo( nPartId, KEY_SLICING_TYPE, SLICING_TYPE.DEG45) + elseif sSlicingType == 'Deg45X' then + EgtSetInfo( nPartId, KEY_SLICING_TYPE, SLICING_TYPE.DEG45_X) + elseif sSlicingType == 'Deg45Y' then + EgtSetInfo( nPartId, KEY_SLICING_TYPE, SLICING_TYPE.DEG45_Y) else EgtSetInfo( nPartId, KEY_SLICING_TYPE, SLICING_TYPE.VERTICAL) end From 298b0a45062b873665034dd6e3d0cb7abef48b40 Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 1 Dec 2022 11:31:18 +0100 Subject: [PATCH 38/79] 3dPrinting : - correzione calcolo toolpath in spiral vase quando sezione varia tra layer. --- LuaLibs/CalcPaths.lua | 16 ++++++++++------ LuaLibs/CalcToolPath.lua | 34 +++++++++++++++++++++++----------- LuaLibs/RunCalcSolids.lua | 5 +++-- 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 1e410b6..820ad6f 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -116,12 +116,16 @@ local function ModifyStartPoint( nCrvId, vPtStart) -- cerco lo start point più vicino tra quelli possibili if vPtStart and #vPtStart > 0 then local nMinIdx = -1 - local dMinDist = GEO.INFINITO - for i = 1, #vPtStart do - local dDist = EgtPointCurveDist( vPtStart[i], nCrvId) - if dDist < dMinDist - 10 * GEO.EPS_SMALL then - dMinDist = dDist - nMinIdx = i + if #vPtStart == 1 then + nMinIdx = 1 + else + local dMinDist = GEO.INFINITO + for i = 1, #vPtStart do + local dDist = EgtPointCurveDist( vPtStart[i], nCrvId) + if dDist < dMinDist - 10 * GEO.EPS_SMALL then + dMinDist = dDist + nMinIdx = i + end end end EgtChangeClosedCurveStartPoint( nCrvId, vPtStart[nMinIdx]) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 72e6d33..29549e6 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -944,7 +944,7 @@ local function AddSpiralVaseLeadOut( nOldId, LayerParams) local nLeadOut = AddLeadOut( nOldId, LayerParams, EgtGetParent( nOldId)) if nLeadOut then local dDelta = LayerParams.dLayHeight / EgtCurveLength( nOldId) * EgtCurveLength( nLeadOut) - EgtSpiralizeCurve( nLeadOut, dDelta) + EgtSpiralizeCurveAlongExtrusion( nLeadOut, dDelta) end AddRetractionOnLastCrv( nOldId, EgtGetParent( nOldId), LayerParams, LayerParams.dCoastingLen, LayerParams.dWipeLen, LayerParams.dWipeDir) else @@ -956,7 +956,7 @@ end --------------------------------------------------------------------- local function SpiralVase( vLayIds, dCorrZ, LayerParams) - local nOldId + local nOldId, nOldPathId local bFirst = true local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') @@ -1007,13 +1007,15 @@ local function SpiralVase( vLayIds, dCorrZ, LayerParams) local nEntId = EgtGetFirstInGroup( nPathGrpId) while nEntId do local nNewEntId = EgtCopyGlob( nEntId, nTpathGrpId, GDB_IN.LAST_SON) - - -- correggo posizione in Z ( per essere sicuri di appoggiare sul piano) - EgtMove( nNewEntId, dCorrZ * Z_AX(), GDB_RT.GLOB) + + -- correggo la posizione del toolpath + local vtMove = dCorrZ * Z_AX() if nSlicingType == SLICING_TYPE.DEG45_X or nSlicingType == SLICING_TYPE.DEG45_Y then -- eventuale spostamento dell'altezza layer - EgtMove( nNewEntId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) + vtMove = vtMove + LayerParams.dLayHeight * LayerParams.vtSlicing end + EgtMove( nNewEntId, vtMove, GDB_RT.GLOB) + EgtModifyCurveExtrusion( nNewEntId, LayerParams.vtSlicing, GDB_RT.GLOB) -- eventuale inversione if LayerParams.bInvert then @@ -1033,19 +1035,29 @@ local function SpiralVase( vLayIds, dCorrZ, LayerParams) end bFirst = false else - -- modifico lo start point per collegarlo alla curva precedente local ptOld = EgtEP( nOldId, GDB_ID.ROOT) - if dist( EgtSP( nNewEntId, GDB_ID.ROOT), ptOld) < LayerParams.dStrand + 10 then - EgtChangeClosedCurveStartPoint( nNewEntId, ptOld, GDB_RT.GLOB) - EgtModifyCurveStartPoint( nNewEntId, ptOld, GDB_RT.GLOB) + local ptNew = EgtSP( nNewEntId, GDB_ID.ROOT) + if dist( ptNew, ptOld) < LayerParams.dStrand then + -- se i punti sono vicini ma non coincidenti modifico la curva per avere transizione più uniforme + if not AreSamePointApprox( ptOld, ptNew) then + -- recupero la curva da usare come guida + local nGuideId = EgtCopyGlob( nOldPathId, nTpathGrpId) + -- la porto alla stessa quota del toolpath + EgtMove( nGuideId, vtMove + LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) + EgtChangeClosedCurveStartPoint( nGuideId, ptOld, GDB_RT.GLOB) + + EgtSpiralizeCurveAlongGuide( nNewEntId, nGuideId) + EgtErase( nGuideId) + end else EgtOutLog( 'Warning : in spiral vase mode no link betweeen toolpaths (layer '..tostring( nIdx)..') - CalcToolPath') -- aggiungo uscita, coasting e wipe sulla curva precedente AddSpiralVaseLeadOut( nOldId, LayerParams) end - EgtSpiralizeCurve( nNewEntId, LayerParams.dLayHeight) + EgtSpiralizeCurveAlongExtrusion( nNewEntId, LayerParams.dLayHeight) end + nOldPathId = nEntId nOldId = nNewEntId nEntId = EgtGetNext( nEntId) end diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index f6f1b2c..5aea6bf 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -114,7 +114,8 @@ local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) -- appiattisco la curva local nCrvCopy = EgtCopyGlob( nCrvId, nGrpTmp) local dDelta = ( ptE - ptS) * LayerParams.vtSlicing - EgtSpiralizeCurve( nCrvCopy, - dDelta) + EgtSpiralizeCurveAlongExtrusion( nCrvCopy, - dDelta) + EgtMergeCurvesInCurveCompo( nCrvCopy) -- calcolo la sezione local vtDir = EgtSV( nCrvCopy, GDB_ID.ROOT) @@ -134,7 +135,7 @@ local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) end local dMove = ( ptRef - ptS) * LayerParams.vtSlicing EgtMove( vCrvs[i+1], LayerParams.vtSlicing * dMove, GDB_RT.GLOB) - EgtSpiralizeCurve( vCrvs[i+1], dDelta) + EgtSpiralizeCurveAlongExtrusion( vCrvs[i+1], dDelta) end local vSurfs = {} for i = 1, #vCrvs - 1 do From fb9ecc811dc2d41a8ba9594d3e301654cdb3116d Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 2 Dec 2022 11:36:09 +0100 Subject: [PATCH 39/79] 3dPrinting : - migliorata organizzazione calcolo toolpath. --- LuaLibs/AddManData.lua | 4 +- LuaLibs/CalcToolPath.lua | 424 +++++++++++++++++--------------- LuaLibs/RunSliceAdvancement.lua | 2 +- LuaLibs/RunSlicing.lua | 8 +- 4 files changed, 237 insertions(+), 201 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 6e3c77f..a5e8b35 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -162,8 +162,8 @@ TYPE = { } PRINT_ORDER = { - EXT_INT_INF = 1, - INF_INT_EXT = 2, + EXT_INT = 1, + INT_EXT = 2, } PRINT_DIRECTION = { diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 29549e6..7e02323 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -61,6 +61,46 @@ local function ComputeZCorrection( LayerParams) return max( dCorr1, dCorr2) end +------------------------------------------------------------------- +local function AddCurvesToToolPath( vEntIds, nTpathGrpId, nOrder, bInvert, vtSlicing, dLayHeight, dCorrZ) + + local vIds = {} -- vettore con gli id ordinati delle curve nel gruppo dei ToolPath + + local nStart = EgtIf( nOrder == PRINT_ORDER.EXT_INT, 1, #vEntIds) + local nEnd = EgtIf( nOrder == PRINT_ORDER.EXT_INT, #vEntIds, 1) + local nStep = EgtIf( nOrder == PRINT_ORDER.EXT_INT, 1, -1) + local nIdx = 1 + for i = nStart, nEnd, nStep do + -- copio nel gruppo toolpath + if i == nStart then + vIds[nIdx] = EgtCopyGlob( vEntIds[i], nTpathGrpId, GDB_IN.LAST_SON) + else + vIds[nIdx] = EgtCopyGlob( vEntIds[i], vIds[nIdx-1], GDB_IN.AFTER) + end + + -- correggo posizione in Z ( per essere sicuri di appoggiare sul piano) + EgtMove( vIds[nIdx], dCorrZ * Z_AX(), GDB_RT.GLOB) + -- mi sposto dell'altezza layer + EgtMove( vIds[nIdx], dLayHeight * vtSlicing, GDB_RT.GLOB) + + if EgtCurveIsClosed( vIds[nIdx]) then + EgtSetInfo( vIds[nIdx], KEY_CLOSED_CRV, 1) + -- eventuale inversione + if bInvert then + EgtInvertCurve( vIds[nIdx]) + EgtSetInfo( vIds[nIdx], KEY_INVERTED_CRV, 1) + end + end + + EgtModifyCurveExtrusion( vIds[nIdx], vtSlicing, GDB_RT.GLOB) + EgtSetColor( vIds[nIdx], EgtStdColor('GRAY')) + EgtSetStatus( vIds[nIdx], GDB_ST.ON) + nIdx = nIdx + 1 + end + + return vIds +end + ------------------------------------------------------------------- local function AddLink( vCrv, nTpathGrpId, nLinkType, dLinkParam, dSPOffs, dStrand, vtSlicing) @@ -135,8 +175,8 @@ local function AddLeadIn( nCrvId, LayerParams, nGrpId) local vtTang = EgtSV( nCrvId, GDB_ID.ROOT) local vtOrtho = Vector3d( vtTang) local dAng = 90 - if ( LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.INF_INT_EXT) or - ( not LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.EXT_INT_INF) then + if ( LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.INT_EXT) or + ( not LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.EXT_INT) then dAng = - 90 end @@ -154,7 +194,7 @@ local function AddLeadIn( nCrvId, LayerParams, nGrpId) end if nLeadInCrv then - EgtRelocate( nLeadInCrv, nGrpId, GDB_IN.FIRST_SON) + EgtRelocate( nLeadInCrv, nCrvId, GDB_IN.BEFORE) EgtModifyCurveExtrusion( nLeadInCrv, LayerParams.vtSlicing, GDB_RT.GLOB) EgtSetInfo( nLeadInCrv, KEY_TYPE, TYPE.LINK) EgtSetName( nLeadInCrv, LEAD_IN_CRV) @@ -168,8 +208,8 @@ local function AddLeadOut( nCrvId, LayerParams, nGrpId) local vtTang = EgtEV( nCrvId, GDB_ID.ROOT) local vtOrtho = Vector3d( vtTang) local dAng = - 90 - if ( LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.INF_INT_EXT) or - ( not LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.EXT_INT_INF) then + if ( LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.INT_EXT) or + ( not LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.EXT_INT) then dAng = 90 end @@ -184,7 +224,7 @@ local function AddLeadOut( nCrvId, LayerParams, nGrpId) end if nLeadOutCrv then - EgtRelocate( nLeadOutCrv, nGrpId, GDB_IN.LAST_SON) + EgtRelocate( nLeadOutCrv, nCrvId, GDB_IN.AFTER) EgtModifyCurveExtrusion( nLeadOutCrv, LayerParams.vtSlicing, GDB_RT.GLOB) EgtSetInfo( nLeadOutCrv, KEY_TYPE, TYPE.LINK) EgtSetName( nLeadOutCrv, LEAD_OUT_CRV) @@ -297,6 +337,161 @@ local function AddRetractionOnLastCrv( nCrvId, nTpathGrpId, LayerParams, dCoasti end end +--------------------------------------------------------------------- +local function CalcShellsToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ) + + if not vEntIds then return end + -- aggiungo le curve nel toolpath + local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, LayerParams.nOrder, LayerParams.bInvert, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) + + -- aggiungo gli opportuni raccordi + AddLink( vIds, nTpathGrpId, LayerParams.nLinkType, LayerParams.dLinkParam, LayerParams.dSPOffs, LayerParams.dStrand, LayerParams.vtSlicing) + + -- aggiungo leadin/leadout + if LayerParams.nLeadInType ~= LEAD_TYPE.NONE then + EgtTrimCurveStartAtLen( vIds[1], LayerParams.dOffsetLP) + AddLeadIn( vIds[1], LayerParams, nTpathGrpId) + end + if LayerParams.nLeadOutType ~= LEAD_TYPE.NONE then + EgtTrimCurveEndAtLen( vIds[#vIds], EgtCurveLength( vIds[#vIds]) - LayerParams.dOffsetLP) + AddLeadOut( vIds[#vIds], LayerParams, nTpathGrpId) + end + + -- aggiungo coasting/wipe + for i = 1, #vIds - 1 do + local nNextId = EgtGetNext( vIds[i]) + if EgtGetInfo( nNextId, KEY_TYPE, 'i') ~= TYPE.LINK then + -- aggiungo retrazione + AddRetraction( vIds[i], LayerParams.vtSlicing, LayerParams.dCoastingLen, LayerParams.dWipeLen, LayerParams.dWipeDir) + end + end + -- sull'ultima curva gestione speciale per eventuale lead out + AddRetractionOnLastCrv( vIds[#vIds], nTpathGrpId, LayerParams, LayerParams.dCoastingLen, LayerParams.dWipeLen, LayerParams.dWipeDir) + +end + +--------------------------------------------------------------------- +local function CalcExtraShellToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ) + + if not vEntIds then return end + -- aggiungo le curve nel toolpath + local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, LayerParams.nOrder, false, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) + + -- aggiungo gli opportuni raccordi + local sPrevName = EgtGetName( vIds[1]) + for i = 2, #vIds do + local sCurrName = EgtGetName( vIds[i]) + -- se hanno lo stesso nome vanno collegate + if sCurrName == sPrevName then + local ptS = EgtEP( vIds[i-1]) + local ptE = EgtSP( vIds[i]) + local nLinkId = EgtCurveCompoFromPoints( nTpathGrpId, {ptS, ptE}) + if nLinkId then + EgtRelocateGlob( nLinkId, vIds[i], GDB_IN.BEFORE) + EgtModifyCurveExtrusion( nLinkId, LayerParams.vtSlicing, GDB_RT.GLOB) + EgtSetInfo( nLinkId, KEY_TYPE, TYPE.LINK) + EgtSetName( nLinkId, LINK_CRV) + end + end + sPrevName = sCurrName + end + + -- aggiungo coasting/wipe + for i = 1, #vIds do + -- verifico non sia collegato al successivo tramite link + local nNextId = EgtGetNext( vIds[i]) + if not nNextId or EgtGetInfo( nNextId, KEY_TYPE, 'i') ~= TYPE.LINK then + -- recupero i parametri + local dCoastingLen, dWipeLen, dWipeDir + local bClosed = EgtGetInfo( vIds[i], KEY_CLOSED_CRV, 'b') or false + if not bClosed then + local bInverted = EgtGetInfo( vIds[i], KEY_INVERTED_CRV, 'b') or false + local vCoastLen = EgtGetInfo( vIds[i], KEY_EXTRA_SHELL_COASTING, 'vd') + local vWipeLen = EgtGetInfo( vIds[i], KEY_EXTRA_SHELL_WIPE, 'vd') + local vWipeDir = EgtGetInfo( vIds[i], KEY_EXTRA_SHELL_WIPE_DIR, 'vd') + -- se curva è stata invertita devo prendere le info legate a quello che era il suo punto di inizio, altrimenti prendo le info legate al punto finale + dCoastingLen = EgtIf( bInverted, vCoastLen[1], vCoastLen[2]) + dWipeLen = EgtIf( bInverted, vWipeLen[1], vWipeLen[2]) + dWipeDir = EgtIf( bInverted, vWipeDir[1], vWipeDir[2]) + else + -- se chiusa considero i parametri delle shell complete + dCoastingLen = LayerParams.dCoastingLen + dWipeLen = LayerParams.dWipeLen + dWipeDir = LayerParams.dWipeDir + end + + AddRetraction( vIds[i], LayerParams.vtSlicing, dCoastingLen, dWipeLen, dWipeDir) + end + end +end + +--------------------------------------------------------------------- +local function CalcInfillToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ) + + if not vEntIds then return end + -- aggiungo le curve nel toolpath + local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, LayerParams.nOrder, LayerParams.bInvert, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) + + -- aggiungo eventuali link + AddLink( vIds, nTpathGrpId, LayerParams.nLinkType, LayerParams.dLinkParam, LayerParams.dSPOffs, LayerParams.dStrand, LayerParams.vtSlicing) + + -- aggiungo coasting/wipe + for i = 1, #vIds do + local nNextId = EgtGetNext( vIds[i]) + if not nNextId or EgtGetInfo( nNextId, KEY_TYPE, 'i') ~= TYPE.LINK then + AddRetraction( vIds[i], LayerParams.vtSlicing, LayerParams.dCoastingLen, LayerParams.dWipeLen, LayerParams.dWipeDir) + end + end +end + +--------------------------------------------------------------------- +local function CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGrpId, LayerParams, dCorrZ) + + if not nAuxSolidsGrp or not nAuxSolidsPathGrp then return end + + -- recupero le curve relative al primo solido ausiliario + local sPrevName = AUX_SOLID_CRV + local nSolidId = EgtGetFirstNameInGroup( nAuxSolidsGrp, AUX_SOLIDS_CRV .. '*') + while nSolidId do + + local sName = EgtGetName( nSolidId) + if sName ~= sPrevName then + + -- recupero tutti i percorsi relativi a quel solido + local vEntIds = EgtGetNameInGroup( nAuxSolidsPathGrp, sName .. '*') + if vEntIds then + + -- recupero i parametri relativi al solido + local nOrder = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_PRINT_ORDER, 'i') + local nLinkType = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_LINK_TYPE, 'i') + local dLinkParam = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_LINK_PARAM, 'd') + local dSPOffset = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_SP_OFFSET, 'd') + local dCoastingLen = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_COASTING_LEN, 'd') + local dWipeLen = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_WIPE_LEN, 'd') + local dWipeDir = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_WIPE_DIR, 'd') + + -- copio i percorsi nel gruppo toolpath + local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, nOrder, LayerParams.bInvert, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) + + -- aggiungo link + AddLink( vIds, nTpathGrpId, nLinkType, dLinkParam, dSPOffset, LayerParams.dStrand, LayerParams.vtSlicing) + + -- coasting e wipe + for i = 1, #vIds do + local nNextId = EgtGetNext( vIds[i]) + if not nNextId or EgtGetInfo( nNextId, KEY_TYPE, 'i') ~= TYPE.LINK then + AddRetraction( vIds[i], LayerParams.vtSlicing, dCoastingLen, dWipeLen, dWipeDir) + end + end + end + end + sPrevName = sName + nSolidId = EgtGetNextName( nSolidId, AUX_SOLIDS_CRV .. '*') + end +end + +------------------------------------------------------------------- +--------------------------- RIBS ----------------------------------- -------------------------------------------------------------------- local function VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) @@ -719,13 +914,14 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n end --------------------------------------------------------------------- -local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) +local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) + if not nRibsGrp then return end + -- gruppo temporaneo con sistema di riferimento locale per conti local frLoc = Frame3d( ORIG(), LayerParams.vtSlicing) - local nGrpTmp = EgtGroup( nCrvGrp, frLoc, GDB_RT.GLOB) + local nGrpTmp = EgtGroup( nRibsGrp, frLoc, GDB_RT.GLOB) - local nRibsGrp = EgtGetFirstNameInGroup( nCrvGrp, RIBS_GRP) -- aggiungo le costolature nel toolpath local vEntIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') for i = 1, #vEntIds do @@ -870,73 +1066,9 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ) end ---------------------------------------------------------------------- -local function CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGrpId, LayerParams, dCorrZ) - - -- recupero le curve relative al primo solido ausiliario - local sPrevName = AUX_SOLID_CRV - local nSolidId = EgtGetFirstNameInGroup( nAuxSolidsGrp, AUX_SOLIDS_CRV .. '*') - while nSolidId do - - local sName = EgtGetName( nSolidId) - if sName ~= sPrevName then - - -- recupero tutti i percorsi relativi a quel solido - local vEntIds = EgtGetNameInGroup( nAuxSolidsPathGrp, sName .. '*') - if vEntIds then - - -- recupero i parametri relativi al solido - local nOrder = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_PRINT_ORDER, 'i') - local nLinkType = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_LINK_TYPE, 'i') - local dLinkParam = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_LINK_PARAM, 'd') - local dSPOffset = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_SP_OFFSET, 'd') - local dCoastingLen = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_COASTING_LEN, 'd') - local dWipeLen = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_WIPE_LEN, 'd') - local dWipeDir = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_WIPE_DIR, 'd') - - -- copio i percorsi nel gruppo toolpath - local nPrev = EgtGetLastInGroup( nTpathGrpId) - for i = 1, #vEntIds do - local nNewEnt = EgtCopyGlob( vEntIds[i], nPrev, EgtIf( i == 1 or nOrder == PRINT_ORDER.EXT_INT_INF, GDB_IN.AFTER, GDB_IN.BEFORE)) - - -- correggo posizione - EgtMove( nNewEnt, dCorrZ * Z_AX(), GDB_RT.GLOB) - EgtMove( nNewEnt, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) - EgtModifyCurveExtrusion( nNewEnt, LayerParams.vtSlicing, GDB_RT.GLOB) - EgtSetInfo( nNewEnt, KEY_TYPE, TYPE.AUX_SOLID) - - if EgtCurveIsClosed( nNewEnt) then - EgtSetInfo( nNewEnt, KEY_CLOSED_CRV, 1) - -- eventuale inversione curva - if LayerParams.bInvert then - EgtInvertCurve( nNewEnt) - end - end - - nPrev = nNewEnt - end - - local vNewEntIds = EgtGetNameInGroup( nTpathGrpId, sName .. '*') - - -- Aggiungo link - AddLink( vNewEntIds, nTpathGrpId, nLinkType, dLinkParam, dSPOffset, LayerParams.dStrand, LayerParams.vtSlicing) - - -- Coasting e wipe - for i = 1, #vNewEntIds do - local nNextId = EgtGetNext( vNewEntIds[i]) or GDB_ID.NULL - local nType = EgtGetInfo( nNextId, KEY_TYPE, 'i') - if nType ~= TYPE.LINK then - AddRetraction( vNewEntIds[i], LayerParams.vtSlicing, dCoastingLen, dWipeLen, dWipeDir) - end - end - end - end - sPrevName = sName - nSolidId = EgtGetNextName( nSolidId, AUX_SOLIDS_CRV .. '*') - end -end - ---------------------------------------------------------------------- +------------------------------------------------------------------- +------------------------- SPIRAL VASE ------------------------------ +-------------------------------------------------------------------- local function AddSpiralVaseLeadOut( nOldId, LayerParams) if LayerParams.nLeadOutType ~= LEAD_TYPE.NONE then @@ -1124,8 +1256,6 @@ function CalcToolPath.Exec( nPartId) -- Ciclo sui layer for nIdx = 1, #vLayIds do - -- recupero eventuale gruppo di solidi ausiliari - nAuxSolidsGrp = EgtGetFirstNameInGroup( vLayIds[nIdx], AUX_SOLIDS_GRP) -- scorro tutti i gruppi di contorni local nCrvGrpId = EgtGetFirstNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*") while nCrvGrpId do @@ -1133,7 +1263,7 @@ function CalcToolPath.Exec( nPartId) local nPathGrpId = EgtGetFirstNameInGroup( nCrvGrpId, PATH_GRP) if not nPathGrpId then EgtOutBox( 'Error missing paths', 'ToolPathCalc') - return + return else EgtSetStatus( nPathGrpId, GDB_ST.OFF) end @@ -1145,126 +1275,32 @@ function CalcToolPath.Exec( nPartId) else EgtEmptyGroup( nTpathGrpId) end - -- creo il percorso di lavoro : - -- copio le curve, le ordino, le oriento e le muovo in Z - local nEntId = EgtGetFirstInGroup( nPathGrpId) - while nEntId do - local nNewEntId = EgtCopyGlob( nEntId, nTpathGrpId, EgtIf( LayerParams.nOrder == PRINT_ORDER.INF_INT_EXT, GDB_IN.FIRST_SON, GDB_IN.LAST_SON)) - -- correggo posizione in Z ( per essere sicuri di appoggiare sul piano) - EgtMove( nNewEntId, dCorrZ * Z_AX(), GDB_RT.GLOB) - -- mi sposto dell'altezza layer - EgtMove( nNewEntId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) - -- eventuale inversione - local nType = EgtGetInfo( nNewEntId, KEY_TYPE, 'i') - if LayerParams.bInvert then - if nType == TYPE.OUTER_SHELL or nType == TYPE.INNER_SHELL or ( nType == TYPE.INFILL and EgtCurveIsClosed( nNewEntId)) then - EgtInvertCurve( nNewEntId) - EgtSetInfo( nNewEntId, KEY_INVERTED_CRV, 1) - end - end - - if EgtCurveIsClosed( nNewEntId) then - EgtSetInfo( nNewEntId, KEY_CLOSED_CRV, 1) - end - - EgtModifyCurveExtrusion( nNewEntId, LayerParams.vtSlicing, GDB_RT.GLOB) - EgtSetColor( nNewEntId, EgtStdColor('GRAY')) - EgtSetStatus( nNewEntId, GDB_ST.ON) - nEntId = EgtGetNext( nEntId) + + -- shells + local vShellIds = EgtGetNameInGroup( nPathGrpId, SHELL_CRV .. '*') + local vExtraShellIds = EgtGetNameInGroup( nPathGrpId, EXTRA_SHELL_CRV .. '*') + local vInfillIds = EgtGetNameInGroup( nPathGrpId, INFILL_CRV .. '*') + + if LayerParams.nOrder == PRINT_ORDER.EXT_INT then + CalcShellsToolPath( vShellIds, nTpathGrpId, LayerParams, dCorrZ) + CalcExtraShellToolPath( vExtraShellIds, nTpathGrpId, LayerParams, dCorrZ) + CalcInfillToolPath( vInfillIds, nTpathGrpId, LayerParams, dCorrZ) + else + CalcInfillToolPath( vInfillIds, nTpathGrpId, LayerParams, dCorrZ) + CalcExtraShellToolPath( vExtraShellIds, nTpathGrpId, LayerParams, dCorrZ) + CalcShellsToolPath( vShellIds, nTpathGrpId, LayerParams, dCorrZ) end - -- aggiungo gli opportuni raccordi sulle shell complete - local vIds = EgtGetAllInGroup( nTpathGrpId) - AddLink( vIds, nTpathGrpId, LayerParams.nLinkType, LayerParams.dLinkParam, LayerParams.dSPOffs, LayerParams.dStrand, LayerParams.vtSlicing) - - -- aggiungo gli opportuni raccordi sulle shell con numero diverso di passate - local nPrev = EgtGetFirstNameInGroup( nTpathGrpId, EXTRA_SHELL_CRV .. '*') - local sPrevName = EgtGetName( nPrev or GDB_ID.NULL) - local nCurr = EgtGetNextName( nPrev or GDB_ID.NULL, EXTRA_SHELL_CRV .. '*') - while nCurr do - local sCurrName = EgtGetName( nCurr) - if sCurrName == sPrevName then - local ptS = EgtEP( nPrev) - local ptE = EgtSP( nCurr) - local nLinkId = EgtCurveCompoFromPoints( nTpathGrpId, {ptS, ptE}) - if nLinkId then - EgtRelocateGlob( nLinkId, nCurr, GDB_IN.BEFORE) - EgtModifyCurveExtrusion( nLinkId, LayerParams.vtSlicing, GDB_RT.GLOB) - EgtSetInfo( nLinkId, KEY_TYPE, TYPE.LINK) - EgtSetName( nLinkId, LINK_CRV) - end - end - sPrevName = sCurrName - nPrev = nCurr - nCurr = EgtGetNextName( nCurr, EXTRA_SHELL_CRV .. '*') - end - - -- aggiungo leadin/leadout - local nFirstCurve = EgtGetFirstInGroup( nTpathGrpId) - if nFirstCurve and LayerParams.nLeadInType ~= LEAD_TYPE.NONE then - EgtTrimCurveStartAtLen( nFirstCurve, LayerParams.dOffsetLP) - AddLeadIn( nFirstCurve, LayerParams, nTpathGrpId) - end - local nLastCurve = EgtGetLastInGroup( nTpathGrpId) - if nLastCurve and LayerParams.nLeadOutType ~= LEAD_TYPE.NONE then - EgtTrimCurveEndAtLen( nLastCurve, EgtCurveLength( nLastCurve) - LayerParams.dOffsetLP) - AddLeadOut( nLastCurve, LayerParams, nTpathGrpId) - end - - -- aggiungo coasting/wipe - local nId = EgtGetFirstInGroup( nTpathGrpId) - if EgtGetName( nId or GDB_ID.NULL) == LEAD_IN_CRV then nId = EgtGetNext( nId) end - local nFirstId = nId - local nLastId = EgtGetLastInGroup( nTpathGrpId) - if EgtGetName( nLastId or GDB_ID.NULL) == LEAD_OUT_CRV then nLastId = EgtGetPrev( nLastId) end - while nId do - -- recupero i parametri - local dCoastingLen, dWipeLen, dWipeDir - local nType = EgtGetInfo( nId, KEY_TYPE, 'i') - local bClosed = EgtGetInfo( nId, KEY_CLOSED_CRV, 'b') or false - if ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed then - local bInverted = EgtGetInfo( nId, KEY_INVERTED_CRV, 'b') or false - local vCoastLen = EgtGetInfo( nId, KEY_EXTRA_SHELL_COASTING, 'vd') - local vWipeLen = EgtGetInfo( nId, KEY_EXTRA_SHELL_WIPE, 'vd') - local vWipeDir = EgtGetInfo( nId, KEY_EXTRA_SHELL_WIPE_DIR, 'vd') - -- se curva è stata invertita devo prendere le info legate a quello che era il suo punto di inizio, altrimenti prendo le info legate al punto finale - dCoastingLen = EgtIf( bInverted, vCoastLen[1], vCoastLen[2]) - dWipeLen = EgtIf( bInverted, vWipeLen[1], vWipeLen[2]) - dWipeDir = EgtIf( bInverted, vWipeDir[1], vWipeDir[2]) - else - dCoastingLen = LayerParams.dCoastingLen - dWipeLen = LayerParams.dWipeLen - dWipeDir = LayerParams.dWipeDir - end - - if nId == nLastId then - AddRetractionOnLastCrv( nId, nTpathGrpId, LayerParams, dCoastingLen, dWipeLen, dWipeDir) - else - local nNextId = EgtGetNext( nId) - if EgtGetInfo( nNextId, KEY_TYPE, 'i') ~= TYPE.LINK then - -- aggiungo retrazione - if nId == nFirstId then - AddRetraction( nId, LayerParams.vtSlicing, dCoastingLen, EgtIf( LayerParams.nLeadInType == LEAD_TYPE.NONE, dWipeLen, 0), dWipeDir) - else - AddRetraction( nId, LayerParams.vtSlicing, dCoastingLen, dWipeLen, dWipeDir) - end - end - end - nId = EgtGetNextName( nId, SHELL_CRV .. "*") or EgtGetNextName( nId, EXTRA_SHELL_CRV .. "*") or EgtGetNextName( nId, INFILL_CRV .. '') - end - - -- sistemo i solid ausiliari + -- solidi ausiliari + local nAuxSolidsGrp = EgtGetFirstNameInGroup( vLayIds[nIdx], AUX_SOLIDS_GRP) local nAuxSolidsPathGrp = EgtGetFirstNameInGroup( nCrvGrpId, AUX_SOLIDS_GRP) - if nAuxSolidsGrp then - CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGrpId, LayerParams, dCorrZ) - end - -- sistemo le costolature + CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGrpId, LayerParams, dCorrZ) + + -- costolature local nRibsGrp = EgtGetFirstNameInGroup( nCrvGrpId, RIBS_GRP) - if nRibsGrp then - CalcRibsToolPath( nCrvGrpId, nTpathGrpId, LayerParams, dCorrZ) - end + CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) - --passo al gruppo di contorni successivo + -- passo al gruppo di contorni successivo nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") end diff --git a/LuaLibs/RunSliceAdvancement.lua b/LuaLibs/RunSliceAdvancement.lua index b172f97..f013ae2 100644 --- a/LuaLibs/RunSliceAdvancement.lua +++ b/LuaLibs/RunSliceAdvancement.lua @@ -124,7 +124,7 @@ function RunSliceAdvancement.Exec() local ToHideList if nAdvancementType == SLICE_ADV_TYPE.ALL then nSegmentQty = #ShellList[1] + #ShellList[2] + #ShellList[3] - if nPrintOrder == PRINT_ORDER.EXT_INT_INF then + if nPrintOrder == PRINT_ORDER.EXT_INT then SegmentList = ShellList[1] for i = 1, #ShellList[2] do SegmentList[#SegmentList + 1] = ShellList[2][i] diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 6f07362..51c090a 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -58,9 +58,9 @@ local function LoadParams( sFile, nPartId) local sStrandOrder = EgtGetStringFromIni( SEC_DEFAULT, KEY_PRINT_ORDER, 'InToOut', sFile) if sStrandOrder == 'OutToIn' then - EgtSetInfo( nPartId, KEY_PRINT_ORDER, PRINT_ORDER.EXT_INT_INF) + EgtSetInfo( nPartId, KEY_PRINT_ORDER, PRINT_ORDER.EXT_INT) else -- 'InToOut' - EgtSetInfo( nPartId, KEY_PRINT_ORDER, PRINT_ORDER.INF_INT_EXT) + EgtSetInfo( nPartId, KEY_PRINT_ORDER, PRINT_ORDER.INT_EXT) end local sStrandDirection = EgtGetStringFromIni( SEC_DEFAULT, KEY_PRINT_DIRECTION, 'CCW', sFile) @@ -183,9 +183,9 @@ local function LoadParams( sFile, nPartId) local sAuxSolidsStrandOrder = EgtGetStringFromIni( SEC_DEFAULT, KEY_AUX_SOLIDS_PRINT_ORDER, 'InToOut', sFile) if sAuxSolidsStrandOrder == 'OutToIn' then - EgtSetInfo( nPartId, KEY_AUX_SOLIDS_PRINT_ORDER, PRINT_ORDER.EXT_INT_INF) + EgtSetInfo( nPartId, KEY_AUX_SOLIDS_PRINT_ORDER, PRINT_ORDER.EXT_INT) else -- 'InToOut' - EgtSetInfo( nPartId, KEY_AUX_SOLIDS_PRINT_ORDER, PRINT_ORDER.INF_INT_EXT) + EgtSetInfo( nPartId, KEY_AUX_SOLIDS_PRINT_ORDER, PRINT_ORDER.INT_EXT) end local sAuxSolidsLinkType = EgtGetStringFromIni( SEC_DEFAULT, KEY_AUX_SOLIDS_LINK_TYPE, 'None', sFile) From 076e2382ab10925fc55b2f6ccde0253476f23a27 Mon Sep 17 00:00:00 2001 From: DarioS Date: Mon, 5 Dec 2022 08:22:16 +0100 Subject: [PATCH 40/79] 3dPrinting : - piccole modifiche per stampa 45deg su Y e gestione movimento solido conseguente. --- LuaLibs/CalcSlices.lua | 8 ++++---- LuaLibs/CalcToolPath.lua | 2 +- LuaLibs/RunSlicing.lua | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 38e838e..f0c5e5c 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -280,12 +280,12 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) -- recupero la direzione dello slicing local vtSlicing = Z_AX() local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') - if nSlicingType == SLICING_TYPE.HORIZONTAL then - vtSlicing = X_AX() - elseif nSlicingType == SLICING_TYPE.DEG45_X then + if nSlicingType == SLICING_TYPE.DEG45_X then vtSlicing = VectorFromSpherical( 1, 45, 0) elseif nSlicingType == SLICING_TYPE.DEG45_Y then - vtSlicing = VectorFromSpherical( 1, 45, 90) + vtSlicing = VectorFromSpherical( 1, 45, -90) + elseif nSlicingType == SLICING_TYPE.HORIZONTAL then + vtSlicing = X_AX() end EgtSetInfo( s_nPartId, KEY_SLICING_DIR, vtSlicing) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 7e02323..9b4628d 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -1241,7 +1241,7 @@ function CalcToolPath.Exec( nPartId) EgtSetInfo( s_nPartId, KEY_MOVED_PART, vtMove) local EntId = EgtGetFirstInGroup( SolidLayId) while EntId do - EgtMove( EntId, vtMove) + EgtMove( EntId, vtMove, GDB_RT.GLOB) EntId = EgtGetNext( EntId) end end diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 51c090a..702a6b2 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -216,7 +216,7 @@ local function RestoreSolidPosition( nPartId) if SolidLayId then local EntId = EgtGetFirstInGroup( SolidLayId) while EntId do - EgtMove( EntId, vtMove) + EgtMove( EntId, vtMove, GDB_RT.GLOB) EntId = EgtGetNext( EntId) end end From 313e837f419c063f11710a36d30cdfbd140f462b Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 6 Dec 2022 08:43:34 +0100 Subject: [PATCH 41/79] 3dPrinting : - modificato ordine di default per realizzazione setti ( unbounded fatti per primi). --- LuaLibs/CalcPaths.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 820ad6f..51ada92 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -33,7 +33,7 @@ local function GetLayerParamsForPathCalc() -- parametri costolature LayerParams.bRibsInvertOrder = EgtGetInfo( s_nPartId, KEY_RIBS_INVERT_ORDER, 'b') LayerParams.bRibsDoLinkFirst = EgtGetInfo( s_nPartId, KEY_RIBS_DO_LINK_FIRST, 'b') or false - LayerParams.nRibsPrintOrder = EgtGetInfo( s_nPartId, KEY_RIBS_PRINT_ORDER, 'i') or 1 + LayerParams.nRibsPrintOrder = EgtGetInfo( s_nPartId, KEY_RIBS_PRINT_ORDER, 'i') or 5 -- parametri regioni con diverse passate LayerParams.dShellNbrCoasting = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_COASTING, 'd') LayerParams.dShellNbrWipe = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE, 'd') From 6d03a8e8985d401b38ddce668fd1f91d231c62a3 Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 6 Dec 2022 09:36:48 +0100 Subject: [PATCH 42/79] 3dPrinting : - corretto errore nelle intersezioni di setti con overlap diversi. --- LuaLibs/CalcPaths.lua | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 51ada92..f3cbc30 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -531,11 +531,9 @@ end -- Funzione che sistema le intersezioni fra costolature nel caso generico local function AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nOffsGrp) - -- calcolo gli offset della curva principale ( nCrv1) da usare per trim + -- calcolo la superficie della curva principale ( nCrv1) da usare per trim local nShells = EgtGetInfo( nCrv1, KEY_RIBS_SHELLS_NBR, 'i') - local nOverlap1 = EgtGetInfo( nCrv1, KEY_RIBS_OVERLAP, 'i') - local nOverlap2 = EgtGetInfo( nCrv2, KEY_RIBS_OVERLAP, 'i') - local nOverlap = min( nOverlap1, nOverlap2) + local nOverlap = EgtGetInfo( nCrv2, KEY_RIBS_OVERLAP, 'i') local dOffs = ( nShells - 1) * LayerParams.dStrand / 2 local nSrf = EgtSurfFrFatCurve( nOffsGrp, nCrv1, dOffs + ( 1 - nOverlap / 100) * LayerParams.dStrand, false) if not nSrf then return end From 1f8881a4c3555dc77c222b248d2436c957e273c3 Mon Sep 17 00:00:00 2001 From: DarioS Date: Wed, 7 Dec 2022 12:19:47 +0100 Subject: [PATCH 43/79] 3dPrinting : - modifiche a determinazione parametri calcolo MF e SC per Ribs Unbounded. --- LuaLibs/RunMachParamFromSWCalc.lua | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/LuaLibs/RunMachParamFromSWCalc.lua b/LuaLibs/RunMachParamFromSWCalc.lua index eec4539..ff8528c 100644 --- a/LuaLibs/RunMachParamFromSWCalc.lua +++ b/LuaLibs/RunMachParamFromSWCalc.lua @@ -1,4 +1,4 @@ --- RunMachParamFromSWCalc.lua by Egaltech s.r.l. 2022/11/22 +-- RunMachParamFromSWCalc.lua by Egaltech s.r.l. 2022/12/07 -- Calcolo dei parametri di stampa -- Tabella per definizione modulo @@ -121,6 +121,17 @@ function RunMachParamFromSWCalc.Exec() if dTotLayerArea > 1 then dMF = dTotLayerLength * dStrand / dTotLayerArea * 100 dSC = dStrandCount + else + dMF = 100 + local nRibsLayId = EgtGetFirstNameInGroup( nLayerId, RIBS_GRP) or GDB_ID.NULL + local nCrvId = EgtGetFirstInGroup( nRibsLayId) + while nCrvId do + if EgtGetInfo( nCrvId, KEY_RIBS_TYPE, 'i') == RIB_TYPE.UNBOUNDED then + dSC = ( EgtGetInfo( nCrvId, KEY_RIBS_SHELLS_NBR, 'd') or dSC) / 2 + break + end + nCrvId = EgtGetNext( nCrvId) + end end -- calcolo tempi stimati del layer local dTMin = ( dMF + MATERIAL.AMin) / MATERIAL.BMin * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dSC, MATERIAL.KN) From a7617c2761f97edbbfe32ee7d7b1b3d2a381732f Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 12 Dec 2022 12:34:50 +0100 Subject: [PATCH 44/79] 3dPrinting : - corretto errore nel calcolo dei solidi per spiral vase. --- LuaLibs/RunCalcSolids.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index 5aea6bf..d7fb6b4 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -116,6 +116,7 @@ local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) local dDelta = ( ptE - ptS) * LayerParams.vtSlicing EgtSpiralizeCurveAlongExtrusion( nCrvCopy, - dDelta) EgtMergeCurvesInCurveCompo( nCrvCopy) + EgtChangeClosedCurveStartPoint( nCrvCopy, ptS, GDB_RT.GLOB) -- calcolo la sezione local vtDir = EgtSV( nCrvCopy, GDB_ID.ROOT) From ef49a211ab8d106c0686c74feecf492f35c42651 Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 16 Dec 2022 16:55:40 +0100 Subject: [PATCH 45/79] 3dPrinting : - migliorie nel calcolo solidi per spiral vase. --- LuaLibs/RunCalcSolids.lua | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index d7fb6b4..3c7054d 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -118,17 +118,21 @@ local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) EgtMergeCurvesInCurveCompo( nCrvCopy) EgtChangeClosedCurveStartPoint( nCrvCopy, ptS, GDB_RT.GLOB) - -- calcolo la sezione + -- calcolo la sezione iniziale local vtDir = EgtSV( nCrvCopy, GDB_ID.ROOT) vtDir:rotate( LayerParams.vtSlicing, 90) local nSectId = CreateSection( ptS, vtDir, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nGrpTmp) + -- creo la sezione finale + local vtDir2 = EgtEV( nCrvCopy, GDB_ID.ROOT) + vtDir2:rotate( LayerParams.vtSlicing, 90) + local nSectE = CreateSection( ptE, vtDir2, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nGrpTmp) -- creo il solido aperto (tubo) local vCrvs = {} local _, dParE = EgtCurveDomain( nSectId) for i = 0, dParE do local ptRef = EgtUP( nSectId, i, GDB_ID.ROOT) - local dOffs = ( ptRef - ptS) * vtDir + local dOffs = ( ptS - ptRef) * vtDir vCrvs[i+1] = EgtOffsetCurveAdv( nCrvCopy, dOffs) if not vCrvs[i+1] or vCrvs[i+1] == GDB_ID.NULL then EgtErase( nGrpTmp) @@ -137,6 +141,11 @@ local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) local dMove = ( ptRef - ptS) * LayerParams.vtSlicing EgtMove( vCrvs[i+1], LayerParams.vtSlicing * dMove, GDB_RT.GLOB) EgtSpiralizeCurveAlongExtrusion( vCrvs[i+1], dDelta) + + -- modifico la curva per congiungerla ai caps + EgtAddCurveCompoLine( vCrvs[i+1], ptRef, false, GDB_RT.GLOB) + local ptRefEnd = EgtUP( nSectE, i, GDB_ID.ROOT) + EgtAddCurveCompoLine( vCrvs[i+1], ptRefEnd, true, GDB_RT.GLOB) end local vSurfs = {} for i = 1, #vCrvs - 1 do @@ -147,20 +156,16 @@ local function CreateSpiralVaseSolid( nCrvId, nSolidGrp, LayerParams, dStrand) end end local nSrfId = EgtSurfTmBySewing( nSolidGrp, vSurfs) - EgtInvertSurf( nSrfId) -- creazione del mezzo disco iniziale local nCap1 = CreateSpiralVaseCap( nSectId, - vtS, nSolidGrp) -- creazione del mezzo disco finale - local vtDir2 = EgtEV( nCrvCopy, GDB_ID.ROOT) - vtDir2:rotate( LayerParams.vtSlicing, 90) - local nSectE = CreateSection( ptE, vtDir2, dStrand, LayerParams.dLayHeight, LayerParams.vtSlicing, nGrpTmp) local nCap2 = CreateSpiralVaseCap( nSectE, vtE, nSolidGrp) EgtInvertSurf( nCap2) -- cancello le curve usate per la costruzione EgtErase( nGrpTmp) - + return EgtSurfTmBySewing( nSolidGrp, { nSrfId, nCap1, nCap2}) end From 5e3def88fa4ecf1bafe7eba0c45c15a7dc36cd1a Mon Sep 17 00:00:00 2001 From: DarioS Date: Tue, 20 Dec 2022 11:05:16 +0100 Subject: [PATCH 46/79] 3dPrinting : - piccola correzione a AddRetraction per evitare crash. --- LuaLibs/CalcSlices.lua | 4 ++-- LuaLibs/CalcToolPath.lua | 19 +++++++++---------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index f0c5e5c..eb12a26 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -304,8 +304,8 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) local dZmax = b3Box:getMax():getZ() local dMaxH = ComputeMaxH( nStmId, frSlicing, HMax) dZmax = min( dZmax, dMaxH) - -- dZmin = 20 - -- dZmax = 230 + --dZmin = 708 + --dZmax = 712 -- Eseguo slicing local nLayCnt = 1 diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 9b4628d..5d56c5f 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -1,4 +1,4 @@ --- CalcToolPath.lua by Egaltech s.r.l. 2022/10/01 +-- CalcToolPath.lua by Egaltech s.r.l. 2022/12/20 -- Calcolo percorsi di lavoro per Stampa 3d -- Tabella per definizione modulo @@ -234,18 +234,18 @@ end -------------------------------------------------------------------- local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDir) - + -- recupero i parametri per retrazione local nType = EgtGetInfo( nCrvId, KEY_TYPE, 'i') local bClosed = EgtGetInfo( nCrvId, KEY_CLOSED_CRV, 'b') or false local bInverted = EgtGetInfo( nCrvId, KEY_INVERTED_CRV, 'b') or false - + -- curva ausiliaria per generare correttamente wipe local nCopyId = EgtCopyGlob( nCrvId, nCrvId, GDB_IN.AFTER) EgtCloseCurveCompo( nCopyId) local ptNewStart = EgtEP( nCrvId) EgtChangeClosedCurveStartPoint( nCopyId, ptNewStart) - + local nCoastingId if dCoastingLen > GEO.EPS_SMALL then nCoastingId = EgtCopyGlob( nCrvId, nCrvId, GDB_IN.AFTER) @@ -272,9 +272,9 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi local nWipeId if bClosed then -- se era chiusa ( quindi analogo alle shell) - nWipeId = EgtCopyGlob( nCopyId, nCoastingId or nCrvId, GDB_IN.AFTER) + nWipeId = nCopyId + nCopyId = nil EgtTrimCurveEndAtLen( nWipeId, dWipeLen) - else -- se extra shell, infill a zigzag, spiral vase o rib che non termina sulla parete local vtDir = EgtEV( nCoastingId or nCrvId, GDB_ID.ROOT) @@ -298,8 +298,7 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi ptE = ptS + vtDir * dWipeLen k = k + 1 end - - nWipeId = EgtCurveCompoFromPoints( EgtGetParent( nCrvId), {ptS, ptE}, GDB_RT.GLOB) + nWipeId = EgtCurveCompoFromPoints( EgtGetParent( nCoastingId or nCrvId), {ptS, ptE}, GDB_RT.GLOB) EgtModifyCurveExtrusion( nWipeId, vtSlicing, GDB_RT.GLOB) EgtRelocateGlob( nWipeId, nCoastingId or nCrvId, GDB_IN.AFTER) end @@ -308,8 +307,8 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi EgtSetInfo( nWipeId, KEY_TYPE, TYPE.WIPE) EgtSetColor( nWipeId, EgtStdColor('AQUA')) end - - EgtErase( nCopyId) + + if nCopyId then EgtErase( nCopyId) end return nCoastingId end From d7b5d7d16dcf71e406708ae4cc391aa9bd8b00c3 Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 27 Dec 2022 12:21:30 +0100 Subject: [PATCH 47/79] 3dPrinting : - corretto rilevamento dell'intersezione fra setti. --- LuaLibs/CalcPaths.lua | 36 +++++++++++++++++++++--------------- LuaLibs/CalcToolPath.lua | 2 +- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index f3cbc30..77cb179 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -469,7 +469,7 @@ local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOff end -------------------------------------------------------------------- -local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf2, nGrp, nOffsGrp) +local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf2, dWidth, nGrp, nOffsGrp) -- setti interni ed esterni non si possono intersecare per definizione if ( nType1 == RIB_TYPE.INTERNAL and nType2 == RIB_TYPE.EXTERNAL) or ( nType1 == RIB_TYPE.EXTERNAL and nType2 == RIB_TYPE.INTERNAL) then @@ -490,22 +490,23 @@ local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf ptInt = EgtIP( nCrv1, nCrv2, ORIG(), GDB_ID.ROOT) -- se non si intersecano, verifico se si intersecano i loro offset + local bFound = false if not ptInt then - local bFound = false local vOffs1 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv1)) local vOffs2 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv2)) for i = 1, #vOffs1 do - local nOffs1 = EgtCopyGlob( vOffs1[i], nGrp) - for j = 1, #vOffs2 do - -- porto nel gruppo locale e verifico se intersezione - local nOffs2 = EgtCopyGlob( vOffs2[j], nGrp) - ptInt = EgtIP( nOffs1, nOffs2, ORIG(), GDB_ID.ROOT) - if ptInt then - bFound = true - break + local nSrfOffs1 = EgtSurfFrFatCurve( nGrp, vOffs1[i], dWidth, false) + if nSrfOffs1 then + for j = 1, #vOffs2 do + -- verifico se intersezione + local nRes = EgtCurveWithRegionClassify( vOffs2[j], nSrfOffs1) + if nRes == GDB_CRC.IN or nRes == GDB_CRC.INTERS then + bFound = true + break + end end + if bFound then break end end - if bFound then break end end end @@ -522,6 +523,8 @@ local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf -- nel caso unbounded l'intersezione può essere ovunque bInters = true end + else + bInters = bFound end return bInters, ptInt @@ -655,12 +658,15 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa for j = i + 1, #vRibsIds do local nType2 = EgtGetInfo( vRibsIds[j], KEY_RIBS_TYPE, 'i') - local bRibInters, ptInt = VerifyRibsIntersection( vRibsIds[i], vRibsIds[j], nType1, nType2, nSrfOffs1, nSrfOffs2, nGrpTmp, nOffsGrp) + local bRibInters, ptInt = VerifyRibsIntersection( vRibsIds[i], vRibsIds[j], nType1, nType2, nSrfOffs1, nSrfOffs2, 0.5 * LayerParams.dStrand, nGrpTmp, nOffsGrp) if bRibInters then bInters = true - - local dPar1 = EgtCurveParamAtPoint( vRibsIds[i], ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) - local dPar2 = EgtCurveParamAtPoint( vRibsIds[j], ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) + + local dPar1, dPar2 + if ptInt then + dPar1 = EgtCurveParamAtPoint( vRibsIds[i], ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) + dPar2 = EgtCurveParamAtPoint( vRibsIds[j], ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) + end local _, dParE1 = EgtCurveDomain( vRibsIds[i]) local _, dParE2 = EgtCurveDomain( vRibsIds[j]) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 5d56c5f..4fcdf68 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -931,7 +931,7 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) -- mi sposto dell'altezza layer EgtMove( nNewEntId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) EgtModifyCurveExtrusion( nNewEntId, LayerParams.vtSlicing, GDB_RT.GLOB) - -- EgtSetColor( nNewEntId, EgtStdColor('GRAY')) + EgtSetColor( nNewEntId, EgtStdColor('MAROON')) end -- estraggo i contorni di tutte le superfici di offset From f9d774a7eb6110830f8063fda6475df434c9b9ef Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Tue, 27 Dec 2022 14:48:09 +0100 Subject: [PATCH 48/79] - migliorata gestione wait time --- LuaLibs/RunMachParamFromSWCalc.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/LuaLibs/RunMachParamFromSWCalc.lua b/LuaLibs/RunMachParamFromSWCalc.lua index ff8528c..bb45f9a 100644 --- a/LuaLibs/RunMachParamFromSWCalc.lua +++ b/LuaLibs/RunMachParamFromSWCalc.lua @@ -143,10 +143,10 @@ function RunMachParamFromSWCalc.Exec() local dLayerTime = dTTrg if dLayerFeed == 0 then dLayerFeed = dFTrg - dLayerWait = dTMin - dLayerTime else dLayerTime = dTotLayerLength / dLayerFeed * 60 end + dLayerWait = floor( dTMin + 0.5) - floor( dLayerTime + 0.5) -- calcolo la portata local Vf = dLayerFeed * ( ( dStrand - dSliceStep) * dSliceStep + pi * pow( dSliceStep / 2, 2)) / 1000 -- calcolo speed @@ -164,6 +164,7 @@ function RunMachParamFromSWCalc.Exec() if not bSpeedOk then dLayerFeed = ( MATERIAL.C1 * pow( ( dSpeed / ( MATERIAL.K / 100.0)), MATERIAL.C2)) * 1000 / ( ( dStrand - dSliceStep) * dSliceStep + pi * pow( dSliceStep / 2, 2)) dLayerTime = dTotLayerLength / dLayerFeed * 60 + dLayerWait = floor( dTMin + 0.5) - floor( dLayerTime + 0.5) end -- calcolo massa dello strato local dLayerMass = dTotLayerLength * dSliceStep * dStrand * MATERIAL.Density * 1e-6 From 96a6f3245885badf168693f39e47b1fca45dfede Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Tue, 27 Dec 2022 16:34:44 +0100 Subject: [PATCH 49/79] - aggiornamento con nuove costanti materiale --- LuaLibs/RunMachParamFromSWCalc.lua | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/LuaLibs/RunMachParamFromSWCalc.lua b/LuaLibs/RunMachParamFromSWCalc.lua index bb45f9a..a92475d 100644 --- a/LuaLibs/RunMachParamFromSWCalc.lua +++ b/LuaLibs/RunMachParamFromSWCalc.lua @@ -1,4 +1,4 @@ --- RunMachParamFromSWCalc.lua by Egaltech s.r.l. 2022/12/07 +-- RunMachParamFromSWCalc.lua by Egaltech s.r.l. 2022/12/27 -- Calcolo dei parametri di stampa -- Tabella per definizione modulo @@ -12,9 +12,12 @@ EgtOutLog( ' RunMachParamFromSWCalc started', 1) -- Costanti generali local AMD = require( 'AddManData') +--local MACHINING = {} +--MACHINING.K = 103 --local MATERIAL = {} --MATERIAL.Name = 'AKROMID® B3 ICF 40' ---MATERIAL.K = 110 +--MATERIAL.K_EXTRUSION = 110 +--MATERIAL.K_LAYERTIME = 105 --MATERIAL.C1 = 0.8742 --MATERIAL.C2 = 0.8964 --MATERIAL.Density = 1.31 @@ -134,9 +137,9 @@ function RunMachParamFromSWCalc.Exec() end end -- calcolo tempi stimati del layer - local dTMin = ( dMF + MATERIAL.AMin) / MATERIAL.BMin * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dSC, MATERIAL.KN) - local dTTrg = ( dMF + MATERIAL.ATrg) / MATERIAL.BTrg * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dSC, MATERIAL.KN) - local dTMax = ( dMF + MATERIAL.AMax) / MATERIAL.BMax * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dSC, MATERIAL.KN) + local dTMin = ( MATERIAL.K_LAYERTIME / 100.0) * ( dMF + MATERIAL.AMin) / MATERIAL.BMin * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dSC, MATERIAL.KN) + local dTTrg = ( MATERIAL.K_LAYERTIME / 100.0) * ( dMF + MATERIAL.ATrg) / MATERIAL.BTrg * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dSC, MATERIAL.KN) + local dTMax = ( MATERIAL.K_LAYERTIME / 100.0) * ( dMF + MATERIAL.AMax) / MATERIAL.BMax * pow( 0.25 * dStrand, MATERIAL.KW) * pow( dSliceStep, MATERIAL.KZ) * pow( dSC, MATERIAL.KN) local dFMin = dTotLayerLength / dTMax * 60 local dFTrg = dTotLayerLength / dTTrg * 60 local dFMax = dTotLayerLength / dTMin * 60 @@ -150,7 +153,7 @@ function RunMachParamFromSWCalc.Exec() -- calcolo la portata local Vf = dLayerFeed * ( ( dStrand - dSliceStep) * dSliceStep + pi * pow( dSliceStep / 2, 2)) / 1000 -- calcolo speed - local dSpeed = ( MATERIAL.K / 100.0) * pow( Vf / MATERIAL.C1, 1 / MATERIAL.C2) + local dSpeed = ( MATERIAL.K_EXTRUSION / 100.0) * ( MACHINING.K / 100.0) * pow( Vf / MATERIAL.C1, 1 / MATERIAL.C2) -- verifico se speed esce da minimo e massimo della macchina local bSpeedOk = true if dSpeed < dSMin then @@ -162,7 +165,7 @@ function RunMachParamFromSWCalc.Exec() dSpeed = dSMax end if not bSpeedOk then - dLayerFeed = ( MATERIAL.C1 * pow( ( dSpeed / ( MATERIAL.K / 100.0)), MATERIAL.C2)) * 1000 / ( ( dStrand - dSliceStep) * dSliceStep + pi * pow( dSliceStep / 2, 2)) + dLayerFeed = ( MATERIAL.C1 * pow( ( dSpeed / (( MATERIAL.K_EXTRUSION / 100.0) * ( MACHINING.K / 100.0))), MATERIAL.C2)) * 1000 / ( ( dStrand - dSliceStep) * dSliceStep + pi * pow( dSliceStep / 2, 2)) dLayerTime = dTotLayerLength / dLayerFeed * 60 dLayerWait = floor( dTMin + 0.5) - floor( dLayerTime + 0.5) end From b2cba54453a9cb3bb374ea27b4fec4d8c617b15a Mon Sep 17 00:00:00 2001 From: DarioS Date: Wed, 28 Dec 2022 08:49:13 +0100 Subject: [PATCH 50/79] 3dPrinting : - modifiche per assegnare valori di defualt a nuovi parametri. --- LuaLibs/RunMachParamFromSWCalc.lua | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/LuaLibs/RunMachParamFromSWCalc.lua b/LuaLibs/RunMachParamFromSWCalc.lua index a92475d..a346569 100644 --- a/LuaLibs/RunMachParamFromSWCalc.lua +++ b/LuaLibs/RunMachParamFromSWCalc.lua @@ -1,4 +1,4 @@ --- RunMachParamFromSWCalc.lua by Egaltech s.r.l. 2022/12/27 +-- RunMachParamFromSWCalc.lua by Egaltech s.r.l. 2022/12/28 -- Calcolo dei parametri di stampa -- Tabella per definizione modulo @@ -34,6 +34,14 @@ local AMD = require( 'AddManData') --------------------------------------------------------------------- function RunMachParamFromSWCalc.Exec() + -- valori default per nuovi parametri + MATERIAL.K_LAYERTIME = MATERIAL.K_LAYERTIME or 100 + MATERIAL.K_EXTRUSION = MATERIAL.K_EXTRUSION or 100 + if not MACHINING then + MACHINING = {} + MACHINING.K = 100 + end + -- layer dei risultati local nResultLayerId = EgtGetFirstNameInGroup( GDB_ID.ROOT, LAY_TFSCALC) if not nResultLayerId then From d576203a97009c0791f3f912d301106e4d936544 Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 3 Jan 2023 16:36:47 +0100 Subject: [PATCH 51/79] 3dPrinting : - gestione setti chiusi - correzioni varie nelle regioni con diverse passate. --- LuaLibs/CalcPaths.lua | 60 ++++++++++++++++++++++++++++------------ LuaLibs/CalcToolPath.lua | 40 ++++++++++++++++----------- 2 files changed, 67 insertions(+), 33 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 77cb179..253cedb 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -58,7 +58,7 @@ end ---------------------------------------------------------------------- local function ComputeSurfOffset( nSrf, nGrpId, dOffs, vtSlicing) -- gruppo temporaneo locale - local nGrpTmp = EgtGroup( nGrpId, Frame3d( ORIG(), vtSlicing, GDB_RT.GLOB)) + local nGrpTmp = EgtGroup( nGrpId, Frame3d( ORIG(), vtSlicing), GDB_RT.GLOB) local nCopySrf = EgtCopyGlob( nSrf, nGrpTmp) or GDB_ID.NULL local bOk = EgtSurfFrOffset( nCopySrf, dOffs) local bExists = EgtSurfFrChunkCount( nCopySrf) > 0 @@ -545,13 +545,24 @@ local function AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nOffs local vOffs2 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv2)) or {} for i = 1, #vOffs2 do local nId, nCnt = EgtTrimCurveWithRegion( vOffs2[i], nSrf, false, true) + + -- se setto chiuso verifico se primo e ultimo tratto possono essere uniti + if EgtCurveIsClosed( nCrv2) then + if nCnt > 1 and AreSamePointApprox( EgtEP( nId + nCnt - 1), EgtSP( nId)) then + EgtRelocateGlob( nId + nCnt - 1, nId, GDB_IN.AFTER) + EgtAddCurveCompoCurve( nId + nCnt - 1, nId) + EgtChangeId( nId + nCnt - 1, nId) + nCnt = nCnt - 1 + end + end + EgtChangeId( nId, vOffs2[i]) -- aggiorno ordine di split copiandolo da nCrv2 CopyInfo( nCrv2, vOffs2[i], KEY_SPLIT_ORDER, 'i') - if nCnt > 1 then - EgtSetInfo( nId + 1, KEY_SPLIT_RIB, vOffs2[i]) -- curva da cui deriva - CopyInfo( nCrv2, nId + 1, KEY_SPLIT_ORDER, 'i') -- ordine di split - EgtRelocateGlob( nId + 1, nOffsGrp, GDB_IN.LAST_SON) + for j = nId + nCnt - 1, nId + 1, -1 do + EgtSetInfo( j, KEY_SPLIT_RIB, vOffs2[i]) -- curva da cui deriva + CopyInfo( nCrv2, j, KEY_SPLIT_ORDER, 'i') -- ordine di split + EgtRelocateGlob( j, nOffsGrp, GDB_IN.LAST_SON) end end EgtErase( nSrf) @@ -1052,7 +1063,7 @@ local function UpdateRibSplitInfo( nGrp, tIds, tRemoved) end -------------------------------------------------------------------- -local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx) +local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) local vRibs = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') -- verifico se tutte le costolature vengono fatte con 2 passate @@ -1079,6 +1090,10 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx) EgtSetName( nNewId, EgtGetName( vRibs[i])) EgtSetInfo( nNewId, KEY_TYPE, TYPE.RIB) EgtRelocateGlob( nNewId, nOffsGrp) + + if EgtCurveIsClosed( vRibs[i]) then + EgtSetInfo( nNewId, "OriginalClosed", 1) + end end end @@ -1145,19 +1160,28 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx) else table.insert( tOldNewIds[ vOrderedRibs[i]], nCrv + nInd) - -- controllo la direzione (consideriamo inclinazione solo lungo X) - local vtDir = EgtMV( nCrv + nInd) - local dXl = sqrt( sqr( vtDir:getX()) + sqr( vtDir:getZ())) - local dYl = abs( vtDir:getY()) - local dVal = EgtIf( dXl > dYl - GEO.EPS_SMALL, vtDir:getX(), vtDir:getY()) - local bInvert = dVal < - GEO.EPS_SMALL - -- inversione della curva + local bInvert = false + if not EgtGetInfo( nCrv + nInd, "OriginalClosed", 'b') then + -- controllo la direzione (consideriamo inclinazione solo lungo X) + local vtDir = EgtMV( nCrv + nInd) + local dXl = sqrt( sqr( vtDir:getX()) + sqr( vtDir:getZ())) + local dYl = abs( vtDir:getY()) + local dVal = EgtIf( dXl > dYl - GEO.EPS_SMALL, vtDir:getX(), vtDir:getY()) + bInvert = dVal < - GEO.EPS_SMALL + end local bInvertInfo = EgtGetInfo( nCrv + nInd, KEY_RIBS_INVERT_DIR, 'b') or false - if bInvert ~= bInvertInfo then + -- inversione della curva + if bInvertInfo ~= bInvert then EgtInvertCurve( nCrv + nInd) EgtSetInfo( nCrv + nInd, KEY_INVERTED_CRV, 1) end + if EgtCurveIsClosed( nCrv + nInd) then + EgtSetInfo( nCrv + nInd, KEY_CLOSED_CRV, 1) + ModifyStartPoint( nCrv + nInd, vPtStart) + EgtSetInfo( nCrv + nInd, KEY_RIBS_LINK, 0) + end + -- salvo info della superficie di trim associata EgtSetInfo( nCrv + nInd, KEY_ASSOCIATED_SURF, tSurfOffs[nType][nOverlap]) @@ -1315,8 +1339,9 @@ local function TrimOuterCurveForExtraShellCalc( nOuterCrv, nSrfDiff, nGrpId, vPt -- verifico se prima e ultima curva possono essere unite if nCnt > 1 and AreSamePointApprox( EgtEP( nCrv + nCnt - 1), EgtSP( nCrv)) then - local nNewId = EgtCurveCompo( nGrpId, { nCrv + nCnt - 1, nCrv}) - EgtChangeId( nNewId, nCrv) + EgtRelocateGlob( nCrv + nCnt - 1, nCrv, GDB_IN.AFTER) + EgtAddCurveCompoCurve( nCrv + nCnt - 1, nCrv) + EgtChangeId( nCrv + nCnt - 1, nCrv) nCnt = nCnt - 1 end @@ -1494,6 +1519,7 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d end -- verifico se soddisfa vincolo sulla lunghezza if dLen > MIN_LEN and bValid then + EgtSetStatus( nId, GDB_ST.ON) EgtModifyCurveExtrusion( nId, LayerParams.vtSlicing, GDB_RT.GLOB) EgtSetName( nId, EXTRA_SHELL_CRV .. tostring( nMaxShellNbrDiff - nInd + 1)) if nInd == LayerParams.nShellsNbr then @@ -1858,7 +1884,7 @@ function CalcPaths.Exec( nPartId) -- sistemo eventuali costolature if nRibsGrp then - CalcRibsPaths( vLayIds[nIdx], nRibsGrp, LayerParams, nIdx) + CalcRibsPaths( vLayIds[nIdx], nRibsGrp, LayerParams, nIdx, vPtStart) end end diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 4fcdf68..473188a 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -374,7 +374,7 @@ local function CalcExtraShellToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ if not vEntIds then return end -- aggiungo le curve nel toolpath - local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, LayerParams.nOrder, false, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) + local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, PRINT_ORDER.EXT_INT, false, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) -- aggiungo gli opportuni raccordi local sPrevName = EgtGetName( vIds[1]) @@ -576,6 +576,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlic EgtTrimCurveStartEndAtParam( nLinkId, dParS, dParE) EgtSetInfo( nLinkId, KEY_TYPE, TYPE.RIB) + EgtSetName( nLinkId, LINK_CRV) if bInvert then EgtInvertCurve( nLinkId) end -- verifico se è valido local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) @@ -605,6 +606,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlic local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) if bValid then EgtSetInfo( nLinkId, KEY_TYPE, TYPE.RIB) + EgtSetName( nLinkId, LINK_CRV) EgtModifyCurveExtrusion( nLinkId, vtSlicing, GDB_RT.GLOB) EgtRelocateGlob( nLinkId, nCurr, GDB_IN.AFTER) else @@ -998,9 +1000,11 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) end -- oriento tutte le passate relative ad una stessa costolatura - for j = 1, #tabRibs[i] do - if ( bInvert and j % 2 == 1) or ( not bInvert and j % 2 == 0) then - EgtInvertCurve( tabRibs[i][j]) + if not EgtCurveIsClosed( tabRibs[i][1]) then + for j = 1, #tabRibs[i] do + if ( bInvert and j % 2 == 1) or ( not bInvert and j % 2 == 0) then + EgtInvertCurve( tabRibs[i][j]) + end end end end @@ -1008,7 +1012,7 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) -- Link -- se modifiche nell'ordine ricalcolo i gruppi di costolature - if bSwap then + if bSwap then tabRibs = {} nFirst = EgtGetFirstNameInGroup( nTpathGrpId, RIBS_CRV .. '*') while nFirst do @@ -1021,18 +1025,22 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) -- collego le passate di una stessa costolatura for i = 1, #tabRibs do - for j = 1, #tabRibs[i] - 1 do - CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, true, LayerParams.vtSlicing, nGrpTmp) - if not bSpecialCase then - -- creo link fittizio per eliminare tratto corrispondente sulla curva di offset - local nFakeLink = CalcRibsLink( tabRibs[i][j + 1], tabRibs[i][j], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) + if EgtCurveIsClosed( tabRibs[i][1]) then + -- AddLink( tabRibs[i], nTpathGrpId, LayerParams.nLinkType, LayerParams.dLinkParam, LayerParams.dSPOffs, LayerParams.dStrand, LayerParams.vtSlicing) + else + for j = 1, #tabRibs[i] - 1 do + CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, true, LayerParams.vtSlicing, nGrpTmp) + if not bSpecialCase then + -- creo link fittizio per eliminare tratto corrispondente sulla curva di offset + local nFakeLink = CalcRibsLink( tabRibs[i][j + 1], tabRibs[i][j], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) + EgtErase( nFakeLink) + end + end + if bSpecialCase then + local nFakeLink = CalcRibsLink( tabRibs[i][#tabRibs[i]], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) EgtErase( nFakeLink) end end - if bSpecialCase then - local nFakeLink = CalcRibsLink( tabRibs[i][#tabRibs[i]], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) - EgtErase( nFakeLink) - end end -- se necessario collego le diverse costolature @@ -1050,12 +1058,12 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) while nCrvRib do -- verifico se necessario lead in local nPrev = EgtGetPrev( nCrvRib) - if not nPrev or EgtGetName( nPrev) then + if not nPrev or EgtGetName( nPrev) ~= LINK_CRV then AddRibsLeadIn( nCrvRib, nLoopGrp, LayerParams.dStrand, LayerParams.vtSlicing, nGrpTmp) end -- verifico se necessario lead out local nNext = EgtGetNext( nCrvRib) - if not nNext or EgtGetName( nNext) then + if not nNext or EgtGetName( nNext) ~= LINK_CRV then AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand, nGrpTmp) end nCrvRib = EgtGetNextName( nCrvRib, RIBS_CRV .. '*') From 89a8002205d2e82d36e0380f0914cea27875149d Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 4 Jan 2023 11:50:04 +0100 Subject: [PATCH 52/79] 3dPrinting : - gestione di offset lead point con valori negativi. --- LuaLibs/CalcToolPath.lua | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 473188a..9351aa9 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -242,10 +242,19 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi -- curva ausiliaria per generare correttamente wipe local nCopyId = EgtCopyGlob( nCrvId, nCrvId, GDB_IN.AFTER) - EgtCloseCurveCompo( nCopyId) - local ptNewStart = EgtEP( nCrvId) - EgtChangeClosedCurveStartPoint( nCopyId, ptNewStart) - + if not EgtCurveIsClosed( nCopyId) then + local ptNewStart = EgtEP( nCrvId) + local dPar = EgtCurveParamAtPoint( nCopyId, ptNewStart) + local _, dParE = EgtCurveDomain( nCopyId) + if abs( dPar - dParE) < GEO.EPS_SMALL then + EgtCloseCurveCompo( nCopyId) + EgtChangeClosedCurveStartPoint( nCopyId, ptNewStart) + else + -- caso con sovrapposizione + EgtTrimCurveStartAtParam( nCopyId, dPar) + end + end + local nCoastingId if dCoastingLen > GEO.EPS_SMALL then nCoastingId = EgtCopyGlob( nCrvId, nCrvId, GDB_IN.AFTER) @@ -284,7 +293,7 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi if nType == TYPE.INFILL or nType == TYPE.AUX_SOLID then local vtS = EgtGetInfo( nCrvId, KEY_ZIG_ZAG_DIR, 'v') local bSameDir = AreSameVectorApprox( vtS, vtDir) - bChangeSign = ( bInverted == bSameDir) + bChangeSign = ( bInverted == bSameDir) else bChangeSign = bInverted end @@ -292,7 +301,7 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi local ptS = EgtEP( nCoastingId or nCrvId, GDB_ID.ROOT) local ptE = ptS + vtDir * dWipeLen -- verifico soddisfi altezza minima per dimensioni utensile - local k = 1 + local k = 1 while ptE:getZ() < s_dHMin + GEO.EPS_SMALL and k < 36 do vtDir:rotate( vtSlicing, EgtIf( bChangeSign, 10, -10)) ptE = ptS + vtDir * dWipeLen @@ -340,15 +349,26 @@ end local function CalcShellsToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ) if not vEntIds then return end + -- aggiungo le curve nel toolpath local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, LayerParams.nOrder, LayerParams.bInvert, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) + local nFirstCopy = EgtCopyGlob( vIds[1], nTpathGrpId) -- aggiungo gli opportuni raccordi AddLink( vIds, nTpathGrpId, LayerParams.nLinkType, LayerParams.dLinkParam, LayerParams.dSPOffs, LayerParams.dStrand, LayerParams.vtSlicing) + -- offset lead point curva iniziale + if LayerParams.dOffsetLP > - GEO.EPS_SMALL then + EgtTrimCurveStartAtLen( vIds[1], LayerParams.dOffsetLP) + EgtErase( nFirstCopy) + else + -- devi aggiungere un tratto di curva + EgtTrimCurveStartAtLen( nFirstCopy, EgtCurveLength( nFirstCopy) - abs( LayerParams.dOffsetLP)) + EgtAddCurveCompoCurve( vIds[1], nFirstCopy, true, false) + end + -- aggiungo leadin/leadout if LayerParams.nLeadInType ~= LEAD_TYPE.NONE then - EgtTrimCurveStartAtLen( vIds[1], LayerParams.dOffsetLP) AddLeadIn( vIds[1], LayerParams, nTpathGrpId) end if LayerParams.nLeadOutType ~= LEAD_TYPE.NONE then @@ -360,7 +380,6 @@ local function CalcShellsToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ) for i = 1, #vIds - 1 do local nNextId = EgtGetNext( vIds[i]) if EgtGetInfo( nNextId, KEY_TYPE, 'i') ~= TYPE.LINK then - -- aggiungo retrazione AddRetraction( vIds[i], LayerParams.vtSlicing, LayerParams.dCoastingLen, LayerParams.dWipeLen, LayerParams.dWipeDir) end end From 1225625a9ad9e2576d51a6b2fd61fb35fff7a9d9 Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 5 Jan 2023 15:16:45 +0100 Subject: [PATCH 53/79] 3dPrinting : - aggiunta nuova tipologia per setti ( setti di supporto) - correzioni per setti chiusi nel caso di intersezioni con 2 passate. --- LuaLibs/AddManData.lua | 1 + LuaLibs/CalcPaths.lua | 103 ++++++++++++++++++++++++--------------- LuaLibs/CalcToolPath.lua | 10 ++-- LuaLibs/RunSlicing.lua | 2 + 4 files changed, 74 insertions(+), 42 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index a5e8b35..7730d4a 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -193,6 +193,7 @@ RIB_TYPE = { INTERNAL = 1, EXTERNAL = 2, UNBOUNDED = 3, + SUPPORT = 4, } RIB_PRINT_ORDER = { diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 253cedb..7e20538 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -438,12 +438,12 @@ end local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOffs, dStrand, nGrp, vtSlicing) -- per ogni tipologia e overlap creo le superfici con cui fare i trim - local tSurfOffs = {{}, {}, {}} + local tSurfOffs = {{}, {}, {}, {}} for i = 1, #vIds do local nOverlap = EgtGetInfo( vIds[i], KEY_RIBS_OVERLAP, 'i') local nType = EgtGetInfo( vIds[i], KEY_RIBS_TYPE, 'i') if not tSurfOffs[nType][nOverlap] then - if nType == RIB_TYPE.INTERNAL then + if nType == RIB_TYPE.INTERNAL or nType == RIB_TYPE.SUPPORT then if nSrfBase then local dNewOffs = nOverlap / 100 * dStrand local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfBase, nGrp, dNewOffs, vtSlicing) @@ -471,8 +471,9 @@ end -------------------------------------------------------------------- local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf2, dWidth, nGrp, nOffsGrp) - -- setti interni ed esterni non si possono intersecare per definizione - if ( nType1 == RIB_TYPE.INTERNAL and nType2 == RIB_TYPE.EXTERNAL) or ( nType1 == RIB_TYPE.EXTERNAL and nType2 == RIB_TYPE.INTERNAL) then + -- setti interni/supporto ed esterni non si possono intersecare per definizione + if ( ( nType1 == RIB_TYPE.INTERNAL or nType1 == RIB_TYPE.SUPPORT) and nType2 == RIB_TYPE.EXTERNAL) or + ( nType1 == RIB_TYPE.EXTERNAL and ( nType2 == RIB_TYPE.INTERNAL or nType2 == RIB_TYPE.SUPPORT)) then return false end -- se hanno lo stesso nome derivano dalla stessa costolatura quindi non ha senso controllare intersezione @@ -513,15 +514,15 @@ local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf -- se intersezione verifico se valida if ptInt then local nPtId = EgtPoint( nGrp, ptInt, GDB_RT.GLOB) - if nType1 == RIB_TYPE.INTERNAL or nType2 == RIB_TYPE.INTERNAL then - -- l'intersezione deve essere interna - if nSrf1 and not EgtSurfFrTestExternal( nSrf1, nPtId) then bInters = true end + if nType1 == RIB_TYPE.UNBOUNDED and nType2 == RIB_TYPE.UNBOUNDED then + -- nel caso unbounded l'intersezione può essere ovunque + bInters = true elseif nType1 == RIB_TYPE.EXTERNAL or nType2 == RIB_TYPE.EXTERNAL then -- l'intersezione deve essere esterna if nSrf2 and EgtSurfFrTestExternal( nSrf2, nPtId) then bInters = true end else - -- nel caso unbounded l'intersezione può essere ovunque - bInters = true + -- se uno dei due è interno o supporto l'intersezione deve essere interna + if nSrf1 and not EgtSurfFrTestExternal( nSrf1, nPtId) then bInters = true end end else bInters = bFound @@ -627,7 +628,7 @@ local function UpdateSplitOrder( nCrv, tInters, nOffsGrp) end -------------------------------------------------------------------- -local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands) +local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands, vRibsPrintOrder) local vRibsIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') -- copio gli offset delle costolature nel RibsPathGrp @@ -691,10 +692,11 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa nCrv1, nCrv2 = nCrv2, nCrv1 nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 else - -- prediligo setto già splittato più volte - if nSplitOrder1 > nSplitOrder2 then - nCrv1, nCrv2 = nCrv2, nCrv1 - nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 + -- se stessa tipologia taglio il setto già splittato più volte, altrimenti taglio il setto che viene realizzato successivamente + if ( nType1 == nType2 and nSplitOrder1 > nSplitOrder2) or + ( nType1 ~= nType2 and vRibsPrintOrder[nType1] > vRibsPrintOrder[nType2]) then + nCrv1, nCrv2 = nCrv2, nCrv1 + nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 end end @@ -766,7 +768,7 @@ local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr, if not vIds or #vIds == 0 then return end -- raggruppo per tipologia - local tRibs = {{}, {}, {}} + local tRibs = {{}, {}, {}, {}} for i = 1, #vIds do local nType = EgtGetInfo( vIds[i], KEY_RIBS_TYPE, 'i') table.insert( tRibs[nType], vIds[i]) @@ -774,7 +776,7 @@ local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr, -- riordino ogni tipologia con shortest path local vSplitRibs = {} - for i = 1, 3 do + for i = 1, #vTypeSequence do local nCurrType = vTypeSequence[i] local tSplitOrder = {} local nMax = -1 @@ -865,6 +867,9 @@ local function ReassignInfo( nCrv, nCnt, vOrig) local ptE = EgtEP( nId) EgtSetInfo( nId, KEY_TYPE, TYPE.RIB) + if EgtCurveIsClosed( nId) then + EgtSetInfo( nId, KEY_CLOSED_CRV, 1) + end local bStart = false local bEnd = false @@ -906,7 +911,37 @@ end -- Funzione che riordina le costolature nel caso di intersezioni e 2 passate local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vTypeSequence) - local vOffs = EgtGetNameInGroup( nOffsGrp, RIBS_CRV .. '*') + local vOffs = {} + local vClosed = {} + local nId = EgtGetFirstNameInGroup( nOffsGrp, RIBS_CRV .. '*') + while nId do + if EgtCurveIsClosed( nId) then + table.insert( vClosed, nId) + else + table.insert( vOffs, nId) + end + nId = EgtGetNextName( nId, RIBS_CRV .. '*') + end + + local k = 0 -- indice da utilizzare per i nomi + + -- gestione delle curve chiuse + if #vClosed > 0 then + k = k + 1 + local sPrevName = EgtGetName( vClosed[1]) + EgtSetName( vClosed[1], RIBS_CRV .. tostring( k)) + for i = 2, #vClosed do + local sCurrName = EgtGetName( vClosed[i]) + -- se setto diverso aggiorno il nome + if sCurrName ~= sPrevName then + k = k + 1 + end + EgtSetName( vClosed[i], RIBS_CRV .. tostring( k)) + sPrevName = sCurrName + end + end + + -- gestione delle curve aperte -- copio le curve originali ( per recuperarne le info) local vCopy = {} for i = 1, #vOffs do @@ -922,8 +957,7 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vTypeSequence) end -- recupero le info dalle curve originali ReassignInfo( nCrv, nCnt, vCopy) - - local k = 0 -- indice da utilizzare per i nomi + while #vIds > 0 do k = k + 1 -- prendo la prima tra le curve a disposizione @@ -1019,13 +1053,13 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vTypeSequence) -- classifico in base alla tipologia local vCrvs = EgtGetNameInGroup( nOffsGrp, RIBS_CRV .. '*') - local tRibs = {{}, {}, {}} + local tRibs = {{}, {}, {}, {}} for nId = 1, #vCrvs do local nType = EgtGetInfo( vCrvs[nId], KEY_RIBS_TYPE, 'i') table.insert( tRibs[nType], vCrvs[nId]) end -- riordino per tipologia - for i = 1, 3 do + for i = 1, #vTypeSequence do nCurrType = vTypeSequence[i] for j = 1, #tRibs[nCurrType] do EgtRelocateGlob( tRibs[nCurrType][j], nOffsGrp, GDB_IN.LAST_SON) @@ -1065,6 +1099,13 @@ end -------------------------------------------------------------------- local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) + -- stabilisco ordine di realizzazione delle varie tipologie + local vTypeSequence = { 3, 1, 4, 2} + local vRibsPrintOrder = {} + for i = 1, #vTypeSequence do + vRibsPrintOrder[vTypeSequence[i]] = i + end + local vRibs = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') -- verifico se tutte le costolature vengono fatte con 2 passate local bAllTwoStrands = true @@ -1118,7 +1159,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) local tSurfOffs = ComputeTrimSurfWithOverlapsForRibs( vRibs, nSrfBase, nSrfExt, LayerParams.dOffs, LayerParams.dStrand, nRibsPathGrp, LayerParams.vtSlicing) -- gestisco eventuali intersezioni fra costolature - local bInters = HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands) + local bInters = HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands, vRibsPrintOrder) EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_INTERS, bInters) EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_TWO_STRANDS, bAllTwoStrands) @@ -1141,7 +1182,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) nCrv = vOrderedRibs[i] nCnt = 1 else - nCrv, nCnt = EgtTrimCurveWithRegion( vOrderedRibs[i], tSurfOffs[nType][nOverlap], EgtIf( nType == RIB_TYPE.INTERNAL, true, false), false) + nCrv, nCnt = EgtTrimCurveWithRegion( vOrderedRibs[i], tSurfOffs[nType][nOverlap], EgtIf( nType == RIB_TYPE.INTERNAL or nType == RIB_TYPE.SUPPORT, true, false), false) end tOldNewIds[ vOrderedRibs[i]] = {} @@ -1195,21 +1236,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) -- aggiorno le info di split con i nuovi id UpdateRibSplitInfo( nRibsPathGrp, tOldNewIds, tRemoved) - - -- stabilisco ordine di realizzazione delle varie tipologie - local vTypeSequence = {RIB_TYPE.INTERNAL, RIB_TYPE.EXTERNAL, RIB_TYPE.UNBOUNDED} - if LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.INT_UNBDD_EXT then - vTypeSequence = {RIB_TYPE.INTERNAL, RIB_TYPE.UNBOUNDED, RIB_TYPE.EXTERNAL} - elseif LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.EXT_INT_UNBDD then - vTypeSequence = {RIB_TYPE.EXTERNAL, RIB_TYPE.INTERNAL, RIB_TYPE.UNBOUNDED} - elseif LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.EXT_UNBDD_INT then - vTypeSequence = {RIB_TYPE.EXTERNAL, RIB_TYPE.UNBOUNDED, RIB_TYPE.INTERNAL} - elseif LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.UNBDD_INT_EXT then - vTypeSequence = {RIB_TYPE.UNBOUNDED, RIB_TYPE.INTERNAL, RIB_TYPE.EXTERNAL} - elseif LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.UNBDD_EXT_INT then - vTypeSequence = {RIB_TYPE.UNBOUNDED, RIB_TYPE.EXTERNAL, RIB_TYPE.INTERNAL} - end - + -- riordino le costolature if bAllTwoStrands and bInters then -- gestione caso speciale di intersezione e 2 passate diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 9351aa9..87d34d8 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -529,7 +529,7 @@ local function VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) local nRes = EgtCurveWithRegionClassify( nLinkId, nSurfId) local nType1 = EgtGetInfo( nCurr, KEY_RIBS_TYPE, 'i') local nType2 = EgtGetInfo( nNext, KEY_RIBS_TYPE, 'i') - if nType1 == RIB_TYPE.INTERNAL and nType2 == RIB_TYPE.INTERNAL then + if ( nType1 == RIB_TYPE.INTERNAL or nType1 == RIB_TYPE.SUPPORT) and ( nType2 == RIB_TYPE.INTERNAL or nType2 == RIB_TYPE.SUPPORT) then if nRes == GDB_CRC.OUT or nRes == GDB_CRC.INTERS then return false end @@ -781,7 +781,7 @@ local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, return nil else -- se non è valido ma ho altra curva possibile, tento con quella - EgtErase( nLeadId) + EgtErase( nLeadId) nLeadId = EgtCopyGlob( nOtherCrv, nCrv, EgtIf( bInVsOut, GDB_IN.BEFORE, GDB_IN.AFTER)) if not bInvert then EgtInvertCurve( nLeadId) end EgtTrimCurveEndAtLen( nLeadId, dLeadLen) @@ -798,7 +798,7 @@ local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, return nil end -- aggiorno parametro bInvert - bInvert = not bInvert + bInvert = not bInvert end return nLeadId, bInvert @@ -1066,7 +1066,9 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) for i = 1, #tabRibs - 1 do local bLink1 = EgtGetInfo( tabRibs[i][1], KEY_RIBS_LINK, 'b') local bLink2 = EgtGetInfo( tabRibs[i + 1][1], KEY_RIBS_LINK, 'b') - if bLink1 and bLink2 then + local nType1 = EgtGetInfo( tabRibs[i][1], KEY_RIBS_TYPE, 'i') + local nType2 = EgtGetInfo( tabRibs[i + 1][1], KEY_RIBS_TYPE, 'i') + if bLink1 and bLink2 and nType1 == nType2 then local nCnt = #tabRibs[i] CalcRibsLink( tabRibs[i][nCnt], tabRibs[i + 1][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) end diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 702a6b2..3fe275d 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -144,6 +144,8 @@ local function LoadParams( sFile, nPartId) EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.EXTERNAL) elseif sRibType == 'Unbounded' then EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.UNBOUNDED) + elseif sRibType == 'Support' then + EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.SUPPORT) else -- 'Internal' EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.INTERNAL) end From f050f49b6692a7816e9936e25a7ea8b9de90ffe7 Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 10 Jan 2023 08:54:09 +0100 Subject: [PATCH 54/79] 3dPrinting : - ordinamento elementi di stampa - oridinamento per tipologia di setti. --- LuaLibs/AddManData.lua | 20 ++++++------- LuaLibs/CalcPaths.lua | 38 +++++++++++------------ LuaLibs/CalcToolPath.lua | 53 ++++++++++++++++++--------------- LuaLibs/RunSliceAdvancement.lua | 2 +- LuaLibs/RunSlicing.lua | 9 +++--- 5 files changed, 64 insertions(+), 58 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 7730d4a..c52b758 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -46,7 +46,8 @@ KEY_STRAND = "StrandW" KEY_STRAND_OVERLAP = "StrandOverlap" KEY_OFFSET_SLICE = "Offset" KEY_SP_OFFSET_ON_SLICE = "StartPointOffsetOnSlice" -KEY_PRINT_ORDER = "StrandOrder" +KEY_STRAND_ORDER = "StrandOrder" +KEY_PRINT_ORDER = "PrintOrder" KEY_PRINT_DIRECTION = "Direction" KEY_TYPE = "Type" KEY_LINK_TYPE = "LinkType" @@ -161,6 +162,14 @@ TYPE = { AUX_SOLID = 10, } +PRINT_ELEMENT = { + SHELL = 1, + EXTRA_SHELL = 2, + INFILL = 3, + AUX_SOLID = 4, + RIB = 5, +} + PRINT_ORDER = { EXT_INT = 1, INT_EXT = 2, @@ -196,15 +205,6 @@ RIB_TYPE = { SUPPORT = 4, } -RIB_PRINT_ORDER = { - INT_EXT_UNBDD = 1, - INT_UNBDD_EXT = 2, - EXT_INT_UNBDD = 3, - EXT_UNBDD_INT = 4, - UNBDD_INT_EXT = 5, - UNBDD_EXT_INT = 6, -} - --------------------------------------------------------------------- TABLE = "Table" PART = "Part" diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 7e20538..1277a93 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -21,7 +21,7 @@ local function GetLayerParamsForPathCalc() local LayerParams = {} LayerParams.bSpiralVase = EgtGetInfo( s_nPartId, KEY_SPIRAL_VASE, 'b') or false LayerParams.nShellsNbr = EgtGetInfo( s_nPartId, KEY_SHELLS_NBR, 'i') - LayerParams.dStrand = EgtGetInfo( s_nPartId, KEY_STRAND, 'd') + LayerParams.dStrand = EgtGetInfo( s_nPartId, KEY_STRAND, 'd') LayerParams.nStrandOverlap = EgtGetInfo( s_nPartId, KEY_STRAND_OVERLAP, 'i') or 0 LayerParams.dOffs = EgtGetInfo( s_nPartId, KEY_OFFSET_SLICE, 'd') LayerParams.nFloorNbr = EgtGetInfo( s_nPartId, KEY_FLOOR_NBR, 'i') or 0 @@ -33,7 +33,7 @@ local function GetLayerParamsForPathCalc() -- parametri costolature LayerParams.bRibsInvertOrder = EgtGetInfo( s_nPartId, KEY_RIBS_INVERT_ORDER, 'b') LayerParams.bRibsDoLinkFirst = EgtGetInfo( s_nPartId, KEY_RIBS_DO_LINK_FIRST, 'b') or false - LayerParams.nRibsPrintOrder = EgtGetInfo( s_nPartId, KEY_RIBS_PRINT_ORDER, 'i') or 5 + LayerParams.vRibsPrintOrder = EgtGetInfo( s_nPartId, KEY_RIBS_PRINT_ORDER, 'vi') or {3, 1, 4, 2} -- parametri regioni con diverse passate LayerParams.dShellNbrCoasting = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_COASTING, 'd') LayerParams.dShellNbrWipe = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE, 'd') @@ -210,7 +210,7 @@ local function VerifyPath( nCrvId, dStrand, vtSlicing, nGrp) EgtRelocateGlob( nCrvId, nGrp, GDB_IN.LAST_SON) EgtErase( nGrpTmp) end - -- se non è fattibile con unica passata lo cancello + -- se non è fattibile con unica passata lo cancello if not bSingleStrand then EgtErase( nCrvId) return false @@ -448,7 +448,8 @@ local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOff local dNewOffs = nOverlap / 100 * dStrand local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfBase, nGrp, dNewOffs, vtSlicing) if bOk then - tSurfOffs[nType][nOverlap] = nSrfOffs + tSurfOffs[RIB_TYPE.INTERNAL][nOverlap] = nSrfOffs + tSurfOffs[RIB_TYPE.SUPPORT][nOverlap] = nSrfOffs end end elseif nType == RIB_TYPE.EXTERNAL then @@ -628,7 +629,7 @@ local function UpdateSplitOrder( nCrv, tInters, nOffsGrp) end -------------------------------------------------------------------- -local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands, vRibsPrintOrder) +local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands, vTypeSequence) local vRibsIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') -- copio gli offset delle costolature nel RibsPathGrp @@ -694,7 +695,7 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa else -- se stessa tipologia taglio il setto già splittato più volte, altrimenti taglio il setto che viene realizzato successivamente if ( nType1 == nType2 and nSplitOrder1 > nSplitOrder2) or - ( nType1 ~= nType2 and vRibsPrintOrder[nType1] > vRibsPrintOrder[nType2]) then + ( nType1 ~= nType2 and vTypeSequence[nType1] > vTypeSequence[nType2]) then nCrv1, nCrv2 = nCrv2, nCrv1 nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 end @@ -762,7 +763,7 @@ end --------------------------------------------------------------------- -- Funzione che riordina le costolature nel caso generico -local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr, vTypeSequence) +local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr, vRibsPrintOrder) local vIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*') if not vIds or #vIds == 0 then return end @@ -776,8 +777,8 @@ local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr, -- riordino ogni tipologia con shortest path local vSplitRibs = {} - for i = 1, #vTypeSequence do - local nCurrType = vTypeSequence[i] + for i = 1, #vRibsPrintOrder do + local nCurrType = vRibsPrintOrder[i] local tSplitOrder = {} local nMax = -1 -- raggruppo i ribs @@ -909,7 +910,7 @@ end --------------------------------------------------------------------------------------------- -- Funzione che riordina le costolature nel caso di intersezioni e 2 passate -local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vTypeSequence) +local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vRibsPrintOrder) local vOffs = {} local vClosed = {} @@ -1059,8 +1060,8 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vTypeSequence) table.insert( tRibs[nType], vCrvs[nId]) end -- riordino per tipologia - for i = 1, #vTypeSequence do - nCurrType = vTypeSequence[i] + for i = 1, #vRibsPrintOrder do + nCurrType = vRibsPrintOrder[i] for j = 1, #tRibs[nCurrType] do EgtRelocateGlob( tRibs[nCurrType][j], nOffsGrp, GDB_IN.LAST_SON) end @@ -1100,10 +1101,9 @@ end local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) -- stabilisco ordine di realizzazione delle varie tipologie - local vTypeSequence = { 3, 1, 4, 2} - local vRibsPrintOrder = {} - for i = 1, #vTypeSequence do - vRibsPrintOrder[vTypeSequence[i]] = i + local vTypeSequence = {} + for i = 1, #LayerParams.vRibsPrintOrder do + vTypeSequence[LayerParams.vRibsPrintOrder[i]] = i end local vRibs = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') @@ -1159,7 +1159,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) local tSurfOffs = ComputeTrimSurfWithOverlapsForRibs( vRibs, nSrfBase, nSrfExt, LayerParams.dOffs, LayerParams.dStrand, nRibsPathGrp, LayerParams.vtSlicing) -- gestisco eventuali intersezioni fra costolature - local bInters = HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands, vRibsPrintOrder) + local bInters = HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands, vTypeSequence) EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_INTERS, bInters) EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_TWO_STRANDS, bAllTwoStrands) @@ -1240,9 +1240,9 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) -- riordino le costolature if bAllTwoStrands and bInters then -- gestione caso speciale di intersezione e 2 passate - ReorderRibsInters2Shells( nRibsPathGrp, LayerParams.dStrand, vTypeSequence) + ReorderRibsInters2Shells( nRibsPathGrp, LayerParams.dStrand, LayerParams.vRibsPrintOrder) else - ReorderRibs( nRibsPathGrp, LayerParams.bRibsInvertOrder, LayerParams.bRibsDoLinkFirst, LayerParams.dStrand, nMaxNbr, vTypeSequence) + ReorderRibs( nRibsPathGrp, LayerParams.bRibsInvertOrder, LayerParams.bRibsDoLinkFirst, LayerParams.dStrand, nMaxNbr, LayerParams.vRibsPrintOrder) end if not EgtGetFirstNameInGroup( nRibsPathGrp, RIBS_CRV .. '*') then diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 87d34d8..c2b57eb 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -25,7 +25,8 @@ local function GetLayerParamsForToolPathCalc() LayerParams.dLayHeight = EgtGetInfo( s_nPartId, KEY_SLICE_STEP, 'd') LayerParams.dOffs = EgtGetInfo( s_nPartId, KEY_OFFSET_SLICE, 'd') LayerParams.bInvert = ( EgtGetInfo( s_nPartId, KEY_PRINT_DIRECTION, 'i') == PRINT_DIRECTION.CW) - LayerParams.nOrder = EgtGetInfo( s_nPartId, KEY_PRINT_ORDER, 'i') + LayerParams.nOrder = EgtGetInfo( s_nPartId, KEY_STRAND_ORDER, 'i') + LayerParams.vPrintOrder = EgtGetInfo( s_nPartId, KEY_PRINT_ORDER, 'vi') or { 1, 2, 3, 4, 5} LayerParams.nLinkType = EgtGetInfo( s_nPartId, KEY_LINK_TYPE, 'i') LayerParams.dLinkParam = EgtGetInfo( s_nPartId, KEY_LINK_PARAM, 'd') LayerParams.nLeadInType = EgtGetInfo( s_nPartId, KEY_LEAD_IN_TYPE, 'i') @@ -394,7 +395,7 @@ local function CalcExtraShellToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ if not vEntIds then return end -- aggiungo le curve nel toolpath local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, PRINT_ORDER.EXT_INT, false, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) - + -- aggiungo gli opportuni raccordi local sPrevName = EgtGetName( vIds[1]) for i = 2, #vIds do @@ -1304,29 +1305,33 @@ function CalcToolPath.Exec( nPartId) EgtEmptyGroup( nTpathGrpId) end - -- shells - local vShellIds = EgtGetNameInGroup( nPathGrpId, SHELL_CRV .. '*') - local vExtraShellIds = EgtGetNameInGroup( nPathGrpId, EXTRA_SHELL_CRV .. '*') - local vInfillIds = EgtGetNameInGroup( nPathGrpId, INFILL_CRV .. '*') - - if LayerParams.nOrder == PRINT_ORDER.EXT_INT then - CalcShellsToolPath( vShellIds, nTpathGrpId, LayerParams, dCorrZ) - CalcExtraShellToolPath( vExtraShellIds, nTpathGrpId, LayerParams, dCorrZ) - CalcInfillToolPath( vInfillIds, nTpathGrpId, LayerParams, dCorrZ) - else - CalcInfillToolPath( vInfillIds, nTpathGrpId, LayerParams, dCorrZ) - CalcExtraShellToolPath( vExtraShellIds, nTpathGrpId, LayerParams, dCorrZ) - CalcShellsToolPath( vShellIds, nTpathGrpId, LayerParams, dCorrZ) + -- realizzo le diverse tipologie in base all'ordine selezionato + for j = 1, #LayerParams.vPrintOrder do + + if LayerParams.vPrintOrder[j] == PRINT_ELEMENT.SHELL then + -- shell + local vShellIds = EgtGetNameInGroup( nPathGrpId, SHELL_CRV .. '*') + CalcShellsToolPath( vShellIds, nTpathGrpId, LayerParams, dCorrZ) + elseif LayerParams.vPrintOrder[j] == PRINT_ELEMENT.EXTRA_SHELL then + -- extra shell + local vExtraShellIds = EgtGetNameInGroup( nPathGrpId, EXTRA_SHELL_CRV .. '*') + CalcExtraShellToolPath( vExtraShellIds, nTpathGrpId, LayerParams, dCorrZ) + elseif LayerParams.vPrintOrder[j] == PRINT_ELEMENT.INFILL then + -- infill + local vInfillIds = EgtGetNameInGroup( nPathGrpId, INFILL_CRV .. '*') + CalcInfillToolPath( vInfillIds, nTpathGrpId, LayerParams, dCorrZ) + elseif LayerParams.vPrintOrder[j] == PRINT_ELEMENT.AUX_SOLID then + -- solidi ausiliari + local nAuxSolidsGrp = EgtGetFirstNameInGroup( vLayIds[nIdx], AUX_SOLIDS_GRP) + local nAuxSolidsPathGrp = EgtGetFirstNameInGroup( nCrvGrpId, AUX_SOLIDS_GRP) + CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGrpId, LayerParams, dCorrZ) + else + -- costolature + local nRibsGrp = EgtGetFirstNameInGroup( nCrvGrpId, RIBS_GRP) + CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) + end + end - - -- solidi ausiliari - local nAuxSolidsGrp = EgtGetFirstNameInGroup( vLayIds[nIdx], AUX_SOLIDS_GRP) - local nAuxSolidsPathGrp = EgtGetFirstNameInGroup( nCrvGrpId, AUX_SOLIDS_GRP) - CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGrpId, LayerParams, dCorrZ) - - -- costolature - local nRibsGrp = EgtGetFirstNameInGroup( nCrvGrpId, RIBS_GRP) - CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) -- passo al gruppo di contorni successivo nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") diff --git a/LuaLibs/RunSliceAdvancement.lua b/LuaLibs/RunSliceAdvancement.lua index f013ae2..9471ada 100644 --- a/LuaLibs/RunSliceAdvancement.lua +++ b/LuaLibs/RunSliceAdvancement.lua @@ -102,7 +102,7 @@ function RunSliceAdvancement.Exec() CSOLIDS.Exec() end - local nPrintOrder = EgtGetInfo( nPartId, KEY_PRINT_ORDER, 'i') + local nPrintOrder = EgtGetInfo( nPartId, KEY_STRAND_ORDER, 'i') -- ciclo sui layer per dis/attivare il resto local nLayerIndex = 1 local nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex) diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 3fe275d..8a9087b 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -55,12 +55,13 @@ local function LoadParams( sFile, nPartId) SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SHELLS_NBR, '3') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_STRAND_OVERLAP, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_OFFSET_SLICE, '0.0') + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_PRINT_ORDER, '1,2,3,4,5') - local sStrandOrder = EgtGetStringFromIni( SEC_DEFAULT, KEY_PRINT_ORDER, 'InToOut', sFile) + local sStrandOrder = EgtGetStringFromIni( SEC_DEFAULT, KEY_STRAND_ORDER, 'InToOut', sFile) if sStrandOrder == 'OutToIn' then - EgtSetInfo( nPartId, KEY_PRINT_ORDER, PRINT_ORDER.EXT_INT) + EgtSetInfo( nPartId, KEY_STRAND_ORDER, PRINT_ORDER.EXT_INT) else -- 'InToOut' - EgtSetInfo( nPartId, KEY_PRINT_ORDER, PRINT_ORDER.INT_EXT) + EgtSetInfo( nPartId, KEY_STRAND_ORDER, PRINT_ORDER.INT_EXT) end local sStrandDirection = EgtGetStringFromIni( SEC_DEFAULT, KEY_PRINT_DIRECTION, 'CCW', sFile) @@ -151,7 +152,7 @@ local function LoadParams( sFile, nPartId) end SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_OVERLAP, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_PRINT_ORDER, '1') + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_PRINT_ORDER, '3,1,4,2') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_SHELLS_NBR, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_DIR, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_ORDER, '0') From 7f6ddd699cc92c139b19907ff1b97ff091e96d39 Mon Sep 17 00:00:00 2001 From: DarioS Date: Wed, 11 Jan 2023 18:31:35 +0100 Subject: [PATCH 55/79] 3dPrinting : - nuova compilazione per lua 5.4. --- .gitlab-ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d93515f..9a75a8b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,12 +7,12 @@ variables: NET_USERQ: 'steamw\egalware' #Note compilazione LUA: -# lua53 -o 32\$FileName -s $FileName: -o = output, -s = NON include i debug symbols +# lua54 -o 32\$FileName -s $FileName: -o = output, -s = NON include i debug symbols # helper compilazione LUA a 32 bit .LuaCompile32: &LuaCompile32 - | - Set-Alias lua53 C:\Tools\Lua32\luac53 + Set-Alias lua54 C:\Tools\Lua32\luac54 echo "Copia file *.ini" $FileList = Get-ChildItem("*.ini") ForEach ($File in $FileList) { @@ -30,14 +30,14 @@ variables: $FileList = Get-ChildItem("LuaLibs\*.lua") ForEach ($File in $FileList) { $FileName = Split-Path $File -leaf - lua53 -o 32\LuaLibs\$FileName LuaLibs\$FileName - echo "lua53 -o 32\LuaLibs\$FileName LuaLibs\$FileName" + lua54 -o 32\LuaLibs\$FileName LuaLibs\$FileName + echo "lua54 -o 32\LuaLibs\$FileName LuaLibs\$FileName" } # helper compilazione LUA a 64 bit .LuaCompile64: &LuaCompile64 - | - Set-Alias lua53 C:\Tools\Lua64\luac53 + Set-Alias lua54 C:\Tools\Lua64\luac54 echo "Copia file *.ini" $FileList = Get-ChildItem("*.ini") ForEach ($File in $FileList) { @@ -55,8 +55,8 @@ variables: $FileList = Get-ChildItem("LuaLibs\*.lua") ForEach ($File in $FileList) { $FileName = Split-Path $File -leaf - lua53 -o 64\LuaLibs\$FileName LuaLibs\$FileName - echo "lua53 -o 64\LuaLibs\$FileName LuaLibs\$FileName" + lua54 -o 64\LuaLibs\$FileName LuaLibs\$FileName + echo "lua54 -o 64\LuaLibs\$FileName LuaLibs\$FileName" } # Copy-Item -Path $FileName -Destination 64\$FileName From 30677a89a499372a516793e310a0aad1e04a449a Mon Sep 17 00:00:00 2001 From: DarioS Date: Wed, 11 Jan 2023 19:50:51 +0100 Subject: [PATCH 56/79] 3dPrinting : - modifiche per compilazione lua5.4. --- .gitignore | 8 ++-- .gitlab-ci.yml | 65 ++++++++------------------------ 64/Images/.placeholder | 0 64/LuaLibs/.placeholder | 0 Compile.bat | 35 +++++++++++++++++ {32 => bin}/Images/.placeholder | 0 {32 => bin}/LuaLibs/.placeholder | 0 7 files changed, 55 insertions(+), 53 deletions(-) delete mode 100644 64/Images/.placeholder delete mode 100644 64/LuaLibs/.placeholder create mode 100644 Compile.bat rename {32 => bin}/Images/.placeholder (100%) rename {32 => bin}/LuaLibs/.placeholder (100%) diff --git a/.gitignore b/.gitignore index c7e3f84..aece050 100644 --- a/.gitignore +++ b/.gitignore @@ -13,9 +13,9 @@ /Debug64 /Release64 /ipch -/bin /obj /.vs -/Machinings -/Materials - +/bin/*.lua +/bin/*.ini +/bin/LuaLibs/*.lua +/bin/Images/*.png diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9a75a8b..e4e7f88 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,60 +7,33 @@ variables: NET_USERQ: 'steamw\egalware' #Note compilazione LUA: -# lua54 -o 32\$FileName -s $FileName: -o = output, -s = NON include i debug symbols +# lua54 -o bin\$FileName -s $FileName: -o = output, -s = NON include i debug symbols -# helper compilazione LUA a 32 bit -.LuaCompile32: &LuaCompile32 +# helper compilazione LUA a 32 e 64 bit +.LuaCompile: &LuaCompile - | Set-Alias lua54 C:\Tools\Lua32\luac54 echo "Copia file *.ini" $FileList = Get-ChildItem("*.ini") ForEach ($File in $FileList) { $FileName = Split-Path $File -leaf - Copy-Item -Path $FileName -Destination 32\$FileName - echo "Copy-Item -Path $FileName -Destination 32\$FileName" + Copy-Item -Path $FileName -Destination bin\$FileName + echo "Copy-Item -Path $FileName -Destination bin\$FileName" } echo "Copia file *.lua" $FileList = Get-ChildItem("*.lua") ForEach ($File in $FileList) { $FileName = Split-Path $File -leaf - Copy-Item -Path $FileName -Destination 32\$FileName - echo "Copy-Item -Path $FileName -Destination 32\$FileName" + Copy-Item -Path $FileName -Destination bin\$FileName + echo "Copy-Item -Path $FileName -Destination bin\$FileName" } $FileList = Get-ChildItem("LuaLibs\*.lua") ForEach ($File in $FileList) { $FileName = Split-Path $File -leaf - lua54 -o 32\LuaLibs\$FileName LuaLibs\$FileName - echo "lua54 -o 32\LuaLibs\$FileName LuaLibs\$FileName" + lua54 -o bin\LuaLibs\$FileName LuaLibs\$FileName + echo "lua54 -o bin\LuaLibs\$FileName LuaLibs\$FileName" } -# helper compilazione LUA a 64 bit -.LuaCompile64: &LuaCompile64 - - | - Set-Alias lua54 C:\Tools\Lua64\luac54 - echo "Copia file *.ini" - $FileList = Get-ChildItem("*.ini") - ForEach ($File in $FileList) { - $FileName = Split-Path $File -leaf - Copy-Item -Path $FileName -Destination 64\$FileName - echo "Copy-Item -Path $FileName -Destination 64\$FileName" - } - echo "Copia file *.lua" - $FileList = Get-ChildItem("*.lua") - ForEach ($File in $FileList) { - $FileName = Split-Path $File -leaf - Copy-Item -Path $FileName -Destination 64\$FileName - echo "Copy-Item -Path $FileName -Destination 64\$FileName" - } - $FileList = Get-ChildItem("LuaLibs\*.lua") - ForEach ($File in $FileList) { - $FileName = Split-Path $File -leaf - lua54 -o 64\LuaLibs\$FileName LuaLibs\$FileName - echo "lua54 -o 64\LuaLibs\$FileName LuaLibs\$FileName" - } - -# Copy-Item -Path $FileName -Destination 64\$FileName -# echo "Copy-Item -Path $FileName -Destination 64\$FileName" # helper copia SORGENTI verso cartella di rete R:\ dei SORGENTI .CodeReplicaR: &CodeReplicaR - | @@ -71,27 +44,23 @@ variables: net use R: /delete -# helper copia script verso cartella di rete R:\ delle cartelle 32 e 64 +# helper copia script verso cartella di rete R:\ delle cartelle bin .ReplicaR: &ReplicaR - | net use R: /delete net use R: $env:NET_SHARE_R /u:$env:NET_USERQ $ZDRIVE_PASSWD - ROBOCOPY /MIR 32 R:\EgtData\$env:APP_NAME\32 - ROBOCOPY /MIR 64 R:\EgtData\$env:APP_NAME\64 - ROBOCOPY /MIR Images R:\EgtData\$env:APP_NAME\32\Images - ROBOCOPY /MIR Images R:\EgtData\$env:APP_NAME\64\Images + ROBOCOPY /MIR bin R:\EgtData\$env:APP_NAME\bin + ROBOCOPY /MIR Images R:\EgtData\$env:APP_NAME\bin\Images SLEEP 2 net use R: /delete -# helper copia script verso cartella di rete R:\ delle cartelle 32 e 64 +# helper copia script verso cartella di rete R:\ delle cartelle bin .ReplicaZ: &ReplicaZ - | net use Z: /delete net use Z: $env:NET_SHARE_Z /u:$env:NET_USERQ $ZDRIVE_PASSWD - ROBOCOPY /MIR 32 Z:\EgtData\$env:APP_NAME\32 - ROBOCOPY /MIR 64 Z:\EgtData\$env:APP_NAME\64 - ROBOCOPY /MIR Images Z:\EgtData\$env:APP_NAME\32\Images - ROBOCOPY /MIR Images Z:\EgtData\$env:APP_NAME\64\Images + ROBOCOPY /MIR bin Z:\EgtData\$env:APP_NAME\bin + ROBOCOPY /MIR Images Z:\EgtData\$env:APP_NAME\bin\Images SLEEP 2 net use Z: /delete @@ -106,9 +75,7 @@ LuaCompile:build: tags: - win script: - - *LuaCompile32 - - *LuaCompile64 + - *LuaCompile - *CodeReplicaR - *ReplicaR - *ReplicaZ - diff --git a/64/Images/.placeholder b/64/Images/.placeholder deleted file mode 100644 index e69de29..0000000 diff --git a/64/LuaLibs/.placeholder b/64/LuaLibs/.placeholder deleted file mode 100644 index e69de29..0000000 diff --git a/Compile.bat b/Compile.bat new file mode 100644 index 0000000..d8ae439 --- /dev/null +++ b/Compile.bat @@ -0,0 +1,35 @@ + +REM Compilazione degli script 3dPrinting Egaltech 2023.01.11 +REM Per togliere info di debug aggiungere flag -s prima del nome del file di input + +REM Compilazione 32 e 64 bit + +\EgtProg\Dll32\luac54 -o bin\LuaLibs\AddManData.lua LuaLibs\AddManData.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\CalcPaths.lua LuaLibs\CalcPaths.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\CalcSlices.lua LuaLibs\CalcSlices.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\CalcToolPath.lua LuaLibs\CalcToolPath.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\CSVManager.lua LuaLibs\CSVManager.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunCalcSolids.lua LuaLibs\RunCalcSolids.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunGcodeGenerate.lua LuaLibs\RunGcodeGenerate.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunMachiningParamCalc.lua LuaLibs\RunMachiningParamCalc.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunMachiningParamEdit.lua LuaLibs\RunMachiningParamEdit.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunMachParamFromSWCalc.lua LuaLibs\RunMachParamFromSWCalc.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunMaterialParamEdit.lua LuaLibs\RunMaterialParamEdit.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunPartPositioning.lua LuaLibs\RunPartPositioning.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunShowManager.lua LuaLibs\RunShowManager.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunSliceAdvancement.lua LuaLibs\RunSliceAdvancement.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunSlicePalette.lua LuaLibs\RunSlicePalette.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunSlicing.lua LuaLibs\RunSlicing.lua +\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunViewManager.lua LuaLibs\RunViewManager.lua +\EgtProg\Dll32\luac54 -o bin\CalcMachParamFromSW.lua CalcMachParamFromSW.lua +\EgtProg\Dll32\luac54 -o bin\CalcSolids.lua CalcSolids.lua +\EgtProg\Dll32\luac54 -o bin\GcodeGenerate.lua GcodeGenerate.lua +\EgtProg\Dll32\luac54 -o bin\MachiningParamCalc.lua MachiningParamCalc.lua +\EgtProg\Dll32\luac54 -o bin\MachiningParamEdit.lua MachiningParamEdit.lua +\EgtProg\Dll32\luac54 -o bin\MaterialParamEdit.lua MaterialParamEdit.lua +\EgtProg\Dll32\luac54 -o bin\PartPositioning.lua PartPositioning.lua +\EgtProg\Dll32\luac54 -o bin\ShowManager.lua ShowManager.lua +\EgtProg\Dll32\luac54 -o bin\SliceAdvancement.lua SliceAdvancement.lua +\EgtProg\Dll32\luac54 -o bin\SlicePalette.lua SlicePalette.lua +\EgtProg\Dll32\luac54 -o bin\Slicing.lua Slicing.lua +\EgtProg\Dll32\luac54 -o bin\ViewManager.lua ViewManager.lua diff --git a/32/Images/.placeholder b/bin/Images/.placeholder similarity index 100% rename from 32/Images/.placeholder rename to bin/Images/.placeholder diff --git a/32/LuaLibs/.placeholder b/bin/LuaLibs/.placeholder similarity index 100% rename from 32/LuaLibs/.placeholder rename to bin/LuaLibs/.placeholder From 3a8f94f027b7ac2e4d39248569942cb8fe57d4b8 Mon Sep 17 00:00:00 2001 From: DarioS Date: Thu, 12 Jan 2023 09:25:56 +0100 Subject: [PATCH 57/79] 3dPrinting : - eliminati tutti i file non per Icarus (lua e immagini) - eliminata cartella Images - compilazione 32 e 64 bit unificata con direttorio destinazione bin. --- .gitlab-ci.yml | 2 - 3dPrinting.ini | 16 --- CalcMachParamFromSW.lua | 5 +- CalcSolids.lua | 5 +- Compile.bat | 17 --- GcodeGenerate.lua | 5 +- Images/GcodeGenerate.png | Bin 1057 -> 0 bytes Images/MachiningParamCalc.png | Bin 1077 -> 0 bytes Images/MachiningParamEdit.png | Bin 1158 -> 0 bytes Images/MaterialParamEdit.png | Bin 809 -> 0 bytes Images/PartPositioning.png | Bin 913 -> 0 bytes Images/ShowManager.png | Bin 919 -> 0 bytes Images/SliceAdvancement.png | Bin 443 -> 0 bytes Images/SlicePalette.png | Bin 391 -> 0 bytes Images/Slicing.png | Bin 485 -> 0 bytes Images/ViewManager.png | Bin 467 -> 0 bytes LuaLibs/CSVManager.lua | 75 ----------- LuaLibs/RunMachiningParamCalc.lua | 198 ---------------------------- LuaLibs/RunMachiningParamEdit.lua | 57 -------- LuaLibs/RunMaterialParamEdit.lua | 56 -------- LuaLibs/RunPartPositioning.lua | 209 ------------------------------ LuaLibs/RunShowManager.lua | 138 -------------------- LuaLibs/RunSliceAdvancement.lua | 186 -------------------------- LuaLibs/RunSlicePalette.lua | 113 ---------------- LuaLibs/RunViewManager.lua | 195 ---------------------------- MachiningParamCalc.lua | 18 --- MachiningParamEdit.lua | 18 --- MaterialParamEdit.lua | 18 --- PartPositioning.lua | 20 --- ShowManager.lua | 18 --- SliceAdvancement.lua | 18 --- SlicePalette.lua | 18 --- Slicing.lua | 5 +- ViewManager.lua | 18 --- bin/Images/.placeholder | 0 35 files changed, 8 insertions(+), 1420 deletions(-) delete mode 100644 3dPrinting.ini delete mode 100644 Images/GcodeGenerate.png delete mode 100644 Images/MachiningParamCalc.png delete mode 100644 Images/MachiningParamEdit.png delete mode 100644 Images/MaterialParamEdit.png delete mode 100644 Images/PartPositioning.png delete mode 100644 Images/ShowManager.png delete mode 100644 Images/SliceAdvancement.png delete mode 100644 Images/SlicePalette.png delete mode 100644 Images/Slicing.png delete mode 100644 Images/ViewManager.png delete mode 100644 LuaLibs/CSVManager.lua delete mode 100644 LuaLibs/RunMachiningParamCalc.lua delete mode 100644 LuaLibs/RunMachiningParamEdit.lua delete mode 100644 LuaLibs/RunMaterialParamEdit.lua delete mode 100644 LuaLibs/RunPartPositioning.lua delete mode 100644 LuaLibs/RunShowManager.lua delete mode 100644 LuaLibs/RunSliceAdvancement.lua delete mode 100644 LuaLibs/RunSlicePalette.lua delete mode 100644 LuaLibs/RunViewManager.lua delete mode 100644 MachiningParamCalc.lua delete mode 100644 MachiningParamEdit.lua delete mode 100644 MaterialParamEdit.lua delete mode 100644 PartPositioning.lua delete mode 100644 ShowManager.lua delete mode 100644 SliceAdvancement.lua delete mode 100644 SlicePalette.lua delete mode 100644 ViewManager.lua delete mode 100644 bin/Images/.placeholder diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e4e7f88..7e3ace3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -50,7 +50,6 @@ variables: net use R: /delete net use R: $env:NET_SHARE_R /u:$env:NET_USERQ $ZDRIVE_PASSWD ROBOCOPY /MIR bin R:\EgtData\$env:APP_NAME\bin - ROBOCOPY /MIR Images R:\EgtData\$env:APP_NAME\bin\Images SLEEP 2 net use R: /delete @@ -60,7 +59,6 @@ variables: net use Z: /delete net use Z: $env:NET_SHARE_Z /u:$env:NET_USERQ $ZDRIVE_PASSWD ROBOCOPY /MIR bin Z:\EgtData\$env:APP_NAME\bin - ROBOCOPY /MIR Images Z:\EgtData\$env:APP_NAME\bin\Images SLEEP 2 net use Z: /delete diff --git a/3dPrinting.ini b/3dPrinting.ini deleted file mode 100644 index 25e9d21..0000000 --- a/3dPrinting.ini +++ /dev/null @@ -1,16 +0,0 @@ -[3dPrinting] -Enable=1 -BaseDir=C:\EgtData\3dPrinting -Button1=PartPositioning.lua,Images\PartPositioning.png,Disponi pezzo sulla tavola macchina -Button2=Slicing.lua,Images\Slicing.png,Calcola lo slicing, i solidi e i percorsi utensile -Button3=MachiningParamCalc.lua,Images\MachiningParamCalc.png,Calcola parametri di lavorazione (Tempo layer, F, S) -Button4=GcodeGenerate.lua,Images\GcodeGenerate.png,Genera codice CN -Button5=ShowManager.lua,Images\ShowManager.png,Gestore visualizzazione -Button6=ViewManager.lua,Images\ViewManager.png,Nascondi Visualizza strato -Button7=SliceAdvancement.lua,Images\SliceAdvancement.png,Mostra avanzamento strato -Button8=SlicePalette.lua,Images\SlicePalette.png,Gestore colori strato -Button9=MachiningParamEdit.lua,Images\MachiningParamEdit.png,Edita i parametri di stampa -Button10=MaterialParamEdit.lua,Images\MaterialParamEdit.png,Edita i parametri del materiale -ParamFile=C:\EgtData\3dPrinting\Machinings\Params.ini -ResultReadProg="C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" -MachiningEditProg="C:\Windows\System32\notepad.exe" \ No newline at end of file diff --git a/CalcMachParamFromSW.lua b/CalcMachParamFromSW.lua index 400bca9..5d13947 100644 --- a/CalcMachParamFromSW.lua +++ b/CalcMachParamFromSW.lua @@ -1,4 +1,4 @@ --- CalcMachParamFromSW.lua by Egaltech s.r.l. 2022/09/15 +-- CalcMachParamFromSW.lua by Egaltech s.r.l. 2023/01/11 -- Calcolo dei parametri di stampa -- Intestazioni @@ -7,8 +7,7 @@ _ENV = EgtProtectGlobal() EgtEnableDebug( false) -- Imposto direttorio libreria specializzata per Stampa 3d -local sBaseDir = EgtGetSourceDir() -EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') +EgtAddToPackagePath( PRINT.BASEDIR .. '\\LuaLibs\\?.lua') -- Librerie _G.package.loaded.RunMachParamFromSWCalc = nil diff --git a/CalcSolids.lua b/CalcSolids.lua index c0adffa..5f3fe91 100644 --- a/CalcSolids.lua +++ b/CalcSolids.lua @@ -1,4 +1,4 @@ --- CalcSolids.lua by Egaltech s.r.l. 2022/09/26 +-- CalcSolids.lua by Egaltech s.r.l. 2023/01/11 -- Calcola i solidi a partire dallo slicing -- Intestazioni @@ -7,8 +7,7 @@ _ENV = EgtProtectGlobal() EgtEnableDebug( false) -- Imposto direttorio libreria specializzata per Stampa 3d -local sBaseDir = EgtGetSourceDir() -EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') +EgtAddToPackagePath( PRINT.BASEDIR .. '\\LuaLibs\\?.lua') -- Librerie _G.package.loaded.RunCalcSolids = nil diff --git a/Compile.bat b/Compile.bat index d8ae439..62cf277 100644 --- a/Compile.bat +++ b/Compile.bat @@ -8,28 +8,11 @@ REM Compilazione 32 e 64 bit \EgtProg\Dll32\luac54 -o bin\LuaLibs\CalcPaths.lua LuaLibs\CalcPaths.lua \EgtProg\Dll32\luac54 -o bin\LuaLibs\CalcSlices.lua LuaLibs\CalcSlices.lua \EgtProg\Dll32\luac54 -o bin\LuaLibs\CalcToolPath.lua LuaLibs\CalcToolPath.lua -\EgtProg\Dll32\luac54 -o bin\LuaLibs\CSVManager.lua LuaLibs\CSVManager.lua \EgtProg\Dll32\luac54 -o bin\LuaLibs\RunCalcSolids.lua LuaLibs\RunCalcSolids.lua \EgtProg\Dll32\luac54 -o bin\LuaLibs\RunGcodeGenerate.lua LuaLibs\RunGcodeGenerate.lua -\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunMachiningParamCalc.lua LuaLibs\RunMachiningParamCalc.lua -\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunMachiningParamEdit.lua LuaLibs\RunMachiningParamEdit.lua \EgtProg\Dll32\luac54 -o bin\LuaLibs\RunMachParamFromSWCalc.lua LuaLibs\RunMachParamFromSWCalc.lua -\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunMaterialParamEdit.lua LuaLibs\RunMaterialParamEdit.lua -\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunPartPositioning.lua LuaLibs\RunPartPositioning.lua -\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunShowManager.lua LuaLibs\RunShowManager.lua -\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunSliceAdvancement.lua LuaLibs\RunSliceAdvancement.lua -\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunSlicePalette.lua LuaLibs\RunSlicePalette.lua \EgtProg\Dll32\luac54 -o bin\LuaLibs\RunSlicing.lua LuaLibs\RunSlicing.lua -\EgtProg\Dll32\luac54 -o bin\LuaLibs\RunViewManager.lua LuaLibs\RunViewManager.lua \EgtProg\Dll32\luac54 -o bin\CalcMachParamFromSW.lua CalcMachParamFromSW.lua \EgtProg\Dll32\luac54 -o bin\CalcSolids.lua CalcSolids.lua \EgtProg\Dll32\luac54 -o bin\GcodeGenerate.lua GcodeGenerate.lua -\EgtProg\Dll32\luac54 -o bin\MachiningParamCalc.lua MachiningParamCalc.lua -\EgtProg\Dll32\luac54 -o bin\MachiningParamEdit.lua MachiningParamEdit.lua -\EgtProg\Dll32\luac54 -o bin\MaterialParamEdit.lua MaterialParamEdit.lua -\EgtProg\Dll32\luac54 -o bin\PartPositioning.lua PartPositioning.lua -\EgtProg\Dll32\luac54 -o bin\ShowManager.lua ShowManager.lua -\EgtProg\Dll32\luac54 -o bin\SliceAdvancement.lua SliceAdvancement.lua -\EgtProg\Dll32\luac54 -o bin\SlicePalette.lua SlicePalette.lua \EgtProg\Dll32\luac54 -o bin\Slicing.lua Slicing.lua -\EgtProg\Dll32\luac54 -o bin\ViewManager.lua ViewManager.lua diff --git a/GcodeGenerate.lua b/GcodeGenerate.lua index 1047d2b..703149d 100644 --- a/GcodeGenerate.lua +++ b/GcodeGenerate.lua @@ -1,4 +1,4 @@ --- GcodeGenerate.lua by Egaltech s.r.l. 2022/04/11 +-- GcodeGenerate.lua by Egaltech s.r.l. 2023/01/11 -- Calcoli prima fase per Stampa 3d -- Intestazioni @@ -7,8 +7,7 @@ _ENV = EgtProtectGlobal() EgtEnableDebug( false) -- Imposto direttorio libreria specializzata per Stampa 3d -local sBaseDir = EgtGetSourceDir() -EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') +EgtAddToPackagePath( PRINT.BASEDIR .. '\\LuaLibs\\?.lua') -- Librerie _G.package.loaded.RunGcodeGenerate = nil diff --git a/Images/GcodeGenerate.png b/Images/GcodeGenerate.png deleted file mode 100644 index 67d90568b6db370c89ec75d569f092f23173b19a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1057 zcmV++1m63JP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TQ64HQE90nk$(vMdQ0#+`mxts< zxkYx9jwW)Q+$YCz!DF~QVZ#hV9tz>Lvkxc4=>|;a2XvyqcEa{GyvZ-_szqeru z61gBpN&dcFI=CNQ_)5;?LNT0^{x~@=58E($DBa-ZX=m6l#Z9^1hEZopi;gsBHdzLG zNwkzlBwfZ#;kZk-kT6@i?mWu{k8P6KmxRRm&an8H^oA^niumZ$K=Qiy8yJ_q{|I$e z-|}H*U%g8#kWjwb=U62t+c3o~>Aw(1NLTv?$(@qf8T#EIg=!xxkz5NUHC29)%woqA z$vdl~d5ykV3T&nDYDOM;S^AcwO)g16str_qxbsHZ(kv$%hS6sP=)I!jyOmYWav<_Oil?@GBPzxJ`3bXDI`sHH+MD_JBuSYaf4 zCPOkQm?)V!Jf*9B%$_+i2}QP482s-f4^CmG_ekDdt}#;U zbT_7as#}nOa^+-G%4hq_?vl;N!dNyWDctN!Qd0%l!PI{yDJQ^Moqb^PEuSKkR81CS zU}Le`h6WynEj;)5EmK=|mk^dGGONjgyitCZ%gvePg`~w<=naMMZoJQJsR!vN(l*@3K5M&Z5}mMJZ(8 bKZ^bUfz@+8#Q6Fa00000NkvXXu0mjf{R!}5 diff --git a/Images/MachiningParamCalc.png b/Images/MachiningParamCalc.png deleted file mode 100644 index ffe23a784828d6f224ca64eda4fade7a3aef26e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1077 zcmV-51j_q~P)h((pGibPR9HvNm~Ci{VHn3BMp&$T zpjNWTrbwBZnU_TQAWF0^d@=7ctu%@zFU3b$*e0bmMOi7SB@_y!$;$`HYa}0h+2mz5 zX&nFm({-J$=RVh1&3at*d(LzJp6hIX=bSy)xkZ^w=D)+0Y2(VYaV0@DIy?o_L5t~Y z0=4$J;;R6kGfvjW0ekglHH6PmTuD%?ga_afSPNEyV$dZ$MSv$?Kwj|tH*#&Vtlxs| zUY+Q1&O&Iu*weV`1?03XEhU_+e-^&sanXmO%^(=6u(=X`gZa6#T^4XK%xHp{&1y&;$b7; z+*>VfAGirP!^k}Gt$?==^(Er(f)7axWi26!?`U5G0c6hn;-++g3nQt;09gt$^c{nJpWLckCEuCUMI zN(J>3c%c}!8&KR6&rt0D3MkHtXQL z9XUFp5~0Ms1f>aQ7qP(YAM6EO91+J*+_K*Syx(jQuc0_v_|-*kk_`0<=qM@|?}d5@ z;)kGd+V1)c{&; zPwW#5Y^4C-9{#2Au}VBcHQ8SA48@Zkd4!HVL-FLBJobubDE7Vv6x_xqKICyW& diff --git a/Images/MachiningParamEdit.png b/Images/MachiningParamEdit.png deleted file mode 100644 index f65d28caa8e65a055e7ec1a89d370b00c1e4f5be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1158 zcmV;11bO?3P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ941RF_2K~z{r?U-q- zokJLa54A*!M3hEq50%u~+69T7D$x=YwbWK(`yu?|mq_r#9ziUjEeSi-Xvy zKXS1rC!!0(&zarw_IP%;d^DbiU*l#t8Q;LY@dkVhhfxl-omzf-P-{BtkQ>sBzr{X5E6*>ZT>TVku*uQf&xd0PlHFs%2c@$LC_g5!xviM-rVHi;jY8%jsxa z=sxA|xM!*j;hOpecTBY*F2vh&v2zTr$i-&rk=h*ldHd#~(^G0FSXi~GBPzZO&!VGy zoDFN54H}eQ?SWyVUYDb+TNt@xAK(( z@Q_?gn8#*dTw@OVD;In61e$V8!c*~5Eb)yt0~qt><1=^`4#OJ+#;0R(9-8UZXlrLb z$7}IrG$x&n2ULEA*P-8e{U_+#npF z#OHAW?$+S8Xi_yE8Skz}<57vz?~XwX5!+yyI~(~PC*l$`nj1?TYJdDQ29f(pO(}LL zQi$o~u3Q{}9r6KhO|=$W3zwlc4?e@$=q66gcXbZ5nF}eZln~l&L&q}q7(_x$6wJ`_1_Gx?~&NDKVw^6kDg-aQx1kW{&jGDL#zR-ovFiuqjzf zbV#P42a8s`xe-=8#k%Eiq@vA{Iwuzs9z5;1kvk5WQYUIHxeeWs^rUH|#AAh z3*BkID%JYL>5C^0T*T${`7a!IpKjt@U*hz+^<5PnbRz+W-{Km>|1p)s6t>Z4BJOnl Y1%h7Y-Vbk{hX4Qo07*qoM6N<$f@Py6bpQYW diff --git a/Images/MaterialParamEdit.png b/Images/MaterialParamEdit.png deleted file mode 100644 index eef597753c7833aeac10d4a4992902adc67cca97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 809 zcmV+^1J?YBP)N2bZe?^J zG%heMGBNQWX_Wu~0;WksK~z{r&6iJz%~2G`PZWh36PqbD$yWZ9q%7EtSy-4Tu@G5N zHl_)M$wK3A!bT=SlA@HFNG2@kW7{2R)Gg_5j1-*evi-FMvIX@0-FJ6*Rvzjw~( zp8I>J-h02!qei3g-{H#KxH31bfN0(XblF37!P@BgDp~>2C%}Qnh&@yXtWA1$nYTX? zt$?W0@D)G&o*h z-$!a=A(H4FxEeXWTr&Bvy7ijR(tL~NUQ@q7kLEMMcd(mt%U?;5L~p?5$nmAuuc`Y{JvVjSI`Od(N%S1lY3glMQ`OYHsGgfTVV(F`h$MOn>NJJ0R5NK! z$+M+husS?ng)4L8%G|gzH?GW$D|6Gl_=8=+KMi>8(7Yrb@Y2E6Tn1D-aI0KVr<-RlBB!AZ?~0S7C>`xQYD2?jiM z;bX@d0vt@$e3#}c!8afchI*TbNHE|Tw-jsurvQsiv-b?}Bsy--$X-dL8Sv(V7l0G~ zm`60WO&wNuyKrHzB+?9c{Jk4Bd#eEl(iGMr%@65oUr{UjHW86#z&i_GgBhChkAZ`t zsk>lU<7;4yPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ94113pCK~z{r&6ZC{ zR6!WPzcF1_X;)iP%q=0%gh&WNFXbU9-2ULHL+YVhf82t)*&zrD>L3JJ3U%qC(kY5U zC8%Wc;MQ#;C`Hj)qx`#W?uMq*d~av;y|=T^_uiVjKlu1&zBfDj+c*2>4WX1mwvoeg zR*{ubwwA9e7^VyHWvKSLdBr~cpQqq_T{-O8kxzKZx>Pq4YUv5_-sW)S=w7(hP-Ra_ z2$i@T@GH6m^Y?sf6Ita_cZl|U2rKQE{#rOv;aQu@^nXeS9Vl}_Q|)eEwTBRDtnu=S z7E@Acp;wn{!I^9S`A`dWHdRaS^oFzRg$ncY(q1wnA;eHB6GBKzsZ0qWQmIS|AxTnP zhzg;i0taD$It2QV%2mbqpdxT;n-H7n4L41G{ zWg#7>0+-YlGAR$w3OX6lcCjcF*JQzvF25OMAI#BBzUA2dHUE?JqzGw{L@B>&8{1N& zkI!Oyu8-F>$9}M!7P&lI!uPZdJd4Q>U$A^1Jo`BVgM^ep`;bz@%~5F>5DG8g=E-|j zrTnCC>PO$F$JYG#; z^-k5bOm!t%m5C&1`&b3rBgre*>Z?e4#YE!E^wfi(BGl1X%}%mj%^1`FDSWx|W?BfL zPm@up5MoM7yzSG)j1aP+l=}E#hL~$7ra`5n!mJQtC}rh5DlSd?;Bijb00000NkvXXu0mjfCeo_a diff --git a/Images/ShowManager.png b/Images/ShowManager.png deleted file mode 100644 index ad9d17b43275c5b4a87c4040d7ab3fa4938733da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 919 zcmV;I18Dq-P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf11w2IK~z{r?N&=q z6HyrbZVN4i7Fs}>fFT5o4>m0HKd>;7m>71j(47gaOpJ*!(S9=0 z6(+hNDn4RBG@ukn3Y2#{*K?+ilsbiJQ^zhi$;mhO`)+&BeD|K2QCe#$H@H%`)Du-pV!1dynV{vbTlmxP1Yz7NjUf=Hj4Z$cREGz96)K zKF|+VgI+L%+9yQQ2w*K3N-@YBYo$c)0p{Wq#tx;sH4Zvzgk67zj!Yq}gLNRgw1C`q zL?Q%I5YHLKvYQmnF-=l3SlwX^yyBe=4H@c)Gq2qXGZcDR@OV@VH zoNF7!Y+qg@Y&=o(u1a|WSsuM50lg#sgdrXN^ExBmju8qLMdUNW=bNg#twrt`hD6kk z`0&?(p9|7|?5cjnx?Lj_C2B7$4XM#8mz?4j;>&O>bW!&)Ux*QkIa7P0)+MtZoF#9C z)CYXRm%NEWj8Jk>w_eKl@T6RS^iHl_8I{c47h;5xZ=VXb_exFc2A*PZiB0?U>dbJe zl-CG>3rQEJwUoS5Iy&{(H8mq6oKA0|-V! t>pL8mg{WMVrKnsu?mjy>5M>V{e*llQitu(}xcvYC002ovPDHLkV1h%4k|+QG diff --git a/Images/SliceAdvancement.png b/Images/SliceAdvancement.png deleted file mode 100644 index 4ced7f5349138988c8145a0ed9334258d8ef930e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^svyk41|*NpQ(y*CEa{HEjtmSN`?>!lvI6;>1s;*b z3=DjSL74G){)!Z!pk#?_L`iUdT1k0gQ7S`0VrE{6US4X6f{C7io{`~4h0Li842%|@ zE{-7)?r*0U@*OhZajh0`<2!ob7}s=%j%bCAjO~wk7S@ZRdw;63$8XOo^A2je8Iv%;=ZcnYoVv)A{?ximIpRO}On fdiv(HE42)!RawX8obb#81~h}GtDnm{r-UW|-hi^0 diff --git a/Images/SlicePalette.png b/Images/SlicePalette.png deleted file mode 100644 index 0918ad55ca42bb80746338679614dee57f0f7a0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^svyk41|*NpQ(y*CEa{HEjtmSN`?>!lvI6;>1s;*b z3=DjSL74G){)!Z!pk#?_L`iUdT1k0gQ7S`0VrE{6US4X6f{C7io{`~4h0Li842&$E zE{-7)?r$$`opIu*7mwZ6rx)!$eP!A4VvX3E_&sMP*%@rhEthQ9;=NUJ{ks4Ebrl&aq7=Re zuTtYkU7Xb%Aa;sbncUU3Ym0-8k zQP5+KeV0Os=ao;}%#QZGRuf4&UMkGB@$oLs)*FR$S(iF`@Kik57%?+R|H9G$o|YpI zI)AY_C4F$>ZJZ!s6QC&|gTe~DWM4f7Z#F= diff --git a/Images/Slicing.png b/Images/Slicing.png deleted file mode 100644 index 58e76e2bf0999f5b3649a2afcf13543ce33b17fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^svyk41|*NpQ(y*CEa{HEjtmSN`?>!lvI6;>1s;*b z3=DjSL74G){)!Z!pk#?_L`iUdT1k0gQ7S`0VrE{6US4X6f{C7io{`~4h0Li842(&h zE{-7)?q@Fa|V=JaCa9eR@ zK}HB)fQXj(i}X@mo~gnjEvI-7Z5B73VSD-6MbTWD@2f3y$I1mY3U4+qe&yh(@q3|**i+_*me#Af9KY?Id$q14TC^o3 zP){JpS(kaO{I`r>7UtK}-F`Y;-_HN+)uo0T6PQG~opKmX$tg{AJ=!239kd|Hv4dB$ z{!4&BlCxKc2FFH4Q7yI>sJaPmZ?~UY!lvI6;>1s;*b z3=DjSL74G){)!Z!pk#?_L`iUdT1k0gQ7S`0VrE{6US4X6f{C7io{`~4h0Li842%Ju zE{-7)?r$#{dNDhS9Q(MpQGCOeZvyiU7`4uw>msnnk>lP0H;*mdWn7G$P8|tOP9`k^ zj#~teTr#$Ku08Fm>iN4fQ}3PO605)QUBTG?go;bZ&LgRBz$ozWQSMUtW%sIT|C=07 zd%pQ}PFDXs&CI=lMgJZy-TO@S>o4Wvk}~$)8#L}Oi2B@R)|YpB@fL@rfwL9_Y2;2Y z)?zuqDazHdCP2|~g@CA3OHtt8mvhSe*JnOo^L*)Fw`^X8sohdN>Lms-RjcbR2@0P*Isj?7QFoN^en{!Z) string.len(s) - return t -end - ---------------------------------------------------------------------- -function read_file( path) - local file = io.open( path, "r") -- r read mode and b binary mode - if not file then return nil end - local CSVTable = {} - - for line in io.lines( path) do - CSVTable[#CSVTable + 1] = fromCSV( line) - end - - file:close() - - return CSVTable -end - ---------------------------------------------------------------------- -return CSVManager diff --git a/LuaLibs/RunMachiningParamCalc.lua b/LuaLibs/RunMachiningParamCalc.lua deleted file mode 100644 index f73bf5e..0000000 --- a/LuaLibs/RunMachiningParamCalc.lua +++ /dev/null @@ -1,198 +0,0 @@ --- RunMachiningParamCalc.lua by Egaltech s.r.l. 2022/04/13 --- Gestione visualizzazione per Stampa 3d - --- Tabella per definizione modulo -local RunMachiningParamCalc = {} - --- Intestazioni -require( 'EgtBase') - -EgtOutLog( ' RunMachiningParamCalc started', 1) - --- Costanti generali -local AMD = require( 'AddManData') -local CSV = require( 'CSVManager') - ---------------------------------------------------------------------- -function RunMachiningParamCalc.Exec() - - -- Dati recuperati dalla macchina - local sMachIni = EgtGetCurrMachineDir() .. '\\' .. EgtGetCurrMachineName() .. '.ini' - local dCoeffX = tonumber( EgtGetStringFromIni( SEC_3DPRINTING, KEY_COEFF_X, 0, sMachIni)) - local dCoeffY = tonumber( EgtGetStringFromIni( SEC_3DPRINTING, KEY_COEFF_Y, 0, sMachIni)) - - -- File dei risultati - local sCalcBaseDir = EgtGetStringFromIni( '3dPrinting', 'BaseDir', 'C:\\ProgramData\\Egaltech\\EgtCam5\\3dPrinting', EgtGetIniFile()) - local sCurrProjectPath = EgtGetCurrFilePath() - local sResultFile = EgtChangePathExtension( sCurrProjectPath, '.csv') - local bResultFile = EgtExistsFile( sResultFile) - - -- carico eventuale file dei risultati - local CSVOldResult - if bResultFile then - CSVOldResult = read_file( sResultFile) - end - - -- tabella del csv del risultato - local CSVNewResult = {} - - -- ciclo sui pezzi - local nPartId = EgtGetFirstPart() - while nPartId do - if not EgtGetInfo( nPartId, KEY_PART_ON_TABLE, 'b') then - nPartId = EgtGetNextPart( nPartId) - goto continue - end - -- recupero i parametri di lavorazione del pezzo - local dMachiningFeed = EgtGetInfo( nPartId, KEY_FEED, 'd') - local dSliceStep = EgtGetInfo( nPartId, KEY_SLICE_STEP, 'd') - local dStrand = EgtGetInfo( nPartId, KEY_STRAND, 'd') - local sMaterial = EgtGetInfo( nPartId, KEY_MATERIAL) - -- verifico la definizione dei parametri - if not dMachiningFeed then - EgtOutBox( 'Impossible calculating before applying a machining.', 'Error', 'ERROR') - return - end - -- calcolo intervallo tempi consentito - local sMaterialPath = sCalcBaseDir .. '\\Materials\\' .. sMaterial .. '.csv' - local MaterialCSV = read_file( sMaterialPath) - local dMinTime = 0 - local dMaxTime = 0 - if not MaterialCSV then - EgtOutBox( 'Material csv file not found.', 'Error', 'ERROR') - return - end - local bSectionFound = false - for nSectionIndex = 1, #MaterialCSV do - local Section = MaterialCSV[nSectionIndex] - if tonumber( Section[1]) == dStrand and tonumber( Section[2]) == dSliceStep then - dMinTime = tonumber(Section[3]) - dMaxTime = tonumber(Section[4]) - bSectionFound = true - break - end - end - if not bSectionFound then - EgtOutBox( 'Section not found in Material csv file.', 'Error', 'ERROR') - return - end - -- ciclo sui layer - local nLayerIndex = 1 - local nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) - while nLayerId do - local sLayerName = EgtGetName( nLayerId) - local nLayerIndex = tonumber( sLayerName:sub( #SLICE_LAYER + 1)) - -- rimuovo eventuale info precedente del tempo di attesa - EgtRemoveInfo( nLayerId, KEY_WAITING_TIME) - -- calcolo lunghezza totale del layer - local dTotLayerLength = 0 - local nCrvId = EgtGetFirstGroupInGroup( nLayerId) - while nCrvId do - local nToolPathId = EgtGetFirstNameInGroup( nCrvId, TOOLPATH_GRP) - -- sommo lunghezze percorsi - local dTotCrvLength = 0 - nShellId = EgtGetFirstInGroup( nToolPathId) - while nShellId do - --local nType = EgtGetInfo( nShellId, KEY_TYPE, 'i') - dTotCrvLength = dTotCrvLength + EgtCurveLength( nShellId) - nShellId = EgtGetNext( nShellId) - end - dTotLayerLength = dTotLayerLength + dTotCrvLength - nCrvId = EgtGetNext( nCrvId) - end - -- recupero feed del layer - local dLayerFeed = 0 - if bResultFile then - -- leggo il valore dal file - local bResultFound = false - for nResultIndex = 1, #CSVOldResult do - local OldResult = CSVOldResult[nResultIndex] - if tonumber( OldResult[1]) == nLayerIndex then - dLayerFeed = tonumber( OldResult[5]) - bResultFound = true - break - end - end - if not bResultFound then - -- uso valore di default - dLayerFeed = dMachiningFeed - end - else - -- uso valore di default - dLayerFeed = dMachiningFeed - end - -- calcolo tempo stimato del layer - local dEsteemedTime = dTotLayerLength / dLayerFeed * 60 - -- calcolo speed - local dSpeed = ((( dLayerFeed * dSliceStep * dStrand ) / 60) - dCoeffX) / dCoeffY - -- scrivo info feed e speed in group toolpath - nCrvId = EgtGetFirstNameInGroup( nLayerId, CONTOUR_GRP .. '*') - while nCrvId do - local nToolPathId = EgtGetFirstNameInGroup( nCrvId, TOOLPATH_GRP) - EgtSetInfo( nToolPathId, KEY_FEED, dLayerFeed) - EgtSetInfo( nToolPathId, KEY_SPEED, dSpeed) - nCrvId = EgtGetNextName( nCrvId, CONTOUR_GRP .. '*') - end - -- salvo e riporto valori calcolati in tabella per csv - local sStatus = '' - if dEsteemedTime < dMinTime then - EgtSetInfo( nLayerId, KEY_RESULT, RESULT.KO_MINUS) - EgtSetInfo( nLayerId, KEY_WAITING_TIME, dMinTime - dEsteemedTime) - sStatus = 'KO(-)' - elseif dEsteemedTime > dMinTime and dEsteemedTime < dMaxTime then - EgtSetInfo( nLayerId, KEY_RESULT, RESULT.OK) - sStatus = 'OK' - elseif dEsteemedTime > dMaxTime then - EgtSetInfo( nLayerId, KEY_RESULT, RESULT.KO_PLUS) - sStatus = 'KO(+)' - end - --table.insert( CSVOutTable, { Index = nLayerIndex, EsteemedTime = dEsteemedTime, Feed = dLayerFeed, Speed = dSpeed}) - table.insert( CSVNewResult, { nLayerIndex, dTotLayerLength, dEsteemedTime, sStatus, dLayerFeed, dSpeed}) - nLayerIndex = nLayerIndex + 1 - nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) - end - nPartId = EgtGetNextPart( nPartId) - ::continue:: - end - - -- aggiorno palette - local nViewId = EgtGetFirstNameInGroup( GDB_ID.ROOT, VIEWPARAMS) - local nPaletteType = EgtGetInfo( nViewId, KEY_PALETTE, 'i') - if nPaletteType == PALETTE_TYPE.RESULTS then - local RSP = require( 'RunSlicePalette') - RSP.UpdateColors( nPaletteType) - end - -- scrivo nuovo file csv di risultato - local file = io.open( sResultFile, "w") - if file then - file:write('LayerIndex; Len; Time; Status; Feed; Speed') - file:write('\n') - for NewResultIndex = 1, #CSVNewResult do - local CSVOutLine = CSVNewResult[NewResultIndex] - local sParams = '' - for ParamIndex = 1, #CSVOutLine do - if ParamIndex > 1 then - sParams = sParams .. ";" - end - if ParamIndex == 4 then - sParams = sParams .. CSVOutLine[ParamIndex] - else - sParams = sParams .. EgtNumToString( CSVOutLine[ParamIndex], 1) - end - end - file:write(sParams) - file:write('\n') - end - file:close() - local sReadProgPath = EgtGetStringFromIni( '3dPrinting', RESULT_READ_PROG, "", EgtGetIniFile()) - if not sReadProgPath or not EgtWinExec( '"'..sReadProgPath..'" "'..sResultFile..'"') then - EgtOutBox( 'Impossible opening software to show results. You can find them in ' .. sResultFile, 'Error', 'ERROR') - end - else - EgtOutBox( 'Impossible writing results file in ' .. sResultFile, 'Error', 'ERROR') - end - -end - ---------------------------------------------------------------------- -return RunMachiningParamCalc diff --git a/LuaLibs/RunMachiningParamEdit.lua b/LuaLibs/RunMachiningParamEdit.lua deleted file mode 100644 index 2cf8f29..0000000 --- a/LuaLibs/RunMachiningParamEdit.lua +++ /dev/null @@ -1,57 +0,0 @@ --- RunMachiningParamEdit.lua by Egaltech s.r.l. 2022/04/05 --- Gestione visualizzazione per Stampa 3d - --- Tabella per definizione modulo -local RunMachiningParamEdit = {} - --- Intestazioni -require( 'EgtBase') - -EgtOutLog( ' RunMachiningParamEdit started', 1) - --- Costanti generali -local AMD = require( 'AddManData') - ---------------------------------------------------------------------- -function RunMachiningParamEdit.Exec() - -- recupero cartella delle lavorazioni - local sCalcBaseDir = EgtGetStringFromIni( '3dPrinting', 'BaseDir', 'C:\\ProgramData\\Egaltech\\EgtCam5\\3dPrinting', EgtGetIniFile()) - local sMachiningDirPath = sCalcBaseDir .. '\\Machinings\\' - - -- recupero file delle lavorazioni - --local Machinings = {} - local sMachinings = '' - - local f = io.popen("dir " .. sMachiningDirPath .. " /B", "r") - for entry in f:lines() do - --Machinings[#Machinings + 1] = entry - local sDir, sFile, sExt = EgtSplitPath(entry) - if sExt == '.ini' then - if sMachinings ~= "" then - sMachinings = sMachinings .. ',' - end - sMachinings = sMachinings .. sFile - end - end - - -- chiedo quale file aprire - MachiningValues = EgtDialogBox( 'Machinings edit', { 'Machining', 'CB:' .. sMachinings}) - if not MachiningValues or #MachiningValues < 1 then return end - - -- verifico esistenza file - local sSelMachiningPath = sMachiningDirPath .. MachiningValues[1] .. '.ini' - if not EgtExistsFile( sSelMachiningPath) then - EgtOutBox( 'Machining file not found', 'Error', 'ERROR') - return - end - - -- apro programma di edit - local sEditProgPath = EgtGetStringFromIni( '3dPrinting', 'MachiningEditProg', "", EgtGetIniFile()) - if not sEditProgPath or not EgtWinExec( '"'..sEditProgPath..'" "'.. sSelMachiningPath..'"') then - EgtOutBox( 'Impossible opening software to show Machining. You can find it in ' .. sSelMachiningPath, 'Error', 'ERROR') - end - -end - ---------------------------------------------------------------------- -return RunMachiningParamEdit diff --git a/LuaLibs/RunMaterialParamEdit.lua b/LuaLibs/RunMaterialParamEdit.lua deleted file mode 100644 index eb8ad75..0000000 --- a/LuaLibs/RunMaterialParamEdit.lua +++ /dev/null @@ -1,56 +0,0 @@ --- RunMaterialParamEdit.lua by Egaltech s.r.l. 2022/04/09 --- Gestione edit parametri materiali per Stampa 3d - --- Tabella per definizione modulo -local RunMaterialParamEdit = {} - --- Intestazioni -require( 'EgtBase') - -EgtOutLog( ' RunMaterialParamEdit started', 1) - --- Costanti generali -local AMD = require( 'AddManData') - ---------------------------------------------------------------------- -function RunMaterialParamEdit.Exec() - -- recupero cartella dei materiali - local sCalcBaseDir = EgtGetStringFromIni( '3dPrinting', 'BaseDir', 'C:\\ProgramData\\Egaltech\\EgtCam5\\3dPrinting', EgtGetIniFile()) - local sMaterialDirPath = sCalcBaseDir .. '\\Materials\\' - - -- recupero elenco file dei materiali - local Files = EgtFindAllFiles( sMaterialDirPath..'*.csv') - if not Files then - EgtOutBox( 'Material files not found', 'Error', 'ERROR') - return - end - local sMaterials = '' - for i = 1, #Files do - local sDir, sFile, sExt = EgtSplitPath( Files[i]) - if sMaterials ~= "" then - sMaterials = sMaterials .. ',' - end - sMaterials = sMaterials .. sFile - end - - -- chiedo quale file aprire - MaterialValues = EgtDialogBox( 'Materials edit', { 'Material', 'CB:' .. sMaterials}) - if not MaterialValues or #MaterialValues < 1 then return end - - -- verifico esistenza file - local sSelMaterialPath = sMaterialDirPath .. MaterialValues[1] .. '.csv' - if not EgtExistsFile( sSelMaterialPath) then - EgtOutBox( 'Material file not found', 'Error', 'ERROR') - return - end - - -- apro programma di edit - local sEditProgPath = EgtGetStringFromIni( '3dPrinting', RESULT_READ_PROG, "", EgtGetIniFile()) - if not sEditProgPath or not EgtWinExec( '"'..sEditProgPath..'" "'..sSelMaterialPath..'"') then - EgtOutBox( 'Impossible opening software to show Material. You can find them it in ' .. sSelMaterialPath, 'Error', 'ERROR') - end - -end - ---------------------------------------------------------------------- -return RunMaterialParamEdit diff --git a/LuaLibs/RunPartPositioning.lua b/LuaLibs/RunPartPositioning.lua deleted file mode 100644 index 14ffef8..0000000 --- a/LuaLibs/RunPartPositioning.lua +++ /dev/null @@ -1,209 +0,0 @@ --- RunPartPositioning.lua by Egaltech s.r.l. 2022/08/29 --- Gestione calcolo disposizione e lavorazioni per stampa 3d --- 2022/03/21 Creazione file - --- Tabella per definizione modulo -local RunPartPositioning = {} - --- Intestazioni -require( 'EgtBase') - -EgtOutLog( ' RunPartPositioning started', 1) - --- Costanti generali -local AMD = require( 'AddManData') - ---------------------------------------------------------------------- -function RunPartPositioning.Exec() - -- Verifico che la macchina corrente sia adatta alla stampa 3d - local sMachIni = EgtGetCurrMachineDir() .. '\\' .. EgtGetCurrMachineName() .. '.ini' - local sMachMaterial = EgtGetStringFromIni( 'General', 'Material', '', sMachIni) - if sMachMaterial ~= 'Additive' then - EgtOutBox( 'Current machine unsuitable for additive manufacturing', 'Warning', 'WARNING') - return - end - -- Recupero ultimo oggetto selezionato - local nSolidId = EgtGetLastSelectedObj() - local nLayerId = EgtGetParent( nSolidId) - local nPartId = EgtGetParent( nLayerId) - -- Verifico sia in un pezzo valido - if nPartId then - if EgtIsPart( nPartId) then - local sName = EgtGetName( nPartId) - if sName == TABLE then - EgtOutBox( 'No selected part. Please select a part before moving it on the table.', 'Warning', 'WARNING') - return - end - local sLayer = EgtGetName( nLayerId) - if sLayer == LAY_RIBS or sLayer == LAY_AUX_SOLIDS or sLayer == LAY_SHELL_NBR then - EgtOutBox( 'No selected solid. Please select a solid before moving it on the table.', 'Warning', 'WARNING') - return - end - else - EgtOutBox( 'No selected part. Please select a part before moving it on the table.', 'Warning', 'WARNING') - return - end - else - EgtOutBox( 'No selected part. Please select a part before moving it on the table.', 'Warning', 'WARNING') - return - end - - -- Assegno nome pezzo e layer - if not EgtGetName( nPartId) then - local nPartIndex = 1 - while EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) do - nPartIndex = nPartIndex + 1 - end - EgtSetName( nPartId, PART .. nPartIndex) - EgtSetName( nLayerId, PRINT_SOLID) - end - -- Recupero o creo layer ausiliario - local nAuxId = EgtGetFirstNameInGroup( nPartId, LAY_AUX) - if not nAuxId then - nAuxId = EgtGroup( nPartId) - EgtSetName( nAuxId, LAY_AUX) - else - EgtEmptyGroup( nAuxId) - end - - -- Rimuovo eventuale gruppo di lavoro - local nMchGrpId = EgtGetMachGroupId( '3dPrint') - EgtRemoveMachGroup( nMchGrpId or GDB_ID.NULL) - - -- Recupero dati tavola (creando gruppo di lavoro temporaneo) - local nQqqId = EgtAddMachGroup( 'qqq') - EgtSetTable( 'Tab') - local b3Tab = EgtGetTableArea() - dTabX = b3Tab:getDimX() - dTabY = b3Tab:getDimY() - EgtRemoveMachGroup( nQqqId or GDB_ID.NULL) - - -- Richiedo posizione origine e offset pezzo - local b3Solid = EgtGetBBoxGlob( nSolidId, GDB_BB.EXACT) - local b3Part = EgtGetBBoxGlob( nPartId, GDB_BB.EXACT) - local nRefX = 1 - local nRefY = 1 - local dPosX = b3Tab:getDimX() / 2 - b3Solid:getDimX() / 2 - local dPosY = b3Tab:getDimY() / 2 - b3Solid:getDimY() / 2 - local Positions = EgtDialogBox( 'Part position on table:', { 'Reference', 'CB:Left,Center,Right'}, - { '', 'CB:Bottom,Middle,Top'}, - { 'X', EgtNumToString( EgtToUiUnits( dPosX), 1)}, - { 'Y', EgtNumToString( EgtToUiUnits( dPosY), 1)}) - if not Positions then return end - dPosX = EgtFromUiUnits( tonumber( Positions[3])) - dPosY = EgtFromUiUnits( tonumber( Positions[4])) - if Positions[1] == 'Center' then - nRefX = 2 - dPosX = dPosX - b3Solid:getDimX() / 2 - elseif Positions[1] == 'Right' then - nRefX = 3 - dPosX = dPosX - b3Solid:getDimX() - end - if Positions[2] == 'Middle' then - nRefY = 2 - dPosY = dPosY - b3Solid:getDimY() / 2 - elseif Positions[2] == 'Top' then - nRefY = 3 - dPosY = dPosY - b3Solid:getDimY() - end - - -- Creo disegno tavola - local nTabPart = EgtGetFirstNameInGroup( GDB_ID.ROOT, TABLE) - EgtErase( nTabPart) - -- Disegno tavola - nTabPart = EgtGroup( GDB_ID.ROOT) - EgtSetMode( nTabPart, GDB_MD.LOCKED) - EgtSetLevel( nTabPart, GDB_LV.SYSTEM) - EgtSetName( nTabPart, TABLE) - local nTabLayer = EgtGroup( nTabPart) - EgtSetName( nTabLayer, TABLE) - local nTabOutlineId = EgtRectangle2P( nTabLayer, Point3d( 0, 0, 0), Point3d( dTabX, dTabY, 0)) - local nTabSurfId = EgtSurfFlatRegion( nTabLayer, nTabOutlineId) - EgtSetColor( nTabSurfId, 'GRAY') - EgtSetAlpha( nTabSurfId, 70) - - -- Aggiungo il box del solido - local nBoxId = EgtSurfTmBBox( nAuxId, b3Solid, false, GDB_RT.GLOB) - - -- Posiziono il pezzo e aggiorno il suo box - local vtMove = Point3d( dPosX, dPosY, 0) - b3Solid:getMin() - EgtMove( nPartId, vtMove) - b3Solid:move( vtMove) - b3Part:move( vtMove) - - -- Creo il frame del pezzo - local ptOrig = b3Solid:getMin() - if nRefX == 2 then - ptOrig = ptOrig + b3Solid:getDimX() / 2 * X_AX() - elseif nRefX == 3 then - ptOrig = ptOrig + b3Solid:getDimX() * X_AX() - end - if nRefY == 2 then - ptOrig = ptOrig + b3Solid:getDimY() / 2 * Y_AX() - elseif nRefY == 3 then - ptOrig = ptOrig + b3Solid:getDimY() * Y_AX() - end - - -- Svuoto o creo layer per il frame - local nFrameLay = EgtGetFirstNameInGroup( nPartId, LAY_FRAME) - if not nFrameLay then - nFrameLay = EgtGroup( nPartId) - EgtSetName( nFrameLay, LAY_FRAME) - else - EgtEmptyGroup( nFrameLay) - end - - local frPart = Frame3d( ptOrig, Z_AX()) - nFrameId = EgtFrame( nFrameLay, frPart, GDB_RT.GLOB) - if nFrameId then - EgtSetName( nFrameId, FRAME_PART) - EgtSetMode( nFrameId, GDB_MD.LOCKED) - end - - -- Definisco e posiziono il grezzo sulla tavola - EgtAddMachGroup( '3dPrint') - EgtSetTable( 'Tab') - - local nRawId = EgtAddRawPartWithPart( nPartId, nBoxId, 0, Color3d( 128, 128, 128, 30)) - EgtMoveToCornerRawPart( nRawId, Point3d( dPosX, dPosY, 0), MCH_CR.BL) - - EgtResetCurrMachGroup() - - -- Recupero/creo gruppo per punti e curve di partenza - local nMachStartId = EgtGetFirstNameInGroup( nPartId, LAY_MACH_START) - if not nMachStartId then - nMachStartId = EgtGroup( nPartId) - EgtSetName( nMachStartId, LAY_MACH_START) - end - - local vStartId = EgtGetNameInGroup( nLayerId, START_GEOM) - if vStartId then - for j = 1, #vStartId do - EgtRelocateGlob( vStartId[j], nMachStartId) - EgtSetColor( vStartId[j], EgtStdColor( "RED")) - end - else - -- se non ci sono punti/curve di inizio definiti e non ve ne sono nemmeno nel gruppo, creo un punto - local vOldStart = EgtGetNameInGroup( nMachStartId, START_GEOM) - if not vOldStart then - local ptStart = b3Solid:getCenter() - 0.6 * b3Solid:getDimY() * Y_AX() - 0.5 * b3Solid:getDimZ() * Z_AX() - nPtStartId = EgtPoint( nMachStartId, ptStart, GDB_RT.GLOB) - EgtSetName( nPtStartId, START_GEOM) - EgtSetColor( nPtStartId, EgtStdColor( "RED")) - end - end - - -- Dichiaro pezzo posizionato - EgtSetInfo( nPartId, KEY_PART_ON_TABLE, 1) - - -- Deseleziono tutto - EgtDeselectAll() - - EgtSetView( SCE_VD.ISO_SW, false) - EgtZoom( SCE_ZM.ALL) - - EgtOutLog( ' +++ RunPartPositioning completed') -end - ---------------------------------------------------------------------- -return RunPartPositioning diff --git a/LuaLibs/RunShowManager.lua b/LuaLibs/RunShowManager.lua deleted file mode 100644 index 8c19016..0000000 --- a/LuaLibs/RunShowManager.lua +++ /dev/null @@ -1,138 +0,0 @@ --- RunShowManager.lua by Egaltech s.r.l. 2022/09/15 --- Gestione visualizzazione per Stampa 3d - --- Tabella per definizione modulo -local RunShowManager = {} - --- Intestazioni -require( 'EgtBase') - -EgtOutLog( ' RunShowManager started', 1) - --- Costanti generali -local AMD = require( 'AddManData') - --- Librerie -_G.package.loaded.RunCalcSolids = nil -local CSOLIDS = require( 'RunCalcSolids') - ---------------------------------------------------------------------- -local function ShowImportedSolid( nPartId, bShow) - local nSolidLayId = EgtGetFirstNameInGroup( nPartId, PRINT_SOLID) - EgtSetStatus( nSolidLayId or GDB_ID.NULL, EgtIf( bShow, GDB_ST.ON, GDB_ST.OFF)) - local nRibsLayId = EgtGetFirstNameInGroup( nPartId, LAY_RIBS) - EgtSetStatus( nRibsLayId or GDB_ID.NULL, EgtIf( bShow, GDB_ST.ON, GDB_ST.OFF)) - local nShellNbrLay = EgtGetFirstNameInGroup( nPartId, LAY_SHELL_NBR) - EgtSetStatus( nShellNbrLay or GDB_ID.NULL, EgtIf( bShow, GDB_ST.ON, GDB_ST.OFF)) - local nAuxSolidsLay = EgtGetFirstNameInGroup( nPartId, LAY_AUX_SOLIDS) - EgtSetStatus( nAuxSolidsLay or GDB_ID.NULL, EgtIf( bShow, GDB_ST.ON, GDB_ST.OFF)) -end - ---------------------------------------------------------------------- -function RunShowManager.Exec() - -- Verifico esistenza gruppo stato visualizzazione progetto - local nViewId = EgtGetFirstNameInGroup( GDB_ID.ROOT, VIEWPARAMS) - local bImportedSolid = false - local bOuterCrv = false - local bPath = false - local bSolid = false - local bToolPath = false - - if not nViewId then - nViewId = EgtGroup( GDB_ID.ROOT) - EgtSetName( nViewId, VIEWPARAMS) - EgtSetLevel( nViewId, GDB_LV.SYSTEM) - else - bImportedSolid = EgtGetInfo( nViewId, IMPORTED_SOLID, 'b') - bOuterCrv = EgtGetInfo( nViewId, OUTER_CRV, 'b') - bPath = EgtGetInfo( nViewId, PATH_GRP, 'b') - bSolid = EgtGetInfo( nViewId, SOLID_GRP, 'b') - bToolPath = EgtGetInfo( nViewId, TOOLPATH_GRP, 'b') - end - - local bCurrImportedSolid = bImportedSolid - local bCurrOuterCrv = bOuterCrv - local bCurrPath = bPath - local bCurrSolid = bSolid - local bCurrToolPath = bToolPath - - if EgtGetUserLevel() == 1 then - local ViewValues = EgtDialogBox( 'Show Manager', { 'Imported Solid', 'CK:' .. EgtIf( bImportedSolid, '1', '0')}, - { 'Solid', 'CK:' .. EgtIf( bSolid, '1', '0')}, - { 'ToolPath', 'CK:' .. EgtIf( bToolPath, '1', '0')}) - if not ViewValues or #ViewValues < 3 then return end - bCurrImportedSolid = ( ViewValues[1] == '1') - bCurrSolid = ( ViewValues[2] == '1') - bCurrToolPath = ( ViewValues[3] == '1') - else - local ViewValues = EgtDialogBox( 'Show Manager', { 'Imported Solid', 'CK:' .. EgtIf( bImportedSolid, '1', '0')}, - { 'OuterCrv', 'CK:' .. EgtIf( bOuterCrv, '1', '0')}, - { 'Path', 'CK:' .. EgtIf( bPath, '1', '0')}, - { 'Solid', 'CK:' .. EgtIf( bSolid, '1', '0')}, - { 'ToolPath', 'CK:' .. EgtIf( bToolPath, '1', '0')}) - if not ViewValues or #ViewValues < 5 then return end - bCurrImportedSolid = ( ViewValues[1] == '1') - bCurrOuterCrv = ( ViewValues[2] == '1') - bCurrPath = ( ViewValues[3] == '1') - bCurrSolid = ( ViewValues[4] == '1') - bCurrToolPath = ( ViewValues[5] == '1') - end - - -- ciclo sui pezzi - local nPartIndex = 1 - local nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) - while nPartId do - -- eventuale calcolo dei solidi - local bHasSolids = EgtGetInfo( nPartId, KEY_HAS_SOLIDS, 'b') or false - if not bHasSolids and bCurrSolid then - EgtSetInfo( nPartId, KEY_CALC_SOLIDS, true) - CSOLIDS.Exec() - end - - if bImportedSolid ~= bCurrImportedSolid then - ShowImportedSolid( nPartId, bCurrImportedSolid) - end - -- ciclo sui layer per dis/attivare il resto - local nLayerIndex = 1 - local nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex) - while nLayerId do - local nCrvId = EgtGetFirstGroupInGroup( nLayerId) - while nCrvId do - if bOuterCrv ~= bCurrOuterCrv then - local nOuterCrvId = EgtGetFirstNameInGroup( nCrvId, OUTER_CRV) - EgtSetStatus( nOuterCrvId or GDB_ID.NULL, EgtIf( bCurrOuterCrv, GDB_ST.ON, GDB_ST.OFF)) - end - if bPath ~= bCurrPath then - local nPathId = EgtGetFirstNameInGroup( nCrvId, PATH_GRP) - EgtSetStatus( nPathId or GDB_ID.NULL, EgtIf( bCurrPath, GDB_ST.ON, GDB_ST.OFF)) - end - if bSolid ~= bCurrSolid then - local nSolidId = EgtGetFirstNameInGroup( nCrvId, SOLID_GRP) - EgtSetStatus( nSolidId or GDB_ID.NULL, EgtIf( bCurrSolid, GDB_ST.ON, GDB_ST.OFF)) - end - if bToolPath ~= bCurrToolPath then - local nToolPathId = EgtGetFirstNameInGroup( nCrvId, TOOLPATH_GRP) - EgtSetStatus( nToolPathId or GDB_ID.NULL, EgtIf( bCurrToolPath, GDB_ST.ON, GDB_ST.OFF)) - end - nCrvId = EgtGetNext( nCrvId) - end - nLayerIndex = nLayerIndex + 1 - nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex) - end - nPartIndex = nPartIndex + 1 - nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) - end - - -- riporto impostazioni in gruppo apposito - EgtSetInfo( nViewId, IMPORTED_SOLID, bCurrImportedSolid) - EgtSetInfo( nViewId, OUTER_CRV, bCurrOuterCrv) - EgtSetInfo( nViewId, PATH_GRP, bCurrPath) - EgtSetInfo( nViewId, SOLID_GRP, bCurrSolid) - EgtSetInfo( nViewId, TOOLPATH_GRP, bCurrToolPath) - - EgtDraw() - -end - ---------------------------------------------------------------------- -return RunShowManager diff --git a/LuaLibs/RunSliceAdvancement.lua b/LuaLibs/RunSliceAdvancement.lua deleted file mode 100644 index 9471ada..0000000 --- a/LuaLibs/RunSliceAdvancement.lua +++ /dev/null @@ -1,186 +0,0 @@ --- RunSliceAdvancement.lua by Egaltech s.r.l. 2022/06/28 --- Gestione visualizzazione per Stampa 3d - --- Tabella per definizione modulo -local RunSliceAdvancement = {} - --- Intestazioni -require( 'EgtBase') - -EgtOutLog( ' RunSliceAdvancement started', 1) - --- Costanti generali -local AMD = require( 'AddManData') - --- Librerie -_G.package.loaded.RunCalcSolids = nil -local CSOLIDS = require( 'RunCalcSolids') - ---------------------------------------------------------------------- -local function ManageSegmentVisibility( SegmentList, nLastActiveIndex, ToHideList) - for Index = 1, #SegmentList do - EgtSetStatus( SegmentList[Index], EgtIf( Index <= nLastActiveIndex, GDB_ST.ON, GDB_ST.OFF)) - end - if ToHideList and #ToHideList > 0 then - for Index = 1, #ToHideList do - EgtSetStatus( ToHideList[Index], GDB_ST.OFF) - end - end -end - ---------------------------------------------------------------------- -local function CalcType( nEntId, nOldType) - local nType = EgtGetInfo( nEntId, KEY_TYPE, 'i') - if not nType or nType == TYPE.LINK or nType == TYPE.COASTING or nType == TYPE.WIPE then - nType = nOldType - end - if nType == TYPE.RIB or nType == TYPE.AUX_SOLID then - nType = TYPE.INFILL - end - if nType == TYPE.EXTRA_SHELL then - nType = TYPE.INNER_SHELL - end - return nType -end - ---------------------------------------------------------------------- -function RunSliceAdvancement.Exec() - -- verifico ci sia almeno uno slice - local nFirstPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. 1) - if not nFirstPartId then - EgtOutBox( 'No sliced part in this project!', 'Error', 'ERROR') - return - else - local nLayerId = EgtGetFirstNameInGroup( nFirstPartId, SLICE_LAYER .. 1) or EgtGetFirstNameInGroup( nFirstPartId, "__" .. SLICE_LAYER .. 1) - if not nLayerId then - EgtOutBox( 'No sliced part in this project!', 'Error', 'ERROR') - return - end - end - local nAdvancementType = 1 -- 1 = All, 2 = Only Outer, 3 = Only Inner, 4 = Only Infill - local nPercentage = 30 - -- leggo ultimi valori - local nViewId = EgtGetFirstNameInGroup( GDB_ID.ROOT, VIEWPARAMS) - if nViewId then - nAdvancementType = EgtGetInfo( nViewId, KEY_SLICE_ADV_MODE, 'i') or SLICE_ADV_TYPE.ALL - nPercentage = EgtGetInfo( nViewId, KEY_SLICE_ADV_PERC, 'i') or 30 - end - local sAdvTypeCombo = '' - if nAdvancementType == SLICE_ADV_TYPE.ALL then - sAdvTypeCombo = 'CB:*All,Only Outer,Only Inner,Only Infill' - elseif nAdvancementType == SLICE_ADV_TYPE.OUTER then - sAdvTypeCombo = 'CB:All,*Only Outer,Only Inner,Only Infill' - elseif nAdvancementType == SLICE_ADV_TYPE.INNER then - sAdvTypeCombo = 'CB:All,Only Outer,*Only Inner,Only Infill' - elseif nAdvancementType == SLICE_ADV_TYPE.INFILL then - sAdvTypeCombo = 'CB:All,Only Outer,Only Inner,*Only Infill' - end - ViewValues = EgtDialogBox( 'Slice advancement', { 'Type', sAdvTypeCombo}, - { 'Percentage (0-100)', tostring( nPercentage)}) - if not ViewValues or #ViewValues < 1 then return end - - if ViewValues[1] == 'All' then - nAdvancementType = SLICE_ADV_TYPE.ALL - elseif ViewValues[1] == 'Only Outer' then - nAdvancementType = SLICE_ADV_TYPE.OUTER - elseif ViewValues[1] == 'Only Inner' then - nAdvancementType = SLICE_ADV_TYPE.INNER - elseif ViewValues[1] == 'Only Infill' then - nAdvancementType = SLICE_ADV_TYPE.INFILL - end - nPercentage = tonumber( ViewValues[2]) - - -- ciclo sui pezzi - local nPartIndex = 1 - local nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) - while nPartId do - - -- eventuale calcolo dei solidi - local bHasSolids = EgtGetInfo( nPartId, KEY_HAS_SOLIDS, 'b') or false - if not bHasSolids then - EgtSetInfo( nPartId, KEY_CALC_SOLIDS, true) - CSOLIDS.Exec() - end - - local nPrintOrder = EgtGetInfo( nPartId, KEY_STRAND_ORDER, 'i') - -- ciclo sui layer per dis/attivare il resto - local nLayerIndex = 1 - local nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex) - while nLayerId do - local nCrvId = EgtGetFirstGroupInGroup( nLayerId) - while nCrvId do - local nSolidId = EgtGetFirstNameInGroup( nCrvId, SOLID_GRP) - local ShellList = { {}, {}, {}} - local nSurfId = EgtGetFirstInGroup( nSolidId) - local nOldType = TYPE.OUTER_SHELL - while nSurfId do - local nType = CalcType( nSurfId, nOldType) - nOldType = nType - table.insert( ShellList[nType], nSurfId) - nSurfId = EgtGetNext( nSurfId) - end - local nSegmentQty = 1 - local SegmentList - local ToHideList - if nAdvancementType == SLICE_ADV_TYPE.ALL then - nSegmentQty = #ShellList[1] + #ShellList[2] + #ShellList[3] - if nPrintOrder == PRINT_ORDER.EXT_INT then - SegmentList = ShellList[1] - for i = 1, #ShellList[2] do - SegmentList[#SegmentList + 1] = ShellList[2][i] - end - for i = 1, #ShellList[3] do - SegmentList[#SegmentList + 1] = ShellList[3][i] - end - else - SegmentList = ShellList[3] - for i = 1, #ShellList[2] do - SegmentList[#SegmentList + 1] = ShellList[2][i] - end - for i = 1, #ShellList[1] do - SegmentList[#SegmentList + 1] = ShellList[1][i] - end - end - elseif nAdvancementType == SLICE_ADV_TYPE.OUTER then - nSegmentQty = #ShellList[1] - SegmentList = ShellList[1] - ToHideList = ShellList[2] - for i = 1, #ShellList[3] do - ToHideList[#ToHideList + 1] = ShellList[3][i] - end - elseif nAdvancementType == SLICE_ADV_TYPE.INNER then - nSegmentQty = #ShellList[2] - SegmentList = ShellList[2] - ToHideList = ShellList[1] - for i = 1, #ShellList[3] do - ToHideList[#ToHideList + 1] = ShellList[3][i] - end - elseif nAdvancementType == SLICE_ADV_TYPE.INFILL then - nSegmentQty = #ShellList[3] - SegmentList = ShellList[3] - ToHideList = ShellList[1] - for i = 1, #ShellList[2] do - ToHideList[#ToHideList + 1] = ShellList[2][i] - end - end - local nLastActiveIndex = ceil( nSegmentQty * nPercentage / 100) - ManageSegmentVisibility( SegmentList, nLastActiveIndex, ToHideList) - nCrvId = EgtGetNext( nCrvId) - end - nLayerIndex = nLayerIndex + 1 - nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex) - end - nPartIndex = nPartIndex + 1 - nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) - end - - -- riporto impostazioni in gruppo apposito - EgtSetInfo( nViewId, KEY_SLICE_ADV_MODE, nAdvancementType) - EgtSetInfo( nViewId, KEY_SLICE_ADV_PERC, nPercentage) - - EgtDraw() - -end - ---------------------------------------------------------------------- -return RunSliceAdvancement diff --git a/LuaLibs/RunSlicePalette.lua b/LuaLibs/RunSlicePalette.lua deleted file mode 100644 index b3b2bab..0000000 --- a/LuaLibs/RunSlicePalette.lua +++ /dev/null @@ -1,113 +0,0 @@ --- RunSlicePalette.lua by Egaltech s.r.l. 2022/08/23 --- Gestione visualizzazione per Stampa 3d - --- Tabella per definizione modulo -local RunSlicePalette = {} - --- Intestazioni -require( 'EgtBase') - -EgtOutLog( ' RunSlicePalette started', 1) - --- Costanti generali -local AMD = require( 'AddManData') - --- Librerie -_G.package.loaded.RunCalcSolids = nil -local CSOLIDS = require( 'RunCalcSolids') - ---------------------------------------------------------------------- -function RunSlicePalette.UpdateColors( nPaletteType) - -- ciclo sui pezzi - local nPartIndex = 1 - local nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) - while nPartId do - -- eventuale calcolo dei solidi - local bHasSolids = EgtGetInfo( nPartId, KEY_HAS_SOLIDS, 'b') or false - if not bHasSolids then - EgtSetInfo( nPartId, KEY_CALC_SOLIDS, true) - CSOLIDS.Exec() - end - - -- ciclo sui layer per dis/attivare il resto - local nLayerIndex = 1 - local nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) - while nLayerId do - local nCrvId = EgtGetFirstGroupInGroup( nLayerId) - while nCrvId do - local nSolidId = EgtGetFirstNameInGroup( nCrvId, SOLID_GRP) - local nSurfId = EgtGetFirstInGroup( nSolidId) - local nOldType = 0 - while nSurfId do - local Color = EgtStdColor( 'GRAY') - if nPaletteType == PALETTE_TYPE.IN_OUT then - local nType = EgtGetInfo( nSurfId, KEY_TYPE, 'i') - if not nType or nType < TYPE.OUTER_SHELL or nType > TYPE.AUX_SOLID then nType = nOldType end - nOldType = nType - -- scelta del colore - if nType == TYPE.OUTER_SHELL or nType == TYPE.EXTRA_OUTER_SHELL then - Color = EgtStdColor( 'TEAL') - elseif nType == TYPE.INNER_SHELL or nType == TYPE.EXTRA_SHELL then - Color = EgtStdColor( 'ORANGE') - elseif nType == TYPE.INFILL then - Color = EgtStdColor( 'YELLOW') - elseif nType == TYPE.LINK then - Color = EgtStdColor( 'GRAY') - elseif nType == TYPE.COASTING then - Color = EgtStdColor( 'BLUE') - elseif nType == TYPE.WIPE then - Color = EgtStdColor( 'LIME') - elseif nType == TYPE.RIB then - Color = EgtStdColor( 'OLIVE') - elseif nType == TYPE.AUX_SOLID then - Color = EgtStdColor( 'AQUA') - end - else - local nResult = EgtGetInfo( nLayerId, KEY_RESULT, 'i') - if nResult == RESULT.OK then - Color = EgtStdColor( 'GREEN') - elseif nResult == RESULT.KO_MINUS then - Color = EgtStdColor( 'ORANGE') - elseif nResult == RESULT.KO_PLUS then - Color = EgtStdColor( 'RED') - end - end - EgtSetColor( nSurfId, Color) - nSurfId = EgtGetNext( nSurfId) - end - nCrvId = EgtGetNext( nCrvId) - end - nLayerIndex = nLayerIndex + 1 - nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) - end - nPartIndex = nPartIndex + 1 - nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) - end - - EgtDraw() - -end - ---------------------------------------------------------------------- -function RunSlicePalette.Exec() - - local nViewId = EgtGetFirstNameInGroup( GDB_ID.ROOT, VIEWPARAMS) or GDB_ID.NULL - - local nOldPaletteType = EgtGetInfo( nViewId, KEY_PALETTE, 'i') - local sCombo = EgtIf( not nOldPaletteType or nOldPaletteType == 1, 'CB:*In/Out,Results', 'CB:In/Out,*Results') - ViewValues = EgtDialogBox( 'Slice Palette', { 'Type', sCombo}) - if not ViewValues or #ViewValues < 1 then return end - - local nPaletteType = PALETTE_TYPE.IN_OUT -- 1 = In/Out, 2 = Results - if ViewValues[1] == 'In/Out' then - nPaletteType = PALETTE_TYPE.IN_OUT - elseif ViewValues[1] == 'Results' then - nPaletteType = PALETTE_TYPE.RESULTS - end - EgtSetInfo( nViewId, KEY_PALETTE, nPaletteType) - - RunSlicePalette.UpdateColors( nPaletteType) -end - ---------------------------------------------------------------------- -return RunSlicePalette diff --git a/LuaLibs/RunViewManager.lua b/LuaLibs/RunViewManager.lua deleted file mode 100644 index fcb3110..0000000 --- a/LuaLibs/RunViewManager.lua +++ /dev/null @@ -1,195 +0,0 @@ --- RunViewManager.lua by Egaltech s.r.l. 2022/07/03 --- Gestione visualizzazione per Stampa 3d - --- Tabella per definizione modulo -local RunViewManager = {} - --- Intestazioni -require( 'EgtBase') - -EgtOutLog( ' RunViewManager started', 1) - --- Costanti generali -local AMD = require( 'AddManData') - ---------------------------------------------------------------------- -local function CalcShow( nShellView, nType) - if nShellView == SHELL_VIEW_TYPE.OUTER then - return ( nType == TYPE.OUTER_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) - elseif nShellView == SHELL_VIEW_TYPE.INNER then - return ( nType == TYPE.INNER_SHELL) - elseif nShellView == SHELL_VIEW_TYPE.INFILL then - return ( nType == TYPE.INFILL) - else --nShellView == SHELL_VIEW_TYPE.ALL - return true - end -end - ---------------------------------------------------------------------- -local function CalcType( nEntId, nOldType) - local nType = EgtGetInfo( nEntId, KEY_TYPE, 'i') - if not nType or nType == TYPE.LINK or nType == TYPE.COASTING or nType == TYPE.WIPE then - nType = nOldType - end - if nType == TYPE.RIB or nType == TYPE.AUX_SOLID then - nType = TYPE.INFILL - end - if nType == TYPE.EXTRA_SHELL then - nType = TYPE.INNER_SHELL - end - return nType -end - ---------------------------------------------------------------------- -function RunViewManager.Exec() - local nVisibilityMode = LAYER_VIEW_TYPE.ALL -- 1 = All, 2 = Till Selected, 3 = Only Selected, 4 = From Selected - local nShellType = SHELL_VIEW_TYPE.ALL -- 1 = All, 2 = Outer, 3 = Inner, 4 = infill - local nOldSelLayerId = GDB_ID.NULL - - -- leggo ultimi valori - local nViewId = EgtGetFirstNameInGroup( GDB_ID.ROOT, VIEWPARAMS) - if nViewId then - nVisibilityMode = EgtGetInfo( nViewId, KEY_LAYER_VIEW, 'i') - nShellType = EgtGetInfo( nViewId, KEY_SHELL_VIEW, 'i') - nOldSelLayerId = EgtGetInfo( nViewId, KEY_SEL_LAYER, 'i') or GDB_ID.NULL - end - local sLayerViewCombo = '' - if nVisibilityMode == LAYER_VIEW_TYPE.TILL_SEL then - sLayerViewCombo = 'CB:All,*Till Selected,Only Selected,From Selected' - elseif nVisibilityMode == LAYER_VIEW_TYPE.ONLY_SEL then - sLayerViewCombo = 'CB:All,Till Selected,*Only Selected,From Selected' - elseif nVisibilityMode == LAYER_VIEW_TYPE.FROM_SEL then - sLayerViewCombo = 'CB:All,Till Selected,Only Selected,*From Selected' - else - sLayerViewCombo = 'CB:*All,Till Selected,Only Selected,From Selected' - end - local sShellViewCombo = '' - if nShellType == SHELL_VIEW_TYPE.OUTER then - sShellViewCombo = 'CB:All,*Outer,Inner,Infill' - elseif nShellType == SHELL_VIEW_TYPE.INNER then - sShellViewCombo = 'CB:All,Outer,*Inner,Infill' - elseif nShellType == SHELL_VIEW_TYPE.INFILL then - sShellViewCombo = 'CB:All,Outer,Inner,*Infill' - else - sShellViewCombo = 'CB:*All,Outer,Inner,Infill' - end - - ViewValues = EgtDialogBox( 'Slicing visibility manager', { 'Visibility Mode', sLayerViewCombo}, - { 'Shell type', sShellViewCombo}) - if not ViewValues or #ViewValues < 2 then return end - - if ViewValues[1] == 'All' then - nVisibilityMode = LAYER_VIEW_TYPE.ALL - elseif ViewValues[1] == 'Till Selected' then - nVisibilityMode = LAYER_VIEW_TYPE.TILL_SEL - elseif ViewValues[1] == 'Only Selected' then - nVisibilityMode = LAYER_VIEW_TYPE.ONLY_SEL - elseif ViewValues[1] == 'From Selected' then - nVisibilityMode = LAYER_VIEW_TYPE.FROM_SEL - end - if ViewValues[2] == 'All' then - nShellType = SHELL_VIEW_TYPE.ALL - elseif ViewValues[2] == 'Outer' then - nShellType = SHELL_VIEW_TYPE.OUTER - elseif ViewValues[2] == 'Inner' then - nShellType = SHELL_VIEW_TYPE.INNER - elseif ViewValues[2] == 'Infill' then - nShellType = SHELL_VIEW_TYPE.INFILL - end - - -- Recupero ultimo layer selezionato - -- verifico sia un pezzo valido - local sSelLayerName = '' - local bFound = false - local nSelLayerId = EgtGetLastSelectedObj() - while nSelLayerId do - local sSelLayerName = EgtGetName( nSelLayerId) - if sSelLayerName and ( sSelLayerName:sub(1, 5) == SLICE_LAYER or sSelLayerName:sub(3, 7) == SLICE_LAYER) then - bFound = true - break - end - nSelLayerId = EgtGetParent( nSelLayerId) - end - if not bFound then - if nOldSelLayerId and nOldSelLayerId ~= GDB_ID.NULL then - nSelLayerId = nOldSelLayerId - else - if nVisibilityMode ~= LAYER_VIEW_TYPE.ALL then - EgtOutBox( 'No selected element!', 'Warning', 'WARNING') - return - else - nSelLayerId = GDB_ID.NULL - sSelLayerName = '' - end - end - end - - -- ciclo sui pezzi - local nPartIndex = 1 - local nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) - while nPartId do - -- ciclo sui layer per dis/attivare il resto - local nLayerIndex = 1 - local nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex) - while nLayerId do - if nVisibilityMode == LAYER_VIEW_TYPE.ALL then - EgtSetStatus( nLayerId, GDB_ST.ON) - elseif nVisibilityMode == LAYER_VIEW_TYPE.TILL_SEL then - EgtSetStatus( nLayerId, EgtIf( nLayerId <= nSelLayerId, GDB_ST.ON, GDB_ST.OFF)) - elseif nVisibilityMode == LAYER_VIEW_TYPE.ONLY_SEL then - EgtSetStatus( nLayerId, EgtIf( nLayerId == nSelLayerId, GDB_ST.ON, GDB_ST.OFF)) - elseif nVisibilityMode == LAYER_VIEW_TYPE.FROM_SEL then - EgtSetStatus( nLayerId, EgtIf( nLayerId >= nSelLayerId, GDB_ST.ON, GDB_ST.OFF)) - end - local nCrvId = EgtGetFirstGroupInGroup( nLayerId) - while nCrvId do - ---- - local nOldType = TYPE.OUTER_SHELL - local nPathId = EgtGetFirstNameInGroup( nCrvId, PATH_GRP) - local nShellId = EgtGetFirstInGroup( nPathId) - while nShellId do - local nType = CalcType( nShellId, nOldType) - nOldType = nType - EgtSetStatus( nShellId, EgtIf( CalcShow( nShellType, nType), GDB_ST.ON, GDB_ST.OFF)) - nShellId = EgtGetNext( nShellId) - end - ---- - nOldType = TYPE.OUTER_SHELL - local nSolidId = EgtGetFirstNameInGroup( nCrvId, SOLID_GRP) - local nSurfId = EgtGetFirstInGroup( nSolidId) - while nSurfId do - local nType = CalcType( nSurfId, nOldType) - nOldType = nType - EgtSetStatus( nSurfId, EgtIf( CalcShow( nShellType, nType), GDB_ST.ON, GDB_ST.OFF)) - nSurfId = EgtGetNext( nSurfId) - end - ---- - nOldType = TYPE.OUTER_SHELL - local nToolPathId = EgtGetFirstNameInGroup( nCrvId, TOOLPATH_GRP) - nShellId = EgtGetFirstInGroup( nToolPathId) - while nShellId do - local nType = CalcType( nShellId, nOldType) - nOldType = nType - EgtSetStatus( nShellId, EgtIf( CalcShow( nShellType, nType), GDB_ST.ON, GDB_ST.OFF)) - nShellId = EgtGetNext( nShellId) - end - nCrvId = EgtGetNext( nCrvId) - end - nLayerIndex = nLayerIndex + 1 - nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex) - end - nPartIndex = nPartIndex + 1 - nPartId = EgtGetFirstNameInGroup( GDB_ID.ROOT, PART .. nPartIndex) - end - - -- riporto impostazioni in gruppo apposito - EgtSetInfo( nViewId, KEY_LAYER_VIEW, nVisibilityMode) - EgtSetInfo( nViewId, KEY_SHELL_VIEW, nShellType) - EgtSetInfo( nViewId, KEY_SEL_LAYER, nSelLayerId) - - EgtDraw() - -end - ---------------------------------------------------------------------- -return RunViewManager diff --git a/MachiningParamCalc.lua b/MachiningParamCalc.lua deleted file mode 100644 index 42ec772..0000000 --- a/MachiningParamCalc.lua +++ /dev/null @@ -1,18 +0,0 @@ --- MachiningParamCalc.lua by Egaltech s.r.l. 2022/04/05 --- Gestione visualizzazione per Stampa 3d - --- Intestazioni -require( 'EgtBase') -_ENV = EgtProtectGlobal() -EgtEnableDebug( false) - --- Imposto direttorio libreria specializzata per Stampa 3d -local sBaseDir = EgtGetSourceDir() -EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') - --- Librerie -_G.package.loaded.RunMachiningParamCalc = nil -local RMPC = require( 'RunMachiningParamCalc') - --- Calcolo -RMPC.Exec() diff --git a/MachiningParamEdit.lua b/MachiningParamEdit.lua deleted file mode 100644 index b66dc0d..0000000 --- a/MachiningParamEdit.lua +++ /dev/null @@ -1,18 +0,0 @@ --- MachiningParamCalc.lua by Egaltech s.r.l. 2022/04/05 --- Gestione visualizzazione per Stampa 3d - --- Intestazioni -require( 'EgtBase') -_ENV = EgtProtectGlobal() -EgtEnableDebug( false) - --- Imposto direttorio libreria specializzata per Stampa 3d -local sBaseDir = EgtGetSourceDir() -EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') - --- Librerie -_G.package.loaded.RunMachiningParamEdit = nil -local RMPE = require( 'RunMachiningParamEdit') - --- Calcolo -RMPE.Exec() diff --git a/MaterialParamEdit.lua b/MaterialParamEdit.lua deleted file mode 100644 index 6c39045..0000000 --- a/MaterialParamEdit.lua +++ /dev/null @@ -1,18 +0,0 @@ --- MachiningParamCalc.lua by Egaltech s.r.l. 2022/04/09 --- Gestione edit parametri materiali per Stampa 3d - --- Intestazioni -require( 'EgtBase') -_ENV = EgtProtectGlobal() -EgtEnableDebug( false) - --- Imposto direttorio libreria specializzata per Stampa 3d -local sBaseDir = EgtGetSourceDir() -EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') - --- Librerie -_G.package.loaded.RunMaterialParamEdit = nil -local RMPE = require( 'RunMaterialParamEdit') - --- Calcolo -RMPE.Exec() diff --git a/PartPositioning.lua b/PartPositioning.lua deleted file mode 100644 index 76a378e..0000000 --- a/PartPositioning.lua +++ /dev/null @@ -1,20 +0,0 @@ --- PlacePart.lua by Egaltech s.r.l. 2022/04/11 --- Gestione calcolo disposizione e lavorazioni per stampa 3d --- 2022/03/21 Creazione file - - --- Intestazioni -require( 'EgtBase') -_ENV = EgtProtectGlobal() -EgtEnableDebug( false) - --- Imposto direttorio libreria specializzata per Stampa 3d -local sBaseDir = EgtGetSourceDir() -EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') - --- Librerie -_G.package.loaded.RunPartPositioning = nil -local RPP = require( 'RunPartPositioning') - --- Calcolo -RPP.Exec() diff --git a/ShowManager.lua b/ShowManager.lua deleted file mode 100644 index 2509cc0..0000000 --- a/ShowManager.lua +++ /dev/null @@ -1,18 +0,0 @@ --- ShowManager.lua by Egaltech s.r.l. 2022/04/05 --- Gestione visualizzazione per Stampa 3d - --- Intestazioni -require( 'EgtBase') -_ENV = EgtProtectGlobal() -EgtEnableDebug( false) - --- Imposto direttorio libreria specializzata per Stampa 3d -local sBaseDir = EgtGetSourceDir() -EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') - --- Librerie -_G.package.loaded.RunShowManager = nil -local RSM = require( 'RunShowManager') - --- Calcolo -RSM.Exec() diff --git a/SliceAdvancement.lua b/SliceAdvancement.lua deleted file mode 100644 index 54d95d1..0000000 --- a/SliceAdvancement.lua +++ /dev/null @@ -1,18 +0,0 @@ --- SliceAdvancement.lua by Egaltech s.r.l. 2022/04/05 --- Gestione visualizzazione per Stampa 3d - --- Intestazioni -require( 'EgtBase') -_ENV = EgtProtectGlobal() -EgtEnableDebug( false) - --- Imposto direttorio libreria specializzata per Stampa 3d -local sBaseDir = EgtGetSourceDir() -EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') - --- Librerie -_G.package.loaded.RunSliceAdvancement = nil -local RSA = require( 'RunSliceAdvancement') - --- Calcolo -RSA.Exec() diff --git a/SlicePalette.lua b/SlicePalette.lua deleted file mode 100644 index e47e78f..0000000 --- a/SlicePalette.lua +++ /dev/null @@ -1,18 +0,0 @@ --- SlicePalette.lua by Egaltech s.r.l. 2022/04/05 --- Gestione visualizzazione per Stampa 3d - --- Intestazioni -require( 'EgtBase') -_ENV = EgtProtectGlobal() -EgtEnableDebug( false) - --- Imposto direttorio libreria specializzata per Stampa 3d -local sBaseDir = EgtGetSourceDir() -EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') - --- Librerie -_G.package.loaded.RunSlicePalette = nil -local RSP = require( 'RunSlicePalette') - --- Calcolo -RSP.Exec() diff --git a/Slicing.lua b/Slicing.lua index 4248f09..4d1e223 100644 --- a/Slicing.lua +++ b/Slicing.lua @@ -1,4 +1,4 @@ --- Slicing.lua by Egaltech s.r.l. 2022/03/30 +-- Slicing.lua by Egaltech s.r.l. 2023/01/11 -- Calcoli prima fase per Stampa 3d -- Intestazioni @@ -7,8 +7,7 @@ _ENV = EgtProtectGlobal() EgtEnableDebug( false) -- Imposto direttorio libreria specializzata per Stampa 3d -local sBaseDir = EgtGetSourceDir() -EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') +EgtAddToPackagePath( PRINT.BASEDIR .. '\\LuaLibs\\?.lua') -- Librerie _G.package.loaded.RunSlicing = nil diff --git a/ViewManager.lua b/ViewManager.lua deleted file mode 100644 index 07d1b4b..0000000 --- a/ViewManager.lua +++ /dev/null @@ -1,18 +0,0 @@ --- ViewManager.lua by Egaltech s.r.l. 2022/04/05 --- Gestione visualizzazione per Stampa 3d - --- Intestazioni -require( 'EgtBase') -_ENV = EgtProtectGlobal() -EgtEnableDebug( false) - --- Imposto direttorio libreria specializzata per Stampa 3d -local sBaseDir = EgtGetSourceDir() -EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') - --- Librerie -_G.package.loaded.RunViewManager = nil -local RVM = require( 'RunViewManager') - --- Calcolo -RVM.Exec() diff --git a/bin/Images/.placeholder b/bin/Images/.placeholder deleted file mode 100644 index e69de29..0000000 From 7ff7e6e2e3c1c6a1c2eceefe1d57a2cd22b34c51 Mon Sep 17 00:00:00 2001 From: DarioS Date: Thu, 12 Jan 2023 09:31:11 +0100 Subject: [PATCH 58/79] 3dPrinting : - correzione a compilazione su git Push. --- .gitlab-ci.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7e3ace3..bdfef91 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,19 +13,18 @@ variables: .LuaCompile: &LuaCompile - | Set-Alias lua54 C:\Tools\Lua32\luac54 - echo "Copia file *.ini" - $FileList = Get-ChildItem("*.ini") + echo "Copia file *.bat" + $FileList = Get-ChildItem("*.bat") ForEach ($File in $FileList) { $FileName = Split-Path $File -leaf Copy-Item -Path $FileName -Destination bin\$FileName echo "Copy-Item -Path $FileName -Destination bin\$FileName" } - echo "Copia file *.lua" $FileList = Get-ChildItem("*.lua") ForEach ($File in $FileList) { $FileName = Split-Path $File -leaf - Copy-Item -Path $FileName -Destination bin\$FileName - echo "Copy-Item -Path $FileName -Destination bin\$FileName" + lua54 -o bin\$FileName $FileName + echo "lua54 -o bin\$FileName $FileName" } $FileList = Get-ChildItem("LuaLibs\*.lua") ForEach ($File in $FileList) { From 98e69f098d5982c6737738c7bb05f5431323b384 Mon Sep 17 00:00:00 2001 From: DarioS Date: Thu, 12 Jan 2023 09:33:13 +0100 Subject: [PATCH 59/79] 3dPrinting : - altra correzione a compilazione su git Push. --- .gitlab-ci.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bdfef91..2024050 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,13 +13,6 @@ variables: .LuaCompile: &LuaCompile - | Set-Alias lua54 C:\Tools\Lua32\luac54 - echo "Copia file *.bat" - $FileList = Get-ChildItem("*.bat") - ForEach ($File in $FileList) { - $FileName = Split-Path $File -leaf - Copy-Item -Path $FileName -Destination bin\$FileName - echo "Copy-Item -Path $FileName -Destination bin\$FileName" - } $FileList = Get-ChildItem("*.lua") ForEach ($File in $FileList) { $FileName = Split-Path $File -leaf From 550365322a08a0acd0318676f0901ef6097cf6ac Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 12 Jan 2023 17:43:06 +0100 Subject: [PATCH 60/79] 3dPrinting : - aggiunto StartPointOffsetOnLayer per setti chiusi. --- LuaLibs/CalcToolPath.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index c2b57eb..8795256 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -117,7 +117,7 @@ local function AddLink( vCrv, nTpathGrpId, nLinkType, dLinkParam, dSPOffs, dStra local sPrevName = EgtGetName( vCrv[i-1]) local sCurrName = EgtGetName( vCrv[i]) local nType = EgtGetInfo( vCrv[i], KEY_TYPE, 'i') - if sPrevName ~= sCurrName or nType == TYPE.INFILL or nType == TYPE.AUX_SOLID then + if sPrevName ~= sCurrName or nType == TYPE.INFILL or nType == TYPE.AUX_SOLID or nType == TYPE.RIB then k = k + 1 end @@ -1046,7 +1046,7 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) -- collego le passate di una stessa costolatura for i = 1, #tabRibs do if EgtCurveIsClosed( tabRibs[i][1]) then - -- AddLink( tabRibs[i], nTpathGrpId, LayerParams.nLinkType, LayerParams.dLinkParam, LayerParams.dSPOffs, LayerParams.dStrand, LayerParams.vtSlicing) + AddLink( tabRibs[i], nTpathGrpId, LINK_TYPE.NONE, LayerParams.dLinkParam, LayerParams.dSPOffs, LayerParams.dStrand, LayerParams.vtSlicing) else for j = 1, #tabRibs[i] - 1 do CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, true, LayerParams.vtSlicing, nGrpTmp) From ba1c7b765799a39fbd513e6a3d7beee38e860e76 Mon Sep 17 00:00:00 2001 From: DarioS Date: Thu, 26 Jan 2023 11:03:12 +0100 Subject: [PATCH 61/79] 3dPrinting : - corretta direzione estrusione dei Link nei setti. --- LuaLibs/CalcToolPath.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index c2b57eb..c500dba 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -597,6 +597,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlic EgtTrimCurveStartEndAtParam( nLinkId, dParS, dParE) EgtSetInfo( nLinkId, KEY_TYPE, TYPE.RIB) EgtSetName( nLinkId, LINK_CRV) + EgtModifyCurveExtrusion( nLinkId, vtSlicing, GDB_RT.GLOB) if bInvert then EgtInvertCurve( nLinkId) end -- verifico se è valido local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) From 303bc59ddd5abda19e204e36ee86e0c6fe38a994 Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 27 Jan 2023 16:14:59 +0100 Subject: [PATCH 62/79] 3dPrinting : - aggiunto controllo sulla direzione della normale delle superfici ottenute dallo slicing. --- LuaLibs/CalcSlices.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index eb12a26..60295bb 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -441,6 +441,11 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) local nSurfFR, nSrfNbr = EgtSurfFlatRegion( nLayId, vClosedId) if nSurfFR then + -- verifico orientamento della normale + local vtN = EgtSurfFrNormVersor( nSurfFR, GDB_ID.ROOT) + if AreOppositeVectorApprox( vtN, vtSlicing) then + EgtInvertSurf( nSurfFR) + end -- elimino le curve originali for i = 1, #vClosedId do EgtErase( vClosedId[i]) From ee59b4ac743d8b6109cb54e53a1982b7b401bcde Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 31 Jan 2023 15:35:08 +0100 Subject: [PATCH 63/79] 3dPrinting : - modifiche nei setti per conservare i link disegnati dall'utente ( prima versione) - aggiunti ingressi/uscite per setti che non iniziano/terminano su shell. --- LuaLibs/AddManData.lua | 22 +- LuaLibs/CalcPaths.lua | 870 +++++++++++++++++++++++++++------------ LuaLibs/CalcSlices.lua | 4 +- LuaLibs/CalcToolPath.lua | 139 +++---- LuaLibs/RunSlicing.lua | 2 +- 5 files changed, 675 insertions(+), 362 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index c52b758..20e2e12 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -28,6 +28,8 @@ LINK_CRV = "Link" FRAME_PART = "FramePart" START_GEOM = "Start" TOT_SHELL_TRIM_SURF = "TotalShellSurfForTrim" +TRIM_SURF_LOOP = "TrimSurfLoop" +SURF_LOOP = "SurfLoop" MIN_LEN = 0.1 MIN_AREA = 0.01 @@ -88,7 +90,6 @@ KEY_RIBS_SHELLS_NBR = "RibsStrandCount" KEY_RIBS_LINK = "RibsLink" KEY_RIBS_INVERT_DIR = "RibsInvertDirection" KEY_RIBS_INVERT_ORDER = "RibsInvertOrder" -KEY_RIBS_DO_LINK_FIRST = "RibsDoLinkFirst" KEY_RIBS_LEAD_IN_INVERT = "RibsLeadInInvert" KEY_RIBS_LEAD_IN_LEN = "RibsLeadInLen" KEY_RIBS_LEAD_OUT_INVERT = "RibsLeadOutInvert" @@ -96,11 +97,22 @@ KEY_RIBS_LEAD_OUT_LEN = "RibsLeadOutLen" KEY_RIBS_LEAD_OUT_COASTING = "RibsLeadOutCoasting" KEY_RIBS_LEAD_OUT_WIPE = "RibsLeadOutWipe" KEY_RIBS_LEAD_OUT_WIPE_DIR = "RibsLeadOutWipeDir" -KEY_RIBS_INTERS = "RibsHaveIntersections" -KEY_SPLIT_ORDER = "SplitOrder" -KEY_SPLIT_RIB = "SplitRib" -KEY_RIBS_TWO_STRANDS = "RibsHaveAll2Strands" KEY_RIBS_PRINT_ORDER = "RibsPrintOrder" +KEY_RIBS_INTERS = "RibsHaveIntersections" +KEY_RIBS_SPECIAL_CASE = "RibsSpecialCase" +KEY_SPLIT_ORDER = "SplitOrder" +KEY_SPLIT_AFTER_TRIM = "RibsSplitAfterTrim" +KEY_SPLIT_AFTER_TRIM_ORDER = "RibsSplitAfterTrimOrder" +KEY_SPLIT_AFTER_TRIM_TOT = "RibsSplitAfterTrimTot" +KEY_SPLIT_ID = "SplitId" +KEY_START_RIB = "StartRib" +KEY_ORIGINAL_RIB = "OriginalRib" +KEY_ORIGINAL_RIB_CLOSED = "OriginalRibClosed" +KEY_RIBS_USER_LINK = "RibWithUserLink" +KEY_RIBS_USER_LINK_CCW = "RibUserLinkCCW" +KEY_RIBS_USER_LINK_ORDER = "RibUserLinkOrder" +KEY_RIBS_USER_LINK_TOT = "RibsUserLinkParts" +KEY_RIBS_INVERT_STRAND_ORDER = "RibsInvertStrandOrder" -- Regioni con diverso numero di passate KEY_SHELL_NBR_DIFF = "ShellNbrDifference" diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 1277a93..e62a1df 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -32,7 +32,6 @@ local function GetLayerParamsForPathCalc() LayerParams.bPrintInvert = ( EgtGetInfo( s_nPartId, KEY_PRINT_DIRECTION, 'i') == PRINT_DIRECTION.CW) -- parametri costolature LayerParams.bRibsInvertOrder = EgtGetInfo( s_nPartId, KEY_RIBS_INVERT_ORDER, 'b') - LayerParams.bRibsDoLinkFirst = EgtGetInfo( s_nPartId, KEY_RIBS_DO_LINK_FIRST, 'b') or false LayerParams.vRibsPrintOrder = EgtGetInfo( s_nPartId, KEY_RIBS_PRINT_ORDER, 'vi') or {3, 1, 4, 2} -- parametri regioni con diverse passate LayerParams.dShellNbrCoasting = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_COASTING, 'd') @@ -55,6 +54,12 @@ local function CopyInfo( nSouId, nDestId, sInfo, sType) EgtSetInfo( nDestId, sInfo, info) end +-------------------------------------------------------------------------------------------- +local function UpdateInvertInfo( nId) + local bInvert = EgtGetInfo( nId, KEY_INVERTED_CRV, 'b') or false + EgtSetInfo( nId, KEY_INVERTED_CRV, not bInvert) +end + ---------------------------------------------------------------------- local function ComputeSurfOffset( nSrf, nGrpId, dOffs, vtSlicing) -- gruppo temporaneo locale @@ -341,7 +346,7 @@ local function ComputeOffsetInfill( nSrf, dStrand, vtSlicing, sName, nType, vPtS local vNewIds = GetPathsFromSurf( nSrfOffs, sName, nType, nGrp, vPtStart) if vNewIds then -- riordino - ReorderPath( vOldIds, vNewIds) + ReorderPath( vOldIds, vNewIds) -- verifico fattibilità local k = 1 while k <= #vNewIds do @@ -432,8 +437,223 @@ local function ComputeZigZagInfill( nSrf, dStrand, vtSlicing, sName, nType, vPtS end -------------------------------------------------------------------- +-------------------------------------------------------------------- --------------------------- RIBS ----------------------------------- +-------------------------------------------------------------------- +local function VerifyRibsHoles( vIds, dStrand) + + 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 + if dist( EgtEP( vIds[i-1]), EgtSP( vIds[i])) < dStrand + 10 * GEO.EPS_SMALL then + bAdd = true + -- unisco il secondo tratto al primo + EgtAddCurveCompoLine( vIds[i-1], EgtSP( vIds[i])) + EgtAddCurveCompoCurve( vIds[i-1], vIds[i]) + table.remove( vIds, i) -- rimuovo il setto dalla tabella + elseif dist( EgtSP( vIds[i-1]), EgtEP( vIds[i])) < dStrand + 10 * GEO.EPS_SMALL then + bAdd = true + -- unisco il primo tratto al secondo + EgtAddCurveCompoLine( vIds[i], EgtSP( vIds[i-1])) + 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 + end + end +end + +-------------------------------------------------------------------- +local function CheckRibUserLink( nCrv, nCnt, vtSlicing) + + -- se dal trim non ho ottenuto almeno due tratti, non si tratta di UserLink + if nCnt < 2 then return end + + -- stabilisco l'orientamento del link + local bCCW = false + -- costruisco la superficie "definita" dal setto + local nGrpTmp = EgtGroup( EgtGetParent( nCrv)) + local nSrfLoop = EgtCurveCompoFromPoints( nGrpTmp, {EgtEP( nCrv), EgtSP( nCrv + 1)}) + EgtAddCurveCompoLine( nSrfLoop, EgtSP( nCrv + 1) + 100 * EgtSV( nCrv + 1)) + EgtAddCurveCompoLine( nSrfLoop, EgtEP( nCrv) - 100 * EgtEV( nCrv)) + EgtCloseCurveCompo( nSrfLoop) + + local nSurf = EgtSurfFlatRegion( nGrpTmp, {nSrfLoop}) + if not nSurf then return end + -- verifico direzione della normale + local vtN = EgtSurfFrNormVersor( nSurf, GDB_ID.ROOT) + if AreSameVectorApprox( vtN, vtSlicing) then + bCCW = true + end + + -- setto le info + for i = 0, nCnt - 1 do + EgtSetInfo( nCrv + i, KEY_RIBS_USER_LINK, 1) + EgtSetInfo( nCrv + i, KEY_RIBS_USER_LINK_CCW, bCCW) + EgtSetInfo( nCrv + i, KEY_RIBS_USER_LINK_ORDER, i) + EgtSetInfo( nCrv + i, KEY_RIBS_USER_LINK_TOT, nCnt) + end + + EgtErase( nGrpTmp) + +end + +------------------------------------------------------------------- +local function TrimRibs( vRibs, nRibsGrp, nSrf, dSrfOffs, vtSlicing) + + -- costruisco le superfici con cui fare il trim grossolano dei setti + EgtCopyGlob( nSrf, nRibsGrp) + local nSrfInt = EgtCopyGlob( nSrf, nRibsGrp) + local nSrfExt = EgtCopyGlob( nSrf, nRibsGrp) + EgtSurfFrOffset( nSrfInt, dSrfOffs) + EgtSurfFrOffset( nSrfExt, - dSrfOffs) + + -- trim dei setti + local nTrimmedRibsGrp = EgtGroup( nRibsGrp) + for i = 1, #vRibs do + local nCopyRib = EgtCopyGlob( vRibs[i], nTrimmedRibsGrp) + local nType = EgtGetInfo( vRibs[i], KEY_RIBS_TYPE, 'i') + if EgtCurveIsClosed( vRibs[i]) then + EgtSetInfo( nCopyRib, KEY_ORIGINAL_RIB_CLOSED, 1) + end + + local nCrv = nCopyRib + local nCnt = 1 + if nType == RIB_TYPE.INTERNAL or nType == RIB_TYPE.SUPPORT then + nCrv, nCnt = EgtTrimCurveWithRegion( nCopyRib, nSrfInt, true, true) + elseif nType == RIB_TYPE.EXTERNAL then + nCrv, nCnt = EgtTrimCurveWithRegion( nCopyRib, nSrfExt, false, true) + end + + -- se errore nel calcolare trim riprendo il setto originario + if not nCrv then + nCrv = nCopyRib + nCnt = 1 + end + + for nId = nCrv, nCrv + nCnt - 1 do + EgtSetInfo( nId, KEY_START_RIB, vRibs[i]) + end + -- verifico se link definito dall'utente e ne analizzo le proprietà + CheckRibUserLink( nCrv, nCnt, vtSlicing) + + end + + return nTrimmedRibsGrp +end + +-------------------------------------------------------------------- +local function ComputeRibsOrientedOffset( nRibsGrp, dStrand) + + local nOffsGrp = EgtGroup( EgtGetParent( nRibsGrp)) + + local nCurrRib = EgtGetFirstNameInGroup( nRibsGrp, RIBS_CRV .. '*') + while nCurrRib do + + -- recupero tutti i tratti appartenenti a quel setto (hanno lo stesso nome) + local sName = EgtGetName( nCurrRib) + local vIds = EgtGetNameInGroup( nRibsGrp, sName) + + -- recupero i parametri del setto + local bInvert = EgtGetInfo( nCurrRib, KEY_RIBS_INVERT_DIR, 'b') or false + local bInvertOrder = EgtGetInfo( nCurrRib, KEY_RIBS_INVERT_STRAND_ORDER, 'b') or false + + local nShellsNbr = EgtGetInfo( nCurrRib, KEY_RIBS_SHELLS_NBR, 'i') + local dOffs = ( nShellsNbr - 1) * dStrand / 2 + + -- offset di ogni tratto del setto + local vOffs = {} + local bPlusToMinus = false + for i = 1, #vIds do + + local bUserLinked = EgtGetInfo( vIds[i], KEY_RIBS_USER_LINK, 'b') or false + local bCCW = EgtGetInfo( vIds[i], KEY_RIBS_USER_LINK_CCW, 'b') or false + local nLinkOrder = EgtGetInfo( vIds[i], KEY_RIBS_USER_LINK_ORDER, 'i') or 0 + + -- ordine di realizzazione degli offset + if not bUserLinked then + bPlusToMinus = false + else + if nLinkOrder == 0 then + -- determinato dal verso del collegamento + bPlusToMinus = EgtIf( bCCW, true, false) + else + bPlusToMinus = not bPlusToMinus + end + end + + for k = 0, nShellsNbr - 1 do + local nNewId + if bPlusToMinus then + nNewId = EgtOffsetCurveAdv( vIds[i], dOffs - k * dStrand) + else + nNewId = EgtOffsetCurveAdv( vIds[i], - dOffs + k * dStrand) + end + EgtSetName( nNewId, sName) + EgtSetInfo( nNewId, KEY_TYPE, TYPE.RIB) + EgtSetInfo( nNewId, KEY_ORIGINAL_RIB, vIds[i]) + EgtRelocateGlob( nNewId, nOffsGrp) + table.insert( vOffs, nNewId) + end + end + + -- ordinamento + if bInvertOrder then + for i = 1, #vOffs - 1 do + EgtRelocateGlob( vOffs[i], vOffs[#vOffs], GDB_IN.AFTER) + end + -- aggiorno il vettore con gli indici per rispettare nuovo ordinamento + vOffs = EgtGetNameInGroup( nOffsGrp, sName) + end + + -- orientamento + local bInvertCrv = bInvert + for j = 1, #vOffs, nShellsNbr do + + -- stabilisco orientamento del primo tratto del gruppo + local bUserLinked = EgtGetInfo( vOffs[j], KEY_RIBS_USER_LINK, 'b') or false + local nLinkOrder = EgtGetInfo( vOffs[j], KEY_RIBS_USER_LINK_ORDER, 'i') or 0 + local nLinkTot = EgtGetInfo( vOffs[j], KEY_RIBS_USER_LINK_TOT, 'i') or 0 + if not bUserLinked then + bInvertCrv = bInvert + else + if ( not bInvertOrder and nLinkOrder == 0) or ( bInvertOrder and nLinkOrder == nLinkTot - 1) then + bInvertCrv = bInvert + if ( nShellsNbr % 2 == 0 and not bInvertOrder) or ( nShellsNbr % 2 ~= 0 and bInvertOrder) then + bInvertCrv = not bInvert + end + else + if nShellsNbr % 2 == 0 then + bInvertCrv = not bInvertCrv + end + end + end + + -- inversione + for k = 0, nShellsNbr - 1 do + if ( bInvertCrv and k % 2 == 0) or ( not bInvertCrv and k % 2 ~= 0) then + EgtInvertCurve( vOffs[j + k]) + UpdateInvertInfo( vOffs[j + k]) + end + end + end + + -- passo al setto successivo + nCurrRib = EgtGetNextName( vIds[#vIds], RIBS_CRV .. '*') + end + + return nOffsGrp +end + -------------------------------------------------------------------- local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOffs, dStrand, nGrp, vtSlicing) @@ -470,7 +690,7 @@ local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOff end -------------------------------------------------------------------- -local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf2, dWidth, nGrp, nOffsGrp) +local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf2, dStrand, nGrp, nOffsGrp) -- setti interni/supporto ed esterni non si possono intersecare per definizione if ( ( nType1 == RIB_TYPE.INTERNAL or nType1 == RIB_TYPE.SUPPORT) and nType2 == RIB_TYPE.EXTERNAL) or @@ -483,58 +703,84 @@ local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf end local bInters = false - local ptInt + local bForceCrv1Cut = false -- porto le curve nel gruppo locale local nCrv1 = EgtCopyGlob( nRib1, nGrp) local nCrv2 = EgtCopyGlob( nRib2, nGrp) - -- verifico se si intersecano - ptInt = EgtIP( nCrv1, nCrv2, ORIG(), GDB_ID.ROOT) + -- verifico se si intersecano nel piano XY definito dal gruppo locale + local nId, nCnt = EgtCurveCurveInters( nCrv1, nCrv2, nGrp) - -- se non si intersecano, verifico se si intersecano i loro offset - local bFound = false - if not ptInt then - local vOffs1 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv1)) - local vOffs2 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv2)) + -- se si intersecano verifico se ho intersezioni valide + if nId then + + -- scorro tutte le intersezioni trovate + for i = 0, nCnt - 1 do + local nPtId = nId + i + if EgtGetType( nPtId) ~= GDB_TY.GEO_POINT then + -- se è tratto sovrapposto warining + EgtOutLog( 'Warning : ribs overlapping - CalcPaths') + else + -- verifico se valida + if nType1 == RIB_TYPE.UNBOUNDED and nType2 == RIB_TYPE.UNBOUNDED then + -- nel caso unbounded l'intersezione può essere ovunque + bInters = true + elseif nType1 == RIB_TYPE.EXTERNAL or nType2 == RIB_TYPE.EXTERNAL then + -- l'intersezione deve essere esterna + if nSrf2 and EgtSurfFrTestExternal( nSrf2, nPtId) then bInters = true end + else + -- se uno dei due è interno o supporto l'intersezione deve essere interna + if nSrf1 and not EgtSurfFrTestExternal( nSrf1, nPtId) then bInters = true end + end + + -- se valida verifico se forza il taglio sulla curva 1 + if bInters then + local ptInt = EgtSP( nPtId, GDB_ID.ROOT) + local dPar1 = EgtCurveParamAtPoint( nCrv1, ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) + local dPar2 = EgtCurveParamAtPoint( nCrv2, ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) + local _, dParE1 = EgtCurveDomain( nCrv1) + local _, dParE2 = EgtCurveDomain( nCrv2) + + local bCrv1OnExtr = ( dPar1 < 10 * GEO.EPS_SMALL or abs( dPar1 - dParE1) < 10 * GEO.EPS_SMALL) + local bCrv2OnExtr = ( dPar2 < 10 * GEO.EPS_SMALL or abs( dPar2 - dParE2) < 10 * GEO.EPS_SMALL) + bForceCrv1Cut = ( bCrv1OnExtr and not bCrv2OnExtr) + + if bForceCrv1Cut then + return bInters, bForceCrv1Cut -- true, true + end + end + end + end + + return bInters, bForceCrv1Cut -- true/false, false + + else + -- se non si intersecano, verifico se si intersecano i loro offset + local vOffs1 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv1)) or {} + local vOffs2 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv2)) or {} for i = 1, #vOffs1 do - local nSrfOffs1 = EgtSurfFrFatCurve( nGrp, vOffs1[i], dWidth, false) + local nSrfOffs1 = EgtSurfFrFatCurve( nGrp, vOffs1[i], 0.5 * dStrand, false) if nSrfOffs1 then for j = 1, #vOffs2 do -- verifico se intersezione local nRes = EgtCurveWithRegionClassify( vOffs2[j], nSrfOffs1) if nRes == GDB_CRC.IN or nRes == GDB_CRC.INTERS then - bFound = true + bInters = true break end end - if bFound then break end + if bInters then break end end end - end - -- se intersezione verifico se valida - if ptInt then - local nPtId = EgtPoint( nGrp, ptInt, GDB_RT.GLOB) - if nType1 == RIB_TYPE.UNBOUNDED and nType2 == RIB_TYPE.UNBOUNDED then - -- nel caso unbounded l'intersezione può essere ovunque - bInters = true - elseif nType1 == RIB_TYPE.EXTERNAL or nType2 == RIB_TYPE.EXTERNAL then - -- l'intersezione deve essere esterna - if nSrf2 and EgtSurfFrTestExternal( nSrf2, nPtId) then bInters = true end - else - -- se uno dei due è interno o supporto l'intersezione deve essere interna - if nSrf1 and not EgtSurfFrTestExternal( nSrf1, nPtId) then bInters = true end - end - else - bInters = bFound + return bInters, bForceCrv1Cut -- true, false end - return bInters, ptInt end --------------------------------------------------------------------------------- -- Funzione che sistema le intersezioni fra costolature nel caso generico -local function AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nOffsGrp) +local function AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nOffsGrp, bSaveSurf, nLoopGrp) -- calcolo la superficie della curva principale ( nCrv1) da usare per trim local nShells = EgtGetInfo( nCrv1, KEY_RIBS_SHELLS_NBR, 'i') @@ -562,13 +808,28 @@ local function AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nOffs -- aggiorno ordine di split copiandolo da nCrv2 CopyInfo( nCrv2, vOffs2[i], KEY_SPLIT_ORDER, 'i') for j = nId + nCnt - 1, nId + 1, -1 do - EgtSetInfo( j, KEY_SPLIT_RIB, vOffs2[i]) -- curva da cui deriva CopyInfo( nCrv2, j, KEY_SPLIT_ORDER, 'i') -- ordine di split - EgtRelocateGlob( j, nOffsGrp, GDB_IN.LAST_SON) + EgtRelocateGlob( j, j - 1, GDB_IN.AFTER) end - end - EgtErase( nSrf) + end + -- se necessario salvo i loop da usare per ingressi e uscite + if bSaveSurf then + -- verifico orientamento della superficie per compatibilità ingressi ribs splittati + local vtN = EgtSurfFrNormVersor( nSrf) + if AreSameVectorApprox( vtN, LayerParams.vtSlicing) then + EgtInvertSurf( nSrf) + end + local nChunks = EgtSurfFrChunkCount( nSrf) + for i = 0, nChunks - 1 do + local nRes, nCnt = EgtExtractSurfFrChunkLoops( nSrf, i, nLoopGrp) + for j = nRes, nRes + nCnt - 1 do + EgtSetName( j, SURF_LOOP) + end + end + end + + EgtErase( nSrf) end -------------------------------------------------------------------- @@ -628,9 +889,10 @@ local function UpdateSplitOrder( nCrv, tInters, nOffsGrp) end end --------------------------------------------------------------------- -local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands, vTypeSequence) +--------------------------------------------------------------------------------- +local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, nLoopGrp, bAllTwoStrands, vTypeSequence) + local bSpecialCase = false local vRibsIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') -- copio gli offset delle costolature nel RibsPathGrp local nCrvGrp = EgtGetParent( nRibsPathGrp) @@ -639,7 +901,7 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa EgtCopyGlob( vOffsRib[i], nRibsPathGrp) end - -- creo un gruppo con frame locale per calcolare le intersezioni + -- creo un gruppo con frame locale per calcolare le intersezioni ( è il piano XY locale dove calcolare intersezioni) local frLoc = Frame3d( ORIG(), LayerParams.vtSlicing) local nGrpTmp = EgtGroup( nRibsGrp, frLoc, GDB_RT.GLOB) @@ -671,25 +933,16 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa for j = i + 1, #vRibsIds do local nType2 = EgtGetInfo( vRibsIds[j], KEY_RIBS_TYPE, 'i') - local bRibInters, ptInt = VerifyRibsIntersection( vRibsIds[i], vRibsIds[j], nType1, nType2, nSrfOffs1, nSrfOffs2, 0.5 * LayerParams.dStrand, nGrpTmp, nOffsGrp) + local bRibInters, bForceCrv1Cut = VerifyRibsIntersection( vRibsIds[i], vRibsIds[j], nType1, nType2, nSrfOffs1, nSrfOffs2, LayerParams.dStrand, nGrpTmp, nOffsGrp) if bRibInters then bInters = true - - local dPar1, dPar2 - if ptInt then - dPar1 = EgtCurveParamAtPoint( vRibsIds[i], ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) - dPar2 = EgtCurveParamAtPoint( vRibsIds[j], ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) - end - local _, dParE1 = EgtCurveDomain( vRibsIds[i]) - local _, dParE2 = EgtCurveDomain( vRibsIds[j]) local nCrv1 = vRibsIds[i] -- curva principale che non viene tagliata local nCrv2 = vRibsIds[j] -- curve secondaria da modificare local nSplitOrder1 = EgtGetInfo( nCrv1, KEY_SPLIT_ORDER, 'i') or 0 local nSplitOrder2 = EgtGetInfo( nCrv2, KEY_SPLIT_ORDER, 'i') or 0 - local bCrv1OnExtr = dPar1 and ( dPar1 < 10 * GEO.EPS_SMALL or abs( dPar1 - dParE1) < 10 * GEO.EPS_SMALL) - local bCrv2OnExtr = dPar2 and ( dPar2 < 10 * GEO.EPS_SMALL or abs( dPar2 - dParE2) < 10 * GEO.EPS_SMALL) - if ( dPar1 and not dPar2) or ( bCrv1OnExtr and not bCrv2OnExtr) then + + if bForceCrv1Cut then nCrv1, nCrv2 = nCrv2, nCrv1 nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 else @@ -702,10 +955,13 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa end -- aggiorno tabella delle intersezioni + local bSaveSurf = false if tInters[nCrv1] then table.insert( tInters[nCrv1], nCrv2) else tInters[nCrv1] = {nCrv2} + -- è la prima volta che nCrv1 viene usata per un trim quindi devo salvare la superficie utilizzata + bSaveSurf = true end -- aggiorno ordine di split @@ -717,8 +973,9 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa if bAllTwoStrands and ( nType1 == nType2) then -- nel caso di 2 passate e stessa tipologia gestione speciale per creare unico percorso AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, LayerParams, nRibsPathGrp) + bSpecialCase = true else - AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nRibsPathGrp) + AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nRibsPathGrp, bSaveSurf, nLoopGrp) end end end @@ -728,45 +985,207 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa EgtErase( nSrfOffs2) EgtErase( nGrpTmp) - return bInters -end - --------------------------------------------------------------------- -local function ShortestPathForRibs( vIds, nGrp, bInvertOrder) - - if not vIds or #vIds == 0 then return end - - -- se solo un setto ordinamento banale - if #vIds == 1 then - EgtRelocateGlob( vIds[1], nGrp, GDB_IN.LAST_SON) - return - elseif #vIds == 2 then - EgtRelocateGlob( vIds[1], nGrp, GDB_IN.LAST_SON) - EgtRelocateGlob( vIds[2], vIds[1], EgtIf( bInvertOrder, GDB_IN.BEFORE, GDB_IN.AFTER)) - return - else - -- se più setti ordinamento con shortest path - EgtSpInit() - for i = 1, #vIds do - local pt = EgtMP( vIds[i], GDB_RT.GLOB) - EgtSpAddPoint( pt:getX(), pt:getY(), pt:getZ(), 0, 0, pt:getX(), pt:getY(), pt:getZ(), 0, 0) - end - local vOrd, dLen = EgtSpCalculate( SHP_TY.OPEN) - EgtSpTerminate() - - EgtRelocateGlob( vIds[vOrd[1]], nGrp, GDB_IN.LAST_SON) - for i = 2, #vOrd do - EgtRelocateGlob( vIds[vOrd[i]], vIds[vOrd[i-1]], EgtIf( bInvertOrder, GDB_IN.BEFORE, GDB_IN.AFTER)) - end - end + return bInters, bSpecialCase end --------------------------------------------------------------------- --- Funzione che riordina le costolature nel caso generico -local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr, vRibsPrintOrder) +local function ReorderSplitRibs( vIds, dStrand, bParamInvertOrder) + + -- individuo i setti che derivano da uno stesso pezzo di costolatura + local tabRibs = {} + for i = 1, #vIds do + local nOrigId = EgtGetInfo( vIds[i], KEY_ORIGINAL_RIB, 'i') + if tabRibs[nOrigId] then + table.insert( tabRibs[nOrigId], vIds[i]) + else + tabRibs[nOrigId] = { vIds[i]} + end + end + + for k, tabVal in pairs( tabRibs) do + + -- verifico se split dopo intersezione con altro setto + local nSplitOrder = EgtGetInfo( tabVal[1], KEY_SPLIT_ORDER, 'i') or 0 + + -- verifico se split dopo aver fatto il trim con la superficie + local nStartRib = EgtGetInfo( tabVal[1], KEY_START_RIB, 'i') + local bSplitAfterTrim = EgtGetInfo( nStartRib, KEY_SPLIT_AFTER_TRIM, 'b') or false + + if nSplitOrder > 0 or bSplitAfterTrim then + -- caso di setti splittati + local nShells = EgtGetInfo( tabVal[1], KEY_RIBS_SHELLS_NBR, 'i') + if nShells == 1 then + -- non è necessario il riordino, associo splitId diversi ad ogni tratto per gestire correttamente il link nel CalcToolPath + for i = 1, #tabVal do + EgtSetInfo( tabVal[i], KEY_SPLIT_ID, i) + end + + else + -- associo le curve dello split + local tAssociatedRibs = {} + while #tabVal > 0 do + local nCurrId = tabVal[1] + table.remove( tabVal, 1) + table.insert( tAssociatedRibs, { nCurrId}) + local bCurrSplitAfterTrim = EgtGetInfo( nCurrId, KEY_SPLIT_AFTER_TRIM, 'b') or false + while nCurrId do + local ptCurr = EgtMP( nCurrId) + bFound = false + for j = 1, #tabVal do + local dDist1 = EgtPointCurveDist( ptCurr, tabVal[j]) + local dDist2 = EgtPointCurveDist( EgtMP( tabVal[j]), nCurrId) + if dDist1 < dStrand + 10 * GEO.EPS_SMALL or dDist2 < dStrand + 10 * GEO.EPS_SMALL then + + -- verifico nel caso di setti splittati dopo il trim che siano compatibili + local bUserLink = EgtGetInfo( tabVal[j], KEY_RIBS_USER_LINK, 'b') or false + local bSplitAfterTrim = EgtGetInfo( tabVal[j], KEY_SPLIT_AFTER_TRIM, 'b') or false + if bSplitAfterTrim ~= bCurrSplitAfterTrim then + if not bCurrSplitAfterTrim and bSplitAfterTrim then + local nOrd = EgtGetInfo( tabVal[j], KEY_SPLIT_AFTER_TRIM_ORDER, 'i') + if nOrd == 0 then + bFound = true + end + end + if bCurrSplitAfterTrim then + local nOrd = EgtGetInfo( nCurrId, KEY_SPLIT_AFTER_TRIM_ORDER, 'i') + local nTot = EgtGetInfo( nCurrId, KEY_SPLIT_AFTER_TRIM_TOT, 'i') + if nOrd == nTot - 1 then + bFound = true + end + end + else + bFound = true + end + + if bFound then + EgtRelocateGlob( tabVal[j], nCurrId, GDB_IN.AFTER) + nCurrId = tabVal[j] + bCurrSplitAfterTrim = bSplitAfterTrim + table.remove( tabVal, j) + table.insert( tAssociatedRibs[#tAssociatedRibs], nCurrId) + break + end + end + end + + if not bFound then + nCurrId = nil + end + end + end + + -- assegno splitid per gestire correttamente il link nel CalcToolPath + for i = 1, #tAssociatedRibs do + for j = 1, #tAssociatedRibs[i] do + EgtSetInfo( tAssociatedRibs[i][j], KEY_SPLIT_ID, i) + end + end + + -- modifiche per preservare i link definiti dall'utente + local bUserLink = EgtGetInfo( tAssociatedRibs[1][1], KEY_RIBS_USER_LINK, 'b') or false + if bUserLink and nShells % 2 == 0 then + + local nLinkOrder = EgtGetInfo( tAssociatedRibs[1][1], KEY_RIBS_USER_LINK_ORDER, 'i') or 0 + local nTotParts = EgtGetInfo( tAssociatedRibs[1][1], KEY_RIBS_USER_LINK_TOT, 'i') or 1 + local bInvertOrder = EgtGetInfo( tAssociatedRibs[1][1], KEY_RIBS_INVERT_STRAND_ORDER, 'b') or false + + -- ordinamento + if ( nTotParts % 2 == 0 and bInvertOrder and nLinkOrder % 2 ~= 0 ) or + ( nTotParts % 2 == 0 and not bInvertOrder and nLinkOrder % 2 == 0) or + ( nTotParts % 2 ~= 0 and nLinkOrder % 2 == 0) then + local vLastGrp = tAssociatedRibs[#tAssociatedRibs] + local nPrevId = vLastGrp[#vLastGrp] + for i = #tAssociatedRibs - 1, 1, -1 do + for j = 1, #tAssociatedRibs[i] do + local nCurrId = tAssociatedRibs[i][j] + EgtRelocateGlob( nCurrId, nPrevId, GDB_IN.AFTER) + nPrevId = nCurrId + end + end + end + + -- direzione + if ( nTotParts % 2 == 0 and nLinkOrder > 0 and nLinkOrder < nTotParts - 1) or + ( nTotParts % 2 ~= 0 and not bInvertOrder and nLinkOrder > 0) or + ( nTotParts % 2 ~= 0 and bInvertOrder and nLinkOrder < nTotParts - 1) then + local vLastGrp = tAssociatedRibs[#tAssociatedRibs] + for j = 1, #vLastGrp do + EgtInvertCurve( vLastGrp[j]) + UpdateInvertInfo( vLastGrp[j]) + end + end + end + end + end + end + +end + +-------------------------------------------------------------------- +local function ShortestPathForRibs( vRibs, nGrp, bInvertOrder) + + if not vRibs or #vRibs == 0 then return end + + -- divido per gruppi di setti ( i gruppi sono identificati dallo stesso nome) + local tabRibs = {} + local sPrevName = "" + for i = 1, #vRibs do + local sName = EgtGetName( vRibs[i]) + if sName == sPrevName then + table.insert( tabRibs[#tabRibs], vRibs[i]) + else + table.insert( tabRibs, {vRibs[i]}) + end + sPrevName = sName + end + + -- stabilisco l'ordine di realizzazione dei gruppi di setti + local vOrd + if #tabRibs == 1 then + -- se un solo gruppo ordinamento banale + vOrd = {1} + else + -- se più gruppi ordinamento con shortest path + EgtSpInit() + for i = 1, #tabRibs do + local ptS = EgtSP( tabRibs[i][1], GDB_ID.ROOT) + local ptE = EgtEP( tabRibs[i][#tabRibs[i]], GDB_ID.ROOT) + EgtSpAddPoint( ptS:getX(), ptS:getY(), ptS:getZ(), 0, 0, ptE:getX(), ptE:getY(), ptE:getZ(), 0, 0) + end + vOrd = EgtSpCalculate( SHP_TY.OPEN) + EgtSpTerminate() + end + + -- creo il vettore con i setti ordinati + local vIds = {} + local nStart = EgtIf( bInvertOrder, #vOrd, 1) + local nEnd = EgtIf( bInvertOrder, 1, #vOrd) + local nStep = EgtIf( bInvertOrder, -1, 1) + for i = nStart, nEnd, nStep do + local vCurrRibs = tabRibs[vOrd[i]] + for j = 1, #vCurrRibs do + table.insert( vIds, vCurrRibs[j]) + end + end + + EgtRelocateGlob( vIds[1], nGrp, GDB_IN.LAST_SON) + for i = 2, #vIds do + EgtRelocateGlob( vIds[i], vIds[i-1], GDB_IN.AFTER) + end + +end + +-------------------------------------------------------------------- +local function ReorderRibs( nGrp, bInvertOrder, dStrand, vRibsPrintOrder) local vIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*') if not vIds or #vIds == 0 then return end + + -- riordino setti splittati + ReorderSplitRibs( vIds, dStrand, bInvertOrder) + + -- aggiorno gli id con il nuovo ordinamento + vIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*') -- raggruppo per tipologia local tRibs = {{}, {}, {}, {}} @@ -774,88 +1193,30 @@ local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr, local nType = EgtGetInfo( vIds[i], KEY_RIBS_TYPE, 'i') table.insert( tRibs[nType], vIds[i]) end - - -- riordino ogni tipologia con shortest path - local vSplitRibs = {} + + -- riordino ogni tipologia for i = 1, #vRibsPrintOrder do local nCurrType = vRibsPrintOrder[i] + local vIds = tRibs[nCurrType] + + -- raggruppo in base allo split order local tSplitOrder = {} - local nMax = -1 - -- raggruppo i ribs - for j = 1, #tRibs[nCurrType] do - local nInfoSplit = EgtGetInfo( tRibs[nCurrType][j], KEY_SPLIT_RIB, 'i') - local nShells = EgtGetInfo( tRibs[nCurrType][j], KEY_RIBS_SHELLS_NBR, 'i') - if nInfoSplit and nShells == 1 then - -- se è ottenuto dalla divisione di una costolatura - table.insert( vSplitRibs, tRibs[nCurrType][j]) + local nMaxSplitOrder = 0 + for i = 1, #vIds do + local nSplitOrder = EgtGetInfo( vIds[i], KEY_SPLIT_ORDER, 'i') or 0 + -- eventuale aggiornamento del max split order + if nSplitOrder > nMaxSplitOrder then nMaxSplitOrder = nSplitOrder end + -- inserisco nella tabella + if not tSplitOrder[nSplitOrder] then + tSplitOrder[nSplitOrder]= {vIds[i]} else - -- classifico in base all'ordine di split e al link - local nSplitOrder = EgtGetInfo( tRibs[nCurrType][j], KEY_SPLIT_ORDER, 'i') or 0 - local bLink = EgtGetInfo( tRibs[nCurrType][j], KEY_RIBS_LINK, 'b') or false - if nSplitOrder > nMax then nMax = nSplitOrder end - if not tSplitOrder[nSplitOrder] then - tSplitOrder[nSplitOrder]= {{}, {}} - end - - if bLink then - table.insert( tSplitOrder[nSplitOrder][2], tRibs[nCurrType][j]) - else - table.insert( tSplitOrder[nSplitOrder][1], tRibs[nCurrType][j]) - end + table.insert( tSplitOrder[nSplitOrder], vIds[i]) end end - - local bLinkFirst = bDoLinkFirst - -- riordino ogni ordine di split - for k = 0, nMax do - if tSplitOrder[k] then - ShortestPathForRibs( EgtIf( bLinkFirst, tSplitOrder[k][2], tSplitOrder[k][1]), nGrp, bInvertOrder) - ShortestPathForRibs( EgtIf( bLinkFirst, tSplitOrder[k][1], tSplitOrder[k][2]), nGrp, bInvertOrder) - -- eventuale aggiornamento di bLinkFirst per l'ordine successivo - if not ( ( not bLinkFirst and #tSplitOrder[k][2] == 0) or ( bLinkFirst and #tSplitOrder[k][1] == 0)) then - bLinkFirst = not bLinkFirst - end - end - end - end - - -- sistemo nomi - local kMax = nMaxNbr + 1 - local dTol = 500 * GEO.EPS_SMALL - for i = 1, nMaxNbr do - local vIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. tostring(i)) or {} - for j = 2, #vIds do - local dDistS = EgtPointCurveDist( EgtSP( vIds[j]), vIds[j-1]) - local dDistM = EgtPointCurveDist( EgtMP( vIds[j]), vIds[j-1]) - local dDistE = EgtPointCurveDist( EgtEP( vIds[j]), vIds[j-1]) - if abs( dDistS - dStrand) < dTol or abs( dDistM - dStrand) < dTol or abs( dDistE - dStrand) < dTol then - -- se le costolatura è vicina alla precedente avrà lo stesso nome - EgtSetName( vIds[j], EgtGetName( vIds[j-1])) - EgtRelocateGlob( vIds[j], vIds[j-1], GDB_IN.AFTER) - else - -- se la costolatura dista troppo dalla precedente le cambio il nome - EgtSetName( vIds[j], RIBS_CRV .. tostring( kMax)) - kMax = kMax + 1 - end - end - end - - -- aggiusto tutte le costolature divise - for i = 1, #vSplitRibs do - local nPrevId = EgtGetInfo( vSplitRibs[i], KEY_SPLIT_RIB, 'i') - local bInverted = EgtGetInfo( vSplitRibs[i], KEY_INVERTED_CRV, 'b') or false - -- aggiungo come successiva alla costolatura da cui si è generata - EgtRelocateGlob( vSplitRibs[i], nPrevId, EgtIf( bInverted, GDB_IN.BEFORE, GDB_IN.AFTER)) - -- se necessario rinomino - if EgtGetName( vSplitRibs[i]) == EgtGetName(nPrevId) then - EgtSetName( vSplitRibs[i], RIBS_CRV .. tostring( kMax)) - kMax = kMax + 1 - end - -- correggo le info per gestire correttamente nel calcolo toolpath - local nPrevInfo = EgtGetInfo( nPrevId, KEY_SPLIT_RIB, 'i') - if bInverted and not nPrevInfo then - EgtRemoveInfo( vSplitRibs[i], KEY_SPLIT_RIB) - EgtSetInfo( nPrevId, KEY_SPLIT_RIB, vSplitRibs[i]) + + -- riordino ogni ordine di split con shortest path + for k = 0, nMaxSplitOrder do + ShortestPathForRibs( tSplitOrder[k], nGrp, bInvertOrder) end end end @@ -910,7 +1271,7 @@ end --------------------------------------------------------------------------------------------- -- Funzione che riordina le costolature nel caso di intersezioni e 2 passate -local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vRibsPrintOrder) +local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vRibsPrintOrder, bInvertOrder) local vOffs = {} local vClosed = {} @@ -1059,10 +1420,18 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vRibsPrintOrder) local nType = EgtGetInfo( vCrvs[nId], KEY_RIBS_TYPE, 'i') table.insert( tRibs[nType], vCrvs[nId]) end + -- riordino per tipologia for i = 1, #vRibsPrintOrder do nCurrType = vRibsPrintOrder[i] - for j = 1, #tRibs[nCurrType] do + local nStart = EgtIf( bInvertOrder, #tRibs[nCurrType], 1) + local nEnd = EgtIf( bInvertOrder, 1, #tRibs[nCurrType]) + local nStep = EgtIf( bInvertOrder, -1, 1) + for j = nStart, nEnd, nStep do + if bInvertOrder then + -- inverto curve per mantenere concatenamento + EgtInvertCurve( tRibs[nCurrType][j]) + end EgtRelocateGlob( tRibs[nCurrType][j], nOffsGrp, GDB_IN.LAST_SON) end end @@ -1070,34 +1439,6 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vRibsPrintOrder) end ------------------------------------------------------------------- -local function UpdateRibSplitInfo( nGrp, tIds, tRemoved) - - local vIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*') - if not vIds then return end - - for i = 1, #vIds do - - -- info SplitRib - local nInfo = EgtGetInfo( vIds[i], KEY_SPLIT_RIB, 'i') - if nInfo then - -- verifico se va aggiornata ereditandola da rib che sono stati eliminati per vincolo sulla lunghezza - while tRemoved[nInfo] do - nInfo = tRemoved[nInfo] - end - - if tIds[nInfo] and #tIds[nInfo] > 0 then - -- aggiorno info con nuovo id della costolatura da cui deriva - local nLast = #tIds[nInfo] - EgtSetInfo( vIds[i], KEY_SPLIT_RIB, tIds[nInfo][nLast]) - else - -- se la costolatura da cui deriva è stata eliminata, tolgo l'info che le associava - EgtRemoveInfo( vIds[i], KEY_SPLIT_RIB) - end - end - end -end - --------------------------------------------------------------------- local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) -- stabilisco ordine di realizzazione delle varie tipologie @@ -1105,41 +1446,22 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) for i = 1, #LayerParams.vRibsPrintOrder do vTypeSequence[LayerParams.vRibsPrintOrder[i]] = i end - - local vRibs = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') + + local vOrigRibs = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') -- verifico se tutte le costolature vengono fatte con 2 passate local bAllTwoStrands = true - for i = 1, #vRibs do - local nStrand = EgtGetInfo( vRibs[i], KEY_RIBS_SHELLS_NBR, 'i') + for i = 1, #vOrigRibs do + local nStrand = EgtGetInfo( vOrigRibs[i], KEY_RIBS_SHELLS_NBR, 'i') if nStrand ~= 2 then bAllTwoStrands = false break end end - local nLast = EgtGetLastNameInGroup( nRibsGrp, RIBS_CRV .. '*') - local sLastName = EgtGetName( nLast) - local nMaxNbr = tonumber( string.sub( sLastName, 4)) + -- verifico se posso ignorare eventuali buchi nei setti + VerifyRibsHoles( vOrigRibs, LayerParams.dStrand) - -- calcolo gli offset - local nOffsGrp = EgtGroup( nRibsGrp) - for i = 1, #vRibs do - local nShellsNbr = EgtGetInfo( vRibs[i], KEY_RIBS_SHELLS_NBR, 'i') - local dOffs = ( nShellsNbr - 1) * LayerParams.dStrand / 2 - for k = 0, nShellsNbr - 1 do - local nNewId = EgtOffsetCurveAdv( vRibs[i], - dOffs + k * LayerParams.dStrand) - EgtSetName( nNewId, EgtGetName( vRibs[i])) - EgtSetInfo( nNewId, KEY_TYPE, TYPE.RIB) - EgtRelocateGlob( nNewId, nOffsGrp) - - if EgtCurveIsClosed( vRibs[i]) then - EgtSetInfo( nNewId, "OriginalClosed", 1) - end - end - end - -- scorro i gruppi di curve - local dOffs = 0.5 * LayerParams.dStrand - LayerParams.dOffs + ( LayerParams.nShellsNbr - 1) * LayerParams.dStrand local nCrvGrp = EgtGetFirstNameInGroup( nSliceGrp, CONTOUR_GRP .. '*') while nCrvGrp do @@ -1153,101 +1475,111 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) EgtEmptyGroup( nRibsPathGrp) end - -- creo le superfici con cui fare i trim + -- recupero le superfici local nSrfBase = EgtGetFirstNameInGroup( nCrvGrp, TOT_SHELL_TRIM_SURF) local nSrfExt = EgtGetFirstNameInGroup( nCrvGrp, LAYER_SRF) - local tSurfOffs = ComputeTrimSurfWithOverlapsForRibs( vRibs, nSrfBase, nSrfExt, LayerParams.dOffs, LayerParams.dStrand, nRibsPathGrp, LayerParams.vtSlicing) + -- trim grossolano dei setti + local nTrimGrp = TrimRibs( vOrigRibs, nRibsGrp, nSrfExt, LayerParams.dOffs, LayerParams.vtSlicing) + + -- calcolo offset orientati + local nOffsGrp = ComputeRibsOrientedOffset( nTrimGrp, LayerParams.dStrand) + + -- creo le superfici con cui fare i trim corretti + local tSurfOffs = ComputeTrimSurfWithOverlapsForRibs( vOrigRibs, nSrfBase, nSrfExt, LayerParams.dOffs, LayerParams.dStrand, nRibsPathGrp, LayerParams.vtSlicing) + + -- preparo il gruppo con i contorni delle superfici di offset ( necessario per CalcToolPath) + local nLoopGrp = EgtGroup( nRibsPathGrp) + local nSrfId = EgtGetFirstNameInGroup( nRibsPathGrp, TOT_SHELL_TRIM_SURF) + while nSrfId do + local nChunksNbr = EgtSurfFrChunkCount( nSrfId) + for i = 0, nChunksNbr - 1 do + local nRes, nCnt = EgtExtractSurfFrChunkLoops( nSrfId, i, nLoopGrp) + for j = nRes, nRes + nCnt - 1 do + EgtSetName( j, TRIM_SURF_LOOP) + end + end + nSrfId = EgtGetNextName( nSrfId, TOT_SHELL_TRIM_SURF) + end + -- gestisco eventuali intersezioni fra costolature - local bInters = HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands, vTypeSequence) + local bInters, bSpecialCase = HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, nLoopGrp, bAllTwoStrands, vTypeSequence) EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_INTERS, bInters) - EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_TWO_STRANDS, bAllTwoStrands) + EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_SPECIAL_CASE, bSpecialCase) - -- eseguo il trim delle costole con la regione offsettata - local tOldNewIds = {} - local tRemoved = {} - local vOrderedRibs = EgtGetNameInGroup( nRibsPathGrp, RIBS_CRV ..'*') - for i = 1, #vOrderedRibs do + -- trim dei setti con le regioni offsettate secondo opportuno overlap + local vRibs = EgtGetNameInGroup( nRibsPathGrp, RIBS_CRV ..'*') or {} + for i = 1, #vRibs do + local nCrvId = vRibs[i] -- trim con superficie opportuna - local nOverlap = EgtGetInfo( vOrderedRibs[i], KEY_RIBS_OVERLAP, 'i') - local nType = EgtGetInfo( vOrderedRibs[i], KEY_RIBS_TYPE, 'i') + local nOverlap = EgtGetInfo( nCrvId, KEY_RIBS_OVERLAP, 'i') + local nType = EgtGetInfo( nCrvId, KEY_RIBS_TYPE, 'i') if not tSurfOffs[nType][nOverlap] then -- la costolatura non è fattibile EgtOutLog( 'Warning: Ribs not possibile (layer '..tostring( nIdx)..') - CalcPaths') - EgtErase( vOrderedRibs[i]) + EgtErase( vRibs[i]) else local nCrv, nCnt if tSurfOffs[nType][nOverlap] == GDB_ID.NULL then -- caso unbounded - nCrv = vOrderedRibs[i] + nCrv = nCrvId nCnt = 1 else - nCrv, nCnt = EgtTrimCurveWithRegion( vOrderedRibs[i], tSurfOffs[nType][nOverlap], EgtIf( nType == RIB_TYPE.INTERNAL or nType == RIB_TYPE.SUPPORT, true, false), false) + nCrv, nCnt = EgtTrimCurveWithRegion( nCrvId, tSurfOffs[nType][nOverlap], EgtIf( nType == RIB_TYPE.INTERNAL or nType == RIB_TYPE.SUPPORT, true, false), false) end - tOldNewIds[ vOrderedRibs[i]] = {} - - -- elimino tratti troppo corti for nInd = 0, nCnt - 1 do + -- verifico vicolo sulla lunghezza local dLen = EgtCurveLength( nCrv + nInd) if dLen < MIN_RIBS_LEN then - -- conservo eventuale info di split - local nSplitRib = EgtGetInfo( nCrv + nInd, KEY_SPLIT_RIB, 'i') - if nSplitRib then - tRemoved[vOrderedRibs[i]] = nSplitRib - end - -- cancello la curva EgtErase( nCrv + nInd) else - table.insert( tOldNewIds[ vOrderedRibs[i]], nCrv + nInd) - local bInvert = false - if not EgtGetInfo( nCrv + nInd, "OriginalClosed", 'b') then - -- controllo la direzione (consideriamo inclinazione solo lungo X) - local vtDir = EgtMV( nCrv + nInd) - local dXl = sqrt( sqr( vtDir:getX()) + sqr( vtDir:getZ())) - local dYl = abs( vtDir:getY()) - local dVal = EgtIf( dXl > dYl - GEO.EPS_SMALL, vtDir:getX(), vtDir:getY()) - bInvert = dVal < - GEO.EPS_SMALL - end - local bInvertInfo = EgtGetInfo( nCrv + nInd, KEY_RIBS_INVERT_DIR, 'b') or false - -- inversione della curva - if bInvertInfo ~= bInvert then - EgtInvertCurve( nCrv + nInd) - EgtSetInfo( nCrv + nInd, KEY_INVERTED_CRV, 1) - end + -- salvo info della superficie di trim associata + EgtSetInfo( nCrv + nInd, KEY_ASSOCIATED_SURF, tSurfOffs[nType][nOverlap]) + -- setti chiusi if EgtCurveIsClosed( nCrv + nInd) then EgtSetInfo( nCrv + nInd, KEY_CLOSED_CRV, 1) + + -- ripristino orientamento originale + local bInvertInfo = EgtGetInfo( nCrv + nInd, KEY_RIBS_INVERT_DIR, 'b') or false + local bInverted = EgtGetInfo( nCrv + nInd, KEY_INVERTED_CRV, 'b') or false + if bInvertInfo ~= bInverted then + EgtInvertCurve( nCrv + nInd) + UpdateInvertInfo( nCrv + nInd) + end + ModifyStartPoint( nCrv + nInd, vPtStart) EgtSetInfo( nCrv + nInd, KEY_RIBS_LINK, 0) end - -- salvo info della superficie di trim associata - EgtSetInfo( nCrv + nInd, KEY_ASSOCIATED_SURF, tSurfOffs[nType][nOverlap]) - - if nInd > 0 then - EgtRemoveInfo( nCrv + nInd, KEY_SPLIT_RIB) + -- se dopo trim ho avuto split in più tratti, salvo alcune info + if nCnt > 1 then + local nStartRib = EgtGetInfo( nCrv + nInd, KEY_START_RIB, 'i') + EgtSetInfo( nStartRib, KEY_SPLIT_AFTER_TRIM, 1) + EgtSetInfo( nCrv + nInd, KEY_SPLIT_AFTER_TRIM, 1) + EgtSetInfo( nCrv + nInd, KEY_SPLIT_AFTER_TRIM_ORDER, nInd) + EgtSetInfo( nCrv + nInd, KEY_SPLIT_AFTER_TRIM_TOT, nCnt) end end + end end end - -- aggiorno le info di split con i nuovi id - UpdateRibSplitInfo( nRibsPathGrp, tOldNewIds, tRemoved) - -- riordino le costolature - if bAllTwoStrands and bInters then + if bSpecialCase then -- gestione caso speciale di intersezione e 2 passate - ReorderRibsInters2Shells( nRibsPathGrp, LayerParams.dStrand, LayerParams.vRibsPrintOrder) + ReorderRibsInters2Shells( nRibsPathGrp, LayerParams.dStrand, LayerParams.vRibsPrintOrder, LayerParams.bRibsInvertOrder) else - ReorderRibs( nRibsPathGrp, LayerParams.bRibsInvertOrder, LayerParams.bRibsDoLinkFirst, LayerParams.dStrand, nMaxNbr, LayerParams.vRibsPrintOrder) + ReorderRibs( nRibsPathGrp, LayerParams.bRibsInvertOrder, LayerParams.dStrand, LayerParams.vRibsPrintOrder) end - + if not EgtGetFirstNameInGroup( nRibsPathGrp, RIBS_CRV .. '*') then EgtErase( nRibsPathGrp) end + nCrvGrp = EgtGetNextName( nCrvGrp, CONTOUR_GRP .. '*') end end @@ -1439,7 +1771,7 @@ local function ReorderExtraShells( nPathGrp, dStrand, vPtStart, bPrintInvert) if bPrintInvert then for i = 1, #vIds do EgtInvertCurve( vIds[i]) - EgtSetInfo( vIds[i], KEY_INVERTED_CRV, 1) + UpdateInvertInfo( vIds[i]) end end diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 60295bb..049d8df 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -96,7 +96,8 @@ end local function ReadParam( nId, sKey, sType, table, defVal) local info = EgtGetInfo( nId, sKey, sType) if info == nil then info = EgtGetInfo( s_nPartId, sKey, sType) end - table[sKey] = info or defVal + if info == nil then info = defVal end + table[sKey] = info end -------------------------------------------------------------------- @@ -115,6 +116,7 @@ local function GetRibParams( nId) ReadParam( nId, KEY_RIBS_OVERLAP, 'i', RibParam) ReadParam( nId, KEY_RIBS_LINK, 'b', RibParam) ReadParam( nId, KEY_RIBS_TYPE, 'i', RibParam, RIB_TYPE.INTERNAL) + ReadParam( nId, KEY_RIBS_INVERT_STRAND_ORDER, 'b', RibParam) return RibParam end diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 47b7323..01732cf 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -560,7 +560,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlic local ptS = EgtEP( nCurr) local ptE = EgtSP( nNext) - local nCrvId = EgtGetFirstInGroup( nLoopGrp) + local nCrvId = EgtGetFirstNameInGroup( nLoopGrp, TRIM_SURF_LOOP) -- recupero la curva di offset su cui calcolare link while nCrvId do local dParS = EgtCurveParamAtPoint( nCrvId, ptS) @@ -607,18 +607,31 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlic return end + -- elimino dalle curve di contorno il link appena trovato if bClosed then EgtTrimCurveStartEndAtParam( nCrvId, dParE, dParS) EgtErase( nCopyId) else - EgtTrimCurveEndAtParam( nCrvId, dParS) - EgtTrimCurveStartAtParam( nCopyId, dParE) + if dParS < GEO.EPS_SMALL then + -- forzare la fine della curva nel suo inizio significa cancellarla completamente + EgtErase( nCrvId) + else + EgtTrimCurveEndAtParam( nCrvId, dParS) + end + + local _, dEnd = EgtCurveDomain( nCopyId) + if abs( dParE - dEnd) < GEO.EPS_SMALL then + -- forzare l'inizio della curva nella sua fine significa cancellarla completamente + EgtErase( nCopyId) + else + EgtTrimCurveStartAtParam( nCopyId, dParE) + end end return nLinkId end - nCrvId = EgtGetNext( nCrvId) + nCrvId = EgtGetNextName( nCrvId, TRIM_SURF_LOOP) end -- se non ho trovato un collegamento sul bordo, creo una linea tra ptS e ptE @@ -630,7 +643,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlic EgtSetName( nLinkId, LINK_CRV) EgtModifyCurveExtrusion( nLinkId, vtSlicing, GDB_RT.GLOB) EgtRelocateGlob( nLinkId, nCurr, GDB_IN.AFTER) - else + else EgtErase( nLinkId) end end @@ -737,7 +750,7 @@ local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, local bOnlyOneCurve = not bClosed and ( dPar < GEO.EPS_SMALL or abs( dPar - dParEnd) < GEO.EPS_SMALL) local nMainCrv = nCrvOffs -- curva preferita da utilizzare per lead in - local nOtherCrv -- altra possibile curva da ultizzare nel caso nMainCrv non sia adatta + local nOtherCrv -- altra possibile curva da ultizzare nel caso nMainCrv non sia adatta if bClosed then EgtChangeClosedCurveStart( nCrvOffs, dPar) @@ -796,7 +809,7 @@ local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, end else EgtErase( nLeadId) - bInvert = not bInvert + bInvert = not bInvert return nil end -- aggiorno parametro bInvert @@ -808,7 +821,7 @@ end -------------------------------------------------------------------- local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp) - + local dLILen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_LEN, 'd') local bLIInvert = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_INVERT, 'b') @@ -817,7 +830,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp) -- recupero la curva di offset su cui calcolare leadin local ptS = EgtSP( nCrv) local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) - while nCrvOffs do + while nCrvOffs do local dParS = EgtCurveParamAtPoint( nCrvOffs, ptS) if dParS then @@ -947,7 +960,7 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) -- aggiungo le costolature nel toolpath local vEntIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') for i = 1, #vEntIds do - -- copio entità nel gruppo toolpath + -- copio entità nel gruppo toolpath local nNewEntId = EgtCopyGlob( vEntIds[i], nTpathGrpId, GDB_IN.LAST_SON) -- correggo posizione in Z ( per essere sicuri di appoggiare sul piano) EgtMove( nNewEntId, dCorrZ * Z_AX(), GDB_RT.GLOB) @@ -957,20 +970,21 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) EgtSetColor( nNewEntId, EgtStdColor('MAROON')) end - -- estraggo i contorni di tutte le superfici di offset - local nLoopGrp = EgtGroup( nRibsGrp) - local nSrfId = EgtGetFirstNameInGroup( nRibsGrp, TOT_SHELL_TRIM_SURF) - while nSrfId do - EgtMove( nSrfId, dCorrZ * Z_AX(), GDB_RT.GLOB) - -- mi sposto dell'altezza layer - EgtMove( nSrfId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) - local nChunksNbr = EgtSurfFrChunkCount( nSrfId) - for i = 0, nChunksNbr do - local nRes, nCnt = EgtExtractSurfFrChunkLoops( nSrfId, i, nLoopGrp) - end - nSrfId = EgtGetNextName( nSrfId, TOT_SHELL_TRIM_SURF) + -- posiziono alla quota corretta i loop degli offset da utlizzare per link, ingressi e uscite + local nLoopGrp = EgtGetFirstGroupInGroup( nRibsGrp) + local vLoopIds = EgtGetAllInGroup( nLoopGrp) + for i = 1, #vLoopIds do + EgtMove( vLoopIds[i], dCorrZ * Z_AX(), GDB_RT.GLOB) + EgtMove( vLoopIds[i], LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) end + -- posizono alla quota corretta le superfici usate per i trim + local vSrfIds = EgtGetNameInGroup( nRibsGrp, TOT_SHELL_TRIM_SURF) or {} + for i = 1, #vSrfIds do + EgtMove( vSrfIds[i], dCorrZ * Z_AX(), GDB_RT.GLOB) + EgtMove( vSrfIds[i], LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) + end + -- recupero i gruppi delle costolature local tabRibs = {} local nFirst = EgtGetFirstNameInGroup( nTpathGrpId, RIBS_CRV .. '*') @@ -981,82 +995,35 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) nFirst = EgtGetNextName( vIds[#vIds], RIBS_CRV .. '*') end - local bInters = EgtGetInfo( nRibsGrp, KEY_RIBS_INTERS, 'b') or false - local bAllTwoStrands = EgtGetInfo( nRibsGrp, KEY_RIBS_TWO_STRANDS, 'b') or false - local bSpecialCase = bInters and bAllTwoStrands - local bSwap = false - - local bInvert = false -- curve già orientate in CalcPaths - if not bSpecialCase then - for i = 1, #tabRibs do - local nInfo = EgtGetInfo( tabRibs[i][1], KEY_SPLIT_RIB, 'i') - local nShellsNbr = EgtGetInfo( tabRibs[i][1], KEY_RIBS_SHELLS_NBR, 'i') - - if i > 1 then - -- verifico se link - local bPrevLink = EgtGetInfo( tabRibs[i-1][1], KEY_RIBS_LINK, 'b') - local bCurrLink = EgtGetInfo( tabRibs[i][1], KEY_RIBS_LINK, 'b') - if bPrevLink and bCurrLink then - nPrevType = EgtGetInfo( tabRibs[i-1][1], KEY_RIBS_TYPE, 'i') - nCurrType = EgtGetInfo( tabRibs[i][1], KEY_RIBS_TYPE, 'i') - -- se cambio tipologia di setto, l'orientamento della curva è già corretto - if nPrevType ~= nCurrType then - bInvert = false - elseif not nInfo then - -- aggiorno bInvert per il gruppo di costolature corrente in modo da essere coerente con il collegamento - local nPrevShellsNbr = EgtGetInfo( tabRibs[i-1][1], KEY_RIBS_SHELLS_NBR, 'i') - if nPrevShellsNbr % 2 == 1 then - bInvert = not bInvert - end - end - else - bInvert = false - end - end - - if nShellsNbr == 1 and nInfo and bInvert then - -- se inverto direzione di costolature divise allora devo invertirne anche l'ordine di realizzazione - bSwap = true - EgtRelocateGlob( tabRibs[i][1], tabRibs[i-1][1], GDB_IN.BEFORE) - end - - -- oriento tutte le passate relative ad una stessa costolatura - if not EgtCurveIsClosed( tabRibs[i][1]) then - for j = 1, #tabRibs[i] do - if ( bInvert and j % 2 == 1) or ( not bInvert and j % 2 == 0) then - EgtInvertCurve( tabRibs[i][j]) - end - end - end - end - end + local bSpecialCase = EgtGetInfo( nRibsGrp, KEY_RIBS_SPECIAL_CASE, 'b') or false -- Link - -- se modifiche nell'ordine ricalcolo i gruppi di costolature - if bSwap then - tabRibs = {} - nFirst = EgtGetFirstNameInGroup( nTpathGrpId, RIBS_CRV .. '*') - while nFirst do - local sName = EgtGetName( nFirst) - local vIds = EgtGetNameInGroup( nTpathGrpId, sName) - table.insert( tabRibs, vIds) - nFirst = EgtGetNextName( vIds[#vIds], RIBS_CRV .. '*') - end - end - -- collego le passate di una stessa costolatura for i = 1, #tabRibs do if EgtCurveIsClosed( tabRibs[i][1]) then AddLink( tabRibs[i], nTpathGrpId, LINK_TYPE.NONE, LayerParams.dLinkParam, LayerParams.dSPOffs, LayerParams.dStrand, LayerParams.vtSlicing) else for j = 1, #tabRibs[i] - 1 do - CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, true, LayerParams.vtSlicing, nGrpTmp) - if not bSpecialCase then - -- creo link fittizio per eliminare tratto corrispondente sulla curva di offset + local nOrig1 = EgtGetInfo( tabRibs[i][j], KEY_ORIGINAL_RIB, 'i') + local nOrig2 = EgtGetInfo( tabRibs[i][j + 1], KEY_ORIGINAL_RIB, 'i') + local nSplitId1 = EgtGetInfo( tabRibs[i][j], KEY_SPLIT_ID, 'i') or 0 + local nSplitId2 = EgtGetInfo( tabRibs[i][j + 1], KEY_SPLIT_ID, 'i') or 0 + local bForceLink = ( nOrig1 == nOrig2 and nSplitId1 == nSplitId2) + + CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, bForceLink, LayerParams.vtSlicing, nGrpTmp) + -- creo link fittizio per eliminare tratto corrispondente sulla curva di offset + if not bSpecialCase and bForceLink then local nFakeLink = CalcRibsLink( tabRibs[i][j + 1], tabRibs[i][j], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) EgtErase( nFakeLink) end end + + -- verifico se necessario collegamento tra primo e ultimo setto del gruppo + local bOriginalClosed = EgtGetInfo( tabRibs[i][1], KEY_ORIGINAL_RIB_CLOSED, 'b') or false + if bOriginalClosed then + CalcRibsLink( tabRibs[i][#tabRibs[i]], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) + end + if bSpecialCase then local nFakeLink = CalcRibsLink( tabRibs[i][#tabRibs[i]], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) EgtErase( nFakeLink) diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 8a9087b..caeaf47 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -155,8 +155,8 @@ local function LoadParams( sFile, nPartId) SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_PRINT_ORDER, '3,1,4,2') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_SHELLS_NBR, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_DIR, '0') + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_STRAND_ORDER, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_ORDER, '0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_DO_LINK_FIRST, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LINK, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_IN_INVERT, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_IN_LEN, '0.0') From 9f5c2523e0897ece3bc15188965addd0a34a4366 Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 1 Feb 2023 09:36:43 +0100 Subject: [PATCH 64/79] 3dPrinting : - modifiche per nuova definizione di EgtCurveCurveInters. --- LuaLibs/CalcPaths.lua | 60 +++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index e62a1df..41d1697 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -709,45 +709,39 @@ local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf local nCrv1 = EgtCopyGlob( nRib1, nGrp) local nCrv2 = EgtCopyGlob( nRib2, nGrp) -- verifico se si intersecano nel piano XY definito dal gruppo locale - local nId, nCnt = EgtCurveCurveInters( nCrv1, nCrv2, nGrp) + local nId, nPntCnt, nCrvCnt = EgtCurveCurveInters( nCrv1, nCrv2, nGrp) -- se si intersecano verifico se ho intersezioni valide if nId then - - -- scorro tutte le intersezioni trovate - for i = 0, nCnt - 1 do + -- scorro tutti i punti di intersezione trovati + for i = 0, nPntCnt - 1 do local nPtId = nId + i - if EgtGetType( nPtId) ~= GDB_TY.GEO_POINT then - -- se è tratto sovrapposto warining - EgtOutLog( 'Warning : ribs overlapping - CalcPaths') + -- verifico se valida + if nType1 == RIB_TYPE.UNBOUNDED and nType2 == RIB_TYPE.UNBOUNDED then + -- nel caso unbounded l'intersezione può essere ovunque + bInters = true + elseif nType1 == RIB_TYPE.EXTERNAL or nType2 == RIB_TYPE.EXTERNAL then + -- l'intersezione deve essere esterna + if nSrf2 and EgtSurfFrTestExternal( nSrf2, nPtId) then bInters = true end else - -- verifico se valida - if nType1 == RIB_TYPE.UNBOUNDED and nType2 == RIB_TYPE.UNBOUNDED then - -- nel caso unbounded l'intersezione può essere ovunque - bInters = true - elseif nType1 == RIB_TYPE.EXTERNAL or nType2 == RIB_TYPE.EXTERNAL then - -- l'intersezione deve essere esterna - if nSrf2 and EgtSurfFrTestExternal( nSrf2, nPtId) then bInters = true end - else - -- se uno dei due è interno o supporto l'intersezione deve essere interna - if nSrf1 and not EgtSurfFrTestExternal( nSrf1, nPtId) then bInters = true end - end + -- se uno dei due è interno o supporto l'intersezione deve essere interna + if nSrf1 and not EgtSurfFrTestExternal( nSrf1, nPtId) then bInters = true end + end + + -- se valida verifico se forza il taglio sulla curva 1 + if bInters then + local ptInt = EgtSP( nPtId, GDB_ID.ROOT) + local dPar1 = EgtCurveParamAtPoint( nCrv1, ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) + local dPar2 = EgtCurveParamAtPoint( nCrv2, ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) + local _, dParE1 = EgtCurveDomain( nCrv1) + local _, dParE2 = EgtCurveDomain( nCrv2) - -- se valida verifico se forza il taglio sulla curva 1 - if bInters then - local ptInt = EgtSP( nPtId, GDB_ID.ROOT) - local dPar1 = EgtCurveParamAtPoint( nCrv1, ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) - local dPar2 = EgtCurveParamAtPoint( nCrv2, ptInt, GEO.EPS_SMALL, GDB_RT.GLOB) - local _, dParE1 = EgtCurveDomain( nCrv1) - local _, dParE2 = EgtCurveDomain( nCrv2) - - local bCrv1OnExtr = ( dPar1 < 10 * GEO.EPS_SMALL or abs( dPar1 - dParE1) < 10 * GEO.EPS_SMALL) - local bCrv2OnExtr = ( dPar2 < 10 * GEO.EPS_SMALL or abs( dPar2 - dParE2) < 10 * GEO.EPS_SMALL) - bForceCrv1Cut = ( bCrv1OnExtr and not bCrv2OnExtr) - - if bForceCrv1Cut then - return bInters, bForceCrv1Cut -- true, true - end + local bCrv1OnExtr = ( dPar1 < 10 * GEO.EPS_SMALL or abs( dPar1 - dParE1) < 10 * GEO.EPS_SMALL) + local bCrv2OnExtr = ( dPar2 < 10 * GEO.EPS_SMALL or abs( dPar2 - dParE2) < 10 * GEO.EPS_SMALL) + bForceCrv1Cut = ( bCrv1OnExtr and not bCrv2OnExtr) + + if bForceCrv1Cut then + return bInters, bForceCrv1Cut -- true, true end end end From 6117583a794d43a503e50e17d2a7ad525e95b729 Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 1 Feb 2023 11:03:24 +0100 Subject: [PATCH 65/79] 3dPrinting : - aggiunto offset lead point anche per shell interne quando non ci sono collegamenti. --- LuaLibs/CalcToolPath.lua | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 01732cf..eade0d3 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -169,6 +169,30 @@ local function AddLink( vCrv, nTpathGrpId, nLinkType, dLinkParam, dSPOffs, dStra end end +--------------------------------------------------------------------- +local function AddOffsetLeadPoint( vIds, nFirstCopy, dOffsetLP, nLinkType) + + -- se link va fatto solo sulla shell esterna + local nLast = EgtIf( nLinkType == LINK_TYPE.NONE, #vIds, 1) + + if abs( dOffsetLP) > GEO.EPS_SMALL then + for i = 1, nLast do + if dOffsetLP > GEO.EPS_SMALL then + -- taglio curva + EgtTrimCurveStartAtLen( vIds[i], dOffsetLP) + else + -- è necessario aggiungere un tratto + local nAddCrv = EgtCopyGlob( EgtIf( i == 1, nFirstCopy, vIds[i]), vIds[1], GDB_IN.AFTER) + EgtTrimCurveStartAtLen( nAddCrv, EgtCurveLength( nAddCrv) - abs( dOffsetLP)) + EgtAddCurveCompoCurve( vIds[i], nAddCrv, true, false) + end + end + end + + -- elimino curva aux usata per prima shell + EgtErase( nFirstCopy) +end + -------------------------------------------------------------------- local function AddLeadIn( nCrvId, LayerParams, nGrpId) @@ -353,20 +377,13 @@ local function CalcShellsToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ) -- aggiungo le curve nel toolpath local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, LayerParams.nOrder, LayerParams.bInvert, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) - local nFirstCopy = EgtCopyGlob( vIds[1], nTpathGrpId) + local nFirstCopy = EgtCopyGlob( vIds[1], nTpathGrpId) -- necessaria per corretto offset lead point sulla shell esterna -- aggiungo gli opportuni raccordi AddLink( vIds, nTpathGrpId, LayerParams.nLinkType, LayerParams.dLinkParam, LayerParams.dSPOffs, LayerParams.dStrand, LayerParams.vtSlicing) - -- offset lead point curva iniziale - if LayerParams.dOffsetLP > - GEO.EPS_SMALL then - EgtTrimCurveStartAtLen( vIds[1], LayerParams.dOffsetLP) - EgtErase( nFirstCopy) - else - -- devi aggiungere un tratto di curva - EgtTrimCurveStartAtLen( nFirstCopy, EgtCurveLength( nFirstCopy) - abs( LayerParams.dOffsetLP)) - EgtAddCurveCompoCurve( vIds[1], nFirstCopy, true, false) - end + -- offset lead point + AddOffsetLeadPoint( vIds, nFirstCopy, LayerParams.dOffsetLP, LayerParams.nLinkType) -- aggiungo leadin/leadout if LayerParams.nLeadInType ~= LEAD_TYPE.NONE then From b020c855e3319327d1ed99f3bc3c2e508adc8d40 Mon Sep 17 00:00:00 2001 From: DarioS Date: Thu, 2 Feb 2023 09:21:22 +0100 Subject: [PATCH 66/79] 3dPrinting : - correzione errore nei setti. --- LuaLibs/CalcPaths.lua | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 41d1697..d3d884f 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -598,11 +598,13 @@ local function ComputeRibsOrientedOffset( nRibsGrp, dStrand) else nNewId = EgtOffsetCurveAdv( vIds[i], - dOffs + k * dStrand) end - EgtSetName( nNewId, sName) - EgtSetInfo( nNewId, KEY_TYPE, TYPE.RIB) - EgtSetInfo( nNewId, KEY_ORIGINAL_RIB, vIds[i]) - EgtRelocateGlob( nNewId, nOffsGrp) - table.insert( vOffs, nNewId) + if nNewId then + EgtSetName( nNewId, sName) + EgtSetInfo( nNewId, KEY_TYPE, TYPE.RIB) + EgtSetInfo( nNewId, KEY_ORIGINAL_RIB, vIds[i]) + EgtRelocateGlob( nNewId, nOffsGrp) + table.insert( vOffs, nNewId) + end end end From 4e85ebda3d752d9c15aab28004cc10714c00db3a Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 2 Feb 2023 11:16:10 +0100 Subject: [PATCH 67/79] 3dPrinting : - piccole migliorie nei setti. --- LuaLibs/CalcPaths.lua | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index d3d884f..235d159 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -511,7 +511,6 @@ end local function TrimRibs( vRibs, nRibsGrp, nSrf, dSrfOffs, vtSlicing) -- costruisco le superfici con cui fare il trim grossolano dei setti - EgtCopyGlob( nSrf, nRibsGrp) local nSrfInt = EgtCopyGlob( nSrf, nRibsGrp) local nSrfExt = EgtCopyGlob( nSrf, nRibsGrp) EgtSurfFrOffset( nSrfInt, dSrfOffs) @@ -553,7 +552,7 @@ end -------------------------------------------------------------------- local function ComputeRibsOrientedOffset( nRibsGrp, dStrand) - + local nOffsGrp = EgtGroup( EgtGetParent( nRibsGrp)) local nCurrRib = EgtGetFirstNameInGroup( nRibsGrp, RIBS_CRV .. '*') @@ -592,12 +591,14 @@ local function ComputeRibsOrientedOffset( nRibsGrp, dStrand) end for k = 0, nShellsNbr - 1 do + local dOffsCurr = dOffs - k * dStrand local nNewId - if bPlusToMinus then - nNewId = EgtOffsetCurveAdv( vIds[i], dOffs - k * dStrand) + if abs( dOffsCurr) < GEO.EPS_SMALL then + nNewId = EgtCopyGlob( vIds[i], nOffsGrp) else - nNewId = EgtOffsetCurveAdv( vIds[i], - dOffs + k * dStrand) + nNewId = EgtOffsetCurveAdv( vIds[i], EgtIf( bPlusToMinus, dOffsCurr, - dOffsCurr)) end + if nNewId then EgtSetName( nNewId, sName) EgtSetInfo( nNewId, KEY_TYPE, TYPE.RIB) From 412d1b15b5a3f7302fc26e2efdfe58d3524d8f4c Mon Sep 17 00:00:00 2001 From: DarioS Date: Thu, 2 Feb 2023 11:54:43 +0100 Subject: [PATCH 68/79] 3dPrinting : - in generazione CN aggiunta restituzione stringa di errore (PRINT.MSG). --- LuaLibs/RunGcodeGenerate.lua | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/LuaLibs/RunGcodeGenerate.lua b/LuaLibs/RunGcodeGenerate.lua index 2258340..03c878d 100644 --- a/LuaLibs/RunGcodeGenerate.lua +++ b/LuaLibs/RunGcodeGenerate.lua @@ -1,4 +1,4 @@ --- RunGcodeGenerate.lua by Egaltech s.r.l. 2022/06/14 +-- RunGcodeGenerate.lua by Egaltech s.r.l. 2023/02/02 -- Calcoli prima fase per Stampa 3d -- Tabella per definizione modulo @@ -106,12 +106,23 @@ function RunGcodeGenerate.Exec() if not EgtApplyMachining() then local nErr, sErr = EgtGetLastMachMgrError() - local sMsg = 'Error applying Extrusion' + local sMsg = '' if nErr == 2803 and string.find( sErr, '(3)', 1, true) then - sMsg = sMsg .. ' (missing Feed & Speed)' + sMsg = ' Missing Feed & Speed.' + elseif nErr == 2804 then + sMsg = ' Axes Values not calculable.' + elseif nErr == 2805 then + sMsg = ' Outstroke Axes (see Log File).' + else + sMsg = ' See Log File.' end EgtResetCurrMachGroup() - EgtOutBox( sMsg, 'GcodeGenerate') + if PRINT and PRINT.PROGRAM == 1 then + PRINT.ERR = 1 + PRINT.MSG = sMsg + else + EgtOutBox( 'Error in Machining :'..sMsg, 'GcodeGenerate') + end return end @@ -147,7 +158,7 @@ function RunGcodeGenerate.Exec() if bGenOk then PRINT.ERR = 0 else - PRINT.ERR = 999 + PRINT.ERR = 2 end else if bGenOk then From 4916da48f9e709c648b8e4b1582080d4b909afd8 Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 10 Feb 2023 10:36:20 +0100 Subject: [PATCH 69/79] 3dPrinting : - modificato calcolo della correzione in z per appoggiare correttamente sulla tavola - correzione quote di slicing per includere setti esterni e unbounded. --- LuaLibs/AddManData.lua | 1 + LuaLibs/CalcPaths.lua | 69 ++++++--- LuaLibs/CalcSlices.lua | 327 +++++++++++++++++++++++++-------------- LuaLibs/CalcToolPath.lua | 157 +++++++++++-------- LuaLibs/RunSlicing.lua | 35 +++-- 5 files changed, 373 insertions(+), 216 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 20e2e12..629201b 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -244,6 +244,7 @@ KEY_SLICE_ADV_MODE = 'SliceAdvMode' KEY_SLICE_ADV_PERC = 'SliceAdvPerc' KEY_MOVED_PART ='MovedPart' +KEY_MOVED_PART2 ='MovedPart2' RESULT = { OK = 1, diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 235d159..7ba16ae 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -511,8 +511,8 @@ end local function TrimRibs( vRibs, nRibsGrp, nSrf, dSrfOffs, vtSlicing) -- costruisco le superfici con cui fare il trim grossolano dei setti - local nSrfInt = EgtCopyGlob( nSrf, nRibsGrp) - local nSrfExt = EgtCopyGlob( nSrf, nRibsGrp) + local nSrfInt = EgtCopyGlob( nSrf, nRibsGrp) or GDB_ID.NULL + local nSrfExt = EgtCopyGlob( nSrf, nRibsGrp) or GDB_ID.NULL EgtSurfFrOffset( nSrfInt, dSrfOffs) EgtSurfFrOffset( nSrfExt, - dSrfOffs) @@ -525,15 +525,31 @@ local function TrimRibs( vRibs, nRibsGrp, nSrf, dSrfOffs, vtSlicing) EgtSetInfo( nCopyRib, KEY_ORIGINAL_RIB_CLOSED, 1) end - local nCrv = nCopyRib - local nCnt = 1 + local nCrv, nCnt if nType == RIB_TYPE.INTERNAL or nType == RIB_TYPE.SUPPORT then - nCrv, nCnt = EgtTrimCurveWithRegion( nCopyRib, nSrfInt, true, true) + if EgtSurfFrChunkCount( nSrfInt) == 0 then + -- se la superficie non esiste, il setto deve essere cancellato + EgtErase( nCopyRib) + nCrv = GDB_ID.NULL + nCnt = 0 + else + nCrv, nCnt = EgtTrimCurveWithRegion( nCopyRib, nSrfInt, true, true) + end elseif nType == RIB_TYPE.EXTERNAL then - nCrv, nCnt = EgtTrimCurveWithRegion( nCopyRib, nSrfExt, false, true) + if EgtSurfFrChunkCount( nSrfExt) == 0 then + -- se la superficie non esiste il setto è valido + nCrv = nCopyRib + nCnt = 1 + else + nCrv, nCnt = EgtTrimCurveWithRegion( nCopyRib, nSrfExt, false, true) + end + else + -- setto unbounded non va tagliato + nCrv = nCopyRib + nCnt = 1 end - -- se errore nel calcolare trim riprendo il setto originario + -- se errore nel calcolare trim ( nCrv = nil) riprendo il setto originario if not nCrv then nCrv = nCopyRib nCnt = 1 @@ -552,7 +568,7 @@ end -------------------------------------------------------------------- local function ComputeRibsOrientedOffset( nRibsGrp, dStrand) - + local nOffsGrp = EgtGroup( EgtGetParent( nRibsGrp)) local nCurrRib = EgtGetFirstNameInGroup( nRibsGrp, RIBS_CRV .. '*') @@ -568,7 +584,7 @@ local function ComputeRibsOrientedOffset( nRibsGrp, dStrand) local nShellsNbr = EgtGetInfo( nCurrRib, KEY_RIBS_SHELLS_NBR, 'i') local dOffs = ( nShellsNbr - 1) * dStrand / 2 - + -- offset di ogni tratto del setto local vOffs = {} local bPlusToMinus = false @@ -667,7 +683,7 @@ local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOff local nType = EgtGetInfo( vIds[i], KEY_RIBS_TYPE, 'i') if not tSurfOffs[nType][nOverlap] then if nType == RIB_TYPE.INTERNAL or nType == RIB_TYPE.SUPPORT then - if nSrfBase then + if nSrfBase ~= GDB_ID.NULL then local dNewOffs = nOverlap / 100 * dStrand local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfBase, nGrp, dNewOffs, vtSlicing) if bOk then @@ -676,13 +692,16 @@ local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOff end end elseif nType == RIB_TYPE.EXTERNAL then - if nSrfExt then + if nSrfExt ~= GDB_ID.NULL then local dNewOffs = dOffs + ( 0.5 - nOverlap / 100) * dStrand local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfExt, nGrp, dNewOffs, vtSlicing) if bOk then tSurfOffs[nType][nOverlap] = nSrfOffs EgtSetName( nSrfOffs, TOT_SHELL_TRIM_SURF) end + else + -- se la superficie non esiste, il setto è sicuramente esterno (è analogo ad unbounded) + tSurfOffs[nType][nOverlap] = GDB_ID.NULL end else tSurfOffs[nType][nOverlap] = GDB_ID.NULL @@ -724,8 +743,13 @@ local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf -- nel caso unbounded l'intersezione può essere ovunque bInters = true elseif nType1 == RIB_TYPE.EXTERNAL or nType2 == RIB_TYPE.EXTERNAL then - -- l'intersezione deve essere esterna - if nSrf2 and EgtSurfFrTestExternal( nSrf2, nPtId) then bInters = true end + if nSrf2 then + -- l'intersezione deve essere esterna + if EgtSurfFrTestExternal( nSrf2, nPtId) then bInters = true end + else + -- se la surf non esiste l'intersezione è sicuramente esterna + bInters = true + end else -- se uno dei due è interno o supporto l'intersezione deve essere interna if nSrf1 and not EgtSurfFrTestExternal( nSrf1, nPtId) then bInters = true end @@ -905,15 +929,15 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa -- calcolo le regioni nella quali ha senso considerare l'intersezione local nSrfOffs1, nSrfOffs2 local bOk, bExists - local nSrf1 = EgtGetFirstNameInGroup( nCrvGrp, TOT_SHELL_TRIM_SURF) - if nSrf1 then + local nSrf1 = EgtGetFirstNameInGroup( nCrvGrp, TOT_SHELL_TRIM_SURF) or GDB_ID.NULL + if nSrf1 ~= GDB_ID.NULL then bOk, bExists, nSrfOffs1 = ComputeSurfOffset( nSrf1, nCrvGrp, 2 * LayerParams.dStrand, LayerParams.vtSlicing) if not bOk or not bExists then nSrfOffs1 = EgtCopyGlob( nSrf1, nCrvGrp) end end - local nSrf2 = EgtGetFirstNameInGroup( nCrvGrp, LAYER_SRF) - if nSrf2 then + local nSrf2 = EgtGetFirstNameInGroup( nCrvGrp, LAYER_SRF) or GDB_ID.NULL + if nSrf2 ~= GDB_ID.NULL then bOk, bExists, nSrfOffs2 = ComputeSurfOffset( nSrf2, nCrvGrp, - 2 * LayerParams.dStrand, LayerParams.vtSlicing) if not bOk or not bExists then nSrfOffs2 = EgtCopyGlob( nSrf2, nCrvGrp) @@ -1473,11 +1497,11 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) end -- recupero le superfici - local nSrfBase = EgtGetFirstNameInGroup( nCrvGrp, TOT_SHELL_TRIM_SURF) - local nSrfExt = EgtGetFirstNameInGroup( nCrvGrp, LAYER_SRF) + local nSrfBase = EgtGetFirstNameInGroup( nCrvGrp, TOT_SHELL_TRIM_SURF) or GDB_ID.NULL + local nSrfExt = EgtGetFirstNameInGroup( nCrvGrp, LAYER_SRF) or GDB_ID.NULL -- trim grossolano dei setti - local nTrimGrp = TrimRibs( vOrigRibs, nRibsGrp, nSrfExt, LayerParams.dOffs, LayerParams.vtSlicing) + local nTrimGrp = TrimRibs( vOrigRibs, nRibsGrp, nSrfExt, LayerParams.dOffs + LayerParams.dStrand, LayerParams.vtSlicing) -- calcolo offset orientati local nOffsGrp = ComputeRibsOrientedOffset( nTrimGrp, LayerParams.dStrand) @@ -1518,7 +1542,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) else local nCrv, nCnt if tSurfOffs[nType][nOverlap] == GDB_ID.NULL then - -- caso unbounded + -- caso unbounded o esterno in assenza di solido nCrv = nCrvId nCnt = 1 else @@ -1560,7 +1584,6 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) EgtSetInfo( nCrv + nInd, KEY_SPLIT_AFTER_TRIM_TOT, nCnt) end end - end end end @@ -2108,7 +2131,7 @@ function CalcPaths.Exec( nPartId) local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER.."*") if not vLayIds then EgtOutBox( 'Error no slice', 'PathCalc') - return + return end -- recupero i parametri per calcolo dei path diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 049d8df..60c4195 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -16,12 +16,8 @@ local AMD = require( 'AddManData') local s_nPartId --------------------------------------------------------------------- -local function ComputeZSlices( dZmin, dDeltaZ, dZmax) - local dSliceStep = EgtGetInfo( s_nPartId, KEY_SLICE_STEP, 'd') or 10000 - if dSliceStep < GEO.EPS_SMALL then - EgtOutLog( 'Warning : SliceStep is 0') - return - end +local function ComputeZSlices( dSliceStep, dZmin, dDeltaZ, dZmax) + local ptSlices = { dZmin + dDeltaZ} local dPosZ = dZmin + dSliceStep while dPosZ < dZmax do @@ -32,9 +28,15 @@ local function ComputeZSlices( dZmin, dDeltaZ, dZmax) end -------------------------------------------------------------------- -local function ComputeMaxH( nStmId, frSlicing, HMax) +local function ComputeMaxH( vIds, frSlicing, HMax, dSliceStep) + + -- calcolo il box globale + local b3BoxGlob = BBox3d() + for i = 1, #vIds do + local b3Box = EgtGetBBoxGlob( vIds[i], GDB_BB.STANDARD) + b3BoxGlob:Add( b3Box) + end - local b3BoxGlob = EgtGetBBoxGlob( nStmId, GDB_BB.STANDARD) if b3BoxGlob:getMax():getZ() < b3BoxGlob:getMin():getZ() + HMax + GEO.EPS_SMALL then return GEO.INFINITO end @@ -43,17 +45,27 @@ local function ComputeMaxH( nStmId, frSlicing, HMax) return HMax else -- se slicing inclinato - local nGrpTmp = EgtGroup( EgtGetParent( nStmId)) - local nNewId, nPnt, nCrv, nSrf = EgtPlaneSurfTmInters( Point3d( 0, 0, HMax), Z_AX(), nStmId, nGrpTmp) - if not nNewId then - return GEO.INFINITO + local nGrpTmp = EgtGroup( s_nPartId) + for i = 1, #vIds do + EgtPlaneSurfTmInters( Point3d( 0, 0, HMax), Z_AX(), vIds[i], nGrpTmp, GDB_RT.GLOB) end local b3Box = EgtGetBBoxGlob( nGrpTmp, GDB_BB.STANDARD) EgtErase( nGrpTmp) + if not b3Box then + return GEO.INFINITO + end local ptMin = b3Box:getMin() + local ptMax = b3Box:getMax() + -- la quota dell'ultimo slice è più bassa di dSliceStep rispetto alla quota dell'ultimo toolpath + -- ( andrebbe anche considerata dCorrZ) + ptMin = ptMin - dSliceStep * frSlicing:getVersZ() + ptMax = ptMax - dSliceStep * frSlicing:getVersZ() ptMin:toLoc( frSlicing) - return ptMin:getZ() + ptMax:toLoc( frSlicing) + + return min( ptMin:getZ(), ptMax:getZ()) end + return GEO.INFINITO end @@ -93,31 +105,38 @@ local function AdjustAuxSolids( nSolidsLay) end -------------------------------------------------------------------- -local function ReadParam( nId, sKey, sType, table, defVal) +local function ReadParam( nId, sKey, sType, defVal, table) + -- verifico se info nell'oggetto specifico local info = EgtGetInfo( nId, sKey, sType) + -- altrimenti recupero info dai parametri generali if info == nil then info = EgtGetInfo( s_nPartId, sKey, sType) end + -- o assegno valore di default if info == nil then info = defVal end - table[sKey] = info + + -- se presente, inserisco l'info nella tabella + if table then table[sKey] = info end + + return info end -------------------------------------------------------------------- local function GetRibParams( nId) local RibParam = {} - ReadParam( nId, KEY_RIBS_SHELLS_NBR, 'i', RibParam) - ReadParam( nId, KEY_RIBS_INVERT_DIR, 'b', RibParam) - ReadParam( nId, KEY_RIBS_LEAD_IN_INVERT, 'b', RibParam) - ReadParam( nId, KEY_RIBS_LEAD_IN_LEN, 'd', RibParam) - ReadParam( nId, KEY_RIBS_LEAD_OUT_INVERT, 'b', RibParam) - ReadParam( nId, KEY_RIBS_LEAD_OUT_LEN, 'd', RibParam) - ReadParam( nId, KEY_RIBS_LEAD_OUT_COASTING, 'd', RibParam) - ReadParam( nId, KEY_RIBS_LEAD_OUT_WIPE, 'd', RibParam) - ReadParam( nId, KEY_RIBS_LEAD_OUT_WIPE_DIR, 'd', RibParam) - ReadParam( nId, KEY_RIBS_OVERLAP, 'i', RibParam) - ReadParam( nId, KEY_RIBS_LINK, 'b', RibParam) - ReadParam( nId, KEY_RIBS_TYPE, 'i', RibParam, RIB_TYPE.INTERNAL) - ReadParam( nId, KEY_RIBS_INVERT_STRAND_ORDER, 'b', RibParam) - + ReadParam( nId, KEY_RIBS_SHELLS_NBR, 'i', 0, RibParam) + ReadParam( nId, KEY_RIBS_INVERT_DIR, 'b', false, RibParam) + ReadParam( nId, KEY_RIBS_LEAD_IN_INVERT, 'b', false, RibParam) + ReadParam( nId, KEY_RIBS_LEAD_IN_LEN, 'd', 0, RibParam) + ReadParam( nId, KEY_RIBS_LEAD_OUT_INVERT, 'b', false, RibParam) + ReadParam( nId, KEY_RIBS_LEAD_OUT_LEN, 'd', 0, RibParam) + ReadParam( nId, KEY_RIBS_LEAD_OUT_COASTING, 'd', 0, RibParam) + ReadParam( nId, KEY_RIBS_LEAD_OUT_WIPE, 'd', 0, RibParam) + ReadParam( nId, KEY_RIBS_LEAD_OUT_WIPE_DIR, 'd', 0, RibParam) + ReadParam( nId, KEY_RIBS_OVERLAP, 'i', 0, RibParam) + ReadParam( nId, KEY_RIBS_LINK, 'b', false, RibParam) + ReadParam( nId, KEY_RIBS_TYPE, 'i', RIB_TYPE.INTERNAL, RibParam) + ReadParam( nId, KEY_RIBS_INVERT_STRAND_ORDER, 'b', false, RibParam) + return RibParam end @@ -125,10 +144,10 @@ end local function GetShellNumberParams( nId) local ShellNumberParam = {} - ReadParam( nId, KEY_SHELL_NBR_DIFF, 'i', ShellNumberParam) - ReadParam( nId, KEY_SHELL_NBR_COASTING, 'd', ShellNumberParam) - ReadParam( nId, KEY_SHELL_NBR_WIPE, 'd', ShellNumberParam) - ReadParam( nId, KEY_SHELL_NBR_WIPE_DIR, 'd', ShellNumberParam) + ReadParam( nId, KEY_SHELL_NBR_DIFF, 'i', 0, ShellNumberParam) + ReadParam( nId, KEY_SHELL_NBR_COASTING, 'd', 0, ShellNumberParam) + ReadParam( nId, KEY_SHELL_NBR_WIPE, 'd', 0, ShellNumberParam) + ReadParam( nId, KEY_SHELL_NBR_WIPE_DIR, 'd', 0, ShellNumberParam) return ShellNumberParam end @@ -137,16 +156,15 @@ end local function GetAuxSolidsParams( nId) local AuxSolidsParam = {} - ReadParam( nId, KEY_AUX_SOLIDS_OVERLAP, 'i', AuxSolidsParam) - ReadParam( nId, KEY_AUX_SOLIDS_LINK_PARAM, 'd', AuxSolidsParam) - ReadParam( nId, KEY_AUX_SOLIDS_SP_OFFSET, 'd', AuxSolidsParam) - ReadParam( nId, KEY_AUX_SOLIDS_COASTING_LEN, 'd', AuxSolidsParam) - ReadParam( nId, KEY_AUX_SOLIDS_WIPE_LEN, 'd', AuxSolidsParam) - ReadParam( nId, KEY_AUX_SOLIDS_WIPE_DIR, 'd', AuxSolidsParam) - - ReadParam( nId, KEY_AUX_SOLIDS_INFILL, 'i', AuxSolidsParam) - ReadParam( nId, KEY_AUX_SOLIDS_PRINT_ORDER, 'i', AuxSolidsParam) - ReadParam( nId, KEY_AUX_SOLIDS_LINK_TYPE, 'i', AuxSolidsParam) + ReadParam( nId, KEY_AUX_SOLIDS_OVERLAP, 'i', 0, AuxSolidsParam) + ReadParam( nId, KEY_AUX_SOLIDS_LINK_PARAM, 'd', 0, AuxSolidsParam) + ReadParam( nId, KEY_AUX_SOLIDS_SP_OFFSET, 'd', 0, AuxSolidsParam) + ReadParam( nId, KEY_AUX_SOLIDS_COASTING_LEN, 'd', 0, AuxSolidsParam) + ReadParam( nId, KEY_AUX_SOLIDS_WIPE_LEN, 'd', 0, AuxSolidsParam) + ReadParam( nId, KEY_AUX_SOLIDS_WIPE_DIR, 'd', 0, AuxSolidsParam) + ReadParam( nId, KEY_AUX_SOLIDS_INFILL, 'i', INFILL_TYPE.NONE, AuxSolidsParam) + ReadParam( nId, KEY_AUX_SOLIDS_PRINT_ORDER, 'i', PRINT_ORDER.EXT_INT, AuxSolidsParam) + ReadParam( nId, KEY_AUX_SOLIDS_LINK_TYPE, 'i', LINK_TYPE.NONE, AuxSolidsParam) return AuxSolidsParam end @@ -253,7 +271,7 @@ local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName) end nLayId = EgtGetNextName( nLayId, SLICE_LAYER .. '*') end - + return true end @@ -268,88 +286,88 @@ local function ValueInArray( vArr, nValue) end --------------------------------------------------------------------- -function CalcSlices.Exec( nPartId, nStmId, HMax) +local function SlicingNoSolid( nRibsLay, vZSlices, dDeltaZStart, dZmin, frSlicing) + + local vErr = {} + local vtSlicing = frSlicing:getVersZ() + + -- contatore per il calcolo delle intersezioni + if EgtProcessEvents( 100, 0) == 1 then return end + -- creo i layer dello slicing + for i = 1, #vZSlices do + local nLayGrp = EgtGroup( s_nPartId) + EgtSetName( nLayGrp, SLICE_LAYER .. tostring( i)) + + local dDeltaZ = EgtIf( i == 1, dDeltaZStart, 0) + local dPosZ = vZSlices[i]- dDeltaZ + EgtSetInfo( nLayGrp, KEY_SLICE_Z, dPosZ - dZmin) + EgtSetInfo( nLayGrp, KEY_SLICE_REAL_Z, dPosZ) + EgtSetInfo( nLayGrp, KEY_SLICE_DELTAZ, dDeltaZ) + EgtSetInfo( nLayGrp, KEY_SLICE_NBR, i) + + local nGrpCrv = EgtGroup( nLayGrp) + EgtSetName( nGrpCrv, CONTOUR_GRP .. EgtNumToString( 0)) + end + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + 20, 0) == 1 then return end + + -- slicing dei setti + SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV) + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + 100, 0) == 1 then return end + + return vErr +end + +--------------------------------------------------------------------- +local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing) + -- costanti local TOLER = 0.05 local MID_TOLER = 0.1 local BIG_TOLER = 2.0 local MIN_LEN = 20.0 local MIN_AREA = 25.0 - - s_nPartId = nPartId - - -- recupero la direzione dello slicing - local vtSlicing = Z_AX() - local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') - if nSlicingType == SLICING_TYPE.DEG45_X then - vtSlicing = VectorFromSpherical( 1, 45, 0) - elseif nSlicingType == SLICING_TYPE.DEG45_Y then - vtSlicing = VectorFromSpherical( 1, 45, -90) - elseif nSlicingType == SLICING_TYPE.HORIZONTAL then - vtSlicing = X_AX() - end - - EgtSetInfo( s_nPartId, KEY_SLICING_DIR, vtSlicing) - local frSlicing = Frame3d( ORIG(), vtSlicing) - - -- recupero il box della superficie - local b3Box = EgtGetBBoxRef( nStmId, GDB_BB.STANDARD, frSlicing) - if not b3Box or b3Box:isEmpty() then - EgtOutText( 'La superficie selezionata è vuota') - EgtPause( 1000) - return - end - - -- Parametri di slicing - local dZmin = b3Box:getMin():getZ() - local dZmax = b3Box:getMax():getZ() - local dMaxH = ComputeMaxH( nStmId, frSlicing, HMax) - dZmax = min( dZmax, dMaxH) - --dZmin = 708 - --dZmax = 712 - - -- Eseguo slicing - local nLayCnt = 1 - local nRecalc = 0 - local dDeltaZStart = 0.2 - --dDeltaZStart = 0 - - local vZSlices = ComputeZSlices( dZmin, dDeltaZStart, dZmax) - if EgtProcessEvents( 1, 0) == 1 then return end - local nLayId = EgtParPlanesSurfTmInters( ORIG(), vtSlicing, vZSlices, nStmId, nPartId, GDB_RT.GLOB, TOLER) - if EgtProcessEvents( 100, 0) == 1 then return end local vErr = {} + local vtSlicing = frSlicing:getVersZ() + + -- calcolo delle intersezioni + if EgtProcessEvents( 1, 0) == 1 then return end + local nLayId = EgtParPlanesSurfTmInters( ORIG(), vtSlicing, vZSlices, nStmId, s_nPartId, GDB_RT.GLOB, TOLER) + if EgtProcessEvents( 100, 0) == 1 then return end + local vPrevCen = {} + local nLayCnt = 1 + -- scorro i risultati dello slicing while nLayId do - local dDeltaZ = EgtIf( nLayCnt == 1, dDeltaZStart, 0) + local dDeltaZ = EgtIf( nLayCnt == 1, dDeltaZStart, 0) local dPosZ = vZSlices[nLayCnt]- dDeltaZ EgtSetInfo( nLayId, KEY_SLICE_Z, dPosZ - dZmin) EgtSetInfo( nLayId, KEY_SLICE_REAL_Z, dPosZ) EgtSetInfo( nLayId, KEY_SLICE_NBR, nLayCnt) - -- verifico se necessario ricalcolo - local nId = EgtGetLastInGroup( nLayId) - local bRecalc = not nId + -- verifico se necessario ricalcolo + local nId = EgtGetLastInGroup( nLayId) + local bRecalc = not nId local vtRecalc + local nRecalc = 0 while nId and not bRecalc do local nType = EgtGetType( nId) if nType == GDB_TY.SRF_MESH then - bRecalc = true + bRecalc = true vtRecalc = EgtSurfTmFacetNormVersor( nId, 0) elseif nType == GDB_TY.GEO_POINT then - bRecalc = true + bRecalc = true end nId = EgtGetPrev( nId) end - -- eseguo eventuale ricalcolo + -- eseguo eventuale ricalcolo ::RECALC:: if bRecalc then nRecalc = nRecalc + 1 - EgtEmptyGroup( nLayId) + EgtEmptyGroup( nLayId) dDeltaZ = dDeltaZ + EgtIf( vtRecalc and vtRecalc:getZ() > 0, -0.01, 0.01) -- eseguo il ricalcolo solo a quella quota EgtPlaneSurfTmInters( ORIG() + ( dPosZ + dDeltaZ) * vtSlicing, vtSlicing, nStmId, nLayId, GDB_RT.GLOB, TOLER) @@ -369,7 +387,7 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) -- correggo eventuali spostamenti in Z if abs( dDeltaZ) > GEO.EPS_SMALL then EgtMove( nId, - dDeltaZ * vtSlicing) - end + end -- verifico presenza contorni aperti if EgtCurveIsClosed( nId) then table.insert( vClosedId, nId) @@ -419,19 +437,19 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) table.remove( vClosedId, i) end end - + -- se necessario e possibile, torno a ricalcolo if not bAllClosed and nRecalc < 2 then bRecalc = true goto RECALC end - + -- imposto dati ausiliari EgtSetName( nLayId, EgtIf( bAllClosed, '', '__') .. SLICE_LAYER .. EgtNumToString( nLayCnt)) EgtSetInfo( nLayId, 'CrvCnt', #vClosedId + #vOpenId) EgtSetColor( vClosedId or {}, 'TEAL') 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 @@ -441,7 +459,7 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) end EgtErase( nGrp) local nSurfFR, nSrfNbr = EgtSurfFlatRegion( nLayId, vClosedId) - + if nSurfFR then -- verifico orientamento della normale local vtN = EgtSurfFrNormVersor( nSurfFR, GDB_ID.ROOT) @@ -530,9 +548,10 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) end end else + local bErr = true -- se nessuna curva - if #vClosedId == 0 then + if #vClosedId == 0 and #vOpenId == 0 then bErr = false -- se una sola curva, ne verifico larghezza media elseif #vClosedId == 1 then @@ -540,29 +559,34 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) local _, _, dArea = EgtCurveArea( vClosedId[1]) if not dArea or dArea / dLen < MID_TOLER then bErr = false end end - -- cambio nome al layer - EgtSetName( nLayId, '__' .. SLICE_LAYER .. EgtNumToString( nLayCnt)) + -- se vero errore lo segnalo if bErr then table.insert( vErr, nLayCnt) + -- cambio nome al layer + EgtSetName( nLayId, '__' .. SLICE_LAYER .. EgtNumToString( nLayCnt)) + else + -- altrimenti creo il CrvGrp da utilizzare nel CalcPath + local nGrpCrv = EgtGroup( nLayId) + EgtSetName( nGrpCrv, CONTOUR_GRP .. EgtNumToString( 1)) end - end - + end + -- passo al layer successivo if EgtProcessEvents( EgtIf( PRINT, 100, 0) + nLayCnt / ( #vZSlices + 3) * 100, 0) == 1 then EgtDraw() - return + return end - nLayCnt = nLayCnt + 1 + nLayCnt = nLayCnt + 1 nLayId = EgtGetNext( nLayId) end - + local bSpiralVase = EgtGetInfo( s_nPartId, KEY_SPIRAL_VASE, 'b') or false if not bSpiralVase then -- costolature local nRibsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_RIBS) if nRibsLay then - SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV) + SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV) end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 1) / ( #vZSlices + 3) * 100, 0) == 1 then return end @@ -582,10 +606,87 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 3) / ( #vZSlices + 3) * 100, 0) == 1 then return end end - -- eventuale segnalazione errori - if #vErr > 0 then - EgtOutBox( 'Slicing Error on layers :\n' .. table.concat( vErr, ','), 'SlicingCalc') + return vErr +end + +--------------------------------------------------------------------- +function CalcSlices.Exec( nPartId, nStmId, HMax) + + s_nPartId = nPartId + + -- recupero la direzione dello slicing + local vtSlicing = Z_AX() + local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') + if nSlicingType == SLICING_TYPE.DEG45_X then + vtSlicing = VectorFromSpherical( 1, 45, 0) + elseif nSlicingType == SLICING_TYPE.DEG45_Y then + vtSlicing = VectorFromSpherical( 1, 45, -90) + elseif nSlicingType == SLICING_TYPE.HORIZONTAL then + vtSlicing = X_AX() end + + EgtSetInfo( s_nPartId, KEY_SLICING_DIR, vtSlicing) + local frSlicing = Frame3d( ORIG(), vtSlicing) + + -- recupero la superficie ed eventuali setti esterni/unbounded da usare come riferimenti per quote slicing + local vRefIds = {} + if nStmId then table.insert( vRefIds, nStmId) end + local nRibsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_RIBS) + local vRibsIds = EgtGetAllInGroup( nRibsLay) + for i = 1, #vRibsIds do + if EgtGetType( vRibsIds[i]) == GDB_TY.SRF_MESH then + local nType = ReadParam( vRibsIds[i], KEY_RIBS_TYPE, 'i', RIB_TYPE.INTERNAL) + if nType == RIB_TYPE.EXTERNAL or nType == RIB_TYPE.UNBOUNDED then + table.insert( vRefIds, vRibsIds[i]) + end + end + end + + -- recupero il box + local b3Box = BBox3d() + for i = 1, #vRefIds do + local b3Tmp = EgtGetBBoxRef( vRefIds[i], GDB_BB.STANDARD, frSlicing) + b3Box:Add( b3Tmp) + end + if not b3Box or b3Box:isEmpty() then + EgtOutBox( "No part to be sliced!", 'Error', 'ERROR') + return + end + + -- Parametri di slicing + local dSliceStep = EgtGetInfo( s_nPartId, KEY_SLICE_STEP, 'd') or 10000 + if dSliceStep < GEO.EPS_SMALL then + EgtOutLog( 'Warning : SliceStep is 0') + return + end + + local dZmin = b3Box:getMin():getZ() + local dZmax = b3Box:getMax():getZ() + local dMaxH = ComputeMaxH( vRefIds, frSlicing, HMax, dSliceStep) + dZmax = min( dZmax, dMaxH) + --dZmin = 708 + --dZmax = 712 + + -- Eseguo slicing + local nLayCnt = 1 + local nRecalc = 0 + local dDeltaZStart = 0.2 + + local vZSlices = ComputeZSlices( dSliceStep, dZmin, dDeltaZStart, dZmax) + + local vErr + if not nStmId then + -- caso senza solido e solo setti + vErr = SlicingNoSolid( nRibsLay, vZSlices, dDeltaZStart, dZmin, frSlicing) + else + -- caso con solido + vErr = SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing) + end + + -- eventuale segnalazione errori + if vErr and #vErr > 0 then + EgtOutBox( 'Slicing Error on layers :\n' .. table.concat( vErr, ','), 'SlicingCalc') + end end --------------------------------------------------------------------- diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index eade0d3..15811ae 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -46,24 +46,49 @@ local function GetLayerParamsForToolPathCalc() return LayerParams end --------------------------------------------------------------------- -local function ComputeZCorrection( LayerParams) - -- direzione dell'estrusore - local vtN = LayerParams.vtSlicing - local dNxy = sqrt( vtN:getX() * vtN:getX() + vtN:getY() * vtN:getY()) - local dNz = vtN:getZ() - -- altezza necessaria per ugello - s_dHMin = LayerParams.dTDiam / 2 * dNxy - -- correzione per l'offset - local dCorr1 = LayerParams.dOffs * dNxy - -- correzione per il diametro dell'ugello - local dCorr2 = ( LayerParams.dOffs - LayerParams.dStrand / 2 + LayerParams.dTDiam / 2) * dNxy - LayerParams.dLayHeight * dNz - -- massimo tra le due - return max( dCorr1, dCorr2) +------------------------------------------------------------------ +local function ComputeToolPathBox( nTpathGrpId) + + -- calcolo il box del toolpath (escludendo i wipe) + local b3Box = BBox3d() + local nEntId = EgtGetFirstInGroup( nTpathGrpId) + while nEntId do + if EgtGetInfo( nEntId, KEY_TYPE, 'i') ~= TYPE.WIPE then + local b3Ent = EgtGetBBoxGlob( nEntId, GDB_BB.STANDARD) + b3Box:Add( b3Ent) + end + nEntId = EgtGetNext( nEntId) + end + + return b3Box +end + +------------------------------------------------------------------ +local function AddZCorrection( b3Box, LayerParams) + + 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 + local dHStrand = 0.5 * LayerParams.dStrand * dNxy + LayerParams.dLayHeight * dNz + -- altezza necessaria per il tool + local dHTool = s_dHMin + -- altezza disponibile + local dHDisp = b3Box:getMin():getZ() + + local dCorrZ = max( 0, max( dHStrand, dHTool) - dHDisp) + + -- applico la correzione al pezzo + local vtMove = dCorrZ * Z_AX() + EgtMove( s_nPartId, vtMove, GDB_RT.GLOB) + EgtSetInfo( s_nPartId, KEY_MOVED_PART2, vtMove) + -- correggo la posizione del riferimento + local nFrameId = EgtGetFirstNameInGroup( s_nPartId, LAY_FRAME) + EgtMove( nFrameId, - vtMove, GDB_RT.GLOB) + end ------------------------------------------------------------------- -local function AddCurvesToToolPath( vEntIds, nTpathGrpId, nOrder, bInvert, vtSlicing, dLayHeight, dCorrZ) +local function AddCurvesToToolPath( vEntIds, nTpathGrpId, nOrder, bInvert, vtSlicing, dLayHeight) local vIds = {} -- vettore con gli id ordinati delle curve nel gruppo dei ToolPath @@ -79,8 +104,6 @@ local function AddCurvesToToolPath( vEntIds, nTpathGrpId, nOrder, bInvert, vtSli vIds[nIdx] = EgtCopyGlob( vEntIds[i], vIds[nIdx-1], GDB_IN.AFTER) end - -- correggo posizione in Z ( per essere sicuri di appoggiare sul piano) - EgtMove( vIds[nIdx], dCorrZ * Z_AX(), GDB_RT.GLOB) -- mi sposto dell'altezza layer EgtMove( vIds[nIdx], dLayHeight * vtSlicing, GDB_RT.GLOB) @@ -371,12 +394,12 @@ local function AddRetractionOnLastCrv( nCrvId, nTpathGrpId, LayerParams, dCoasti end --------------------------------------------------------------------- -local function CalcShellsToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ) +local function CalcShellsToolPath( vEntIds, nTpathGrpId, LayerParams) if not vEntIds then return end -- aggiungo le curve nel toolpath - local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, LayerParams.nOrder, LayerParams.bInvert, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) + local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, LayerParams.nOrder, LayerParams.bInvert, LayerParams.vtSlicing, LayerParams.dLayHeight) local nFirstCopy = EgtCopyGlob( vIds[1], nTpathGrpId) -- necessaria per corretto offset lead point sulla shell esterna -- aggiungo gli opportuni raccordi @@ -407,11 +430,11 @@ local function CalcShellsToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ) end --------------------------------------------------------------------- -local function CalcExtraShellToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ) +local function CalcExtraShellToolPath( vEntIds, nTpathGrpId, LayerParams) if not vEntIds then return end -- aggiungo le curve nel toolpath - local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, PRINT_ORDER.EXT_INT, false, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) + local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, PRINT_ORDER.EXT_INT, false, LayerParams.vtSlicing, LayerParams.dLayHeight) -- aggiungo gli opportuni raccordi local sPrevName = EgtGetName( vIds[1]) @@ -462,11 +485,11 @@ local function CalcExtraShellToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ end --------------------------------------------------------------------- -local function CalcInfillToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ) +local function CalcInfillToolPath( vEntIds, nTpathGrpId, LayerParams) if not vEntIds then return end -- aggiungo le curve nel toolpath - local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, LayerParams.nOrder, LayerParams.bInvert, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) + local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, LayerParams.nOrder, LayerParams.bInvert, LayerParams.vtSlicing, LayerParams.dLayHeight) -- aggiungo eventuali link AddLink( vIds, nTpathGrpId, LayerParams.nLinkType, LayerParams.dLinkParam, LayerParams.dSPOffs, LayerParams.dStrand, LayerParams.vtSlicing) @@ -481,7 +504,7 @@ local function CalcInfillToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ) end --------------------------------------------------------------------- -local function CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGrpId, LayerParams, dCorrZ) +local function CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGrpId, LayerParams) if not nAuxSolidsGrp or not nAuxSolidsPathGrp then return end @@ -507,7 +530,7 @@ local function CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGr local dWipeDir = EgtGetInfo( nSolidId, KEY_AUX_SOLIDS_WIPE_DIR, 'd') -- copio i percorsi nel gruppo toolpath - local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, nOrder, LayerParams.bInvert, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) + local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, nOrder, LayerParams.bInvert, LayerParams.vtSlicing, LayerParams.dLayHeight) -- aggiungo link AddLink( vIds, nTpathGrpId, nLinkType, dLinkParam, dSPOffset, LayerParams.dStrand, LayerParams.vtSlicing) @@ -580,8 +603,8 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlic local nCrvId = EgtGetFirstNameInGroup( nLoopGrp, TRIM_SURF_LOOP) -- recupero la curva di offset su cui calcolare link while nCrvId do - local dParS = EgtCurveParamAtPoint( nCrvId, ptS) - local dParE = EgtCurveParamAtPoint( nCrvId, ptE) + local dParS = EgtCurveParamAtPoint( nCrvId, ptS, 10 * GEO.EPS_SMALL) + local dParE = EgtCurveParamAtPoint( nCrvId, ptE, 10 * GEO.EPS_SMALL) if dParS and dParE then local bInvert = false local bClosed = EgtCurveIsClosed( nCrvId) @@ -966,7 +989,7 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n end --------------------------------------------------------------------- -local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) +local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams) if not nRibsGrp then return end @@ -979,8 +1002,6 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) for i = 1, #vEntIds do -- copio entità nel gruppo toolpath local nNewEntId = EgtCopyGlob( vEntIds[i], nTpathGrpId, GDB_IN.LAST_SON) - -- correggo posizione in Z ( per essere sicuri di appoggiare sul piano) - EgtMove( nNewEntId, dCorrZ * Z_AX(), GDB_RT.GLOB) -- mi sposto dell'altezza layer EgtMove( nNewEntId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) EgtModifyCurveExtrusion( nNewEntId, LayerParams.vtSlicing, GDB_RT.GLOB) @@ -991,14 +1012,12 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) local nLoopGrp = EgtGetFirstGroupInGroup( nRibsGrp) local vLoopIds = EgtGetAllInGroup( nLoopGrp) for i = 1, #vLoopIds do - EgtMove( vLoopIds[i], dCorrZ * Z_AX(), GDB_RT.GLOB) EgtMove( vLoopIds[i], LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) end -- posizono alla quota corretta le superfici usate per i trim local vSrfIds = EgtGetNameInGroup( nRibsGrp, TOT_SHELL_TRIM_SURF) or {} for i = 1, #vSrfIds do - EgtMove( vSrfIds[i], dCorrZ * Z_AX(), GDB_RT.GLOB) EgtMove( vSrfIds[i], LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) end @@ -1100,7 +1119,7 @@ local function AddSpiralVaseLeadOut( nOldId, LayerParams) end --------------------------------------------------------------------- -local function SpiralVase( vLayIds, dCorrZ, LayerParams) +local function SpiralVase( vLayIds, LayerParams) local nOldId, nOldPathId local bFirst = true @@ -1120,6 +1139,7 @@ local function SpiralVase( vLayIds, dCorrZ, LayerParams) EgtSetInfo( nNewLay, KEY_SLICE_Z, dZOld + LayerParams.dLayHeight) end + local b3Tot = BBox3d() -- ciclo sui layer for nIdx = 1, #vLayIds do @@ -1153,15 +1173,14 @@ local function SpiralVase( vLayIds, dCorrZ, LayerParams) local nEntId = EgtGetFirstInGroup( nPathGrpId) while nEntId do local nNewEntId = EgtCopyGlob( nEntId, nTpathGrpId, GDB_IN.LAST_SON) - - -- correggo la posizione del toolpath - local vtMove = dCorrZ * Z_AX() - if nSlicingType == SLICING_TYPE.DEG45_X or nSlicingType == SLICING_TYPE.DEG45_Y then - -- eventuale spostamento dell'altezza layer - vtMove = vtMove + LayerParams.dLayHeight * LayerParams.vtSlicing - end - EgtMove( nNewEntId, vtMove, GDB_RT.GLOB) + local vtMove = V_NULL() + -- eventuale spostamento dell'altezza layer + if nSlicingType == SLICING_TYPE.DEG45_X or nSlicingType == SLICING_TYPE.DEG45_Y then + vtMove = LayerParams.dLayHeight * LayerParams.vtSlicing + EgtMove( nNewEntId, vtMove, GDB_RT.GLOB) + end + EgtModifyCurveExtrusion( nNewEntId, LayerParams.vtSlicing, GDB_RT.GLOB) -- eventuale inversione if LayerParams.bInvert then @@ -1207,6 +1226,11 @@ local function SpiralVase( vLayIds, dCorrZ, LayerParams) nOldId = nNewEntId nEntId = EgtGetNext( nEntId) end + + -- aggiorno il box dei toolpath + local b3Box = ComputeToolPathBox( nTpathGrpId) + b3Tot:Add( b3Box) + end if EgtProcessEvents( EgtIf( PRINT, 300, 0) + nIdx / #vLayIds * 100, 0) == 1 then @@ -1218,6 +1242,9 @@ local function SpiralVase( vLayIds, dCorrZ, LayerParams) -- aggiungo uscita, coasting e wipe su ultima curva AddSpiralVaseLeadOut( nOldId, LayerParams) + -- correzione in z + AddZCorrection( b3Tot, LayerParams) + end --------------------------------------------------------------------- @@ -1240,36 +1267,22 @@ function CalcToolPath.Exec( nPartId) -- recupero i parametri per calcolo dei toolpath local LayerParams = GetLayerParamsForToolPathCalc() - local dCorrZ = ComputeZCorrection( LayerParams) - - -- se necessario sposto anche il solido di partenza - if dCorrZ > 10 * GEO.EPS_SMALL then - local vtMove = Vector3d( 0, 0, dCorrZ) - -- se slicing a 45° aggiungo correzione anche in direzione dello slicing - local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') or 1 - if nSlicingType == SLICING_TYPE.DEG45_X or nSlicingType == SLICING_TYPE.DEG45_Y then - vtMove = vtMove + LayerParams.dLayHeight / 2 * LayerParams.vtSlicing - end - local SolidLayId = EgtGetFirstNameInGroup( s_nPartId, PRINT_SOLID) - if SolidLayId then - EgtSetInfo( s_nPartId, KEY_MOVED_PART, vtMove) - local EntId = EgtGetFirstInGroup( SolidLayId) - while EntId do - EgtMove( EntId, vtMove, GDB_RT.GLOB) - EntId = EgtGetNext( EntId) - end - end - end + + -- altezza necessaria per ugello ( per correzione wipe) + local dNxy = sqrt( LayerParams.vtSlicing:getX() * LayerParams.vtSlicing:getX() + LayerParams.vtSlicing:getY() * LayerParams.vtSlicing:getY()) + s_dHMin = LayerParams.dTDiam / 2 * dNxy -- caso spiral vase if LayerParams.bSpiralVase then - SpiralVase( vLayIds, dCorrZ, LayerParams) + SpiralVase( vLayIds, LayerParams) return end + local b3Tot = BBox3d() -- box dei toolpath + -- Ciclo sui layer for nIdx = 1, #vLayIds do - + -- scorro tutti i gruppi di contorni local nCrvGrpId = EgtGetFirstNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*") while nCrvGrpId do @@ -1296,28 +1309,32 @@ function CalcToolPath.Exec( nPartId) if LayerParams.vPrintOrder[j] == PRINT_ELEMENT.SHELL then -- shell local vShellIds = EgtGetNameInGroup( nPathGrpId, SHELL_CRV .. '*') - CalcShellsToolPath( vShellIds, nTpathGrpId, LayerParams, dCorrZ) + CalcShellsToolPath( vShellIds, nTpathGrpId, LayerParams) elseif LayerParams.vPrintOrder[j] == PRINT_ELEMENT.EXTRA_SHELL then -- extra shell local vExtraShellIds = EgtGetNameInGroup( nPathGrpId, EXTRA_SHELL_CRV .. '*') - CalcExtraShellToolPath( vExtraShellIds, nTpathGrpId, LayerParams, dCorrZ) + CalcExtraShellToolPath( vExtraShellIds, nTpathGrpId, LayerParams) elseif LayerParams.vPrintOrder[j] == PRINT_ELEMENT.INFILL then -- infill local vInfillIds = EgtGetNameInGroup( nPathGrpId, INFILL_CRV .. '*') - CalcInfillToolPath( vInfillIds, nTpathGrpId, LayerParams, dCorrZ) + CalcInfillToolPath( vInfillIds, nTpathGrpId, LayerParams) elseif LayerParams.vPrintOrder[j] == PRINT_ELEMENT.AUX_SOLID then -- solidi ausiliari local nAuxSolidsGrp = EgtGetFirstNameInGroup( vLayIds[nIdx], AUX_SOLIDS_GRP) local nAuxSolidsPathGrp = EgtGetFirstNameInGroup( nCrvGrpId, AUX_SOLIDS_GRP) - CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGrpId, LayerParams, dCorrZ) + CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGrpId, LayerParams) else -- costolature local nRibsGrp = EgtGetFirstNameInGroup( nCrvGrpId, RIBS_GRP) - CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) + CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams) end end + -- aggiorno il box dei toolpath + local b3Box = ComputeToolPathBox( nTpathGrpId) + b3Tot:Add( b3Box) + -- passo al gruppo di contorni successivo nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") end @@ -1327,6 +1344,10 @@ function CalcToolPath.Exec( nPartId) return end end + + -- correzione in z + AddZCorrection( b3Tot, LayerParams) + end --------------------------------------------------------------------- diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index caeaf47..161ebfd 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -208,22 +208,33 @@ local function LoadParams( sFile, nPartId) end --------------------------------------------------------------------- -local function RestoreSolidPosition( nPartId) +local function RestoreOriginalPosition( nPartId) if not nPartId then return end - -- recupero vecchio movimento - local vtMove = EgtGetInfo( nPartId, KEY_MOVED_PART, 'v') - if vtMove then - vtMove = -vtMove + + -- correzione solo del solido ( progetti vecchi) + local vtMove1 = EgtGetInfo( nPartId, KEY_MOVED_PART, 'v') + if vtMove1 then + vtMove1 = - vtMove1 EgtRemoveInfo( nPartId, KEY_MOVED_PART) local SolidLayId = EgtGetFirstNameInGroup( nPartId, PRINT_SOLID) if SolidLayId then local EntId = EgtGetFirstInGroup( SolidLayId) while EntId do - EgtMove( EntId, vtMove, GDB_RT.GLOB) + EgtMove( EntId, vtMove1, GDB_RT.GLOB) EntId = EgtGetNext( EntId) end end end + + -- correzione dell'intero pezzo + local vtMove = EgtGetInfo( nPartId, KEY_MOVED_PART2, 'v') + if vtMove then + EgtRemoveInfo( nPartId, KEY_MOVED_PART2) + EgtMove( nPartId, - vtMove, GDB_RT.GLOB) + -- sistemo il riferimento + local nFrameId = EgtGetFirstNameInGroup( nPartId, LAY_FRAME) + EgtMove( nFrameId, vtMove, GDB_RT.GLOB) + end end --------------------------------------------------------------------- @@ -301,9 +312,9 @@ function RunSlicing.Exec() end local nSolidLayId = EgtGetFirstNameInGroup( nPartId, PRINT_SOLID) local nStmId = EgtGetFirstInGroup( nSolidLayId or GDB_ID.NULL) - if not nStmId or EgtGetType( nStmId) ~= GDB_TY.SRF_MESH then - EgtOutBox( "Part without surface!", 'Warning', 'WARNING') - return + if nStmId and EgtGetType( nStmId) ~= GDB_TY.SRF_MESH then + EgtOutBox( "Part without surface!", 'Warning', 'WARNING') + return end local nRibsLayId = EgtGetFirstNameInGroup( nPartId, LAY_RIBS) local nShellNbrLay = EgtGetFirstNameInGroup( nPartId, LAY_SHELL_NBR) @@ -346,8 +357,8 @@ function RunSlicing.Exec() local sMachIni = EgtGetCurrMachineDir() .. '\\' .. EgtGetCurrMachineName() .. '.ini' local HMax = tonumber( EgtGetStringFromIni( '3dPrinting', 'HMax', 500, sMachIni)) - -- Eventuale ripristino posizione solido - RestoreSolidPosition( nPartId) + -- Eventuale ripristino posizione originaria + RestoreOriginalPosition( nPartId) -- Rimozione vecchi conti RemoveOldSlices( nPartId) @@ -360,7 +371,7 @@ function RunSlicing.Exec() EgtDraw() -- Calcolo dei percorsi sul centro strand in basso - CPATHS.Exec( nPartId, nStmId) + CPATHS.Exec( nPartId) EgtDraw() -- Calcolo dei percorsi di lavoro From df0cb0dfa3f0a051a1ff313724072c587dd3db9c Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 14 Feb 2023 09:42:43 +0100 Subject: [PATCH 70/79] 3dPrinting : - aggiunte le costanti per le tipologie di setti in PRINT_ELEMENT. --- LuaLibs/AddManData.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 629201b..bdfa5c7 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -179,7 +179,10 @@ PRINT_ELEMENT = { EXTRA_SHELL = 2, INFILL = 3, AUX_SOLID = 4, - RIB = 5, + RIB_UNBOUNDED = 5, + RIB_EXTERNAL = 6, + RIB_INTERNAL = 7, + RIB_SUPPORT = 8, } PRINT_ORDER = { From 31f27d66c12db9f8914bf2c61e800197afc83605 Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 15 Feb 2023 14:39:47 +0100 Subject: [PATCH 71/79] 3dPrinting : - aggiunte le diverse tipologie di ribs nell'ordinamento degli elementi di stampa. --- LuaLibs/AddManData.lua | 1 - LuaLibs/CalcPaths.lua | 85 +++++++++++++++++++++------------------- LuaLibs/CalcToolPath.lua | 77 +++++++++++++++++++----------------- LuaLibs/RunSlicing.lua | 3 +- 4 files changed, 87 insertions(+), 79 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index bdfa5c7..aead0aa 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -97,7 +97,6 @@ KEY_RIBS_LEAD_OUT_LEN = "RibsLeadOutLen" KEY_RIBS_LEAD_OUT_COASTING = "RibsLeadOutCoasting" KEY_RIBS_LEAD_OUT_WIPE = "RibsLeadOutWipe" KEY_RIBS_LEAD_OUT_WIPE_DIR = "RibsLeadOutWipeDir" -KEY_RIBS_PRINT_ORDER = "RibsPrintOrder" KEY_RIBS_INTERS = "RibsHaveIntersections" KEY_RIBS_SPECIAL_CASE = "RibsSpecialCase" KEY_SPLIT_ORDER = "SplitOrder" diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 7ba16ae..a56a3dc 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -22,6 +22,7 @@ local function GetLayerParamsForPathCalc() LayerParams.bSpiralVase = EgtGetInfo( s_nPartId, KEY_SPIRAL_VASE, 'b') or false LayerParams.nShellsNbr = EgtGetInfo( s_nPartId, KEY_SHELLS_NBR, 'i') LayerParams.dStrand = EgtGetInfo( s_nPartId, KEY_STRAND, 'd') + LayerParams.dLayHeight = EgtGetInfo( s_nPartId, KEY_SLICE_STEP, 'd') LayerParams.nStrandOverlap = EgtGetInfo( s_nPartId, KEY_STRAND_OVERLAP, 'i') or 0 LayerParams.dOffs = EgtGetInfo( s_nPartId, KEY_OFFSET_SLICE, 'd') LayerParams.nFloorNbr = EgtGetInfo( s_nPartId, KEY_FLOOR_NBR, 'i') or 0 @@ -30,9 +31,9 @@ local function GetLayerParamsForPathCalc() LayerParams.nCeilType = EgtGetInfo( s_nPartId, KEY_CEIL_TYPE, 'i') or INFILL_TYPE.ZIGZAG LayerParams.vtSlicing = EgtGetInfo( s_nPartId, KEY_SLICING_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} -- parametri costolature LayerParams.bRibsInvertOrder = EgtGetInfo( s_nPartId, KEY_RIBS_INVERT_ORDER, 'b') - LayerParams.vRibsPrintOrder = EgtGetInfo( s_nPartId, KEY_RIBS_PRINT_ORDER, 'vi') or {3, 1, 4, 2} -- parametri regioni con diverse passate LayerParams.dShellNbrCoasting = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_COASTING, 'd') LayerParams.dShellNbrWipe = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE, 'd') @@ -488,7 +489,10 @@ local function CheckRibUserLink( nCrv, nCnt, vtSlicing) EgtCloseCurveCompo( nSrfLoop) local nSurf = EgtSurfFlatRegion( nGrpTmp, {nSrfLoop}) - if not nSurf then return end + if not nSurf then + EgtErase( nGrpTmp) + return + end -- verifico direzione della normale local vtN = EgtSurfFrNormVersor( nSurf, GDB_ID.ROOT) if AreSameVectorApprox( vtN, vtSlicing) then @@ -825,12 +829,9 @@ local function AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nOffs end end - EgtChangeId( nId, vOffs2[i]) -- aggiorno ordine di split copiandolo da nCrv2 - CopyInfo( nCrv2, vOffs2[i], KEY_SPLIT_ORDER, 'i') - for j = nId + nCnt - 1, nId + 1, -1 do - CopyInfo( nCrv2, j, KEY_SPLIT_ORDER, 'i') -- ordine di split - EgtRelocateGlob( j, j - 1, GDB_IN.AFTER) + for j = nId, nId + nCnt - 1 do + CopyInfo( nCrv2, j, KEY_SPLIT_ORDER, 'i') end end @@ -1197,7 +1198,7 @@ local function ShortestPathForRibs( vRibs, nGrp, bInvertOrder) end -------------------------------------------------------------------- -local function ReorderRibs( nGrp, bInvertOrder, dStrand, vRibsPrintOrder) +local function ReorderRibs( nGrp, bInvertOrder, dStrand) local vIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*') if not vIds or #vIds == 0 then return end @@ -1216,9 +1217,8 @@ local function ReorderRibs( nGrp, bInvertOrder, dStrand, vRibsPrintOrder) end -- riordino ogni tipologia - for i = 1, #vRibsPrintOrder do - local nCurrType = vRibsPrintOrder[i] - local vIds = tRibs[nCurrType] + for j = 1, 4 do + local vIds = tRibs[j] -- raggruppo in base allo split order local tSplitOrder = {} @@ -1292,7 +1292,7 @@ end --------------------------------------------------------------------------------------------- -- Funzione che riordina le costolature nel caso di intersezioni e 2 passate -local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vRibsPrintOrder, bInvertOrder) +local function ReorderRibsInters2Shells( nOffsGrp, dStrand, bInvertOrder) local vOffs = {} local vClosed = {} @@ -1433,30 +1433,17 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vRibsPrintOrder, bIn end end end - - -- classifico in base alla tipologia - local vCrvs = EgtGetNameInGroup( nOffsGrp, RIBS_CRV .. '*') - local tRibs = {{}, {}, {}, {}} - for nId = 1, #vCrvs do - local nType = EgtGetInfo( vCrvs[nId], KEY_RIBS_TYPE, 'i') - table.insert( tRibs[nType], vCrvs[nId]) - end - - -- riordino per tipologia - for i = 1, #vRibsPrintOrder do - nCurrType = vRibsPrintOrder[i] - local nStart = EgtIf( bInvertOrder, #tRibs[nCurrType], 1) - local nEnd = EgtIf( bInvertOrder, 1, #tRibs[nCurrType]) - local nStep = EgtIf( bInvertOrder, -1, 1) - for j = nStart, nEnd, nStep do - if bInvertOrder then - -- inverto curve per mantenere concatenamento - EgtInvertCurve( tRibs[nCurrType][j]) - end - EgtRelocateGlob( tRibs[nCurrType][j], nOffsGrp, GDB_IN.LAST_SON) + + -- eventuale inversione ordinamento + if bInvertOrder then + local vRibs = EgtGetNameInGroup( nOffsGrp, RIBS_CRV .. '*') + for j = #vRibs, 1, -1 do + -- inverto direzione curve per mantenere concatenamento + EgtInvertCurve( vRibs[j]) + EgtRelocateGlob( vRibs[j], nOffsGrp, GDB_IN.LAST_SON) end end - + end ------------------------------------------------------------------- @@ -1464,8 +1451,16 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) -- stabilisco ordine di realizzazione delle varie tipologie local vTypeSequence = {} - for i = 1, #LayerParams.vRibsPrintOrder do - vTypeSequence[LayerParams.vRibsPrintOrder[i]] = i + for i = 1, #LayerParams.vPrintOrder do + if LayerParams.vPrintOrder[i] == PRINT_ELEMENT.RIB_UNBOUNDED then + vTypeSequence[RIB_TYPE.UNBOUNDED] = i + elseif LayerParams.vPrintOrder[i] == PRINT_ELEMENT.RIB_INTERNAL then + vTypeSequence[RIB_TYPE.INTERNAL] = i + elseif LayerParams.vPrintOrder[i] == PRINT_ELEMENT.RIB_EXTERNAL then + vTypeSequence[RIB_TYPE.EXTERNAL] = i + elseif LayerParams.vPrintOrder[i] == PRINT_ELEMENT.RIB_SUPPORT then + vTypeSequence[RIB_TYPE.SUPPORT] = i + end end local vOrigRibs = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') @@ -1591,15 +1586,25 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) -- riordino le costolature if bSpecialCase then -- gestione caso speciale di intersezione e 2 passate - ReorderRibsInters2Shells( nRibsPathGrp, LayerParams.dStrand, LayerParams.vRibsPrintOrder, LayerParams.bRibsInvertOrder) + ReorderRibsInters2Shells( nRibsPathGrp, LayerParams.dStrand, LayerParams.bRibsInvertOrder) else - ReorderRibs( nRibsPathGrp, LayerParams.bRibsInvertOrder, LayerParams.dStrand, LayerParams.vRibsPrintOrder) + ReorderRibs( nRibsPathGrp, LayerParams.bRibsInvertOrder, LayerParams.dStrand) end if not EgtGetFirstNameInGroup( nRibsPathGrp, RIBS_CRV .. '*') then EgtErase( nRibsPathGrp) end + -- sistemo le quote delle superfici e dei loop per CalcToolPath + local vLoopIds = EgtGetAllInGroup( nLoopGrp) or {} + for i = 1, #vLoopIds do + EgtMove( vLoopIds[i], LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) + end + local vSrfIds = EgtGetNameInGroup( nRibsPathGrp, TOT_SHELL_TRIM_SURF) or {} + for i = 1, #vSrfIds do + EgtMove( vSrfIds[i], LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) + end + nCrvGrp = EgtGetNextName( nCrvGrp, CONTOUR_GRP .. '*') end end @@ -2128,7 +2133,7 @@ function CalcPaths.Exec( nPartId) s_nPartId = nPartId - local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER.."*") + local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER.."*") if not vLayIds then EgtOutBox( 'Error no slice', 'PathCalc') return @@ -2269,7 +2274,7 @@ function CalcPaths.Exec( nPartId) if EgtProcessEvents( EgtIf( PRINT, 200, 0) + nIdx / #vLayIds * 100, 0) == 1 then EgtDraw() - return + return end end end diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 15811ae..92b0367 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -26,7 +26,7 @@ local function GetLayerParamsForToolPathCalc() LayerParams.dOffs = EgtGetInfo( s_nPartId, KEY_OFFSET_SLICE, 'd') LayerParams.bInvert = ( EgtGetInfo( s_nPartId, KEY_PRINT_DIRECTION, 'i') == PRINT_DIRECTION.CW) LayerParams.nOrder = EgtGetInfo( s_nPartId, KEY_STRAND_ORDER, 'i') - LayerParams.vPrintOrder = EgtGetInfo( s_nPartId, KEY_PRINT_ORDER, 'vi') or { 1, 2, 3, 4, 5} + LayerParams.vPrintOrder = EgtGetInfo( s_nPartId, KEY_PRINT_ORDER, 'vi') or { 1, 2, 3, 4, 5, 6, 7, 8} LayerParams.nLinkType = EgtGetInfo( s_nPartId, KEY_LINK_TYPE, 'i') LayerParams.dLinkParam = EgtGetInfo( s_nPartId, KEY_LINK_PARAM, 'd') LayerParams.nLeadInType = EgtGetInfo( s_nPartId, KEY_LEAD_IN_TYPE, 'i') @@ -671,7 +671,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlic return nLinkId end - nCrvId = EgtGetNextName( nCrvId, TRIM_SURF_LOOP) + nCrvId = EgtGetNextName( nCrvId, TRIM_SURF_LOOP) end -- se non ho trovato un collegamento sul bordo, creo una linea tra ptS e ptE @@ -989,16 +989,16 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n end --------------------------------------------------------------------- -local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams) +local function CalcRibsToolPath( vEntIds, nRibsGrp, nTpathGrpId, LayerParams) - if not nRibsGrp then return end + if not vEntIds or #vEntIds == 0 then return end -- gruppo temporaneo con sistema di riferimento locale per conti local frLoc = Frame3d( ORIG(), LayerParams.vtSlicing) local nGrpTmp = EgtGroup( nRibsGrp, frLoc, GDB_RT.GLOB) -- aggiungo le costolature nel toolpath - local vEntIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') + local nNewFirstEnt for i = 1, #vEntIds do -- copio entità nel gruppo toolpath local nNewEntId = EgtCopyGlob( vEntIds[i], nTpathGrpId, GDB_IN.LAST_SON) @@ -1006,24 +1006,12 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams) EgtMove( nNewEntId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) EgtModifyCurveExtrusion( nNewEntId, LayerParams.vtSlicing, GDB_RT.GLOB) EgtSetColor( nNewEntId, EgtStdColor('MAROON')) - end - - -- posiziono alla quota corretta i loop degli offset da utlizzare per link, ingressi e uscite - local nLoopGrp = EgtGetFirstGroupInGroup( nRibsGrp) - local vLoopIds = EgtGetAllInGroup( nLoopGrp) - for i = 1, #vLoopIds do - EgtMove( vLoopIds[i], LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) + if i == 1 then nNewFirstEnt = nNewEntId end end - -- posizono alla quota corretta le superfici usate per i trim - local vSrfIds = EgtGetNameInGroup( nRibsGrp, TOT_SHELL_TRIM_SURF) or {} - for i = 1, #vSrfIds do - EgtMove( vSrfIds[i], LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) - end - -- recupero i gruppi delle costolature local tabRibs = {} - local nFirst = EgtGetFirstNameInGroup( nTpathGrpId, RIBS_CRV .. '*') + local nFirst = nNewFirstEnt while nFirst do local sName = EgtGetName( nFirst) local vIds = EgtGetNameInGroup( nTpathGrpId, sName) @@ -1034,23 +1022,27 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams) local bSpecialCase = EgtGetInfo( nRibsGrp, KEY_RIBS_SPECIAL_CASE, 'b') or false -- Link + local nLoopGrp = EgtGetFirstGroupInGroup( nRibsGrp) -- collego le passate di una stessa costolatura for i = 1, #tabRibs do if EgtCurveIsClosed( tabRibs[i][1]) then AddLink( tabRibs[i], nTpathGrpId, LINK_TYPE.NONE, LayerParams.dLinkParam, LayerParams.dSPOffs, LayerParams.dStrand, LayerParams.vtSlicing) else for j = 1, #tabRibs[i] - 1 do - local nOrig1 = EgtGetInfo( tabRibs[i][j], KEY_ORIGINAL_RIB, 'i') - local nOrig2 = EgtGetInfo( tabRibs[i][j + 1], KEY_ORIGINAL_RIB, 'i') + local bUserLink = EgtGetInfo( tabRibs[i][j], KEY_RIBS_USER_LINK, 'b') or false + local nOrig1 = EgtGetInfo( tabRibs[i][j], KEY_ORIGINAL_RIB, 'i') or 0 + local nOrig2 = EgtGetInfo( tabRibs[i][j + 1], KEY_ORIGINAL_RIB, 'i') or 0 local nSplitId1 = EgtGetInfo( tabRibs[i][j], KEY_SPLIT_ID, 'i') or 0 local nSplitId2 = EgtGetInfo( tabRibs[i][j + 1], KEY_SPLIT_ID, 'i') or 0 - local bForceLink = ( nOrig1 == nOrig2 and nSplitId1 == nSplitId2) + local bForceLink = ( nOrig1 == nOrig2) - CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, bForceLink, LayerParams.vtSlicing, nGrpTmp) - -- creo link fittizio per eliminare tratto corrispondente sulla curva di offset - if not bSpecialCase and bForceLink then - local nFakeLink = CalcRibsLink( tabRibs[i][j + 1], tabRibs[i][j], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) - EgtErase( nFakeLink) + if ( nOrig1 ~= nOrig2 and bUserLink) or ( nSplitId1 == nSplitId2 and nOrig1 == nOrig2) then + CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, bForceLink, LayerParams.vtSlicing, nGrpTmp) + -- creo link fittizio per eliminare tratto corrispondente sulla curva di offset + if not bSpecialCase and bForceLink then + local nFakeLink = CalcRibsLink( tabRibs[i][j + 1], tabRibs[i][j], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) + EgtErase( nFakeLink) + end end end @@ -1071,16 +1063,14 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams) for i = 1, #tabRibs - 1 do local bLink1 = EgtGetInfo( tabRibs[i][1], KEY_RIBS_LINK, 'b') local bLink2 = EgtGetInfo( tabRibs[i + 1][1], KEY_RIBS_LINK, 'b') - local nType1 = EgtGetInfo( tabRibs[i][1], KEY_RIBS_TYPE, 'i') - local nType2 = EgtGetInfo( tabRibs[i + 1][1], KEY_RIBS_TYPE, 'i') - if bLink1 and bLink2 and nType1 == nType2 then + if bLink1 and bLink2 then local nCnt = #tabRibs[i] CalcRibsLink( tabRibs[i][nCnt], tabRibs[i + 1][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) end end -- leadin/leadout - local nCrvRib = EgtGetFirstNameInGroup( nTpathGrpId, RIBS_CRV .. '*') + local nCrvRib = nNewFirstEnt while nCrvRib do -- verifico se necessario lead in local nPrev = EgtGetPrev( nCrvRib) @@ -1251,13 +1241,13 @@ end function CalcToolPath.Exec( nPartId) s_nPartId = nPartId - + -- Verifico il pezzo if not s_nPartId then EgtOutBox( 'Error missing part', 'ToolPathCalc') return end - + -- Recupero i layer da processare local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER.."*") if not vLayIds then @@ -1303,6 +1293,15 @@ function CalcToolPath.Exec( nPartId) EgtEmptyGroup( nTpathGrpId) end + -- suddivido i ribs per tipologia + local nRibsGrp = EgtGetFirstNameInGroup( nCrvGrpId, RIBS_GRP) + local tRibs = {{}, {}, {}, {}} + local vRibsIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') or {} + for i = 1, #vRibsIds do + local nType = EgtGetInfo( vRibsIds[i], KEY_RIBS_TYPE, 'i') or 1 + table.insert( tRibs[nType], vRibsIds[i]) + end + -- realizzo le diverse tipologie in base all'ordine selezionato for j = 1, #LayerParams.vPrintOrder do @@ -1323,10 +1322,16 @@ function CalcToolPath.Exec( nPartId) local nAuxSolidsGrp = EgtGetFirstNameInGroup( vLayIds[nIdx], AUX_SOLIDS_GRP) local nAuxSolidsPathGrp = EgtGetFirstNameInGroup( nCrvGrpId, AUX_SOLIDS_GRP) CalcAuxSolidsToolPath( nAuxSolidsGrp, nAuxSolidsPathGrp, nTpathGrpId, LayerParams) - else + -- costolature - local nRibsGrp = EgtGetFirstNameInGroup( nCrvGrpId, RIBS_GRP) - CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams) + elseif LayerParams.vPrintOrder[j] == PRINT_ELEMENT.RIB_UNBOUNDED then + CalcRibsToolPath( tRibs[RIB_TYPE.UNBOUNDED], nRibsGrp, nTpathGrpId, LayerParams) + elseif LayerParams.vPrintOrder[j] == PRINT_ELEMENT.RIB_INTERNAL then + CalcRibsToolPath( tRibs[RIB_TYPE.INTERNAL], nRibsGrp, nTpathGrpId, LayerParams) + elseif LayerParams.vPrintOrder[j] == PRINT_ELEMENT.RIB_SUPPORT then + CalcRibsToolPath( tRibs[RIB_TYPE.SUPPORT], nRibsGrp, nTpathGrpId, LayerParams) + elseif LayerParams.vPrintOrder[j] == PRINT_ELEMENT.RIB_EXTERNAL then + CalcRibsToolPath( tRibs[RIB_TYPE.EXTERNAL], nRibsGrp, nTpathGrpId, LayerParams) end end diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 161ebfd..db5cb21 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -55,7 +55,7 @@ local function LoadParams( sFile, nPartId) SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SHELLS_NBR, '3') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_STRAND_OVERLAP, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_OFFSET_SLICE, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_PRINT_ORDER, '1,2,3,4,5') + SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_PRINT_ORDER, '1,2,3,4,5,6,7,8') local sStrandOrder = EgtGetStringFromIni( SEC_DEFAULT, KEY_STRAND_ORDER, 'InToOut', sFile) if sStrandOrder == 'OutToIn' then @@ -152,7 +152,6 @@ local function LoadParams( sFile, nPartId) end SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_OVERLAP, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_PRINT_ORDER, '3,1,4,2') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_SHELLS_NBR, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_DIR, '0') SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_STRAND_ORDER, '0') From 3a1dcbb822d1c30956dcfbbf7da227e2fd5089cd Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 16 Feb 2023 10:27:46 +0100 Subject: [PATCH 72/79] 3dPrinting : - gestita interruzione degli script. --- LuaLibs/CalcPaths.lua | 6 +- LuaLibs/CalcSlices.lua | 50 ++++--- LuaLibs/CalcToolPath.lua | 16 +- LuaLibs/RunCalcSolids.lua | 14 +- LuaLibs/RunMachParamFromSWCalc.lua | 10 +- LuaLibs/RunSlicing.lua | 232 +++-------------------------- 6 files changed, 76 insertions(+), 252 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index a56a3dc..5826def 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -2136,7 +2136,7 @@ function CalcPaths.Exec( nPartId) local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER.."*") if not vLayIds then EgtOutBox( 'Error no slice', 'PathCalc') - return + return true end -- recupero i parametri per calcolo dei path @@ -2274,9 +2274,11 @@ function CalcPaths.Exec( nPartId) if EgtProcessEvents( EgtIf( PRINT, 200, 0) + nIdx / #vLayIds * 100, 0) == 1 then EgtDraw() - return + return false end end + + return true end --------------------------------------------------------------------- diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 60c4195..3787de7 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -286,13 +286,12 @@ local function ValueInArray( vArr, nValue) end --------------------------------------------------------------------- -local function SlicingNoSolid( nRibsLay, vZSlices, dDeltaZStart, dZmin, frSlicing) +local function SlicingNoSolid( nRibsLay, vZSlices, dDeltaZStart, dZmin, frSlicing, vErr) - local vErr = {} local vtSlicing = frSlicing:getVersZ() -- contatore per il calcolo delle intersezioni - if EgtProcessEvents( 100, 0) == 1 then return end + if EgtProcessEvents( 100, 0) == 1 then return false end -- creo i layer dello slicing for i = 1, #vZSlices do @@ -309,17 +308,17 @@ local function SlicingNoSolid( nRibsLay, vZSlices, dDeltaZStart, dZmin, frSlicin local nGrpCrv = EgtGroup( nLayGrp) EgtSetName( nGrpCrv, CONTOUR_GRP .. EgtNumToString( 0)) end - if EgtProcessEvents( EgtIf( PRINT, 100, 0) + 20, 0) == 1 then return end + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + 20, 0) == 1 then return false end -- slicing dei setti SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV) - if EgtProcessEvents( EgtIf( PRINT, 100, 0) + 100, 0) == 1 then return end + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + 100, 0) == 1 then return false end - return vErr + return true end --------------------------------------------------------------------- -local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing) +local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing, vErr) -- costanti local TOLER = 0.05 @@ -327,14 +326,13 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin local BIG_TOLER = 2.0 local MIN_LEN = 20.0 local MIN_AREA = 25.0 - - local vErr = {} + local vtSlicing = frSlicing:getVersZ() -- calcolo delle intersezioni - if EgtProcessEvents( 1, 0) == 1 then return end + if EgtProcessEvents( 1, 0) == 1 then return false end local nLayId = EgtParPlanesSurfTmInters( ORIG(), vtSlicing, vZSlices, nStmId, s_nPartId, GDB_RT.GLOB, TOLER) - if EgtProcessEvents( 100, 0) == 1 then return end + if EgtProcessEvents( 100, 0) == 1 then return false end local vPrevCen = {} local nLayCnt = 1 @@ -574,9 +572,16 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin -- passo al layer successivo if EgtProcessEvents( EgtIf( PRINT, 100, 0) + nLayCnt / ( #vZSlices + 3) * 100, 0) == 1 then - EgtDraw() - return + -- elimino i layer non ancora analizzati + local nNext = EgtGetNext( nLayId) + while nNext do + local nCurr = nNext + nNext = EgtGetNext( nCurr) + EgtErase( nCurr) + end + return false end + nLayCnt = nLayCnt + 1 nLayId = EgtGetNext( nLayId) end @@ -588,14 +593,14 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin if nRibsLay then SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV) end - if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 1) / ( #vZSlices + 3) * 100, 0) == 1 then return end + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 1) / ( #vZSlices + 3) * 100, 0) == 1 then return false 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 - if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 2) / ( #vZSlices + 3) * 100, 0) == 1 then return end + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 2) / ( #vZSlices + 3) * 100, 0) == 1 then return false end -- solidi ausiliari local nAuxSolidsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_AUX_SOLIDS) @@ -603,10 +608,10 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin AdjustAuxSolids( nAuxSolidsLay) SlicingExtraObjects( vtSlicing, nAuxSolidsLay, TYPE.AUX_SOLID, AUX_SOLIDS_GRP, AUX_SOLIDS_CRV) end - if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 3) / ( #vZSlices + 3) * 100, 0) == 1 then return end + if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 3) / ( #vZSlices + 3) * 100, 0) == 1 then return false end end - return vErr + return true end --------------------------------------------------------------------- @@ -674,19 +679,22 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) local vZSlices = ComputeZSlices( dSliceStep, dZmin, dDeltaZStart, dZmax) - local vErr + local vErr = {} + local bOk = true if not nStmId then -- caso senza solido e solo setti - vErr = SlicingNoSolid( nRibsLay, vZSlices, dDeltaZStart, dZmin, frSlicing) + bOk = SlicingNoSolid( nRibsLay, vZSlices, dDeltaZStart, dZmin, frSlicing, vErr) else -- caso con solido - vErr = SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing) + bOk = SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing, vErr) end -- eventuale segnalazione errori - if vErr and #vErr > 0 then + if bOk and #vErr > 0 then EgtOutBox( 'Slicing Error on layers :\n' .. table.concat( vErr, ','), 'SlicingCalc') end + + return bOk end --------------------------------------------------------------------- diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 92b0367..5297b7a 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -1225,7 +1225,7 @@ local function SpiralVase( vLayIds, LayerParams) if EgtProcessEvents( EgtIf( PRINT, 300, 0) + nIdx / #vLayIds * 100, 0) == 1 then EgtDraw() - return + return false end end @@ -1235,6 +1235,7 @@ local function SpiralVase( vLayIds, LayerParams) -- correzione in z AddZCorrection( b3Tot, LayerParams) + return true end --------------------------------------------------------------------- @@ -1242,17 +1243,11 @@ function CalcToolPath.Exec( nPartId) s_nPartId = nPartId - -- Verifico il pezzo - if not s_nPartId then - EgtOutBox( 'Error missing part', 'ToolPathCalc') - return - end - -- Recupero i layer da processare local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER.."*") if not vLayIds then EgtOutBox( 'Error missing slices', 'ToolPathCalc') - return + return true end -- recupero i parametri per calcolo dei toolpath @@ -1264,8 +1259,7 @@ function CalcToolPath.Exec( nPartId) -- caso spiral vase if LayerParams.bSpiralVase then - SpiralVase( vLayIds, LayerParams) - return + return SpiralVase( vLayIds, LayerParams) end local b3Tot = BBox3d() -- box dei toolpath @@ -1353,6 +1347,8 @@ function CalcToolPath.Exec( nPartId) -- correzione in z AddZCorrection( b3Tot, LayerParams) + return true + end --------------------------------------------------------------------- diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index 3c7054d..59ab7e6 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -367,8 +367,20 @@ function RunCalcSolids.Exec() if ( nIdx % nStep) == 0 then EgtDraw() end + if EgtProcessEvents( EgtIf( PRINT, 400, 0) + nIdx / #vLayIds * 100, 0) == 1 then - return + -- se interrompo cancello i solidi realizzati + for i = 1, #vLayIds do + local vGrpId = EgtGetNameInGroup( vLayIds[i], CONTOUR_GRP .. '*') or {} + for j = 1, #vGrpId do + local nSolidId = EgtGetNameInGroup( vGrpId[j], SOLID_GRP .. '*') or GDB_ID.NULL + EgtErase( nSolidId) + end + end + -- rimuovo info della presenza solidi + EgtSetInfo( nPartId, KEY_HAS_SOLIDS, false) + EgtDraw() + return end end diff --git a/LuaLibs/RunMachParamFromSWCalc.lua b/LuaLibs/RunMachParamFromSWCalc.lua index a346569..8b0e6e2 100644 --- a/LuaLibs/RunMachParamFromSWCalc.lua +++ b/LuaLibs/RunMachParamFromSWCalc.lua @@ -69,8 +69,8 @@ function RunMachParamFromSWCalc.Exec() local dStrand = EgtGetInfo( nPartId, KEY_STRAND, 'd') local dStrandCount = EgtGetInfo( nPartId, KEY_SHELLS_NBR, 'd') -- recupero numero di strati per progress - local nLastLayerId = EgtGetLastNameInGroup( nPartId, SLICE_LAYER .. '*') - local nLayerQty = EgtGetInfo( nLastLayerId, KEY_SLICE_NBR, 'i') + local nLastLayerId = EgtGetLastNameInGroup( nPartId, SLICE_LAYER .. '*') or GDB_ID.NULL + local nLayerQty = EgtGetInfo( nLastLayerId, KEY_SLICE_NBR, 'i') or 0 -- ciclo sui layer local nLayerIndex = 1 local nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex) @@ -210,7 +210,11 @@ function RunMachParamFromSWCalc.Exec() EgtSetInfo( nLayerResultId, KEY_MF, dMF) EgtSetInfo( nLayerResultId, KEY_TOTAREA, dTotLayerArea) -- aggiorno interfaccia - EgtProcessEvents( 500 + ( nLayerIndex / nLayerQty * 100), 0) + if EgtProcessEvents( 500 + ( nLayerIndex / nLayerQty * 100), 0) == 1 then + EgtEmptyGroup( nResultLayerId) + return + end + nLayerIndex = nLayerIndex + 1 nLayerId = EgtGetFirstNameInGroup( nPartId, SLICE_LAYER .. nLayerIndex) or EgtGetFirstNameInGroup( nPartId, "__" .. SLICE_LAYER .. nLayerIndex) end diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index db5cb21..6dc72d4 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -25,187 +25,6 @@ local CSOLIDS = require( 'RunCalcSolids') _G.package.loaded.CalcToolPath = nil local CTP = require( 'CalcToolPath') ---------------------------------------------------------------------- -local function SetParamInfo( sFile, nParamsGrp, sSection, sKey, sDefaultVal) - local sVal = EgtGetStringFromIni( sSection, sKey, sDefaultVal, sFile) - EgtSetInfo( nParamsGrp, sKey, sVal) -end - ---------------------------------------------------------------------- -local function LoadParams( sFile, nPartId) - - EgtSetInfo( nPartId, KEY_PARAMS, sFile) - - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_CALC_SOLIDS, '0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SPIRAL_VASE, '0') - - local sSlicingType = EgtGetStringFromIni( SEC_DEFAULT, KEY_SLICING_TYPE, 'Vertical', sFile) - if sSlicingType == 'Horizontal' then - EgtSetInfo( nPartId, KEY_SLICING_TYPE, SLICING_TYPE.HORIZONTAL) - elseif sSlicingType == 'Deg45X' then - EgtSetInfo( nPartId, KEY_SLICING_TYPE, SLICING_TYPE.DEG45_X) - elseif sSlicingType == 'Deg45Y' then - EgtSetInfo( nPartId, KEY_SLICING_TYPE, SLICING_TYPE.DEG45_Y) - else - EgtSetInfo( nPartId, KEY_SLICING_TYPE, SLICING_TYPE.VERTICAL) - end - - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SLICE_STEP, '1.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_STRAND, '6.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SHELLS_NBR, '3') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_STRAND_OVERLAP, '0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_OFFSET_SLICE, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_PRINT_ORDER, '1,2,3,4,5,6,7,8') - - local sStrandOrder = EgtGetStringFromIni( SEC_DEFAULT, KEY_STRAND_ORDER, 'InToOut', sFile) - if sStrandOrder == 'OutToIn' then - EgtSetInfo( nPartId, KEY_STRAND_ORDER, PRINT_ORDER.EXT_INT) - else -- 'InToOut' - EgtSetInfo( nPartId, KEY_STRAND_ORDER, PRINT_ORDER.INT_EXT) - end - - local sStrandDirection = EgtGetStringFromIni( SEC_DEFAULT, KEY_PRINT_DIRECTION, 'CCW', sFile) - if sStrandDirection == 'CW' then - EgtSetInfo( nPartId, KEY_PRINT_DIRECTION, PRINT_DIRECTION.CW) - else -- 'CCW' - EgtSetInfo( nPartId, KEY_PRINT_DIRECTION, PRINT_DIRECTION.CCW) - end - - local sLinkType = EgtGetStringFromIni( SEC_DEFAULT, KEY_LINK_TYPE, 'None', sFile) - if sLinkType == 'None' then - EgtSetInfo( nPartId, KEY_LINK_TYPE, LINK_TYPE.NONE) - elseif sLinkType == 'BiArc' then - EgtSetInfo( nPartId, KEY_LINK_TYPE, LINK_TYPE.BIARC) - else -- 'Linear' - EgtSetInfo( nPartId, KEY_LINK_TYPE, LINK_TYPE.LINEAR) - end - - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SP_OFFSET_ON_SLICE, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_LINK_PARAM, '0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_LINK_ZUP, '0') - - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_FLOOR_NBR, '0') - local sFloorInfill = EgtGetStringFromIni( SEC_DEFAULT, KEY_FLOOR_TYPE, 'Offset', sFile) - if sFloorInfill == 'ZigZag' then - EgtSetInfo( nPartId, KEY_FLOOR_TYPE, INFILL_TYPE.ZIGZAG) - else - EgtSetInfo( nPartId, KEY_FLOOR_TYPE, INFILL_TYPE.OFFSET) - end - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_CEIL_NBR, '0') - local sCeilInfill = EgtGetStringFromIni( SEC_DEFAULT, KEY_CEIL_TYPE, 'Offset', sFile) - if sCeilInfill == 'ZigZag' then - EgtSetInfo( nPartId, KEY_CEIL_TYPE, INFILL_TYPE.ZIGZAG) - else - EgtSetInfo( nPartId, KEY_CEIL_TYPE, INFILL_TYPE.OFFSET) - end - - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SPEED, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_FEED, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_EXT_FEED, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_INT_FEED, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_INFILL_FEED, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_LEAD_IN_FEED, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_LEAD_OUT_FEED, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SUPPORT_FEED, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_G0_FEED, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_MATERIAL, '') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_TOOL_DIAM, '0.0') - - local sLeadInType = EgtGetStringFromIni( SEC_DEFAULT, KEY_LEAD_IN_TYPE, 'None', sFile) - if sLeadInType == 'Linear' then - EgtSetInfo( nPartId, KEY_LEAD_IN_TYPE, LEAD_TYPE.LINEAR) - elseif sLeadInType == 'Arc' then - EgtSetInfo( nPartId, KEY_LEAD_IN_TYPE, LEAD_TYPE.ARC) - else -- 'None' - EgtSetInfo( nPartId, KEY_LEAD_IN_TYPE, LEAD_TYPE.NONE) - end - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_LEAD_IN_TANG_DIST, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_LEAD_IN_ORTHO_DIST, '0.0') - local sLeadOutType = EgtGetStringFromIni( SEC_DEFAULT, KEY_LEAD_OUT_TYPE, 'None', sFile) - if sLeadOutType == 'Linear' then - EgtSetInfo( nPartId, KEY_LEAD_OUT_TYPE, LEAD_TYPE.LINEAR) - elseif sLeadOutType == 'Arc' then - EgtSetInfo( nPartId, KEY_LEAD_OUT_TYPE, LEAD_TYPE.ARC) - else -- 'None' - EgtSetInfo( nPartId, KEY_LEAD_OUT_TYPE, LEAD_TYPE.NONE) - end - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_LEAD_OUT_TANG_DIST, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_LEAD_OUT_ORTHO_DIST, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_OFFSET_LEAD_POINT, '0.0') - - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_COASTING_LEN, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_COASTING_FEED, '20000.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_WIPE_LEN, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_WIPE_DIR, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_WIPE_FEEDPU, '0.9') - - -- parametri per costolature - local sRibType = EgtGetStringFromIni( SEC_DEFAULT, KEY_RIBS_TYPE, 'Internal', sFile) - if sRibType == 'External' then - EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.EXTERNAL) - elseif sRibType == 'Unbounded' then - EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.UNBOUNDED) - elseif sRibType == 'Support' then - EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.SUPPORT) - else -- 'Internal' - EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.INTERNAL) - end - - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_OVERLAP, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_SHELLS_NBR, '0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_DIR, '0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_STRAND_ORDER, '0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_INVERT_ORDER, '0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LINK, '0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_IN_INVERT, '0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_IN_LEN, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_OUT_INVERT, '0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_OUT_LEN, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_OUT_COASTING, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_OUT_WIPE, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_RIBS_LEAD_OUT_WIPE_DIR, '0.0') - - -- parametri per regioni con diverso numero di passate - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SHELL_NBR_DIFF, '0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SHELL_NBR_COASTING, EgtGetInfo( nPartId, KEY_COASTING_LEN, 'd')) - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SHELL_NBR_WIPE, EgtGetInfo( nPartId, KEY_WIPE_LEN, 'd')) - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_SHELL_NBR_WIPE_DIR, '0.0') - - -- parametri per solidi ausiliari - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_AUX_SOLIDS_OVERLAP, '0') - - local sAuxSolidsInfill = EgtGetStringFromIni( SEC_DEFAULT, KEY_AUX_SOLIDS_INFILL, 'None', sFile) - if sAuxSolidsInfill == 'ZigZag' then - EgtSetInfo( nPartId, KEY_AUX_SOLIDS_INFILL, INFILL_TYPE.ZIGZAG) - elseif sAuxSolidsInfill == 'Offset' then - EgtSetInfo( nPartId, KEY_AUX_SOLIDS_INFILL, INFILL_TYPE.OFFSET) - else - EgtSetInfo( nPartId, KEY_AUX_SOLIDS_INFILL, INFILL_TYPE.NONE) - end - - local sAuxSolidsStrandOrder = EgtGetStringFromIni( SEC_DEFAULT, KEY_AUX_SOLIDS_PRINT_ORDER, 'InToOut', sFile) - if sAuxSolidsStrandOrder == 'OutToIn' then - EgtSetInfo( nPartId, KEY_AUX_SOLIDS_PRINT_ORDER, PRINT_ORDER.EXT_INT) - else -- 'InToOut' - EgtSetInfo( nPartId, KEY_AUX_SOLIDS_PRINT_ORDER, PRINT_ORDER.INT_EXT) - end - - local sAuxSolidsLinkType = EgtGetStringFromIni( SEC_DEFAULT, KEY_AUX_SOLIDS_LINK_TYPE, 'None', sFile) - if sAuxSolidsLinkType == 'None' then - EgtSetInfo( nPartId, KEY_AUX_SOLIDS_LINK_TYPE, LINK_TYPE.NONE) - elseif sAuxSolidsLinkType == 'BiArc' then - EgtSetInfo( nPartId, KEY_AUX_SOLIDS_LINK_TYPE, LINK_TYPE.BIARC) - else -- 'Linear' - EgtSetInfo( nPartId, KEY_AUX_SOLIDS_LINK_TYPE, LINK_TYPE.LINEAR) - end - - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_AUX_SOLIDS_LINK_PARAM, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_AUX_SOLIDS_SP_OFFSET, '0.0') - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_AUX_SOLIDS_COASTING_LEN, EgtGetInfo( nPartId, KEY_COASTING_LEN, 'd')) - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_AUX_SOLIDS_WIPE_LEN, EgtGetInfo( nPartId, KEY_WIPE_LEN, 'd')) - SetParamInfo( sFile, nPartId, SEC_DEFAULT, KEY_AUX_SOLIDS_WIPE_DIR, '0.0') -end - --------------------------------------------------------------------- local function RestoreOriginalPosition( nPartId) if not nPartId then return end @@ -319,39 +138,12 @@ function RunSlicing.Exec() local nShellNbrLay = EgtGetFirstNameInGroup( nPartId, LAY_SHELL_NBR) local nAuxSolidsLay = EgtGetFirstNameInGroup( nPartId, LAY_AUX_SOLIDS) local nStartLayId = EgtGetFirstNameInGroup( nPartId, LAY_MACH_START) - - local sParamFile - if not PRINT or PRINT.PROGRAM ~= 1 then - --Scelta del file dei parametri - local sPrevParamFile = EgtGetInfo( nPartId, KEY_PARAMS) - if not sPrevParamFile or not EgtExistsFile( sPrevParamFile) then - local sLastParamFile = EgtGetStringFromIni( '3dPrinting', 'ParamFile', '', EgtGetIniFile()) - local sDir = EgtSplitPath( sLastParamFile) - sPrevParamFile = sDir..'*.ini' - end - sParamFile = EgtFileDialog( true, sPrevParamFile, 'Param Files (*.ini)|*.ini||') - if not sParamFile then - EgtOutBox( 'No param file selected', 'Warning', 'WARNING') - return - end - EgtWriteStringToIni( '3dPrinting', 'ParamFile', sParamFile, EgtGetIniFile()) - end - - -- Elimino eventuale precedente file dei risultati - if not PRINT or PRINT.PROGRAM ~= 1 then - local sResultFile = EgtChangePathExtension( sCurrProjectPath, '.csv') - EgtEraseFile( sResultFile) - end - + -- Elimino eventuale precedente lavorazione EgtSetCurrMachGroup() EgtRemoveAllOperations() EgtResetCurrMachGroup() - -- Lettura dei parametri - if not PRINT or PRINT.PROGRAM ~= 1 then - LoadParams( sParamFile, nPartId) - end -- Lettura dati macchina local sMachIni = EgtGetCurrMachineDir() .. '\\' .. EgtGetCurrMachineName() .. '.ini' local HMax = tonumber( EgtGetStringFromIni( '3dPrinting', 'HMax', 500, sMachIni)) @@ -364,25 +156,34 @@ function RunSlicing.Exec() -- Rimozione vecchi TFS RemoveOldTFS() - + -- Calcolo delle fette - CSLICES.Exec( nPartId, nStmId, HMax) + local bOk = CSLICES.Exec( nPartId, nStmId, HMax) EgtDraw() -- Calcolo dei percorsi sul centro strand in basso - CPATHS.Exec( nPartId) + bOk = bOk and CPATHS.Exec( nPartId) EgtDraw() -- Calcolo dei percorsi di lavoro - CTP.Exec( nPartId) + bOk = bOk and CTP.Exec( nPartId) EgtDraw() -- Calcolo dei solidi degli strand a partire dai percorsi di lavoro local bCalcSolids = EgtGetInfo( nPartId, KEY_CALC_SOLIDS, 'b') EgtRemoveInfo( nPartId, KEY_HAS_SOLIDS) - if bCalcSolids then + if bCalcSolids and bOk then CSOLIDS.Exec( nPartId) end + + if not bOk then + -- eventuale ripristino posizione originaria + RestoreOriginalPosition( nPartId) + -- rimozione vecchi conti + RemoveOldSlices( nPartId) + EgtDraw() + return false + end EgtSetStatus( nSolidLayId, GDB_ST.OFF) EgtSetStatus( nRibsLayId or GDB_ID.NULL, GDB_ST.OFF) @@ -393,7 +194,8 @@ function RunSlicing.Exec() -- Aggiorno impostazioni di visibilita' per ShowManager SetViewInfo( bCalcSolids) - + + return true end --------------------------------------------------------------------- From 9e1588b3863d8b2789ed0cc18fa8fdb3ba4dc2ea Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 28 Feb 2023 08:31:08 +0100 Subject: [PATCH 73/79] 3dPrinting 2.5b3 : - aggiunto Version.lua. --- Version.lua | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 Version.lua diff --git a/Version.lua b/Version.lua new file mode 100644 index 0000000..6e0e229 --- /dev/null +++ b/Version.lua @@ -0,0 +1,4 @@ +-- Version.lua by Egaltech s.r.l. 2023/02/28 +-- Gestione della versione di 3dPrinting + +VERSION = '2.5b3' \ No newline at end of file From 921b8e2ef230ed397b485c46f3390d217fdccdfe Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 1 Mar 2023 15:04:03 +0100 Subject: [PATCH 74/79] 3dPrinting 2.5c1 : - aggiunto flag per decidere se limitare ribs unbounded con solido. --- LuaLibs/AddManData.lua | 1 + LuaLibs/CalcSlices.lua | 5 +++-- Version.lua | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index aead0aa..756e6e0 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -85,6 +85,7 @@ KEY_TOOL_DIAM = "ToolDiam" -- Ribs KEY_RIBS_TYPE = "RibsType" +KEY_LIMIT_UNBDD_RIBS = "LimitUnboundedRibsWithSolid" KEY_RIBS_OVERLAP = "RibsOverlap" KEY_RIBS_SHELLS_NBR = "RibsStrandCount" KEY_RIBS_LINK = "RibsLink" diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 3787de7..83e58ba 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -636,12 +636,13 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) -- recupero la superficie ed eventuali setti esterni/unbounded da usare come riferimenti per quote slicing local vRefIds = {} if nStmId then table.insert( vRefIds, nStmId) end - local nRibsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_RIBS) + local nRibsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_RIBS) local vRibsIds = EgtGetAllInGroup( nRibsLay) + local bLimitUnbddRibs = EgtGetInfo( s_nPartId, KEY_LIMIT_UNBDD_RIBS, 'b') or false for i = 1, #vRibsIds do if EgtGetType( vRibsIds[i]) == GDB_TY.SRF_MESH then local nType = ReadParam( vRibsIds[i], KEY_RIBS_TYPE, 'i', RIB_TYPE.INTERNAL) - if nType == RIB_TYPE.EXTERNAL or nType == RIB_TYPE.UNBOUNDED then + if nType == RIB_TYPE.EXTERNAL or ( nType == RIB_TYPE.UNBOUNDED and not bLimitUnbddRibs) then table.insert( vRefIds, vRibsIds[i]) end end diff --git a/Version.lua b/Version.lua index 6e0e229..5861dbb 100644 --- a/Version.lua +++ b/Version.lua @@ -1,4 +1,4 @@ -- Version.lua by Egaltech s.r.l. 2023/02/28 -- Gestione della versione di 3dPrinting -VERSION = '2.5b3' \ No newline at end of file +VERSION = '2.5c1' \ No newline at end of file From 25fb2b6b37d87becb3e879c9789a949c49346fe7 Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Fri, 3 Mar 2023 13:13:08 +0100 Subject: [PATCH 75/79] - gestito conto separato lunghezza percorso per calcolo massa totale oggetto --- LuaLibs/RunMachParamFromSWCalc.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/LuaLibs/RunMachParamFromSWCalc.lua b/LuaLibs/RunMachParamFromSWCalc.lua index 8b0e6e2..f0e332f 100644 --- a/LuaLibs/RunMachParamFromSWCalc.lua +++ b/LuaLibs/RunMachParamFromSWCalc.lua @@ -79,18 +79,24 @@ function RunMachParamFromSWCalc.Exec() EgtRemoveInfo( nLayerId, KEY_WAITING_TIME) -- calcolo lunghezza totale del layer local dTotLayerLength = 0 + local dTotLayerLengthForMass = 0 local dTotLayerArea = 0 local nCrvId = EgtGetFirstNameInGroup( nLayerId, CONTOUR_GRP .. '*') while nCrvId do local nToolPathId = EgtGetFirstNameInGroup( nCrvId, TOOLPATH_GRP) -- sommo lunghezze percorsi local dTotCrvLength = 0 + local dTotCrvLengthForMass = 0 nShellId = EgtGetFirstInGroup( nToolPathId) while nShellId do dTotCrvLength = dTotCrvLength + EgtCurveLength( nShellId) + if EgtGetName( nShellId) ~= WIPE_CRV then + dTotCrvLengthForMass = dTotCrvLengthForMass + EgtCurveLength( nShellId) + end nShellId = EgtGetNext( nShellId) end dTotLayerLength = dTotLayerLength + dTotCrvLength + dTotLayerLengthForMass = dTotLayerLengthForMass + dTotCrvLengthForMass -- recupero area local nOuterCrvId = EgtGetFirstNameInGroup( nCrvId, OUTER_CRV) if nOuterCrvId and dStrandCount > 0.5 then @@ -178,7 +184,7 @@ function RunMachParamFromSWCalc.Exec() dLayerWait = floor( dTMin + 0.5) - floor( dLayerTime + 0.5) end -- calcolo massa dello strato - local dLayerMass = dTotLayerLength * dSliceStep * dStrand * MATERIAL.Density * 1e-6 + local dLayerMass = dTotLayerLengthForMass * dSliceStep * dStrand * MATERIAL.Density * 1e-6 if dLayerMass and dLayerMass > 0 then dPrintMass = dPrintMass + dLayerMass end From 862216b84fbe2ab9d5bf8c700d2520780a0e1655 Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 6 Mar 2023 14:54:19 +0100 Subject: [PATCH 76/79] 3dPrinting 2.5c2 : - aggiunto taglio dei ribs unbounded con solido se richiesto. --- LuaLibs/CalcSlices.lua | 40 ++++++++-- LuaLibs/CalcToolPath.lua | 157 ++++++++++++++++++++------------------- Version.lua | 2 +- 3 files changed, 118 insertions(+), 81 deletions(-) diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 83e58ba..530b06d 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -170,7 +170,7 @@ local function GetAuxSolidsParams( nId) end -------------------------------------------------------------------- -local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName) +local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName, nStmId) -- recupero gli oggeti di cui fare slicing local vIds = EgtGetAllInGroup( nLay) @@ -207,7 +207,27 @@ local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName) table.insert( tabParams, vParams) table.insert( vToBeDone, bToBeDone) end - + + -- taglio i setti unbounded e limitati con il solido + local vEraseIds = {} + if nType == TYPE.RIB then + local bLimitUnbddRibs = EgtGetInfo( s_nPartId, KEY_LIMIT_UNBDD_RIBS, 'b') or false + if bLimitUnbddRibs then + for i = 1, #vIds do + if vToBeDone[i] then + if tabParams[i][KEY_RIBS_TYPE] == RIB_TYPE.UNBOUNDED then + -- creo copia e la taglio con solido + local nCopy = EgtCopyGlob( vIds[i], EgtGetParent( vIds[i])) + EgtSurfTmCut( nCopy, nStmId, true, true) + -- lo slicing viene fatto sulla copia + vIds[i] = nCopy + table.insert( vEraseIds, nCopy) + end + end + end + end + end + local nLayId = EgtGetFirstNameInGroup( s_nPartId, SLICE_LAYER .. '*') while nLayId do -- recupero quota per slicing @@ -271,6 +291,11 @@ local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName) end nLayId = EgtGetNextName( nLayId, SLICE_LAYER .. '*') end + + -- rimuovo eventuali copie create per lo slicing + for i = 1, #vEraseIds do + EgtErase( vEraseIds[i]) + end return true end @@ -591,14 +616,14 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin -- costolature local nRibsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_RIBS) if nRibsLay then - SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV) + SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV, nStmId) end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 1) / ( #vZSlices + 3) * 100, 0) == 1 then return false 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) + SlicingExtraObjects( vtSlicing, nShellNbrLay, TYPE.EXTRA_SHELL, SHELL_NBR_GRP, SHELL_NBR_CRV, nStmId) end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 2) / ( #vZSlices + 3) * 100, 0) == 1 then return false end @@ -606,7 +631,7 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin local nAuxSolidsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_AUX_SOLIDS) if nAuxSolidsLay then AdjustAuxSolids( nAuxSolidsLay) - SlicingExtraObjects( vtSlicing, nAuxSolidsLay, TYPE.AUX_SOLID, AUX_SOLIDS_GRP, AUX_SOLIDS_CRV) + SlicingExtraObjects( vtSlicing, nAuxSolidsLay, TYPE.AUX_SOLID, AUX_SOLIDS_GRP, AUX_SOLIDS_CRV, nStmId) end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 3) / ( #vZSlices + 3) * 100, 0) == 1 then return false end end @@ -648,6 +673,11 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) end end + if bLimitUnbddRibs and not nStmId then + EgtOutBox( "No solid to limit unbounded ribs!", 'Error', 'ERROR') + return + end + -- recupero il box local b3Box = BBox3d() for i = 1, #vRefIds do diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 5297b7a..9c71d97 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -42,7 +42,7 @@ local function GetLayerParamsForToolPathCalc() LayerParams.dWipeDir = EgtGetInfo( s_nPartId, KEY_WIPE_DIR, 'd') or 0.0 LayerParams.vtSlicing = EgtGetInfo( s_nPartId, KEY_SLICING_DIR, 'v') LayerParams.dTDiam = EgtGetInfo( s_nPartId, KEY_TOOL_DIAM, 'd') - + return LayerParams end @@ -866,7 +866,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp) local bLIInvert = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_INVERT, 'b') if dLILen < GEO.EPS_SMALL then return end - + -- recupero la curva di offset su cui calcolare leadin local ptS = EgtSP( nCrv) local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) @@ -889,7 +889,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp) end -------------------------------------------------------------------- -local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, nGrpTmp) +local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, nGrpTmp, bForceNoBorder) local dRibsLOLen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_LEN, 'd') local dRibsLOCoasting = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_COASTING, 'd') @@ -905,82 +905,84 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n local vtE = EgtEV( nCrv, GDB_ID.ROOT) -- recupero la curva di offset su cui calcolare lead out - local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) - while nCrvOffs do - local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE, GEO.EPS_SMALL, GDB_RT.GLOB) - if dParE then - - local nCrvLO - local nCoasting - local nWipe - - -- trovo curva opportuna per lead out - local nCrvRef, bInvert = FindCorrectRibsLead( dParE, nCrv, nCrvOffs, bRibsLOInvert, dRibsLOLen + dRibsLOCoasting, dStrand, false, nGrpTmp) - - if nCrvRef then - -- verifico se la curva ha lunghezza sufficiente - local dLen = EgtCurveLength( nCrvRef) - local bSkip = ( dLen - dRibsLOLen - dRibsLOCoasting < - GEO.EPS_SMALL) - - -- primo tratto ( segue offset con flusso aperto) - if dRibsLOLen > GEO.EPS_SMALL and not bSkip then - nCrvLO = EgtCopyGlob( nCrvRef, nCrv, GDB_IN.AFTER) - EgtTrimCurveEndAtLen( nCrvLO, dRibsLOLen) - EgtModifyCurveExtrusion( nCrvLO, vtSlicing, GDB_RT.GLOB) - EgtSetInfo( nCrvLO, KEY_TYPE, TYPE.RIB) - EgtSetName( nCrvLO, LEAD_OUT_CRV) - -- aggiorno ptE e vtE - ptE = EgtEP( nCrvLO, GDB_ID.ROOT) - vtE = EgtEV( nCrvLO, GDB_ID.ROOT) - end - - -- secondo tratto ( segue offset con flusso chiuso) - if dRibsLOCoasting > GEO.EPS_SMALL then - nCoasting = EgtCopyGlob( nCrvRef, nCrvLO or nCrv, GDB_IN.AFTER) - EgtTrimCurveStartAtLen( nCoasting, dRibsLOLen) - EgtTrimCurveEndAtLen( nCoasting, dRibsLOCoasting) - EgtModifyCurveExtrusion( nCoasting, vtSlicing, GDB_RT.GLOB) - - EgtSetName( nCoasting, COASTING_CRV) - EgtSetInfo( nCoasting, KEY_TYPE, TYPE.COASTING) - EgtSetColor( nCoasting, EgtStdColor('ORANGE')) - - -- aggiorno ptE e vtE - ptE = EgtEP( nCoasting, GDB_ID.ROOT) - vtE = EgtEV( nCoasting, GDB_ID.ROOT) - end - EgtErase( nCrvRef) + if not bForceNoBorder then + local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) + while nCrvOffs do + local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE, GEO.EPS_SMALL, GDB_RT.GLOB) + if dParE then - -- terzo tratto ( diretto verso esterno con ugello chiuso) - if dRibsLOWipe > GEO.EPS_SMALL then - local dAng = dRibsLOWipeAng + s_nDefaultWipeAng - local nType = EgtGetInfo( nCrv, KEY_RIBS_TYPE, 'i') - if nType == RIB_TYPE.EXTERNAL then dAng = - dAng end - vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng)) - local ptFinal = ptE + vtE * dRibsLOWipe - -- verifico soddisfi altezza minima per dimensioni utensile - local k = 1 - while ptFinal:getZ() < s_dHMin + GEO.EPS_SMALL and k < 36 do - vtE:rotate( vtSlicing, EgtIf( bInvert, - 10, 10)) - ptFinal = ptE + vtE * dRibsLOWipe - k = k + 1 + local nCrvLO + local nCoasting + local nWipe + + -- trovo curva opportuna per lead out + local nCrvRef, bInvert = FindCorrectRibsLead( dParE, nCrv, nCrvOffs, bRibsLOInvert, dRibsLOLen + dRibsLOCoasting, dStrand, false, nGrpTmp) + + if nCrvRef then + -- verifico se la curva ha lunghezza sufficiente + local dLen = EgtCurveLength( nCrvRef) + local bSkip = ( dLen - dRibsLOLen - dRibsLOCoasting < - GEO.EPS_SMALL) + + -- primo tratto ( segue offset con flusso aperto) + if dRibsLOLen > GEO.EPS_SMALL and not bSkip then + nCrvLO = EgtCopyGlob( nCrvRef, nCrv, GDB_IN.AFTER) + EgtTrimCurveEndAtLen( nCrvLO, dRibsLOLen) + EgtModifyCurveExtrusion( nCrvLO, vtSlicing, GDB_RT.GLOB) + EgtSetInfo( nCrvLO, KEY_TYPE, TYPE.RIB) + EgtSetName( nCrvLO, LEAD_OUT_CRV) + -- aggiorno ptE e vtE + ptE = EgtEP( nCrvLO, GDB_ID.ROOT) + vtE = EgtEV( nCrvLO, GDB_ID.ROOT) + end + + -- secondo tratto ( segue offset con flusso chiuso) + if dRibsLOCoasting > GEO.EPS_SMALL then + nCoasting = EgtCopyGlob( nCrvRef, nCrvLO or nCrv, GDB_IN.AFTER) + EgtTrimCurveStartAtLen( nCoasting, dRibsLOLen) + EgtTrimCurveEndAtLen( nCoasting, dRibsLOCoasting) + EgtModifyCurveExtrusion( nCoasting, vtSlicing, GDB_RT.GLOB) + + EgtSetName( nCoasting, COASTING_CRV) + EgtSetInfo( nCoasting, KEY_TYPE, TYPE.COASTING) + EgtSetColor( nCoasting, EgtStdColor('ORANGE')) + + -- aggiorno ptE e vtE + ptE = EgtEP( nCoasting, GDB_ID.ROOT) + vtE = EgtEV( nCoasting, GDB_ID.ROOT) end + EgtErase( nCrvRef) - nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}, GDB_RT.GLOB) - EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB) - EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER) - EgtSetName( nWipe, WIPE_CRV) - EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE) - EgtSetColor( nWipe, EgtStdColor('AQUA')) + -- terzo tratto ( diretto verso esterno con ugello chiuso) + if dRibsLOWipe > GEO.EPS_SMALL then + local dAng = dRibsLOWipeAng + s_nDefaultWipeAng + local nType = EgtGetInfo( nCrv, KEY_RIBS_TYPE, 'i') + if nType == RIB_TYPE.EXTERNAL then dAng = - dAng end + vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng)) + local ptFinal = ptE + vtE * dRibsLOWipe + -- verifico soddisfi altezza minima per dimensioni utensile + local k = 1 + while ptFinal:getZ() < s_dHMin + GEO.EPS_SMALL and k < 36 do + vtE:rotate( vtSlicing, EgtIf( bInvert, - 10, 10)) + ptFinal = ptE + vtE * dRibsLOWipe + k = k + 1 + end + + nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}, GDB_RT.GLOB) + EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB) + EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER) + EgtSetName( nWipe, WIPE_CRV) + EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE) + EgtSetColor( nWipe, EgtStdColor('AQUA')) + end + else + -- aggiungo coasting e wipe come sulle shell normali + AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) end - else - -- aggiungo coasting e wipe come sulle shell normali - AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) + return end - return + + nCrvOffs = EgtGetNext( nCrvOffs) end - - nCrvOffs = EgtGetNext( nCrvOffs) end -- se non ho trovato curva sul bordo su cui fare il lead out aggiungo coasting e wipe come sulle shell normali @@ -1070,17 +1072,22 @@ local function CalcRibsToolPath( vEntIds, nRibsGrp, nTpathGrpId, LayerParams) end -- leadin/leadout + local bForceNoBorder = false + local nType = EgtGetInfo( vEntIds[1], KEY_RIBS_TYPE, 'i') + if nType == RIB_TYPE.UNBOUNDED then + bForceNoBorder = true + end local nCrvRib = nNewFirstEnt while nCrvRib do -- verifico se necessario lead in local nPrev = EgtGetPrev( nCrvRib) - if not nPrev or EgtGetName( nPrev) ~= LINK_CRV then + if ( not nPrev or EgtGetName( nPrev) ~= LINK_CRV) and not bForceNoBorder then AddRibsLeadIn( nCrvRib, nLoopGrp, LayerParams.dStrand, LayerParams.vtSlicing, nGrpTmp) end -- verifico se necessario lead out local nNext = EgtGetNext( nCrvRib) if not nNext or EgtGetName( nNext) ~= LINK_CRV then - AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand, nGrpTmp) + AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand, nGrpTmp, bForceNoBorder) end nCrvRib = EgtGetNextName( nCrvRib, RIBS_CRV .. '*') end diff --git a/Version.lua b/Version.lua index 5861dbb..d615f4e 100644 --- a/Version.lua +++ b/Version.lua @@ -1,4 +1,4 @@ -- Version.lua by Egaltech s.r.l. 2023/02/28 -- Gestione della versione di 3dPrinting -VERSION = '2.5c1' \ No newline at end of file +VERSION = '2.5c2' \ No newline at end of file From 1da71888e7cacb57d7ff179dc315a383ffe14646 Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 13 Mar 2023 10:56:56 +0100 Subject: [PATCH 77/79] 3dPrinting : - corretto il calcolo della correzione in z per appoggiare sulla tavola/bancaletto. --- LuaLibs/AddManData.lua | 1 + LuaLibs/CalcSlices.lua | 1 + LuaLibs/CalcToolPath.lua | 44 +++++++++++++++++++++------------------- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 756e6e0..a2a0697 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -153,6 +153,7 @@ KEY_CLOSED_CRV = "ClosedCrv" KEY_ASSOCIATED_SURF = "AssociatedSurf" KEY_ASSOCIATED_CRVS = "AssociatedCrvs" KEY_HAS_SOLIDS = "Solids" +KEY_BOX_MIN_Z = "PartBoxMinZ" SLICING_TYPE = { VERTICAL = 1, diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 530b06d..8d74447 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -36,6 +36,7 @@ local function ComputeMaxH( vIds, frSlicing, HMax, dSliceStep) local b3Box = EgtGetBBoxGlob( vIds[i], GDB_BB.STANDARD) b3BoxGlob:Add( b3Box) end + EgtSetInfo( s_nPartId, KEY_BOX_MIN_Z, b3BoxGlob:getMin():getZ()) if b3BoxGlob:getMax():getZ() < b3BoxGlob:getMin():getZ() + HMax + GEO.EPS_SMALL then return GEO.INFINITO diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 9c71d97..ed5c3d6 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -71,9 +71,10 @@ local function AddZCorrection( b3Box, LayerParams) -- altezza necessaria per lo strand local dHStrand = 0.5 * LayerParams.dStrand * dNxy + LayerParams.dLayHeight * dNz -- altezza necessaria per il tool - local dHTool = s_dHMin + local dHTool = LayerParams.dTDiam / 2 * dNxy -- altezza disponibile - local dHDisp = b3Box:getMin():getZ() + local dHBox = EgtGetInfo( s_nPartId, KEY_BOX_MIN_Z, 'i') or 0 + local dHDisp = b3Box:getMin():getZ() - dHBox local dCorrZ = max( 0, max( dHStrand, dHTool) - dHDisp) @@ -87,6 +88,21 @@ local function AddZCorrection( b3Box, LayerParams) end +------------------------------------------------------------------ +local function FindWipeEndPoint( ptS, vtDir, dLen, vtSlicing) + + local ptE = ptS + vtDir * dLen + -- verifico soddisfi altezza minima per non entrare nella tavola + local k = 1 + while ptE:getZ() < s_dHMin + GEO.EPS_SMALL and k < 36 do + vtDir:rotate( vtSlicing, 10) + ptE = ptS + vtDir * dLen + k = k + 1 + end + + return ptE +end + ------------------------------------------------------------------- local function AddCurvesToToolPath( vEntIds, nTpathGrpId, nOrder, bInvert, vtSlicing, dLayHeight) @@ -347,14 +363,7 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi end vtDir:rotate( vtSlicing, EgtIf( bChangeSign, - dAng, dAng)) local ptS = EgtEP( nCoastingId or nCrvId, GDB_ID.ROOT) - local ptE = ptS + vtDir * dWipeLen - -- verifico soddisfi altezza minima per dimensioni utensile - local k = 1 - while ptE:getZ() < s_dHMin + GEO.EPS_SMALL and k < 36 do - vtDir:rotate( vtSlicing, EgtIf( bChangeSign, 10, -10)) - ptE = ptS + vtDir * dWipeLen - k = k + 1 - end + local ptE = FindWipeEndPoint( ptS, vtDir, dWipeLen, vtSlicing) nWipeId = EgtCurveCompoFromPoints( EgtGetParent( nCoastingId or nCrvId), {ptS, ptE}, GDB_RT.GLOB) EgtModifyCurveExtrusion( nWipeId, vtSlicing, GDB_RT.GLOB) EgtRelocateGlob( nWipeId, nCoastingId or nCrvId, GDB_IN.AFTER) @@ -958,15 +967,7 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n local nType = EgtGetInfo( nCrv, KEY_RIBS_TYPE, 'i') if nType == RIB_TYPE.EXTERNAL then dAng = - dAng end vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng)) - local ptFinal = ptE + vtE * dRibsLOWipe - -- verifico soddisfi altezza minima per dimensioni utensile - local k = 1 - while ptFinal:getZ() < s_dHMin + GEO.EPS_SMALL and k < 36 do - vtE:rotate( vtSlicing, EgtIf( bInvert, - 10, 10)) - ptFinal = ptE + vtE * dRibsLOWipe - k = k + 1 - end - + local ptFinal = FindWipeEndPoint( ptE, vtE, dRibsLOWipe, vtSlicing) nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}, GDB_RT.GLOB) EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB) EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER) @@ -1260,9 +1261,10 @@ function CalcToolPath.Exec( nPartId) -- recupero i parametri per calcolo dei toolpath local LayerParams = GetLayerParamsForToolPathCalc() - -- altezza necessaria per ugello ( per correzione wipe) + -- altezza necessaria per correzione wipe local dNxy = sqrt( LayerParams.vtSlicing:getX() * LayerParams.vtSlicing:getX() + LayerParams.vtSlicing:getY() * LayerParams.vtSlicing:getY()) - s_dHMin = LayerParams.dTDiam / 2 * dNxy + local dHBox = EgtGetInfo( s_nPartId, KEY_BOX_MIN_Z, 'i') or 0 + s_dHMin = LayerParams.dTDiam / 2 * dNxy + dHBox -- caso spiral vase if LayerParams.bSpiralVase then From 3745705b3d82ccaa193c1cf6a88af291acf78071 Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 16 Mar 2023 14:54:56 +0100 Subject: [PATCH 78/79] 3dPrinting : - corretto errore nel trim dei ribs. --- LuaLibs/CalcPaths.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 5826def..c7686af 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -1496,7 +1496,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) local nSrfExt = EgtGetFirstNameInGroup( nCrvGrp, LAYER_SRF) or GDB_ID.NULL -- trim grossolano dei setti - local nTrimGrp = TrimRibs( vOrigRibs, nRibsGrp, nSrfExt, LayerParams.dOffs + LayerParams.dStrand, LayerParams.vtSlicing) + local nTrimGrp = TrimRibs( vOrigRibs, nRibsGrp, nSrfExt, LayerParams.dOffs - LayerParams.dStrand / 2, LayerParams.vtSlicing) -- calcolo offset orientati local nOffsGrp = ComputeRibsOrientedOffset( nTrimGrp, LayerParams.dStrand) From 046431a2a96f0a99920666e5163f66267f5483c9 Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 20 Mar 2023 11:49:15 +0100 Subject: [PATCH 79/79] 3dPrinting : - corretta la gestione delle uscite per setti chiusi con link disegnato dall'utente. --- LuaLibs/AddManData.lua | 3 +- LuaLibs/CalcPaths.lua | 10 +- LuaLibs/CalcToolPath.lua | 203 ++++++++++++++++++++++----------------- 3 files changed, 125 insertions(+), 91 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index a2a0697..934eff9 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -107,7 +107,7 @@ KEY_SPLIT_AFTER_TRIM_TOT = "RibsSplitAfterTrimTot" KEY_SPLIT_ID = "SplitId" KEY_START_RIB = "StartRib" KEY_ORIGINAL_RIB = "OriginalRib" -KEY_ORIGINAL_RIB_CLOSED = "OriginalRibClosed" +KEY_LOOP_RIB = "LoopRib" KEY_RIBS_USER_LINK = "RibWithUserLink" KEY_RIBS_USER_LINK_CCW = "RibUserLinkCCW" KEY_RIBS_USER_LINK_ORDER = "RibUserLinkOrder" @@ -154,6 +154,7 @@ KEY_ASSOCIATED_SURF = "AssociatedSurf" KEY_ASSOCIATED_CRVS = "AssociatedCrvs" KEY_HAS_SOLIDS = "Solids" KEY_BOX_MIN_Z = "PartBoxMinZ" +KEY_START_POINT = "StartPoint" SLICING_TYPE = { VERTICAL = 1, diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index c7686af..5347226 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -525,9 +525,6 @@ local function TrimRibs( vRibs, nRibsGrp, nSrf, dSrfOffs, vtSlicing) for i = 1, #vRibs do local nCopyRib = EgtCopyGlob( vRibs[i], nTrimmedRibsGrp) local nType = EgtGetInfo( vRibs[i], KEY_RIBS_TYPE, 'i') - if EgtCurveIsClosed( vRibs[i]) then - EgtSetInfo( nCopyRib, KEY_ORIGINAL_RIB_CLOSED, 1) - end local nCrv, nCnt if nType == RIB_TYPE.INTERNAL or nType == RIB_TYPE.SUPPORT then @@ -561,6 +558,10 @@ local function TrimRibs( vRibs, nRibsGrp, nSrf, dSrfOffs, vtSlicing) for nId = nCrv, nCrv + nCnt - 1 do EgtSetInfo( nId, KEY_START_RIB, vRibs[i]) + -- se originale era chiusa ma è stata spezzata dopo il trim è il caso di LoopRib + if EgtCurveIsClosed( vRibs[i]) and nCnt > 1 then + EgtSetInfo( nId, KEY_LOOP_RIB, 1) + end end -- verifico se link definito dall'utente e ne analizzo le proprietà CheckRibUserLink( nCrv, nCnt, vtSlicing) @@ -2198,7 +2199,8 @@ function CalcPaths.Exec( nPartId) for i = 1, #vOuterShell do table.insert( vPtInnerStart, EgtSP( vOuterShell[i])) end - if #vPtInnerStart == 0 then vPtInnerStart = vPtStart end + if #vPtInnerStart == 0 then vPtInnerStart = vPtStart end + EgtSetInfo( nCrvGrpId, KEY_START_POINT, vPtInnerStart[1]) -- pareti interne complete for nInd = 1, LayerParams.nShellsNbr - 1 - nMaxShellNbrDiff do diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index ed5c3d6..eae9490 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -570,7 +570,7 @@ local function VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) local ptE = EgtEP( nNext) local dParS = EgtCurveParamAtPoint( nLinkId, ptS) local dParE = EgtCurveParamAtPoint( nLinkId, ptE) - if dParS or dParE then + if nCurr ~= nNext and ( dParS or dParE) then return false end @@ -710,12 +710,14 @@ local function VerifyRibsLead( nId, nRibId, dStrand, bInVsOut, nGrpTmp) EgtExtendCurveEndByLen( nLeadId, dStrand * 0.5) end - -- verifico che intersechi solo l'estrmo corretto - local pt = EgtIf( bInVsOut, EgtEP( nRibId), EgtSP( nRibId)) - local dPar = EgtCurveParamAtPoint( nLeadId, pt) - if dPar then - EgtErase( nLeadId) - return false + -- verifico che intersechi solo l'estremo corretto + if not EgtCurveIsClosed( nRibId) then + local pt = EgtIf( bInVsOut, EgtEP( nRibId), EgtSP( nRibId)) + local dPar = EgtCurveParamAtPoint( nLeadId, pt) + if dPar then + EgtErase( nLeadId) + return false + end end local pt1 = EgtIf( bInVsOut, EgtSP( nLeadId), EgtEP( nLeadId)) @@ -910,82 +912,85 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n abs( dRibsLOCoasting) < GEO.EPS_SMALL and abs( dRibsLOWipe) < GEO.EPS_SMALL then return end - local ptE = EgtEP( nCrv, GDB_ID.ROOT) - local vtE = EgtEV( nCrv, GDB_ID.ROOT) - - -- recupero la curva di offset su cui calcolare lead out - if not bForceNoBorder then - local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) - while nCrvOffs do - local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE, GEO.EPS_SMALL, GDB_RT.GLOB) - if dParE then - - local nCrvLO - local nCoasting - local nWipe - - -- trovo curva opportuna per lead out - local nCrvRef, bInvert = FindCorrectRibsLead( dParE, nCrv, nCrvOffs, bRibsLOInvert, dRibsLOLen + dRibsLOCoasting, dStrand, false, nGrpTmp) - - if nCrvRef then - -- verifico se la curva ha lunghezza sufficiente - local dLen = EgtCurveLength( nCrvRef) - local bSkip = ( dLen - dRibsLOLen - dRibsLOCoasting < - GEO.EPS_SMALL) - - -- primo tratto ( segue offset con flusso aperto) - if dRibsLOLen > GEO.EPS_SMALL and not bSkip then - nCrvLO = EgtCopyGlob( nCrvRef, nCrv, GDB_IN.AFTER) - EgtTrimCurveEndAtLen( nCrvLO, dRibsLOLen) - EgtModifyCurveExtrusion( nCrvLO, vtSlicing, GDB_RT.GLOB) - EgtSetInfo( nCrvLO, KEY_TYPE, TYPE.RIB) - EgtSetName( nCrvLO, LEAD_OUT_CRV) - -- aggiorno ptE e vtE - ptE = EgtEP( nCrvLO, GDB_ID.ROOT) - vtE = EgtEV( nCrvLO, GDB_ID.ROOT) - end - - -- secondo tratto ( segue offset con flusso chiuso) - if dRibsLOCoasting > GEO.EPS_SMALL then - nCoasting = EgtCopyGlob( nCrvRef, nCrvLO or nCrv, GDB_IN.AFTER) - EgtTrimCurveStartAtLen( nCoasting, dRibsLOLen) - EgtTrimCurveEndAtLen( nCoasting, dRibsLOCoasting) - EgtModifyCurveExtrusion( nCoasting, vtSlicing, GDB_RT.GLOB) - - EgtSetName( nCoasting, COASTING_CRV) - EgtSetInfo( nCoasting, KEY_TYPE, TYPE.COASTING) - EgtSetColor( nCoasting, EgtStdColor('ORANGE')) - - -- aggiorno ptE e vtE - ptE = EgtEP( nCoasting, GDB_ID.ROOT) - vtE = EgtEV( nCoasting, GDB_ID.ROOT) - end - EgtErase( nCrvRef) - - -- terzo tratto ( diretto verso esterno con ugello chiuso) - if dRibsLOWipe > GEO.EPS_SMALL then - local dAng = dRibsLOWipeAng + s_nDefaultWipeAng - local nType = EgtGetInfo( nCrv, KEY_RIBS_TYPE, 'i') - if nType == RIB_TYPE.EXTERNAL then dAng = - dAng end - vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng)) - local ptFinal = FindWipeEndPoint( ptE, vtE, dRibsLOWipe, vtSlicing) - nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}, GDB_RT.GLOB) - EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB) - EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER) - EgtSetName( nWipe, WIPE_CRV) - EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE) - EgtSetColor( nWipe, EgtStdColor('AQUA')) - end - else - -- aggiungo coasting e wipe come sulle shell normali - AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) - end - return - end - - nCrvOffs = EgtGetNext( nCrvOffs) - end + -- se setto chiuso oppure non deve stare sul bordo (rib unbounded) applico la stessa uscita delle shell + if EgtCurveIsClosed( nCrv) or bForceNoBorder then + return AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) end + local ptE = EgtEP( nCrv, GDB_ID.ROOT) + local vtE = EgtEV( nCrv, GDB_ID.ROOT) + + -- recupero la curva di offset su cui calcolare lead out + local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) + while nCrvOffs do + local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE, GEO.EPS_SMALL, GDB_RT.GLOB) + if dParE then + + local nCrvLO + local nCoasting + local nWipe + + -- trovo curva opportuna per lead out + local nCrvRef, bInvert = FindCorrectRibsLead( dParE, nCrv, nCrvOffs, bRibsLOInvert, dRibsLOLen + dRibsLOCoasting, dStrand, false, nGrpTmp) + + if nCrvRef then + -- verifico se la curva ha lunghezza sufficiente + local dLen = EgtCurveLength( nCrvRef) + local bSkip = ( dLen - dRibsLOLen - dRibsLOCoasting < - GEO.EPS_SMALL) + + -- primo tratto ( segue offset con flusso aperto) + if dRibsLOLen > GEO.EPS_SMALL and not bSkip then + nCrvLO = EgtCopyGlob( nCrvRef, nCrv, GDB_IN.AFTER) + EgtTrimCurveEndAtLen( nCrvLO, dRibsLOLen) + EgtModifyCurveExtrusion( nCrvLO, vtSlicing, GDB_RT.GLOB) + EgtSetInfo( nCrvLO, KEY_TYPE, TYPE.RIB) + EgtSetName( nCrvLO, LEAD_OUT_CRV) + -- aggiorno ptE e vtE + ptE = EgtEP( nCrvLO, GDB_ID.ROOT) + vtE = EgtEV( nCrvLO, GDB_ID.ROOT) + end + + -- secondo tratto ( segue offset con flusso chiuso) + if dRibsLOCoasting > GEO.EPS_SMALL then + nCoasting = EgtCopyGlob( nCrvRef, nCrvLO or nCrv, GDB_IN.AFTER) + EgtTrimCurveStartAtLen( nCoasting, dRibsLOLen) + EgtTrimCurveEndAtLen( nCoasting, dRibsLOCoasting) + EgtModifyCurveExtrusion( nCoasting, vtSlicing, GDB_RT.GLOB) + + EgtSetName( nCoasting, COASTING_CRV) + EgtSetInfo( nCoasting, KEY_TYPE, TYPE.COASTING) + EgtSetColor( nCoasting, EgtStdColor('ORANGE')) + + -- aggiorno ptE e vtE + ptE = EgtEP( nCoasting, GDB_ID.ROOT) + vtE = EgtEV( nCoasting, GDB_ID.ROOT) + end + EgtErase( nCrvRef) + + -- terzo tratto ( diretto verso esterno con ugello chiuso) + if dRibsLOWipe > GEO.EPS_SMALL then + local dAng = dRibsLOWipeAng + s_nDefaultWipeAng + local nType = EgtGetInfo( nCrv, KEY_RIBS_TYPE, 'i') + if nType == RIB_TYPE.EXTERNAL then dAng = - dAng end + vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng)) + local ptFinal = FindWipeEndPoint( ptE, vtE, dRibsLOWipe, vtSlicing) + nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}, GDB_RT.GLOB) + EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB) + EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER) + EgtSetName( nWipe, WIPE_CRV) + EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE) + EgtSetColor( nWipe, EgtStdColor('AQUA')) + end + else + -- aggiungo coasting e wipe come sulle shell normali + AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) + end + return + end + + nCrvOffs = EgtGetNext( nCrvOffs) + end + -- se non ho trovato curva sul bordo su cui fare il lead out aggiungo coasting e wipe come sulle shell normali AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) @@ -1031,6 +1036,7 @@ local function CalcRibsToolPath( vEntIds, nRibsGrp, nTpathGrpId, LayerParams) if EgtCurveIsClosed( tabRibs[i][1]) then AddLink( tabRibs[i], nTpathGrpId, LINK_TYPE.NONE, LayerParams.dLinkParam, LayerParams.dSPOffs, LayerParams.dStrand, LayerParams.vtSlicing) else + local bLoopRib = EgtGetInfo( tabRibs[i][1], KEY_LOOP_RIB, 'b') or false for j = 1, #tabRibs[i] - 1 do local bUserLink = EgtGetInfo( tabRibs[i][j], KEY_RIBS_USER_LINK, 'b') or false local nOrig1 = EgtGetInfo( tabRibs[i][j], KEY_ORIGINAL_RIB, 'i') or 0 @@ -1040,19 +1046,44 @@ local function CalcRibsToolPath( vEntIds, nRibsGrp, nTpathGrpId, LayerParams) local bForceLink = ( nOrig1 == nOrig2) if ( nOrig1 ~= nOrig2 and bUserLink) or ( nSplitId1 == nSplitId2 and nOrig1 == nOrig2) then - CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, bForceLink, LayerParams.vtSlicing, nGrpTmp) + local nLinkId = CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, bForceLink, LayerParams.vtSlicing, nGrpTmp) -- creo link fittizio per eliminare tratto corrispondente sulla curva di offset if not bSpecialCase and bForceLink then local nFakeLink = CalcRibsLink( tabRibs[i][j + 1], tabRibs[i][j], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) EgtErase( nFakeLink) end + + -- se LoopRib congiungo i setti in unico percorso + if bLoopRib and nLinkId then + EgtAddCurveCompoCurve( tabRibs[i][j], nLinkId) + EgtAddCurveCompoCurve( tabRibs[i][j], tabRibs[i][j + 1]) + tabRibs[i][j+1] = tabRibs[i][j] -- aggiorno id nel vettore dei setti per gestire correttamente la curva allo step successivo + end end end - -- verifico se necessario collegamento tra primo e ultimo setto del gruppo - local bOriginalClosed = EgtGetInfo( tabRibs[i][1], KEY_ORIGINAL_RIB_CLOSED, 'b') or false - if bOriginalClosed then - CalcRibsLink( tabRibs[i][#tabRibs[i]], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) + -- se LoopRib aggiungo collegamento tra primo e ultimo setto del gruppo + if bLoopRib then + local nTotCrv = #tabRibs[i] + local nLinkId = CalcRibsLink( tabRibs[i][nTotCrv], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) + if nLinkId then + -- se curva unica + if tabRibs[i][nTotCrv] == tabRibs[i][1] then + EgtAddCurveCompoCurve( tabRibs[i][1], nLinkId) + -- setto info di curva chiusa per gestire correttamente il wipe + EgtSetInfo( tabRibs[i][1], KEY_CLOSED_CRV, 1) + -- modifica dello start point ( considera quello delle shell) + local nCrvGrp = EgtGetParent( nTpathGrpId) + local ptStart = EgtGetInfo( nCrvGrp, KEY_START_POINT, 'p') + if ptStart then + EgtChangeClosedCurveStartPoint( tabRibs[i][1], ptStart) + end + else + EgtAddCurveCompoCurve( tabRibs[i][1], nLinkId, true, false) + EgtAddCurveCompoCurve( tabRibs[i][1], tabRibs[i][nTotCrv], true, false) + tabRibs[i][nTotCrv] = tabRibs[i][1] + end + end end if bSpecialCase then