15 November 2013

Note: I’m not a lawyer. This post is mostly just about my thoughts and all of my interpretations of various software or content licenses might be completely wrong. Also, this text asks a lot’s of questions and brings no answer. You have been warned.

Models for 3D printing and free software licenses

I’m a big fan of hobby 3D printing and I’m a big fan of free software and content. When I code, I release my work under the terms of various free software licenses, mostly ISC (similar to MIT) or GNU GPL. When I create stuff for 3D printing, I want to do the same thing: Make it free, as in freedom.

But applying software licenses to content is not a good idea. For that, we have free content licenses, such as favorite Creative Commons (without NC or ND restrictions). First of all, most “easy” (a.k.a. short) licenses, such as ISC or MIT, speak about software only. I don’t know if I can even legally apply the text about software to something else:

Permission to use, copy, modify, and/or distribute this software...

On the other hand, GNU GPL thinks about other kind of stuff than software:

This License applies to any program or other work...

But even though, the license speaks about source and binary form. Even if the source form is well defined as something that’s meant for easy editing (or something like that), we are still stuck in the world where we have just two forms: form for editing and form for running/using. I will return to that later and you’ll see that in 3D printing, this problem is much more complex.

Creative Commons and other content licenses

So for now on, I could say that Creative Commons is a much better option. An audio track, a photo, even a video or an icon, that’s all content. Therefore 3D model has to be content too. However, I code my models. Wait, huh? Yes, I code them, usually in OpenSCAD. As you might already know, using Creative Commons for source code is not recommended (well, that page speaks about software, but you know what I mean). Let’s say I release my work under the terms of CC BY-SA. Do others have to distribute the code alongside with the 3D model? And do they need to keep it open source? No, they don’t. As long as you are fine with that, there is no trouble. But if you want to keep you work open source, as if you would use GNU GPL, you cannot use Creative Commons. It just doesn’t work.

“Source and binary” form of a 3D model

To explain the problem, I will return to software. When you code a program, it’s usually either compiled or interpreted. Unless it’s kind of both. If we stick with the compiled form, it is possible to distribute sources and/or executables (or binary libraries etc.). Various complex licenses define terms for distributing your app in different forms. For example GNU GPL says: if you distribute binary, you have to include the source.

But when I code my 3D models, it has got much more forms. It can exist in a form of source code. The source code can be compiled/rendered to meshes - either binary or ASCII, that’ts not the point here. But even the mesh is easily editable. You can import it into Blender and do crazy stuff with that. Later, the mesh can be compiled/sliced to G-code, that can be compared to binary form or your app for different architectures (while by architectures I mean different 3D printers). While you usually don’t distribute just G-code for the technical aspect, it’s certainly possible and if you know that other person has the very same printer as you, it’s even useful sometimes. But even the G-code can be somehow editable, but not in very delicious way. And last but not least, you have the printed real 3D object.

So let’s make it an real world example. I create a model in OpenSCAD. Let’s make it simple (and for now ignore the fact that you probably couldn’t license a common shape such as cube anyway):

cube(1);

Then I create a mesh form that code in a form of STL file:

solid OpenSCAD_Model
  facet normal -1 0 0
    outer loop
      vertex 0 0 1
      vertex 0 1 1
      vertex 0 0 0
    endloop
  endfacet
  facet normal -1 0 0
    outer loop
      vertex 0 0 0
      vertex 0 1 1
      vertex 0 1 0
    endloop
  endfacet
  facet normal 0 0 1
    outer loop
      vertex 0 0 1
      vertex 1 0 1
      vertex 1 1 1
    endloop
  endfacet
  facet normal 0 0 1
    outer loop
      vertex 0 1 1
      vertex 0 0 1
      vertex 1 1 1
    endloop
  endfacet
  facet normal 0 -1 0
    outer loop
      vertex 0 0 0
      vertex 1 0 0
      vertex 1 0 1
    endloop
  endfacet
  facet normal 0 -1 0
    outer loop
      vertex 0 0 1
      vertex 0 0 0
      vertex 1 0 1
    endloop
  endfacet
  facet normal 0 0 -1
    outer loop
      vertex 0 1 0
      vertex 1 1 0
      vertex 0 0 0
    endloop
  endfacet
  facet normal 0 0 -1
    outer loop
      vertex 0 0 0
      vertex 1 1 0
      vertex 1 0 0
    endloop
  endfacet
  facet normal 0 1 0
    outer loop
      vertex 0 1 1
      vertex 1 1 1
      vertex 0 1 0
    endloop
  endfacet
  facet normal 0 1 0
    outer loop
      vertex 0 1 0
      vertex 1 1 1
      vertex 1 1 0
    endloop
  endfacet
  facet normal 1 0 0
    outer loop
      vertex 1 0 0
      vertex 1 1 0
      vertex 1 1 1
    endloop
  endfacet
  facet normal 1 0 0
    outer loop
      vertex 1 0 1
      vertex 1 0 0
      vertex 1 1 1
    endloop
  endfacet
endsolid OpenSCAD_Model

Then I create a G-code form that:

    G21 ; set units to millimeters
    M107
    M104 S200 ; set temperature
    G28 ; home all axes
    G1 Z5 F5000 ; lift nozzle
    
    M109 S200 ; wait for temperature to be reached
    G90 ; use absolute coordinates
    G92 E0
    M82 ; use absolute distances for extrusion
    G1 F1800.000 E-1.00000
    G92 E0
    G1 Z0.350 F7800.000
    G1 X94.790 Y94.790
    G1 F1800.000 E1.00000
    G1 X95.800 Y93.960 F600.000 E1.04253
    G1 X96.950 Y93.350 E1.08489
    G1 X98.200 Y92.970 E1.12739
    G1 X99.500 Y92.840 E1.16990
    G1 X100.500 Y92.840 E1.20243
    G1 X101.800 Y92.970 E1.24494
    G1 X103.050 Y93.350 E1.28745
    G1 X104.200 Y93.960 E1.32980
    G1 X105.210 Y94.790 E1.37233
    G1 X106.040 Y95.800 E1.41487
    G1 X106.650 Y96.950 E1.45722
    G1 X107.030 Y98.200 E1.49973
    G1 X107.160 Y99.500 E1.54223
    G1 X107.160 Y100.500 E1.57477
    G1 X107.030 Y101.800 E1.61728
    G1 X106.650 Y103.050 E1.65978
    G1 X106.040 Y104.200 E1.70214
    G1 X105.210 Y105.210 E1.74467
    G1 X104.200 Y106.040 E1.78720
    G1 X103.050 Y106.650 E1.82956
    G1 X101.800 Y107.030 E1.87206
    G1 X100.500 Y107.160 E1.91457
    G1 X99.500 Y107.160 E1.94710
    G1 X98.200 Y107.030 E1.98961
    G1 X96.950 Y106.650 E2.03212
    G1 X95.800 Y106.040 E2.07447
    G1 X94.790 Y105.210 E2.11700
    G1 X93.960 Y104.200 E2.15954
    G1 X93.350 Y103.050 E2.20189
    G1 X92.970 Y101.800 E2.24440
    G1 X92.840 Y100.500 E2.28690
    G1 X92.840 Y99.500 E2.31944
    G1 X92.970 Y98.200 E2.36195
    G1 X93.350 Y96.950 E2.40445
    G1 X93.960 Y95.800 E2.44681
    G1 X94.727 Y94.866 E2.48613
    G1 F1800.000 E1.48613
    G92 E0
    G1 X100.000 Y100.000 F7800.000
    G1 F1800.000 E1.00000
    G1 X100.000 Y100.000 F1800.000
    G1 X100.000 Y100.000 F7800.000
    G1 X100.000 Y100.000 F600.000 E1.00000
    G1 X100.000 Y100.000 F7800.000
    G1 X100.000 Y100.000 F1800.000
    M106 S255
    G1 F1800.000 E0.00000
    G92 E0
    G1 Z0.750 F7800.000
    G1 X99.875 Y100.125
    G1 F1800.000 E1.00000
    G1 X100.000 Y100.000 F600.000 E1.00520
    G1 X99.875 Y99.875 E1.01040
    G1 X100.000 Y100.000 F7800.000
    G1 X100.125 Y100.125 F600.000 E1.01559
    G1 X100.000 Y100.000 F7800.000
    G1 X100.125 Y99.875 F600.000 E1.02079
    G1 F1800.000 E0.02079
    G92 E0
    G1 Z1.150 F7800.000
    G1 X99.875 Y100.125
    G1 F1800.000 E1.00000
    G1 X100.000 Y100.000 F600.000 E1.00520
    G1 X99.875 Y99.875 E1.01040
    G1 X100.000 Y100.000 F7800.000
    G1 X100.125 Y100.125 F600.000 E1.01559
    G1 X100.000 Y100.000 F7800.000
    G1 X100.125 Y99.875 F600.000 E1.02079
    G1 F1800.000 E0.02079
    G92 E0
    M107
    M104 S0 ; turn off temperature
    G28 X0  ; home X axis
    M84     ; disable motors

And I print the cube, finally.

Let’s say I’ve released the cube under a software license, such as GPL. Now what is the source and what is not? What if Bob prints it and sells it to Anne, does he need to give her the G-code as well? Or STL file? Or even the OpenSCAD source? Does Bob needs to 2D print GNU GPL’s text and distribute it together with the printed cube?

There’s more

And that was simple. What if there’s a bunch of machine parts for a 3D printer released under GNU GPL and I take just one part of it and I use it in my own printer’s design. Is it derivative work and do I need to release my own printer’s design as GNU GPL? Does that mean I have to distribute all source code of my printer design together with it? Does that mean STL, G-code or OpenSCAD source? What if I don’t use OpenSCAD?

That could be solved by LGPL. Or not. How do I dynamically link a 3D printed object to another one?

I had an idea, that maybe an Open Hardware license could be useful, but that usually speaks just about documentation and therefor is not usable.

How to solve that?

When I create a 3D model for 3D printing I would like to have a license that satisfy my needs. For most of the cases, that’s CC BY-SA for me, as it works like MIT in software. However, I could imagine a situation, where I want to force keep the openness of the code. Of the very first OpenSCAD code. And once I put myself in that situation, I’ll be screwed.



blog comments powered by Disqus