Files
Aislo/B07_DesignDetail/openwebcad/src/ribbon/ribbon.config.ts
T
eomsangdonandClaude Opus 5 2b6e76cd1c feat(B07): 도면 DXF/DWG 내보내기 추가
- 내보내기 엔진 신설 — 캐드 도면(JSON)을 ezdxf 로 DXF 작성(선·폴리선·글자·점·원·호, 도면층 유지), DWG 는 LibreDWG dxf2dwg 를 별도 프로세스로 호출
- POST /{project_id}/drawing-export 신설, 한글 파일명은 RFC 5987 방식으로 전달, 담지 못한 그림 수는 X-Aislo-Skipped 헤더로 통지
- CAD 출력 리본에 「DXF 내보내기」·「DWG 내보내기」 추가 — 캐드가 부모에 요청하면 부모가 서버 파일을 받아 내려받기
- 도각·내보내기 엔드포인트를 B07_DesignDetail_Router_Frame 으로 분리 (700줄 제한)
- 그림(Image)은 DXF 외부 참조 방식이라 제외하고 개수를 안내

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-06 14:38:55 +09:00

209 lines
4.2 KiB
TypeScript

/**
* 리본 구성 — AutoCAD 2024 `제도 및 주석` 작업공간의 탭·패널 배치를 따른다.
* 여기에는 데이터만 둔다. 버튼이 무엇을 하는지는 commands 레지스트리가 안다.
*/
export type RibbonWidget = 'properties' | 'layers' | 'textStyle';
export interface RibbonPanel {
label: string;
/** 크게 표시할 대표 명령 (AutoCAD의 큰 버튼) */
big?: string[];
/** 작은 버튼으로 나열할 명령 */
commands?: string[];
/** 패널 확장(▾)을 눌러야 나오는 명령 */
overflow?: string[];
/** 명령 버튼이 아닌 특수 위젯 패널 */
widget?: RibbonWidget;
}
export interface RibbonTab {
id: string;
label: string;
panels: RibbonPanel[];
}
export const RIBBON_TABS: RibbonTab[] = [
{
id: 'home',
label: '홈',
panels: [
{
label: '그리기',
big: ['LINE', 'PLINE'],
commands: ['CIRCLE', 'ARC', 'RECTANG', 'HATCH'],
overflow: [
'POLYGON',
'POINT',
'ELLIPSE',
'SPLINE',
'MLINE',
'MLSTYLE',
'XLINE',
'RAY',
'DONUT',
'DIVIDE',
'MEASURE',
'GRADIENT',
'BOUNDARY',
'REGION',
'WIPEOUT',
],
},
{
label: '수정',
big: ['MOVE', 'COPY'],
commands: ['ROTATE', 'MIRROR', 'TRIM', 'OFFSET'],
overflow: [
'SCALE',
'ERASE',
'ALIGN',
'ARRAY',
'EXTEND',
'STRETCH',
'FILLET',
'CHAMFER',
'BLEND',
'BREAK',
'BREAKATPOINT',
'JOIN',
'EXPLODE',
'LENGTHEN',
'PEDIT',
'HATCHEDIT',
'DRAWORDER',
'DRAWORDERBACK',
'MATCHPROP',
'OVERKILL',
'REVERSE',
'SETBYLAYER',
'ALIGNLEFT',
'ALIGNCENTERH',
'ALIGNRIGHT',
'ALIGNTOP',
'ALIGNCENTERV',
'ALIGNBOTTOM',
],
},
{
label: '도면층',
widget: 'layers',
overflow: [
'LAYCURSET',
'LAYOFF',
'LAYON',
'LAYFRZ',
'LAYTHW',
'LAYLCK',
'LAYULK',
'LAYISO',
'LAYUNISO',
'LAYERP',
'LAYERSTATE',
'LAYERSTATERESTORE',
'LAYMCH',
'LAYCUR',
'LAYMRG',
'LAYDEL',
'LAYWALK',
],
},
{
label: '특성',
widget: 'properties',
overflow: ['PROPERTIES', 'QUICKPROPERTIES', 'COLOR', 'LINETYPE', 'LWEIGHT', 'TRANSPARENCY'],
},
{ label: '그룹', commands: ['GROUP', 'UNGROUP'] },
{
label: '유틸리티',
big: ['SELECT'],
commands: ['DIST', 'AREA'],
overflow: [
'ID',
'LIST',
'QSELECT',
'SELECTSIMILAR',
'RADIUS',
'ANGLE',
'MEASUREGEOM',
'QUICKCALC',
'ISOLATEOBJECTS',
'HIDEOBJECTS',
'UNISOLATEOBJECTS',
],
},
{
label: '클립보드',
big: ['PASTECLIP'],
commands: ['COPYCLIP', 'CUTCLIP'],
overflow: ['COPYBASE', 'PASTEORIG', 'PASTEBLOCK'],
},
],
},
{
id: 'insert',
label: '삽입',
panels: [
{ label: '블록', big: ['INSERT'], commands: ['BLOCK'] },
{ label: '참조', commands: ['IMAGEATTACH'] },
],
},
{
id: 'annotate',
label: '주석',
panels: [
{
label: '문자',
big: ['MTEXT'],
commands: ['TEXT', 'TEXTEDIT', 'FIND', 'STYLE'],
},
{ label: '문자 스타일', widget: 'textStyle' },
{
label: '치수',
big: ['DIMLINEAR', 'DIMALIGNED'],
commands: ['DIM', 'DIMANGULAR', 'DIMRADIUS', 'DIMDIAMETER', 'DIMCONTINUE', 'QDIM'],
overflow: [
'DIMARC',
'DIMORDINATE',
'DIMBASELINE',
'CENTERMARK',
'CENTERLINE',
'DIMSTYLE',
'DIMUPDATE',
'DIMSPACE',
],
},
{
label: '지시선',
big: ['MLEADER'],
commands: ['MLEADERSTYLE', 'MLEADERALIGN'],
},
{
label: '표',
commands: ['TABLE', 'TABLEEDIT'],
overflow: ['TABLESTYLE', 'TABLEROW', 'TABLECOL', 'TABLEMERGE', 'TABLEUNMERGE'],
},
{ label: '표식', commands: ['REVCLOUD', 'ANNOSCALE'] },
],
},
{
id: 'view',
label: '뷰',
panels: [{ label: '탐색', big: ['ZOOM'], commands: ['ZOOMIN', 'ZOOMOUT', 'PAN', 'REGEN'] }],
},
{
id: 'output',
label: '출력',
panels: [
{
label: '내보내기',
big: ['EXPORT'],
commands: ['EXPORTDXF', 'EXPORTDWG', 'EXPORTSVG', 'EXPORTPNG', 'QSAVE'],
},
],
},
];
/** 제목표시줄의 빠른 실행 도구막대 */
export const QUICK_ACCESS_COMMANDS: string[] = ['QSAVE', 'EXPORT', 'UNDO', 'REDO'];