ассоциативные массивы в openscad? - PullRequest
0 голосов
/ 01 апреля 2019

Есть ли в 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 апреля я пропускаю метку мигания и задаюсь вопросом, будет ли работать прокрутка?Пробовал их:)

1 Ответ

2 голосов
/ 04 апреля 2019

Я играл с функцией поиска 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.

...