Ассоциативные массивы в 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']
к чему-то как 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]
Я думаю, что это сработает. Но это ужасно. Не совсем "я пишу заявления в bash
"некрасиво, но не за горами.
Есть ли способ лучше?
Я готов поддерживать набор данных вне openscad и иметь генератор для включаемого файла, если я должен, но я бы предпочел, чтобы этого не произошло.
Кроме того, в честь 1 апреля я скучаю по метке моргания и задаюсь вопросом, сработает ли прокрутка? Пробовал их:)
2 ответа
Я поиграл с функцией поиска OpenSCAD (), которая описана здесь в руководстве;
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]
Другой очень похожий подход — использование спискового понимания с оператором условия, как, например, в Python. Делает то же самое, выглядит немного проще.
function selector(item) = [
for (spec = available_specs)
if (spec[0] == item)
spec
];