Ir para conteúdo
3DFinder
Entrar

Você está no 3DFinder

Buscamos em Thingiverse, MakerWorld e Printables ao mesmo tempo para te dar o melhor de cada uma.

Buscar mais como este
Modelo 3D Passing formulas to OpenSCAD modules/functions por arpruss no Thingiverse

Descrição

This page is mainly for reference. Most users will want this simpler solution which parses strings containing OpenSCAD formulas: http://www.thingiverse.com/thing:2295309


One of the features that OpenSCAD is lacking is the ability to pass functions to modules or to functions. This is a quick-and-dirty proof-of-concept solution to the not uncommon problem of wanting to pass a mathematical formula to a module or function: an eval() function that evaluates expressions in a simple LISP-inspired language that supports all of the OpenSCAD mathematical operators. The evaluation is moderately fast: about 10,000 evaluations of the sample formula below per second on my laptop. The downside is that it's pretty inconvenient to write expressions in this language.

Call the function with: `eval(expression, variables)`. Here, `variables` is a table of variable values, where each line of the table has the name of the variable followed by its value, e.g., [["x", 12.3], ["y", 7]].

An `expression` is one the following:

  1. a string naming a variable and expressing the value of that variable
  2. a vector of the form `["'", value]` expressing the given literal value (e.g., `["'", [12,3]]` expresses the vector `[12,3]`)
  3. for convenience, a number expressing itself (e.g., `12.3`)
  4. a vector of the form `[operator argument1 argument2 ...]`

For instance, the OpenSCAD formula `3*(xpow(y,3)-pow(x,3)y)` is expressed with `["", 3, [ "-", ["", "x", ["^", "y", 3]], ["*", ["^", "x", 3], "y"] ]]`.

The operators supported are:

  • The binary operations `+`, `-`, `*`, `/`, `%`, `<`, `<=`, `>`, `>=`, `==`, `!=`, `&&`, `||` and the unary `-` and `!` with the same meanings as in OpenSCAD
  • The binary power operator `^` or `pow` with the same meaning as OpenSCAD's `pow(x,y)`
  • The unary degree-based trigonometric operators `cos`, `sin`, `tan`, `acos`, `asin` and `atan` and the binary `atan2` with the same meaning as in OpenSCAD
  • The radian-based versions `COS`, `SIN`, `TAN`, `ACOS`, `ASIN`, `ATAN` and `ATAN2`
  • The functions `abs`, `ceil`, `cross`, `exp`, `floor`, `ln`, `len`, `log`, `max`, `min`, `norm`, `rands`, `round` and `sign` with the same meanings as in OpenSCAD
  • The ternary operator `?`, where `["?", argument1, argument2, argument3]` works like OpenSCAD's `argument1 ? argument2 : argument3`
  • The binary operator `#` that retrieves an element from a vector: `["#", argument1, argument2]` works like OpenSCAD's `argument1[argument2]`
  • The variadic operator `[` that forms a vector from its arguments. E.g., `["[", 3, 4, "x"]` yields the vector `[3,4,x]`
  • The unary or variadic operators `max` and `min`; when given a single argument, that argument is assumed to be a vector to calculate the maximum or minimum of; when given multiple arguments, we get the maximum or minimum of all the arguments
  • The variadic operator `concat` which concatenates all of its arguments
  • The binary or ternary operator `range` which corresponds to OpenSCAD `[argument1:argument2]` or `[argument1:argument2:argument3]`
  • The ternary operator `gen` which provides a generator expression. Do `["gen", variable, range, subexpression]` to generate a vector obtained by iterating `subexpression` over `range` while varying the value of the variable indicated (`variable` is an expression that should evaluate to a string). (UNTESTED)
  • The ternary operator `let`: `["let", variableName, value, expression]` which evaluates `expression` under the added assumption that `variableName` is a string naming a variable whose value is `value`; e.g., `["let", ["'", "x", 3], ["+", "x", 1]]` assigns 3 to the variable named `"x"`, and then calculates `x+1`

Currently, unknown operators return the operator itself, but this behavior cannot be counted on.

The OpenSCAD file contains a demo which draws Borromean rings or a (primitive) 3D function plot.

Update:

  1. The variable system has been overhauled. The `let` operator has been explained.
  2. The variable system has been overhauled again: the dollar sign operator has been removed.
Thingiverse

Passing formulas to OpenSCAD modules/functions

20
Curtidas
0
Downloads
26
Coleções
Tags
knot math openscad
Licença Creative Commons - Attribution
Arquivos (1)
eval.stl 2.8 MB
Ver no Thingiverse (abre em nova aba)

Gostou deste modelo? Crie uma conta grátis para salvar seus favoritos e voltar a eles depois.

Criar conta