首页 > 解决方案 > openscad中的关联数组?

问题描述

openscad 是否有任何用于字符串键关联数组(又名哈希映射,又名字典)的语言原语?或者是否有任何关于如何模拟关联数组的约定?

到目前为止,我能想到的只是使用向量并使用变量将向量中的索引映射到人类可读的名称。这意味着没有很好的、可读的方式来定义向量,你只需要评论它。

想象一下,我想写一些类似于 Python 数据结构的东西:

bobbin_metrics = {
   'majacraft': {
      'shaft_inner_diameter': 9.0,
      'shaft_outer_diameter': 19.5,
      'close_wheel_diameter': 60.1,
      # ...
   },
   'majacraft_jumbo': {
      'shaft_inner_diameter': 9.0,
      'shaft_outer_diameter': 25.0,
      'close_wheel_diameter': 100.0,
   },
   # ...
}

这样我就可以在模型定义中以某种可识别的类似哈希映射的方式引用它,比如传递bobbin_metrics['majacraft']给某个东西 asmetrics和引用metrics['close_wheel_diameter'].

到目前为止,我的最大努力看起来像

# Vector indexes into bobbin-metrics arrays
BM_SHAFT_INNER_DIAMETER = 0
BM_SHAFT_OUTER_DIAMETER = 1
BM_CLOSE_WHEEL_DIAMETER = 2

bobbin_metrics_majacraft = [
    9.0,      # shaft inner diameter
    19.5,     # shaft outer diameter
    60.1,     # close-side wheel diameter
    # ....
];

bobbin_metrics_majacraft_jumbo = [
    9.0,      # shaft inner diameter
    25.0,     # shaft outer diameter
    100.0,     # close-side wheel diameter
    # ....
];

bobbin_metrics = [
    bobbin_metrics_majacraft,
    bobbin_metrics_majacraft_jumbo,
    # ...
];

# Usage when passed a bobbin metrics vector like
# bobbin_metrics_majacraft as 'metrics' to a function

    metrics[BM_SHAFT_INNER_DIAMETER]

我认为这会奏效。但它很丑。不完全是“我用bash”丑陋的方式编写应用程序,但也不远了。

有没有更好的办法?

我准备在openscad之外维护数据集,如果需要的话,我准备了一个包含文件的生成器,但我宁愿不这样做。


另外,为了纪念 4 月 1 日,我想念闪烁标签,想知道滚动选框是否可以工作?试过了 :)

标签: dictionaryopenscad3d-printing

解决方案


我使用了此处手册中记录的 OpenSCAD search() 函数;

https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Other_Language_Features#Search

以下模式允许一种形式的关联列表,它可能不是最佳的,但确实提供了一种设置字典结构并根据字符串键检索值的方法;

// associative searching
// dp 2019
// - define the dictionary
dict = [
      ["shaft_inner_diameter", 9.0],
      ["shaft_outer_diameter", 19.5],
      ["close_wheel_diameter", 60.1]
      ];

// specify the serach term
term = "close_wheel_diameter";

// execute the search
find = search(term, dict);

// process results
echo("1", find);
echo ("2",dict[find[0]]);
echo ("3",dict[find[0]][1]);

以上产生;

Compiling design (CSG Tree generation)...
  WARNING: search term not found: "l"
...
  WARNING: search term not found: "r"
ECHO: "1", [2, 0]
ECHO: "2", ["close_wheel_diameter", 60.1]
ECHO: "3", 60.1    

就个人而言,我会在 Python 中做这种事情,然后生成 OpenSCAD 作为中间文件,或者使用 SolidPython 库。


推荐阅读