diff --git a/docs/raw/조사/2026-10-19_요구280_A_B06정보칸_드롭다운.md b/docs/raw/조사/2026-10-19_요구280_A_B06정보칸_드롭다운.md new file mode 100644 index 000000000..fdb93f3e7 --- /dev/null +++ b/docs/raw/조사/2026-10-19_요구280_A_B06정보칸_드롭다운.md @@ -0,0 +1,184 @@ +# 요구 280 A — B06 횡단 카드 왼쪽 아래 정보 칸(280-1) · 전역 드롭다운 초점(280-6) — 분석 + +분석 = 클로드 에이전트(Opus 5.5 · 읽기만) · 기준 = `main_laptop_1` `b132c893b` · 추정은 (추정). + +## 0. 결론 + +- 280-1 — 왼쪽 아래 칸 = 선 공용 칸(370-3). 처음부터 암이 뜨는 까닭 = 「안 고름 + 암 지반 → 암 칸」 갈래 하나(`B06_Section_UI_Cross_Design_Pick.ts:632`). 고름 저장 · 세션 복원 탓 아님(고름 = 모듈 변수 · 새로고침이면 사라짐). +- 280-1 고침 = 그 갈래 걷음(한 줄) → 안 고르면 빈 칸 · 암 정보는 점선을 눌러 고를 때만. +- B05 우측 횡단 판(393) = 같은 카드 부품이나 발 줄을 통째 걷어 둠 → 화면 변화 없음. +- 280-6 — 드롭다운은 전부 브라우저 기본 `` | +| CAD(openwebcad · iframe · React) | 7 | `RibbonWidgets.tsx:87 · 106 · 135 · 180` · `PropertiesEditor.tsx:53 · 71 · 90` | +| M01 12 · M02 40 | 52 | createSelectField · `el("select")` | + +- 합 ≈ 110 자리 · 모두 기본 `` 는 빈 값 불가 → `data-mixed` 붙여 CSS 로 빈 견본(투명 · 점선 테두리) · 고르면 적용(결정 4-나). +- 색 끌기 중 연발(`paintNowCommitLater` `:54-62`) = 첫 연발에 사본 만들고 이후 그 사본만 칠함 · 멎으면 한 칸 실음. +- 고른 것 있을 때 = 고른 것만 바뀜 · 그리기 기본값 그대로(결정 4-가). +- 점선 판정 = `[]` · `undefined` 모두 실선. + +## 5. 우측 위 오토캐드 안내 글 줄바꿈 + +### ① 지금 동작 + +- 글 = 「오토캐드에서 WBLOCK(또는 DXFOUT)으로 저장 → 파일을 여기로 끌어다 놓기」 · 누르면 ①②③ 세 줄(`src/components/DropHint.tsx:15-21`). +- 자리 = 리본 바로 아래 오른쪽(`App.css:534-552` · `top: title + ribbon + 8px`) · B07 · M02 양식 둘 다. + +### ② 원인 + +- `max-width: 360px`(`App.css:543`) + 줄바꿈 막기 없음 · 글 폭 ≈ 390 px(11 px) → 두 줄 · ①줄도 10 px 로 ≈ 400 px → 두 줄. + +### ③ 고치는 방법 + +- `.cad-drop-hint` = `white-space: nowrap` · `max-width` 걷음(①②③ 줄도 따라감) — 두 줄. +- 안내가 말하는 길 = 끌어다 놓기 → `/api/projects/dxf-clip/file`(`src/integration/dxf-clip-paste.ts:37-43` · `:99-105`) → **M02 [파일 업로드]와 같은 서버 엔진**(아래 6장 표) · WBLOCK 은 도면 일부만 보낼 때만 필요 · 파일 통째도 됨. +- 6장 단추가 생기면 안내는 한 줄로 줄임 추천(결정 5). + +## 6. 삽입 탭 「DWG 불러오기」 + +### ① 지금 동작 — 같은 엔진 두 길 + +| | M02 구조물 조합 · 양식 [파일 업로드] | B07 CAD 끌어다 놓기(이미 있음) | +| --- | --- | --- | +| 화면 | `M02_MasterTemplete/M02_MasterTemplete_Drawing.ts:296-331`(숨은 file 입력 `.dxf,.dwg`) · 보냄 `:145-161` | `src/integration/dxf-clip-paste.ts:37-60` · 끌기 `:88-105` · 붙이기 `prepareClip`(`dxf-clip.ts:24-49`) | +| 서버 | `POST /api/m02/drawing-import`(`M02_MasterTemplete_Router_Drawing.py:57-91`) → `import_frame_file` | `POST /api/projects/dxf-clip/file`(`B07_DesignDetail_Router_Frame.py:193-219`) → `drawing_file_to_entities` | +| 변환 | 둘 다 `_read_drawing_file`(`B07_DesignDetail_Engine_Frame_Import.py:375-385`) — DWG = LibreDWG `dwg2dxf` 별도 실행(동봉 `openwebcad/tools/libredwg/dwg2dxf.exe` · `:334-364` · 180 s) → ezdxf | 같음 | +| 레이어 | 한 층 「도각」으로 몰음(`frame_document` `Engine_Template.py:179-185`) | DXF 층 이름 그대로 · 같은 이름 있으면 그 층 · 없으면 새 층(층 색) | +| 넣는 방식 | 도면 **통째 바꿈** · 저장 전 | 지금 도면에 **더함** · 원좌표 1:1 · 골라진 채 · 되돌리기 한 칸(`addEntities(…, true)`) | +| 권한 | 로그인(`main.py:681` `protected`) | 로그인 + 회사(`main.py:655` `protected_with_company`) · 프로젝트 무관 · 저장 안 함 | +| 한도 | 20 MB · 도형 20,000 · DWG R14 ~ 2018(AC1032) | 같음(`Router_Frame.py:85`) | + +- 읽는 도형 = 선 · 폴리선 · 원 · 호 · 타원 · 스플라인(선분으로) · 점 · TEXT · MTEXT · 블록 · 치수 · 지시선은 풀어서(`:208-261`). +- 버림 = 해치 · 솔리드 · 그림 · 선종류(점선) · 선 두께(모두 1). +- ByLayer 색 도형 = 흰색(`_color` `:64-73`) — 층 색은 새 층에만 실림 → B07 쪽은 오토캐드 도면이 거의 흰색으로 들어옴. +- 시험 `resources/tester/test_b07_dxf_clip.py` 에 DWG 파일 읽기(`REpyo.dwg`)까지 있음. + +### ② 원인 + +- 단추만 없음 — 끌어다 놓기를 모르면 못 씀. + +### ③ 고치는 방법 + +- `src/commands/commands.insert.ts` 에 명령 하나 — 이름 `IMPORT`(오토캐드 같은 이름) · 「DWG 불러오기」 · `run` = 기존 `pickFile('.dwg,.dxf', …)`(`helpers/pick-file.ts`) → 기존 `pasteDrawingFile` + 알림(`dxf-clip-paste.ts:62-68` `reportPaste` 를 내보냄). +- `src/ribbon/ribbon.config.ts:147-148` 삽입 탭 — 새 패널 「가져오기」 큰 단추 하나. +- `command-catalog.json` 한 줄. +- 확정 도면 막기 = `runCommand` 가 이미 막음(`run-command.ts:32`) · 서버 · 변환 · 레이어 · 되돌리기 = 그대로 재사용. +- `pickFile` 입력을 문서에 붙였다 뗌(`hidden`) — 지금은 문서 밖 입력이라 ORCA `upload` 가 못 닿음. +- (결정 6-다) ByLayer 도형 색 = 층 색 — `_entities_with_layers`(`:290-294`) 한 곳 · B07 붙이기 길만 바뀜(M02 양식 그대로). + +## ④ 코더 나눔 + +| 창 | 항목 | 파일 | 모델 | +| --- | --- | --- | --- | +| 가 | 1 · 2 | `entities/TextEntity.ts` · `integration/text-inplace-edit.ts` · 새 `helpers/text-frame.ts` · `drawControllers/screenCanvas.drawController.ts`(691줄 · 늘림 최소) · `inputController/input-controller.ts`(1-다) · `ribbon/Ribbon.tsx` · `components/QuickAccessBar.tsx` · `App.css` `.cad-tool` 줄 | opus high(회전 · 정렬 기하) | +| 나 | 3 · 4 · 5 · 6 | 3장 표 파일 전부 · `components/RibbonWidgets.tsx` · `components/PropertiesEditor.tsx` · 새 `helpers/selection-style.ts` · `components/DropHint.tsx` · `commands/commands.insert.ts` · `ribbon/ribbon.config.ts` · `integration/dxf-clip-paste.ts` · `helpers/pick-file.ts` · `commands/command-catalog.json` · `App.css` `.cad-drop-hint` · 색 견본 줄 · (6-다) `B07_DesignDetail_Engine_Frame_Import.py` | opus medium(되돌리기) | + +- 가 · 나 겹침 = `App.css` 하나(다른 규칙 덩이) — 합칠 때 충돌 적음. +- 3 · 4 를 한 창에 묶은 까닭 = `RibbonWidgets.tsx` · `PropertiesEditor.tsx` · `command-catalog.json` 같은 줄. +- **화면 배치 분석(다른 에이전트)과 겹칠 파일** — `App.css`(1102줄 · 이미 700 넘음) · `ribbon/Ribbon.tsx`(되돌리기 · 다시하기 홈 탭 오른쪽) · `ribbon/ribbon.config.ts`(`QUICK_ACCESS_COMMANDS`) · `components/QuickAccessBar.tsx`(제목 줄 지움) · `components/Toolbar.tsx` · `components/DropHint.tsx`(제목 줄 지우면 `--cad-title-height` 따라 위로 감). +- 같은 요구의 「드롭다운 고른 뒤 초점 남음」 항목 = `RibbonWidgets.tsx` 고르기 상자 · `Ribbon.tsx` 단추와 같은 뿌리(초점 남음) — 그 항목 코더와 같은 창이 좋음. +- 창 수 = 둘(가 · 나) · 배치 코더와 같은 날이면 배치 먼저 합치고 가 · 나가 받은 뒤 시작. + +## ⑤ 시험 · 화면 확인 + +기존 시험(실행 `cd B07_DesignDetail/openwebcad && npx vitest run --dir ../../resources/tester/cad <이름>`): + +| 항목 | 기존 | 새로(같은 폴더) | +| --- | --- | --- | +| 1 | `text-inplace-edit.test.ts` · `text-acad.test.ts` | `text-frame.test.ts` — 왼 · 가운데 · 오른 · 90° · 굵게: 테두리 네 귀 = 입력 칸 left · top · width · height · 회전(배율 2 · 잰 폭 40 모의) | +| 2 | — | (화면으로) | +| 3 | `command-catalog.test.ts` | 같은 파일에 「이름 · 설명에 도면층 · 선가중치 없음」 한 줄 | +| 4 | `src/state.test.ts` | `selection-style.test.ts` — 같은 값 → 그 값 · 다름 · 목록 밖 → 빈 값 · 적용 → 폴리선 자식까지 · Ctrl+Z 한 번 → 옛 값 · 고친 것 없을 때 기본값 | +| 5 | — | (화면으로) | +| 6 | `dxf-clip.test.ts` · `test_b07_dxf_clip.py`(pytest) · `command-catalog.test.ts` | `command-catalog.test.ts` 에 「삽입 탭에 IMPORT」 한 줄 · (6-다) `test_b07_dxf_clip.py` 에 ByLayer 색 한 건 | + +- 타입 = `npm run check-types` · 빌드 = `npm run build`. + +화면(ORCA · CAD 는 iframe — `document.querySelector('iframe').contentWindow` 로 eval): + +| 항목 | 판정(수치) | +| --- | --- | +| 1 | 왼 · 가운데 · 오른 · 돈 글 각각 — 스침 뒤 `__aisloCad.highlighted()` 에 그 글 · 테두리 네 귀(디버그 창구 `debug-hook.ts` 에 글 테두리 한 칸 더함 → `screen()` 로 화면값) 와 더블클릭 뒤 `.cad-text-inplace` `getBoundingClientRect()` 차 ≤ 1 px · 여러 줄 글 = 묶음 줄 모두 강조 | +| 2 | 쉬는 중 「선」 위 마우스 — `[data-active=true]` 1개(선택) · 「선」 테두리색 ≠ 강조색 / 「선」 누름 → Esc → `document.activeElement` 가 `.cad-tool` 아님 · `:focus-visible` 0개 | +| 3 | `document.body.innerText` 에 「도면층」 · 「선가중치」 0 — 홈 탭 · 레이어 관리자 · 왼쪽 탭 · 넘침 메뉴(▾) · LAYER 명령 안내 줄 | +| 4 | 색 다른 선 둘 고름 → 두께 · 선종류 `select.value === ''` · 색 `data-mixed=true` → 두께 3 고름 → 두 선 자식까지 3 → Ctrl+Z 한 번 → 옛 값 · 방금 그린 선 남음 → 고름 풂 → 기본값 그대로 · 바꾼 값 되돌림 | +| 5 | `.cad-drop-hint` 높이 ≤ 한 줄(≈ 16 px) · `scrollWidth ≤ clientWidth` · 펼친 ①②③ 각 한 줄 | +| 6 | 삽입 탭 「DWG 불러오기」 → `orca upload`(붙은 입력) `REpyo.dwg` → 알림 「도형 N개」 · `__aisloCad.selection().length === N` · 새 레이어 · Ctrl+Z 한 번에 빠짐 · 확정 도면에선 막힘 알림 · 끝나면 Ctrl+Z 로 되돌림 | + +## ⑥ 사용자 결정 + +| 번호 | 갈래 | 선택지 | 추천 | +| --- | --- | --- | --- | +| 1-가 | 도각 자리표 칸 글 | 입력 칸도 칸 크기 / 지금처럼 글 폭 | 칸 크기 | +| 1-나 | 잡는 범위 | 글 테두리 안 어디든 스침 · 고름 · 더블클릭 / 지금처럼 기준점 10 px | 테두리 안(끝 글자에서도 강조) | +| 1-다 | 여러 줄 글 스침 | 묶음 전체 강조 / 그 줄만 | 묶음 전체 | +| 2 | 스침 모양 | 바탕색만 / 지금 그대로 | 바탕색만 | +| 4-가 | 고른 것 있을 때 바꾸면 | 고른 것만(오토캐드와 같음) / 기본값도 같이(지금) | 고른 것만 | +| 4-나 | 색 「빈 항목」 | 빈 견본(점선 테두리) / 색 목록 드롭다운으로 바꿈 | 빈 견본 | +| 4-다 | 왼쪽 특성 · 빠른 특성 | 같은 규칙 / 리본만 | 같은 규칙 | +| 4-라 | 같은 되돌리기 흠 명령(COLOR · LWEIGHT · MATCHPROP 등 8개) | 이번에 같이 / 다음 차례 | 이번에 같이(같은 부품 한 줄씩) | +| 4-마 | 글자도 고른 때 | 선 메뉴는 선만 보고 글은 문자 스타일 칸 / 글 색도 선 색으로 | 선만 | +| 5 | 안내 글 | 한 줄로 그대로 / 「DWG · DXF 파일을 끌어다 놓거나 [삽입 → DWG 불러오기]」로 줄임 / 지움 | 줄임 | +| 6-가 | 넣는 자리 | 원좌표 그대로 · 골라진 채(끌어다 놓기와 같음) / 누른 점에 놓기 | 원좌표 그대로 | +| 6-나 | 붙인 도형이 화면 밖 | 그 범위로 화면 맞춤 / 그대로 | 화면 맞춤(기존 `fitView` 재사용) | +| 6-다 | ByLayer 도형 색 | 레이어 색 / 지금처럼 흰색 | 레이어 색 | +| 3 | CAD 밖 B07 안내 글 1곳 | 같이 「레이어」 / 그대로 | 그대로(요구가 「캐드에서」) | + +## ⑦ 위험 + +- 1 — 테두리를 잡는 범위로 쓰면(1-나) 글 밑 선보다 글이 먼저 잡힘 · 줌아웃으로 글이 10 px 아래면 입력 칸만 커짐(최소 글 크기 남김). +- 1 — `getBoundingBox` 는 안 바꿈(줄맞춤 · 그립 · 창 고르기 · 공간 색인) — 바꾸면 영향 넓음. +- 2 — 「나」(초점 테두리)는 추정 — 화면에서 먼저 재현 뒤 판정. +- 3 — 토씨 22곳 · 거울 JSON 빠지면 `command-catalog.test.ts` 빨강. +- 4 — 사본 갈아 끼움 = id 그대로라 고름 유지 · 옮기기 도구와 같은 길 · 새 레이어(DWG)처럼 층 목록은 되돌리기 밖(`state.ts:591`). +- 4 — 되돌리기 흠은 이번 요구 전부터 있던 것 — 고치면 사용자가 겪던 「Ctrl+Z 가 다른 걸 지움」도 사라짐. +- 6 — DWG 단위(mm · m)와 B07 도면 단위가 다르면 크기 어긋남 — 골라진 채라 바로 SCALE · 단위 묻기는 나중. +- 6 — 서버가 파일을 다 읽은 뒤 20 MB 를 잼(M02 와 같음) · 리눅스 서버는 `dwg2dxf` 를 PATH 나 `.env` `LIBREDWG_DWG2DXF_PATH` 로. +- 공통 — `App.css` 이미 1102줄(700 넘음) · 이번 고침은 제자리 바꿈 위주로 늘림 최소 · 배치 코더와 같은 파일.