研究用ハードウェアCAD は何をしますか?
物理的な研究用ハードウェアをパラメトリックなPythonソースとして設計し、STEPを信頼できる成果物としてエクスポートし、製作前に数値的および視覚的に結果を検証します。
研究用ハードウェアの難しい部分は、ほとんどの場合、形状そのものではありません。部品が、公開された標準規格やベンダーの図面で寸法が固定された機器と組み合わされなければならないことです。0.5 mm広すぎるホルダーはプレートリーダーに収まりません。アスペクト比が間違ったチャネルは接合中に潰れます。ボルトパターンが25.0 mmではなく25.4 mmのマウントは光学テーブルに届きません。このスキルは、それらの数値を正しく保ち、チェックするために存在します。
使用するタイミング
実験室用の物理部品(チップ、金型、マウント、アダプター、ホルダー、ラック、ブラケット、エンクロージャー、ジグ、治具、アリーナ、迷路)の設計、モデリング、製作の依頼に使用します。また、既存のSTEPファイルの検査や修正にも使用します。
有限要素解析、流体力学、分子構造、科学プロットには使用しないでください。これらは別のスキルです。
セットアップ
uv venv --python 3.12 .venv-labcad
uv pip install --python .venv-labcad/bin/python "build123d==0.11.1" "matplotlib>=3.8"
build123d 0.11.1 には Python >=3.10,<3.15 が必要で、cadquery-ocp-novtk を通じて OpenCascade カーネルを取り込みます。ホイールは大きいです。プロジェクトごとに一度インストールして再利用してください。
バンドルされているすべてのスクリプトは --help を受け付けます。check.py standards は build123d がインストールされていなくても実行できます。
モデルファイルは解析されるのではなく実行されます。 gen.py、check.py、snapshot.py は *_model.py をインポートし、その build() を呼び出します。これは現在の環境で任意のPythonコードを実行します。これはパラメトリックCADに固有のものです——ソースが設計そのものです。このセッションで作成されたモデルファイル、またはユーザーから信頼できる場所から提供されたモデルファイルのみを実行してください。モデルがインターネット、共有ドライブ、信頼できない同僚から入手したものである場合は、実行する前に読み、そのように伝えてください。
必須ワークフロー
以下の手順を順に実行します。ステップ5と6は必須であり、ステップ5が合格してもステップ6は省略できません。
1. デバイスファミリーへのルーティング
リクエストを読み、分類し、正確に1つのファミリーリファレンスを読み込みます。4つすべてを読み込まないでください。それらは長く、ファミリー間で規則を混在させるとエラーの一般的な原因になります。
| 部品が以下の場合 | 読み込むもの |
|---|---|
| チップ、金型、チャネルネットワーク、フローセル、ガスケット、または流体ポートを持つもの | references/microfluidics.md |
| マウント、ポスト、ブレッドボードアダプター、ケージシステム部品、ビームパス内のフィルターまたはサンプルホルダー | references/optomechanics.md |
| プレート、キュベット、チューブ、スライド、またはディッシュ用のアダプター、インサート、ラック、またはホルダー | references/labware-adapters.md |
| 動物実験用のアリーナ、迷路、頭部固定部品、スパウト、テザー、または押し出し材で取り付けられたエンクロージャー | references/behavior-rigs.md |
部品が真に2つのファミリーにまたがる場合(光学テーブルにボルトで固定するマイクロ流体チップ)は、重要なインターフェースを担当するファミリーを読み込み、次に2つ目のファミリーのインターフェースセクションのみを読みます。応答の中で、どのファミリーにルーティングしたかを述べてください。
2. 形状よりも先にインターフェース寸法を確立する
すべての部品には少なくとも1つの嵌合インターフェースがあります。コードを書く前に、各インターフェースについて以下を書き留めてください。
- 寸法のソース: 公開標準規格、ベンダー図面、またはユーザーによる測定値。
- 公称値と公差。
- 意図するクリアランスまたはインターフェアランスとその理由。
assets/standards.json またはファミリーリファレンスで数値を確認してください。インターフェース寸法を記憶から書かないでください。 数値が標準ファイルまたはリファレンスにない場合は、推測するのではなく、ユーザーにベンダー図面または測定値を尋ねてください。推測されたインターフェース寸法は、このスキルにおいて最もコストのかかる障害モードです。
標準化されたコンポーネントを受け入れる必要があるフィーチャーは、そのコンポーネントの最大実体状態——公称値にそのプラス公差を加えたもの——に対してサイズ設定され、その後でのみクリアランスが与えられます。公称値からサイズ設定された場合、適合するコンポーネントの小さい方の半分にしか適合しません。
python scripts/check.py standards --list
python scripts/check.py standards --show slas-microplate-footprint
バンドルされている標準ID(正確な文字列。バリエーションを推測しないでください): slas-microplate-footprint、slas-microplate-height、slas-microplate-flange、slas-well-positions-96、slas-well-positions-384、slas-well-positions-1536、cuvette-standard-10mm、optical-breadboard-metric、optical-breadboard-imperial、cage-system-30mm、sm1-lens-tube-thread。
部品がこのリストのいずれとも嵌合しない場合、それは一般的で問題ありません。インターフェースがないと宣言し、すべてのインターフェース寸法をそのソース(ユーザー仕様、ベンダー図面、測定値)とともにレポートで未チェックとして名前を付けてください。ギャップを埋めるために関連のない標準に対して宣言しないでください——捏造された宣言は、正直な「誰もこれをチェックしていない」よりも悪いです。
3. 形状よりも先にプロセスを選択する
references/fabrication-limits.md を読んでください。プロセスによって、最小壁厚、最小フィーチャーサイズ、達成可能な公差、および部品がオートクレーブや溶剤との接触に耐えられるかどうかが決まります。FDMは±0.05 mmを保持できません。SLA樹脂は、一般的に後硬化と試験なしでは細胞接触には安全ではありません。プロセスと材料をモデルのdocstringに記録してください。
4. パラメトリックモデルを作成する
<part>_model.py を書いてください。ソースが信頼できる成果物です——エクスポートされたSTEPファイルを手動で編集しないでください。また、メッシュから再生成しないでください。
要件:
- ユーザーが変更する可能性のあるすべての寸法は、モジュールレベルの名前付き定数であり、名前に単位を含めてください:
bore_d_mm、wall_t_mm、post_h_mm。0、1、2を除いて、本体に裸の数値を使用しないでください。 build() -> Partを公開してください。gen.pyがそれを呼び出します。- パラメータを
INTERFACEブロック(標準規格で固定された寸法。標準IDを注釈として付ける)とDESIGNブロック(自由に選択できる寸法)にグループ化してください。 - すべての計算された寸法は関数内で導出してください。モジュールレベルでは決して行わないでください。これにより、
--paramの上書きが実際に適用されるようになります。 - 部品が適合しなければならない寸法を、それぞれの標準IDと意図とともに返す
interfaces()関数を宣言してください。これにより、ステップ5でインターフェースを機械的にチェック可能にします。intentは、フィーチャーが適合する任意の部品を受け入れなければならない場合(ポケット、ボア、スロット——最大実体状態にクリアランスを加えたもので片側チェック)は"envelope"、この部品自体が適合しなければならない場合(対称バンド)は"match"です。clearanceは意図する総クリアランス(mm)であり、非負でなければなりません。この部品の嵌合フィーチャーを制約する寸法のみを宣言してください——嵌合機器のプロパティ(テーブルの縁の境界、典型的なプレートの厚さ)はあなたのインターフェースではありません。バンドルされた標準が適用されない場合は、[]を返してください。 - 構築されたソリッドから測定されるGO/NO-GOゲージの
checks()関数を宣言してください: 通過または収まる必要があるすべてのもの(ネジ軸、ビーム経路、ポケットに落ちる最大実体状態の嵌合部品)のclear領域、残らなければならないすべてのもの(リッジ、レッジ、ネジ座)のmaterial領域、およびユーザーが述べたすべてのサイズ制限のbbox_*境界。リクエスト内のすべての幾何学的要件を1つのエントリにマッピングしてください。これらは、is_valid、境界ボックス、および宣言された数値では見つけられないエラーを捕捉します。gen.pyは生成のたびにこれらを実行し、失敗した場合はビルドを失敗させます。スキーマと実例:references/build123d-patterns.md。 - プロセス、材料、およびすべてのインターフェースソースをモジュールのdocstringに記述してください。
"""カスタムステージインサート用SLASマイクロプレートキャリア。
プロセス: FDM, PETG, 0.2 mm レイヤー。公差予算 +/-0.3 mm。
インターフェース:
- プレートポケット: ANSI/SLAS 1-2004 (R2012) フットプリント 127.76 x 85.48 mm, +/-0.25。
- ステージボルト: ユーザー測定、40.0 mm センター (図面は docs/stage.pdf)。
"""
from build123d import *
# --- インターフェース (標準規格で固定。調整しない) ---
plate_l_mm = 127.76 # ANSI/SLAS 1-2004 公称値
plate_w_mm = 85.48 # ANSI/SLAS 1-2004 公称値
plate_tol_mm = 0.25 # ANSI/SLAS 1-2004; ポケットは公称値+これでサイズ設定
# --- デザイン (自由) ---
pocket_clearance_mm = 0.40 # 片側; FDM, fabrication-limits.md 参照
wall_t_mm = 3.0
floor_t_mm = 2.5
body_h_mm = 12.0
def pocket_mm() -> tuple[float, float]:
"""プレートの最大実体状態に片側クリアランスを加えたポケット。
公称値からサイズ設定されたポケットは、適合するプレートの約半分で詰まります。
"""
growth = plate_tol_mm + 2 * pocket_clearance_mm
return plate_l_mm + growth, plate_w_mm + growth
def interfaces() -> list[dict]:
"""この部品が適合しなければならないもの。`check.py interfaces` がすべてのエントリを検証します。"""
pocket_l, pocket_w = pocket_mm()
return [
{"feature": "プレートポケット長さ", "standard": "slas-microplate-footprint",
"dimension": "footprint_length", "value": pocket_l,
"intent": "envelope", "clearance": 2 * pocket_clearance_mm},
{"feature": "プレートポケット幅", "standard": "slas-microplate-footprint",
"dimension": "footprint_width", "value": pocket_w,
"intent": "envelope", "clearance": 2 * pocket_clearance_mm},
]
def checks() -> list[dict]:
"""構築されたソリッドから測定されるゲージ。要件の数値(プレートMMC、ユーザーの高さ制限)からサイズ設定され、
ポケットパラメータからではないため、間違ったパラメータがゲージを間違った形状に合わせて縮小することはありません。"""
depth = body_h_mm - floor_t_mm
return [
{"feature": "MMCのプレートがポケットに落ちる",
"clear": {"box": (plate_l_mm + plate_tol_mm, plate_w_mm + plate_tol_mm, depth),
"at": [(0.0, 0.0, floor_t_mm + depth / 2)]}},
{"feature": "ステージ用に15 mm未満", "bbox_z": {"max": 15.0}},
]
def build() -> Part:
pocket_l, pocket_w = pocket_mm()
with BuildPart() as carrier:
Box(pocket_l + 2 * wall_t_mm, pocket_w + 2 * wall_t_mm, body_h_mm,
align=(Align.CENTER, Align.CENTER, Align.MIN))
with Locations((0, 0, floor_t_mm)):
Box(pocket_l, pocket_w, body_h_mm, mode=Mode.SUBTRACT,
align=(Align.CENTER, Align.CENTER, Align.MIN))
return carrier.part
ビルダー vs 代数の選択、interfaces() 契約、スケッチ、セレクター、フィレット、ねじ切りインサートボアについては references/build123d-patterns.md を参照してください。
5. チェックを生成して実行する
python scripts/gen.py carrier_model.py --outdir out/
python scripts/check.py facts out/carrier.step
python scripts/check.py interfaces out/carrier.manifest.json
python scripts/check.py geometry out/carrier.step --model carrier_model.py
gen.py は、構築したばかりのソリッドに対してモデルの checks() ゲージも評価し、各 PASS/FAIL を出力し、マニフェストに記録し、失敗した場合は非ゼロで終了します。これにより、自身の宣言された幾何学に違反する部品が黙って成果物になることがありません。check.py geometry は、エクスポートされたSTEP(信頼できる成果物)に対して同じゲージを再実行します。
out/ は便宜上の規則であり、要件ではありません。ユーザーが特定の場所に納品物を要求した場合は、そこに生成するか(--outdir .)、またはSTEP、マニフェスト、DXFをそこにコピーしてから終了してください。out/ の中にのみ存在する納品物は、納品されたことになりません。
gen.py は carrier.step(信頼できる成果物)、carrier.stl(メッシュプレビューと印刷用)、および carrier.manifest.json(ソースハッシュ、解決されたパラメータ、宣言されたインターフェース、ライブラリバージョン、測定された境界ボックス、体積、有効性を記録)を書き出します。マニフェストは来歴記録です——成果物と一緒に保管してください。
check.py facts は is_valid、境界ボックス、体積、表面積、重心、ソリッド数を報告します。is_valid: false を報告する部品は壊れたジオメトリです。先に進む前にソースを修正してください。
check.py interfaces は、モデルが宣言したすべてのエントリを標準データベースに対して評価し、失敗した場合は非ゼロで終了します。何を検証し、何を検証しないかを明確にしてください: 宣言された数値をチェックします——転記された寸法、間違った標準、公称値の代わりにMMCを使用したサイズ設定を捕捉します——しかし、構築されたジオメトリを測定することは決してなく、同じ定数から計算された値は、それに対してチェックされると、設計上ゼロの余裕で合格します。これをジオメトリが正しいという証拠として引用しないでください。facts とスナップショットがジオメトリチェックです。空の宣言リストは合格します。バンドルされたデータベースのいずれとも嵌合しない部品は宣言するものがなく、そのインターフェース寸法は代わりにレポートで未チェックとして名前が付けられます。
内部的なものには、check.py fit ではなく interfaces を使用してください。ポケット、ボア、スロットは部品の外部境界ボックスに現れません。fit はそれを測定します。fit に頼るのは、1つの数値を手動でチェックする場合(--value footprint_length=128.81)か、ガスケットがプレートフットプリントにカットされる場合など、部品自体の輪郭がインターフェースである場合のみです。
アセンブリの場合、部品が干渉しないことを確認してください:
python scripts/check.py clearance out/carrier.step out/lid.step --min 0.3
6. スナップショットを撮り、実際に確認する
python scripts/snapshot.py out/carrier.step --out out/carrier.png
そしてPNGを読んでください。このステップは、すべての生成後およびすべての修正後に必須です。決定論的なチェックが合格しても、それをスキップする理由にはなりません。is_valid と正しい境界ボックスはどちらも、間違った面でカットされたポケット、本体の外側に配置されたボス、またはフィレットがフィーチャーを食い尽くした場合と完全に一致します。これらのエラーは画像では明らかですが、数値では見えません。
レンダリングの限界も理解してください。フレームよりもはるかに小さいフィーチャー——40 mmの部品上の0.3 mmの金型リッジ、プレート上の皿穴段差——は、ビューからまったく判別できない場合があります。画像が解決できないものを見たと報告しないでください。それは見ないことよりも悪いです。そのようなフィーチャーには、スキルに check.py bores などの計測器があります。これはすべての円筒面(直径、軸、位置、スパン、スイープ)を出力するため、再調整できます。