 So our next talk is going to be Marius from the OpenSCAD project. So without further ado, help me give a warm welcome to Marius. OK, thanks, Ed. So yeah, I'm Marius. I'm the manager of OpenSCAD. A lot of people say OpenSCAD. It's fine. But we try to say OpenSCAD, and it sounds less like an open wound. So OpenSCAD is a very small community of people. We are practically two main developers, as me and Thorsten, who sits in the back here, and a handful of people who help out with community management and mailing lists and writes codes from time to time whenever they're there, jobs lets them. We also have participated in Google Summer of Code for a number of years together with BRLCAD. And we also participated in Google Summer of Docs, Google Season of Docs last autumn that has been really great. And we have survived for more than 10 years, which is great. And people still use it. And that's amazing. And that's why we keep doing it. And we also OpenSCAD tends to show up in all these top 10 3D modeling tools for 3D printing lists. And maybe after this talk, it will help you understand what the role of OpenSCAD plays today and why it exists. So for those of you who don't know about this project, I'll just give a really, really quick overview over the project and then talk a little bit about the title here, which is Designing Functional Objects with Functional Objects. So first of all, OpenSCAD, in one sentence, it's a domain-specific language for doing 3D modeling using constructive solid geometry. And it comes with a really lightweight IDE. And they just cover that really, really quickly. So this is Hello World in OpenSCAD. It's literally a sphere parenthesis semicolon. It's also often in the OpenSCAD language called to instantiate a module to create a shape. And you can instantiate other objects that are built in to create more shapes. Or if you want to do something more complex, for instance, creating a sphere with a hole in it, that is equivalent to taking the difference between a sphere and a cylinder. And this is the OpenSCAD syntax. And for this reason, OpenSCAD is often called a description language because you just describe objects. So in the same way as HTML, it doesn't have any kind of concept of time. You don't execute from top to bottom, it's just there. Also, it has zero boilerplate. So you write this, you get it. There's no build system. You just type this in and you get. And that's going to be really important for a lot of people later on. CSG, it's a very kind of classic old concept. In short, you basically start with solid primitives and then you perform certain operations on those primitives and those operations are defined in a way so that the result of the operation, the object is still solid. And the classic operations in CSG are unions, intersections and differences. And so how it works is that you basically, your leaf nodes are going to be your primitives and then you kind of, you hierarchically build up a more and more complex object by performing these operations. And then the root node of the tree is going to be your final shape. And this is what OpenSCAD does kind of by that you express using this domain-specific language. So we have a bunch of these primitives, not just standard primitives. You can create your own primitives. You can import primitives. We have two of the primitives including true typed text and you can import SVGs. And you can use those two of the primitives to integrate more treated primitives through various extrusions, all using this language. And we also have in addition to the three classic CSG operators, we have a bunch of other operators that you can use. And some of these are operators that are really hard to do in classic B-Rip modeling. But we are also a language. So we have all the classic and the language constructs. We have control flow. We have variables. We have list comprehension. We have for loops. We have built-in functions and you can use, you can define your own functions. You can define your old shapes. Shapes can be recursive. You can include and use libraries. So it's just like a, it's a full-fledged language, but it's not, it is still a domain-specific language. So it stays in your own sandbox. You can't create a web server and you don't want to create a web server. And so people tend to use OpenSCAD to create what they call parametric designs. And in this context, parametric designs are not kind of mathematical parametrization. It's more free-form logical parametrization. So if you want to say to create like a Lego brick, you would typically create a module in OpenSCAD with a name and a bunch of parameters. And then you or users of your library or module can then instantiate this object to get your designs. And you can change your parameters to get different kind of variants of this, of this design. And it doesn't have to be kind of the same shape really. It's just really logical way of collecting different related designs into one package. And this is a very, very common way of using OpenSCAD to abstract everything into a module and then you instantiate that module. And you can package it to a library and so other people can use it. And we also have a really, really basic IDE. So our IDE is a practice text editor with a 3D view and a bunch of buttons and menus that are used for all the ephemeral stuff. Because when you save this file, only the stuff that is written in text will be saved. Everything else is just kind of moving cameras around so you can look at it. And we do have a command line version that has all the features of the UI. So for those who like to use the command line, you just input the file and you output whatever you want to output. A lot of people also like to use their own favorite text editors in which case we have support for that. You can hide this editor and it will auto reload whenever the file changes on this. So that was kind of really quickly in seven minutes what OpenSCAD is. So let's talk a little bit about designing functional objects. This is more like a historic view of OpenSCAD why we started it. So when I see a 3D printer, I don't think rapid prototyping. I think kind of personal digital manufacturing. And to me, that means a few things. First of all, when you design a 3D design, the amount of time you put into that design very often needs to be proportional to the value of a single physical object of that type. So you can't hire the design engineers to spend days and weeks on designing something. You have to do it yourself. Do it yourself means that people who design stuff are not design engineers. They have minimal or no training in classic design tools or classic design paradigms. And three, objects don't have to be pretty. They just have to work in many cases. And that's very, very different from when you design for manufacturing. So a lot of people have other needs for this. But a lot of people kind of have needs in this domain that it's worth pursuing this idea of kind of pure functional designs that doesn't have to be pretty and it doesn't have to be mass-manufacturable. And so in the context of OpenSCAD, so when we started this project, this kind of grew directly out of the RepRap project, which is kind of creating a 3D printer that prints itself. It also grew out of hackerspace culture, in particular the MetaLab in Vienna. And it grew out of free software culture. And when we started this, we had these explicit goals that the main goal was to make it easier for non-designers to design for 3D printing. And we kind of designed it for ourselves. And since we were programmers, we kind of made it easier for programmers to design for 3D printing. But interestingly enough, that kind of a lot of non-programmers ends up using the tool because the language is so easy to express ideas in. And the second goal was that we wanted to focus on creating simple and functional objects. For 3D printing again. And laser cutting. A lot of us used laser cutting a lot to play around with ideas. So that was the explicit goal. These days it's most 3D printing. And we wanted the science to be human-readable. We wanted the science to be easily version-controllable. And we wanted it to be natural and easy to open-source with the science. Because not only the code has to be open-source, I mean we can open-source the science too. And we tried to battle the idea of sharing STL files. So OpenSQL is kind of good at certain things because of this. OpenSQL is good today for creating functional objects. But also since objects are code and tends to be structured like software, a lot of good stuff falls out of that. Things like abstractions, libraries, sharing, reuse, et cetera. And OpenSQL is also somehow good at the very complex mathy stuff. And there's a bunch of people out there that do crazy, crazy stuff with OpenSQL that I've never imagined. But they somehow do it because it's very hard in other tools to do kind of more kind of iterative recursive math stuff. But on the flip side, OpenSQL is not so good that a bunch of other things. Like you can't do B-rep-style designs. If you want to add chamfers and fillets to your designs, you're kind of better off using other tools because it's going to be a bit kind of hard to get that to work properly in OpenSQL. And if you want to do kind of organic shapes, you're kind of on your own. But if you've been in this bedroom for a while, you heard about FreeCAD and Category, and those are both really excellent tools that can be great companion tools to OpenSQL if you want to go in that direction. And you don't really have to choose. I mean, a lot of people use OpenSQL in conjunction with classic design tools. And typically you would use OpenSQL to create like quick functional sketches. And then you kind of start using a different kind of B-rep-style tool for creating your final design. And for instance, FreeCAD, they actually have an OpenSQL workbench where you can basically import your OpenSQL designs and then slowly kind of make it into proper B-rep designs. Four minutes left. So with functional objects. So this is not actually OpenSQL code, but it's kind of 90% OpenSQL code. It's kind of an idea of kind of thinking of how we are moving on the language side of things. So I often hear this complaint that OpenSQL kind of claims to be a functional programmer language, but it's not really functional. It doesn't have all the features, blah, blah, blah. And the idea here is that OpenSQL doesn't actually claim to belong to any particular class of languages. But we do take a lot of ideas from different places. And we have been quite pragmatic in terms of what features we include into the language, mostly to figure out how do we enable people to express their feelings. But also, I mean, to be fair to that criticism, OpenSQL can be a little bit quirky at times. It has some kind of paradigms that doesn't really fit into people's minds very well. And the project kind of did escape into the world kind of at a very young age. And it got really popular really fast. And we didn't really want to disrupt that movement kind of while it was already happening. But since then we have been slowly moving kind of nudging things away to try to kind of bring things more kind of traditional in the backend side. And a lot of the power users, they really want to use kind of more powerful software features to create more fancy designs. And so, for instance, we always had pure functions. You can define your own pure functions. It's just that the functions were not really, they were really limited. They didn't have a good compatibility functions and modules to live in different namespaces. You couldn't have functions with values, things like that. And we do actually have now in the nightly build, we have functions as values. So you can create anonymous functions. You can pass functions as parameters. We have closures. So that's kind of really kind of helps a little bit kind of moving things in the direction of a functional language. And that's something we really want to focus on. And as a next step would typically be to have modules, which are basically shape generators as values and maybe even objects as values. But that's really kind of then we starting to kind of push the limits of the geometry engine, meaningfully do. But the key challenge here is that it's really hard to design a language while it's being used. Because backwards compatibility is something people really expect when it comes to design tools. If you have a 10-year-old OpenSCAD design, it will work today. And you'll be able to stay that way and break as little as possible. And also syntactic complexity is something that is very hard for some people. Because a lot of OpenSCAD users are not actually professional programmers. Adding a very complex syntax to express simple things is not something we want to do. We want to keep this kind of zero boilerplate. You type in stuff and you get it as a high-level thing. And if you want to build something more complex, we want to make it as possible. We don't have a lot of time for the last few slides, but we have some ideas what to do next. In addition to the language stuff, we do a lot of work on documentation. We want to do more on that. As I mentioned, we're part of Google's list of docs that helped us getting a really great tutorial. We want to work on geometry engine and performance. We just don't have a lot of resources. And if anyone has any ideas about kind of how to deal with sustainability and funding of such a project, I would be happy to talk about it. We don't have any funding practically right now, and everyone has their jobs. And also how do we move into the new, the new platforms out there? These days, people want to run this on Raspberry Pi, and they want to run it on Android, and they want to run it on Chromebooks, and it's complicated. Ideas there will also be really, really welcome. But the core values that have kept us alive so far is basically stability. We address crash bugs really, really fast. Make it compatible, backwards compatibility, and make it hardware-friendly. Allow people to run this thing on 10-year-old computers. Don't require the latest GPU, and it won't work because our audience really wants, don't really kind of use, are not gamers basically, right? You can help. You don't have the right code to help. There's a lot of ways to help without writing code. Writing code kind of causes us to have to do all these things. So if you have anything you want to do, kind of get in touch. And that's it. Thanks for listening. So before I take questions, we are trying to organize a really small kind of birds of feather session tomorrow. If you're interested, just check kind of Twitter, check IRC, and check the FOSTA website, and it will be available once you get the room tomorrow morning. These days we're going to have quite a bit, and you mentioned some of these. Things I would like, 2D and 3D paths, an extremely long path, lofts, and finish in chamfer, and everything else is fine. Is there any scope for these things on the horizon, or is it wise off? That's the longest. The question was... The question was... Lofts and finish in chamfer. So basically how can we do 2D and 3D parts? How can we do lofts, fillets, and chamfers? As I did mention, since we don't really have it, it's not like an iterative design process. It's very hard to select edges and then apply chamfers to them. QuadQuery has an interesting way of doing it where you actually have selection operators. We don't have that because we are describing things bottom up. We don't really have any good ideas for how to do it. In terms of lofting and extrusions, it's easier. And we are working in that direction. The challenge is that we need to be able to express objects as values, so you can pass objects, or at least object generators, as parameters to functions. The one thing I had on the screen earlier here was an example of how you can create the 2D object generator. You can pass that into a function and then you can sweep along that path. That's something that is semi-possible in user space today, but it's a little bit quirky. We hope to get it kind of on the radar really soon. The question is... Implicit CAD, you can get away... You can get around some of these challenges because it has a normal language around it. Are we planning to embed a regular language into OpenSCAD? Yeah, you can. Actually, a bunch of projects live in that kind of ecosystem around OpenSCAD. Implicit CAD is one of them that does this really well. I think we kind of went on this road and I think we want to stay on this road. But I'm really happy to see other attempts at doing something similar where it's possible to at least share ideas and maybe share community and maybe down the road find ways to sharing code. But I think I would let Implicit CAD kind of experiment with going on that path. And at some point you might actually see the point where actually it's possible to kind of merge some of these projects into a bigger piece so we don't have to invent everything ourselves. Okay. Hi, Julie. Maybe one more question? It's a good way to have a web interface to do the parameterization of stuff. Because I think often one designs things and would be nice for people to have it even easier to use it. So like the website and then auto-generated ST editing according to the parameters would be nice. Is there a smart way to do that? Yeah. Is there a smart way to have a web interface to basically do the parameterization as an end user after you have created the parametric design? And there are two things you can do. One thing is that in OpenSCAD we now have what we call a customizer which is not the web interface but it's an interface where you can hide a text editor and replace it with an auto-generated UI so people can just click drag and drop the different free parameters that you have defined and then get an object out of it. I mean, Thingiverse has a web interface for this. It's just not really well maintained right now. And it's also not open source. So it's kind of your have to use Thingiverse. But if you do upload OpenSCAD design through Thingiverse it will auto-generate a website for doing these things. And I personally don't want to spend a lot of time building websites. But everything is open source. I mean if anyone wants to actually spend a little bit of time on it and host a website then I'm more than happy to kind of collaborate with that. Okay, thank you.