3D STL
두 개의 진입점, 하나의 출력 표준: 수밀 STL, 이를 재생성하는 파라메트릭 스크립트, 그리고 인쇄 성공을 보장하는 슬라이서 테이블.
| 입력 | 경로 | 라이브러리 |
|---|---|---|
| 치수, 설명된 객체, 단어로 된 스케치 | 기하학 경로 | scripts/partlib.py |
| 사진 또는 그림 파일 | 이미지 경로 | scripts/imagelib.py |
기하학 경로 설정:
pip install trimesh shapely manifold3d --break-system-packages -q
이미지 경로는 Pillow와 numpy만 필요합니다 — 메시 라이브러리나 부울 연산이 없습니다.
기하학 경로
1. 모델링 전 치수 확정
여기서 대부분의 재작업은 잘못된 지오메트리보다는 모호성에서 발생합니다. 부품을 짧은 테이블(치수 → 값 → 출처)로 다시 정리하고, 가정한 사항을 표시하세요. 특히 다음을 주의하세요:
- 외부 크기 vs. 장착 중심 거리. "87 mm 폭"과 "나사 간 87 mm"는 다른 부품입니다 — 한 벽 두께만큼 차이가 납니다. 물어보세요.
- 누락된 세 번째 치수. 프로필과 두께는 세 가지 중 두 가지만 제공합니다; 적절한 깊이를 선택하고, 그렇게 명시한 후 플래그로 만드세요.
- 체결재 의도. "5 mm 나사"는 금속 M5 나사용 통과 구멍, 인쇄된 나사형 핀, 또는 열세트 인서트를 의미할 수 있습니다. 세 가지 다른 모델입니다.
- 기존 하드웨어. 부품이 이미 존재하는 것과 결합된다면, 그 구멍 간격과 재료 두께는 선호 사항이 아니라 제약 조건입니다.
기하학을 변경하는 한두 가지 질문만 하고, 나머지는 가정한 후 명시하고 진행하세요.
2. 라이브러리로 모델링
scripts/partlib.py는 프로필 빌더, extrude, threaded_rod, threaded_pin, hex_nut, place, finish를 제공합니다. 메시 수학을 다시 파생하지 말고 가져와서 사용하세요 — 나선형 나사산은 미묘하게 잘못되기 쉽습니다.
scripts/example_handle.py는 완전히 작업된 부품(브리지 핸들 + 일체형 나사형 핀 + 일치하는 너트)입니다. 새 부품의 뼈대로 복사하세요.
모델을 argparse 플래그가 있는 파라메트릭 스크립트로 작성하고, 절대 하드코딩된 숫자를 사용하지 마세요. 사용자는 몇 분 내에 변형을 요청할 것이며, 답변은 새 모델이 아닌 하나의 명령줄이어야 합니다. STL과 함께 스크립트를 전달하세요.
3. 일반 부품 레시피
| 부품 | 제작 방법 |
|---|---|
| 브리지 핸들, ⊓ 브래킷 | bridge_profile + extrude |
| 구멍이 있는 평판 | 내부 링이 있는 shapely 폴리곤 + extrude |
| 핀, 스터드, 볼트 | threaded_pin, 그런 다음 축에 place |
| 너트, 나사형 소켓 | hex_nut, 또는 threaded_rod(clearance=…) 빼기 |
| 스페이서, 부싱 | 두 개의 동심원 + extrude |
| 후크, L-브래킷 | 측면도의 폴리곤 + extrude, 베드에 평평하게 |
| 인클로저 | 외부 상자에서 내부 상자 빼기; 0.15 mm 간격의 립 |
여기에 나열되지 않은 것도 폴리곤, 압출 및 부울 연산입니다.
이미지 경로
scripts/imagelib.py는 사진을 높이 맵으로 변환하고 명시적 정점 그리드 솔리드(상단 표면, 평평한 바닥, 네 개의 측벽)를 만듭니다. 부울 엔진을 사용하지 않기 때문에 크거나 특이한 이미지에서도 실패하지 않습니다.
python3 imagelib.py photo.jpg --mode lithophane --width 100 \
--out stl_output/lithophane.stl
python3 imagelib.py logo.png --mode relief --width 80 --base 2 \
--out stl_output/relief.stl
| 모드 | 매핑 | 일반적인 z |
|---|---|---|
relief | 밝은 픽셀이 올라감 | 0.6 → 4.0 mm, 종종 --base 플레이트 위 |
lithophane | 어두운 픽셀이 두꺼워져 역광에서 빛남 | 0.8 → 3.0 mm, 베이스 없음 |
--res는 긴 가장자리의 샘플을 설정합니다(기본값 200). 샘플당 약 0.4 mm 이상의 해상도는 낭비입니다 — 노즐이 인쇄할 수 없고 파일이 커집니다. 큰 인쇄물에만 높이세요.- 대비는 로드 시 자동으로 늘어납니다; 평평하고 대비가 낮은 사진은 평평하고 실망스러운 인쇄물을 만듭니다. 인쇄하지 말고 그렇게 말하세요.
- 리소파니는 얼굴과 대비가 높은 피사체를 원합니다. 풍경과 복잡한 장면은 진흙탕이 됩니다.
check()는 모든 모서리가 정확히 두 번, 반대 방향으로 나타나는지 확인합니다. 개수만 세면 거꾸로 꿰매진 벽을 통과시키고, 이는 슬라이서가 뒤집는 "유효한" STL을 생성합니다. 실행하고 보고하세요.
마무리 (두 경로 공통)
먼저 확인: finish()(기하학)와 check()(이미지)는 경계 상자, 수밀성 및 삼각형 개수를 보고합니다. 경계 상자를 요청된 치수와 비교하세요 — 부호 오류와 단위 실수를 즉시 잡아냅니다. 수밀하지 않은 메시를 절대 제시하지 마세요.
시각적으로 명확하지 않은 것(나사산, 곡선, 어셈블리)의 경우 빠른 matplotlib 미리보기를 렌더링하고 살펴보세요. 20초면 잘못된 모양의 6시간 인쇄를 막을 수 있습니다.
방향, 나사산 피치 또는 간격을 선택하기 전에 references/design-rules.md를 읽으세요. 레이어 방향 강도, 인쇄 가능한 나사산 프로필, 맞춤 공차, 이미지 파생 부품 및 이름을 붙일 가치가 있는 실패 모드를 다룹니다.
답변에는 다음이 포함되어야 합니다:
- 가정된 값을 포함한 치수 테이블.
- 사용자를 대신해 내린 결정과 그 이유. 요청된 기능이 기계적으로 약한 경우, 요청한 대로 만들고 동시에 구체적인 대안과 함께 약점을 명시하세요 — 절대 조용히 대체하지 마세요.
- 슬라이서 테이블: 레이어 높이, 벽, infill, 서포트(정확히 어디에), 재료, 그리고 어떤 면이 베드에 닿아야 하는지와 그 이유.
- 다른 숫자로 재생성하는 한 줄 명령어.
- 인쇄 전 기존 하드웨어와 확인해야 할 사항.
STL 파일을 claude.ai에서는 /mnt/user-data/outputs/로, Claude Code에서는 현재 작업 디렉토리의 stl_output/ 폴더로 전달하고 생성기 스크립트와 함께 제시하세요. 스크립트는 이 스킬의 scripts/ 폴더에 있습니다. 전체 경로로 호출하거나 부품 스크립트 옆에 복사하세요. Windows에서는 python3 대신 python을 사용하세요.
다중 부품 어셈블리
부품이 결합될 때(핀과 너트, 뚜껑과 상자, 경첩 반쪽):
- 하나의 스크립트에서 공유 매개변수로 두 부품을 모두 생성하세요 — 두 파일에 있는 간격 값은 불일치가 발생합니다
- 암 부품을 수 부품과 동일한 함수에서 파생시키고 간격만큼 오프셋하여 불일치가 발생하지 않도록 하세요
- 각각 몇 개를 인쇄할지 명시하고 작은 부품의 예비 부품을 제안하세요
- 맞춤이 불확실할 때는 공차 테스트를 제공하세요: 두 가지 간격으로 작은 부품을 인쇄하고 잘 맞는 것을 유지하세요