omdl  v0.6.1
OpenSCAD Mechanical Design Library
mainpage.scad
Go to the documentation of this file.
1 //! Documentation main page.
2 /***************************************************************************//**
3  \file mainpage.scad
4  \author Roy Allen Sutton
5  \date 2015-2017
6 
7  \copyright
8 
9  This file is part of [omdl] (https://github.com/royasutton/omdl),
10  an OpenSCAD mechanical design library.
11 
12  The \em omdl is free software; you can redistribute it and/or modify
13  it under the terms of the [GNU Lesser General Public License]
14  (http://www.gnu.org/licenses/lgpl.html) as published by the Free
15  Software Foundation; either version 2.1 of the License, or (at
16  your option) any later version.
17 
18  The \em omdl is distributed in the hope that it will be useful,
19  but WITHOUT ANY WARRANTY; without even the implied warranty of
20  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21  Lesser General Public License for more details.
22 
23  You should have received a copy of the GNU Lesser General Public
24  License along with the \em omdl; if not, write to the Free Software
25  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26  02110-1301, USA; or see <http://www.gnu.org/licenses/>.
27 
28 *******************************************************************************/
29 
30 /***************************************************************************//**
31  \mainpage omdl
32  \tableofcontents
33 
34  \section introduction Introduction
35 
36  [omdl] is an [OpenSCAD] mechanical design library that provides
37  open-source high-level design primitives with coherent
38  documentation generated by [Doxygen] using [openscad-amu].
39 
40  With Doxygen, the code documentation is written within the code
41  itself, and is thus easy to keep current. Moreover, it provides a
42  standard way to both write and present OpenSCAD design
43  documentation, compilable to common output formats (html, pdf,
44  etc). With [omdl], all library primitives are \em parametric with
45  minimal, mostly zero, global variable dependencies and all library
46  API's include [markups] that describe its parameters, behavior, and
47  use.
48 
49  [Validation] scripts are used to verify that the core operations
50  work as expected across evolving [OpenSCAD] versions (validation
51  performed when building the documentation). The library uses a
52  common set of conventions for specifying [data types] and is
53  divided into individual component modules of functionality,
54  organized into groups, that may be included as desired.
55 
56  \section starting Getting Started
57 
58  \b Example:
59 
60  \dontinclude mainpage_quickstart.scad
61  \skip include
62  \until valign="center" );
63 
64  \amu_make png_files (append=quickstart extension=png)
65  \amu_make eps_files (append=quickstart extension=png2eps)
66  \amu_make stl_files (append=quickstart extension=stl)
67 
68  \htmlonly
69  \amu_image_table
70  (
71  type=html columns=4 image_width="200" table_caption="Example Result"
72  cell_captions="Bottom^Diagonal^Right^Top"
73  cell_files="${png_files}"
74  cell_urls="${stl_files} ${stl_files} ${stl_files} ${stl_files}"
75  )
76  \endhtmlonly
77  \latexonly
78  \amu_image_table
79  (
80  type=latex columns=4 image_width="1.25in" table_caption="Example Result"
81  cell_captions="Bottom^Diagonal^Right^Top"
82  cell_files="${eps_files}"
83  )
84  \endlatexonly
85 
86  \subsection setup Setup
87 
88  To use [omdl], the library files must be copied to an OpenSCAD
89  [library location]. This can be done manually or can be done using
90  using [openscad-amu].
91 
92  The ladder has several advantages and is recommended. When using
93  [openscad-amu], the library documentation is installed together
94  with the library source code. This documentation is also added to a
95  local browsable index, which facilitates reference use. Moreover,
96  with [openscad-amu] installed, one can develop documentation for
97  other [OpenSCAD] design scripts.
98 
99  See the recommended [installation] method for more information.
100 
101  \section contributing Contributing
102 
103  [omdl] uses [git] for development tracking, and is hosted on
104  [GitHub] following the usual practice of [forking] and submitting
105  [pull requests] to the source repository.
106 
107  As it is released under the [GNU Lesser General Public License],
108  any file you change should bear your copyright notice alongside the
109  original authors' copyright notices typically located at the top of
110  each file.
111 
112  Ideas, requests, comments, contributions, and constructive
113  criticism are welcome.
114 
115  \section support Support
116 
117  In case you have any questions or would like to make feature
118  requests, you can contact the maintainer of the project or file an
119  [issue].
120 
121 
122  [GNU Lesser General Public License]: https://www.gnu.org/licenses/lgpl.html
123 
124  [omdl]: https://royasutton.github.io/omdl
125  [omdl repository]: https://github.com/royasutton/omdl
126  [issue]: https://github.com/royasutton/omdl/issues
127 
128  [Validation]: \ref validation
129  [data types]: \ref dt
130  [installation]: \ref install
131 
132  [openscad-amu]: https://royasutton.github.io/openscad-amu
133 
134  [Doxygen]: http://www.stack.nl/~dimitri/doxygen/index.html
135  [markups]: http://www.stack.nl/~dimitri/doxygen/manual/commands.html
136 
137  [OpenSCAD]: http://www.openscad.org
138  [library location]: https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Libraries
139 
140  [git]: http://git-scm.com
141  [GitHub]: http://github.com
142  [forking]: http://help.github.com/forking
143  [pull requests]: https://help.github.com/articles/about-pull-requests
144 *******************************************************************************/
145 
146 //----------------------------------------------------------------------------//
147 // conventions.
148 //----------------------------------------------------------------------------//
149 
150 /***************************************************************************//**
151  \page conventions Conventions
152  \li \subpage dt
153 *******************************************************************************/
154 
155 /***************************************************************************//**
156  \page dt Data types
157  \tableofcontents
158 
159  \section dt_builtin Built-in
160 
161  [omdl] assumes a [value] is either a number, a boolean, a string, a
162  list, a range, or the undefined value. What is called a vector in
163  the [OpenSCAD types] documentation is refereed to as a \em list
164  here in order to distinguish between sequential lists of values and
165  [Euclidean vectors].
166 
167  | type | description |
168  |:---------:|:----------------------------------------------------|
169  | [value] | any valid OpenSCAD storable datum |
170  | number | an arithmetic value |
171  | boolean | a binary logic value (true or false) |
172  | string | a sequential list of of character values |
173  | list | a sequential list of arbitrary values |
174  | range | an arithmetic sequence |
175  | undef | the undefined value |
176 
177  \subsection dt_special Special numerical values
178 
179  | value | description |
180  |:---------:|:----------------------------------------------------|
181  | [nan] | a numerical value which is not a number |
182  | [inf] | a numerical value which is infinite |
183 
184  \section dt_additions Additional conventions
185 
186  When a list has an expected number of elements 'n', the \em count
187  is appended following a '-'. When there is a range of expected
188  elements, the lower and upper bounds are separated by a ':' and
189  appended (order of bounds may be reversed). When the elements
190  values are of an expected type, that \em type is prepended.
191  Combinations are used as needed as in the following table:
192 
193  | name | description |
194  |:-----------:|:--------------------------------------------------|
195  | list-n | a list of of n elements |
196  | list-l:u | a list of l to u elements |
197  | type-list | a list of elements with an expected type |
198  | type-list-n | a list of n elements with an expected type |
199 
200  \subsection dt_distinctions Distinctions
201 
202  [omdl] make the following distinctions on variable types.
203 
204  | name | description |
205  |:-----------:|:--------------------------------------------------|
206  | [scalar] | a single non-iterable value |
207  | [iterable] | a multi-part sequence of values |
208  | [empty] | an iterable value with zero elements |
209  | [even] | an even numerical value |
210  | [odd] | an odd numerical value |
211 
212  \subsection dt_general General
213 
214  From the fixed built-in set of [data types], [omdl] adds the
215  following general type specifications and conventions.
216 
217  | name | description |
218  |:-------------:|:------------------------------------------------|
219  | [bit] | a binary numerical value (0 or 1) |
220  | [integer] | a positive, negative, or zero whole number |
221  | [decimal] | integer numbers with a fractional part |
222  | [index] | a list index sequence |
223  | [datastruct] | a defined data structure |
224  | [data] | an arbitrary data structure |
225 
226  \subsubsection dt_index Index sequence
227 
228  The data type \b index refers to a specified sequence of list
229  element indexes. A list index sequence may be specified in one of
230  the following forms.
231 
232  | value / form | description |
233  |:---------------:|:----------------------------------------------|
234  | \b true | All index positions of the list [0:size-1] |
235  | \b false | No index positions |
236  | "all" | All index positions of the list [0:size-1] |
237  | "none" | No index positions |
238  | "rands" | Random index selection of the list [0:size-1] |
239  | "even" | The even index of the list [0:size-1] |
240  | "odd" | The odd index of the list [0:size-1] |
241  | <integer> | The single position given by an <integer> |
242  | <range> | The range of positions given by a <range> |
243  | <integer-list> | The list of positions give in <integer-list> |
244 
245  The function get_index() can be used to convert a value of this
246  data type into a sequence of list element indexes.
247 
248  \b Example
249 
250  \code{.c}
251  // list
252  l1 = [a,b,c,d,e,f]
253 
254  // index sequence
255  get_index(l1) = [0,1,2,3,4,5]
256  get_index(l1, "rands") = [0,2,5]
257  \endcode
258 
259  \subsection dt_geometric Geometric
260 
261  For [geometric] specifications and [geometric algebra], [omdl] adds
262  the following type specifications and conventions.
263 
264  | name | description |
265  |:-----------:|:--------------------------------------------------|
266  | [point] | a list of numbers to identify a location in space |
267  | [vector] | a direction and magnitude in space |
268  | [line] | a start and end point in space ([line wiki]) |
269  | [normal] | a vector that is perpendicular to a given object |
270  | [pnorm] | a vector that is perpendicular to a plane |
271  | [plane] | a flat 2d infinite surface ([plane wiki]) |
272  | [coords] | a list of points in space |
273  | [matrix] | a rectangular array of values |
274 
275  When a particular dimension is expected, the dimensional
276  expectation is appended to the end of the name after a '-' dash as
277  in the following table.
278 
279  | name | description |
280  |:-----------:|:--------------------------------------------------|
281  | point-Nd | a point in an 'N' dimensional space |
282  | vector-Nd | a vector in an 'N' dimensional space |
283  | line-Nd | a line in an 'N' dimensional space |
284  | coords-Nd | a coordinate list in an 'N' dimensional space |
285  | matrix-MxN | a 'M' by 'N' matrix of values |
286 
287  \subsubsection dt_line Lines and vectors
288 
289  The data type \b line refers to a convention for specifying a line
290  or a vector. A vector is a direction and magnitude in space. A
291  line, too, has direction and magnitude, but also has location, as
292  it starts at one point in space and ends at another. Operators in
293  [omdl] make use of a common convention for specifying Euclidean
294  vectors and straight lines as summarized in the following table:
295 
296  Given two points \c 'p1' and \c 'p2', in space:
297 
298  | no. | form | description |
299  |:---:|:---------:|:----------------------------------------------|
300  | 1 | p2 | a line or vector from the origin to 'p2' |
301  | 2 | [p2] | a line or vector from the origin to 'p2' |
302  | 3 | [p1, p2] | line or vector from 'p1' to 'p2' |
303 
304  The functions get_line_dim(), get_line_tp(), get_line_ip(), and
305  get_line2origin(), are available to identify the dimension of and
306  convert a line into a vector or point.
307 
308  \b Example
309 
310  \code{.c}
311  // points
312  p1 = [a,b,c]
313  p2 = [d,e,f]
314 
315  // lines and vectors
316  v1 = p2 = [d,e,f]
317  v2 = [p2] = [[d,e,f]]
318  v3 = [p1, p2] = [[a,b,c], [d,e,f]]
319 
320  v1 == v2
321  v1 == v2 == v3, iff p1 == origin3d
322  \endcode
323 
324  \subsubsection dt_plane Planes
325 
326  Operators in [omdl] use a common convention for specifying planes.
327  A \b plane is identified by a [point] on its surface together with
328  its [normal] vector specified by [pnorm], which is discussed in the
329  following section. A list with a point and normal together specify
330  the plane as follows:
331 
332  | name | form |
333  |:-------:|:-------------------:|
334  | [plane] | [[point], [pnorm]] |
335 
336  \subsubsection dt_pnorm Planes' normal
337 
338  The data type \b pnorm refers to a convention for specifying a
339  direction vector that is perpendicular to a plane. Given three
340  points \c 'p1', \c 'p2', \c 'p3', and three vectors \c 'v1',
341  \c 'v2', \c 'vn', the planes' [normal] can be specified in any of
342  the following forms:
343 
344  | no. | form | description |
345  |:---:|:-------------:|:----------------------------------------------|
346  | 1 | vn | the predetermined normal vector to the plane |
347  | 2 | [vn] | the predetermined normal vector to the plane |
348  | 3 | [v1, v2] | two distinct but intersecting vectors |
349  | 4 | [p1, p2, p3] | three (or more) non-collinear coplanar points |
350 
351  The function get_pnorm2nv() can be used to convert a value of this
352  data type into a normal vector.
353 
354  \b Example
355 
356  \code{.c}
357  // points
358  p1 = [a,b,c];
359  p2 = [d,e,f];
360  p3 = [g,h,i];
361 
362  // lines and vectors
363  v1 = [p1, p2] = [[a,b,c], [d,e,f]]
364  v2 = [p1, p3] = [[a,b,c], [g,h,i]]
365  vn = cross_ll(v1, v2)
366 
367  // planes' normal
368  n1 = vn = cross_ll(v1, v2)
369  n2 = [vn] = cross_ll(v1, v2)
370  n3 = [v1, v2] = [[[a,b,c],[d,e,f]], [[a,b,c],[g,h,i]]]
371  n4 = [p1, p2, p3] = [[a,b,c], [d,e,f], [g,h,i]]
372 
373  n1 || n2 || n3 || n4
374 
375  // planes
376  pn1 = [p1, n1]
377  pn2 = [p2, n2]
378  pn3 = [p3, n3]
379  pn4 = [n4[0], n4]
380  pn5 = [mean(n4), n4]
381 
382  pn1 == pn4
383  \endcode
384 
385  [omdl]: https://royasutton.github.io/omdl
386  [Data types]: https://en.wikipedia.org/wiki/Data_type
387  [value]: https://en.wikipedia.org/wiki/Value_(computer_science)
388  [Euclidean vectors]: https://en.wikipedia.org/wiki/Euclidean_vector
389 
390  [OpenSCAD types]: https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Values_and_Data_Types
391  [nan]: https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Infinities_and_NaNs
392  [inf]: https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#Infinities_and_NaNs
393 
394  [scalar]: https://en.wikipedia.org/wiki/Variable_(computer_science)
395  [iterable]: https://en.wikipedia.org/wiki/Iterator
396  [empty]: https://en.wikipedia.org/wiki/Empty_set
397  [even]: https://en.wikipedia.org/wiki/Parity_(mathematics)
398  [odd]: https://en.wikipedia.org/wiki/Parity_(mathematics)
399 
400  [bit]: https://en.wikipedia.org/wiki/Bit
401  [integer]: https://en.wikipedia.org/wiki/Integer
402  [decimal]: https://en.wikipedia.org/wiki/Decimal
403  [index]: \ref dt_index
404  [datastruct]: https://en.wikipedia.org/wiki/Data_structure
405  [data]: https://en.wikipedia.org/wiki/Data
406 
407  [geometric]: https://en.wikipedia.org/wiki/Geometry
408  [geometric algebra]: https://en.wikipedia.org/wiki/Geometric_algebra
409 
410  [point]: https://en.wikipedia.org/wiki/Point_(geometry)
411  [vector]: https://en.wikipedia.org/wiki/Euclidean_vector
412  [line wiki]: https://en.wikipedia.org/wiki/Line_(geometry)
413  [line]: \ref dt_line
414  [normal]: https://en.wikipedia.org/wiki/Normal_(geometry)
415  [pnorm]: \ref dt_pnorm
416  [plane wiki]: https://en.wikipedia.org/wiki/Plane_(geometry)
417  [plane]: \ref dt_plane
418  [coords]: https://en.wikipedia.org/wiki/Coordinate_system
419  [matrix]: https://en.wikipedia.org/wiki/Matrix_(mathematics)
420 *******************************************************************************/
421 
422 //----------------------------------------------------------------------------//
423 // validation results.
424 //----------------------------------------------------------------------------//
425 
426 /***************************************************************************//**
427  \page validation Validation
428  \li \subpage tv_datatypes
429  \li \subpage tv_math
430 *******************************************************************************/
431 
432 /***************************************************************************//**
433  \page tv_datatypes Datatypes
434  \li \subpage tv_datatypes_identify
435  \li \subpage tv_datatypes_operate
436 
437  \page tv_datatypes_identify Identification
438  \li \subpage tv_datatypes_identify_scalar
439  \li \subpage tv_datatypes_identify_iterable
440  \li \subpage tv_datatypes_identify_list
441 
442  \page tv_datatypes_operate Operations
443  \li \subpage tv_datatypes_operate_scalar
444  \li \subpage tv_datatypes_operate_iterable
445  \li \subpage tv_datatypes_operate_list
446 *******************************************************************************/
447 
448 /***************************************************************************//**
449  \page tv_math Math
450  \li \subpage tv_math_vector_algebra
451  \li \subpage tv_math_bitwise
452 *******************************************************************************/
453 
454 //----------------------------------------------------------------------------//
455 // group categories.
456 //----------------------------------------------------------------------------//
457 
458 /***************************************************************************//**
459  \defgroup constants Constants
460  \brief Design constant definitions.
461 *******************************************************************************/
462 
463 /***************************************************************************//**
464  \defgroup database Database
465  \brief Design specification data.
466  @{
467 
468  \defgroup database_component Component
469  \brief Component specifications.
470 
471  \defgroup database_electrical Electrical
472  \brief Electrical specifications.
473 
474  \defgroup database_geometry Geometry
475  \brief Predefined geometry.
476 
477  \defgroup database_material Material
478  \brief Material specifications.
479 
480  @}
481 *******************************************************************************/
482 
483 /***************************************************************************//**
484  \defgroup datatypes Datatypes
485  \brief Data type definitions and operators.
486  @{
487 
488  See \ref dt for nomenclature, assumptions, and conventions used to
489  specify values and data types throughout the library.
490 
491  \defgroup datatypes_identify Identification
492  \brief Compile-time data type identification and tests.
493 
494  \defgroup datatypes_operate Operations
495  \brief Data type operation.
496 
497  @}
498 *******************************************************************************/
499 
500 /***************************************************************************//**
501  \defgroup math Math
502  \brief Mathematical functions.
503 *******************************************************************************/
504 
505 /***************************************************************************//**
506  \defgroup parts Parts
507  \brief Parametric parts and assemblies.
508 *******************************************************************************/
509 
510 /***************************************************************************//**
511  \defgroup shapes Shapes
512  \brief 2d and 3d shapes.
513 *******************************************************************************/
514 
515 /***************************************************************************//**
516  \defgroup tools Tools
517  \brief Design tools and techniques.
518 *******************************************************************************/
519 
520 /***************************************************************************//**
521  \defgroup units Units
522  \brief Units and unit conversions.
523 *******************************************************************************/
524 
525 /***************************************************************************//**
526  \defgroup utilities Utilities
527  \brief General utilities.
528 *******************************************************************************/
529 
530 //----------------------------------------------------------------------------//
531 // Installing.
532 //----------------------------------------------------------------------------//
533 
534 /***************************************************************************//**
535  \page install Installing
536  \tableofcontents
537 
538  \section install_prerequisites Prerequisites
539 
540  First install [openscad-amu]. A build script exists for \em Linux
541  and \em Cygwin (pull requests for \em macos are welcome). If \c wget
542  is not available, here is a downloadable link to the [bootstrap]
543  script.
544 
545  If the last step below reports the tool version, then the install
546  likely completed successfully and the temporary directory may be
547  removed as desired. Dependent on your operating system, file
548  system, and/or user credentials, the install may or may not require
549  elevated privileges as indicated by \c sudo:
550 
551  \verbatim
552  $ mkdir tmp && cd tmp
553 
554  $ wget https://raw.githubusercontent.com/royasutton/openscad-amu/master/snapshots/bootstrap.{bash,conf} .
555  $ chmod +x bootstrap.bash
556 
557  $ sudo ./bootstrap.bash --yes --install
558 
559  $ openscad-seam -v -V
560  \endverbatim
561 
562  More information can be found in the GitHib [amu repository], where
563  the source is maintained, and at [amu on Thingiverse].
564 
565  \section install_omdl omdl
566 
567  Now [omdl] can be compiled, verified, and installed. First download
568  the source from the GitHub [omdl repository], select the branch
569  version, and start the install as follows:
570 
571  \verbatim
572  $ git clone https://github.com/royasutton/omdl.git
573  $ cd omdl
574  $ git checkout v0.6.1
575 
576  $ make scopes_exclude="manifest" all
577  $ make install
578  \endverbatim
579 
580  By default, some things are not built, as controlled by the design
581  flow variable \c scopes_exclude. To build everything, use the
582  following:
583 
584  \verbatim
585  $ make list-scopes_exclude
586 
587  $ make scopes_exclude="" all
588  \endverbatim
589 
590  Now the library should have been installed to the OpenSCAD
591  \em built-in library location along with the documentation that can
592  be views with a web browser. Multiple versions can be installed
593  simultaneously.
594 
595  Have a look in:
596  \li \b Linux: $HOME/.local/share/OpenSCAD/libraries
597  \li \b Windows: My Documents\\\\OpenSCAD\\\\libraries
598 
599  You may include the desired library component from your project
600  as follows, replacing the version number as needed:
601 
602  \verbatim
603  include <omdl-v0.6/shapes/shapes2de.scad>;
604  include <omdl-v0.6/shapes/shapes3d.scad>;
605  ...
606  \endverbatim
607 
608  \subsection snapshots Snapshots
609 
610  Library source release [snapshots] are periodically made available
611  in the repository and at [omdl on Thingiverse].
612 
613 
614  [omdl]: https://royasutton.github.io/omdl
615  [omdl repository]: https://github.com/royasutton/omdl
616 
617  [snapshots]: https://github.com/royasutton/omdl/tree/master/snapshots
618 
619  [amu on Thingiverse]: http://www.thingiverse.com/thing:1858181
620  [omdl on Thingiverse]: http://www.thingiverse.com/thing:1934498
621 
622  [openscad-amu]: https://royasutton.github.io/openscad-amu
623  [amu repository]: https://github.com/royasutton/openscad-amu
624  [bootstrap]: https://raw.githubusercontent.com/royasutton/openscad-amu/master/snapshots/bootstrap.bash
625 *******************************************************************************/
626 
627 //----------------------------------------------------------------------------//
628 // openscad-amu auxiliary scripts
629 //----------------------------------------------------------------------------//
630 
631 /*
632 BEGIN_SCOPE logo;
633  BEGIN_OPENSCAD;
634  include <shapes/shapes2de.scad>;
635  include <shapes/shapes3d.scad>;
636 
637  $fn = 36;
638 
639  frame = triangle_lp2ls( [ [30,0], [0,40], [30,40] ] );
640  core = 2 * frame / 3;
641  vrnd = [1, 2, 4];
642 
643  cone( h=20, r=10, vr=2 );
644  rotate([0, 0, 360/20])
645  radial_repeat( n=5, angle=true )
646  etriangle_ls_c( vs=frame, vc=core, vr=vrnd, h=10 );
647  END_OPENSCAD;
648 
649  BEGIN_MFSCRIPT;
650  include --path "${INCLUDE_PATH}" {config_base,config_png}.mfs;
651 
652  views name "views" distance "250" views "top";
653  images name "slogo" aspect "1:1" xsizes "55";
654  variables set_opts_combine "views slogo";
655 
656  include --path "${INCLUDE_PATH}" script_std.mfs;
657  END_MFSCRIPT;
658 END_SCOPE;
659 
660 BEGIN_SCOPE quickstart;
661  BEGIN_OPENSCAD;
662  include <omdl-base.scad>;
663 
664  $fn = 36;
665 
666  frame = triangle_lp2ls( [ [30,0], [0,40], [30,40] ] );
667  core = 2 * frame / 3;
668  vrnd = [1, 2, 4];
669 
670  cone( h=20, r=10, vr=2 );
671  rotate([0, 0, 360/20])
672  radial_repeat( n=5, angle=true )
673  etriangle_ls_c( vs=frame, vc=core, vr=vrnd, h=10 );
674 
675  translate([0, -50,0])
676  linear_extrude(height=10)
677  text( text="omdl", size=20, halign="center", valign="center" );
678  END_OPENSCAD;
679 
680  BEGIN_MFSCRIPT;
681  include --path "${INCLUDE_PATH}" {config_base,config_png}.mfs;
682 
683  views name "views" views "top bottom right diag";
684  variables add_opts_combine "views";
685  variables add_opts "--viewall --autocenter";
686 
687  include --path "${INCLUDE_PATH}" script_new.mfs;
688 
689  include --path "${INCLUDE_PATH}" config_stl.mfs;
690  include --path "${INCLUDE_PATH}" script_app.mfs;
691  END_MFSCRIPT;
692 END_SCOPE;
693 */
694 
695 //----------------------------------------------------------------------------//
696 // end of file
697 //----------------------------------------------------------------------------//