Files
ParaWiki/Output/reports/ADR-003-architecture-followups.md
minsung d90ef2cfe1
All checks were successful
Publish ParaWiki / build-and-deploy (push) Successful in 29s
ADR-003 후속 아키텍처 결정 추가
12개 주제 병렬 조사 기반 결정 통합:
UI(Leptos+wgpu), IFC(ifc-lite-core), CI/CD(Gitea+GH 미러),
USD(Codeless schema), Alignment 단계 도입, WASM plugin 3단계,
Feature 카탈로그, FEM(MIDAS), LOD 300, 리본 12탭,
선택/필터, 설정 3계층 모델.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 16:42:06 +09:00

293 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: ADR-003
title: cimery 후속 아키텍처 결정 — UI·IFC·CI/CD·USD·Alignment·Plugin·Feature 카탈로그·FEM·LOD·UX
status: accepted
date: 2026-04-14
related-wiki:
- "[[특징 형상 기반 모델링 FBM]]"
- "[[증분형 갱신 알고리즘 LPG]]"
- "[[선형 GIS 기반 좌표계]]"
- "[[PCE 파라메트릭 변경 엔진]]"
- "[[Revit 조립 단위 분류]]"
related-adr:
- "[[ADR-001-tech-stack]]"
- "[[ADR-002-feature-dsl]]"
principles: [비패밀리, 증분, 선형-GIS]
---
# ADR-003 — cimery 후속 아키텍처 결정 (12개 주제)
## 결정 요약표
| # | 주제 | 결정 |
|---|---|---|
| A1 | UI 프레임워크 | **Leptos** (UI) + `<canvas>`**wgpu** (3D 뷰포트) |
| A2 | IFC 라이브러리 | **이원 전략** — 런타임 `ifc-lite-core`, 검증 `IfcOpenShell` |
| A3 | 빌드·배포 파이프라인 | **하이브리드 B** — Gitea 메인 CI, GitHub Actions 미러로 Win/macOS 빌드·서명. 중기 Cloudflare R2/Worker |
| A4 | USD 스키마 매핑 | **Codeless USD Applied API Schema** (`CimeryBridgeAPI` 등) + IFC alias 이중 태깅 |
| A5 | LandXML·IFC Alignment import | **단계 도입** — MVP 자체 포맷만 / v1.1 LandXML 자체 파서 / v2 IFC 4.3 |
| A6 | WASM plugin 승격 | **3단계** — MVP 내부 모듈 / v2 **Extism** / v3 **Component Model (WIT)** |
| B7+B8 | Feature 카탈로그 + 파라미터 | Must 6 (거더·슬래브·교각·교대·받침·선형) / Should 3 / Won't 철근·사장·현수 |
| B9 | FEM 연동 | **하이브리드 단계** — MVP MIDAS Civil NX API export / v2 IFC SAV 2.0 / v3 간이 빔·프레임 내장 |
| B10 | LOD·렌더 | **BIM LOD 300 고정** + graphics LOD = discrete 2단 + 동적 tessellation. v2 meshlet. |
| C11 | 리본·패널 레이아웃 | **12탭 구성** (Home·Alignment·Structure·Feature·Site&GIS·Annotate·Analyze·Construction·Insert·View·Manage·Modify) + contextual 탭 |
| C12 | 선택·필터 | Category = **Feature kind**. cimery 고유: 선형 스테이션 선택·규칙 선택·영향권 하이라이트 |
| C13 | 사용자 설정 | **VS Code 3계층 모델** (Default→User→Project→Project.local) JSON. 좌표계·tolerance는 Project 잠금 |
---
## A1. UI 프레임워크 — Leptos + wgpu
**결정:** UI 셸은 **Leptos**, 3D 뷰포트는 `<canvas>`**wgpu** 직접 렌더.
**근거**
- Tauri v2는 본질상 WebView 기반 → Leptos 하나로 PWA·Tauri 양쪽 커버. 자산·패키징 단일화.
- Revit식 복잡 UI(리본·도킹·트리·속성창·IME·접근성)는 HTML/CSS 생태계 재사용이 현실적. egui의 immediate mode는 커스텀 위젯 비용 누적.
- Leptos의 **fine-grained reactivity**는 [[증분형 갱신 알고리즘 LPG]]의 부분 전파 모델과 정합.
- egui(이미 wgpu 통합 강점)도 고려했으나 **다국어·리본·속성창 밀도·Tauri/PWA 공유** 면에서 열세.
**기각:** Yew(VDOM 오버헤드·둔화), Dioxus(후보지만 Leptos 우위), egui(위 이유).
---
## A2. IFC 라이브러리 — 이원 전략
**결정:**
- **런타임(Rust+WASM):** `ifc-lite-core` (louistrue) — IFC4X3 스키마 876 엔티티, IFC5/IFCX 알파, WASM 일급 타깃.
- **검증·참조 구현(개발 파이프라인 전용):** `IfcOpenShell`.
**근거**
- `ifc_rs`는 알파·정체, Alignment/Bridge 미지원.
- IfcOpenShell LGPL은 WASM 배포에 까다로워 런타임 의존 비권장.
- 어댑터 레이어로 감싸 단일 유지보수자 리스크 격리 — 향후 교체 가능.
---
## A3. 빌드·배포 파이프라인 — 하이브리드 B
**결정:**
- **단기(MVP~v1):** Gitea Actions가 main CI(소스·PR·웹 배포), **GitHub Actions 미러**가 Windows/macOS Tauri 빌드·서명·릴리스 담당. 자동업데이트는 GitHub Releases 호스팅 `latest.json`.
- **중기:** Cloudflare **R2 + Worker**로 아티팩트·업데이터 엔드포인트를 자체 인프라로 회수.
**구성 요소**
- **Tauri v2 updater:** Ed25519 키쌍, `.sig` + `latest.json`, 개인키는 CI 시크릿.
- **Windows 서명:** **Azure Trusted Signing** 우선 (EV 하드웨어 토큰 불필요).
- **macOS 서명:** Apple Developer ID + notarization.
- **채널:** `nightly` / `beta` / `stable` = Git 태그 prefix + 별도 `latest-{channel}.json`.
- **웹(PWA):** 기존 Cloudflare Pages 확장 — `cimery-web.pages.dev`.
**기각:** Pure Gitea(macOS 러너·matrix 제약 부담), CrabNebula Cloud(벤더 락인, MVP 불필요).
---
## A4. USD 스키마 매핑 — Codeless Applied API Schema
**결정:** cimery 고유 개념을 **codeless USD applied API schema**로 정의하고, IR → USD evaluator가 Prim 단위 증분 export.
**핵심 매핑 (초안)**
| cimery Feature | USD Prim | Applied API |
|---|---|---|
| Alignment | `UsdGeomBasisCurves` | `CimeryAlignmentAPI` (stations·designSpeed·cantRef) |
| Bridge | `Xform` (`kind=assembly`) | `CimeryBridgeAPI` |
| Girder | `Xform` + child `Mesh` | `CimeryGirderAPI` (sectionType·spanLength·materialGrade) |
| Pier / Abutment | `Xform` + `Mesh` | `CimeryPierAPI` / `CimeryAbutmentAPI` |
| Bearing | `Xform` + `Mesh`, v2 `UsdPhysicsJoint` | `CimeryBearingAPI` |
| Deck Slab | `Mesh` | `CimeryDeckAPI` |
| Material | `UsdShade.Material` + MDL + UsdPreviewSurface | — |
| Coord / GIS | Root `Xform` | `CimeryGeoRefAPI` (EPSG·origin·rotation) |
**규칙**
- **이중 태깅:** 같은 Prim에 `CimeryGirderAPI` + `IfcGirder` 커스텀 속성 동시 적용 → AOUSD·IFC5 공식 스키마 등장 시 1-shot alias/migration.
- **Alignment 3층 보존:** 평면·종단·편경사를 sibling prims(`/Align/Horizontal`·`/Vertical`·`/Cant`)로 분리 `over`.
- **Assembly + Payload:** Bridge = `assembly`, Girder = `component`. 대형 모델은 payload로 lazy load.
- **파라메트릭 종속은 USD에 내보내지 않음** — derived geometry만. 규칙은 DSL IR에 유지 (ADR-002 재확인).
---
## A5. LandXML · IFC 4.3 Alignment import — 단계 도입
**결정:**
- **MVP (v0.1):** import 미구현. **자체 JSON 포맷만** 공식 입력 (ADR-002 R).
- **v1.1:** **LandXML 자체 파서** (`quick-xml` 기반). 범위: `<Alignment><CoordGeom>` 수평 + `<Profile>` 종단. 스파이럴은 polyline tessellation 수용.
- **v2:** **IFC 4.3 Alignment**`ifc-lite-core`(A2) 활용, 부족 시 fork. 수평·종단·캔트만 매핑.
**근거**
- 거더교 본질은 **내부 파라미터 복잡도**(ADR-002 배경) — 선형 입력 품질이 MVP 차별점 아님.
- IFC 4.3 Alignment 실무 라운드트립 2026년 아직 미성숙(Civil 3D·OpenRoads 모두 부분 지원).
- LandXML이 실무 교환 빈도·자체 구현 부담에서 우위.
---
## A6. WASM plugin 승격 — 3단계 경로
**결정:**
1. **MVP~v1:** 내부 Rust 모듈. WASM 승격 보류. IR/DSL 안정화 선행.
2. **v2:** **Extism** 얇은 래퍼 (`cimery-plugin` crate). Feature trait → Extism host 함수 매핑. `#[param(...)]` 메타를 WIT 유사 스키마로 export. Tauri + PWA 듀얼 (`webxtism`).
3. **v3:** **Component Model + WIT** 마이그레이션. `GeomKernel`·`Feature` 인터페이스 표준화. ABI 레이어만 교체.
**승격 게이팅 기준 (셋 다 충족 전엔 내부 모듈 유지)**
- (a) 써드파티/사내 별도 팀이 Feature 공급 실수요 발생
- (b) 핵심 Feature 10개 이상 안정화
- (c) salsa query 경계와 plugin 경계 일치
---
## B7+B8. Feature 카탈로그 + 파라미터 구조
### MoSCoW 우선순위
| 우선순위 | Feature |
|---|---|
| **Must (MVP v1)** | Girder · Deck Slab · Pier · Abutment · Bearing · **Alignment**(입력) |
| **Should (v1.1)** | Cross Beam / Diaphragm · Expansion Joint · Parapet / Barrier |
| **Could (v2)** | Pile Cap / Foundation · Approach Slab · Drainage · Sign Mount |
| **Won't (v3+)** | **Rebar / Tendon** · Cable-stay · Suspension · Arch · Truss · Moveable |
### Must Feature 파라미터 (발췌)
**Girder:** `alignment_ref`, `station_start/end`, `offset_from_alignment`, `section_type` (PSC_I·PSC_U·Steel_Box·Steel_Plate_I), `section` (composite: height·flange·web·haunch 등), `camber`, `material`, `count_per_span`, `spacing`.
**Deck Slab:** `alignment_ref`, `station_start/end`, `width_left/right`, `thickness`, `haunch_depth`, `cross_slope`, `overhang_left/right`.
**Pier:** `station`, `skew_angle`, `type` (Wall·Single_Column·Multi_Column·Hammerhead·Portal), `column_count/spacing`, `column_section`, `height`, `cap_beam` (composite), `foundation_level`.
**Abutment:** `station`, `skew_angle`, `type` (Reverse_T·Counterfort·Wall·Semi_Integral·Integral), `parapet_wall`, `breast_wall`, `wing_wall_left/right`, `footing`, `bearing_seat_level`.
**Bearing:** `station`, `girder_ref`, `support_ref`, `type` (Elastomeric·Pot·Spherical·Rocker·Fixed·Expansion_Uni/Bi), `capacity_vertical/horizontal`, `plan_dimension_x/y`, `total_height`, `anchor_bolt`, `installation_level`.
단위: 구조물 `Mm`, 선형 `M` (ADR-002 C).
---
## B9. FEM 연동 — 하이브리드 단계
**결정:**
- **MVP (v1):** **MIDAS Civil NX API** 한방향 export. 국내 설계자 즉시 채택 가능. cimery = 모델링, MIDAS = 해석의 역할 분담.
- **v2:** **IFC 4.3 Structural Analysis View 2.0** export 병행. Robot·SOFiSTiK·Dlubal 커버. `AnalysisExport` trait 추상화.
- **v3+:** **간이 빔·프레임 내장 solver** (`fenris` + `diffsol`). 실시간 피드백(자중 처짐 등)용. 본격 해석은 외부 위임 유지.
**근거**
- [[PCE 파라메트릭 변경 엔진|PCE]] 교훈: 변환 지점이 많을수록 파라메트릭 논리가 죽음. 내장이 이상적이나 MVP 리스크 과대.
- Rust FEM 생태계(2026-04)는 연구/2D 수준, 교량 실무용 성숙도 부족.
- MIDAS는 Python/Grasshopper 연동 사례 풍부, HTTP/FFI로 호출 가능.
---
## B10. LOD · 렌더 전략
**결정:**
- **BIM LOD:** **MVP = LOD 300 고정** (설계자 인도·수량 산출 가능). LOD 350/400은 v2, 철근은 v2+.
- **Graphics LOD:** **discrete 2단 (근·원) + 동적 tessellation (편집 Feature만 고해상도)** 하이브리드.
- **컬링·인스턴싱:** Frustum culling + per-Feature instancing(동일 세그먼트 거더). `UsdGeomBasisCurves`가 아닌 인스턴스는 LRS station 기반 인스턴스 버퍼.
- **클리핑:** WebGPU `clip-distances` 기반 단면(section) — 교량 종단 단면 필수 UX.
- **메모리:** Memory64(Chrome) 전제로 웹 4GB+ 확보. 원본 B-rep은 데스크톱만 상주, 웹은 tessellated mesh + Feature 메타만.
- **v2:** meshlet (Nanite-like) 파이프라인. 교량 군·도심 회랑 단위.
**기각:** MVP에서 meshlet 전면 도입 (`nanite-webgpu` 가능성 입증되나 `atomic<u64>` 미지원·SW raster 복잡도로 MVP 부담).
---
## C11. 리본·패널 레이아웃
### 기본 워크스페이스
```
┌── QAT + 앱 메뉴 + Info Center ────────────────────┐
├── Ribbon (탭 + 패널) ────────────────────────────┤
├Properties (좌상) ─┬── Drawing Area ──┬─(도구)────┤
├Project Browser │ ViewCube(우상) │ │
├─(좌하) │ Nav Bar │ │
└── View Control Bar + Status Bar ────────────────┘
```
### 리본 탭 12개
| 순서 | 탭 | 용도 |
|---|---|---|
| 1 | **Home** | Select · Create · Modify 시작 허브 |
| 2 | **Alignment** | 선형·프로파일·측점·단면 |
| 3 | **Structure** | Girder · Pier · Abutment · Deck · Bearing |
| 4 | **Feature** | FBM 피처 라이브러리 · Place · DSL Editor |
| 5 | **Site & GIS** | 지형 · CRS · GIS import · Geo-reference |
| 6 | **Annotate** | 치수 · 태그 · 텍스트 · 심볼 |
| 7 | **Analyze** | 수량 · 간섭 · 리포트 |
| 8 | **Construction** | 단계 · 공정 · 4D · Shop Drawing · (Rebar v2) |
| 9 | **Insert** | IFC/LandXML link · CAD import · Point cloud |
| 10 | **View** | 2D/3D 뷰 · Sheet · Visibility |
| 11 | **Manage** | Project Info · Units · Standards · Shared Params |
| 12 | **Modify** | (contextual; 항상 맨 오른쪽) Clipboard · Geometry · Modify |
**contextual 탭:** Civil 3D식. 거더 선택 → "Modify | Girder" 탭이 Modify 오른쪽에 자동 활성화.
**단축키 관습 유지:** Esc·VG·WT·ZE·SD 등 2글자 키인, 탭 더블클릭 → 리본 최소화.
---
## C12. 선택 · 필터 개념
### Revit ↔ cimery 대응
| Revit | cimery | 비고 |
|---|---|---|
| Element | **Feature instance** (IR 노드) | 규칙 결과물 |
| Category | **Feature kind** (Rust 타입) | `#[param]` 메타에서 자동 추출 |
| Type(패밀리 타입) | **Feature template** (struct + 파라미터 세트) | CSV 라운드트립 단위 |
| Tab 호버 순환 | composite 트리 상하 순환 (2단 결정적) | 그래프 금지 → 모호성 0 |
| Selection Filter (수동) | **Named selection set** (JSON) | Git diff 가능 |
| Rule-based Filter | **Parameter predicate** (`flange_thickness > 180mm`) | 타입 안전 질의 |
| View Filter | **View preset** (filter + 오버라이드, TOML) | AI·diff 친화 |
| Temporary Hide / Isolate | 동일 UX | 세션 한정 |
### cimery 고유 확장
1. **선형 기반 선택** — "스테이션 120180 m 구간의 모든 Girder".
2. **규칙 선택** — 생성 규칙 자체를 selector로 재사용.
3. **영향권 하이라이트** — salsa 의존성 그래프로 "이 파라미터 변경 시 무효화될 Feature" 시각화.
4. **Tab 범위 명시** — 2단 계층이므로 `instance ↔ composite parent` 2상태 토글.
---
## C13. 사용자 설정 — VS Code 3계층 모델
### 저장 레이아웃
```
~/.cimery/settings.json # User (전역, 장비별)
~/.cimery/keybindings.json # 키맵 분리
<project>/.cimery/settings.json # Project (Git 커밋)
<project>/.cimery/settings.local.json # 개인 override, .gitignore
```
**병합 순서:** Default ← User ← Project ← Project.local.
### 허용/제한 범주
| 범주 | 스코프 | 허용도 |
|---|---|---|
| 키맵 | User | 완전 허용 (Revit 기본값 + override) |
| 휠 방향·감도 | User | 허용 (반전 토글 + 계수 0.254.0) |
| 테마·언어·폰트·UI 스케일 | User | 허용 |
| 최근 파일·창 레이아웃 | User (state) | 자동 저장 |
| **표시 단위** | Project 기본 + User override | 설계 일관성 |
| 좌표계·선형 CRS·LRS | **Project 전용 (잠금)** | 데이터 무결성 |
| tolerance · snap | **Project 전용 (잠금)** | 재현성·솔버 결과 |
| 자동저장 주기 | User | 허용 |
| 텔레메트리 · 업데이트 채널 | User (global only) | 워크스페이스 override 금지 |
### 안전장치
- UI에 Project 전용 항목 잠금 표시.
- 키맵 충돌 검출기 (Revit 기본값 덮어쓸 때 경고).
- `"$schema"` · `"version"` 필드 초기부터 포함(마이그레이션 대비).
---
## 후속 결정 필요
- [ ] 첫 Feature 엔드-투-엔드 프로토타입 (Girder · DSL → IR → 기하 → USD)
- [ ] Revit 조작 관습 표 `raw/tools/revit/` 수집
- [ ] IFC 5 + USD 전환 자료 `raw/standards/` 수집 (ADR-002에서 이미 예정)
- [ ] MIDAS Civil NX API 접근 권한·개발 키
- [ ] WASM plugin 승격 게이팅 기준 달성 시점 감시
## 검토 시점
- 첫 Girder 엔드-투-엔드 동작 시 ADR 전체 재검토.
- AOUSD AECO 스펙 발표(2026~27 예상) 시 A4 재검토.
- Component Model 브라우저 성숙(~2027-2028) 시 A6 v3 승격.
- IFC 4.3 Alignment 실무 라운드트립 성숙 시 A5 조기 도입.