From d90ef2cfe1beb0cc77e7cb758f4daa3ba289db09 Mon Sep 17 00:00:00 2001 From: minsung Date: Tue, 14 Apr 2026 16:42:06 +0900 Subject: [PATCH] =?UTF-8?q?ADR-003=20=ED=9B=84=EC=86=8D=20=EC=95=84?= =?UTF-8?q?=ED=82=A4=ED=85=8D=EC=B2=98=20=EA=B2=B0=EC=A0=95=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .../reports/ADR-003-architecture-followups.md | 292 ++++++++++++++++++ wiki/log.md | 1 + 2 files changed, 293 insertions(+) create mode 100644 Output/reports/ADR-003-architecture-followups.md diff --git a/Output/reports/ADR-003-architecture-followups.md b/Output/reports/ADR-003-architecture-followups.md new file mode 100644 index 0000000..4dba59d --- /dev/null +++ b/Output/reports/ADR-003-architecture-followups.md @@ -0,0 +1,292 @@ +--- +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) + `` 위 **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 뷰포트는 `` 위 **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` 기반). 범위: `` 수평 + `` 종단. 스파이럴은 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` 미지원·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. **선형 기반 선택** — "스테이션 120–180 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 # 키맵 분리 +/.cimery/settings.json # Project (Git 커밋) +/.cimery/settings.local.json # 개인 override, .gitignore +``` +**병합 순서:** Default ← User ← Project ← Project.local. + +### 허용/제한 범주 + +| 범주 | 스코프 | 허용도 | +|---|---|---| +| 키맵 | User | 완전 허용 (Revit 기본값 + override) | +| 휠 방향·감도 | User | 허용 (반전 토글 + 계수 0.25–4.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 조기 도입. diff --git a/wiki/log.md b/wiki/log.md index cd89f53..adbbb38 100644 --- a/wiki/log.md +++ b/wiki/log.md @@ -8,6 +8,7 @@ --- +- 2026-04-14 meta — ADR-003 후속 아키텍처 결정 작성. 12개 주제 병렬 조사 기반: UI(Leptos)·IFC(ifc-lite-core)·CI/CD(Gitea+GH 하이브리드)·USD(Codeless schema)·Alignment·Plugin(Extism→WIT)·Feature 카탈로그·FEM(MIDAS)·LOD 300·리본 12탭·선택/필터·설정 3계층. - 2026-04-14 meta — ADR-002 Feature DSL 아키텍처 작성 (Output/reports/). cimery DSL·IR·salsa·evaluator·Excel 라운드트립 등 20개 기본 결정. - 2026-04-14 meta — Cloudflare Pages 자동 배포 워크플로 추가 (.gitea/workflows/publish.yml). Quartz 4 빌드 → parawiki.pages.dev. - 2026-04-14 create [[선형 GIS 기반 좌표계]] — IfcAlignment·LRS·Geo-BIM 컴파일. 원칙: 선형-GIS.