"작업실"의 다음 단계로 남겨뒀던 CAD 연동을 시작. FreeCAD 대신 OpenSCAD를
백엔드로 씀 — 텍스트 스크립트 기반 CSG라 AI가 파라메트릭 스크립트를 짜서
바로 실행하는 이 워크플로에 훨씬 적합함(GUI/Python API가 무거운 FreeCAD
대비). 오늘 ESP32 카메라 하우징 렌즈 소켓 위치를 실제로 이 방식(OpenSCAD
--camera 렌더 + 메시 좌표 분석)으로 조사해본 뒤 정식 도구로 정리했다.
- info: 바운딩박스/치수/삼각형수 조회(바이너리 STL 직접 파싱, 의존성 없음)
- render: iso/top/front 등 각도로 PNG 렌더링, 모델이 직접 보게 함
(buildImageMarkdown 재사용). QT_QPA_PLATFORM=offscreen으로 헤드리스
렌더 확인(xvfb 불필요)
- add_hole: 지정 좌표에 원통 구멍을 뚫어 새 STL로 저장(difference()).
테스트 큐브로는 정상 작동 확인했으나, 오늘 다룬 ESP32 STL 자체가
CGAL이 못 받아들이는 미세 메시 결함이 있어(admesh로도 복구 안 됨)
그 파일에서는 실패 — 원인이 도구가 아니라 소스 STL 품질 문제임을
확인함
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
description:'STL 3D모델 파일을 확인(치수/삼각형수)하거나 여러 각도로 미리보기 렌더링하거나, 지정한 위치에 원통형 구멍을 뚫는다(OpenSCAD 기반 — FreeCAD 대신 이걸 씀, 텍스트 스크립트라 자동화에 더 적합). 워크스페이스 안의 파일만 다룬다. 물리적 동작이 없는 파일 편집이라 확인 없이 바로 실행해도 된다.',
parameters:{
type:'object',required:['action','stl_path'],
properties:{
action:{type:'string',enum:['info','render','add_hole'],description:'info: 치수/바운딩박스/삼각형수 조회. render: 지정한 각도로 PNG 미리보기 생성(모델이 직접 봄). add_hole: 지정 좌표에 원통형 구멍 뚫어서 새 STL로 저장.'},
stl_path:{type:'string',description:'워크스페이스 기준 상대경로의 바이너리 STL 파일(예: "print3d/esp32_top.stl"). ASCII STL은 지원 안 함.'},
view:{type:'string',enum:['iso','top','bottom','front','back','left','right'],description:'(render, 선택) 보는 각도. 기본 iso.'},
x:{type:'number',description:'(add_hole 필수) 구멍 중심 X좌표'},
y:{type:'number',description:'(add_hole 필수) 구멍 중심 Y좌표'},
z:{type:'number',description:'(add_hole 필수) 구멍 중심 Z좌표'},
description:'STL 3D모델 파일을 확인(치수/삼각형수)하거나 여러 각도로 미리보기 렌더링하거나, 지정한 위치에 원통형 구멍을 뚫는다(OpenSCAD 기반 — FreeCAD 대신 이걸 씀, 텍스트 스크립트라 자동화에 더 적합). 워크스페이스 안의 파일만 다룬다. 물리적 동작이 없는 파일 편집이라 확인 없이 바로 실행해도 된다.',
schema:{action:'string',stl_path:'string'},
jsonSchema:{
type:'object',
required:['action','stl_path'],
properties:{
action:{type:'string',enum:['info','render','add_hole'],description:'info: 치수/바운딩박스/삼각형수 조회. render: 지정한 각도로 PNG 미리보기 생성(모델이 직접 봄). add_hole: 지정 좌표에 원통형 구멍 뚫어서 새 STL로 저장.'},
stl_path:{type:'string',description:'워크스페이스 기준 상대경로의 바이너리 STL 파일(예: "print3d/esp32_top.stl"). ASCII STL은 지원 안 함.'},
view:{type:'string',enum:['iso','top','bottom','front','back','left','right'],description:'(render, 선택) 보는 각도. 기본 iso(비스듬한 기본 시야, 형태 전체 파악에 좋음). top/bottom/front/back/left/right는 정면 투영.'},
x:{type:'number',description:'(add_hole 필수) 구멍 중심 X좌표(모델 원본 좌표계, info로 바운딩박스 확인 후 지정)'},
y:{type:'number',description:'(add_hole 필수) 구멍 중심 Y좌표'},
z:{type:'number',description:'(add_hole 필수) 구멍 중심 Z좌표'},
return{success: false,error:'연산은 끝났는데 결과 STL 파일이 비정상입니다.'};
}
return{
success: true,
stdout:`구멍 추가됨: (${x}, ${y}, ${z})에 지름 ${diameter}mm, ${axis}축 방향, 길이 ${depth}mm.\n결과: ${outPathArg}\n\n다시 슬라이싱하려면 print3d_model이나 k2-app 슬라이싱 UI에서 이 새 파일을 사용하세요.`,
};
}
return{success: false,error:`알 수 없는 action: ${action}`};
},
};
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.