1fcbf14ed8
feat(ui): #4 핵심 — 인라인 로그 제거 + InlinePanel 12 popup 인라인화
...
CI / Ruff + Test (Py3.11 + Py3.13) (3.11) (push) Successful in 22s
CI / Ruff + Test (Py3.11 + Py3.13) (3.13) (push) Successful in 22s
사용자 명시 요청 (#4 잔여 핵심):
"기존 구조에 지도 아래에 있는 로그는 백엔드로 빼고, 프로세스를 클릭할 때마다
새로운 창이 뜨는 것이 아니라 한 화면에서 바로 구동되게끔 적용".
1. 인라인 로그 패널 완전 제거:
- self.textbox CTkTextbox 위젯 제거 (이전 라운드 80px 축소 → 본 라운드 완전 삭제).
- main_frame layout: row 0 weight 3→1 (지도 전체 차지), row 1 (로그) 제거,
status_bar row 2→1.
- self.log() 동작 변경: textbox.insert 대신 백엔드 logger.info (logs/scanvas.log
RotatingFileHandler 5MB×5). status_text 가 짧은 미리보기 (≤80자) 즉시 표시.
- 효과: 메인 캔버스 영역 ~25% 확대 + GUI 메인 thread 부담 감소.
2. harness/inline_panel.py 신규 (231 LOC):
- InlinePanel: ctk.CTkToplevel 호환 인라인 오버레이 (CTkFrame 상속).
- API 호환: title/geometry/transient/grab_set/protocol/wait_window/destroy +
iconbitmap/wm_* no-op.
- 핵심 트릭: tk.Misc.wait_window(self) 가 Frame 에서도 동작 (widget destruction
대기) — wait_window 호출 5곳 (T1/T6/T7/T8/T10) 그대로 유지 가능.
- 다중 패널 z-order (_z_counter + lift), main_frame 95% cap, MC Red 타이틀 바.
3. 12 ctk.CTkToplevel → InlinePanel 일괄 치환:
- T1 (DXF 레이어), T2 (구조물 빌드), T3 (빌드 진행), T6 (상세도면), T7 (치수),
T8 (계획선 고도), T9 (TIN core), T10 (렌더 옵션), T11 (Blender 결과),
T12 (AI 렌더 결과) — 10 main popups.
- T4 (렌더 sub-옵션), T5 (VLM 결과) — T3 자식 popups.
- 2 replace_all 패턴: ctk.CTkToplevel(self) → InlinePanel(self),
ctk.CTkToplevel(win) → InlinePanel(win).
- 결과: 12 popups 모두 main 창 안 floating frame 으로 렌더, 별도 OS 창 안 뜸.
사용자가 ALT-TAB 으로 창 사이 오갈 필요 없음.
검증:
- py_compile + AST OK (scanvas_maker, perf, crash_logger, inline_panel 4개).
- ruff check All checks passed (0 errors).
- import smoke test: scanvas_maker import 성공, InlinePanel 가 진짜 harness 클래스로 로드.
- self.textbox 잔존 refs: 0. CTkToplevel refs: 3 (모두 import fallback/주석).
InlinePanel refs: 15 (12 호출지 + import).
잔여 (#4 next round, multi-session):
- InlinePanel 실 GUI 워크플로 검증 (사용자 도면 로드 후 T1~T12 한 번씩).
- VTK 임베딩 (pv.Plotter().show() 6곳 → pyvistaqt.QtInteractor).
- messagebox 63회 → 인라인 토스트.
- Inspector 패널 영구 컬럼 (3-column 레이아웃).
- 메인 thread 블로킹 작업 worker thread 분리.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-08 17:33:45 +09:00
fc963007b7
fix(ci): uv lock 생성 + setup-uv 옵션 정리 + UI 진행률 인디케이터 ( #6 , #4 부분)
...
CI / Ruff + Test (Py3.11 + Py3.13) (3.11) (push) Successful in 23s
CI / Ruff + Test (Py3.11 + Py3.13) (3.13) (push) Successful in 23s
CI uv setup 실패 (#6 후속):
- 원인: astral-sh/setup-uv@v3 의 enable-cache:true 가 **/uv.lock 미발견 시 fail.
7개 push 모두 ::error::No file ... matched to [**/uv.lock] → 10-20초 만에 abort.
- 해결: uv.lock 생성 (438KB, 89 packages 해결) + cache-dependency-glob 명시.
연쇄 수정 (uv.lock 생성 과정에서 노출):
- pyproject.toml: scipy/pyproj/numpy 핀을 hard-pin == 에서 range > = 로 완화
(base vs [py313] extras 충돌 해소). requires-python ">=3.9" → ">=3.11"
(pyproj>=3.7 wheel 가용 환경과 일치). [tool.uv] no-progress = false 제거 (deprecated).
- .gitea/workflows/ci.yml: 별도 Setup Python step 제거 (uv venv가 자동 fetch),
install step 단순화 (matrix 분기 EXTRAS 변수), 모든 run: 에 shell: bash 명시.
UI 진행률 인디케이터 (#4 부분):
- self.progress_bar (CTkProgressBar mode=indeterminate, MC overlap orange #FF5F00)
status_bar 우측에 hidden 배치. start_progress(label)/stop_progress() 메서드 추가.
- self.textbox height 120 → 80 (인라인 로그 비중 축소, 백엔드 파일이 주 기록처).
ruff cleanup (harness/perf.py):
- Optional[Callable[...]] → Callable[...] | None (UP045).
- try/except/pass → contextlib.suppress (SIM105).
- 미사용 # noqa: BLE001 제거 (RUF100).
검증: uv lock 성공, ruff check All checks passed, py_compile + AST OK.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-08 17:13:33 +09:00
470020cf57
Phase 1 ( #11 ): perf instrumentation — harness/perf.py + 3 hotspot wraps
...
CI / Ruff + Test (Py3.11 + Py3.13) (3.11) (push) Failing after 10s
CI / Ruff + Test (Py3.11 + Py3.13) (3.13) (push) Failing after 10s
신규 모듈 — harness/perf.py (54 LOC):
- perf_block(label) 컨텍스트 매니저 — 블록 단위 wall-clock + CPU 시간을 ms 단위로 측정.
- set_perf_log(sink) — 외부 sink 등록 (예: app.log). 등록 후 [PERF] 라인이 logger
외에도 그 sink 에 라우팅됨.
- 출력 형식: [PERF] {label}: wall={NN}ms cpu={NN}ms ({CPU|I/O/Net}-bound).
- cpu/wall > 0.5 면 CPU-bound 로 분류, 그 외 I/O/Net-bound (GIL 풀린 시간 비율).
Setup — scanvas_maker.py 2곳:
- import 블록 (~line 58): from harness.perf import perf_block, set_perf_log;
ImportError 시 contextlib.contextmanager 노옵 폴백 (모듈 누락 환경 대응).
- SCanvasApp.__init__ (~line 613): set_perf_log(self.log) 등록.
Hotspot wraps — scanvas_maker.py 3곳 (PERFORMANCE_BASELINE.md 매핑):
- TIN densify Phase C (line ~4430) → H3: with perf_block("TIN densify Phase C (10m→1m)").
- 위성 타일 다운로드 (line ~5384) → H1: with perf_block("위성 타일 다운로드+병합").
- 제어맵 캡처 x3 + composite (line ~5864) → H12: with perf_block("control map capture x3 + composite").
검증:
- python -m py_compile scanvas_maker.py harness/perf.py 통과.
- AST parse OK (39 top-level statements).
- ruff Green 정식 검증은 글로벌 ruff 설치 후 (uv pip install -e ".[dev]"; ruff check).
CHANGELOG.md 에 #11 perf instrumentation 항목 추가 (2026-05-08).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-08 16:45:15 +09:00
e9cc6bfcf4
Phase 0 of expert feedback (#1~#11): infrastructure + design + 1차 fixes
...
Implementations (즉시 동작):
- #1 crash logging: harness/crash_logger.py (sys.excepthook + threading +
faulthandler, 회전 파일 logs/scanvas.log). main 진입점 통합.
- #2 smooth curves (1차): gate_3d_builder ogee profile를 arc-length parametric
CubicSpline로 4× densify (8pt→32pt, 36→132 cells, 60 FPS 안전).
- #3 TIN colormap: matplotlib "terrain"의 파란색 범위 제거 → 짙은갈색→황토→
모래→능선 LinearSegmentedColormap. 9 사이트 교체. 회귀 테스트 추가.
- #5 uv: pyproject.toml + UV_GUIDE.md. base/[py313]/[dev]/[build] extras + hatchling.
- #6,#7,#8 dev cycle infra: .pre-commit-config.yaml (ruff+secrets+위생),
.gitea/workflows/ci.yml (Py3.11+3.13 matrix), tests/test_regressions.py
(18 회귀 테스트, iter=1~7 fix 박제), CONTRIBUTING.md (Red→Green 알고리즘).
Design docs (다음 세션 마이그레이션 청사진):
- #4 UI/UX 전면 수정: UI_REDESIGN_PLAN.md (12 popup→1 inspector, vtkTkRenderWidget
embedding 게이트, 4 phase × 7 sessions).
- #10 Core/Plugin: ARCHITECTURE_PLAN.md (Core 14 / Plugin 7 구조물 + 2 렌더 + 1 QA,
STRUCTURE_REGISTRY 확장, manifest 기반 디스커버리).
- #11 perf hotspots: PERFORMANCE_BASELINE.md (19 핫스팟, P1: 타일 직렬DL 5~30s,
캡처 직렬 4.5~15s, numpy 벡터화 가능 Python loops, 텍스처 4회 반복read).
Behavior preservation: ruff 0 errors, pytest 17 passed/1 skipped(bpy),
import 33/33 OK on Py3.13.13.
Item #2 P2/P3 곡선, #4 UI 마이그레이션, #10 Phase 1 추출, #11 P1 최적화는 차기 세션.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-08 11:45:30 +09:00
b9342f6726
Import S-CANVAS source + iter=1~7 lint cleanup
...
S-CANVAS (Saman Corp.) — DXF + DEM + AI 기반 3D 조감도 생성 엔진.
~24k LOC Python (scanvas_maker.py 7072 LOC GUI + 구조물 파서/빌더 다수).
이 커밋은 7-iter cleanup이 적용된 상태로 import:
- F821 8 + B023 6: 비동기 lambda + except/loop 변수 캡처 NameError
(Py3.13에서 reproduce 확인된 진짜 버그)
- RUF012 4 + RUF013 1: ClassVar / implicit Optional 명시화
- F811/B905/B904/F401/F841/W293/F541/UP/SIM/RUF/PLR 700+ cleanup/modernization
신규 파일:
- ruff.toml: target=py313, Korean unicode/저자 스타일/도메인 복잡도 무력화
- requirements-py313.txt: pyproj>=3.7, scipy>=1.14, numpy>=2.0.2 (Py3.13 wheel)
- .gitignore: gcp-key.json, 캐시, 백업, 생성 이미지 제외
검증: ruff 0 errors, py_compile 0 errors, import 33/33 OK on Py3.13.13.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-08 10:29:08 +09:00