openscad / MCAD

OpenSCAD Parametric CAD Library (LGPL 2.1)
http://reprap.org/wiki/MCAD
578 stars 192 forks source link

Add functions to express dimensioned quantities. #22

Closed ahmedtd closed 10 years ago

ahmedtd commented 10 years ago

Previously, MCAD libraries that dealt with absolutely-sized artifacts (for example, nuts_and_bolts.scad) either implicitly worked in millimeters or used a set of multiplicative constants defined in units.scad (and one constant in constants.scad).

This change introduces a set of scaled functions in units.scad that help creating objects that are specified in mixed dimensions:

    mm(q): millimeters
    cm(q): centimeters
    dm(q):  decimeters
     m(q):      meters
  inch(q):      inches
   mil(q):        mils (0.001 inch)

These functions convert from the indicated quantity to OpenSCAD's internal units. By default, they are set up so that

1 /*OpenSCAD unit*/ == mm(1),

but, this can be switched by setting the variable MCAD_BASE_UNIT before including units.scad. MCAD_BASE_UNIT is a multiplicative scale factor that determines the correspondence between MCAD millimeters and OpenSCAD units. For example:

// a.scad
include <MCAD/units.scad>
echo(cm(1)); // Outputs 10

// b.scad
include <MCAD/units.scad>
MCAD_BASE_UNIT = MCAD_BASE_UNIT_CM;
echo(cm(1)); // Outputs 1

Every place in MCAD that was previously using the scale constants from units.scad and constants.scad has been converted to use the new scale functions, including the definition of MCAD_EPSILON (now 0.01 mm).

The scale constants have been kept for backwards-compatibility, but are now defined in terms of the scale functions.

A small suite of tests has been added in the test/ subdirectory of the project root. The test suite can be invoked using make test from the top project directory.

If you want to omit the tests or translate them into the python testing framework, that's fine.