Parametric Design Best Practices for Makerbot Customizer
This guide is for those who already have some knowledge about designing objects in OpenSCAD and want to get the most out of the Customizer interface. If you are new to OpenSCAD, we suggest getting started with these excellent tutorials by MakerBlock first.
In this guide, we’ll show you some tricks for making the best user experience and teach you some helpful ways to think about the interface you are designing.
Let’s get started:
First, whenever you design a product or tool, it is important to think about who will be using it, as this informs your decisions about what to include or not. So, who is likely to use a customizable thing? Customizer is designed to make the act of creating a unique object easier, so it will be useful for both veteran 3D designers and novices, though it is probably most useful to those who have little or no knowledge about how to design objects from scratch. Therefore, we should try to make our parametric things understandable and usable by those who have little or no experience with designing in 3D. We should also try to preserve a reasonable depth of control that will appeal to those who can design in 3D.
This guide is broken down into three sections: best practices for designing printable openSCAD objects, best practices for designing Customizer interfaces, and Tips and Tricks to help you get the most out of Customizer.
Best Practices for Designing Printable OpenSCAD:
- It is a good practice to build a fudge factor into your shapes before you boolean them together. This has two benefits: first it ensures that you don’t have 0 thickness planes that look ugly in the preview and second it makes absolutely sure that your object won’t have any non-manifold geometry when it exports to .stl. Usually this is not necessary in order to get proper geometry, but sometimes due to rounding errors on coincident faces, you can end up with internal faces or other non-manifold geometry. Adding even 0.001 mm to your design will ensure that none of these rounding errors occur. Since this value is smaller than the accuracy of 3D printers on the market, you don’t have to worry about it changing the final object.
- Make sure that your object is oriented so the .stl export can be loaded into a slicer. Namely, the bottom surface of the object should be at the Z = 0 position and the object should be roughly centered in the X and Y directions. Also, do your best to rotate the object so its longest dimension is along the X axis, since some printers have build plates that are wider than they are deep.
- It can be hard to tell how big an object is in customizer (since the camera zooms to make the object fill the preview window). Therefore, we suggest that you include some way to tell what size your object is. Our preferred way of doing this is to include a build plate selector that allows you to pick from common build plate sizes or specify a build plate size. Use the % special character to make the build plate visible, but not contribute to the final .stl. We provide a simple library file (build_plate.scad) that you can include in your .scad file that will make this very easy to do. Check out the Customizer Docs for more details.
Best Practices for Designing Customizer Interfaces:
Read the Customizer Developer Docs for detailed information about how to add Customizer controls to your .scad file. Here’s a quick example of the syntax:
this is the comment ------------> //the space between the cap and the bottle in mm this is the variable name, -----> cap_tolerance = 0.2; //[0.2, 0.3, 0.4] default value, and customizer control
- When designing a user interface, remember that the more controls you have the more likely it is that one or more of your controls will be missed by your user. Therefore it is very important to edit your interface down to the fewest number of controls possible. This rule is in direct conflict with the goal of making customizable things have deep interfaces. There will always be a trade-off between depth of control and number of controls. Your job is to strike the right balance!
- Make your individual controls as simple as possible for your user. Each control should affect one aspect of a design, preferably in a linear way. Humans are very good at seeing linear relationships (i.e. move the slider half it’s total distance and watch the object in the preview move half the total length) but not so good at seeing other kinds of relationships. This doesn’t mean that your script can’t do something fancy with the value the user inputs, but it is generally good practice to make the input directly relate to the “perceived” output.
- Only include controls for values that appreciably affect the final output. Remember, fewer controls is better so make sure each of your controls counts!
- Group controls that affect similar aspects of the design. For instance, if you are designing a toy car, make sure the wheel radius and the tire thickness are next to each other in Customizer. Currently, Customizer orders controls alphabetically by the name of the variable they affect. One way to make sure that controls are next to each other is to make the variables start with a number.
- Carefully name your variables so they clearly explain what aspect of the design they will change.
- Include description comments to the line before your variable declaration. Use this to help clarify any potentially confusing variables. This is also a great place to specify the units that the variable uses. This, in conjunction with a clear variable name, will clue your user into what a particular control will do.
- Take the time to test your value ranges to make sure it’s not possible to break the design.
- Especially on sliders, make sure your value ranges are sane. Don’t include values that “might be useful to someone somewhere” rather try to constrain the values to ones that will likely be used by 95 percent of your users. Remember, someone who wants to do something crazy can still download the .scad and edit it themselves. Customizer is geared towards new and inexperienced users so try to make it friendly.
- Pick the right control for the value you are controlling. Dropdown lists are good for any set of 10 or fewer options, or for options that all have distinct names. Sliders are good for any set of more than 10 options, especially when those options can be represented by a numeric value. Text boxes are good for user editable strings or numeric values which can’t be easily constrained without severely reducing the functionality of the script. Avoid text boxes for numeric values whenever possible, use only as a last resort!
- Put your most important controls at the top. The ones at the top are the ones that your users a most likely to play with, so you want to make sure they are the best or most interesting controls.
- To prevent a variable that is set to a simple numerical value from appearing in Customizer, multiply or divide it by 1. Only simple numbers and strings are parsed into controls by customizer so adding a mathematical operator will ensure that the variable isn’t editable through the customizer interface.
Tips and Tricks to get the most out of Customizer:
- Avoid using hull() and minkowski() functions if you can. They are slow to calculate and will make the preview update take much longer. If you can’t avoid them, don’t worry, but if you can, it will improve a user’s experience when customizing your thing.
- Avoid using the render() function. It often makes sense when designing object for the desktop version of openSCAD, but will increase render times for the preview window in Customizer.
- Adding the tag ‘customizer’ to your thing will make an “Open in Customizer” button appear on the thing page, making it much easier for a visiting user to dive right in.
Make sure the default view of your thing makes it easy to tell what it is. You can control what view of your thing is loaded in the preview by default with this comment:
// preview[view:south, tilt:top]
the view parameter defaults to ‘south east’ and can take the following values:
- north east
- south east
- south west
- north west
- top diagonal
- bottom diagonal
- Starting the name of your thing with ‘Customizable’ will make the automatic naming process built into Customizer work really well. We automatically detect ‘Customizable’ and replace it with ‘Customized’ in the default thing name when a user saves out an .stl. For example, a customized version of “Customizable Cthulhu” will automatically be named “Customized Cthulhu”.
- When uploading a customizable thing, remember to include a generated .stl from the script or an image of a printed object. Thingiverse doesn’t currently support producing a render from a .scad file, so without an .stl or image, your Thing page will be full of boring grey gears.
- If there is an openSCAD library that you want access to in Customizer, let us know here.