텍스트 투 퓨전 360 순수 파라메트릭 CAD 스킬
사용자가 3D 참조 파일(.3mf/.stl $\rightarrow$ 3mf-to-fusion 사용) 또는 시각적 미디어(.png/.mp4 $\rightarrow$ media-to-fusion 사용)를 제공하지 않고 자연어로 기계적 물체, 부품, 수정, 액세서리 트레이, 패스너 사양, 분해 어셈블리 또는 운동학적 애니메이션을 설명할 때 다음 6단계 결정론적 CAD 워크플로우를 따릅니다.
엄격한 CAD 명령:
- Fusion 360 타임라인에서 네이티브 스케치, 구성 평면, 사용자 매개변수 및 돌출/회전/조인트 피처를 사용하여 모든 기하학을 재구성합니다. 원시 메시 바디(
root.meshBodies.add) 또는 패싯 메시 변환을 절대 생성하지 마십시오. - 모든 코드는
execute_api_script내부에서 센티미터(cm = mm / 10.0)를 사용하여 깔끔하게 실행되어야 합니다. get_screenshot을 사용하여 생성되거나 수정된 모든 바디를 항상 시각적으로 확인합니다.
0단계: 사전 점검 및 작업 공간 정렬
-
라이브 Fusion 360 MCP 세션 확인:
fusion-mcp도구execute_api_script를 통해 카나리아 프로브를 실행합니다:def run(context): import adsk.core, adsk.fusion app = adsk.core.Application.get() if not app or not adsk.fusion.Design.cast(app.activeProduct): raise RuntimeError("활성 Fusion 360 디자인 문서가 열려 있지 않습니다.") print("FUSION_MCP_READY")조기 실패 규칙: 프로브가 실패하면 중단하고 사용자에게 Autodesk Fusion 360을 열도록 안내합니다.
-
작업 공간 및 모노레포 라우팅:
- 기본 저장소: 활성 CAD 모노레포 또는 프로젝트 루트(
CAD_MONOREPO_ROOT또는 현재 작업 공간). - 엄격한 격리 보장: 리포지토리 루트에 임시 파일, 스크립트 또는 렌더를 생성하거나
shared/를 변경하지 마십시오. - 완전히 새로운 모델을 시작하는 경우 전용 폴더를 스캐폴드합니다:
python3 <skills_경로>/text-to-fusion/scripts/scaffold_text_model.py "<모델_이름>" - 모델 스크립트는
models/<NN>_<모델_이름>/scripts/에, 시각적 렌더는models/<NN>_<모델_이름>/renders/에, 중간 작업 공간 파일은models/<NN>_<모델_이름>/workspace/에 저장합니다. ../../shared/(fusion_client,cad_primitives,hardware_library,scene_animator)에서 범용 CAD 헬퍼를 임포트합니다.
- 기본 저장소: 활성 CAD 모노레포 또는 프로젝트 루트(
-
도메인 참조: 사용자 정의 기하학을 작성하기 전에 로컬 참조 라이브러리를 참조합니다:
references/prompt-to-geometry-patterns.md— 자연어를 파라메트릭 스케치 구속조건으로 변환합니다.references/exploded-view-guidelines.md— 분해 벡터, 황금 가이드 로드 및 직교 프레이밍.references/assembly-animation-pipeline.md— Matrix3D 발생 변환 애니메이션 및 GIF 컴파일.references/variant-management-and-undo.md— 안전한 A/B 변형 쇼룸 및 비파괴적 숨기기.
1단계: 모호성 해소 및 파라메트릭 사양
사용자가 대화식으로 기하학을 설명할 때 누락된 엔지니어링 구속조건을 식별하고 공식화합니다:
- 인벨로프 및 중요 치수:
- 전체 경계 상자 ($W \times D \times H$, mm).
- 최소 벽 두께(구조 부품의 경우 기본
2.0 - 2.5 mm, 내부 분할기의 경우1.6 mm). - 3D 프린터 베드 한계(예:
220 × 220 × 250 mm).
- 마스터 사용자 매개변수 등록(
design.userParameters): 항상 중요 치수를 사용자 매개변수로 노출하여 사용자가 한 번의 클릭으로 크기를 조정할 수 있도록 합니다:def set_user_param(design, name, expr_str, units="mm", comment=""): existing = design.userParameters.itemByName(name) if existing: existing.expression = expr_str return existing return design.userParameters.add( name, adsk.core.ValueInput.createByString(expr_str), units, comment )
2단계: 변형 스테이징 및 되돌릴 수 있는 탐색
사용자가 디자인 옵션을 요청할 때("옵션 2를 줘", "뚜껑이 없는 버전을 시도해봐"):
- 쇼룸 패턴:
- 전용 구성요소(예:
Sample_Options_Showroom:1)에 실험적 옵션을 모델링합니다. - 변형을 가상 작업 공간 바닥에 나란히 배치(예: $Y = -350\text{ mm}$ 또는 $X = -200\text{ mm}$)하고 고유한 외관(
Rack_Desert_Tan,Rack_Matte_White)을 적용합니다. - 레이블이 있는 나란히 개요 스크린샷을 캡처합니다.
- 전용 구성요소(예:
- 비파괴적 채택:
- 사용자가 승자를 선택하면 선택한 바디를 활성 어셈블리(
InSitu_Tier3_Option2)로 복제합니다. bRepBody.isLightBulbOn = False를 통해 거부된 쇼룸 바디를 숨깁니다.- 다운스트림 타임라인 참조를 깨뜨릴 수 있는 객체에 대해 절대
body.deleteMe()를 호출하지 마십시오.
- 사용자가 승자를 선택하면 선택한 바디를 활성 어셈블리(
3단계: 표준 패스너 및 하드웨어 BOM 합성
사용자가 나사, 너트 또는 어셈블리 하드웨어를 요청할 때:
- 하드웨어 표준화:
- 모든 피벗 및 구조적 조인트에 대해 DIN 7991 M3 접시머리 나사 및 DIN 934 M3 육각 너트를 기본값으로 사용합니다.
- 표준 포켓 치수:
- 육각 너트 포켓: 평행면 거리(AF)
5.70 mm(5.50 mm너트에 대해+0.20 mmFDM 여유), 깊이2.50 mm. - 나사 구멍: $varnothing 3.20\text{ mm}$ 통과 구멍과 90° 원추형 접시머리 포켓($varnothing 6.20\text{ mm} \times 1.80\text{ mm}$).
- 고정 와셔: 3D 프린팅 와셔($varnothing 9.50\text{ mm}$ 외경 × $varnothing 3.20\text{ mm}$ 내경 ×
1.80 mm두께, 90° 접시머리)가 피벗 보스의 끝을 고정하면서 링크 바가 자유롭게 회전할 수 있도록 합니다.
- 육각 너트 포켓: 평행면 거리(AF)
- 템플릿 주차 규칙:
- 마스터 하드웨어 템플릿(
Template_DIN_7991_M3x10,Template_DIN_934_M3)은isLightBulbOn = True여야 합니다. - 템플릿을 지하 깊숙이(
Z = -500.0 cm) 주차하여 어셈블리의 자식 인스턴스는 계속 보이면서 템플릿은 완전히 화면 밖에 있도록 합니다.
- 마스터 하드웨어 템플릿(
4단계: 분해도 및 기술 일러스트레이션
사용자가 부품이 어떻게 조립되는지 설명해 달라고 요청할 때:
- 선형 분해 오프셋:
- 링크 바를 주축을 따라 바깥쪽으로 오프셋($+X$,
35 - 50 mm). - 구조적 스탠드 또는 프레임을 $Y$를 따라 뒤쪽으로 오프셋(
+45 - 60 mm). - 모듈식 드롭인 인서트를 $Z$를 따라 위쪽으로 오프셋(
+40 - 50 mm).
- 링크 바를 주축을 따라 바깥쪽으로 오프셋($+X$,
- 황금 정렬 가이드 로드:
- 얇은 원통형 로드($varnothing 1.2 - 1.4\text{ mm}$, 외관
Rack_Mustard_Yellow또는Gold - Polished)를 모든 나사/피벗 조인트 축을 따라 가장 안쪽 나사 머리에서 가장 바깥쪽 너트까지 돌출시킵니다. - 모든 로드를 전용 구성요소
Opened_Explosion_Guides로 그룹화합니다.
- 얇은 원통형 로드($varnothing 1.2 - 1.4\text{ mm}$, 외관
- 직교 카메라 설정:
cam.cameraType = OrthographicCameraType으로 설정하고 대상 경계 범위를 지정하여 원근 왜곡 없이 평행 축을 보장합니다.
5단계: 고속 어셈블리 애니메이션 파이프라인
사용자가 부품이 제자리로 애니메이션되는 애니메이션 GIF를 요청할 때:
- 발생 기반 장면 그래프 리깅:
- 각 움직이는 어셈블리를 자체 전용
Occurrence(Anim_Bars,Anim_Stand,Anim_Fasteners)로 그룹화합니다. - 프레임 루프 내에서
features.moveFeatures.add()를 사용하지 마십시오(프레임당 ~2.2초 타임라인 재구축 발생). - 직접
occ.transform = Matrix3D를 재할당합니다(0.005 s/프레임).
- 각 움직이는 어셈블리를 자체 전용
- 다단계 지연 스무드스텝:
스테이징된 서브어셈블리 간격($t \in [0.0, 1.0]$)에 걸쳐 스무드스텝 이징 $s(\tau) = 3\tau^2 - 2\tau^3$을 적용합니다:
- 스탠드 도킹: $t \in [0.00, 0.40]$
- 링크 바 안착: $t \in [0.15, 0.60]$
- 고정 와셔 안착: $t \in [0.30, 0.70]$
- 패스너 체결: $t \in [0.40, 0.92]$
- 가이드 페이드:
guides_occ.isLightBulbOn = (t < 0.88)
- 스크립트 내 배치 렌더링 및 핑퐁 컴파일:
- 프레임을 디스크에 직접 렌더링:
vp.saveAsImageFile('/tmp/frames/frame_%03d.png', 800, 800). PIL.Image를 사용하여 컴파일: 순방향 28프레임(45ms) $\to$ 홀드 28프레임 조립(50ms) $\to$ 역방향 26프레임(45ms) $\to$ 홀드 20프레임 분해(50ms).- 128개의 적응형 색상과 Floyd-Steinberg 디더링으로 양자화(~
2.3 MB). - 고유한/버전화된 파일명(예:
_final.gif)을 사용하여 브라우저 채팅 이미지 캐시를 무효화합니다.
- 프레임을 디스크에 직접 렌더링:
6단계: 수학적 자체 검증 및 DevBrain 동기화
- 결합 경계를 수학적으로 검증:
- 부품에 예상치 못한 간격이 있는 경우("뒤처져 보이는" 경우), 월드 좌표를 검사합니다:
delta = target_face.x - moving_face.x. - 정확한 수학적 델타를 적용합니다. 절대 조정을 추측하지 마십시오.
- 부품에 예상치 못한 간격이 있는 경우("뒤처져 보이는" 경우), 월드 좌표를 검사합니다:
- 마무리 및 메모리 동기화 실행:
- 범위 내 변경 사항을 활성 CAD 리포지토리에 커밋합니다.
- 새로운 메커니즘, 공차 규칙 또는 API 특이점이 발견된 경우
references/에 기록하고CHANGELOG.md에 변경 사항을 기록합니다.