3MF/STL → Fusion 360 분석적 역설계 스킬
.3mf 또는 .stl 파일을 Autodesk Fusion 360에서 복사, 역설계 또는 재생성하라는 요청을 받으면 다음 결정론적 분석 파이프라인을 따르십시오.
CAD 역설계 명령
[!IMPORTANT] 엄격히 금지: Fusion 360의 기본 제공 "메시를 솔리드로 변환" 기능(
MeshToBREP또는bRepBodies.addByMesh)을 절대 사용하지 마십시오.메시 패싯을 직접 BRep으로 변환하면 수만 개의 평면 삼각형 면이 생성되어 뷰포트가 멈추고, 필렛이나 모따기를 적용할 수 없으며, 후속 CAM/도면을 망가뜨리고 모든 파라메트릭 설계 의도를 파괴합니다.
필수: 메시를 수학적으로 분해("슬라이스 앤 다이스")하고, 2D 단면과 기하학적 기본 형상(슬롯, 외접원 구멍, 카운터보어, 선삭 프로파일, 직사각형 패턴)을 추출한 후, Fusion 360 타임라인에서 스케치, 구동 사용자 파라미터, 압출, 회전, 패턴 피처를 사용하여 100% 네이티브 파라메트릭 솔리드 바디를 구성하십시오.
0단계: 사전 안전 게이트 (필수)
파일을 처리하기 전에 Autodesk Fusion 360 및 해당 MCP 서버가 활성 상태인지 확인하십시오.
-
카나리 프로브:
fusion-mcp도구execute_api_script를 호출합니다.def run(context): import adsk.core, adsk.fusion app = adsk.core.Application.get() if not app: raise RuntimeError("Autodesk Fusion 360 애플리케이션 인스턴스를 찾을 수 없습니다.") design = adsk.fusion.Design.cast(app.activeProduct) if not design: raise RuntimeError("활성 Fusion 360 설계 문서가 열려 있지 않습니다.") print("FUSION_MCP_READY") -
즉시 중단 규칙:
- 호출이 실패하거나 시간 초과되면 즉시 중단하십시오.
- 추출 스크립트나 CAD 명령을 실행하지 마십시오.
- 사용자에게 Fusion 360을 열고, 애드인이 시작되었는지 확인하고, 활성 문서를 열도록 안내하십시오.
1단계: 슬라이스 앤 다이스 및 분류 (계측 엔진)
[!IMPORTANT] 작업공간 격리 규칙: 추출 파일을 메인 저장소 루트(예:
./extracted_cad)에 절대 출력하지 마십시오. 항상models/<NN>_<Model_Name>/아래에 전용 모델 폴더가 있는지 확인하고(새 폴더라면scaffold_text_model.py "<Model_Name>"으로 생성), 모든 슬라이스/다이스 출력을models/<NN>_<Model_Name>/workspace/extracted_cad로 라우팅하십시오.
-
모델의 격리된 작업공간에서 심층 계측 엔진을 실행합니다.
python3 <path_to_skills>/3mf-to-fusion/scripts/inspect_3mf.py <path_to_file.3mf_or_stl> --out-dir models/<NN>_<Model_Name>/workspace/extracted_cad -
models/<NN>_<Model_Name>/workspace/extracted_cad/manifest.json을 읽습니다. -
각 파트에 대해
archetype및 감지된 피처를 확인합니다.- 유형 A: 프리즘/단차형 CAD: 평면 베이스 압출 + 포켓 컷 + 구멍 배열.
- 유형 T: 선삭/축대칭: Z축을 따라 정렬된 동일선상 원형 단면. 단일 반쪽 프로필 스케치 + 360°
RevolveFeature를 사용하여 모델링합니다. - 유형 B: 다중 계층 인클로저/쉘: 단차 구성 평면 + 얇은 벽 압출 + 쉘.
- 유형 C: 유기적 자유형 조각: 높은 비평면 곡률($> 15$ 계층). 즉시 사용자에게 경고합니다.
"이 부품은 이산적인 평면이나 프리즘 스케치가 없는 연속적인 유기적 조각품입니다. 평면 스케치로 재구성하면 부드러운 유기적 조각이 아닌 계단식 계단 근사치가 생성됩니다."
-
사용자에게 요약 테이블을 제시합니다.
파트 ID 아키타입 경계 상자 ($X \times Y \times Z\text{ mm}$) 계층 감지된 주요 기본 형상/패턴
2단계: 계측 수학 및 규칙
- 단위 변환 (
cm = mm / 10.0):- Fusion 360의 내부 데이터베이스(
adsk.core.ValueInput.createByReal())는 엄격하게 센티미터 (cm) 를 사용합니다. - 모든 스크립트 상단에 정의합니다.
def mm(val): return adsk.core.ValueInput.createByReal(float(val) / 10.0)
- Fusion 360의 내부 데이터베이스(
- 외접원 보상 (현 오차):
- STL 테셀레이션은 원형 구멍을 현을 따라 안쪽으로 모서리가 깎인 내접 다각형으로 근사화합니다.
- 내부 최소 직경을 절대 사용하지 마십시오. 항상
manifest.json["primitives"]["circles"]의radius_mm(95번째 백분위수 외접원 반지름)을 가장 가까운 $0.05\text{ mm}$로 반올림하여 사용합니다.
- 슬롯/오브라운 인식:
- 루프에 두 개의 평행한 직선과 두 개의 반원형 끝이 있는 경우, 다중 세그먼트 폴리곤 대신 시드 슬롯(
sketchLines+sketchArcs)으로 모델링합니다.
- 루프에 두 개의 평행한 직선과 두 개의 반원형 끝이 있는 경우, 다중 세그먼트 폴리곤 대신 시드 슬롯(
- 패턴 인식(그리드/극좌표):
manifest.json["patterns"]가 규칙적인 피치($\Delta X, \Delta Y$)를 감지하면 하나의 마스터 시드 컷아웃을 모델링하고comp.features.rectangularPatternFeatures를 사용하여 복제합니다. 반복적인 동일 지오메트리를 수동으로 그리지 마십시오.
3단계: 순수 파라메트릭 Fusion 360 재구성
execute_api_script를 통해 CAD 생성을 실행합니다. 깔끔한 타임라인 피처를 사용하여 각 파트를 재구성합니다.
1단계: 발생 및 사용자 파라미터
transform = adsk.core.Matrix3D.create()
occ = root.occurrences.addNewComponent(transform)
comp = occ.component
comp.name = part_name
# 구동 파라미터 추가
params = design.userParameters
params.add(f"{part_name}_width", mm(width_mm), "mm", "베이스 너비")
params.add(f"{part_name}_length", mm(length_mm), "mm", "베이스 길이")
params.add(f"{part_name}_height", mm(height_mm), "mm", "베이스 높이")
2단계: 기본 솔리드 지오메트리
- 유형 T (선삭)인 경우:
comp.xZConstructionPlane에 반쪽 프로필을 스케치하고comp.features.revolveFeatures.add(prof, comp.zConstructionAxis, adsk.fusion.FeatureOperations.NewBodyFeatureOperation)을 호출합니다. - 유형 A/B (프리즘)인 경우:
comp.xYConstructionPlane에 베이스 외곽선을 스케치하고(원점 중심) 베이스 솔리드를 압출합니다.
3단계: 2차 컷아웃 및 패턴
- 마스터 시드 컷아웃(슬롯, 카운터보어 또는 포켓)을 그립니다.
adsk.fusion.FeatureOperations.CutFeatureOperation과 함께comp.features.extrudeFeatures.add를 적용합니다.comp.xConstructionAxis및comp.yConstructionAxis방향으로comp.features.rectangularPatternFeatures.add를 적용합니다.
4단계: 마무리 작업
- 모서리 필렛(
comp.features.filletFeatures) 및 모따기(comp.features.chamferFeatures)를 적용합니다.
4단계: 참조 고스트 오버레이 및 인-캐드 검사
최종 모델을 오염시키지 않고 수학적 및 치수 정렬을 확인하려면 다음을 수행합니다.
- 고스트 참조 메시(선택 사항):
자세한 시각적 정렬이 필요한 경우 원시 메시를 별도의 임시 참조 발생체로 가져옵니다.
# 참조 배경으로 메시 가져오기 ref_occ = root.occurrences.addNewComponent(transform) ref_occ.component.name = "Reference_Mesh_Ghost" # 투명 시각적 스타일 설정 - 시각적 및 간섭 검사:
- 파라메트릭 솔리드가 메시 외피를 완전히 감싸고 정렬되었는지 확인합니다.
- 확인 후
ref_occ를 숨기거나 제거합니다.
5단계: 타임라인 건강 및 시각적 자체 검증 게이트
- 타임라인 피처 검증:
재구성된 파트에 메시 바디가 없는지 확인합니다.
assert comp.bRepBodies.count > 0, "생성된 솔리드 바디가 없습니다!" assert comp.meshBodies.count == 0, "컴포넌트에서 금지된 MeshBody가 감지되었습니다!" assert comp.sketches.count > 0, "타임라인에서 스케치를 찾을 수 없습니다!" - 시각적 검사:
get_screenshot(view="iso-top-right", width=1024, height=1024)를 호출하여 깔끔한 파라메트릭 솔리드 모델과 깔끔한 타임라인 트리를 시각적으로 확인합니다.