-- 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_PRINT_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_INF 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