Category Archives: Technology

ScriptCAD Reference

This reference covers ScriptCAD Core 0.3.3 (2019/12/29)

Note: ScriptCAD in its current implementation is highly experimental and subject of changes.

Introduction

ScriptCAD is a library, CAD framework and web-site, depending on the context different aspects are meant. In general it allows you to create 2D and 3D geometries with JavaScript, in a very lightweight manner and export them with a particular format for further usage.

In order to reduce verbosity and complexity, you can call cube() and it actually creates an object on a stack or the scene already. You may assign a variable like let a = cube() and then operate on a later like scaling or translating, and even return it from a function. Additionally, you may declare a main() function, if it exists, it will be called.

cube()
   .translate([20,0,0])
   .rotate([0,0,45]);
let a = cube();
a.translate([20,0,0]);
a.rotate([0,0,45]);

So, keep in mind, whenever you call primitives, they will be placed on a stack/scene in that very moment. You may walk through that stack/scene with children(function(c) { ... }) to post-process your scene.

2D Primitives

polygon

polygon(p)
polygon(p,opts)
polygon(p,f)
polygon(p,f,opts)
polygon({points: p, faces: f, ... })

where as

  • p an array of 2D points, and
  • f an array of indices of points defining faces (e.g. triangles).

options:

  • closed: true (default) or false
  • fill: true (default) or false
  • thickness: (default 0 = minimal thickness)

polygon also can be used to draw a line or a polyline, in that case use option closed: false (default true) and fill: false (default true)

polygon([ [0,0], [10,10] ], { closed: false, fill: false }) is a simple line or
polygon([ [0,0], [10,0], [10,10], [0,10] ], { fill: true }) draws a rectangle (closed polyline or polygon)

square

square()
square(w)
square(w, h)
square(w, h, opts)
square({ w: 3, h: 2, ... })

options:

  • fill: true (default) or false

circle

circle()
circle(r)
circle(r, opts)
circle(opts)

options:

  • r: set radius (default 1.0)
  • d: set diameter
  • fill: true (default) or false
  • start: (default 0)
  • end: (default 360)
  • n: amount of segments (default 12)
  • angle: angle rotation (default 0)
  • midpoint: true or false (default)
  • thickness: 0 (default, minimal thickness)

3D Primitives

cube

cube()
cube(2)
cube([2,1,3])
cube([2,1,3], { center: true })
cube({ size:[2,1,3], center: true })

options:

  • center: true or false or and array of 3 true or false, e.g. [ true, false, false] for each axis x, y, and z
  • experimental:
    • chamfer: 0 (default)
    • fillet: 0 (default)

sphere

sphere()
sphere(1)
sphere({r: 1, ...})

options:

  • center: true or false or and array of 3 true or false, e.g. [ true, false, false] for each axis x, y, and z
  • type: angular (default) or icosa
  • n: segments (default 12)

Note: the higher the frequency (n) is, the more computational intensive CSG opertions will be.

cylinder

cylinder(h,r)
cylinder(h,r,opts)
cylinder(h,r1,r2,opts)
cylinder({h:1, r:2, ...})
cylinder({h:1, d:2, ...})
cylinder({h:1, r1: 1, r2: 0, ... })

options:

  • center: true or false or and array of 3 true or false, e.g. [ true, false, false] for each axis x, y, and z
  • n: segments
  • experimental:
    • chamfer: 0 (default)
    • fillet: 0 (default)

polyhedron

polyhedron(p,f)
polyhedron(p,f,opts)
polyhedron({points: p, faces: f, ...})

polyhedron(
    [              // set of points
       [-1,1,0],
       [1,1,0],
       [1,-1,0],
       [-1,-1,0],
       [0,0,1]
    ],
    [              // set of faces
       [0,1,2,3],     // square bottom
       [1,0,4],       // side
       [2,1,4],       //  "
       [3,2,4],       //  "
       [0,3,4]        //  "
    ]
 ).scale(5);

where as:

  • p: array of [x,y,z] coordinates, e.g. [0, 0, 0]
  • f: array of vertice indexes e.g. [0, 1, 2]

Usually one does not manually compose polyhedron() but create such procedurally.

Note: polyhedron() isn’t compatible OpenSCAD polyhedron() as face orientation is reversed in OpenSCAD compared to common standard.

Transformations

translate

obj.translate([x,y,z])
translate(obj,[x,y,z])

scale

obj.scale(f)
obj.scale([x,y,z])
scale(obj,f)
scale(obj,[x,y,z])

rotate

obj.rotate([x,y,z])
rotate(obj,[x,y,z])

where as x, y, and z are angles in 0..360 degrees.

transform

.transform([ t0, t1, t2, ... t15 ])
transform(obj,[t0, t1, t2, ... t15])

4×4 transformation matrix applied.

hull

obj1.hull(obj2, ...)
hull(obj1, obj2, ... )

hull() is quite powerful, and one may reduce complex structures back to hulled 2D or 3D primitives.

linear extrude

.linear_extrude(opts)
linear_extrude(obj,opts)

options:

  • h: height
  • n: segments
  • twist: twist in degrees (0..360)

rotate extrude

.rotate_extrude(opts)
rotate_extrude(obj,opts)

options:

  • start: start angle 0..360 (default 0)
  • end: end angle 0..360 (default 360)
  • caps: true (false) or false in case start != end

CSG Operations

union

obj1.union(obj2, ...)
union(obj1, obj2, ...)

You may consider union() the additive manufacturing principle.

Note: union() operation can be costly in regards of computational overhead.

difference

obj1.difference(obj2, ...)
difference(obj1, obj2, ...)

You may consider the difference() as substractive manufacturing, e.g. drilling a hole (with a cylinder()) into an existing object.

Note: difference() operation can be costly in regards of computational overhead.

intersection

obj1.intersection(obj2, ...)
intersection(obj1, obj2, ...)

Note: intersection() operation can be costly in regards of computational overhead.

exclusive

exclusive(obj1, obj2, ...)
exclusive(obj1, obj2, ..., opts)

options:

  • order: asc (default) or desc

You may consider exclusive() a new CSG operation where all the objects displace each other in ascending or descending order, hence, occupy exclusive space to each other – implementing “there can be no object occupy the same space at the same time”.

  • ascending order (default): each new object dominates and displaces previous ones.
  • descending order: each new object can only occupy the remaining free space left over.

Following illustrations show ascending and descending order, and are post-processed to show the parts aside of each other.

Note: unlike other CSG operations, this returns the same amount of objects as output as it accepted as input, but all objects are altered (this behavior might change in the future, e.g. return a group instead).

Misc Operations

group

group(obj1, obj2, ...)
group()

You may group parts into a group and translate, scale etc again, a kind of lightweight union() while maintaining their properties.

Note: group() functionality is very experimental and behavior with children() and export of AMF, 3MF and 3MJ formats might change in the future.

color

obj.color([r,g,b])
obj.color([r,g,b,a])
obj.color(r,g,b)
obj.color(r,g,b,a)
obj.color(hsl2rgb(h,s,l))
obj.color(hsl2rgb(h,s,l,a))
color(obj,[r,g,b])
color(obj,[r,g,b,a])
color(obj,r,g,b)
color(obj,r,g,b,a)

where as r, g, and b is float 0..1

HSL color model is closer to human concept of colors:

  • h: hue 0..360 degrees (rainbow)
  • s: saturation 0..1
  • l: lightness 0..1 (0=black, 1= white, 0.5 = average)
for(h=0; h<=1; h+=1/12) { 
   for(s=0; s<=1; s+=1/12) {    
      cube().color(hsl2rgb(h*360,s,0.5)).translate([h*12*1.5,s*12*1.5,0]); 
   } 
}

name

obj.name(s)
name(obj,s)

Note: the name of an object is considered when exporting from ScriptCAD, e.g. as STL or 3MJ format, the filename is taken from the name of the object.

% scriptcad -of stl --code "cube().name('my sample')"
scriptcad: writing my_sample.stl [stl]

properties

obj.properties({k1: v1, k2: v2, ... })
properties(obj, { .... })

Note:

  • .name(s) is the same as .properties({name: s})
  • .color([r,g,b]) is the same as .properties({color:[r,g,b]})
  • you are free to add any kind of metadata, some export format will carry those on, e.g. 3MF, AMF and 3MJ format will carry them over

Simple Functions

A few simple functions help to port OpenSCAD source code, e.g. OpenSCAD for() statement resembles the forrange() as provided:

forrange

forrange([start,end],function(i) { })
forrange([start,step,end], function(i) { })

foreach

foreach([a1,a2,a3,...],function(i) { })

ifelse

ifelse(b, function() { })
ifelse(b, function() { }, function() { })

children

children(function(c) { })

whenever you have a scene, you may process all objects again using children()

Scene

ScriptCAD computes in two stages:

  1. computes scene
    • run the code, and create all 2D and 3D forms
    • object tree is formed
  2. render scene
    • all objects are rendered
      • with triangles to display on WebGL or export to polyhedral forms (STL, OBJ, AMF, 3MF, 3MJ etc)

computeScene

computeScene() computes the entire scene with all objects, and summarizes all transformations – at this point no vertices or actual geometries exist, only the representations.

renderScene

renderScene() takes the scene and renders it, in case WebGL or exporting a certain format, then it triangulates all objects in order to display or export.

Important: current implementation of computeScene() calls renderScene().

Import

Formats

  • STL ASCII / Binary: most common format, lasting support for slicers
  • OBJ Wavefront: common format, ASCII-based, compact
  • SCCAD ScriptCAD: native intermittent format describing the scene
  • AMF: multi-material/color format, XML-based, fading support for slicers
  • 3MJ: multi-material/color format, JSON-based, optionally compressed with gzip
  • Gcode: visualize 3D printing process with multitool (color) support

Any format which can be imported can also be Drag & Drop into the browser from a file browser.

Export

Formats

  • STL ASCII / Binary: most common format, lasting support for slicers
  • OBJ Wavefront: common format, ASCII-based, compact
  • SCCAD ScriptCAD: describing scene as intermittent format
  • SCAD OpenSCAD: to exchange with OpenSCAD, all objects are exported as polyhedron() or polygon() in triangulated form
  • AMF: multi-material/color format, XML-based, fading support for slicers
  • 3MF: multi-material/color format, XML-based, compressed with zip, multiple files, cumbersome specification
  • 3MJ: multi-material/color format, JSON-based, optionally compressed with gzip

Drag & Drop

Any Import Formats can be dragged and dropped from file browser into the inline-editor or 3D platform of your browser, and you edit the source with you preferred editor outside of the browser, and ScriptCAD automatically reloads the source and computes & renders the scene.

Command Line Usage

On the command line you can use scriptcad and it will perform:

  • computeScene() and renderScene()
  • and export to the format you desire

best call scriptcad --help for some basic usage information (those change with new version):

ScriptCAD CLI 0.1.5 USAGE: scriptcad {<options>} [<input-file>]
    options:
       -h or --help            print this
       -v or --verbose         increase verbosity
       --version               print version and exit
       -q or --quiet           be quiet (no output)
       -o <fileout>            set output filename
       --output=<fileout>          "             "
       -of <fmt>               fmt: stl, stla, stlb, obj, amf, 3mf, 3mj, sccad, png, gcode (default: stl)
       --output-format=<fmt>
       --unname                unname all solids (enumerate multiple solids)
       --subname               add name to existing export name
       --merge                 merge all top-level solids to one
       --imgsize={w}x{h}       set image size (default: 512x512)
       --lib=<libs>            set libraries (e.g. --lib=./js/extra.js,/lib/sccad/lib.js)
       --function=<name>       set function called (default: main), may include arguments too
       --select=<name>,…       select various solids by name
       --view=<name>           select particular view
       --code                  consider arguments as code

 examples:
       scriptcad -o test.stl example/sample.sccad
       scriptcad -o test.stl --output-format=stla example/sample.sccad
       scriptcad -o test.png --imgsize=800x600 example/sample.sccad
       scriptcad -o fan_adapter-50-40.stl "--function=fan_adapter({aoff:15})" examples/fan_adapter.sscad
       scriptcad -of stl --code 'cube()'
          writes code.stl
       scriptcad -of stl --code 'cube().name("test")'
          writes test.stl
       scriptcad -of stl --subname --code 'cube().name("test")'
          writes code.test.stl

Examples:

% scriptcad -o cube.stl cube.sccad
% scriptcad -of stl cube.sscad
% scriptcad -of png --code 'cube(20)'

End of ScriptCAD Reference

Misc: Formnext 2019 aka “just too much for one day”

I decided to visit Formnext 2019 in Frankfurt (Germany) November 20, 2019. And to give you the essence first, it was too much – 800 exhibitors in two larges halls each with 2 floors – one day is not enough, and others told me, not even two days is enough to have time to absorb what has been shown at this exhibition.

Metal Printing: one of the huge topics of Formnext 2019 was . . . metal printing aka “no more plastic”, it seemed like the motto for 2019, in the corporate sense of it.

The printers were huge, car or even tractor sized 3D printers.

The kind of faceless corporate world:

Ultimaker booth

Ultimaker: So I spotted Ultimaker booth, and asked for “Daid”, nobody seemed to know, but “David” was known (as author and driving force of Cura) but not there, as he left the company 2 months ago I was told – either way, I spoke with Roger Bergs and expressed my gratitude for Cura being Open Source and he replied: “you know, we come from there, it’s part of our company culture” . . . nice to see such a commitment to the Open Source, especially compared to the next:

MakerBot: . . . and to my surprise, there was a mid-sized booth of MakerBot, the owner of the struggling Thingiverse, on the brink of collapse. After some brief delay, I was able to talk to Jason Chan, responsible for Thingiverse who was on site, and we had a brief talk:

MakerBot booth
  • I acknowledged the role MakerBot played in early days of 3D printer development in contrast to the later abandonment of the Open Source principle with the acquisation by Stratasys . . .
  • I pointed out how important Thingiverse was and still is for existing projects, which still reference the STL files on Thingiverse and if it were to disappear it would be devastating and break many projects out there (not all migrated to github or other 3D model repos)
  • further I expressed my experience about other the 3D model repositories being functionally inferior compared to Thingiverse
  • Thingiverse was unbearable slow and unreliable – Jason acknowledged and confirmed my concerns of the current functionality of the site
  • Jason responded as following:
    • only 2 web developers are assigned to Thingiverse maintenance as of 2019/11
    • there is a backlog or debt of problems unaddressed for the years and MakerBot is aware of it (to the public it seemed nobody cares at MakerBot)
    • Thingiverse is costly running it, and provides no (significant) income
    • there are commitments within MakerBot to reboot Thingiverse and fix all the backend issues and resolve the “slowness” of the site (that has been said before, nothing happened – just check @makerbot Twitter account)
    • development of a financially sustainable foundation for Thingiverse, means, to create income – how this is planned he didn’t wanted to reveal in more details
    • MakerBot kind of was surprised of the immense success of Thingiverse of the past years

Josef Prusa: While visiting Hall 11, I came across Josef Prusa walking alone, and I just briefly shared my admiration for his success by combining Open Source and business to a self-sustaining model. I later visited the Prusa Research booth, and it was packed with visitors and and catched this short video showing Prusa Mini in action:

BuildTak: Just a brief talk with Igor Gomes, about their new products and shared a bit of my stuff as laid out on this web-site.

Creality booth

Creality: . . . and there it was, a tiny small booth of Creality – 4 or 5 shy representatives sitting there, and I walked toward them and greeted them in english, and a smile rushed unto their faces (to my surprise), and I expressed my thankfulness of their move to Open Source the Ender 3 entirely, that this move or gesture really was acknowledged in the Open Hardware and 3D printing community in the “West”. In a way it was bizarre, there was this small booth, while in reality, this company had more impact than perhaps the rest of the exhibitors of the entire hall – nobody else ships as many 3D printers as this company as of 2019.

Misc Small Chinese Exhibitors:

Too little time to explore their products in more depth.

E3D Online: Just briefly glanced at their booth, as I watched already videos online of their tool changer, and I was already significantly exhausted.

E3D Online: Tool changing with metalbrush to clean the changing toolhead

NinjaTek: just passing by . . .

FelixPrinters: . . . also too little time and openness left from my side cut this visit short, but their printers looked very well thought out.

Belts

Printing Big

Misc Perls

Anyway, after 7 hours I was exhausted from all the impressions – it was too much of visual stimulis and constant noise – and I left the exhibition and headed back to Switzerland by train again, and arrive at midnight finally – it was worth my time.

That’s it.

Social Media

The best way to learn about 3D printing is via different social media platforms, like

Mastodon

People to follow:

During spring & summer 2023, with the takeover by Elon Musk of Twitter in 2022, the 3D printing community disintegrated slowly there as many influential developers left to Mastodon but audience did not follow.

Twitter

People to follow:

YouTube / Podcasts

3D printer design and operational dynamics is a complex subject and capturing action in video and analyzing and solving problems, along with Open Source designs, YouTube played a significant role to drive the Open Source innovation. A few regular shows arose out of countless 3D printing video blogs:

  • CNC KItchen (★★★★): detailed study of particular issues along CNC and 3D printing with Stefan, mainly reviews but also innovates
  • Podcast: 3D Printing Today (★★★★): excellent podcast on 3D printing (weekly), on-topic with Andy and Whitney, technical details and general review of 3D printing scene, not entirely up-to-date (months behind actual developments)
  • 3D Printing Nerd (★★★★☆): feel-good more popular / entertaining approach to 3D printing with Joel
  • RCLifeOn (★★★★☆): remote controlled toys with 3D printing, great humor
  • Teaching Tech (★★★★☆): on-topic featuring many issues/reviews/how-tos on 3D printing, technical details
  • Chris’s Basement (★★★★☆): early reviews of new approaches, designs, hardware etc with Chris, quite informative
  • Podcast: Hackaday (★★★★☆): informative, but only occassionally 3D printing topics, worth considering for overall tech/maker news
  • The Infill Podcast (★★★★☆): video & audio podcast, informative due good interviewing guests
  • Vector 3D: (★★★☆☆): technical discussions, good Formnext 2019 interviews with Adam, british understatement
  • Tom Sanladerer (★★★☆☆): experienced engineer addresses many 3D printing related topics since years, professional appearance, dry personality and presentation
  • Maker’s Muse (★★★☆☆): 3D modeling and printing, passionate presentation
  • 3DMN (★★★☆☆): reviews and how-tos, passionated presentation, feel-good personality, less technical depth
  • Meltzone (★★☆☆): with Tom Sanladerer and CNC Kitchen’s Stefan, promising but early episodes were off-topic a lot, since episode #30+ a bit better, still slow paced (listen/watch at 1.5x speed), verbose, rambling, hardly making a point on any topic – dis-appointing / missing the points and indecisive
  • Podcast: 3DPOD (★★☆☆☆): unprepared / unprofessional appearance, bad audio quality of recordings, but professional & corporate guests unlike all other channels
  • Podcast: GoAdditive (★★☆☆☆): unfocused, verbose, too long for the actual content, sales talk, pearls spread out, decide if it’s worth your time to find

Once you start to watch 3D printing videos on YouTube, its recommending algorithms will give you further content.

Blogs

ScriptCAD.org

Introduction

Faces + Edges

Back in 2003 I adapted OpenJsCad framework and extended it and documented it properly so it can be used in an easy way and then handed OpenJSCAD.org over to JS devs, who transformed it into the several NPM packages so it becomes usable for 3rd party packages easier.

I realized I wanted to have CAD with strong script capability with the focus on easy use and leave all the NPM package and JavaScript module conformity aside but refocus on easy and powerful 3D scene language, and so I started 2019/01 again, this time from scratch:

illu-stages
  1. Modeling in JavaScript
  2. Hierarchical Scene (computeScene())
  3. Compute Form
    • computeSolid()
      • computeSolidPolygon(): creates polyhedral approximation of solids
      • computeSolidImplicit(): create code for implicit rendering
  4. Rendering (renderScene())
    • polygon: throw triangles into WebGL space (e.g. with threejs)
    • implicit: render using GL shader
  5. Export
    • polygonal:
      • Browser: .stl, .amf, .obj, .3mf, .3mj
      • CLI: .stl, .amf, .obj, .3mf, .3mj, .png

Goals

  • true scripting capability like JavaScript (OpenSCAD’s .scad is a reduced language)
  • keep it simple (no NPM module export or alike complexity)
  • CSG capability (union, intersection, difference)
  • name parts and enumerate parts/id
  • parametrical designs (expose certain variables)
  • extrude 2D polygons to another (not just hull)
  • morph from one solid to another
  • simple fillets and chamfers (reduce sharp edges for real world parts)
  • extensive and detailed documentation
  • 100% API backward compatibility (no depreciation)

Few notes how to achieve those:

  • using three.js and ThreeCSG: reliable and well maintained package somewhat, ThreeCSG seems outdated/abandoned; alternatively using csg.js and/or OpenJSCAD packages as fallback, but hiding all the module handling
  • separate creating scene and rendering scene altogether:
    • polygons or rendering triangles are a stage, but not the core of the CAD, but true solids like a (perfect) sphere
    • use WebGL as one backend among others
    • use implict representations alternatives
  • fillets and chamfers: even those look simple, those are hard(er) to do in polygonal/triangulated stage, but simple to do with implicit representation
    • referencing individual edges (using consistent notion)

Prototype

Visit ScriptCAD.org

  • Chrome/Chromium provides full functionality
  • Firefox lacks marked source code from 3D space or Tree view

Status

  • 3D Forms: cube(), sphere(), cylinder(), polyhedron()
  • 2D Forms: square(), circle(), polygon(): line, lines, closed/open polygon
  • Operations: linear_extrude(), rotate_extrude(), transform(), scale(), rotate(), hull(), mesh()
  • CSG Operations: union(), difference(), intersection(), exclusive()
  • Import: STL (ASCII/Binary), AMF, OBJ, DXF, SCCAD (ScriptCAD), 3MJ
  • Export: STL (ASCII/Binary), AMF, OBJ, 3MF, SCAD (OpenSCAD), SCCAD (ScriptCAD), 3MJ, Gcode, PNG (CLI only)
  • Browser Support: Chrome (fully functional), Firefox (source select missing)

History

  • 2019/12/27: 0.3.3: experimental export of SCAD (OpenSCAD), 3MF, and SVG (only 2D) added:
  • 2019/12/05: 0.3.0: ScriptCAD.org Reference online, for now hosted on this site
  • 2019/11/25: 0.2.5: ScriptCAD.org launched as preview and a limited ScriptCAD Reference
  • 2019/11/05: 0.2.3: various features implemented, e.g. exclusive(), 3MJ import and export support added.
  • 2019/03/04: 0.1.5: more drawing models, selectable windows, more examples:

Brief overview of features of 0.1.5:

  • 2019/01/18: select Source -> TreeView -> 3D Scene or any stage and respective part is highlighted

Applications

I used ScriptCAD to generate paths with certain colors, and visualize it within ScriptCAD Web-GUI, and on the command-line the same code generated actual Gcode for one of my 3D printers, Ashtar K#2 equipped with Diamond Hotend 3-in-1 (mixing colors) – it allowed me to control every detail, something an ordinate slicer would not have provided:

Related Projects

Services

I’m available for following services for hire:

3D Printer Hardware & Software Add-Ons

  • you have existing hardware and need a special extension, add-on or refined tuning?
  • you like to extend some of the software framework or pipeline you already use?
  • or perhaps have hardware and require a tighter integration with the software?

It has been my passion and focus to integrate hardware and software tighter and extend existing solutions to my own needs and requirements and so I may provide you with alike unique solutions for your requirements.

3D Printing Consultancy

  • you have questions about 3D printing?
  • you like to purchase and operate 3D printers in your company?

I consult you on good practices, including 3D printer recommendation and software stack/pipeline to fulfill your needs and requirements.

IP Licensing

Some of my designs are in the Open Source, other more complex designs or software are available for licensing:

  • Multiple Switching Extruders: MSE Y2 (Dual) & MSE Z4 (Quad) (draft stage)
  • 5-axis Printhead PAX: CAD model, firmware driver (RepRapFirmware)
  • 5MF processor 5DMaker (early development): creates 5-axis G-code (usable for 4-axis and ordinary 3-axis FDM as well) – usable for small series production.
  • Multi Gantry 3D Printer: work in progress (2025-)

Inquery about conditions and pricing.

Contact

Contact me with a brief description of your requirements, or overall project you have in mind.

René K. Müller <contact.xyzdims/com>

or contact me via LinkedIn

CAD & 3D Printing: Parametric CAD with OpenSCAD

The past year (2018/2019) I printed with my own designed 3D Printers with various printheads and required for each variant a dedicated Part Cooler, and I realized it was worth the time to approach this in a parametric manner using OpenSCAD, using the “bull horn” design and so I came up with a general approach, and as a result was able to create various variants for my use-cases:

part-cooler-selection2

  • Custom Triple (& Dual) Micro Swiss hotends (3 nozzles, 3 heatsinks)
  • Chimera 2-in-2 (2 nozzles, 1 heatsink)
  • Cyclops NF 2-in-1 (2 intake, 1 nozzle, 1 heatsink, non-mixing)
  • E3D Volcano (1 nozzle, 1 heatsink, large nozzle diameter)
  • E3D V6 Lite (1 nozzle, 1 heatsink, small / medium nozzle diameter)
  • a few other specialized setups

Needless to say, the proven design allowed me to quickly design and print a new variant, and have expected results when using the part cooler – which is a huge time saver.

Yet, one drawback is obvious: in order to adapt a new variant, one requires the surrounding parts like heat sink and nozzle as a model or design it yourself (which can be time consuming as well) so the proper variables can be found to render the part cooler for the setup.

After I designed my 3D Printers also in parametric manner, like the Ashtar K (Prusa i3-like) 380x300x300mm build volume or Ashtar C (Core XY) 380x400x380mm build volume, using this parametric approach for a Part Cooler as well, turned out quite successful too.

It makes sense to develop and design a parametric piece which

  • maintains a few constraints, a general form, a base functionality
  • requires a few variables to adapt certain customization, sometimes it makes sense to introduce a lot of variables, and while testing and adapting customized pieces, some variables may become constants and unforeseen variables become more important

It certainly requires expertise about the piece in order to discern the constraints from the variable aspects while still maintaining its base functionality.

That’s it.

PS: See Parametric Part Cooler project page for new developments.

3D Printing: Triple Nozzle Printhead

Updates:

  • 2020/12/29: published finally, also released files on Thingiverse
  • 2019/09/24: initial draft (not yet published)

After working on dual CR10 nozzle / Micro Swiss nozzle setup, I considered to add a third nozzle:

Triple CR10  Hotends / Micro Swiss Hotends

In order to pack the 3rd nozzle, I put it in front of the dual setup, and use one heatsink fan cooling all three heatsinks:

screenshot-from-2019-05-21-21-16-04.png

The Parametric Part Cooler has the settings part_cooler(m=50,wx=50,yoff=17,sq3=1,wx=54).

Final smooth part cooler and fully assembled:

Screenshot from 2019-06-17 07-22-05
Parametric Cooler for Triple Micro Swiss Hotends
Screenshot from 2019-06-17 07-21-14
Parametric Cooler for Triple Micro Swiss Hotends
Parametric Cooler for Triple Micro Swiss Hotends

Download

https://www.thingiverse.com/thing:3865972

Assembly

Assemble 3 nozzles in one go, and adding heatsink fan mount:

adding 50mm fan on top:

and with the dedicated Part Cooler using 5015 fan blower:

I recommend cover all nozzles with silicon socks when using the part cooler. Optionally LED strip mount in case you want some light on all three nozzles.

Leveling Three Nozzles

It’s essential that all three nozzles have the same distance to the bed, otherwise inactive nozzles might touch and tip-over a piece while printing. See Dual Nozzle Setup for the procedure.

Third Hotend Wiring

One requires a board with 3x MOSFETs to heat all three heatblocks and 3x thermistors inputs, like RUMBA or TANGO (Open Source variant of RUMBA) controller board or extend it with dedicated parts:

  • per heater: STP55NF06L (MOSFET) with 10R, 100K on a Dx (digital output); LED with 1.8K is optional
  • per thermistor: 4.7K with 10uF on a Ax (analog input)

for wiring see RAMPS 1.4 schematic as reference:

See Also

That’s it.

3D Printing: Dual Nozzle Printhead

Once I discovered the Micro Swiss Hotend clones aka CR10 hotends, I realized they had properties which were ideal for dual nozzle printheads:

  • the nozzle is vertically fastened with a single screw
  • 2 or more nozzles can be easily vertically calibrated to have the same distance to the printbed

The proper way includes two additional screws which stabilize the heatsink with the heatblock, but those are left out for this use-case.

Dual Hotend Mount

A very minimalistic lightweight mount with 40mm fan in mind:

The nozzle X offset is 24mm in the ideal case.

Part Cooler

Adapting my Parametric Part Cooler with part_cooler(name="dual swiss",wx=50)​:

Download

https://cults3d.com/en/3d-model/tool/dual-extrusion-with-2x-cr10-micro-swiss-hotends-with-part-cooler

https://www.thingiverse.com/thing:3633941

BOM

  • 2x M3x12 or 14 to mount to 30mm X carriage, possible 2x M3 nuts
  • 4x M3x20 (mount 2x “CR10 hotends”)
  • 4x M3 nuts
  • 4x M3x10 or M3x12 if you use part cooler too (mounting 40mm fan)
  • 1x 40×10 fan
  • 1x 50×15 fan blower (optional as part cooler)

Assembly

  1. assemble both hotends to the X carriage without PTFE inserted yet
  2. move Z down until one hotend reaches bed (truly touch)
  3. open worm screw of the other hotend so the nozzle drops to the bed as well
  4. close worm screw firmly
  5. move X carriage 2mm or more up
  6. insert PTFE and fasten firmly (I recommend https://www.thingiverse.com/thing:1993384 2x PC4-M10 = PTFE remains intact) and insert filament
  7. perform test print

X Offset

You can define X offset via Gcode (e.g. as start gcode):

M218 T0 X0
M218 T1 X24 Y0

given T0/Extruder 1 is left, and T1/Extruder 2 is on the right.

Since “CR10 hotends” are really cheap and not precisely machined, there is too much margin in the mounting 3mm holes – hence, you likely have more or less of 24mm X offset, and possible even Y offset as well. Use a 2-color calibration model to tune the offsets.

Usage

Comparison Dual/Multi Color/Material Extrusions

blue = relevant positive
red = relevant negative

Independent Dual Extrusions (IDEX)

  • complex setup
  • moderate cost
  • non-mixing
  • dual nozzles
  • dual heatblocks
  • dual heatsinks
  • normal retraction
  • no purge block 1)
  • no oozing over print
  • no inactive nozzle traveling
  • reliable 2)

★★★★★

Dual Hotends 2-in-2

  • simple setup
  • low cost
  • non-mixing
  • dual nozzles
  • dual heatblocks
  • dual heatsinks
  • normal retraction
  • no purge block
  • inactive nozzle oozing over prints
  • inactive nozzle travels over print
  • moderate reliability

★★★★★

Chimera 2-in-2

  • simple setup
  • clone: low cost
  • original: high cost
  • non-mixing
  • dual nozzles
  • dual heatblocks
  • single heatsink
  • normal retraction
  • no purge block
  • oozing of inactive material
  • inactive nozzle travels over print
  • moderate reliability

★★★★★

Cyclops 2-in-1

  • simple setup
  • clone: low cost
  • original: high cost
  • mixing
  • single nozzle
  • single heatblock
  • single heatsink
  • normal retraction
  • purge block required
  • no oozing of inactive material
  • clone: unreliable

★★★★ (clone)

Cyclops NF 2-in-1

  • simple setup
  • low cost
  • non-mixing
  • single nozzle
  • single heatblock
  • single heatsink
  • complex retraction
  • no oozing of inactive material
  • moderate reliability

★★★★★

Diamond Hotend 3-in-1

  • complex setup
  • clone: low cost
  • original: high cost
  • mixing
  • single nozzle
  • single heatblock
  • 3 heatsinks
  • tricky retraction
  • purge block required
  • no oozing of inactive material
  • moderate reliability

★★★★★

Multiple Switching Extrusions (MSE) 2-in-2, 3-in-3, 4-in-4

  • moderate complex setup
  • requires additional servo or motor
  • extendable 2, 3, or 4 colors/materials
  • low cost
  • non-mixing
  • multiple nozzles / heatblocks / heatsinks
  • normal retraction
  • no purge block 1)
  • no oozing of inactive material
  • no inactive nozzle touching print
  • reliable 2)

(rating comes later)

Y Splitter x-in-1

  • simple setup
  • extendable 2, 3, or 4 or more colors / materials
  • low cost
  • non-mixing
  • single nozzle
  • single heatblock
  • single heatsink
  • complex retraction
  • purge block required
  • no oozing of inactive material
  • moderate reliability

★★★★★

Tool Changer

  • complex setup
  • extendable to n-colors or materials
  • moderate cost
  • non-mixing
  • multiple nozzles / heatblocks / heatsinks
  • normal retraction
  • no oozing of inactive material
  • no inactive nozzle touching print
  • moderate reliability

(rating comes later)

Footnotes

  1. in theory no purge block, but if ooze shields are shared among switching extrusions (more than 2 extrusions) there may be cross-contamination between colors/materials
  2. the printheads individually are proven to be reliable

Hints:

  • single heatblock = same print temperature
  • dual heatblock = different print temperatures possible
  • dual nozzle = different nozzle sizes possible

See Also

That’s it.

3D Printing: Diamond Hotend Part Coolers Design Reviews

The past weeks (2019/09) I adapted existing Part Cooler designs, and redesigned them in order to work with the Diamond Hotend, as I have been searching for a good part cooler option and did not succeed with what’s out there already.

So here my 3 designs so far with a short review of their use quality:

Dual (or Single) Short Fan Shrouds

At the first sight this looks a promising design, but in reality there were major drawbacks:

  • adjustment of height (vertical) was critical and required fine-tuning
  • tendency to cool down the nozzle instead of the molten filament, in particular at lower layers near the bed
  • max cooling was 35% with my 5015 blowers

Rating: ★★★★

See details at Dual Short Fan Shrouds.

Ring Cooler

As next I designed the ring cooler, with small holes around the nozzle, also adjustable in the height (Z), but the cooling wasn’t really sufficient, as the nozzle still was cooling off a lot (no more than 45% cooling fan with 5015 blower was possible) – quite a disappointment for the rather sophisticated setup, but this general “ring cooler” design has failed for me also for other printheads like E3D V6 or so, and I switched back to “bull horn” like fan shroud.

Rating: ★★★

See details at Ring Cooler.

Single Directional Cooler

This rather simple design turned out the best option so far:

  • wide: 5015 blower runs at 80% without cooling the nozzle too much
  • narrow: 5015 blower runs at 50% without cooling the nozzle too much
  • creates sufficient disturbance around the nozzle to cool opposite side as well

and the XYZ 20mm Hollow Calibration Cubes came out quite well, on all 4 sides the letters were printed OK – not as good as E3D V6 and other printheads.

Rating: ★★★

See details at Directional Cooler.

Addendum: Dual Directional Cooler

Although it seemed logical to use two direct cooler, but the amount of air around the nozzle in operation was too much, and it required 20% fan cooling so the nozzle was still properly heated, but this was too low to provide any sufficient part cooling. So this option, without silicon sock on the Diamond Hotend, is not suitable.

Rating: ★★★ 

Summary

The winner is the Directional Part Cooler as it brings the cool air close enough where the molten filament exits the nozzle, without affecting the bare nozzle too much. As mentioned, either way a silicon sock would be recommended when using a part cooler with the Diamond Hotend – so far (2019/09) there is no commercial source but DIY approach with this thing.

As you can see I used simple E3D V6 Fan mount in combination of LED Strip holder to lighten up the tip of the nozzle and the printing operation.

That’s it.

3D Printing: Diamond Hotend Directional Part Cooler

Diamond Hotend Part Coolers Design Reviews:

This is the 3rd option for a Part Cooler for Diamond Hotend I designed, a pointy directional approach using again 5015 blower:

Screenshot from 2019-09-11 08-55-14Screenshot from 2019-09-11 08-55-30

Assemble

Functional Setup

Parts

screenshot-from-2019-09-13-17-45-31.png

Printable:

  • diamond_cooler_shield_blower-2mounts
  • diamond_cooler_5015-mount-inset-right
  • diamond_direct_part_cooler
    • print without support but with additional brim to increase adhesion of 1st layer
    • print with 0.4mm nozzle / line-width, with a good slicer this gives 3 perimeters for the model with 0.2mm or 0.25mm layer-height
    • -narrow: use ~50% fan cooling, position as low to the nozzle height as possible (e.g. 2mm above, not less, not more)
    • -wide: use ~80% fan cooling: more tolerant on vertical position / height
  • optional:
  • optional (recommended):

Vitamins (Non-Printable):

  • 5010 fan (main heatsink fan)
  • 5015 blower
  • 3x M3x20
  • 2x M3 nuts

Download

https://cults3d.com/en/3d-model/tool/diamond-hotend-directional-part-cool

https://www.thingiverse.com/thing:3855947

Throttle Fan & Positioning

Even though the air output is close to the nozzle tip, you might reduce the fan

  • -narrow: use ~50% fan cooling, position as low to the nozzle height as possible (e.g. 2mm above, not less, not more)
  • -wide: use ~80% fan cooling: more tolerant on vertical position / height

to avoid cooling the nozzle and run into “THERMAL RUNAWAY” error – or you use a Diamond Hotend silicon sock, then you likely are able to use 100% cooling fan.

XYZ Hollow Calibration Cube with 3 Colors Mixed

The actual success of this setup is seen in this test cube (printable with 0% infill):

The “X” and “Y” junctions are quite well printed, not as good with a “bull horn” part cooler as with E3D V6 setup.

Addendum: Dual Directional Cooler

Although this looks like a nice setup, the overall output of air to the nozzle is overpowering and cools off the nozzle too much. The cooling fan, in my case, required reduction to 20% to avoid “THERMAL RUNAWAY ERROR”, but at 20% the cooling effect on the extruded filament was less optional than with a single directional cooler – therefore this option isn’t recommended, unless you have a silicon sock over the nozzle.

 

That’s it.