무엇인가
SolidCraft는 순수 Rust로 만든 오픈소스 파라메트릭 3D CAD 애플리케이션이다. 스케치에 제약을 걸어 단단한 실체를 만들고, 외절·회전·스위프·필렛·셜·홀·패턴 같은 피처를 편집 가능한 타임라인 위에 쌓는다. 치수를 바꾸면 모델이 다시 구성된다. 데스크톱 앱(egui + wgpu), 브라우저, 헤드리스 CLI, 그리고 AI 에이전트가 CAD를 조작하는 MCP 서버 네 가지 경로로 쓰인다.
저장소는 2026년 10월 7일 생성됐고, 확인 시점(2026-10-18 02:10 KST)에 스타 3883개, 포크 439개였다. 라이선스는 MIT OR Apache-2.0(선택 가능)이고, 549개 외부 크레이트를 의존한다. 읽은 README는 v0.15.0 기준이며, 스스로를 "단순한 부품에는 쓸 만한 초기 단계"라고 표현한다. 공개 참조 부품 76개 중 75개가 해석학·FreeCAD 계산 부피·면적·중심·바운딩박스와 일치하고, 나머지 하나는 추적 중인 버그라는 주장을 한다.
직접 해 본 것
저장소(로컬 클론, v0.15.0, 145MB)를 내려받아 설치 없이 살펴봤다. 이 환경에는 Rust 툴체인(cargo, rustc)이 없고 설치를 안 했기 때문에, SolidCraft 바이너리를 빌드·실행하는 것은 못 했다. 데스크톱 GUI, 브라우저, MCP 서버, 스냅샷 내보내기 역시 전부 못 돌려 봤다.
대신 Rust 소스의 핵심 수식을 1:1 파이썬으로 옮겨, 시스템에 이미 있는 python3으로 실행했다. 실험은 세 가지다.
실험 1 — OBJ 파서 + 메시 측정. crates/io/src/obj.rs의 입력 읽기(잘못된 face 라인, NaN 정점, 범위 초과 인덱스, 음수 인덱스, o/g)와 crates/geom/src/mesh.rs의 발산 정리 기반 측정(부피·면적·중심)을 재구현하고 돌렸다.
$ python3 trial_obj_check.py [1] OBJ 파서: SolidCraft가 자체 테스트로 쓰는 입력 'f 1 2 3' -> error: invalid face line 'v nan 0 0\nv 1 0 0\nv 0 1 0\nf 1 2 3' -> ok, 1 mesh(es) 'v 0 0 0\nv 1 0 0\nv 0 1 0\nf -1 -2 -9' -> ok, 1 mesh(es) [2] 단위 큐브 (8 정점, 12 삼각형) tris = 12 (기대 12), pos = 8 (기대 8), warnings = [] measure: volume=1.000000 (기대 1), area=6.000000 (기대 6) => PASS
잘못된 face 라인은 에러로 처리되고, NaN 정점·범위 초과 인덱스 같은 적대적 입력은 패닉 없이 무시되거나 메시 1개로 수렴했다. 단위 큐브는 부피 1·면적 6을 정확히 재현했다.
실험 2 — 설계 컨테이너 메시 코덱. crates/io/src/design.rs의 인코딩/디코딩/검증(magic, 카운트, 유한성)을 재구현하고, -0.0 부호 비트 보존 round-trip과 u64::MAX 카운트, NaN, magic 변형 같은 적대적 변형을 넣었다.
$ python3 trial_mesh_blob.py [1] round trip: 인코딩 108 bytes -> 디코딩 ok, -0.0 부호 비트 보존: True => PASS [2] 적대적 입력 count = u64::MAX (8) -> 거부 (invalid mesh blob lengths) count = u64::MAX (16) -> 거부 (invalid mesh blob lengths) position = NaN -> 거부 (invalid mesh coordinates) last index = u32::MAX -> 거부 (invalid mesh coordinates) 바이트 0..108 전수 truncation -> 전부 거부 magic 변형 (01 -> 21) -> 거부 (unsupported mesh blob version) == 결과: 전부 PASS ==
정밀도 보존을 주장하는 근거가 되는 -0.0 round-trip이 그대로 재현됐고, 모든 적대적 입력을 거부했다.
실험 3 — FreeCAD 기준과 비교. CLI 측정에 쓰는 STL 판독·질량 특성·Hausdorff 거리 코드를 재구현하고, 저장소 안에 있는 FreeCAD가 만든 기준 STL 네 건을 읽어 기대값과 비교했다.
$ python3 trial_compare_check.py 58-phone-stand 34-chamfer-then-fillet 65-sketch-gear-tooth 23-bracket-multifeature 허용오차: 부피 3%·1mm, Hausdorff 1%·0.1mm 58-phone-stand tris=276 volume=74560.6 mm3 (기대 74559.2, 편차 0.00%) => PASS 34-chamfer-then-fillet tris=340 volume=22892.0 mm3 (기대 22892.4, 편차 0.00%) => PASS 65-sketch-gear-tooth tris=252 volume=3987.7 mm3 (기대 3988.1, 편차 0.01%) => PASS 23-bracket-multifeature tris=1768 volume=59333.6 mm3 (기대 59331.1, 편차 0.00%) => PASS == 결과: 전부 PASS ==
FreeCAD가 만든 기준 메시를 SolidCraft 측정에 쓰는 수식이 부피 편차 0.00~0.01%로 재현했다.
솔직히 구분해 두면: 위 실험은 "SolidCraft의 수식이 기준과 일치하는가"를 재현한 것이지, SolidCraft 바이너리가 실제로 그 수식으로 메싱·내보내기하는지 확인한 게 아니다. 본체 정합성은 실행하지 못했다.
이 맥에서 쓸 수 있나
이 글을 쓴 환경은 Mac Studio(M5 Max, 48GB)로, 로컬 AI 모델 서버가 메모리 약 34GB를 상시 사용한다. 남은 메모리 여력이 충분해 SolidCraft 데스크톱 앱(egui + wgpu)을 실행하는 것은 가능해 보인다. 다만 실제로는 이 머리에 Rust 툴체인이 없어 빌드·실행을 못 했고, 브라우저 버전도 네트워크가 필요해 이 기록 범위 밖이다. 이번 실험으로 확인된 것은 코드 코어의 수학적 정확성이지, 이 맥에서의 실제 사용성은 아니다.
이런 분께
- 오픈소스 CAD·기하 툴 코드가 얼마나 정직하게 쓰였는지 코드로 직접 보려는 개발자
- "참조 케이스 82개 전부 통과" 같은 주장이 실제로 어떤 수식으로 성립하는지 재현으로 확인하고 싶은 사람
- AI 에이전트가 CAD를 조작하는 MCP 패턴에 관심 있는 사람(단, 이번 기록은 MCP를 실행하지 못했으니 명세 읽기 수준이다)
- Rust로 짠 기하·IO 코어의 방어적 검증 방식을 보고 싶은 학생
주의할 점
- 본체 미검증. Rust 툴체인이 없어 바이너리를 빌드·실행하지 못했다. "참조 케이스 82개 전부 통과, 1000건 이상 fuzz"는 저장소 문서의 주장이고, 내 실험은 수식 재현에 한정된다.
- 0.15.0은 개발판. README가 "Active development"라고 쓰고 있어, API·CLI 플래그·내보내기 형식이 버전마다 바뀔 수 있다. 프로덕션에 넣는다면 버전 고정과 업데이트 관리가 필요하다.
- 내보내기 형식·시트메탈 DXF 범위. STL·OBJ·GLB·3MF·STEP·DXF를 지원한다고 하지만, 내가 실제로 필요한 형식이 전부인지, 시트메탈 DXF가 판금 제작용(굽힘선·킥아웃)인지 확인하지 못했다.
- MCP는 실행 못 해봄. 세션·도구 명세는 읽었지만, 서버가 실제로 잘 응답하는지 확인하지 못했다.
- 다운로드에 서명 없음. README가 명시하듯 아직 다운로드에 서명이 없어, Windows SmartScreen/macOS 첫 실행에서 추가 확인이 필요하다.
- 라이선스는 여유롭지만 방향은 다르다. MIT OR Apache-2.0으로 상업 사용·개조·재배포가 허용된다. 단, 자기 코드를 SolidCraft 안으로 넣는 방향은 원본 유지 조건이 어떻게 적용되는지 별도로 확인이 필요하다(이 글은 법률 자문이 아니다).
출처
- SolidCraft GitHub: https://github.com/tangency-labs/solidcraft (2026-10-18 02:10 KST 확인)
- 저장소 로컬 클론 v0.15.0(145MB)에서 코드를 읽고, 시스템 python3으로 수식을 재구현·실행해 본 기록
커밋 한 모금