-- RunSlicing.lua by Egaltech s.r.l. 2022/07/03 -- Calcoli prima fase per Stampa 3d -- Tabella per definizione modulo local RunSlicing = {} -- 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.CalcSolids = nil local CSOLIDS = require( 'CalcSolids') _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_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_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') 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') -- recupero il punto iniziale e lo salvo tra i parametri local ptStart = Point3d( 0, 0, 0) local nAuxId = EgtGetFirstNameInGroup( nPartId, LAY_AUX) local nPtStartId = EgtGetFirstNameInGroup( nAuxId or GDB_ID.NULL, START_POINT) if nPtStartId then ptStart = EgtSP( nPtStartId, GDB_ID.ROOT) end EgtSetInfo( nPartId, KEY_START_POINT, ptStart) -- 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') 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, ORIGINAL_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 SetViewInfo() local nViewId = EgtGetFirstNameInGroup( GDB_ID.ROOT, VIEWPARAMS) if not nViewId then nViewId = EgtGroup( GDB_ID.ROOT) EgtSetName( nViewId, VIEWPARAMS) end EgtSetInfo( nViewId, IMPORTED_SOLID, false) EgtSetInfo( nViewId, OUTER_CRV, false) EgtSetInfo( nViewId, PATH_GRP, false) EgtSetInfo( nViewId, SOLID_GRP, true) EgtSetInfo( nViewId, TOOLPATH_GRP, true) end --------------------------------------------------------------------- function RunSlicing.Exec() -- Verifico che il progetto abbia un nome local sCurrProjectPath = EgtGetCurrFilePath() if not sCurrProjectPath or sCurrProjectPath == '' then EgtOutBox( 'Save project before calculating slices!', 'Warning', 'WARNING') return 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, ORIGINAL_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) -- 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 local 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()) -- Elimino eventuale precedente file dei risultati local sResultFile = EgtChangePathExtension( sCurrProjectPath, '.csv') EgtEraseFile( sResultFile) -- Elimino eventuale precedente lavorazione EgtSetCurrMachGroup() EgtRemoveAllOperations() EgtResetCurrMachGroup() -- Lettura dei parametri LoadParams( sParamFile, nPartId) -- 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) -- 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 CSOLIDS.Exec( nPartId) EgtSetStatus( nSolidLayId, GDB_ST.OFF) EgtSetStatus( nRibsLayId or GDB_ID.NULL, GDB_ST.OFF) EgtDraw() -- Aggiorno impostazioni di visibilita' per ShowManager SetViewInfo() end --------------------------------------------------------------------- return RunSlicing