Files
SaraP 973eba6379 3dPrinting :
- aggiunto PrepareExport per creare le geometrie necessarie all'esportazione in 3dm.
2023-10-24 15:21:07 +02:00

219 lines
6.7 KiB
Lua

-- RunSlicing.lua by Egaltech s.r.l. 2022/09/16
-- Calcoli prima fase per Stampa 3d
-- Tabella per definizione modulo
local RunSlicing = {}
--PRINT.PROGRAM = 1
-- Intestazioni
require( 'EgtBase')
EgtOutLog( ' RunSlicing started', 1)
-- Costanti generali
_G.package.loaded.AddManData = nil
local AMD = require( 'AddManData')
-- Librerie
_G.package.loaded.CalcSlices = nil
local CSLICES = require( 'CalcSlices')
_G.package.loaded.CalcPaths = nil
local CPATHS = require( 'CalcPaths')
_G.package.loaded.RunCalcSolids = nil
local CSOLIDS = require( 'RunCalcSolids')
_G.package.loaded.CalcToolPath = nil
local CTP = require( 'CalcToolPath')
---------------------------------------------------------------------
local function RestoreOriginalPosition( nPartId)
if not nPartId then return end
-- 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, 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
---------------------------------------------------------------------
local function RemoveOldSlices( nPartId)
if not nPartId then return end
-- se slicing già presente lo cancello
for i = 1, 2 do
local sFind = EgtIf( i == 1, '', '__') .. SLICE_LAYER .. "*"
local vOldSliceId = EgtGetNameInGroup( nPartId, sFind)
for i = 1, #( vOldSliceId or {}) do
EgtErase( vOldSliceId[i])
end
end
-- rimuovo gruppo con i loop dei setti
local nRibsLoopsGrp = EgtGetFirstNameInGroup( nPartId, RIBS_LOOP_GRP)
if nRibsLoopsGrp then
EgtErase( nRibsLoopsGrp)
end
-- rimuovo eventuali gruppi di infill (anche per aux solids)
local nInfillId = EgtGetFirstNameInGroup( nPartId, INFILL_GRP .. '*')
while nInfillId do
EgtErase( nInfillId)
nInfillId = EgtGetFirstNameInGroup( nPartId, INFILL_GRP .. '*')
end
-- rimuovo gruppo per export
local nExportGrpId = EgtGetFirstNameInGroup( GDB_ID.ROOT, LAY_EXPORT)
if nExportGrpId then
EgtErase( nExportGrpId)
end
end
---------------------------------------------------------------------
local function RemoveOldTFS()
local nTFSCalcId = EgtGetFirstNameInGroup( GDB_ID.ROOT, LAY_TFSCALC)
if nTFSCalcId then
EgtEmptyGroup( nTFSCalcId)
end
end
---------------------------------------------------------------------
local function SetViewInfo( bCalcSolids)
local nViewId = EgtGetFirstNameInGroup( GDB_ID.ROOT, VIEWPARAMS)
if not nViewId then
nViewId = EgtGroup( GDB_ID.ROOT)
EgtSetName( nViewId, VIEWPARAMS)
EgtSetLevel( nViewId, GDB_LV.SYSTEM)
end
EgtSetInfo( nViewId, IMPORTED_SOLID, false)
EgtSetInfo( nViewId, OUTER_CRV, false)
EgtSetInfo( nViewId, PATH_GRP, false)
EgtSetInfo( nViewId, SOLID_GRP, bCalcSolids)
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 valido
local sCurrProjectPath = EgtGetCurrFilePath()
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
local nPartId = EgtGetFirstPart()
while nPartId do
if EgtGetInfo( nPartId, KEY_PART_ON_TABLE, 'b') then
break
end
nPartId = EgtGetNextPart( nPartId)
end
if not nPartId then
EgtOutBox( 'Position part on the machine table before slicing it!', 'Error', 'ERROR')
return
end
local nSolidLayId = EgtGetFirstNameInGroup( nPartId, PRINT_SOLID)
local nStmId = EgtGetFirstInGroup( nSolidLayId or GDB_ID.NULL)
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)
local nAuxSolidsLay = EgtGetFirstNameInGroup( nPartId, LAY_AUX_SOLIDS)
local nStartLayId = EgtGetFirstNameInGroup( nPartId, LAY_MACH_START)
-- Elimino eventuale precedente lavorazione
EgtSetCurrMachGroup()
EgtRemoveAllOperations()
EgtResetCurrMachGroup()
-- Eventuale ripristino posizione originaria
RestoreOriginalPosition( nPartId)
-- Rimozione vecchi conti
RemoveOldSlices( nPartId)
-- Rimozione vecchi TFS
RemoveOldTFS()
-- Calcolo delle fette
local bOk = CSLICES.Exec( nPartId, nStmId)
EgtDraw()
-- Calcolo dei percorsi sul centro strand in basso
bOk = bOk and CPATHS.Exec( nPartId)
EgtDraw()
-- Calcolo dei percorsi di lavoro
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 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)
EgtSetStatus( nShellNbrLay or GDB_ID.NULL, GDB_ST.OFF)
EgtSetStatus( nAuxSolidsLay or GDB_ID.NULL, GDB_ST.OFF)
EgtSetStatus( nStartLayId or GDB_ID.NULL, GDB_ST.OFF)
EgtDraw()
-- Aggiorno impostazioni di visibilita' per ShowManager
SetViewInfo( bCalcSolids)
return true
end
---------------------------------------------------------------------
return RunSlicing