How to 3D print peel-able supportive raft/base/platform with slic3r

First of all, let’s check out how easy and sweet it is to remove the supportive raft from your 3D print. All you need to do is just to follow my instructions in the rest of this blog! Continue on yu.xueming.org

Updates: my blog has moved! Check out yu.xueming.org

21 thoughts on “How to 3D print peel-able supportive raft/base/platform with slic3r

  1. Hello everyone 🙂 I’m rather new to 3d printing and I have a lot of questions on the matter, so I hope you will not get mad at me for asking here at least a few of them. I think before I’ll get seriously into sculpting I should focus on the software I’m going to use, and that’s what I would like to ask you about. Mainly, should I begin with the most crudest CAD I can find or would it be better to start on something more complicated? I’m worried that I’ll get some undesirable quirks while working on less complex software. My second question is about the program as well: should I search for software that would let me design and slice it in it, or should I use a separate program for each? Will it even make a difference? Surprisingly, I couldn’t find the answer to that, as it seems like most blogs and sites want to focus on the very basics (like what is 3d printing and so on), and while the answers to those questions are fine, it seems like no one wants to go into the details (it looks like some of them even plagiarise each other! I swear I’ve found the same answers to the same questions on at least 3 different blogs) but I’m getting off-topic… The last question is about 3d pens. Would it be possible to somehow convert whatever I draw with a 3d pen to a 3d model in a program? For example, if I’ll draw a cat with 3d pen, would it be possible to get its design in a software? I’m not sure how that could even work, but the very idea sounds interesting to me. Anyway, I think I’ll stop here just in case no one will ever answer me and all of this writing will go to waste. I apologise that I’m using your content to ask questions, but I hope you can relate and advice a beginner like me. Anyway, thank you for posting. I learned something from this and that’s always appreciated. Thank you, and I hope to hear back from you very soon 🙂

  2. Wow — this is just what I’m looking for. Neat to see you’ve figured out a process. Thanks!

    As for the 49 layer raft — why 49 layers? Did you ever try it with less? If so, how did they turn out?

    1. It just happened to be 49 layers for the thickness of the raft I chose. It was generated by the slicing software. You definitely can do more or less if you need.

      1. Well, using slic3r I am unable to get a good peelable raft. Could you take a screenshot of your raft settings screen? Thanks!

  3. I have a TAM series 1 2014 printer. do you think your code trick would work on the new software TAM uses (cura)? Also. could you post the whole gcode for the action? i have no idea how to write the code but would like to use it. Please and Thanks!

    1. Sure.

      This piece of code was written in python. It needs user input to properly perform the function.

      import os, sys
      
      def Print_Format():
          print "Usage: [path to input G-CODE file] [path to output G-CODE file]"
      
      if not len(sys.argv) == 3:
          Print_Format();
          exit()
      
      input_File_Name = sys.argv[1]
      gcode_File = open(input_File_Name)
      gcode_File_Lines = gcode_File.readlines()
      output_File_Name = sys.argv[2]
      
      print "Total " + str(len(gcode_File_Lines)) + " lines of gcode."
      
      layer_Counter = 0;
      new_Layer_Z_Coordinate = 0;
      old_Layer_Z_Coordinate = 0;
      layer_Z_Coordinates = []
      line_Indexes = []
      
      # Locate the staring points
      start_Line_Mark = "M82"
      i = 0;
      while True:
          if i < (len(gcode_File_Lines) - 2):
              if gcode_File_Lines[i].startswith(start_Line_Mark):
                  break
              else:
                  i = i + 1
      
      while True:
          if i < (len(gcode_File_Lines) - 2):
              # Search for pattern:
              # =======================
              # G92 E0
              # Whatever....
              # G1 Zx.xxxx
              # =======================
              if gcode_File_Lines[i] == "G92 E0\n" and gcode_File_Lines[i+2].startswith("G1 Z"):
                  new_Layer_Z_Coordinate = float(gcode_File_Lines[i+2][4:])
                  if new_Layer_Z_Coordinate != old_Layer_Z_Coordinate:
                      old_Layer_Z_Coordinate = new_Layer_Z_Coordinate
                      line_Indexes.append(i)
                      layer_Z_Coordinates.append(old_Layer_Z_Coordinate) 
                  i = i + 3
              elif gcode_File_Lines[i] == "G92 E0\n" and gcode_File_Lines[i+3].startswith("G1 Z"):
                  new_Layer_Z_Coordinate = float(gcode_File_Lines[i+3][4:])
                  if new_Layer_Z_Coordinate != old_Layer_Z_Coordinate:
                      old_Layer_Z_Coordinate = new_Layer_Z_Coordinate
                      line_Indexes.append(i)
                      layer_Z_Coordinates.append(old_Layer_Z_Coordinate) 
                  i = i + 4            
              else:
                  i = i + 1;
          else:
              break
      
      for layer_Index in range(0, len(line_Indexes)):
          print "Layer", str(layer_Index + 1), ": Z ", layer_Z_Coordinates[layer_Index], ", starting at line:", line_Indexes[layer_Index]
      
      raise_Layer_Index = raw_input("The layer you want to raise:[1~"+str(len(line_Indexes))+"]: ")
      raise_Layer_Index = int(raise_Layer_Index)
      
      raise_Height = raw_input("Distance you want to raise: ");
      raise_Height = float(raise_Height);
      
      is_To_Change_Temperature = raw_input("Do you want to lower temperature to 200 for bottom layer of part?[y or n]: ")
      if is_To_Change_Temperature == "y":
          is_To_Change_Temperature = True
      elif is_To_Change_Temperature == "n":
          is_To_Change_Temperature = False
      else:
          print "Please input y or n."
          exit()
      
      change_Lower_Temperature = "M109 S200"
      change_Normal_Temperature = "M109 S235"
      
      print "Raise", raise_Height ,"from layer", raise_Layer_Index, "and up."
      
      i = line_Indexes[raise_Layer_Index - 1];
      while True:
          if i < (len(gcode_File_Lines) - 2):
              # Search for pattern:
              # =======================
              # G92 E0
              # Whatever....
              # G1 Zx.xxxx
              # =======================
              if gcode_File_Lines[i] == "G92 E0\n" and gcode_File_Lines[i+2].startswith("G1 Z"):
                  # Modify working height
                  z = float(gcode_File_Lines[i+2][4:]) + raise_Height
                  gcode_File_Lines[i+2] = "G1 Z"+str(z)+"\n"
                  # Modify retract height if any
                  z = float(gcode_File_Lines[i-1][4:]) + raise_Height
                  gcode_File_Lines[i-1] = "G1 Z"+str(z)+"\n"
                  i = i + 3
              elif gcode_File_Lines[i] == "G92 E0\n" and gcode_File_Lines[i+3].startswith("G1 Z"):
                   # Modify working height
                  z = float(gcode_File_Lines[i+3][4:]) + raise_Height
                  gcode_File_Lines[i+3] = "G1 Z"+str(z)+"\n"
                  # Modify retract height if any
                  z = float(gcode_File_Lines[i-1][4:]) + raise_Height
                  gcode_File_Lines[i-1] = "G1 Z"+str(z)+"\n"
                  i = i + 4           
              else:
                  i = i + 1
          else:
              break
              
      
      modified_Gcode_File = open(output_File_Name, 'w')
      i = 0
      for i in range(0, len(gcode_File_Lines)):
          if is_To_Change_Temperature:
              if i == line_Indexes[raise_Layer_Index - 1]:
                  idle_Z = float(gcode_File_Lines[ i - 1 ][4:]) + 50
                  modified_Gcode_File.write("G1 Z" + str(idle_Z) + "\n")
                  modified_Gcode_File.write(change_Lower_Temperature + "\n")
              elif i == line_Indexes[raise_Layer_Index]:
                  idle_Z = float(gcode_File_Lines[ i - 1 ][4:]) + 50
                  modified_Gcode_File.write("G1 Z" + str(idle_Z) + "\n")
                  modified_Gcode_File.write(change_Normal_Temperature + "\n")
                  
          modified_Gcode_File.write(gcode_File_Lines[i])
      modified_Gcode_File.flush()
      
  4. From my experience (using 3D Up printer) – you can just increase the distance between dense interface layer and print with the same speed and temperature (and the speed became even a bit slower, when 3D Up printing first model layer on the top of support interface layer). The extruded filament is cyllinder, so when you increase the distance between extruder and layer the extruded filament remains it’s form (because it is not compressed by the extruder during extrusion and not sticked to previous layer) and its contact area with interface layer is significantly smaller than one for all other layers. Because of this the supports detaching much easier than other layers. Actually this trick is a bit complicated than just changing the distance, because it depends on: 1) extrusion speed, 2) print speed, 3) nozzle diameter, so you can get easily detachable layer with the same layer distance and with increased print speed. But in general – that’s it.

      1. With the same extrusion speed. Or decrease extrusion speed. I think this feature has been reached “apparently”, when someones try to learn all conditions of adhesion strength between printed layers and also paid attention to conditions when adhesion is “bad” 🙂

  5. Awesome post!

    I’m new to 3D printing and have been struggling to edit the gcodes in order to get the rafts off nicely. Can you please give a little bit more detail on where to insert:

    M109 S200 ; Sets target temperature and waits until temperature is reached.
    M109 S235

    and how to apply your python code?

    Thank you in advance.

    1. Hi Mike

      For this specific two line of codes, I basically search for the ending of a previous layer. You can easily find it when gcode is trying to move along z-axis.

      Using python to process gcodes is quite straight forward. You basically read in gcodes line by line into an array and insert new codes wherever you need. After you are done with your modification, simply output you array into an text file and rename it into *.gcode.

  6. Hello,
    I am really impressed by the work you made. You really helped me.
    this summer i had the chance to work with the up! Printer. It was the cheapest 3d printer available at the office, but it was deffinitely unbitable for its support.
    Like you, i experimented a lot to reproduce it on other printers, i ended up with the same conclusion as you (interface layer temperature, but my lack of skills in programation made me give up).
    In some sort you made my dream. And it works !
    But while reading your article, i was remembering this up! And if i am right, the up! Doesnt make a break between support and object.
    Instead, the draft was printed in a strange zig zagging shape and super fast like if there was some kind of overflow when you press your toothpaste tube so hard.
    From this observation, i wonder if the up! Secret is based on this overflow. The plastic extruded so fast that it becomes less sticky. The zigzag shape could also help removing it.
    This method would maybe be a great improvement for non flat bottom shapes.
    Please let me know if you plan to experiment it ! Thank you so much

  7. How did u increase the gap to 0.4 ? did u increase the rest of the code by the same amount ? if so, how ?

    Thanks

    1. I wrote python code to do this. If you take a look at the g-code, you will find out that g-codes are generated in patterns. What your python does is to look for those patterns and locate the g-codes for each printing layer. For example:

      G92 E0
      G1 X168.690 Y123.313 F15000.000
      G1 Z0.350

      This is a typical starting pattern for a printing layer. Z0.35 is the height of the layer, so simply replace this number with your own (0.4 in my case) and then add the same amount of increment to the reset of its upper layers.

  8. When I watch videos of the UP printer it looks like the top of the support is solid and flat. This reminds me of the way I used to do rafts. I made the top layer of the raft almost solid and raised the bottom layer of the object a little to make it peel-able. Indeed support is just the same as a raft, it is just that it is elevated. To test the theory I hacked my host software to load a separate file for the support so that it could be sliced as a normal object and so have a solid top. It also has a solid base of course, which is another advantage over Skeinforge’s sparse support as that can easily become detached from the bed.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s