Onshapeにおけるパラメータの使い分け
このたび、パラメトリックな自作キーボード用のモデルをOnshapeで作成した際に、変数の扱いについて多くの知見を得ましたので、ここに書き留めておきます。
Onshapeでは複数のパラメータを設定する方法があり、パラメータを使い回したりAPIを通して設定することができます。
- フィーチャー・変数テーブルで定義
- 変数スタジオで定義
- コンフィギュレーションで定義
それぞれのメリット・デメリットを紹介していきます。
フィーチャー・変数テーブルで定義
フィーチャー・変数テーブルで定義すると、その変数が影響する範囲は定義した後に現れるフィーチャーのみとなるため、同一パートスタジオ内でもスコープをさらに絞ることができます。
変数テーブルから変数を追加すると、現在のロールバックバーの位置に変数フィーチャーが追加されます。そのため、変数テーブルはフィーチャー内に散在しがちな変数をまとめて閲覧・編集するための機能と言えます。
また、他の変数テーブルでは変数スタジオを選択することができ、変数スタジオに現在のパーツと同名の変数があった場合は、フィーチャー・変数テーブルの方が優先されます。
利点
- 変数名の変更がまとめてできる
- 簡単に宣言できる
欠点
- 同名の変数は一切作れない
- 同名の変数が散在しないため、ある意味では利点とも言えます
- APIから変更するのが難しい
- フィーチャーのIDを指定して変更する必要があり、フィーチャーのIDが変わった場合はコードを書き直す必要があります。また、フィーチャーがパーツに大量にある場合、それを特定すること自体が大変です
向いている場所
同じパーツ内で使い回す値や、スケッチ内に閉じ込めたくない値などは、積極的にこちらにまとめても良さそうです。
変数スタジオで定義
イメージとしては、パーツスタジオとは別に、変数のみを定義できるパートと考えてよいでしょう。スコープは、パートスタジオ内で明示的にインポートしたり、グローバルに設定したりできます。なお、変数スタジオで定義された変数は、フィーチャー・変数テーブルで定義された変数によって上書きできます。
利点
- 複数のパートで使うことができる
- APIからまとめて変更ができる
- 変数がオーバーライドされることを前提に作れる
- ボタン一つでグローバル変数にできる
欠点
- 定義から使うまでが少し手がかかる
- 変数スタジオの作成
- 変数スタジオで定義
- 変数スタジオをパートスタジオにインポート
- インポート先で入力
向いている場所
プロジェクト全体で使いまわしたい変数はこっちに持ってきたい。
また一つのパートでしか使わない場合でも、APIから編集したい値はこっちに置いておくと使いやすいです。
コンフィギュレーションで定義
これはデザインやUIを作っている人向けに説明すると、そのパートにバリアントを追加する機能に近いと言えます。コンフィギュレーションで設定した値は、別のパートスタジオから参照する際に設定することができ、またSTLとしてAPIからダウンロードする際にも直接指定することができます。
利点
- 上限値、下限値、デフォルト値を設定できる
- 他のパートに「派生」機能でインポートする際に、異なるパラメーターが与えられたパートを追加できる
- これは変数スタジオや変数テーブルの場合、こちらで変更するとインポートされたものが一括で変更されてしまいます
- STL書き出し時に直接指定することができる
欠点
- STL書き出し時以外はAPIで変更するのが面倒(派生フィーチャーをフィーチャーIDで指定し、書き換える必要がある)
- 変数名の一括変更ができない
- 変更した場合、既存の変数を参照していた箇所はリンク切れのような状態になるので、設定し直す必要がある
- 外部から値を参照することはできない
- APIでバリエーションを作った場合、「どのバリエーションを書き出すか」は指定できるが「特定のバリエーションの時の値を編集」はできない
向いている場所
複数のバリエーションを作り、他のパートで参照したい場合に適しています。
結論
以上のことから、
- 別のパートで複数パターンを使いたい => コンフィギュレーション
- APIでSTL書き出しするときに変数を変えたい => コンフィギュレーション
- 別のパートで複数パターンを使い、そのパターンごとの値もAPIで変えたい => 後述するコンフィギュレーションと変数スタジオの組み合わせ
- プロジェクト全体で使いたい => 変数スタジオ
- 複数パートで使いたい => 変数スタジオ
- 一つのパートでしか使わないが、APIから変更したい => 変数スタジオ
- 適当に使いたい => フィーチャー・変数テーブル
応用編: コンフィギュレーションと変数スタジオの組み合わせ
複数パターンを別パートからインポートしたいが、バリエーションごとの値をAPIで変更したいというような状況では、コンフィギュレーション単体を使用すると、「派生」フィーチャーを直接フィーチャーIDで指定し、非常に長いクエリを書く必要があります。
そこで、コンフィギュレーション内で変数スタジオの値を参照することにより、APIから楽に変更できるバリエーションを作ることができます。
例
今回冒頭で紹介したキーボードのモデルでは「Row」パートスタジオを「FingerPlate」パートスタジオで派生機能を使って読み込んでいます。「Row」パートスタジオにはそれぞれ指ごとにサイズを変えており、「Pinky」「Ring」「Middle」「Index」というバリエーションが存在します。
Rowではそれぞれのバリエーションごとに
- _keypitch
- _v_r4
- _v_r3
- _v_r2
- _v_r1
- _z_r4
- _z_r3
- _z_r2
- _z_r1
という変数が存在し、それぞれがコンフィギュレーション機能によって設定されています。
画像を見るとわかるように、コンフィギュレーション内の定義でそれぞれの変数に別の値が設定されています。これは別途変数スタジオで定義したものが設定されており、バリエーションを変えると、コンフィギュレーションが参照している変数の中身ではなく、どの変数を参照するかという設定自体を変えます。
例えば_keypitch
には「Pinky」バリエーションの時はp_keypitch
が設定されており、「Index」になるとコンフィギュレーションは_keypitch
にi_keypitch
を割り当てます。
またRow用の変数スタジオは以下のようになっており、APIから楽に変更することができます。
Discussion