-- 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 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_SLICING_45, '0') 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) if sStrandOrder == 'OutToIn' then EgtSetInfo( nPartId, KEY_PRINT_ORDER, PRINT_ORDER.EXT_INT_INF) else -- 'InToOut' EgtSetInfo( nPartId, KEY_PRINT_ORDER, PRINT_ORDER.INF_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_FEEDPU, '0.9') -- parametri per costolature 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_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_INF) else -- 'InToOut' EgtSetInfo( nPartId, KEY_AUX_SOLIDS_PRINT_ORDER, PRINT_ORDER.INF_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 RestoreSolidPosition( nPartId) if not nPartId then return end -- recupero vecchio movimento local vtMove = EgtGetInfo( nPartId, KEY_MOVED_PART, 'v') if vtMove then vtMove = -vtMove EgtRemoveInfo( nPartId, KEY_MOVED_PART) local SolidLayId = EgtGetFirstNameInGroup( nPartId, PRINT_SOLID) if SolidLayId then local EntId = EgtGetFirstInGroup( SolidLayId) while EntId do EgtMove( EntId, vtMove) EntId = EgtGetNext( EntId) end end 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 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 not nStmId or 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) 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)) -- Eventuale ripristino posizione solido RestoreSolidPosition( nPartId) -- Rimozione vecchi conti RemoveOldSlices( nPartId) -- Rimozione vecchi TFS RemoveOldTFS() -- Calcolo delle fette CSLICES.Exec( nPartId, nStmId, HMax) EgtDraw() -- Calcolo dei percorsi sul centro strand in basso CPATHS.Exec( nPartId, nStmId) EgtDraw() -- Calcolo dei percorsi di lavoro 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 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) 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) end --------------------------------------------------------------------- return RunSlicing