Category Archives: Uncategorized

Misc: Formnext 2021 Review

My first Formnext in 2019 I realized there was no way to explore the expo in 1 day only, so I reserved for Formnext 2021 (Frankfurt, Germany) 4 days fully (November 16-19). Although the expo was smaller than in 2019, it was still massive to explore. I’m not even sure I saw all of the 600+ exhibitors despite roaming the two halls (12.0 ground floor, 12.1 first floor and 11.0 ground floor only) multiple times.

Inhouse Developments: ZPlusSlicer & 5DMaker

I presented my inhouse developments of ZPlusSlicer and 5DMaker for the first time in public (otherwise just illustrated in About: Big Picture), as of November 2021, it’s not yet published or otherwise documented.

About 40+ samples I handed out and alike amount some brief documentation (on paper) on ZPlusSlicer and 5DMaker (5MF processor) – both in early stage of development, and the “overhang stairs” a proof-of-concept of the benefit of both new conceptual layers on top of traditional slicing. By spring 2022 I will publish more publicly on both products once they matured to Beta stage.


  • Ultimaker: they didn’t have any booth, yet their machines were placed at many booths, resellers kind of represented them – combination of dominance and absence
  • Makerbot wasn’t there
  • Markforged considers itself as startup but outsiders consider them as big player already – impressive integration of machine, material and slicer, yet, all closed down; hard(er) to integrate with 3rd party software
  • nScrypt micro-dispensing on cylindrical or spherical surfaces, PCB 3d printing and pick-place SMD components:
  • Krause DiMaTec showed its EDDY 3D printer, slow Z axis, but quite affordable at ~8K EUR for the machine with 600 x 600 x 600mm build-volume, and the 3D metal printed hotend was quite an eye-catcher:
  • Duplex3D printer: two nozzles starting to print on upper & lower side of the build plate, once reached some distance, the plate is removed (!!) and 3D prints continues in both Z directions (the front glass is very glaring so not many details, also the representatives didn’t want to me to take too close photos):
  • Prusa Research released its Prusa XL – a Core XY based printer, I took a few photos with a lot of small innovations:
    • 360 x 360 x 360 mm build volume
    • mechanical pressure-based Z calibration built into the printhead (nozzle probes mechanical on the build plate)
    • segmented heating of build plate, heat there where the part is located
    • new printhead with geared filament drive motor
    • optional tool changer
    • optional foldable air-draft prevention
    • pricing from 2.5K EUR to 3.5K EUR
    • pre-order, delivery Q2/Q3 2022 (!!)
  • Modix as sold by 3Dmensional:
    • 600 x 600 x 600mm build-volume
    • fully enclosed
    • DIY kit or fully assembled
    • pricing 3.5K EUR (kit) to 6K EUR (assembled)
  • TreeDFilaments: 55 different materials
  • Kimya: materials too, great (paper) catalogue with detailed information on how to print their filaments and use-cases

Formnext 2021 Impressions

People vs Companies

Although all the companies appear quite anonymous, if you spend more than just a few minutes, and are able to talk to some technical skilled people – aside of the sales representative – you will notice “normal” people with the same passion like you and me: 3D printing enthusiasts, who turned their hobby into a professional passion, either as a startup or joining a bigger company to explore 3D printing further.

The most worthwhile and interesting interactions were the ones I had with little business aim but technical exchange on new slicing methods and algorithms, new G-code extensions or pre-/post-processing, and new hardware designs in particular 4-axis approaches by different individuals and companies based on my slicing software and hardware designs they found via my YouTube videos – which was quite a revelation for me.

Covid & Expo

As of November 2021, Covid-19 isn’t over but I was glad to explore Formnext 2021 in person, a “2G event”, means, either one had to be vaccinated or recovered from Covid. The first days most people worn masks, by each day less and less – me included, as it was hard to talk with the mask on and hear each other properly even standing close to each other due the overall noise level in the halls.


Certainly the overall mood was great among the exhibitors and visitors as well – professional interest, respectful cordial interactions – less noisy than in 2019 which was more hectic due more visitors overall. Tuesday (1st day) and Friday (last day) had less visitors, whereas Wednesday and Thursday was quite overwhelming and significant more visitors.

At last, some impressions of Frankfurt (Germany) itself . . .

That’s it.


3D Printing: Kiri:Moto CLI Slicer


  • 2021/09/27: -l <conf> to load configurations (experimental)
  • 2021/08/27: software released on github
  • 2021/08/09: KiriMotoSlicer 0.0.4: -h <term> to query settings, setting extruder.0.*
  • 2021/08/08: KiriMotoSlicer 0.0.2: usage output (help), preliminary integration into Print3r framework
  • 2021/08/02: starting write-up


Kiri:Moto is a browser-based slicer, which can be also installed locally using NodeJS. Stewart Allen developed it and even provides a command-line interface (CLI) example as well src/kiri/cli.js. I extended it further into kirimoto-slicer so I could use it in conjunction of Print3r.


  • Node 13 or later (use nvm to switch quickly between different versions)
  • UNIX platform (Linux, etc)


git clone


make requirements
sudo make install 

requirements clones original grid-apps (Kiri:Moto) whereas install installs KiriMotoSlicer (kirimoto-slicer) executable system-wide.


KiriMotoSlicer 0.0.4 USAGE: [<options>] [file] ...
      --help                        this usage help
      --help=<term>                 show settings matching <term>
      -h <term>                        "       "
      --version                     display version and exit
      --verbose                     increase verbosity
      -v or -vvv                       "       "
      --output=<fn>                 force output filename
      -o <fn>                          "       "
      --load=<conf>                 load configuration (lines of <k>=<v>, or experimental JSON as grid-apps/src/dev/*)
      -l <conf>                              "                "                      "
      --setTemperature=<s>          include set temperature extruder & bed in gcodePre (default: true)
      --bedOrigin=<x>,<y>           set origin of bed (use with --outputOriginCenter=true) (default: [0,0])

   slice configuration:
      --processName=<v>             set process name (default: "generic")
      --sliceHeight=<v>             set slice height (default: 0.25)
      --sliceShells=<v>             set slice shells (default: 3)
      --sliceShellOrder=<v>         set slice shell order ["in-out","out-in"] (default: "in-out")
      --sliceLayerStart=<v>         set slice layer start ["last","center","origin"] (default: "last")
      --sliceFillAngle=<v>          set slice fill angle (default: 45)
      --sliceFillOverlap=<v>        set slice fill overlap (default: 0.3)
      --sliceFillSparse=<v>         set slice fill sparse (default: 0.2)
      --sliceFillType=<v>           set slice fill type ["vase","hex","grid","gyroid","triangle","linear","bubbles"] (default: "gyroid")  
      --sliceAdaptive=<v>           set slice adaptive (default: false)
      --sliceMinHeight=<v>          set slice min height (default: 0)
      --sliceSupportDensity=<v>     set slice support density (default: 0.25)
      --sliceSupportOffset=<v>      set slice support offset (default: 0.4)
      --sliceSupportGap=<v>         set slice support gap (default: 1)
      --sliceSupportSize=<v>        set slice support size (default: 6)
      --sliceSupportArea=<v>        set slice support area (default: 1)
      --sliceSupportExtra=<v>       set slice support extra (default: 0)
      --sliceSupportAngle=<v>       set slice support angle (default: 50)
      --sliceSupportNozzle=<v>      set slice support nozzle (default: 0)
      --sliceSolidMinArea=<v>       set slice solid min area (default: 10)
      --sliceSolidLayers=<v>        set slice solid layers (default: 3)
      --sliceBottomLayers=<v>       set slice bottom layers (default: 3)
      --sliceTopLayers=<v>          set slice top layers (default: 3)
      --firstLayerRate=<v>          set first layer rate (default: 10)
      --firstLayerPrintMult=<v>     set first layer print mult (default: 1.15)
      --firstLayerYOffset=<v>       set first layer YOffset (default: 0)
      --firstLayerBrim=<v>          set first layer brim (default: 0)
      --firstLayerBeltLead=<v>      set first layer belt lead (default: 3)
      --sliceSkirtCount=<v>         set slice skirt count (default: 0)
      --sliceSkirtOffset=<v>        set slice skirt offset (default: 2)
      --sliceLineWidth=<v>          set slice line width (default: 0)
      --outputTemp=<v>              set output temp (default: 210)
      --outputBedTemp=<v>           set output bed temp (default: 60)
      --outputFeedrate=<v>          set output feedrate (default: 50)
      --outputFinishrate=<v>        set output finishrate (default: 50)

      --outputSeekrate=<v>          set output seekrate (default: 80)
      --outputShellMult=<v>         set output shell mult (default: 1.25)
      --outputFillMult=<v>          set output fill mult (default: 1.25)
      --outputSparseMult=<v>        set output sparse mult (default: 1.25)
      --outputRetractDist=<v>       set output retract dist (default: 4)
      --outputRetractSpeed=<v>      set output retract speed (default: 30)
      --outputRetractDwell=<v>      set output retract dwell (default: 30)
      --outputShortPoly=<v>         set output short poly (default: 100)
      --outputMinSpeed=<v>          set output min speed (default: 10)
      --outputCoastDist=<v>         set output coast dist (default: 0.1)
      --outputLayerRetract=<v>      set output layer retract (default: true)
      --detectThinWalls=<v>         set detect thin walls (default: true)
      --zHopDistance=<v>            set z hop distance (default: 0)
      --antiBacklash=<v>            set anti backlash (default: 0)
      --outputOriginCenter=<v>      set output origin center (default: false)
      --sliceFillRate=<v>           set slice fill rate (default: 0)
      --sliceSupportEnable=<v>      set slice support enable (default: false)
      --firstSliceHeight=<v>        set first slice height (default: 0.25)
      --firstLayerFillRate=<v>      set first layer fill rate (default: 35)
      --firstLayerLineMult=<v>      set first layer line mult (default: 1)
      --firstLayerNozzleTemp=<v>    set first layer nozzle temp (default: 0)
      --firstLayerBedTemp=<v>       set first layer bed temp (default: 0)
      --firstLayerBrimTrig=<v>      set first layer brim trig (default: 0)
      --outputRaft=<v>              set output raft (default: false)
      --outputRaftSpacing=<v>       set output raft spacing (default: 0.2)
      --outputRetractWipe=<v>       set output retract wipe (default: 0)
      --outputBrimCount=<v>         set output brim count (default: 2)
      --outputBrimOffset=<v>        set output brim offset (default: 2)
      --outputLoopLayers=<v>        set output loop layers (default: null)
      --outputInvertX=<v>           set output invert x (default: false)
      --outputInvertY=<v>           set output invert y (default: false)
      --arcTolerance=<v>            set arc tolerance (default: 0)
      --gcodePause=<v>              set gcode pause (default: "")
      --ranges=<v>                  set ranges (default: [])
      --firstLayerFanSpeed=<v>      set first layer fan speed (default: 0)
      --outputFanSpeed=<v>          set output fan speed (default: 255)

   device configuration:
      --noclone=<v>                 set noclone (default: false)
      --mode=<v>                    set mode ["FDM","SLA","CNC","Laser"] (default: "FDM")
      --internal=<v>                set internal (default: 0)
      --imageURL=<v>                set image URL (default: "")
      --imageScale=<v>              set image scale (default: 0.75)
      --imageAnchor=<v>             set image anchor (default: 0)
      --bedHeight=<v>               set bed height (default: 2.5)
      --bedWidth=<v>                set bed width (default: 220)
      --bedDepth=<v>                set bed depth (default: 220)
      --bedRound=<v>                set bed round (default: false)
      --bedBelt=<v>                 set bed belt (default: false)
      --maxHeight=<v>               set max height (default: 300)
      --originCenter=<v>            set origin center (default: false)
      --extrudeAbs=<v>              set extrude abs (default: true)
      --spindleMax=<v>              set spindle max (default: 0)
      --gcodeFan=<v>                set gcode fan (default: "M106 S{fan_speed}")
      --gcodeTrack=<v>              set gcode track (default: "")
      --gcodeLayer=<v>              set gcode layer (default: ";LAYER:{layer}")
      --gcodePre=<v>                set gcode pre (default: "M107                     ; turn off filament cooling fan\nG90          
            ; set absolute positioning mode\nM82                      ; set absolute positioning for extruder\nM104 S{temp} T{tool} 
    ; set extruder temperature\nM140 S{bed_temp} T{tool} ; set bed temperature\nG28                      ; home axes\nG92 X0 Y0 Z0 E
0          ; reset all axes positions\nG1 X0 Y0 Z0.25 F180      ; move XY to 0,0 and Z 0.25mm over bed\nG92 E0                   ; z
ero the extruded\nM190 S{bed_temp} T{tool} ; wait for bed to reach target temp\nM109 S{temp} T{tool}     ; wait for extruder to reac
h target temp\nG92 E0                   ; zero the extruded\nG1 F225                  ; set feed speed")
      --gcodePost=<v>               set gcode post (default: "M107                     ; turn off filament cooling fan\nM104 S0 T{to
ol}          ; turn off right extruder\nM140 S0 T{tool}          ; turn off bed\nG1 X0 Y300 F1200         ; end move\nM84           
           ; disable stepper motors")
      --gcodeProc=<v>               set gcode proc (default: "")
      --gcodePause=<v>              set gcode pause (default: "")
      --gcodeDwell=<v>              set gcode dwell (default: "")
      --gcodeSpindle=<v>            set gcode spindle (default: "")
      --gcodeChange=<v>             set gcode change (default: "")
      --gcodeFExt=<v>               set gcode FExt (default: "gcode")
      --gcodeSpace=<v>              set gcode space (default: true)
      --gcodeStrip=<v>              set gcode strip (default: false)
      --gcodeLaserOn=<v>            set gcode laser on (default: "")
      --gcodeLaserOff=<v>           set gcode laser off (default: "")
      --extruders.[0..<n-1>].{extFilament,extNozzle,extSelect,extDeselect,extOffsetX,extOffsetY}=<v> set extruders (default: [{"extFilament":1.75,"extNozzle":0.5,"extSelect":["T0"],"extDeselect":[],"extOffsetX":0,"extOffsetY":0}])
      --new=<v>                     set new (default: false)
      --deviceName=<v>              set device name (default: "3D Printer")

      kirimoto-slicer cube.stl
      kirimoto-slicer cube.stl -o test.gcode
      kirimoto-slicer -v cube.stl --sliceHeight=0.1
      kirimoto-slicer cube.stl --extruders.0.extNozzle=0.5 --sliceHeight=0.42
      kirimoto-slicer -h slice
      kirimoto-slicer -h .


Kiri:Moto distincts:

  • shells (aka perimeters, walls)
  • solid fill (like bottom and top layers)
  • sparse fill (aka fill)

As of 2021/08 Kiri:Moto doesn’t distinct support structures on bed or everywhere, so it can only be enabled or disabled with --sliceSupportEnable=true or false.

Smart Help

KiriMotoSlicer supports ~100 settings (as compared to Cura with over 500 settings) which can be queried with --help=<term> or -h <term>:

% kirimoto-slicer -h slice
query settings for 'slice':
      --sliceHeight=<v>             set slice height (default: 0.25)
      --sliceShells=<v>             set slice shells (default: 3)
      --sliceShellOrder=<v>         set slice shell order ["in-out","out-in"] (default: "in-out")
      --sliceLayerStart=<v>         set slice layer start ["last","center","origin"] (default: "last")
      --sliceFillAngle=<v>          set slice fill angle (default: 45)

% kirimoto-slicer -h shell
query settings for 'shell':
      --sliceShells=<v>             set slice shells (default: 3)
      --sliceShellOrder=<v>         set slice shell order ["in-out","out-in"] (default: "in-out")
      --outputShellMult=<v>         set output shell mult (default: 1.25)


xyzHollowCalibrationCubeV2 (allows 0% infill without support) using --sliceFillSparse=0

Visualized with gcode2png.

Fill Types

20mm cube:

Fill type 'vase' and 'bubbles' are listed as available but don’t work yet.


As of 2021/08 I’m quite impressed with Kiri:Moto. It goes different ways than the most other slicers, for example:

  • first layer outline is printed extremely slow
  • first layer filling is printed fast
    • other slicer print first layer outline & filling slow
  • shells/walls are printed inside out with increased speed, other slicers slow down shells/walls
    • the result in my case are very clean walls, as the emphasis is on fast contineous extruding than slow extruding

I also noticed there is little retraction done by default, fast motion to continue filling where other slicers retract & unretract more often.

So, the print with basic forms sliced looks good so far, and with just 100 settings it’s easy to learn and memorize, compared to Cura with over 500 settings.

While I like a new and usable slicer be available, the downside is that JavaScript use was once promising, but as of 2020/2021 it has become a mess as Browser JS and Node JS have diverted immensely, and the entire “Async Hell” has just driven forward with async / await / promise / then non-sense – it is really software development gone wrong for a decade. On the upside, JavaScript makes the slicing engine accessible and easier to extend than with verbose C++ or rudimentary C.

Print3r Support

As of version Print3r 0.3.8 the KiriMotoSlicer is supported, using slicer independent settings (write the profile once, use multiple slicers).

% print3r --printer=ashtar-k-2-pax --random-placement print --slicer=kirimoto xyzHollowCalibrationCubeV2.stl --fill-density=0
== Print3r 0.3.8 ==
print3r: conf: device /dev/ttyACM0, Ashtar K 38x30x33 PAX #2, build/v 300x300x330mm, nozzle/d 0.4mm, layer/h 0.25mm, filament/d 1.75
print3r: slice (kirimoto) part <xyzHollowCalibrationCubeV2.stl> to gcode: prepare, reposition [145,116], translate 145.0,116.0,0.0, reposition [128,211], slice, done.
print3r: print: 0h 14m elapsed, eta 0h 00m, 100.0% complete, z=20.00mm, layer #80, filament 0.93m


Configurations can be stored line-wise like:

# is a comment
sliceHeight = 0.25
sliceLineWidth = 0.45

and optionally you can load JSON formatted configuration as in grid-apps/src/dev/*

kirimoto-slicer -l my.conf test.stl
kirimoto-slicer -l grid-apps/src/dev/Creality.Ender.3 test.stl


3D Modeling: FreeCAD2Any

Just a brief announcement of a small Python script for command-line use (CLI) which allows to convert FCStd (FreeCAD Standard file-format) to

  • STL
  • IGES
  • STEP
  • Brep
  • AMF
  • OFF
  • OBJ
  • 3MJ

which I primarely use to bring FreeCAD into the 3D printing framework with Print3r.


  • Linux/Ubuntu 20.04 LTS



  • Print3r, makes use of freecad2any in order to pre-process FCStd, IGES, STEP and Brep files

3D Printing: Non-Planar “Balcony” Overhang with 3-axis FDM Printer


  • 2021/05/02: adding overhang-inout with 5 segments, with conic inside- and outside-cone mode
  • 2021/05/01: adding tilt sliced overhang segment variant as comparison
  • 2021/04/29: video uploaded and blog-post published
  • 2021/04/27: first successful tests with vertical nozzle (3-axis FDM printer)


The past few months and weeks I focused on the non-planar slicing, and the first tests with sub-volume segmenting and thereby mixing planar and non-planar sliced G-code worked as simulation, and now in actual prints.

One of the benchmarks are 90° overhangs in different directions, and I printed with vertical nozzle on an ordinary 3-axis FDM printer, therefore I prepared the G-code with a new tool (in-development) which coordinates segmenting and planar/non-planar slicing of sub-volumes, and the conic sliced segment was sliced with 25° conic angle so it remains printable with the vertical nozzle unlike the simulation where a 4- or 5-axis FDM printer is required:


Conic Sliced Overhang Segment

The simulation as reference:

and the actual print process with vertical nozzle on a low-cost 3-axis FDM printer:

Excerpt of the actual printing process with brief annotations:

Tilt Sliced Overhang Segment

Just for sake trying out, instead of conic sliced overhang segment, tilt sliced and 45° Z rotated to nicely extend to the maximum overhang position:

and the actual print of a slightly lower model but with the same features:

Comparing Tilted Sliced vs Conic Sliced Overhang Underside

Overhang In/Out: 2 Overhang Conic Segments

5 segments (bottom to top): z-planar, conic (inside-cone), z-planar, conic (outside-cone), z-planar

And revisiting the Overhang In/Out Model, which features ingoing and outgoing overhang, segmented into 5 sub-volumes:

  1. bottom: z-planar
  2. ingoing1) overhang: conic (inside-cone mode)
  3. middle: z-planar
  4. outgoing1) overhang: conic (outside-code mode)
  5. upper: z-planar

1) when dealing with conic slicing, the direction of overhang matters when deciding the mode of conic slicing, e.g. outside-cone or inside-cone.

and the actual print, a half of the model so the printing of inner overhang on the lower part of the model is visible:


It took me a few days to tune the 3-axis FDM printer to print in acceptable quality of this Overhang Model No 5 and also Overhang In/Out Model. A strong part-cooler was mandatory, well adjusted print temperature and slow perimeter as those extrusions align horizontally without vertical support; and it worked: the main idea is to segment and limit the overhang part to ~2mm thickness – a quasi “balcony” – which still allows a classic vertical nozzle with part-cooler to print such, and then switch back to planar printing again.

Vertical nozzle with part-cooler printing conic sliced overhang – a “balcony” – working with narrow margins

Detail settings: the conic overhang was sliced with Slicer4RTN with following settings slicer4rtn --slicer=cura-slicer --speed_wall=10 --speed_wall_0=10 --speed_wall_x=10 ... and since the Z-axis motion is limited to 4mm/s (M6 threaded rod, 1 rotation => 1mm) the overall printing speed is slow enough to provide acceptable print quality.