연구실 하드웨어 CAD은(는) 무엇을 하나요?
물리적 연구 하드웨어를 파라메트릭 Python 소스로 설계하고, STEP을 권위 있는 아티팩트로 내보내며, 제작 전에 수치 및 시각적으로 결과를 검증합니다.
연구실 하드웨어의 어려운 부분은 거의 항상 기하학이 아닙니다. 부품이 게시된 표준이나 공급업체 도면에 따라 치수가 고정된 장비와 맞물려야 한다는 점입니다. 0.5mm 너무 넓은 홀더는 플레이트 리더에 맞지 않고, 잘못된 종횡비의 채널은 본딩 중에 붕괴되며, 25.0mm 대신 25.4mm인 볼트 패턴의 마운트는 광학 테이블에 도달하지 못합니다. 이 스킬은 이러한 숫자를 정확하게 유지하고 확인하기 위해 존재합니다.
사용 시기
칩, 몰드, 마운트, 어댑터, 홀더, 랙, 브래킷, 인클로저, 지그, 고정구, 경기장 또는 미로와 같은 실험실 물리적 부품의 설계, 모델링 또는 제작 요청에 사용합니다. 또한 기존 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. 장비 패밀리로 라우팅
요청을 읽고 분류한 후 정확히 하나의 패밀리 참조를 로드하세요. 네 개를 모두 로드하지 마세요. 길고 패밀리 간 규칙을 혼합하는 것은 일반적인 오류의 원인입니다.
| 부품이 다음과 같은 경우 | 로드할 항목 |
|---|---|
| 칩, 몰드, 채널 네트워크, 유체 셀, 개스킷 또는 유체 포트가 있는 모든 것 | references/microfluidics.md |
| 빔 경로의 마운트, 포스트, 브레드보드 어댑터, 케이지 시스템 부품, 필터 또는 샘플 홀더 | references/optomechanics.md |
| 플레이트, 큐벳, 튜브, 슬라이드 또는 접시용 어댑터, 인서트, 랙 또는 홀더 | references/labware-adapters.md |
| 동물 작업용 경기장, 미로, 머리 고정 부품, 스파우트, 테더 또는 압출 장착 인클로저 | references/behavior-rigs.md |
부품이 진정으로 두 패밀리에 걸쳐 있는 경우(광학 테이블에 볼트로 고정되는 미세유체 칩) 중요한 인터페이스를 소유한 패밀리를 로드한 다음 두 번째 패밀리의 인터페이스 섹션만 읽으세요. 응답에서 어떤 패밀리로 라우팅했는지 명시하세요.
2. 기하학 전에 인터페이스 치수 설정
모든 부품에는 적어도 하나의 결합 인터페이스가 있습니다. 코드를 작성하기 전에 각 인터페이스에 대해 다음을 기록하세요.
- 치수의 출처: 게시된 표준, 공급업체 도면 또는 사용자 측정
- 공칭 값 및 공차
- 의도한 틈새 또는 간섭 및 그 이유
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.05mm를 유지할 수 없습니다. 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_*바운드를 선언하세요. 요청의 모든 기하학적 요구 사항을 하나의 항목에 매핑하세요. 이것은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": "스테이지용 15mm 미만", "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
references/build123d-patterns.md에서 빌더 대 대수 선택, interfaces() 계약, 스케치, 선택기, 필렛 및 나사산 인서트 보어를 참조하세요.
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을 인쇄하며 매니페스트에 기록하고 실패 시 0이 아닌 종료 코드를 반환합니다. 따라서 자체 선언된 기하학을 위반하는 부품이 조용히 아티팩트가 되는 일이 없습니다. 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는 모델이 표준 데이터베이스에 대해 선언한 모든 항목을 평가하고 실패 시 0이 아닌 종료 코드를 반환합니다. 그것이 확인하는 것과 확인하지 않는 것에 대해 명확히 하세요. 선언된 숫자를 확인합니다. 잘못 기재된 치수, 잘못된 표준 및 공칭 대신 MMC 크기 조정을 잡아냅니다. 그러나 빌드된 기하학을 측정하지 않으며, 검사 대상과 동일한 상수에서 계산된 값은 구성상 여유 없이 통과합니다. 기하학이 올바르다는 증거로 인용하지 마세요. facts 및 스냅샷이 기하학 검사입니다. 빈 선언 목록은 통과합니다. 번들된 데이터베이스의 어떤 것과도 결합하지 않는 부품은 선언할 것이 없으며, 해당 인터페이스 치수는 대신 보고서에서 확인되지 않은 것으로 지정됩니다.
내부 항목(포켓, 구멍, 슬롯)에는 check.py fit 대신 interfaces를 사용하세요. fit이 측정하는 부품의 외부 경계 상자에 나타나지 않습니다. fit은 하나의 숫자를 수동으로 확인하거나(--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와 올바른 경계 상자는 모두 잘못된 면에 절단된 포켓, 본체 외부에 배치된 보스 또는 기능을 잡아먹은 필렛과 완전히 일치할 수 있습니다. 이러한 오류는 그림에서 명백하지만 숫자에서는 보이지 않습니다.
렌더링의 한계도 인식하세요. 프레임보다 훨씬 작은 기능(40mm 부품의 0.3mm 몰드 능선, 플레이트의 카운터보어 단계)은 보기에서 전혀 판단할 수 없을 수 있습니다. 이미지가 해결할 수 없는 것을 보았다고 보고하지 마세요. 그건 보지 않는 것보다 더 나쁩니다. 이러한 기능에 대해 이 스킬은 도구를 제공합니다. check.py bores는 모든 원통형 면(직경, 축, 위치, 스팬, 스윕)을 인쇄하여 재구성할 수 있습니다.
계속...