From 33207a450ce5da7d867291f7c3a9232884554665 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 15 Oct 2026 23:25:05 +0900 Subject: [PATCH] =?UTF-8?q?chore(=EC=A1=B0=EC=82=AC):=20337=20=EB=82=B4?= =?UTF-8?q?=EC=9E=A5=20CAD=20=EC=98=A4=ED=86=A0=EC=BA=90=EB=93=9C=20?= =?UTF-8?q?=EC=A1=B0=EC=9E=91=20=EC=84=A4=EA=B3=84=20=E2=80=94=20=EC=98=B5?= =?UTF-8?q?=EC=85=98=20=ED=8B=80=20=EC=95=BD=EC=86=8D=20=C2=B7=20=EB=AA=85?= =?UTF-8?q?=EB=A0=B9=2031=20=ED=94=84=EB=A1=AC=ED=94=84=ED=8A=B8=20?= =?UTF-8?q?=EC=82=AC=EC=A0=84=20=C2=B7=20=ED=9D=A0=2023=20=C2=B7=20?= =?UTF-8?q?=EB=A7=88=EC=9A=B0=EC=8A=A4=20=C2=B7=20=ED=9C=A0=20=C2=B7=20?= =?UTF-8?q?=EC=B0=BD=20=EB=8B=A4=EC=84=AF=20=C2=B7=20=EC=8B=9C=ED=97=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01C6BNBFXFndbqYxu6sZuknK --- .../2026-10-15_337_CAD오토캐드조작_설계.md | 413 ++++++++++++++++++ 1 file changed, 413 insertions(+) create mode 100644 docs/raw/조사/2026-10-15_337_CAD오토캐드조작_설계.md diff --git a/docs/raw/조사/2026-10-15_337_CAD오토캐드조작_설계.md b/docs/raw/조사/2026-10-15_337_CAD오토캐드조작_설계.md new file mode 100644 index 000000000..159a7f7f1 --- /dev/null +++ b/docs/raw/조사/2026-10-15_337_CAD오토캐드조작_설계.md @@ -0,0 +1,413 @@ +# 요구 229-3 내장 CAD — 오토캐드와 같은 명령 · 옵션 조작 설계 (PA3) + +- 기준 = `main_laptop_1` 8a4598c05(CAD 코드는 335 조사 기준 9c0ef7f82 와 바뀐 줄 0 · 줄 번호 그대로) · 코드 읽기 + 오토캐드 한국어 도움말(2025 KOR) 대조 · 저장소 고침 없음. +- 재료 = `docs/raw/조사/2026-10-15_335_다시조사_오토캐드마우스키보드.md`(대조 146 · 흠 30) · 부록4(K1 공식 · K2 우리 코드) · `2026-10-15_335_CAD입력보강_검토.md`(H1~H12). +- 줄임 — `src/` = `B07_DesignDetail/openwebcad/src/` · `ic/` = `src/inputController/` · `tl/` = `src/tools/` · `T/` = `resources/tester/cad/`. +- 근거 표 — [공] 한국어 도움말에 그 줄 그대로 · [이] 한국어 도움말 옵션 이름 + 영문 공식 줄 꼴로 엮음 · [옮] 영문 공식 줄 옮김(한국어판 이름 못 봄) · [기] 기억(공식 쪽 없음 · 브레인 화면 확인 거리). + +## 0. 요약 + +1. 바닥 셋을 새로 깖 — ① 친 글 처리 한 곳(`ic/prompt-input.ts` 사다리) ② 물음 선언 한 꼴(`src/commands/prompt.ts` 의 PromptSpec · 옵션 사건 `OPTION.<키>`) ③ 명령 끝 = 도구 머신 final 상태 `END` → 쉬는 상태(새 선택 도구)로 바꿔 끼움. +2. 따라 나오는 동작 — 점 · 옵션 묻는 중 명령 이름 거절(「점 또는 옵션 키워드를 요구함.」) · 앞글자 실행 없음 · 대소문자 무관 · Esc 한 번 = 명령 끝 · 빈 Enter = 명령별 뜻(기본값 · 기본 옵션 · 변위 · 끝) · 우클릭 = Enter(쉴 때 반복) · 기본값 세션 기억 · 한 번 그리는 명령(원 · 사각형 · 호 …)은 하나 뒤 끝(오토캐드처럼 Space 로 다시). +3. 결론으로 바뀌는 지금 동작 하나 — 지금은 선 · 원 · 사각형 등이 끝나도 같은 명령 첫 물음으로 돌아감 → 「점 묻는 중 명령 이름 거절」과 맞부딪힘(원 그린 뒤 L 이 안 먹음) → 오토캐드 「끝난 뒤」 열(1 장)대로 끝냄. +4. 명령 31 사전(1 장) — 물음 차례 · 옵션 글자 · 기본값 · 빈 Enter · Esc · 끝난 뒤 · 지금과 다른 곳 · 이번 넣을 옵션 / 뺄 옵션(뺀 옵션은 [ ] 에 안 그림 · 치면 「이 CAD 에 없음」 안내). +5. 흠 30 중 이번 고침 23(H1 · H2 일부 · H3 · H4 · H5 · H7 · H8 · H9 · H11 · N1~N11 · N14 · N17 · N18) + 새 흠 하나(3 번) · 뺌 7(H6 · H10 · H12 · N12 · N13 · N15 · N16) + H2 나머지. +6. 마우스 · 키 넣음 — 고르기 더함 · Shift 뺌 · 명령 중 끌기 상자 · 그립 누르고-옮기고-누르기 · 그립 숫자 · 직교 강제 + Shift 임시 직교 · 휠 밂 = 확대(기본) · 휠 두 번 = 범위 · 우클릭 반복 · Shift+우클릭 스냅 메뉴 · Ctrl+C/X/Shift+C/Shift+V/1 · ↑↓ 최근 값 · ZOOM 옵션(E · A · W · P · nX). +7. 창 다섯 — 가(틀 · 키보드) 먼저 → 나(그리기 12) · 다(고치기 · 재기 · 치수 12) · 라(옮기기 무리 7) 동시 · 마(마우스 · 고르기 · 그립 · 휠 · 보기)는 처음부터 동시 · 겹치는 파일은 줄 몫으로 나눔(5 장). +8. 시험 — 공용 조작 도우미 `T/helpers/cad-drive.ts` + 창마다 새 시험 하나 + 계약 시험(옵션 선언 ↔ 처리 · ESC 맞대기) · 완료 = 시험 · 타입 검사 둘 · CAD 빌드. +9. 브레인 화면 확인 거리 — PLINE Esc 남김 · SPLINE Esc 버림 · ARRAY · TEXT Esc · 한국어판 줄 꼴 · 휠 · 그립 · 스냅 메뉴([기] 줄). + +브레인 정함 → 이 설계 자리: + +| 정함 | 자리 | +|---|---| +| 앞글자 실행 없앰 · 별칭 acad.pgp | 2-5 ⑨ · 2-17 · N18 | +| 대소문자 무관(글 물음만 원문) | 2-4 · N6 | +| Esc = 명령 끝 | 2-7 · 2-8 · 1 장 Esc 열 · N2 · N3 · N4 | +| 점 · 옵션 묻는 중 명령 이름 거절 | 2-5 ⑩ · 2-10 · N1 · H7 | +| 옵션 글자 = 오토캐드 글자 · 빈 Enter 명령별 | 1 장 · 2-6 | +| 기본값 기억(세션) | 2-9 | +| 우클릭 · 고르기 · 그립 · 직교 · 휠 두 번 · 휠 밂 | 4 장 · H3 · H4 · H5 · H8 | +| 식 = 숫자 칸 거절('CAL 밖) | N5 · 7 장 | + +## 1. 프롬프트 사전(명령마다) + +- 줄 꼴 = 「글 또는 [이름(키)/…] <기본값>:」 한 꼴(`renderPrompt` 가 붙임) · 한국어판은 「호의 시작점 또는 [중심(C)] 지정:」처럼 「지정」이 뒤로 가는 줄도 있음[기] → 우리 한 꼴로 맞춤. +- 옵션 적는 꼴 = `닫기(C)·CLOSE` = 한국어 이름(키 글자)·영문 키워드(사건 `OPTION.CLOSE` 의 키도 이 영문) · 「뺌:」 뒤 = 오토캐드엔 있고 이번엔 안 넣음(`absent` 에 둠). +- 기억 = 앞에 쓴 값이 다음 `<기본값>`(세션) · 괄호 안 = 열쇠 이름(오토캐드 변수) · 처음 값. +- 끝난 뒤 — 한 번 = 하나 뒤 명령 끝(쉬는 상태 · Space · Enter · 우클릭 = 같은 명령 다시) · 되풀이 = 빈 Enter · Esc 까지 그 물음 되풀이. +- 지금 = K2(부록4 E 표) 우리 물음 · 동작. + +### 1-1. 그리기 · 글자 · 해치(나) + +| 명령 | 물음 차례 | 옵션(넣음 · 뺌) | 빈 Enter · 기본값 | Esc · 끝난 뒤 | 지금과 다른 곳 | +|---|---|---|---|---|---| +| LINE(L) | 「첫 번째 점 지정:」 → 「다음 점 지정 또는 [명령 취소(U)]:」 → 둘째 토막부터 「다음 점 지정 또는 [닫기(C)/명령 취소(U)]:」 되풀이 [이] | 명령 취소(U)·UNDO = 마지막 토막 지움(되돌림 한 칸 `undo()` · 새 되돌림 안 쌓음) · 닫기(C)·CLOSE = 첫 점으로 잇고 끝 | 첫 점 = 마지막 선 · 폴리선 · 호 끝점에서 시작[공](기억 LINE.END) · 다음 점 = 끝 | 끝(그린 토막 남음) · 되풀이 | Enter · Esc = 새 첫 점(안 끝남) · 첫 토막에도 [닫기] 보임 · 첫 점 Enter 없음 · 글 「첫 점 지정 (x,y):」 | +| PLINE(PL) | 「시작점 지정:」 → 「다음 점 지정 또는 [호(A)/길이(L)/명령 취소(U)]:」 → 둘째 토막부터 [호(A)/닫기(C)/길이(L)/명령 취소(U)] 되풀이 · 호 모드 「호의 끝점 지정 또는 [닫기(CL)/선(L)/명령 취소(U)]:」 되풀이 [이] | 호(A)·ARC = 접선 호 모드(첫 토막이 호면 접선 동쪽 0° · 앞 토막 있으면 그 끝 방향) · 닫기(C)·CLOSE · 길이(L)·LENGTH → 「선의 길이 지정:」[옮](앞 토막 방향 · 호 뒤면 접선) · 명령 취소(U)·UNDO = 마지막 토막 · 호 모드 닫기(CL)·CLOSE · 선(L)·LINE · 명령 취소(U) · 뺌: 반폭(H) · 폭(W) · 호 각도(A) · 중심(CE) · 방향(D) · 반지름(R) · 두 번째 점(S) | 시작점 = 마지막 끝점에서[공](LINE.END) · 다음 점 = 끝(확정) | 끝(그린 데까지 폴리선 남김[기]) · 되풀이 | 옵션 0 · C = 원으로 바뀌며 버림 · U = UNDO · Esc = 다 버리고 다시 · 끝나면 다시 시작점 | +| RECTANG(REC) | 「첫 번째 구석점 지정:」(오토캐드 = 「…또는 [모따기(C)/고도(E)/모깎기(F)/두께(T)/폭(W)]:」[공]) → 「다른 구석점 지정 또는 [치수(D)]:」 [이] | 치수(D)·DIMENSIONS → 「직사각형의 길이 지정 <10.0000>:」 → 「직사각형의 폭 지정 <10.0000>:」[옮] → 다시 「다른 구석점 지정 또는 [치수(D)]:」(누른 쪽 사분면으로 놓음) · 뺌: 모따기(C) · 고도(E) · 모깎기(F) · 두께(T) · 폭(W) · 면적(A) · 회전(R) | 길이 · 폭 기억(RECT.L · RECT.W · 10) | 끝 · 한 번 | 하나 뒤 다시 첫 구석 · 첫 구석 Esc 없음(N3) · D 없음 | +| CIRCLE(C) | 「원에 대한 중심점 지정 또는 [3점(3P)/2점(2P)]:」 → 「원의 반지름 지정 또는 [지름(D)] :」 [이 · 첫 줄 한국어 꼴 기] | 3점(3P)·3P → 「원 위의 첫 번째 점 지정:」 → 「…두 번째 점 지정:」 → 「…세 번째 점 지정:」 · 2점(2P)·2P → 「원 지름의 첫 번째 끝점 지정:」 → 「…두 번째 끝점 지정:」[옮] · 지름(D)·DIAMETER → 「원의 지름 지정 <2r>:」 · 뺌: Ttr - 접선 접선 반지름(T) | 반지름 기억(CIRCLERAD · 처음 없음 → `<>` 안 그림 · Enter = 아무 일 없음) · 누른 점 반지름도 기억 | 끝 · 한 번 | 하나 뒤 다시 중심 · 3P · 2P · D · 기억 없음 · 글 「원 위의 점 지정 또는 반지름 입력:」 | +| ARC(A) | 「호의 시작점 지정:」 → 「호의 두 번째 점 지정 또는 [중심(C)/끝(E)]:」 → 「호의 끝점 지정:」 [이] | 중심(C)·CENTER → 「호의 중심점 지정:」 → 「호의 끝점 지정 또는 [각도(A)]:」 · 각도(A)·ANGLE → 「사이각 지정:」(+ 반시계) · 끝(E)·END → 「호의 끝점 지정:」 → 「호의 중심점 지정 또는 [반지름(R)]:」 · 반지름(R)·RADIUS → 「호의 반지름 지정:」 · 뺌: 시작 단계 중심(C) · 현의 길이(L) · 방향(D) · E 뒤 각도(A) | 시작점 Enter(마지막 선 · 호 끝 접선 이음[공]) = 뺌 → 아무 일 없음 | 끝 · 한 번 | 세 점만 · 하나 뒤 다시 | +| POLYGON(POL) | 「변의 수 입력 <4>:」 → 「폴리곤의 중심 지정 또는 [모서리(E)]:」 → 「옵션 입력 [원에 내접(I)/원에 외접(C)] :」 → 「원의 반지름 지정:」 [이] | 모서리(E)·EDGE → 「모서리의 첫 번째 끝점 지정:」 → 「모서리의 두 번째 끝점 지정:」[옮] · 원에 내접(I)·INSCRIBED · 원에 외접(C)·CIRCUMSCRIBED | 변 수 기억(POLYSIDES · 4 · 3~1024 정수) · 내접/외접 기억(POLYGON.IC · I) · 반지름 숫자 = 아래 변 수평 · 점 = 크기 + 돌림 | 끝 · 한 번 | 면 수 <6> 상수 · 내접만 · E 없음 · 글 「면의 수를 입력하십시오 <6>.」 | +| ELLIPSE(EL) | 「타원의 축 끝점 지정 또는 [중심(C)]:」 → 「축의 다른 끝점 지정:」 → 「다른 축으로 거리를 지정 또는 [회전(R)]:」 [이] | 중심(C)·CENTER → 「타원의 중심 지정:」 → 「축의 끝점 지정:」 → 같은 거리 물음 · 회전(R)·ROTATION → 「주축 둘레로 회전 지정:」[옮] · 뺌: 호(A) | — | 끝 · 한 번 | 중심 방식만 · 셋째 숫자 ≠ 단축 반지름(N10) · 하나 뒤 다시 | +| SPLINE(SPL) | 「첫 번째 점 지정:」 → 「다음 점 입력:」 → 「다음 점 입력 또는 [명령 취소(U)]:」 → 셋째 점부터 [명령 취소(U)/닫기(C)] 되풀이 [이] | 명령 취소(U)·UNDO = 마지막 점 · 닫기(C)·CLOSE = 닫고 끝 · 뺌: 방법(M) · 매듭(K) · 객체(O) · 시작/끝 접촉부(T) · 공차(L) | 다음 점 = 끝(확정) | 버림[기] · 끝 | 점만 · 끝나면 다시 | +| XLINE(XL) | 「점 지정 또는 [수평(H)/수직(V)/각도(A)]:」 → 「통과점을 지정:」 되풀이 [이] | 수평(H)·HOR · 수직(V)·VER → 「통과점을 지정:」 되풀이 · 각도(A)·ANG → 「X선의 각도 입력 <0>:」 → 「통과점을 지정:」 되풀이 · 뺌: 이등분(B) · 간격띄우기(O) · 각도 참조(R) | 통과점 = 끝 · 각도 기억(XLINE.ANGLE · 0) | 끝(그은 선 남음) · 되풀이 | 한 줄 뒤 처음부터 · 옵션 없음 | +| TEXT(DT) | 「문자의 시작점 지정:」 → 「높이 지정 :」 → 「문자의 회전 각도 지정 <0>:」 → 글 줄(커서 곁 글 칸 · Enter = 아래 새 줄 · 빈 줄 Enter = 끝) [이] | 뺌: 자리맞추기(J) · 스타일(S) | 시작점 = 직전 명령도 TEXT 면 앞 글 아래 · 높이 · 각 안 물음[공] · 높이 기억(TEXTSIZE · 처음 지금 글자 크기) · 각 기억(TEXT.ANGLE · 0) | 끝(마친 줄 남음 · 치던 줄 버림[기]) | 시작점 → 한 줄 · 높이 · 각 안 물음 · 줄 이어 치기 없음 | +| MTEXT(T · MT) | 「첫 번째 구석 지정:」 → 「반대 구석 지정 또는 [높이(H)/폭(W)]:」 → 글(편집기 대신 커서 곁 글 칸 · `\P` 줄바꿈 그대로) [이] | 높이(H)·HEIGHT → 「높이 지정 :」 → 다시 반대 구석 · 폭(W)·WIDTH → 「폭 지정:」(점 · 숫자) → 글 · 뺌: 자리맞추기(J) · 행 간격(L) · 회전(R) · 스타일(S) · 열(C) | 높이 = TEXTSIZE | 끝(저장 없이[공]) | 반대 구석 없음 | +| HATCH(H · BH) | 「내부 점 선택 또는 [객체 선택(S)/명령 취소(U)]:」 되풀이 [이] | 내부 점 = 그 점을 품은 닫힌 객체(닫힌 폴리선 · 사각형 · 원) 중 가장 작은 하나 · 객체 선택(S)·SELECT → 「객체 선택:」(지금 방식) · 명령 취소(U)·UNDO = 마지막 경계 · 뺌: 경계 제거(B) · 설정(T) · 그리기(W) | 빈 Enter = 확정 · 끝 | 끝(안 만듦) | 경계 객체 고름만 | + +- POINT · DONUT · RAY 등 31 밖 그리기 = 엔진 바뀜만 따름(한 번 뒤 끝) · 오토캐드 되풀이 명령은 나가 `loopFrom` 둠 — DONUT(중심 되풀이) · RAY(통과점 되풀이) · MLINE · WIPEOUT(되풀이 단계 그대로 · Enter 확정 뒤 끝). + +### 1-2. 고치기 · 재기 · 치수(다) + +| 명령 | 물음 차례 | 옵션(넣음 · 뺌) | 빈 Enter · 기본값 | Esc · 끝난 뒤 | 지금과 다른 곳 | +|---|---|---|---|---|---| +| OFFSET(O) | 「간격띄우기 거리 지정 또는 [통과점(T)/지우기(E)] <통과점>:」 → 「간격띄우기할 객체 선택 또는 [종료(E)/명령 취소(U)] <종료>:」 → 「간격띄우기할 면의 점 지정 또는 [종료(E)/다중(M)/명령 취소(U)] <종료>:」 → 객체 선택으로 되풀이 [이] | 통과점(T)·THROUGH → 객체 → 「통과점 지정 또는 [종료(E)/다중(M)/명령 취소(U)] <종료>:」 · 지우기(E)·ERASE → 「간격띄우기 후 원본 객체를 지우시겠습니까? [예(Y)/아니오(N)] <아니오>:」[옮] · 종료(E)·EXIT · 다중(M)·MULTIPLE = 같은 객체로 쪽 되풀이 · 명령 취소(U)·UNDO = 이 명령 안 마지막 하나 · 뺌: 도면층(L) · 두 점으로 거리 | 거리 기억(OFFSETDIST · 처음 <통과점> = 숫자 대신 통과점 방식) · 객체 · 면 = <종료> | 끝(만든 것 남음) · 되풀이 | 거리 먼저 <1> 상수 · 한 번 뒤 끝 · 옵션 없음 | +| FILLET(F) | 「첫 번째 객체 선택 또는 [명령 취소(U)/반지름(R)/자르기(T)/다중(M)]:」 → 「두 번째 객체 선택 또는 Shift 키를 누른 채 선택하여 구석 적용 또는 [반지름(R)]:」 [이 · Shift 문구 공] | 반지름(R)·RADIUS → 「모깎기 반지름 지정 :」[옮] → 같은 물음 · 자르기(T)·TRIM → 「자르기 모드 옵션 입력 [자르기(T)/자르지 않기(N)] <자르기>:」[이] · 다중(M)·MULTIPLE = 쌍 되풀이 · 명령 취소(U)·UNDO = 다중 중 앞 쌍 · Shift+둘째 누름 = 반지름 0 · 뺌: 폴리선(P) | 반지름 기억(FILLETRAD · 0) · 자르기 기억(TRIMMODE · 자르기) | 끝 · 한 번(다중이면 되풀이 · 빈 Enter 끝) | 반지름 먼저 <0> 상수 · 옵션 · Shift 없음 | +| CHAMFER(CHA) | 「첫 번째 선 선택 또는 [명령 취소(U)/거리(D)/자르기(T)/다중(M)]:」 → 「두 번째 선 선택 또는 Shift 키를 누른 채 선택하여 구석 적용 또는 [거리(D)]:」 [이] | 거리(D)·DISTANCE → 「첫 번째 모따기 거리 지정 :」 → 「두 번째 모따기 거리 지정 :」[옮] · 자르기(T) · 다중(M) · 명령 취소(U) · Shift = 거리 0 · 뺌: 폴리선(P) · 각도(A) · 방법(E) | 거리 기억(CHAMFERA · CHAMFERB · 0 · 둘째 기본 = 첫째) | 끝 · 한 번(다중 되풀이) | 거리 둘 먼저 <1> | +| TRIM(TR) | 「자를 객체 선택 또는 Shift 키를 누른 채 선택하여 연장 또는 [지우기(R)]:」 되풀이 [이 · 빠른 모드] | 지우기(R)·ERASE → 「지울 객체 선택:」(고르기 · Enter = 지우고 돌아옴)[옮] · 명령 취소(U)·UNDO(숨김) · Shift+누름 = 연장 · 뺌: 절단 모서리(T) · 걸치기(C) · 모드(O) · 투영(P) · 끌기 경로 | 빈 Enter = 끝 | 끝(자른 것 남음) · 되풀이 | Enter · Esc 처리 없음(N3) · 멀리 눌러도 자름(N9) · Shift 없음 | +| EXTEND(EX) | 「연장할 객체 선택 또는 Shift 키를 누른 채 선택하여 자르기:」 되풀이 [이 · 빠른 모드] | 누른 쪽 끝을 가장 가까운 경계(모든 객체)까지 · Shift+누름 = 자르기 · 명령 취소(U)(숨김) · 뺌: 경계 모서리(B) · 걸치기(C) · 모드(O) · 투영(P) | 빈 Enter = 끝 | 끝 · 되풀이 | 경계 먼저 고름 → 선 하나 뒤 끝 | +| BREAK(BR) | 「객체 선택:」(누른 점 = 첫 끊기점) → 「두 번째 끊기점 지정 또는 [첫 번째 점(F)]:」 [이] | 첫 번째 점(F)·FIRST → 「첫 번째 끊기점 지정:」 → 「두 번째 끊기점 지정:」[옮] · `@` = 같은 점(틈 없이 둘로) | — | 끝 · 한 번 | 객체 → 첫 점 → 둘째 점(세 번 누름) | +| JOIN(J) | 「한 번에 결합할 원본 객체 또는 여러 객체 선택:」[공](고르기 물음) | — | 빈 Enter = 결합 | 끝 · 한 번 | 글만 다름 | +| LENGTHEN(LEN) | 「측정할 객체 또는 [증분(DE)/퍼센트(P)/전체(T)] 선택 <전체(T)>:」 → (값) → 「변경할 객체 선택 또는 [명령 취소(U)]:」 되풀이 [이] | 객체 누름 = 「현재 길이: 12.3456」 알림 뒤 같은 물음 · 증분(DE)·DELTA → 「증분 길이 입력 <0.0000>:」 · 퍼센트(P)·PERCENT → 「퍼센트 길이 입력 <100.0000>:」 · 전체(T)·TOTAL → 「전체 길이 지정 <1.0000>:」[옮] · 명령 취소(U) · 뺌: 동적(DY) · 각도(A) | 첫 물음 = 마지막 방식(LENGTHEN.MODE · 전체) · 값 = 방식별 기억 | 끝 · 되풀이 | 객체 먼저 → 증분 <10> · 한 번 뒤 끝 · 선만 | +| DIVIDE(DIV) | 「등분할 객체 선택:」 → 「세그먼트 수 입력:」 [이] | 뺌: 블록(B) | 기본 없음(2~32767 정수) | 끝 · 한 번 | <4> 기본 · 정수 검사 없음 | +| MEASURE(ME) | 「길이 분할 객체 선택:」 → 「세그먼트의 길이 지정:」 [이] | 누른 자리 가까운 끝부터[공] · 뺌: 블록(B) | 기본 없음(> 0) | 끝 · 한 번 | <10> 기본 | +| DIST(DI) | 「첫 번째 점 지정:」 → 「두 번째 점 지정:」 → 기록 · 알림 「거리 = d, XY 평면에서의 각도 = a, XY 평면으로부터의 각도 = 0 / X 증분 = dx, Y 증분 = dy, Z 증분 = 0.0000」[옮] | 뺌: 다중 점(M) | — | 끝 · 한 번 | 결과 글 꼴 · 끝나면 다시 | +| DIMLINEAR(DLI) · DIMALIGNED(DAL) | 「첫 번째 치수보조선 원점 지정 또는 <객체 선택>:」 → 「두 번째 치수보조선 원점 지정:」 → 「치수선의 위치 지정 또는 [문자(T)/수평(H)/수직(V)]:」(정렬 = [문자(T)]) → 기록 「치수 문자 = 100」 [이] | 첫 물음 빈 Enter → 「치수 기입할 객체 선택:」(선 · 폴리선 토막 양 끝) · 문자(T)·TEXT → 「치수 문자 입력 <100>:」(`<>` = 잰 값)[옮] → 같은 물음 · 수평(H)·HORIZONTAL · 수직(V)·VERTICAL = 그 방향 고정 → 같은 물음 · 뺌: 여러 줄 문자(M) · 각도(A) · 회전됨(R) | 첫 물음 <객체 선택> | 끝 · 한 번 | 점만 · 객체 고름 · T · H · V 없음 · 하나 뒤 다시 | +| DIMCONTINUE(DCO) · DIMBASELINE(DBA) | 「두 번째 치수보조선 원점 지정 또는 [명령 취소(U)]:」 되풀이 [옮] | 명령 취소(U) = 이 명령 안 마지막 치수 · 뺌: 선택(S) | 빈 Enter = 끝 | 끝 · 되풀이 | 한 번 | +| DIMRADIUS(DRA) · DIMDIAMETER(DDI) | 「호 또는 원 선택:」 → 「치수선의 위치 지정 또는 [문자(T)]:」 [이] | 문자(T)·TEXT · 뺌: 여러 줄 문자(M) · 각도(A) | — | 끝 · 한 번 | 글 | + +- DIM · DIMANGULAR · DIMORDINATE · DIMARC · QDIM = 이번엔 물음 글 · 끝 · Esc 규칙만(옵션 뺌). + +### 1-3. 옮기기 무리(라) + +| 명령 | 물음 차례 | 옵션(넣음 · 뺌) | 빈 Enter · 기본값 | Esc · 끝난 뒤 | 지금과 다른 곳 | +|---|---|---|---|---|---| +| MOVE(M) | 「객체 선택:」(고른 것 있으면 건너뜀) → 「기준점 지정 또는 [변위(D)] <변위>:」 → 「두 번째 점 지정 또는 <첫 번째 점을 변위로 사용>:」 [이 · 둘째 줄 공] | 변위(D)·DISPLACEMENT → 「변위 지정 <0.0000, 0.0000>:」[옮](좌표 = 변위) | 기준점 = <변위> · 두 번째 점 = 첫 점 좌표가 변위[공] · 변위 기억(MOVE.DISP) | 제자리 · 끝 · 한 번 | D · Enter 변위 없음 · Esc 안 끝남(N2) · 한 번 뒤 고르기로 · 딴 명령 = 사라짐(N1) | +| COPY(CO · CP) | 「객체 선택:」 → 「기준점 지정 또는 [변위(D)/모드(O)/다중(M)] <변위>:」[공] → 「두 번째 점 지정 또는 [배열(A)] <첫 번째 점을 변위로 사용>:」[공] → 첫 사본 뒤 「두 번째 점 지정 또는 [배열(A)/종료(E)/명령 취소(U)] <종료>:」 되풀이[옮] | 모드(O)·MODE → 「복사 모드 옵션 입력 [단일(S)/다중(M)] <다중>:」[이] · 다중(M)·MULTIPLE = 이번만 되풀이(모드 단일 때만 보임) · 배열(A)·ARRAY → 「배열할 항목 수 입력:」 → 「두 번째 점 지정 또는 [맞춤(F)]:」[이] · 종료(E)·EXIT · 명령 취소(U)·UNDO | 첫 둘째 점 = 변위 · 다음 = <종료> · 모드 기억(COPYMODE · 다중) | 끝(만든 사본 남음) · 되풀이 | Enter 로 못 끝냄 · D · O · A · U 없음 | +| ROTATE(RO) | 「객체 선택:」 → 「기준점 지정:」 → 「회전 각도 지정 또는 [복사(C)/참조(R)] <0>:」 [이] | 누름 = 기준점 → 누른 점 각(한 번) · 숫자 = 반시계 + · 복사(C)·COPY → 기록 「선택한 객체의 사본을 회전함.」(오토캐드 글 [기] · 명사형으로) → 같은 물음 · 참조(R)·REFERENCE → 「참조 각도를 지정 <0>:」(숫자 · 두 점 · `@` = 기준점) → 「새 각도 지정 또는 [점(P)] <0>:」[옮] · 점(P)·POINTS → 두 점 | 각 기억(ROTATE.ANGLE · 0) | 제자리 · 끝 · 한 번 | 누름 = 기준선 끝 → 방향 점(두 번 · 차례 다름) · C · R 없음 | +| SCALE(SC) | 「객체 선택:」 → 「기준점 지정:」 → 「축척 비율 지정 또는 [복사(C)/참조(R)] <1.0000>:」 [이] | 누름 = 기준점~점 거리 · 숫자 > 0 · 복사(C) · 참조(R) → 「참조 길이 지정 <1.0000>:」(숫자 · 두 점) → 「새 길이 지정 또는 [점(P)] <1.0000>:」[옮] | 비율 기억(SCALE.FACTOR · 1) | 제자리 · 끝 · 한 번 | 누름 = 기준선 끝 → 새 길이 끝(두 번) · C 없음 · 0 이하 조용히 버림 | +| STRETCH(S) | 기록 「걸치기 윈도우 또는 걸치기 폴리곤만큼 신축할 객체 선택...」 → 「객체 선택:」 → 「기준점 지정 또는 [변위(D)] <변위>:」 → 「두 번째 점 지정 또는 <첫 번째 점을 변위로 사용>:」 [이] | 변위(D) = MOVE 와 같음 · 걸침 창 안 꼭짓점만 옮김 · 창 안에 통째 든 것 = 이동[공 뜻] | MOVE 와 같음(STRETCH.DISP) | 제자리 · 끝 · 한 번 | 선 = 기준점 가까운 끝만 · 그 밖 통째 | +| MIRROR(MI) | 「객체 선택:」 → 「대칭선의 첫 번째 점 지정:」 → 「대칭선의 두 번째 점 지정:」 → 「원본 객체를 지우시겠습니까? [예(Y)/아니오(N)] <아니오>:」 [이] | 예(Y)·YES · 아니오(N)·NO | <아니오>(늘) | 끝(안 만듦) · 한 번 | Y/N 물음 없음 | +| ARRAY(AR) | 「객체 선택:」 → 「배열 유형 입력 [직사각형(R)/원형(PO)] <직사각형>:」 [이] → 직사각형: 미리보기 4열 × 3행 → 「그립을 선택하여 배열을 편집하거나 [개수(COU)/간격두기(S)/열(COL)/행(R)/종료(X)] <종료>:」 되풀이 · 원형: 「배열의 중심점 지정:」 → 미리보기 6개 360° → 「그립을 선택하여 배열을 편집하거나 [항목(I)/사이의 각도(A)/채울 각도(F)/항목 회전(ROT)/종료(X)] <종료>:」 되풀이 [이] | 개수(COU)·COUNT → 「열 수 입력 <4>:」 → 「행 수 입력 <3>:」 · 간격두기(S)·SPACING → 「열 사이의 거리 지정 :」 → 「행 사이의 거리 지정 :」 · 열(COL)·COLUMNS → 열 수 → 열 거리 · 행(R)·ROWS → 행 수 → 행 거리 · 항목(I)·ITEMS → 「배열의 항목 수 입력 <6>:」 · 사이의 각도(A)·ANGLE → 「항목 사이의 각도 지정 <60>:」 · 채울 각도(F)·FILL → 「채울 각도 지정(+=ccw, -=cw) <360>:」 · 항목 회전(ROT)·ROTATE → 「배열된 항목을 회전하시겠습니까? [예(Y)/아니오(N)] <예>:」[옮] · 종료(X)·EXIT · 뺌: 경로(PA) · 연관(AS) · 기준점(B) · 수준(L) · 회전축(A) · 표현식 | 유형 기억(ARRAYTYPE · 직사각형) · 처음 간격 = 고른 것 범위 폭 · 높이의 1.5 배[기] · 편집 = <종료> → 만듦 | 안 만듦[기] · 끝 · 한 번 | [직선(L)/원형(R)](R = 원형 · 오토캐드 R = 직사각형) · 간격 두 점 · 한 칸 각 · Esc 일부 없음 · `x,y` 면 복사 0(N17) | + +- 고른 것 소비 때 `rememberSelection(ids)`(고르기 이전(P) 열쇠) · 고른 것 없이 고르기 Enter = 명령 끝(오토캐드 같음). + +### 1-4. 고르기 · 그립 · 보기 · 점 물음 보조(마 · 가-2) + +| 물음 | 차례 | 옵션 · 손짓 | 빈 Enter | Esc | 지금과 다른 곳 | +|---|---|---|---|---|---| +| 고르기(모든 명령) | 「객체 선택:」 되풀이 [공] | 숨은 옵션 전체(ALL)·ALL · 최종(L)·LAST · 이전(P)·PREVIOUS · 누름 = 더함 · Shift+누름 = 뺌 · 빈 곳 = 창(왼→오) · 걸침(오→왼) · 클릭-클릭 · 끌기 둘 다 · 「1개를 찾음, 총 3개」 알림 · 뺌: W · C · F · WP · CP · BOX · G · A · R · M · U · AU · SI | 고르기 끝(없으면 명령 끝) | 명령 끝 | 누름 = 바꿈 · 명령 안 끌기 상자 ○ · P = 화면 이동 안내 · L = LINE | +| 그립 | 그립 누름(뜨거움) → 「** 신축 ** 신축점 지정 또는 [종료(X)]:」[기] | 점 · 좌표 · 거리 숫자 · Tab 칸 · 종료(X)·EXIT · 뺌: 기준점(B) · 복사(C) · 명령 취소(U) · Enter/Space 모드 돌림 | — | 그립 놓음 | 누른 채 끌기만 · 안 끌고 떼도 적용(H3) · 숫자 무시(N8) | +| ZOOM(Z) | 「윈도우 구석 지정, 축척 비율 (nX 또는 nXP) 입력 또는 [전체(A)/범위(E)/이전(P)/윈도우(W)] <실시간>:」[이 · 기] | 전체(A)·ALL = 범위 · 범위(E)·EXTENTS · 이전(P)·PREVIOUS = 앞 화면(ZOOM · 휠 두 번 · ⛶ 로 바꾼 것만 기억) · 윈도우(W)·WINDOW → 「첫 번째 구석 지정:」 → 「반대 구석 지정:」 · 점 누름 = 윈도우 첫 구석 · `2X` = 지금 배율 × 2 · 뺌: 중심(C) · 동적(D) · 축척(S) · 객체(O) · 실시간 | <실시간> = 「실시간 줌은 휠로」 알림 · 닫음 | 닫음 | Z = 바로 범위(Z E 손버릇 = 범위 뒤 E → ERASE 로 이어짐) | +| 점 물음 보조(모든 점 물음 · 가-2) | 스냅 이름 → 「끝점(END) 한 번 — 점 지정」(지금 꼴) · FROM → 「기준점:」 → 「<간격띄우기>:」 · M2P · MTP → 「중간점의 첫 번째 점:」 → 「중간점의 두 번째 점:」[옮] | 스냅 이름 = 앞 세 글자~영문 전체(END · ENDP · ENDPOINT …) · 넣음: END MID CEN QUA INT PER NEA NOD NON(NONE) · 「이 CAD 에 없는 스냅」 안내: TAN EXT INS APP PAR GCE · `@` = 마지막 점(LASTPOINT) · 첫 점 `@dx,dy` = 마지막 점 기준 · `#x,y` · `*x,y` = 절대 | — | 보조 풂 + 명령 끝 | 일곱만 · EXT · INS = 명령이 돎(N14) · FROM · M2P · `@` · `#` 버림 | + +## 2. 옵션 틀 약속(다른 창이 이대로 고침) + +### 2-1. 흐름 + +키 · 마우스 → `InputController`(키 쪽 = 가 · 마우스 쪽 = 마) → `prompt-input.routeTyped`(사다리 한 곳) → 사건(`MOUSE_CLICK` · `ABSOLUTE_POINT_INPUT` · `RELATIVE_POINT_INPUT` · `NUMBER_INPUT` · `TEXT_INPUT` · `OPTION.<키>` · `ENTER` · `ESC` · `DRAW`) → 도구 머신(상태 `meta` 에 물음 선언) → `END`(final) → `end-command.ts` 가 쉬는 상태로. + +### 2-2. 파일 · 내보내는 이름 + +| 파일 | 몫 | 내보냄 | +|---|---|---| +| `src/commands/prompt.ts`(새 · 가) | 물음 꼴 · 그림 · 옵션 맞추기 · 기억 · 공용 옵션 | `OptionSpec` · `DefaultSpec` · `PromptSpec` · `PromptLike` · `renderPrompt` · `matchOption` · `remember` · `recall` · `rememberSelection` · `previousSelection` · `rememberPoint` · `lastPoint` · `OPT` · `SELECT_OBJECTS` | +| `ic/prompt-input.ts`(새 · 가) | 친 글 사다리 · 거절 · 알림 줄 · 덧물음 · 쉼 판정 · 명령 끊기 | `currentPrompt` · `routeTyped` · `isIdle` · `cancelActiveCommand` · `undoCommand` · `redoCommand` · `notice` · `currentNotice` · `pushSubPrompt` · `subPrompt` · `closeSubPrompt` · `SubPrompt` · `SubResult` | +| `tl/factories/end-command.ts`(새 · 가) | `END` 받으면 정리 → 새 선택 도구(동기) | 없음(불러오면 갈고리 붙음 · `registry.ts` 가 불러옴) | +| `tl/tool.types.ts`(고침 · 가) | 사건 · 이름 | `OptionEvent` · `optionKey` · `END_STATE` · `StepKind` · `MouseClickEvent.snapped?` | +| `tl/factories/sequence-tool.ts`(고침 · 가) | 순서 엔진 v2 | 2-13 | +| `ic/input-history.ts`(새 · 가-2) | ↑↓ 명령 기록 · 물음별 최근 값 20 | `recallInput(dir, text)` · `pushInput(text)` | +| `ic/point-modifiers.ts`(새 · 가-2) | FROM · M2P · `@` · `#` · `*` · 스냅 이름 늘림 | `tryPointModifier(T)` | +| `T/helpers/cad-drive.ts`(새 · 가) | 시험 공용 조작 | 6-2 | + +### 2-3. 물음 꼴(타입 · 가가 이대로 만듦) + +```ts +type XY = { x: number; y: number }; +interface OptionSpec { key: string; kw: string; en: string; label: string; hidden?: true } +type DefaultSpec = + | { kind: 'value'; remember: string; initial: number | XY | null; format?: 'len' | 'int' | 'ang' } + | { kind: 'option'; key: string; label?: string } // <변위> · <전체(T)>(label 로 바꿈) + | { kind: 'enter'; label: string }; // <첫 번째 점을 변위로 사용> · <종료> · <객체 선택> +interface PromptSpec { + text: string; // '다음 점 지정' — ' 또는 [..]' · ' <..>' · ':' 는 renderPrompt 가 붙임 + options?: OptionSpec[]; // 넣은 옵션(숨김 포함) + absent?: OptionSpec[]; // 오토캐드엔 있고 우리엔 없음 — 치면 안내 · 안 그림 + default?: DefaultSpec; + number?: { int?: true; min?: number; max?: number; positive?: true }; + reject?: string; // 거절 글 바꿈(없으면 2-10) + history?: string; // ↑↓ 최근 값 묶음(없으면 text) +} +type PromptLike = PromptSpec | ((context: any) => PromptSpec); // 지금 상태 context 로 그림 +// 상태 meta 꼴: { kind?: StepKind; prompt?: PromptLike; instructions?: string /* 옛 꼴 */ } +// StepKind = 'point' | 'number' | 'text' | 'entity' | 'selection' | 'keyword' +interface OptionEvent extends EventObject { type: `OPTION.${string}` } // StateEvent 에 더함 +``` + +- 그림 = `글` + (보이는 옵션 있으면 ` 또는 [이름(키)/…]`) + (기본 있으면 ` <기본>`) + `:` · 「두 번째 객체 선택 또는 Shift 키를 누른 채 선택하여 구석 적용」 같은 덧글은 `text` 에 그대로. +- 기본 그림 — 길이 = 소수 넷(LUPREC 4 · `10.0000`) · int = 정수 · ang = 끝 0 뗌 · XY = `x, y` 소수 넷 · 값이 null = `<>` 안 그림. +- 보이는 곳 — 커서 곁 입력 상자 첫 줄 · 명령행(B07) · B06 상세 · M02 는 커서 곁만(같은 코드). + +### 2-4. 옵션 맞추기(`matchOption`) + +- 친 글 → 앞뒤 빈칸 뗌 · 대문자 · 앞 `_` 하나 뗌(영문 공용 키워드 꼴). +- 맞음 = 글 = kw · 글 = en · 또는 en 이 글로 시작하고 글이 kw 로 시작(kw 보다 짧으면 안 맞음 — 공식 initget 「LType = LT · LTY · LTYP · LTYPE · L 은 모자람」). +- 둘 이상 맞으면 kw 딱 맞는 것 · 숨은 옵션도 맞춤 · `absent` 맞으면 「「고도(E)」 옵션은 이 CAD 에 없음.」. +- 한 물음 안 kw 겹침 없음(계약 시험) · 점 물음에선 스냅 이름 · FROM · M2P 를 옵션보다 먼저 봄(PLINE 호 `CE` 대 스냅 `CEN` — 오토캐드도 CEN = 스냅). +- 대소문자 무관은 이 한 곳 — 캔버스 대문자 바꿈(`input-controller.ts:481`)은 보이는 글만 · 명령행 칸 소문자(N6)도 같은 길. + +### 2-5. 친 글 사다리(`routeTyped` · 한 곳) + +① 덧물음 있음 → 덧물음만(그 물음 꼴로 ④~⑦). +② 글 빔 → 동적 입력 길이 잠금 + 점 물음 = 그 길이 점(지금) → 물음 기본(값 숫자 = `NUMBER_INPUT` · 값 XY = `ABSOLUTE_POINT_INPUT` · 옵션 = `OPTION.키` · enter = `ENTER`) → 쉼 = 앞 명령 반복 → 그 밖 = `ENTER`. +③ 글 물음(`kind: 'text'`) → `TEXT_INPUT`(원문 그대로) · 그 밖 물음에서 `'` 로 시작하면 바로 ⑧. +④ 점 물음 → 동적 각도 칸 숫자 · ` 내 별칭 > 기본 별칭 **딱 맞음만** `runCommand` · 아니면 「알 수 없는 명령 「R」.」(N18 — `registry.ts:132` 앞글자 첫 후보 줄 뺌 · 후보는 목록 · 2-12 고름). +⑩ 거절 → 2-10 글을 알림 줄 · 기록 줄에 · 도구엔 사건 안 감 · 친 글 지움. + +- 쉼 = 맨 위 도구가 SELECT 이고 `WAITING_FOR_FIRST_SELECT_POINT`(상자 그리는 중은 쉼 아님). +- 물음 종류 = 덧물음 → 쉼 → `meta.kind` → 없으면 `on` 으로 짐작(`ABSOLUTE_POINT_INPUT` = 점 · `NUMBER_INPUT` = 숫자 · `MOUSE_CLICK` 만 = 객체 · `OPTION.*` 만 = 키워드) · 평평한 상태만 읽음(지금 `ime-sink.ts:13-16` 과 같음). +- 한글 받개 초점 = `kind: 'text'` 일 때만(`activeToolWantsIme` 를 이것으로) — 숫자 · 키워드 물음은 영문 자리 글자. +- 옛 꼴 통과(전환 중 안 깨지게) — `prompt` 없는 상태: `meta.options`(글 배열)에 맞음 → `TEXT_INPUT(대문자)` · `TEXT_INPUT` 받고 `NUMBER_INPUT` 없는 상태 → `TEXT_INPUT(대문자)` · 나 · 다 · 라 전환 끝나면 가가 지움. + +### 2-6. 빈 Enter · Space · 우클릭 + +- 셋 다 ② 길 · Space 는 글 물음에서만 빈칸(지금 `ime-sink.ts:48-51` 그대로) · 우클릭 = `handleEnterKey(true)`(쉴 때도 반복 · 브레인 정함) · 친 글 있으면 그 글 제출. + +### 2-7. Esc(한 번 = 명령 끝) + +- 친 글 · 한글 조합 · 각도 잠금 · 동적 입력 잠금 · 한 번 스냅 · FROM · 덧물음 모두 풂 → 쉼 아니면 도구에 `ESC`(도구 = 정리 뒤 `END`) → 쉼이면 상자 그리는 중 = 상자 취소 · 아니면 고름 풂 · 기록 줄 「*취소*」. +- 지금(`input-controller.ts:485-500`)은 고른 것 있으면 고름만 · 친 글 있으면 글만 → 오토캐드처럼 한 번에. + +### 2-8. 명령 끝 · 명령 바꿈 · 되돌림 + +- 도구 머신이 `END`(`type: 'final'`)에 들면 `state.ts` 갈고리(`setActiveToolActor` 구독 `status === 'done'`) → `end-command.ts` 가 그림자 · 기준점 · 도움선 끔 · 덧물음 닫음 → 새 선택 도구(같은 틱) · 고른 것 풂은 도구 몫(소비한 도구가 풂 · QSELECT 같은 고르기 명령은 남김). +- 선택 도구 자체의 final(Enter)도 같은 갈고리 → `input-controller.ts:531-537` 지움 · `sequence-tool.ts:240-243` setTimeout 바꿔 끼우기 지움(같은 틱이 xstate 에서 탈 나면 queueMicrotask · 시험 `await tick()`). +- `runCommand`(도구형) = `cancelActiveCommand()`(쉼 아니면 `ESC` · 오토캐드 리본 `^C^C`) 뒤 켬 · 즉시형 = 도구 둠(N1 ②). +- `undoCommand` · `redoCommand` = 끊고(`ESC`) 뒤 되돌림 · 고름 풂(N1 ③ · N11 · 오토캐드 `^C^C_u`) · Ctrl+Z · Ctrl+Y · ↶ ↷ · 손가락 단추 모두 이 길. +- 쉴 때 `U` = UNDO(오토캐드 U 와 같음) · 명령 중 `U` = 그 물음 옵션일 때만(아니면 거절). + +### 2-9. 기본값 기억(세션 = 탭 수명 Map) + +- 쓰는 쪽 = 도구(`remember(열쇠, 값)` — 값이 정해진 때 · 누름으로 정한 값도) · 읽는 쪽 = 물음 그림 · 빈 Enter(`recall`). +- 엔진 숫자 단계 = `prompt.default.remember` 열쇠로 엔진이 저절로 기억. +- 열쇠 — OFFSETDIST · FILLETRAD · TRIMMODE · CHAMFERA · CHAMFERB · CIRCLERAD · POLYSIDES · POLYGON.IC · RECT.L · RECT.W · TEXTSIZE · TEXT.ANGLE · XLINE.ANGLE · LINE.END · ROTATE.ANGLE · ROTATE.REF · SCALE.FACTOR · SCALE.REF · MOVE.DISP · STRETCH.DISP · COPYMODE · ARRAYTYPE · ARRAY.COLS · ARRAY.ROWS · ARRAY.ITEMS · ARRAY.FILL · LENGTHEN.MODE · LENGTHEN.DE · LENGTHEN.P · LENGTHEN.T · LASTPOINT(`rememberPoint` — `state.setAngleGuideOriginPoint` 에 null 아닌 점이 오면) · 앞 고름(`rememberSelection`). + +### 2-10. 거절 · 안내 글(커서 곁 둘째 줄 3 초 또는 다음 키까지 + 기록 줄) + +| 때 | 글 | 근거 | +|---|---|---| +| 점 물음 | 점 또는 옵션 키워드를 요구함. | 오토캐드 한국어판(사용자 글 2차) · 브레인 정함 꼴 | +| 점 물음 + `number`(반지름 · 거리) | 숫자 거리, 두 번째 점 또는 옵션 키워드를 요구함. | [옮] | +| 각 물음(`reject` 로) | 유효한 숫자 각도, 두 번째 점 또는 옵션 키워드를 요구함. | [옮] | +| 숫자 · 정수 · 범위 · 양수 | 숫자 값을 요구함. · 정수 값을 요구함. · 3에서 1024 사이의 정수를 요구함. · 값은 양수이고 0이 아니어야 함. | [옮] | +| 키워드 물음 | 옵션 키워드가 잘못됨. | [옮] | +| 고르기 · 객체 물음 | *선택이 잘못됨* | [옮] | +| 없는 옵션 · 스냅 | 「고도(E)」 옵션은 이 CAD 에 없음. · 「TAN」 스냅은 이 CAD 에 없음. | 우리 | +| 쉴 때 | 알 수 없는 명령 「R」. | [옮] | +| 투명 | 「LINE」 명령은 투명하게 쓸 수 없음. | [옮] | + +- 명령 시작 때 「현재 설정: …」 기록 줄(FILLET · TRIM · OFFSET · COPY · TEXT …) = 넣으면 좋음 · 이번 필수 아님(`run-command.ts` 가 `logLine` 내보냄 · 거절 · 알림 기록도 이 길). + +### 2-11. 덧물음(sub-prompt) + +```ts +interface SubPrompt { prompt: PromptSpec; kind: StepKind; + onPoint?(p: Point): SubResult; onNumber?(n: number): SubResult; + onOption?(key: string): SubResult; onEnter?(): SubResult } +type SubResult = 'stay' | 'done' | { point: Point }; // {point} = 닫고 그 점을 원래 물음에 ABSOLUTE_POINT_INPUT 로 +``` + +- 쓰는 곳 — ZOOM(마 · `ic/zoom-prompt.ts`) · FROM · M2P(가-2) · 도구 머신을 안 바꿔 투명하게 됨(`'Z` 도 같은 길). +- 마우스 누름도 덧물음 먼저(`sendMouseClick` 이 `subPrompt()?.onPoint` 를 먼저 부름 · 마 몫 줄) · 그림 = 덧물음 줄이 도구 물음 대신 · Esc = 2-7(덧물음 닫고 명령도 끝 · 투명 ZOOM Esc 뒤 원래 명령 이어 감 여부[기]). + +### 2-12. ↑↓ · Tab · 후보(가-2) + +- ↑↓ — 쉼 = 친 명령 기록(H11 · 알림 줄 안 섞음) · 명령 중 = 그 물음(`history`) 최근 값 20 · 후보 목록 보일 땐 후보 고름(Enter = 고른 후보 · 안 고르면 친 글 그대로 ⑨) · Shift+↑↓ = 위아래 화면 이동(옛 동작 남김) · ← → = 화면 이동 그대로. +- Tab — 점 물음 = 동적 입력 칸(지금 그대로) · 쉼 + 친 글 = 후보 돌림(글을 후보 이름으로 · 오토캐드 명령행 Tab). +- 명령행(B07 `CommandLine.tsx`)도 같은 함수(`recallInput`) · Tab 첫 후보 채움(`:78-81`) → 돌림. + +### 2-13. 순서 엔진 v2(`sequence-tool.ts` · 가) + +| 칸 | 뜻 | +|---|---| +| `SequenceStep.kind` 에 `'keyword'` | 옵션만 받는 단계 · 고른 옵션 key 가 값(MIRROR 예/아니오 · 배열 유형) | +| `id?` | 값 이름 — `input.get(id)` · `input.has(id)` | +| `prompt?: PromptLike` | 새 꼴 물음(함수면 `SequenceInput` 받음) · 있으면 `instructions` 안 씀 | +| `when?(input)` | 거짓이면 그 단계 건너뜀(갈래 · `mode` 와 같이) | +| `next?` | 값을 받은 뒤 갈 단계 id(없으면 다음 칸 · 되돌아가기 = FILLET 반지름 뒤 첫 물음) | +| `options?: Record` | `OPTION.key` 처리 — `{ mode, next? }` = `input.mode` 세우고 다음(또는 next) · `{ run }` = 설정만 바꾸고 같은 물음 · `'undo'` = 마지막 값 하나 뺌 · `'close'` = `input.closed` 세우고 확정 · `'end'` = 확정 없이 끝 | +| `loopFrom?` | 확정 뒤 그 단계(id · 번호)부터 다시 · 앞 값 둠 — 없으면 확정 뒤 `END` | +| `escCommits?` | Esc 때 모은 값으로 확정 뒤 끝(PLINE) · 없으면 `onCancel` 뒤 끝(값 없어도 있어도 늘 끝 — N4) | +| `pickfirst?`(기본 참) | 첫 단계가 selection 이고 고른 것 있으면 그대로 받고 넘어감(오토캐드 PICKFIRST 1 · 지금 「Enter 한 번 더」) | +| `restart` · `chainFromLastPoint` | 옛 꼴 남김(`restart: true` = `loopFrom: 0`) | +| `SequenceInput` 더함 | `get(id)` · `has(id)` · `mode` · `closed` · 옛 `point(i)` 등 그대로 | + +- 엔진 몫 — 숫자 단계 TEXT_INPUT→숫자 길 지움(`:296-301` · N5) · selection 단계 meta = `{ kind: 'selection', prompt: step.prompt ?? SELECT_OBJECTS }` + `'OPTION.*'` 자식에 넘김 · 빈 고르기 = 끝 · 고른 것 받을 때 `rememberSelection` · 취소 때 selection 단계 있던 명령이면 고름 풂. +- 기본 바뀜이 103 순서 도구 모두에 미침 — 점만 받는 명령도 확정 뒤 끝 · 오토캐드 되풀이 명령만 `loopFrom` 둠(1 장 「되풀이」 줄 · 31 밖은 DONUT · RAY · MLINE · WIPEOUT · 지시선 · 표 놓기(이미 `restart: false`)). + +### 2-14. 손으로 짠 도구 규칙(LINE · CIRCLE · RECTANG · TRIM · MOVE · COPY · ROTATE · SCALE · ARRAY · 그립 · PEDIT) + +1. 물음 상태마다 `meta: { kind, prompt }` · 옛 `instructions` · `options: ['C','U']` 지움. +2. 옵션 처리 = `on: { 'OPTION.CLOSE': {...} }` — `prompt.options` key 마다 하나(숨김 포함 · 계약 시험이 맞댐) · 옵션 글을 `TEXT_INPUT` 으로 받지 않음. +3. `ESC` → 정리(그림자 · 원본 되살림) 뒤 `target: END_STATE` · 한 번 끝나는 명령은 마지막에 `END` · 되풀이는 그 상태로. +4. 고르기 상태 = `meta: { kind: 'selection', prompt: SELECT_OBJECTS }` + `'OPTION.*': { actions: sendTo(자식id, ({ event }) => event) }` + 고른 것 없이 끝 = `END` + 소비 때 `rememberSelection`. +5. 값 기억 = 정해진 때 `remember()` · 기본은 `prompt` 함수에서 `recall()`. +6. 물음 상태는 평평하게(겹 상태 안 · prompt-input 이 평평한 것만 읽음) · 파일 700 줄 넘으면 `*.helpers.ts` 로 가름. + +### 2-15. 고르기 물음 공용 · 앞 고름 + +- `SELECT_OBJECTS` = `{ text: '객체 선택', options: [전체(ALL)·ALL · 최종(L)·LAST · 이전(P)·PREVIOUS](모두 hidden) }` · 선언 = 가 · 처리(`OPTION.ALL` · `.LAST` · `.PREVIOUS`) = 마(선택 도구 첫 점 대기 상태 · 쉴 때 · 자식 둘 다). +- ALL = Ctrl+A 와 같은 목록(`getPickableEntities` · 오토캐드 ALL = 동결 · 잠금 층 뺌 · 끈 층 고름[기] — 다른 곳 표시만) · LAST = 집을 수 있는 마지막 객체 · PREVIOUS = `previousSelection()`. + +### 2-16. 계약 시험(`T/prompt-contract.test.ts` · 가) + +- `TOOL_STATE_MACHINES` 모든 평평한 상태 — `prompt.options` key 마다 `on['OPTION.key']` 또는 `on['OPTION.*']` 있음 · 같은 물음 kw 안 겹침 · `meta.kind` 있는 상태마다 `ESC` 있음 · `prompt` 와 옛 `instructions` 같이 없음 · 옵션 함수 꼴은 빈 context 로 불러 봄. + +### 2-17. 별칭(가) + +- 뺌: `SE`(SELECT · `commands.view.ts:35` · acad SE = DSETTINGS 없음) · 더함: `ED` → TEXTEDIT(`commands.annotate.ts:84` · acad 2018~) · `command-catalog.json` 거울 같이. +- 앞글자 실행 없앰으로 `R`(REDRAW) · `RA` · `W` · `LE`(QLEADER) · `UN` · `TO` · `TA` · `HI` · `IN` · `EXT` · `Q` · `LAY` · `DD` · `OS` · `DS` · `SN` · `V` · `PU` · `LTS` · `OP` = 「알 수 없는 명령」(acad 별칭이 가리키는 명령이 우리에 없음 → 비움). +- 우리 덧 별칭(`TEDIT` · `SAVE` · `UNHIDE` · `UNISOLATE` · `U` = UNDO)은 둠 — acad 와 안 부딪힘 · ☰ 내 별칭 우선 그대로. + +## 3. 흠 고침(이번 목표에 드는 것) + +| 흠 | 까닭(지금) | 자리 | 고침 방향 | 시험 | 창 | +|---|---|---|---|---|---| +| H1 | Ctrl · Alt+글자가 명령 글자로 쌓임(Ctrl+C → 원) | `ic/input-controller.ts:476-482` · `A00_Common/key_shortcut.ts:31-49` | 글자 쌓기에 Ctrl · Alt · ⌘ 거름 · CAD 쪽 `ic/input-shortcut.ts` 에 `cadCtrlCommand`(C=COPYCLIP · X=CUTCLIP · Shift+C=COPYBASE · Shift+V=PASTEBLOCK · 1=PROPERTIES) · 공용 key_shortcut 안 고침 | prompt-frame | 가 | +| H2 일부 | 보기 전용에서 그립 · Ctrl+그립 · Delete 먹음 | `tl/select-tool.helpers.ts:55-72` · `tl/select-tool.ts:73-76` · `src/helpers/draw.ts:56` | `isDrawingReadOnly() \|\| isViewOnly()` 면 그립 시작 · 꼭짓점 지움 · DELETE 안 함 · 그립 안 그림 | mouse-acad | 마 | +| H3 | 그립 누르기만 해도 밀림 | `ic/input-controller.ts:195-212` · `tl/grip-edit-tool.ts:64-112` | 누름이 그립 편집을 켠 것이고 안 끌고(4 px) 떼면 아무 일 없음(뜨거운 그립) · 다음 누름 = 놓음 · 끌어 떼면 놓음 · 손가락 톡도 같은 길 | mouse-acad | 마 | +| H4 | 상자 + Ctrl/Shift 엉뚱 · 상자 = 늘 새로 | `tl/select-tool.helpers.ts:114-169` | 상자 = 앞 고름 ∪ 상자 · Shift+상자 = 앞 고름 − 상자 | mouse-acad | 마 | +| H5 | 명령 중 누름 = 바꿈 · 끌기 상자 ○ · 스침 ○ | `tl/select-tool.helpers.ts:80-99` · `ic/input-controller.ts:283-293,311-330` | 누름 = 더함(쉼 · 명령 중 같음) · Shift = 뺌 · 고르기 단계도 누를 때 첫 점(`ic/selecting.ts` 의 `selectingActor()`) · 스침 강조 | mouse-acad | 마 | +| H7 | 점 찍는 명령 중 C · U = 원 · UNDO | `ic/ime-sink.ts:28-34` · `tl/factories/sequence-tool.ts:282-292` | 점 물음 중 명령 이름 거절(가) + PLINE · SPLINE 옵션 C · U(나) | prompt-frame · draw-acad | 가 · 나 | +| H8 | F3 끄면 직교 · 극 꺼짐 · 직교 강제 아님 | `ic/input-controller.ts:277-280` · `src/helpers/get-draw-guides.ts:37-48` · `src/helpers/get-point-from-event.ts:20-45` | 가이드 계산은 늘 · 객체 스냅점만 F3 · 직교(F8 · Shift 누른 동안 뒤집음)면 기준점에서 가로 · 세로로 늘 내림(커서 · 누름 · 거리 숫자 방향) · 스냅 점(`snapped`) · 친 좌표 · 각도 잠금은 안 덮음(오토캐드) | mouse-acad | 마 | +| H9 | 가이드 잡는 거리 = 도면 단위 15 | `src/helpers/get-draw-guides.ts:42` · `src/App.consts.ts:57` | `SNAP_ANGLE_DISTANCE / 화면 배율`(`maxSnapDistance` 와 같은 셈) | mouse-acad | 마 | +| H11 | ↑ 기록에 알림 줄 | `src/commands/run-command.ts:18-38` · `src/components/CommandLine.tsx:31-39` | 보이는 기록(log)과 친 명령 기록(input-history) 나눔 | prompt-frame | 가-2 | +| N1 | 이동 · 회전 · 축척 도중 딴 명령 → 고른 것 사라짐 · Ctrl+Z → 두 벌 | `tl/move-tool.ts:216-226` · `tl/rotate-tool.ts:241-259` · `tl/scale-tool.ts:247` · `src/commands/run-command.ts:44-50` · `ic/input-controller.ts:616-634` | ① 친 이름 거절 ② `runCommand` 가 `cancelActiveCommand` ③ 되돌림 = 끊고 뒤 ④ 도구 ESC = 원본 되살림 뒤 END | prompt-frame · transform-acad | 가 · 라 | +| N2 | 옮기기 무리 Esc 로 안 끝남 · 한 번 뒤 고르기로 | `tl/move-tool.ts:122-124,172-174` · `tl/copy-tool.ts:121-123` · `tl/rotate-tool.ts:129-131` · `tl/scale-tool.ts:134-136` · `tl/array-tool.ts:113-115` | ESC · 끝 = END | transform-acad | 라 | +| N3 | Esc 없는 단계 | `tl/rectangle-tool.ts:55-70` · `tl/eraser-tool.ts:62-74` · `tl/array-tool.ts:147-277` | 모든 물음 상태 ESC → END(계약 시험) | prompt-contract | 나 · 다 · 라 | +| N4 | PLINE · SPLINE Esc = 다 버리고 다시 | `tl/factories/sequence-tool.ts:252-261` | 늘 끝 · PLINE `escCommits` · SPLINE 버림[기] | draw-acad | 가 · 나 | +| N5 | 숫자 단계 `3.2*1.5` → 3.2 | `tl/factories/sequence-tool.ts:193-201,296-301` | 글 전체가 수일 때만 · 아니면 거절 | prompt-frame | 가 | +| N6 | 명령행 칸 소문자 c → 원 | `ic/input-controller.ts:168-172` · `ic/ime-sink.ts:29-34` | 맞추기 대문자 한 곳(2-4) | prompt-frame | 가 | +| N7 | 명령 안 고르기 중 그립 누름 → 그립 편집으로 바뀜 | `tl/select-tool.helpers.ts:55-72` | 그립 집기는 맨 위 도구가 선택 도구(쉼)일 때만 | mouse-acad | 마 | +| N8 | 그립 중 거리 숫자 · 길이 잠금 무시 | `tl/grip-edit-tool.ts:64-80` | `NUMBER_INPUT`(그립 점에서 커서 쪽) 받음 | mouse-acad | 마 | +| N9 | TRIM 멀리 눌러도 자름 · 사각형 → 지금 층 선 | `tl/eraser-tool.ts:94-100,125-139` | `pickRadius()` 밖 = 아무 일 없음 · 사각형 변 = 원래 층 · 꼴(`copyStyle`) | modify-acad | 다 | +| N10 | 타원 셋째 숫자 ≠ 단축 | `tl/draw/basic-draw-tools.ts:82-105` | 「다른 축으로 거리」 = 중심에서 잰 반 길이 | draw-acad | 나 | +| N11 | U · Ctrl+Z 두 길 | `src/commands/commands.file.ts:100-108` · `ic/input-controller.ts:616-634` | 2-8(되돌림 = 끊고 뒤 · 명령 중 U = 옵션일 때만) | prompt-frame | 가 | +| N14 | 스냅 이름 EXT · INS → 명령 돎 · 나머지 버림 | `ic/input-snap-override.ts:13-21` | 점 물음에서 오토캐드 스냅 이름은 늘 스냅 길 · QUA · NOD 더함 · 없는 것 안내 | prompt-frame | 가-2 | +| N17 | ARRAY `x,y` → 복사 0 | `tl/array-tool.ts:198-206,324-360` | ARRAY 새 차례(1-3)로 없어짐 | transform-acad | 라 | +| N18 | 앞글자 실행 | `src/commands/registry.ts:124-134` | 딱 맞음만 · 후보는 목록 | prompt-frame | 가 | +| 새 | 한 번 그리는 명령이 끝나도 첫 물음으로 돌아감 → 명령 이름 거절과 부딪힘 | `tl/line-tool.ts:133-139` · `tl/circle-tool.ts:88-107` · `tl/rectangle-tool.ts:80-99` · `tl/factories/sequence-tool.ts:231-249` | 1 장 「끝난 뒤」 열대로 END · 되풀이 | 창마다 시험 | 가 · 나 · 다 · 라 | + +- 뺌 — H2 나머지(특성 칸 · 리본 특성 · 도면층 관리 · 내보내기) · H6(숨긴 것 고름) · H10(그리드) · H12(명령행 한글) · N12(오토캐드도 같음) · N13(맥 ⌘V) · N15 · N16. + +## 4. 마우스 · 단축키 · 휠 + +| 무엇 | 오토캐드 | 이번 | 자리 | 창 | +|---|---|---|---|---| +| 왼 누름 고르기 | 누름 = 더함 · Shift = 뺌(PICKADD 2) | 넣음(쉼 · 명령 중 같음) · Ctrl+누름 = 지금처럼 넣고 빼기(오토캐드 2D 뜻 없음 · 둠) | `select-tool.helpers.ts` | 마 | +| 창 · 걸침 | 빈 곳 클릭-클릭 · 끌기 | 명령 중에도 끌기 · 상자 더함 · Shift 상자 뺌 | `input-controller.ts` 마우스 · `ic/selecting.ts`(새) | 마 | +| 스침 강조 | 고르기 물음에서도 | 넣음 | `input-controller.ts:283-293` | 마 | +| 고르기 키워드 | P · L · ALL … | ALL · L · P | `select-tool.ts` · `prompt.ts` | 마 · 가 | +| 그립 | 누름 = 뜨거움 → 옮겨 누름 = 놓음 · 끌기도 | 넣음 · 숫자 · Tab · Esc · X | `input-controller.ts` · `grip-edit-tool.ts` | 마 | +| 그립 모드 돌림 · C · B · 여러 그립 · 메뉴 | 있음 | 뺌 | — | — | +| 우클릭 | 명령 중 = Enter · 쉼 = 반복(설정) · 고른 채 = 메뉴(기본) | 명령 중 = Enter · 쉼(고른 채 포함) = 반복 · 메뉴 없음 | `input-controller.ts:174-180` → `handleEnterKey(true)` | 마 | +| Shift+우클릭 | 한 번 스냅 메뉴 | 넣음 — 점 물음일 때만 · 끝점 · 중간점 · 중심 · 사분점 · 교차점 · 수직 · 근처점 · 노드 · 없음 · 시작점에서(FROM) · 두 점 사이의 중간(M2P) → `submitText(이름)` | `ic/snap-menu.ts`(새 · DOM · 손가락 단추 꼴) | 마(FROM · M2P 처리 = 가-2) | +| 휠 굴림 | 밂(앞) = 확대 · 커서 자리 | 기본 밂 = 확대(☰ 뒤집기 그대로 · 모든 화면 일체) · 배율 10% 그대로 | `A00_Common/input_prefs.ts:23,45`(DEFAULT `push` · 없으면 `push`) | 마 | +| 휠 두 번 | 범위 | 가운데 단추 두 번(400 ms · 5 px 안) = 범위 · 앞 화면 기억 | `input-controller.ts` mousedown | 마 | +| 휠 끌기 · Ctrl+휠 | 이동 · 빠른 줌 | 그대로 | — | — | +| ZOOM | 옵션 물음 | E · A · W · P · nX(덧물음 · `'Z`) · ⛶ 단추 = 바로 범위(`zoomToFitScreen`) | `commands.view.ts:41-52` · `ic/zoom-prompt.ts`(새) · `ViewControls.tsx:31` | 마 | +| 직교 F8 | 강제 | 강제 · F3 와 뗌 | `get-point-from-event.ts` · `calculate-angle-guides-and-snap-points.ts` | 마 | +| Shift 누른 동안 | 직교 뒤집음(임시 우선 키) | 넣음 — 점 물음 · 기준점 있을 때 · 마우스 사건 `shiftKey` 로(keyup 안 씀) | `ic/ortho.ts`(새) | 마 | +| 그 밖 임시 키(Shift+E 등) | 있음 | 뺌 | — | — | +| Ctrl+C · X · Shift+C · Shift+V · 1 | 클립보드 · 특성 | COPYCLIP · CUTCLIP · COPYBASE · PASTEBLOCK · PROPERTIES · Ctrl+V 그대로(paste 사건) | `input-controller.ts` 키 · `input-shortcut.ts` | 가 | +| Ctrl+Z · Y · ↶ ↷ | 끊고 되돌림 | 2-8 | `prompt-input.ts` · `ViewControls.tsx:20-23`(마가 `undoCommand` 부름) | 가 · 마 | +| ↑ ↓ · Tab | 기록 · 최근 값 · 후보 | 2-12 | `input-controller.ts:413-422,464-475` · `CommandLine.tsx` | 가-2 | +| Delete | 고른 것 지움 | 그대로(보기 전용 막음 = H2) | — | 마 | +| F1 · F2 · F11 · F12 · Ctrl+9 · Ctrl+W 등 | 있음 | 뺌(브라우저 몫 · 335 정할 것 14) | — | — | + +- 안내 글 바꿈(가 · 끝에 한 번 · 공유 파일) — `ui_template/ui_template_locale_common.ts:120-125`(오른쪽 단추 = 「명령 중 Enter · 쉴 때 반복 · Shift = 스냅 메뉴」 · 휠 두 번 = 범위) · `:165-169` CAD 줄(「↑↓ = 기록 · 최근 값」 · 「Ctrl+C · X · 1」 · 「방향키 = 화면 옮김」 → 「← → · Shift+↑↓ = 화면 옮김」). + +## 5. 창 나눔 · 차례 + +### 5-1. 맡는 것 · 파일 몫 + +| 창 | 맡는 것 | 혼자 고치는 파일 | 같이 만지는 파일(그 줄만) | +|---|---|---|---| +| 가 | 틀 · 키보드 · 명령 해석 · 엔진 · 별칭 · 시험 도우미 · 안내 글 | 새 `src/commands/prompt.ts` · `ic/prompt-input.ts` · `ic/input-history.ts` · `ic/point-modifiers.ts` · `tl/factories/end-command.ts` · `T/helpers/cad-drive.ts` · `T/prompt-frame.test.ts` · `T/prompt-contract.test.ts` / 고침 `tl/factories/sequence-tool.ts` · `tl/tool.types.ts` · `ic/ime-sink.ts` · `ic/input-snap-override.ts` · `ic/input-shortcut.ts` · `src/commands/registry.ts` · `run-command.ts` · `command-catalog.json` · `src/components/CommandLine.tsx` · `src/state.ts`(갈고리 · LASTPOINT 10 줄 안 · 지금 647 줄) · `T/keyboard-chain.test.ts` · `T/command-catalog.test.ts` · `ic/ime-sink.test.ts` | `ic/input-controller.ts` 키 쪽(`handleKeyStroke` · `handleEnterKey` · `handleEscapeKey` · `handleUndo/Redo` · `submitText` · `sendText` · `draw`) · `commands.view.ts:35` · `commands.annotate.ts:84` · `ui_template_locale_common.ts`(끝에) | +| 나 | 그리기 12(1-1) | `tl/line-tool.ts` · `tl/circle-tool.ts` · `tl/rectangle-tool.ts` · `tl/draw/basic-draw-tools.ts` · `tl/draw/construction-tools.ts` · `tl/annotate/text-tools.ts` · `tl/draw/fill-tools.ts` · 새 `tl/draw/pline-tool.ts` 등(옛 파일에서 다시 내보내 `commands.*.ts` 안 만짐) · `T/draw-acad.test.ts` | — | +| 다 | 고치기 · 재기 · 치수 12(1-2) | `tl/eraser-tool.ts`(+helpers) · `tl/modify/corner-tools.ts` · `tl/modify/structure-tools.ts` · `tl/draw/divide-tools.ts` · `tl/utility/inquiry-tools.ts` · `tl/annotate/dimension-tools.ts` · `dimension-radial-tools.ts` · 새 `tl/modify/offset-tool.ts` · `lengthen-tool.ts` · `T/modify-acad.test.ts` | `commands.modify.ts` OFFSET · LENGTHEN import 두 줄 | +| 라 | 옮기기 무리 7 + PEDIT 고르기 상태 | `tl/move-tool.ts` · `copy-tool.ts` · `rotate-tool.ts` · `scale-tool.ts` · `array-tool.ts`(+새 helpers) · `pedit-tool.ts` · `tl/modify/transform-tools.ts`(MIRROR · STRETCH · 다 합친 뒤 옛 OFFSET · LENGTHEN 지움) · `T/transform-acad.test.ts` | — | +| 마 | 마우스 · 고르기 · 그립 · 휠 · 직교 · 보기 전용 문 · ZOOM · 스냅 메뉴 | `tl/select-tool.ts` · `select-tool.helpers.ts` · `grip-edit-tool.ts` · `src/helpers/get-point-from-event.ts` · `get-draw-guides.ts` · `calculate-angle-guides-and-snap-points.ts` · `src/helpers/draw.ts` · `drawControllers/fit-view.ts`(윈도우 줌) · 새 `ic/selecting.ts` · `ic/ortho.ts` · `ic/snap-menu.ts` · `ic/zoom-prompt.ts` · `src/components/ViewControls.tsx` · `A00_Common/input_prefs.ts` · 휠 시험들 · `T/mouse-acad.test.ts` | `ic/input-controller.ts` 마우스 쪽(constructor 마우스 줄 · `handleMouse*` · `sendMouseClick` · `getCanvasPoint`) · `commands.view.ts:41-52`(ZOOM) | + +- `input-controller.ts`(지금 635 줄) — 가는 사다리를 `prompt-input.ts` 로 빼서 줄이고 · 마는 새 논리를 `selecting.ts` · `ortho.ts` 등에 두고 이 파일엔 부르는 줄만. + +### 5-2. 차례 + +1. 가-1 — 2 장 계약 전부(타입 · 사다리 · 거절 · Esc · 빈 Enter · 우클릭 뜻 · END 갈고리 · 엔진 v2 · 기억 · 덧물음 · 별칭 · N1 ②③ · N5 · N6 · N11 · N18 · H1 · 옛 꼴 통과 · 계약 시험 · cad-drive · keyboard-chain 손질) → push → 브레인이 나 · 다 · 라 · 마에 「받기」. +2. 마-1 = 처음부터(가 안 기다림) — 휠 기본 · 고르기 더함/뺌 · 상자 · 명령 중 끌기 · 스침 · N7 · 그립 누르고-옮기고-누르기 · 그립 숫자 · H2 문 · 직교 강제 · Shift 직교 · H8 · H9 · 휠 두 번. +3. 가-1 받은 뒤 동시 — 나 · 다 · 라 · 마-2(ZOOM 덧물음 · 스냅 메뉴 · ALL/L/P · `snapped` 채움 · 우클릭 반복 · ↶↷). +4. 가-2 = 가-1 바로 뒤(나 · 다 · 라와 동시) — ↑↓ · Tab 후보 · FROM · M2P · `@` · `#` · `*` · 스냅 이름 늘림 · H11. +5. 끝 — 가: 옛 꼴 통과 지움 · 안내 글 · 라: 옛 OFFSET · LENGTHEN 지움 · 브레인 화면 검증 · 아티팩트. + +- 창 안 차례(먼저 → 나중) — 나 = LINE → PLINE → RECTANG → CIRCLE → POLYGON → ARC → ELLIPSE → XLINE → SPLINE → TEXT → MTEXT → HATCH · 다 = OFFSET → FILLET → TRIM → EXTEND → CHAMFER → BREAK → LENGTHEN → JOIN → DIVIDE → MEASURE → DIST → DIM · 라 = MOVE → COPY → ROTATE → SCALE → MIRROR → STRETCH → ARRAY. +- 어림(시험 포함 · 화면 확인 별도) — 가-1 1.5 일 · 가-2 1 일 · 나 2.5 일 · 다 2.5 일 · 라 2 일 · 마 2 일. +- 알릴 것 — 가-1 push(모두 받기) · 엔진 기본 바뀜(모든 순서 도구 확정 뒤 끝 · 고른 것 바로 받음) · 휠 기본 바뀜(모든 화면 · 마) · 공유 파일 `ui_template_locale_common.ts`(가). + +## 6. 시험 · 완료 기준 + +### 6-1. 돌리는 법 + +- CAD 시험 — `cd B07_DesignDetail/openwebcad && npx vitest run --dir ../../resources/tester/cad <이름>`(`keyboard-chain.test.ts` 머리 그대로) · src 단위 — `npx vitest run src/inputController/ime-sink.test.ts` 꼴. +- 타입 — 뿌리 `npm run typecheck` + `npm --prefix B07_DesignDetail/openwebcad run check-types` · 빌드 — `npm --prefix B07_DesignDetail/openwebcad run build`. +- 파이썬 — `./venv/Scripts/python.exe -m pytest resources/tester/<시험> -q`(휠 기본 바뀜 손질 때만). +- 전체 시험 안 돌림(사용자 지시 때만) · 고친 대상 시험만. + +### 6-2. 공용 도우미 `T/helpers/cad-drive.ts`(가-1) + +- `initIdle()`(빈 도면 · 선택 도구로 시작 — 지금 `test/helpers/init-application.ts` 는 LINE 으로 시작해 새 규칙에선 「l」이 거절됨) · `key(k, mods?)` · `type(text)`(글자 + Space) · `typeEnter(text)` · `move(x, y)` · `click(x, y, mods?)` · `press` · `release` · `drag(a, b)` · `rightClick(shift?)` · `middleDouble(x, y)` · `entities(type?)` · `promptLine()` · `noticeLine()` · `activeTool()` · `tick()`. +- 시험 쪽 flatten-js 는 다른 사본 — 점은 앱 코드로만 만들고 숫자로 판정(`keyboard-chain.test.ts:3` 그대로). + +### 6-3. 창마다 새 시험 · 꼭 넣을 줄 + +| 창 | 시험 | 꼭 볼 것 | +|---|---|---| +| 가 | `T/prompt-frame.test.ts` | 맞추기(대소문자 · `_` · kw · en · 사이 길이 · 짧으면 안 맞음 · 숨김 · absent) · 그림(「다음 점 지정 또는 [닫기(C)/명령 취소(U)]:」 · `<10.0000>` · `<변위>`) · 빈 Enter 넷 갈래 · 거절(점 물음 「L」 → 글 · 도구 그대로 · 숫자 「3.2*1.5」 「2m」 · 정수 범위) · 쉼(「R」 「LE」 → 알 수 없는 명령 · 「l」 → LINE · 내 별칭 우선 · SE 없음 · ED) · Esc 한 번 끝 · 우클릭 쉼 반복 · END → 선택 도구(같은 틱) · N1(MOVE 기준점 뒤 `runCommand(CIRCLE)` → 선 1 개 · Ctrl+Z 뒤 같은 id 두 벌 없음) · 엔진(loopFrom · escCommits · pickfirst · 빈 고르기 끝 · when · mode · next · keyword) · 기억 · Ctrl+C → COPYCLIP · Ctrl+글자 안 쌓임 · 가-2(↑↓ · Tab · FROM · M2P · `@` · `#` · END/ENDP · QUA · H11) | +| 가 | `T/prompt-contract.test.ts` | 2-16 | +| 나 | `T/draw-acad.test.ts` | LINE(U · C 둘째부터 · Enter 끝 → 쉼 · Space 반복 · 첫 점 Enter 이음 · Esc 남김) · PLINE(C · U · L · A 접선 호 · CL · Esc 남김) · RECTANG D(기억 · 사분면) · CIRCLE(D · 3P · 2P · 기억 · 한 번 뒤 끝) · POLYGON(E · I/C · 기억 · 2.5 거절) · ARC(C · E · R · A) · ELLIPSE(N10 · C · R) · SPLINE(U · C · Esc 버림) · XLINE(H · V · A · 되풀이) · TEXT(높이 · 각 · 줄 이어 · 빈 줄 끝 · 시작 Enter 앞 글 아래) · MTEXT(H · W) · HATCH(내부 점 · S · U) | +| 다 | `T/modify-acad.test.ts` | OFFSET(처음 <통과점> · 거리 기억 · 되풀이 · E · M · U · T) · FILLET(객체 먼저 · R 기억 · Shift 0 · T · M · U) · CHAMFER(D 기억 · Shift) · TRIM(되풀이 · 반경 밖 무시 · Shift 연장 · R · U · Esc · 사각형 층) · EXTEND(빠른 · Shift 자르기) · BREAK(누른 점 · F · `@`) · LENGTHEN(DE · P · T · 마지막 방식 · 누름 길이) · JOIN · DIVIDE 정수 · MEASURE 끝 · DIST 글 · DIMLINEAR(<객체 선택> · T · H · V) · DIMCONTINUE U | +| 라 | `T/transform-acad.test.ts` | MOVE(D · Enter 변위 · Esc 제자리 끝 · 한 번 뒤 끝 · N1) · COPY(되풀이 · Enter 끝 · O 단일 · A · F · U · E) · ROTATE(누름 한 번 = 각 · C · R `@` · P) · SCALE(누름 거리 · C · R) · MIRROR(Y · N · Enter = N) · STRETCH(걸침 꼭짓점만 · D · Enter) · ARRAY(R = 직사각형 · COU · S · COL · R · X · PO · I · A · F · ROT · Esc 안 만듦) · 고르기 ALL · P · L · 빈 Enter 끝 | +| 마 | `T/mouse-acad.test.ts` | 누름 더함 · Shift 뺌 · 상자 더함/뺌 · 명령 중 끌기 상자 · 스침 · N7 · 그립 누름-뗌 대기 → 다음 누름 놓음 · 끌어 놓음 · 그립 숫자 · H2 문 · 직교 강제(커서 · 누름 · 거리) · 스냅 점은 안 덮음 · Shift 임시 직교 · F3 꺼도 직교 · H9 · 우클릭(쉼 반복 · 명령 중 Enter) · 휠 두 번 범위 · 휠 기본 밂 · ZOOM E · W · P · 2X · `'Z` · 스냅 메뉴 → 한 번 스냅 | + +- 휠 기본 바뀜 손질(마) — `ic/input-wheel.test.ts` · `T/input-prefs-cad.test.ts` · `resources/tester/test_input_prefs.py`(+`helper_input_prefs.cjs`) · `test_app_settings.py` · `test_164_detail_zoom.py`(+helper) · `helper_266_detail_home.cjs` 쓰는 시험 · `test_281_1_drainage_zoom_range.py`(+helper) · `test_244_4` · `_6` · `_8` · `helper_218_1_loupe.cjs` · `helper_230_1_popout_wheel.cjs` · `test_touch_bridge.py` — 방향이 뜻인 시험 = 기대값 뒤집음 · 방향과 무관 = 시험 앞에 pull 박음(그 시험 뜻대로) · 브라우저 띄우는 시험은 돌린 창이 결과만 보고. +- 옛 시험 손질(가) — `keyboard-chain.test.ts`(「선 중 다른 명령 이름은 그대로 명령」 → 거절 · C 뒤 쉼 · 글 바뀜 · `initIdle`) · `ime-sink.test.ts`(「빈 우클릭은 반복 안 함」 → 반복) · `command-catalog.test.ts`(SE · ED). + +### 6-4. 완료 기준(창마다) + +- 맡은 명령마다 1 장 줄대로 물음 글 · 옵션 · 기본값 · 빈 Enter · Esc · 끝난 뒤가 시험으로 확인. +- `prompt-contract` 초록(옵션 선언 ↔ 처리 · ESC) · 고친 대상 시험 + 손질한 옛 시험 초록. +- 타입 검사 둘 · CAD 빌드 성공 · 파일 700 줄 안 · prettier. +- PLAN 해당 줄 「검증완료」 한 줄 · 커밋(`git commit -F`) · `.claude/git-autopush.ps1` · push. +- worker_done 에 화면 확인 거리(1 장 [기] 줄 · 휠 · 그립 · 스냅 메뉴 · ZOOM) — 브레인이 끝에 브라우저 검증. + +## 7. 이번 밖 + +- 'CAL · 식 · QuickCalc 값 넣기 · 단위 꼴(3m · 피트) · 도분초 · 라디안 · 측량 각. +- TK · TT · 좌표 거르개(.X) · 극 추적 각 고르기 · 스냅 종류 끄기 · 켬 상태 기억 · 격자 스냅 · F9 · F11 · F12. +- 우클릭 메뉴(기본 · 편집 · 명령) · 시간차 우클릭 · 명령행 옵션 누르기 · DI ↓ 옵션 목록 · DI 절대/상대 바꾸기(정할 것 18 · 지금 = 절대 그대로). +- 그립 모드 돌림 · 그립 C · B · 여러 그립 · 다기능 그립 메뉴 · 끌어 옮기기 · Ctrl+화살표 · 두 번 눌러 고치기 늘림(N16). +- 고르기 W · C · F · WP · CP · 올가미 · 겹친 것 목록 · 「고른 채 명령」 더 넓히기. +- 1 장 「뺌」 옵션 전부 · 연관 배열 · 경로 배열 · MTEXT 편집기 · 글 자리맞추기 · HATCH 설정 · 3D 옵션 · OFFSET 도면층 · FILLET 폴리선. +- H2 나머지 · H6 · H10 · H12 · N13 · N15 · 명령 단위 되돌림 묶음(LINE 여러 토막을 쉴 때 U 한 번에). +- 다른 CAD · 리습 · 스크립트 · 손가락 몸짓 바꿈 · 토목 전용(비탈 1:n). + +## 8. 근거 쪽 + +- 한국어 도움말 2025 KOR(옵션 이름 · 줄) — LINE `GUID-E8C1190C` · PLINE `GUID-11883C70` · RECTANG `GUID-188B2DDA`(첫 줄 그대로) · CIRCLE `GUID-C60B6D5D` · ARC `GUID-30ECFD30` · POLYGON `GUID-E5CD464D` · ELLIPSE `GUID-45F9C588` · SPLINE `GUID-5E7D51E2` · XLINE `GUID-40650DCE` · OFFSET(2016 KOR) `GUID-C0E4246D` · FILLET `GUID-64F8B700` · CHAMFER `GUID-B1DCF991` · TRIM `GUID-B1A185EF` · EXTEND `GUID-89DD7B0F` · MOVE `GUID-47CE7325` · COPY `GUID-1CF9287F`(두 줄 그대로) · ROTATE `GUID-1C265537` · SCALE `GUID-D4E17E51` · STRETCH `GUID-F000A502` · MIRROR `GUID-595277C8` · ARRAY `GUID-E23F6125` · ARRAYRECT `GUID-BB3DA888` · ARRAYPOLAR `GUID-A6E74297` · BREAK `GUID-36A1CDE0` · JOIN `GUID-4D2A28C3`(줄 그대로) · LENGTHEN `GUID-76C74C62` · DIVIDE `GUID-3427CA9F` · MEASURE `GUID-212933E8` · DIST `GUID-A72EADC7` · TEXT `GUID-D1C664DD` · MTEXT 옵션 `GUID-F94BE932` · DIMLINEAR `GUID-E908848F` · HATCH `GUID-27C104F2` · 명령 입력 `GUID-945C8F74`(주소 꼴 `help.autodesk.com/cloudhelp/2025/KOR/AutoCAD-Core/files/.htm`). +- 키워드 줄임 규칙 — AutoLISP `initget`(2015 ENU `GUID-9ED8841B`) 「LType … LT · LTY · LTYP 됨 · L 모자람 · 대소문자 무관」. +- 거절 글 「점 또는 옵션 키워드를 요구함.」 — 오토캐드 한국어판 사용자 글(gocad.co.kr 질문 · 2차) · 나머지 거절 글 = 영문 기억 옮김. +- 영문 줄 · 동작 = 부록4 K1(E1 · E2 표) · 코드 줄 = 부록4 K2 + 이번 다시 읽음.