I'm new to OpenSCAD, but I can only get default parameters working for simple values.

I'm wondering if there is any way to achieve the following, where I have some parameters available to the module caller but by default they are derived from other parameters.

I had expected this to work - I thought the compiler to be able to resolve these variables in-scope during compilation since everything here is deterministic - so perhaps I'm just missing some syntax? If not, is there some better way to achieve this?

module clasp(length=20, 
             mouth = pin_radius * 0.9,
             inner_radius = pin_radius + 0.25,
             outer_radius = inner_radius * 1.4,
             ) {
  ... do the work ...

Unfortunately this approach leaves mount/inner/outer all undef.


This seems to be a limitation of the language. One workaround that's only moderately ugly is, in the body of the module:

mouth = is_undef(mouth) ? pin_radius * 0.9 : mouth;

etc. If you'll only be using the file via a use directive in other files, another approach is file-scope variables. These can be overridden when the module is called, just like module parameters, and they do not provide or take values for/from the calling file's file-scope variable namespace.

  • $\begingroup$ Learned "is_undef" from your answer. Thank you. $\endgroup$
    – cmm
    Jul 15 '19 at 19:11
  • $\begingroup$ Thanks, the workaround is a nice trick $\endgroup$
    – Hamy
    Jul 20 '19 at 21:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.