openscad 中的关联数组?
associative arrays in openscad?
openscad 是否有任何用于字符串键控关联数组的语言原语(a.k.a 哈希映射,a.k.a 字典)?或者是否有任何关于如何模拟关联数组的约定?
到目前为止,我能想到的就是使用向量并使用变量将索引映射到向量中,从而得到人类可读的名称。这意味着没有好的、可读的方式来定义向量,你只需要评论它。
假设我想写一些类似于 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']
传递给 metrics
并引用 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]
我认为这行得通。但它是 U.G.L.Y.。不完全 "I write applications in bash
" 丑陋,但相距不远。
有没有更好的方法?
我准备在 openscad 之外维护数据集,并在必要时为包含文件提供一个生成器,但我宁愿不这样做。
此外,为了纪念 4 月 1 日,我想念闪烁标签,想知道滚动选取框是否有效?试过了 :)
我试用了 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 库。
使用 search()
且不产生任何警告的函数示例。
available_specs = [
["mgn7c", 1,2,3,4],
["mgn7h", 2,3,4,5],
];
function selector(item) = available_specs[search([item], available_specs)[0]];
chosen_spec = selector("mgn7c");
echo("Specification was returned from function", chosen_spec);
以上将产生以下输出:
ECHO: "Specification was returned from function", ["mgn7c", 1, 2, 3, 4]
另一种非常相似的方法是将 list comprehensions 与条件语句一起使用,就像在 Python 中一样。做同样的事情,看起来更简单一些。
function selector(item) = [
for (spec = available_specs)
if (spec[0] == item)
spec
];
openscad 是否有任何用于字符串键控关联数组的语言原语(a.k.a 哈希映射,a.k.a 字典)?或者是否有任何关于如何模拟关联数组的约定?
到目前为止,我能想到的就是使用向量并使用变量将索引映射到向量中,从而得到人类可读的名称。这意味着没有好的、可读的方式来定义向量,你只需要评论它。
假设我想写一些类似于 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']
传递给 metrics
并引用 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]
我认为这行得通。但它是 U.G.L.Y.。不完全 "I write applications in bash
" 丑陋,但相距不远。
有没有更好的方法?
我准备在 openscad 之外维护数据集,并在必要时为包含文件提供一个生成器,但我宁愿不这样做。
此外,为了纪念 4 月 1 日,我想念闪烁标签,想知道滚动选取框是否有效?试过了 :)
我试用了 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 库。
使用 search()
且不产生任何警告的函数示例。
available_specs = [
["mgn7c", 1,2,3,4],
["mgn7h", 2,3,4,5],
];
function selector(item) = available_specs[search([item], available_specs)[0]];
chosen_spec = selector("mgn7c");
echo("Specification was returned from function", chosen_spec);
以上将产生以下输出:
ECHO: "Specification was returned from function", ["mgn7c", 1, 2, 3, 4]
另一种非常相似的方法是将 list comprehensions 与条件语句一起使用,就像在 Python 中一样。做同样的事情,看起来更简单一些。
function selector(item) = [
for (spec = available_specs)
if (spec[0] == item)
spec
];