Configuration selection

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Configuration selection

robodan65
I want to select between multiple different configurations and want to understand how to do that in a functional language.

In an imperative language I would do:
model = 'A';
if (model == 'A') {
  dim_a = 1;
  dim_b = 2;
}  else if (model == 'B') {
  dim_a = 3;
  dim_b = 4;
} else {  // default configuration
  dim_a = 5;
  dim_b = 6;
}

I may have many configurations and variables for each one.  This simple example could be done with ? :, but that gets super messy as things get more complex.

What's the best way to do this in OpenScad?

Dan


_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Reply | Threaded
Open this post in threaded view
|

Re: Configuration selection

MichaelPFrey
Hi Dan,

I see two practical approaches:

Approach 1:
If you don´t mind Development snapshoots, try our customizer.
You can get those snapshoots from http://www.openscad.org/downloads.html
You also have to go into the preferences and enable the customzier.

In the customizer you can handle your configurations as so called presets.

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/WIP#Customizer

Approach 2:
If you want to stay on the release line of openscad:
I would write a "base_model.scad" (or something like that), which is let us say model default:
    dim_a = 5;
    dim_b = 6;
    //lots of code that creates the actual model

For model b, I would create a file called "model_b.scad" and then simply
    include <base_model.scad>;
    dim_a = 1;
    dim_b = 2;

For model b, I would create a file called "model_b.scad" and then simply
    include <base_model.scad>;
    dim_a = 3;
    dim_b = 4;

The trick is, that the last assignment overwrites any previous assignments to a variable.

Every model has then its own file.
Most of the code being in base_model.scad.
The other files only need to overwrite the variables.

Depending on what you really want/need, use might also be an option.
But when you use "use", you need a bit more code for each configuration.

see also https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Include_Statement

With Kind regards,
Michael Frey

_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Reply | Threaded
Open this post in threaded view
|

Re: Configuration selection

robodan65
Thanks!

Approach 2 should work for me.

Dan


On Thu, Sep 13, 2018 at 1:21 PM Michael Frey <[hidden email]> wrote:
Hi Dan,

I see two practical approaches:

Approach 1:
If you don´t mind Development snapshoots, try our customizer.
You can get those snapshoots from http://www.openscad.org/downloads.html
You also have to go into the preferences and enable the customzier.

In the customizer you can handle your configurations as so called presets.

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/WIP#Customizer

Approach 2:
If you want to stay on the release line of openscad:
I would write a "base_model.scad" (or something like that), which is let us say model default:
    dim_a = 5;
    dim_b = 6;
    //lots of code that creates the actual model

For model b, I would create a file called "model_b.scad" and then simply
    include <base_model.scad>;
    dim_a = 1;
    dim_b = 2;

For model b, I would create a file called "model_b.scad" and then simply
    include <base_model.scad>;
    dim_a = 3;
    dim_b = 4;

The trick is, that the last assignment overwrites any previous assignments to a variable.

Every model has then its own file.
Most of the code being in base_model.scad.
The other files only need to overwrite the variables.

Depending on what you really want/need, use might also be an option.
But when you use "use", you need a bit more code for each configuration.

see also https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Include_Statement

With Kind regards,
Michael Frey
_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Reply | Threaded
Open this post in threaded view
|

Re: Configuration selection

TLC123
In reply to this post by robodan65
Assign values to dim_a and dim_b separately.
Use the  Ternary conditional operator - ?:
usage:
/condition expression/ ? /expression if true /: /expression if false/ ;

In this case one ternary operation is nested inside one other.

    model = 'A';
   
      dim_a = (model == 'A') ? 1:(model == 'B')?3:5;
      dim_b = (model == 'A') ? 2:(model == 'B')?4:6;

 // "let" dim_a= "if"(model == 'A')? "then" 1 : "else if"(model == 'B')?
"then" 3: "else" 5



--
Sent from: http://forum.openscad.org/

_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Reply | Threaded
Open this post in threaded view
|

Re: Configuration selection

Ronaldo
In reply to this post by robodan65
​If you have many parameters for each alternative model, it is a good idea to
collect them in a list for each model.

modelA = [ ​1, // dim_a
               2, // dim_b
               [1,2]  // vec_a // some vector parameter
               ...
             ];
modelB = [ ​3, // dim_a
               4, // dim_b
               [2,3]  // vec_a
               ...
             ];
modelC = [ ​5, // dim_a
               6, // dim_b
               [3,4]  // vec_a
               ...
             ];

Then, select the parameter set with just one :? operator

modelset = model=='A' ? modelA : model=='B' ? modelB : modelC;

and retrieve the parameters from modelset:

dim_a = modelset[0];
dim_b = modelset[1];
vec_a = modelset[2];

With a few changes, you will be able to add more parameters without touching
the selection operation.

If the selection key 'model' is an integer instead of a char, you can even
avoid the :? operator at all.

modellist = [modelA, modelB, modelC];
...
modelset = modellist[model];




--
Sent from: http://forum.openscad.org/

_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Reply | Threaded
Open this post in threaded view
|

Re: Configuration selection

runsun
In reply to this post by robodan65
The  associative array
<https://github.com/runsun/OpenSCAD_Tips/blob/master/snippets.md#hash> *
might be an option:

models = [ "A", [  dim_a,1, dim_b, 2 ]
              , "B", [  dim_a,3, dim_b, 4 ]
              , ...
              ];

data = hash( models, "A");  
dim_a = hash( data, "dim_a");
dim_b = hash( data, "dim_b");




-----

$  Runsun Pan, PhD $ libs: scadx , doctest , faces ( git ), offline doc ( git ), runscad.py ( 2 , git ), editor of choice: CudaText  ( OpenSCAD lexer );&nbsp;$ Tips ;&nbsp;$ Snippets

--
Sent from: http://forum.openscad.org/

_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
$ Runsun Pan, PhD
$ libs: scadx, doctest, faces(git), offline doc(git), runscad.py(2,git), editor of choice: CudaText ( OpenSCAD lexer); $ Tips; $ Snippets
Reply | Threaded
Open this post in threaded view
|

Re: Configuration selection

JordanBrown
In reply to this post by Ronaldo
On 9/14/2018 8:44 AM, Ronaldo wrote:
​If you have many parameters for each alternative model, it is a good idea to
collect them in a list for each model.

modelA = [ ​1, // dim_a
               2, // dim_b
               [1,2]  // vec_a // some vector parameter
               ...
             ];
modelB = [ ​3, // dim_a
               4, // dim_b
               [2,3]  // vec_a
               ...
             ];
modelC = [ ​5, // dim_a
               6, // dim_b
               [3,4]  // vec_a
               ...
             ];

Then, select the parameter set with just one :? operator

modelset = model=='A' ? modelA : model=='B' ? modelB : modelC;

That was what I was thinking, with a couple of additional notes...

I would try to align the definitions of model[ABC] into a table-like form:
//         a  b  c
modelA = [ ​1, 2, [1,2], ... ];
modelB = [ ​3, 4, [2,3], ... ];
modelC = [ ​5, 6, [3,4], ... ];

and if the number of variants is non-trivial, then do something similar with the ?: sequence:

modelset =
    model == 'A' ? modelA :
    model == 'B' ? modelB :
    modelC

... though better would be to have the final "else" generate an error, so that a typo doesn't silently give you the default.  I don't happen to remember any good ways to do that, and don't have the time right now to look.



  


_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org