Support generation

27 views
Skip to first unread message

maze...@gmail.com

unread,
Jan 16, 2025, 3:29:26 PMJan 16
to IceSL
Hi

while the supports of IceSL are efficient, they are usually not that easy to remove. Cura and S3D typically print a continues zig-zag for the support, that is easy to remove.

I tried to add my own support, somewhat successful but far from perfect (see code below).
I'd love to see such a support in IceSL, native. And yes, it's not rocket science or science at all, it's just a quick and dirty hack, but it works quite well.

Regards
maze

--lib_support.lua

-- Simple support like S3D, often easy to remove in one piece.

function support(dx,dy,h)
  local walls = {}   --support walls
  local nozzle = 0.4 --support walls width
  local step = 2     --support walls spacing
  local j = 1        --helper (+/-) to create support walls connectors
  if dx<2*step then return {} end --min size check
  if dy<2*step then return {} end --min size check
  dx = math.ceil(dx) --convert to integer, round up
  dy = math.ceil(dy) --convert to integer, round up

  --generate support walls
  for i=0,dx-1,step do
    table.insert(walls, translate(i,0,0)*cube(nozzle,dy,h))
    table.insert(walls, translate(i+step/2,j*(dy/2-nozzle/2),0)*cube(step,nozzle,h))
    j = -1 * j
  end
  table.insert(walls,translate(step*math.ceil(dx/step),0,0)*cube(nozzle,dy,h))
  return translate(-dx/2,0,0)*union(walls)
end

--
--basic usage
--[[--
Including:
--dofile('lib_support.lua')

Emit the support with brush 0, the actual part with brush 1.
For that brush:
-reduce the flow mulitplier to 70% (optional, saves material)
-set shells to 1 shell
-set perimenter to false
-disable support (global option)

Tips:
Leave an empty, non-printed layer between the support and the object. E.g. for 0.2 layer height: leave 0.2mm between the support and the object. Use a difference function to do so.
--]]--


--
--if called via dofile stop here - do not emit anything
--
if pcall(getfenv, 4) then
  return
end

--Show examples
--emit a supported box
emit(translate(0,0, 0)*rotate(0,0,0)*support(10,10,9.8),0)
emit(translate(0,0,10)*rotate(0,0,0)*cube(10,10,1),1)

--emit a supported sphere at h=2
r=10
h=2
emit(translate(20,20,0)*rotate(0,0,0)*difference {
  support(2*r, 2*r, r+h),
  translate(0,0,r+h-0.2)*sphere(r),
}, 0)
emit(translate(20,20,r+h)*rotate(0,0,0)*sphere(r), 1)

set_setting_value('flow_multiplier_1', 0.9*0.7)
Reply all
Reply to author
Forward
0 new messages