From d969013bf7115960274b54480f06ac167224b982 Mon Sep 17 00:00:00 2001 From: learncold Date: Tue, 7 Apr 2026 01:54:26 +0900 Subject: [PATCH 1/2] =?UTF-8?q?docs=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/lightweight-task.yml | 2 +- AGENTS.md | 9 +- README.md | 55 +++ docs/README.md | 28 ++ ...5\355\212\270 \352\265\254\354\241\260.md" | 0 docs/{ => process}/GitHub Project.md | 0 docs/{ => product}/Product Backlog.md | 4 +- .../\352\260\234\354\232\224\354\204\234.md" | 2 +- ...4\355\204\260 \354\241\260\354\202\254.md" | 0 ...4\355\227\230 \354\240\225\354\235\230.md" | 0 ...er_MassMotion_\354\241\260\354\202\254.md" | 75 ---- ...34\355\206\240\353\246\254\354\226\274.md" | 0 ...34\353\202\230\353\246\254\354\230\244.md" | 144 ------- ...40\354\202\254\354\240\234\355\222\210.md" | 87 ---- .../Product_Backlog_2\355\214\200.docx" | Bin 49186 -> 47267 bytes ...4\355\221\234_\353\214\200\353\263\270.md" | 0 ...352\262\275 \354\226\221\354\213\235.docx" | Bin ...4\353\260\234 \355\231\230\352\262\275.md" | 382 ++++++++++++++++++ ...54\232\224\354\204\234_2\355\214\200.docx" | Bin 37236 -> 36688 bytes ...54\235\230\354\204\234_2\355\214\200.docx" | Bin 39365 -> 38945 bytes 20 files changed, 474 insertions(+), 314 deletions(-) create mode 100644 README.md create mode 100644 docs/README.md rename "docs/\354\204\244\352\263\204 \352\265\254\354\241\260.md" => "docs/architecture/\355\224\204\353\241\234\354\240\235\355\212\270 \352\265\254\354\241\260.md" (100%) rename docs/{ => process}/GitHub Project.md (100%) rename docs/{ => product}/Product Backlog.md (99%) rename "docs/\352\260\234\354\232\224\354\204\234.md" => "docs/product/\352\260\234\354\232\224\354\204\234.md" (97%) rename "docs/\352\263\265\352\260\234 \354\204\261\353\212\245 \352\262\200\354\246\235 \353\215\260\354\235\264\355\204\260 \354\241\260\354\202\254.md" => "docs/product/\352\263\265\352\260\234 \354\204\261\353\212\245 \352\262\200\354\246\235 \353\215\260\354\235\264\355\204\260 \354\241\260\354\202\254.md" (100%) rename "docs/\354\234\204\355\227\230 \354\240\225\354\235\230.md" => "docs/product/\354\234\204\355\227\230 \354\240\225\354\235\230.md" (100%) delete mode 100644 "docs/references/Pathfinder_MassMotion_\354\241\260\354\202\254.md" rename "docs/Qt Widgets Designer \354\264\210\352\270\260 \354\204\270\355\214\205 \355\212\234\355\206\240\353\246\254\354\226\274.md" => "docs/references/Qt Widgets Designer \354\264\210\352\270\260 \354\204\270\355\214\205 \355\212\234\355\206\240\353\246\254\354\226\274.md" (100%) delete mode 100644 "docs/\354\202\254\354\232\251\354\236\220 \354\213\234\353\202\230\353\246\254\354\230\244.md" delete mode 100644 "docs/\354\234\240\354\202\254\354\240\234\355\222\210.md" rename "docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/Backlog \353\260\234\355\221\234.md" => "docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/Product_Backlog_\353\260\234\355\221\234_\353\214\200\353\263\270.md" (100%) rename "docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/[\354\226\221\354\213\235 5] \354\213\234\354\212\244\355\205\234 \352\265\254\354\241\260 \354\204\244\352\263\204 \353\260\217 \352\260\234\353\260\234 \355\231\230\352\262\275 \354\226\221\354\213\235 (1).docx" => "docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/[\354\226\221\354\213\235 5] \354\213\234\354\212\244\355\205\234 \352\265\254\354\241\260 \354\204\244\352\263\204 \353\260\217 \352\260\234\353\260\234 \355\231\230\352\262\275 \354\226\221\354\213\235.docx" (100%) create mode 100644 "docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/[\354\226\221\354\213\235 5] \354\213\234\354\212\244\355\205\234 \352\265\254\354\241\260 \354\204\244\352\263\204 \353\260\217 \352\260\234\353\260\234 \355\231\230\352\262\275.md" diff --git a/.github/ISSUE_TEMPLATE/lightweight-task.yml b/.github/ISSUE_TEMPLATE/lightweight-task.yml index c778a6d..a017bc7 100644 --- a/.github/ISSUE_TEMPLATE/lightweight-task.yml +++ b/.github/ISSUE_TEMPLATE/lightweight-task.yml @@ -53,7 +53,7 @@ body: label: Deliverable description: State what concrete output or change should exist when the task is done. placeholder: | - - Add `docs/GitHub Project.md` + - Add `docs/process/GitHub Project.md` - Capture the expected team workflow validations: required: true diff --git a/AGENTS.md b/AGENTS.md index 26a4214..a7707fa 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -68,7 +68,7 @@ - `Epic` for larger parent work - `Implementation Task` for `Engine` / `Domain` / `Application` / `Build` work - `Lightweight Task` for `Docs` / `Chore` / `Analysis` work -- GitHub Project guidance is documented in `docs/GitHub Project.md`. +- GitHub Project guidance is documented in `docs/process/GitHub Project.md`. - PR titles must follow `[Area] short summary`. - Allowed PR areas: - `Engine` @@ -93,9 +93,10 @@ ## Docs - After any changes to the project, ensure the documents remain consistent. -- Architecture notes: `docs/프로젝트 구조.md` -- Project workflow notes: `docs/GitHub Project.md` -- Requirements and overview docs are under `docs/`. +- Architecture notes: `docs/architecture/프로젝트 구조.md` +- Project workflow notes: `docs/process/GitHub Project.md` +- Requirements and overview docs are under `docs/product/`. +- Use `docs/README.md` as the entry point for the document map. ## Review Priorities - Broken build or preset mismatch diff --git a/README.md b/README.md new file mode 100644 index 0000000..6560412 --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# SafeCrowd + +SafeCrowd는 ECS 기반 군중 시뮬레이션과 안전 의사결정 지원을 목표로 하는 Qt 데스크톱 애플리케이션입니다. +건물, 행사장, 대피 시나리오 같은 실제 운영 환경을 가정해 군중 흐름, 병목, 위험 징후를 비교 가능한 형태로 분석하는 것을 목표로 합니다. + +## 핵심 목표 + +- 실제 공간 구조를 바탕으로 시뮬레이션 가능한 레이아웃을 구성한다. +- 여러 운영 대안을 시나리오로 비교해 위험 차이를 확인한다. +- Qt 기반 UI와 분리된 ECS 엔진 구조를 유지한다. + +## 아키텍처 + +프로젝트는 `application -> domain -> engine` 계층을 유지합니다. + +- `src/application`: Qt UI와 애플리케이션 조립 +- `src/domain`: SafeCrowd 도메인 로직 +- `src/engine`: 재사용 가능한 ECS 엔진 + +상세 구조는 [docs/architecture/프로젝트 구조.md](docs/architecture/프로젝트 구조.md)를 기준 문서로 사용합니다. + +## 빠른 시작 + +전체 앱 빌드: + +```powershell +cmake --preset windows-debug +cmake --build --preset build-debug +ctest --preset test-debug +``` + +Qt 앱 없이 빠르게 검증: + +```powershell +cmake --preset windows-debug-no-app +cmake --build --preset build-engine-debug +cmake --build --preset build-engine-domain-debug +cmake --build --preset build-no-app-debug +ctest --preset test-no-app-debug +``` + +앱 빌드에는 `vcpkg.json`의 `qtbase` 의존성이 필요합니다. + +## 문서 + +- [docs/README.md](docs/README.md): 문서 전체 안내 +- [docs/product/개요서.md](docs/product/개요서.md): 프로젝트 개요와 이해당사자 +- [docs/product/사용자 시나리오.md](docs/product/사용자 시나리오.md): 대표 사용자 흐름 +- [docs/product/위험 정의.md](docs/product/위험 정의.md): 위험 및 사고 모델 정의 +- [docs/process/GitHub Project.md](docs/process/GitHub Project.md): 이슈, 프로젝트, PR 운영 규칙 + +## 기여 방식 + +기본 흐름은 `issue -> branch -> PR -> merge`입니다. +문서와 저장소 운영 규칙은 [CONTRIBUTING.md](CONTRIBUTING.md)를 따릅니다. diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..655a8bc --- /dev/null +++ b/docs/README.md @@ -0,0 +1,28 @@ +# SafeCrowd 문서 안내 + +`docs/`는 기준 문서를 모아 두는 위치다. 진행 중 메모, 임시 TODO, 작업 상태 추적은 GitHub Issues와 Project에서 관리한다. + +## 문서 구조 + +- `architecture/`: 계층 구조, 책임, 디렉터리 규칙 같은 오래 유지할 설계 기준 +- `process/`: GitHub Project, 이슈/PR 규칙 같은 협업 절차 +- `product/`: 개요, 사용자 시나리오, 위험 정의, 백로그 같은 제품 요구와 범위 +- `references/`: 외부 조사 자료와 튜토리얼. 기준 문서의 보조 근거로만 사용 +- `제출용/`: 학교 제출 산출물. 저장소 운영 기준 문서와 분리해 보관 + +## 시작점 + +- [architecture/프로젝트 구조.md](architecture/프로젝트 구조.md) +- [process/GitHub Project.md](process/GitHub Project.md) +- [product/개요서.md](product/개요서.md) +- [product/사용자 시나리오.md](product/사용자 시나리오.md) +- [product/위험 정의.md](product/위험 정의.md) +- [product/Product Backlog.md](product/Product Backlog.md) + +## 유지 규칙 + +- 한 사실은 한 문서만 기준으로 삼는다. +- 구조 변경은 `architecture/`, 협업 규칙 변경은 `process/`, 요구 변경은 `product/`를 먼저 갱신한다. +- 외부 링크, 조사 메모, 튜토리얼은 `references/`로 보낸다. +- 제출 양식과 산출물은 `제출용/`에 두고 기준 문서처럼 직접 참조하지 않는다. +- 이 저장소는 별도 `adr/` 폴더를 두지 않는다. 구조 결정은 `architecture/프로젝트 구조.md`에, 협업 규칙 결정은 `process/GitHub Project.md`와 `CONTRIBUTING.md`에 반영한다. diff --git "a/docs/\354\204\244\352\263\204 \352\265\254\354\241\260.md" "b/docs/architecture/\355\224\204\353\241\234\354\240\235\355\212\270 \352\265\254\354\241\260.md" similarity index 100% rename from "docs/\354\204\244\352\263\204 \352\265\254\354\241\260.md" rename to "docs/architecture/\355\224\204\353\241\234\354\240\235\355\212\270 \352\265\254\354\241\260.md" diff --git a/docs/GitHub Project.md b/docs/process/GitHub Project.md similarity index 100% rename from docs/GitHub Project.md rename to docs/process/GitHub Project.md diff --git a/docs/Product Backlog.md b/docs/product/Product Backlog.md similarity index 99% rename from docs/Product Backlog.md rename to docs/product/Product Backlog.md index 4e84722..6c93fa6 100644 --- a/docs/Product Backlog.md +++ b/docs/product/Product Backlog.md @@ -1,7 +1,7 @@ # Product Backlog ## Project Name -**SafeCrowd: ECS 게임 엔진 기반 군중 행동 시뮬레이션 및 의사결정 지원 시스템** +**SafeCrowd: 군중 안전 시뮬레이터** 02조 202002520 은민수 @@ -21,7 +21,7 @@ | 항목 | 내용 | | --- | --- | -| Project Name | SafeCrowd: ECS 게임 엔진 기반 군중 행동 시뮬레이션 및 의사결정 지원 시스템 | +| Project Name | SafeCrowd: 군중 안전 시뮬레이터 | | Version | v1.0 | | 작성일 / 수정일 | 2026/04/01 / 2026/04/03 | | Product Owner (PO) | 02조 공동 | diff --git "a/docs/\352\260\234\354\232\224\354\204\234.md" "b/docs/product/\352\260\234\354\232\224\354\204\234.md" similarity index 97% rename from "docs/\352\260\234\354\232\224\354\204\234.md" rename to "docs/product/\352\260\234\354\232\224\354\204\234.md" index 2e4dd13..2b19142 100644 --- "a/docs/\352\260\234\354\232\224\354\204\234.md" +++ "b/docs/product/\352\260\234\354\232\224\354\204\234.md" @@ -1,6 +1,6 @@ # SafeCrowd 개요 ## SafeCrowd란? -ECS 게임 엔진 기반 군중 행동 시뮬레이션 및 의사 결정 지원 시스템 +SafeCrowd: 군중 안전 시뮬레이터 ## 대상 이해당사자 (stakeholder) - 건물 관리자 및 안전 관리자 diff --git "a/docs/\352\263\265\352\260\234 \354\204\261\353\212\245 \352\262\200\354\246\235 \353\215\260\354\235\264\355\204\260 \354\241\260\354\202\254.md" "b/docs/product/\352\263\265\352\260\234 \354\204\261\353\212\245 \352\262\200\354\246\235 \353\215\260\354\235\264\355\204\260 \354\241\260\354\202\254.md" similarity index 100% rename from "docs/\352\263\265\352\260\234 \354\204\261\353\212\245 \352\262\200\354\246\235 \353\215\260\354\235\264\355\204\260 \354\241\260\354\202\254.md" rename to "docs/product/\352\263\265\352\260\234 \354\204\261\353\212\245 \352\262\200\354\246\235 \353\215\260\354\235\264\355\204\260 \354\241\260\354\202\254.md" diff --git "a/docs/\354\234\204\355\227\230 \354\240\225\354\235\230.md" "b/docs/product/\354\234\204\355\227\230 \354\240\225\354\235\230.md" similarity index 100% rename from "docs/\354\234\204\355\227\230 \354\240\225\354\235\230.md" rename to "docs/product/\354\234\204\355\227\230 \354\240\225\354\235\230.md" diff --git "a/docs/references/Pathfinder_MassMotion_\354\241\260\354\202\254.md" "b/docs/references/Pathfinder_MassMotion_\354\241\260\354\202\254.md" deleted file mode 100644 index fc03495..0000000 --- "a/docs/references/Pathfinder_MassMotion_\354\241\260\354\202\254.md" +++ /dev/null @@ -1,75 +0,0 @@ -# Pathfinder - -예. `Pathfinder`는 공식적으로 대피(egress) 시뮬레이션을 수행할 수 있습니다. Thunderhead는 Pathfinder를 `crowd movement and egress software`로 소개하고, `Emergency Preparedness` 문서에서는 기본 시뮬레이션이 `Egress`이며 각 agent가 가장 빠른 경로로 출구로 이동한다고 설명합니다. 또한 `assisted evacuation`, `threat awareness`, `delayed/probabilistic reactions`도 지원합니다. -근거: [Pathfinder 제품 페이지](https://www.thunderheadeng.com/pathfinder/), [Emergency Preparedness](https://www.thunderheadeng.com/pathfinder/emergency-preparedness/) - -다만 범위를 정확히 보면, Pathfinder의 기본 축은 `사람 이동/대피 모델링`입니다. 화재·연기 자체의 물리 해석은 `PyroSim(FDS)`와 연동해 `FED`(독성 노출량), `visibility`(가시성), 연기 속 보행속도 저하 등을 평가하는 구조입니다. 공식 튜토리얼은 `full coupling`이 아직 완료되지 않았고, 연기 반응을 반영하는 일부 워크플로는 현재도 수동 coupling 방식이라고 설명합니다. -근거: [Coupling with PyroSim (FDS)](https://www.thunderheadeng.com/docs/2025-1/pathfinder/advanced/coupling-fds/), [Manual smoke coupling tutorial](https://www.thunderheadeng.com/docs/2025-1/pathfinder/examples/how-to/manually-coupling-fds/) - -대피 시뮬레이션 절차는 공식 문서 기준으로 보통 이렇게 진행됩니다. - -1. 공간 모델 작성 -CAD/BIM을 가져오거나 직접 모델링한 뒤, `floor extraction`으로 navigation mesh를 만들고 `room`, `door`, `stair`, `exit`를 정의합니다. Pathfinder에서 `exit`는 모델 경계에 놓인 door입니다. -근거: [Fundamentals 튜토리얼](https://www.thunderheadeng.com/docs/2025-1/pathfinder/examples/fundamentals/), [Generating Geometry from CAD](https://www.thunderheadeng.com/docs/2025-1/pathfinder/geometry/generating-from-cad/), [Doors / Exits](https://www.thunderheadeng.com/docs/2025-1/pathfinder/geometry/doors/) - -2. 인원 배치 -방 안에 occupant를 직접 배치하거나, `occupant source`로 시간대별 유입 인원을 생성할 수 있습니다. -근거: [Fundamentals 튜토리얼](https://www.thunderheadeng.com/docs/2025-1/pathfinder/examples/fundamentals/), [Occupant Sources](https://www.thunderheadeng.com/docs/2026-1/pathfinder/occupants/occupant-source/) - -3. 보행 특성과 대피 규칙 설정 -`Profile`로 속도, 체격, 분포 등을 정의하고, `Behavior`로 대피 로직을 줍니다. 기본 behavior인 `Goto Any Exit`는 가장 빠른 경로로 아무 출구나 향하게 합니다. 필요하면 특정 출구, refuge room, elevator, assisted evacuation 동선도 구성할 수 있습니다. -근거: [Profiles](https://www.thunderheadeng.com/docs/2025-1/pathfinder/profiles/), [Behaviors](https://www.thunderheadeng.com/docs/2026-1/pathfinder/behaviors/), [Assisted Evacuation](https://www.thunderheadeng.com/docs/2025-1/pathfinder/advanced/assisted-evacuation/) - -4. 비상상황 반응 모델링 -단순 최단대피 외에도 `familiar routes`, `triggers`, `delayed/probabilistic reactions`로 익숙한 출구 선호, 경보 전파, 일부 인원의 지연 반응 등을 반영할 수 있습니다. -근거: [Evacuation Using Familiar Paths](https://www.thunderheadeng.com/docs/2025-1/pathfinder/examples/how-to/familiar-routes/), [Triggers](https://www.thunderheadeng.com/docs/2025-1/pathfinder/examples/how-to/evacuation-using-triggers/) - -5. 시뮬레이션 실행 -`Run Simulation`으로 시나리오를 실행하고, 필요하면 Monte Carlo variation으로 여러 랜덤 케이스를 반복 실행할 수 있습니다. -근거: [Fundamentals 튜토리얼](https://www.thunderheadeng.com/docs/2025-1/pathfinder/examples/fundamentals/), [Simulation](https://www.thunderheadeng.com/docs/2026-1/pathfinder/simulation/), [Pathfinder 2025.1](https://www.thunderheadeng.com/docs/2025-1/pathfinder/) - -6. 결과 분석 -결과 뷰어와 CSV에서 `exit time`, `congestion time`, `distance`, `safe time` 등을 확인합니다. PyroSim/FDS 결과를 연동하면 `FED`와 `visibility`도 함께 평가할 수 있습니다. -근거: [Occupant Summary output](https://www.thunderheadeng.com/docs/2025-1/pathfinder/output/occupant-summary/), [Coupling with PyroSim (FDS)](https://www.thunderheadeng.com/docs/2025-1/pathfinder/advanced/coupling-fds/), [Results 2025.1](https://www.thunderheadeng.com/docs/2025-1/results/) - -원하시면 다음 답변에서 `MassMotion vs LEGION vs Pathfinder`를 `대피성능평가 관점`으로 비교해드리겠습니다. - - -# MassMotion - -예. MassMotion은 공식적으로 대피 시뮬레이션을 수행할 수 있습니다. Oasys/Arup의 2024 검증 문서는 MassMotion을 “pedestrian movement and evacuation simulation program”으로 설명하고, 제품 페이지도 `Evacuate`를 기본 스케줄링 옵션 중 하나로 제시합니다. -근거: [MassMotion 제품 페이지](https://www.oasys-software.com/products/massmotion/), [2024 Fire Evacuation Verification & Validation](https://www.oasys-software.com/wp-content/uploads/2024/07/Fire-Evacuation-VV.pdf) - -다만 범위를 정확히 보면, 공식 문서는 MassMotion이 사람의 대피 행동, 출구 선택, 혼잡, 이동시간 같은 `egress` 분석을 하는 도구라고 설명합니다. 반면 화재나 연기 자체를 직접 모델링하지는 않는다고 명시합니다. -근거: [2024 Fire Evacuation Verification & Validation](https://www.oasys-software.com/wp-content/uploads/2024/07/Fire-Evacuation-VV.pdf) - -대피 시뮬레이션 절차는 보통 이렇게 이해하면 됩니다. - -1. 공간 모델을 만든다. -CAD/BIM을 가져오거나 직접 3D 환경을 만들고, 바닥, 문/링크, 계단, 램프, 에스컬레이터, 출입 포털, 장애물 등을 보행 네트워크로 분류합니다. -근거: [MassMotion 제품 페이지](https://www.oasys-software.com/products/massmotion/), [2024 Fire Evacuation Verification & Validation](https://www.oasys-software.com/wp-content/uploads/2024/07/Fire-Evacuation-VV.pdf) - -2. 대피 인원과 출구 조건을 정의한다. -Entry portal로 에이전트를 생성하고, Exit portal을 목표 출구로 지정합니다. 인원수, 생성 시간/속도, origin-destination, exit zone 등을 설정할 수 있습니다. -근거: [MassMotion 제품 페이지](https://www.oasys-software.com/products/massmotion/), [2024 Fire Evacuation Verification & Validation](https://www.oasys-software.com/wp-content/uploads/2024/07/Fire-Evacuation-VV.pdf) - -3. `Evacuate` 이벤트를 설정한다. -공식 User Guide에 따르면 `Evacuate` 이벤트는 에이전트에게 일정 대기시간을 준 뒤 출구 쪽으로 이동시키며, 필요하면 zone을 순차적으로 비우도록 설정할 수 있습니다. -근거: [MassMotion User Guide 11.8 PDF](https://www.oasys-software.com/wp-content/uploads/2024/07/Oasys-MassMotion-User-Guide-11-8.pdf) - -4. 경로 선택과 행동 규칙을 준다. -에이전트는 `Least Cost` 방식으로 가장 유리한 출구를 찾거나, 특정 출구를 지정받아 그쪽으로 이동할 수 있습니다. 공식 검증 문서는 혼잡과 출구 가용성 변화에 따라 경로를 재평가할 수 있다고 설명합니다. -근거: [2024 Fire Evacuation Verification & Validation](https://www.oasys-software.com/wp-content/uploads/2024/07/Fire-Evacuation-VV.pdf) - -5. 여러 시나리오를 돌리고 결과를 비교한다. -MassMotion은 그래프, 맵, 필터 기반 분석으로 혼잡 구간, 대기시간, 이동시간, 문/계단 유량 등을 비교할 수 있습니다. 실제 공식 사례에서도 여러 대피 전략 시나리오를 비교해 최적안을 찾는 방식으로 사용됐습니다. -근거: [MassMotion 제품 페이지](https://www.oasys-software.com/products/massmotion/), [Cendana 대피 사례](https://www.oasys-software.com/case-studies/evacuation-modelling-of-cendana-building-using-oasys-massmotion/) - -참고용 공식 링크 모음: -- [MassMotion Documentation 허브](https://www.oasys-software.com/support/massmotion/massmotion-documentation/) -- [MassMotion 제품 페이지](https://www.oasys-software.com/products/massmotion/) -- [2024 Fire Evacuation Verification & Validation](https://www.oasys-software.com/wp-content/uploads/2024/07/Fire-Evacuation-VV.pdf) -- [MassMotion User Guide 11.8 PDF](https://www.oasys-software.com/wp-content/uploads/2024/07/Oasys-MassMotion-User-Guide-11-8.pdf) - -원하시면 다음 답변에서 `대피성능평가 관점에서 MassMotion으로 뽑아볼 수 있는 주요 지표`만 따로 정리해 드리겠습니다. - diff --git "a/docs/Qt Widgets Designer \354\264\210\352\270\260 \354\204\270\355\214\205 \355\212\234\355\206\240\353\246\254\354\226\274.md" "b/docs/references/Qt Widgets Designer \354\264\210\352\270\260 \354\204\270\355\214\205 \355\212\234\355\206\240\353\246\254\354\226\274.md" similarity index 100% rename from "docs/Qt Widgets Designer \354\264\210\352\270\260 \354\204\270\355\214\205 \355\212\234\355\206\240\353\246\254\354\226\274.md" rename to "docs/references/Qt Widgets Designer \354\264\210\352\270\260 \354\204\270\355\214\205 \355\212\234\355\206\240\353\246\254\354\226\274.md" diff --git "a/docs/\354\202\254\354\232\251\354\236\220 \354\213\234\353\202\230\353\246\254\354\230\244.md" "b/docs/\354\202\254\354\232\251\354\236\220 \354\213\234\353\202\230\353\246\254\354\230\244.md" deleted file mode 100644 index 4042b7d..0000000 --- "a/docs/\354\202\254\354\232\251\354\236\220 \354\213\234\353\202\230\353\246\254\354\230\244.md" +++ /dev/null @@ -1,144 +0,0 @@ -# SafeCrowd 사용자 시나리오 - ---- - -## 문서 목적 -본 문서는 SafeCrowd를 사용하는 대표 이해당사자가 어떤 상황에서 시스템을 활용하는지 설명한다. 각 시나리오는 개요서의 핵심 목표인 위험 식별, 시나리오 비교, 운영 대안 추천, 의사결정 지원에 맞춰 작성한다. - ---- - -## 시나리오 1. 재난 대응 담당자의 비상 대응 계획 검토 - -### 사용자 -재난 대응 담당자 - -### 상황 -실제 대피 훈련은 비용과 시간이 많이 들며, 동일 조건으로 반복 검증하기 어렵다. 담당자는 화재, 출구 통제, 연기 확산, 특정 구역 혼잡 같은 다양한 비상 상황을 가정하여 대응 계획을 사전에 검토하고자 한다. - -### 목표 -- 실제 훈련 전에 다양한 비상 상황을 가상으로 검토한다. -- 병목, 낙상, 압박 고위험 상태, 탈출 지연, 미대피 또는 제한시간 초과 가능성이 높은 조건을 식별한다. -- 대응 우선순위와 통제 전략을 수립한다. - -### 사전 조건 -- 대상 시설의 공간 구조 데이터가 준비되어 있다. -- 대피 인원 규모와 기본 이동 목적지가 설정되어 있다. - -### 주요 흐름 -1. 사용자는 대상 시설의 구조 데이터를 불러오거나 직접 입력한다. -2. 사용자는 기본 대피 시나리오를 생성하고 인원 수, 출구 위치, 통로 폭, 대피 시작 조건을 설정한다. -3. 사용자는 출구 폐쇄, 특정 구역 통제, 장애물 추가, 연기 발생, 인원 밀집 같은 비상 변수를 적용한 대안 시나리오를 여러 개 만든다. -4. 시스템은 각 시나리오를 시뮬레이션 가능한 형태로 생성하고 실행 준비 상태를 보여준다. -5. 사용자는 여러 시나리오를 선택해 실행한다. -6. 시스템은 시뮬레이션 도중 혼잡 구역, 밀도 증가, 압력 증가, 낙상 발생, 탈출 지연 가능성을 시각적으로 표시한다. -7. 시스템은 시나리오 종료 후 총 대피 시간, 구역별 핵심 위험 지표, 낙상 인원, 압박 고위험 노출 인원, 미대피 또는 제한시간 초과 인원, 위험 히트맵을 요약하여 보여준다. -8. 시스템은 결과를 바탕으로 안내 인력 추가, 대체 출구 유도, 통제 구역 재설정, 순차 퇴장 같은 대응안 후보를 우선순위와 근거와 함께 제안한다. -9. 사용자는 추천안을 검토해 그대로 적용하거나 일부를 수정해 새로운 대안 시나리오로 만든다. -10. 사용자는 수정된 시나리오를 다시 실행해 이전 결과와 비교한다. - -### 대안 흐름 -- 구조 데이터가 없으면 사용자는 시스템 내 편집 기능으로 통로, 출구, 장애물을 직접 배치한다. -- 특정 시나리오에서 미대피 또는 제한시간 초과 비율이 높게 나오면 시스템은 순차 퇴장, 출구 추가 개방, 통제 구역 재설정 같은 대응안을 우선 추천하고, 사용자는 이를 검토한다. - -### 산출물 -- 시나리오별 대피 시간 비교표 -- 위험 구간 히트맵 -- 낙상, 압박 고위험 노출, 미대피/제한시간 초과 인원 통계 -- 추천 운영 대안 목록과 각 대안의 제안 근거 -- 대응 계획 수립에 사용할 근거 자료 - -### 기대 결과 -- 반복 훈련 없이도 다양한 재난 조건을 검토할 수 있다. -- 위험 구간과 취약 상황을 빠르게 식별할 수 있다. -- 실제 대응 계획의 완성도를 높일 수 있다. -- 위험 구간 분석에서 대응안 도출까지 걸리는 시간을 줄일 수 있다. - ---- - -## 시나리오 2. 행사장 운영자 및 안전 관리자의 대규모 인파 분산 계획 검토 - -### 사용자 -행사장 운영자 및 안전 관리자 - -### 상황 -공연장, 경기장, 축제장 같은 대형 행사 공간에서는 종료 직후 짧은 시간 안에 많은 인원이 동시에 이동한다. 운영자는 퇴장 동선, 출구 개방 방식, 통제 구역 설정에 따라 병목과 압박 고위험 상태가 크게 달라질 수 있으므로, 실제 행사 전에 대규모 인파 분산 계획을 검토하고자 한다. - -### 목표 -- 대규모 인파 이동 상황에서 위험 구간을 사전에 식별한다. -- 퇴장 유도와 구역 통제 방식에 따른 핵심 위험 지표 차이를 비교한다. -- 행사 운영 계획 수립에 필요한 객관적 근거를 확보한다. - -### 사전 조건 -- 행사장 구조와 주요 출입구, 통로, 계단 정보가 시스템에 반영되어 있다. -- 행사 종료 시점의 예상 인원 규모와 구역별 분포가 정리되어 있다. - -### 주요 흐름 -1. 사용자는 행사장 구조를 불러오고 주요 출구, 복도, 계단, 펜스 구역, 통제 가능 구역을 확인한다. -2. 사용자는 행사 종료 직후를 기준으로 구역별 인원 규모와 이동 방향을 설정한다. -3. 사용자는 출구 일부 폐쇄, 구역별 순차 퇴장, 유도 펜스 설치, 특정 통로 일방화, 안전요원 배치 같은 인파 분산 대안을 여러 개 생성한다. -4. 시스템은 각 운영 대안을 기반으로 대규모 군중 이동 시뮬레이션을 실행한다. -5. 시스템은 병목 구간, 최대 밀도, 압력 집중 구역, 역방향 흐름 충돌 가능성, 탈출 지연 구간을 시각화한다. -6. 시스템은 각 대안의 핵심 위험 지표와 이동 흐름을 비교하고, 출구 추가 개방, 구역별 순차 퇴장, 일방통행 전환 같은 분산 계획 후보를 우선순위화해 제안한다. -7. 사용자는 제안된 후보와 직접 만든 대안을 함께 검토하여 어떤 분산 계획이 가장 안전한지 확인한다. -8. 사용자는 가장 적절한 계획을 선택하고 실제 행사 운영 대안에 반영한다. - -### 대안 흐름 -- 특정 출구 앞에서 밀도와 압력이 임계치 이상으로 높게 나타나면 사용자는 출구 추가 개방 또는 구역별 분산 퇴장 시나리오를 다시 생성한다. -- 특정 대안에서 역방향 흐름 충돌이 반복되면 시스템은 동선 분리, 일방통행, 통제 구역 확장 같은 수정안을 우선 추천하고, 사용자는 이를 검토한다. - -### 산출물 -- 인파 분산안별 대피 시간 및 핵심 위험 지표 비교 자료 -- 병목, 압력 집중, 탈출 지연 구간 시각화 결과 -- 출구 운영 방식, 통제 방식, 유도 방식에 대한 비교 근거 -- 추천 분산 계획 목록과 우선순위 근거 - -### 기대 결과 -- 행사 종료 후 대규모 인파 이동에서 사고 가능성이 높은 구간을 사전에 파악할 수 있다. -- 인파 분산 계획 변경이 안전성에 미치는 영향을 빠르게 검토할 수 있다. -- 행사 운영 판단을 뒷받침할 객관적 자료를 확보할 수 있다. -- 운영자가 직접 모든 대안을 떠올리지 않아도 우선 검토할 계획 후보를 빠르게 얻을 수 있다. - ---- - -## 시나리오 3. 건축·공간 설계자의 설계안 안전성 비교 - -### 사용자 -건축·공간 설계자 - -### 상황 -건물 또는 행사장의 초기 설계 단계에서는 통로 폭, 출구 수, 공간 배치가 군중 흐름에 어떤 영향을 주는지 직관적으로 판단하기 어렵다. 설계자는 여러 설계안을 비교하여 더 안전한 동선을 찾고자 한다. - -### 목표 -- 설계안별 군중 흐름과 대피 성능을 비교한다. -- 병목과 위험 구간이 적은 구조를 선택한다. -- 설계 변경의 타당성을 설명할 수 있는 자료를 확보한다. - -### 사전 조건 -- 비교할 설계안이 2개 이상 준비되어 있다. -- 각 설계안의 공간 배치와 출구 정보가 입력 가능하다. - -### 주요 흐름 -1. 사용자는 설계안 A, 설계안 B처럼 비교할 공간 구조를 각각 시스템에 입력한다. -2. 사용자는 동일한 인원 조건과 이용 목적을 기준으로 비교 시나리오를 생성한다. -3. 사용자는 필요 시 특정 설계안에 출구 추가, 통로 확장, 장애물 제거 같은 구조 변경안을 반영한다. -4. 시스템은 동일한 조건에서 각 설계안을 시뮬레이션하여 이동 흐름을 재현한다. -5. 시스템은 설계안별 총 이동 시간, 병목 위치, 최대 밀도, 미대피 또는 제한시간 초과 여부를 시각화하고 비교한다. -6. 시스템은 출구 폭 확대, 출구 분산 배치, 장애물 제거, 통로 재구성 같은 수정안 후보를 근거와 함께 제안한다. -7. 사용자는 위험 구간이 집중되는 구조적 원인을 확인하고, 제안된 수정안 또는 직접 만든 수정안을 다시 비교한다. -8. 사용자는 더 안전하고 효율적인 설계안을 선택한다. - -### 대안 흐름 -- 특정 설계안에서 출구 앞 아치형 정체가 심하면 시스템은 출구 폭 확대 또는 출구 분산 배치를 우선 추천하고, 사용자는 이를 검토한다. -- 시야 제한 조건에서도 핵심 위험 지표가 높게 나타나면 시스템은 표지 배치 강화나 동선 구조 조정을 후보로 제안한다. - -### 산출물 -- 설계안별 대피 성능 비교표 -- 병목 및 위험 구역 시각화 결과 -- 구조 변경 전후 비교 자료 -- 설계 수정안 추천 목록과 추천 근거 - -### 기대 결과 -- 설계 단계에서 잠재적 위험을 미리 발견할 수 있다. -- 공간 구조 변경이 군중 흐름에 주는 영향을 빠르게 검토할 수 있다. -- 설계안 선택과 수정에 필요한 근거를 확보할 수 있다. -- 설계자가 먼저 시도해 볼 수정안 후보를 시스템이 제시해 검토 속도를 높일 수 있다. diff --git "a/docs/\354\234\240\354\202\254\354\240\234\355\222\210.md" "b/docs/\354\234\240\354\202\254\354\240\234\355\222\210.md" deleted file mode 100644 index 3785d18..0000000 --- "a/docs/\354\234\240\354\202\254\354\240\234\355\222\210.md" +++ /dev/null @@ -1,87 +0,0 @@ -# SafeCrowd 유사 제품 조사 및 차별화 포인트 - -## 문서 목적 -본 문서는 SafeCrowd와 유사한 군중 시뮬레이션 및 대피 분석 소프트웨어를 조사하고, 각 제품의 한계와 SafeCrowd의 차별화 가능성을 정리한 문서이다. 교수님 발표에서 "이미 유사 제품이 있는데 왜 이 프로젝트가 의미가 있는가"에 답할 수 있도록 작성한다. - -## 조사 기준 -- 조사일 기준: 2026-03-16 -- 기준 축: 군중 흐름 시뮬레이션, 대피 시나리오 분석, 혼잡/위험 시각화, 의사결정 지원 -- 단점은 제품 비방이 아니라 SafeCrowd와 비교했을 때의 상대적 한계로 해석한다. -- 일부 항목은 공식 사이트 설명을 바탕으로 한 합리적 추론이다. - -## SafeCrowd의 비교 기준 -SafeCrowd는 다음 특성을 핵심으로 한다. - -- ECS 기반 대규모 군중 시뮬레이션 -- 건물/행사장 구조 반영 -- 비전문가도 다룰 수 있는 시나리오 생성 및 수정 UI -- 병목, 압력 집중, 압사 위험, 낙상 연쇄, 역방향/교차 흐름, 시야 저하를 비교 가능한 위험 지표로 제공 -- 분석 결과를 바탕으로 운영 대안 후보를 직접 추천 -- 설계자, 행사 운영자, 안전 관리자, 재난 대응 담당자의 의사결정 지원 - -## 경쟁 제품 비교표 - -### 1. 직접 경쟁군 - -| 제품 | 주요 특징 | 발표에서 짚을 한계 | SafeCrowd 차별화 포인트 | -|---|---|---|---| -| MassMotion | BIM/CAD 연동, 군중 흐름 분석, hotspot 분석, 시각화, SDK 제공 | 엔지니어링/설계 워크플로 중심이라 안전관리자나 행사 운영자가 바로 쓰기에는 상대적으로 무겁다. 위험 표현도 혼잡/이동성 분석 쪽이 중심으로 보인다. | SafeCrowd는 설계 툴보다 안전 의사결정 툴에 가깝다. 비전문가용 UI, 시나리오 복제/수정, 위험 히트맵, 시나리오 비교, 운영 대안 추천을 전면에 둘 수 있다. | -| LEGION | 철도역, 공항, 경기장 등 대형 인프라 대상 보행 시뮬레이션, 대피 전략 검토, 보고 기능 | 대형 인프라 분석에 강하지만 도입 장벽이 높고, 위험 메커니즘 설명이 사용자 입장에서는 상대적으로 블랙박스형일 수 있다. | SafeCrowd는 병목, 압력 집중, 낙상, 역류를 분리해 보여주므로 "왜 위험한지"를 설명하기 쉽다. 결과 해석과 의사결정 근거 제시에 유리하다. | -| Pathfinder | 비상 대피, 화재 조건 노출, 그룹 행동, 민감도 분석 지원 | 화재 피난과 코드 검토에 매우 강하지만, 행사장 운영안 비교나 군중 압력/낙상 같은 군중 안전 전용 지표는 상대적으로 덜 전면적이다. | SafeCrowd는 대피 시간뿐 아니라 압력 노출, 낙상 연쇄, 교차/역방향 흐름 충돌까지 다루는 안전 리스크 중심 제품으로 차별화할 수 있다. | -| SimWalk PRO | 건물 대피, 이벤트, 도시 계획, hazard 이벤트, 멀티스레드 계산 | 매우 범용적이고 상용 솔루션 성격이 강해 대학 프로젝트 관점의 독자적 연구 질문이 흐려질 수 있다. | SafeCrowd는 문헌 기반 위험 정의를 직접 구현한 연구형 프로토타입이라는 점이 강점이다. 지표 설계와 실험 구조의 투명성을 강조할 수 있다. | -| buildingEXODUS | 화재, 연기, 표지, 친숙도, 리프트 등 피난공학 요소 반영 | 화재 피난공학 중심이며 공개 자료 기준 버전 정보가 오래된 편이다. 행사장 운영안 비교, 현대적 UI, 실시간 what-if 실험성은 상대적으로 약해 보인다. | SafeCrowd는 현대적인 UI와 실시간 시나리오 비교를 강조할 수 있다. 특히 군중 압력, 압사, 낙상 연쇄를 전면에 낼 수 있다. | -| SimCrowds | 쉬운 사용성, 실시간 환경 수정, 대규모 군중 처리, 3D 공간 활용 | 사용성과 실시간성은 강하지만 위험 정의의 엄밀성이나 문헌 기반 사고 모델은 상대적으로 약하게 보인다. | SafeCrowd는 쉬운 UX 방향을 유지하면서도 문헌 기반 위험 모델과 시나리오별 안전성 비교를 더 강하게 제시할 수 있다. | - -### 2. 플랫폼/연구용/인접군 - -| 제품 | 주요 특징 | 발표에서 짚을 한계 | SafeCrowd 차별화 포인트 | -|---|---|---|---| -| AnyLogic Pedestrian Library | 보행자 시뮬레이션 라이브러리, CAD 가져오기, 다른 라이브러리와 결합 가능 | 완성형 안전 제품이 아니라 플랫폼에 가깝다. 모델을 직접 조립해야 하므로 사용자보다 모델러 역량에 크게 의존한다. | SafeCrowd는 코딩 없이 바로 시나리오를 구성하는 도메인 특화 앱이라는 점을 강조할 수 있다. | -| JuPedSim | Python/C++ 기반 오픈소스 보행 시뮬레이션 프레임워크 | 연구자/개발자 도구에 가깝기 때문에 현업 안전관리자나 설계자가 바로 쓰기 어렵다. | SafeCrowd는 연구 결과를 실제 사용자용 UI로 연결한다는 점에서 차별화된다. | -| Vadere | 과학자용 오픈소스 프레임워크, 보행 동역학 실험과 연구 중심 | 학술 연구에는 적합하지만 운영자용 의사결정 제품과는 결이 다르다. | SafeCrowd는 건물/행사장 적용, 사용자 친화 UI, 의사결정용 대시보드를 전면에 둘 수 있다. | -| EVAGUIDE | 센서, 동적 표지, 앱, COP를 결합한 실시간 대피 유도 시스템 | 센서와 인프라 의존도가 커서 구축 비용이 높고, 설계 초기 검토나 독립형 시나리오 실험 도구로는 과한 구성이 될 수 있다. | SafeCrowd는 센서 인프라 없이도 사전 검토, 대안 비교가 가능한 경량 의사결정 도구라는 점이 강하다. | - -## 발표에서 강조할 핵심 메시지 - -### 1. 유사 제품이 있다는 것은 오히려 의미가 있다 -- 이미 시장에 유사 제품이 존재한다는 것은 이 문제가 실제 현장에서 중요한 문제라는 뜻이다. -- 즉, SafeCrowd는 필요 없는 기능을 만드는 것이 아니라 실제 수요가 있는 문제를 학술적·실용적으로 풀고 있다. - -### 2. 기존 제품은 주로 전문가용 범용 툴이다 -- 기존 상용 제품 다수는 엔지니어, 컨설턴트, 대형 인프라 분석가를 위한 범용 시뮬레이터 성격이 강하다. -- SafeCrowd는 안전 관리자, 행사 운영자, 설계자처럼 비전문가도 시나리오를 빠르게 바꾸고 비교할 수 있게 하는 데 더 초점을 둔다. - -### 3. SafeCrowd의 진짜 차별점은 위험을 더 잘 보이게 만들고, 다음 조치를 직접 제안하는 것이다 -- 단순히 "사람이 이동한다"를 보여주는 것이 아니라, 왜 위험한지 설명 가능한 지표를 제공한다. -- 병목, 정체, 압력 집중, 압사 위험, 낙상 연쇄, 역방향/교차 흐름, 시야 저하를 분리해 보여줄 수 있다. -- 더 나아가 시스템이 어떤 운영 대안을 우선 검토해야 하는지 직접 추천하면, 결과 해석과 의사결정, 발표 설득력 면에서 강점이 된다. - -### 4. 연구 프로젝트로서의 가치가 분명하다 -- 상용 툴은 강력하지만 내부 로직이 사용자에게 충분히 설명되지 않는 경우가 많다. -- SafeCrowd는 문헌 기반 위험 정의를 직접 모델링하고 지표를 설계하기 때문에 연구적 설명 가능성이 높다. -- 따라서 "새 툴을 또 만드는 것"이 아니라 "위험 중심적이고 설명 가능한 시뮬레이션 도구를 연구 목적으로 재구성한다"는 가치가 있다. - -## 교수님 발표용 요약 문장 - -### 짧은 버전 -기존 상용 제품들이 군중 시뮬레이션의 필요성을 이미 증명했다면, SafeCrowd는 그 기능을 안전 의사결정 목적에 맞게 더 가볍고, 더 설명 가능하고, 더 위험 중심적으로 재구성한 프로젝트이다. - -### 발표용 확장 버전 -유사 제품은 이미 존재하지만, 대부분 전문가용 범용 시뮬레이터이거나 특정 산업에 특화되어 있다. SafeCrowd는 비전문가도 시나리오를 쉽게 만들고 수정할 수 있으면서, 단순 대피 시간뿐 아니라 압력 집중, 압사 위험, 낙상 연쇄, 병목, 역방향 및 교차 흐름 같은 위험 요인을 비교 가능한 형태로 보여준다. 또한 시스템이 결과를 바탕으로 운영 대안 후보를 직접 추천하도록 설계해, 사용자가 "무엇이 위험한가"를 넘어서 "다음에 무엇을 해볼 것인가"까지 빠르게 이어지게 한다. 즉, SafeCrowd의 핵심 가치는 "군중을 움직이게 하는 것"이 아니라 "위험을 설명 가능하게 만들고, 대응안을 제안하는 것"에 있다. - -## 결론 -- SafeCrowd는 완전히 새로운 시장을 만드는 프로젝트라기보다, 이미 검증된 문제 영역에 대해 다른 관점의 해법을 제시하는 프로젝트다. -- 차별화의 핵심은 성능 자체보다도 위험 정의의 명확성, 시나리오 비교의 용이성, 운영 대안 추천 가능성, 비전문가 친화성, 연구적 설명 가능성에 있다. -- 따라서 발표에서는 "유사 제품이 있어도 왜 SafeCrowd가 필요한가"를 충분히 설득할 수 있다. - -## 참고 제품 공식 사이트 -- MassMotion: https://www.oasys-software.com/products/massmotion/ -- LEGION: https://www.bentley.com/software/legion/ -- Pathfinder: https://www.thunderheadeng.com/pathfinder/ -- SimWalk PRO: https://www.simwalk.com/ -- buildingEXODUS: https://fseg.gre.ac.uk/exodus/avail.html -- SimCrowds: https://ucrowds.com/simcrowds/ -- AnyLogic Pedestrian Library: https://www.anylogic.com/features/libraries/pedestrian-library/ -- JuPedSim: https://www.jupedsim.org/stable/ -- Vadere: https://www.vadere.org/ -- EVAGUIDE: https://www.evaguide.eu/ diff --git "a/docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/Product_Backlog_2\355\214\200.docx" "b/docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/Product_Backlog_2\355\214\200.docx" index c46d0a4c2e6fad0b12e26a619532a1adf2c5f6ce..67770be2f221923f76507d8c78ecfca6b671f626 100644 GIT binary patch delta 18227 zcmV)-K!?AgfCHoP007}{sd}is^?9{*g%Kk)|;_`*m(tK(m zyOf@t`Z}GT`lqY^{lER=%FKLr?#^O*sla`;xUiI;Sy`T&ow{8pEYDoIlApVsUQFdb zUChkovia=I!l!fD#VgsHH#2kTD=XRD{1pN4fc~|d%g&|q`OMNSBenEpe=0x4mYe%3 z-fHu?)JkUQ7FiHonY*3J71Cd|*WmkJM7*M2QF<2=23Uv(R|LLyDcJW?(iL)7Jqw|M z7UDtgO5$KEg*==z*h)h0O7dVU!QPdW!B*-Kr^Q|Y&n~BzzFJ(knawSx3i(g7xm#Bj zQ@JnhEPpbWU0hBTGB+{{f0@G9R|EhgZ<$nP>5BpGD6{m1zrrG%?|TLL%3^jty#VLE zRkE{FcXCTJ?D|jq>&dOpxYx6P{43H6@qShSym}@5Rbe4t@UG3pp`ClV$rKBv+Lc^- zAyvp^m-4qW%f5D49CWqCRN=O_$d@M(;LF7Y?|UoDJUW|dGhH^ce;15%`;2#s3+|nt zydn=`aFZ000y;75Z

6@uL3x&WZboFaF`p@;k*9&QGW#-G&!t9hdb>-?m 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�!(0wc{*!@dAN(O@ zZvV@RwAg`WNRlxDm7i;L5Gg>h?8~;v1q+I{Hu2v2*yIA}n54nl2D<^g_B@?In}Q@{ zf4rNfWx)wohjxtnT}(U1-3!oEY3s}|s`tB_Pbk{AL{T;3VC5#o6r zn{Vo5Ao+uB4>yc=NNyko!DPkeRZ~<3#SM48c`|O8y%pBqTM;b8%VQ5;hS4354{Ob% zZxa|hN@K~F2L_$UOxEC7nNXpgAgU*b>dTI(mPJhx;c2$uh#{&)UWE{x*6V0u;I>_n z_ljQFCBC2^+79dji5kOR*87T%7OV)XN(%Gtyl!L%IcX#l;H5!1# zPwM#ociuZ^siIaduarPtgBFT4ifSSyiRCXuQ!!1bTr$KFGDTz=ll~k1Xbi~VCqFv% zSFOh{etO@0yM^m7X+g!qog~^XB$B{D7Jo2IiTc|Uww~J-hc+)j>9phb+*6duR&-&4 zL+EFVBLYAmBYJUdwN)yUA*juxBV7N_=24x)<+avhlCUh}^4bM%av548vh2wwKj-$u zNQJy*T&_(H6%!#-n*h)H*yM_rH(NP3ZM(WAUp!KL+!Jj0=mWSO7n?SJz% z(`6`1%8(1N2WWf=Ou?G;wC!hms~mo}jo*-6jH~4iL}6=Z+Z`$L{zRl;B||)4Hb+U z&cV%cdr<~A$4tu^JM0)&?a@YQWPg}STr2~UHNli6VNei3^hE3s5JB9@;i21s57`c) z(7hjG4juQ^O8&P#g29`|{aYjNkLVV{)!vP4_KU?-?u+Y%RF0&RGxM`k^h{VvEv9Fu z{{2_kIYHoM2!KTAu=Wh04^ZOt@x%SyC1LsJ9h{Hx>;3*f)Y$blX)LOkTz|qa={^N? zAo7$^6VSl~bkHa0K;Q+o&AQ)KLf+<)0K&elK=Cw)g5NN+qfrB|Sz5dhzpW6k-ATR! zeUx)cTay>ROyvUG!{b`l?|UK~`tg;(G6Uoy1XGvI3Ff}GkvgSahZH+)QzC7HHh zLO98CB>=sMlq#xBKPIW-Wq;Lz3Yz56V@j3tp@=Il2hmsLJRVueijMl|7H?XU!N76l z2iGdC->i<`4xlUfq7;RFk5qA1Bjw&5;1f}zO-(m6R4`?I!$B(1HBKE!}-8@4`y zc*PU}BqV7UT`==SRRxx4PEMh?7L4$zl&A%BJ`o|wFhvng?9`ZC_PRel+ia~Jw6-^$ z=WZi-W^*KOY)C2)6n`Wu<85rnNY{B|(z~`#V*`$nv4K>T-m?>Q41$CTk4MP_+U4NRCzQpA|03&E>n361O z-CG=K3PjMYpqenbBZm^th=?k3A~R5+q+93Sl`@~6D_qOWr{pNA-hakN71ecuJ{wYA1%OSP_y=Hx8%xu<=#6j zVjwSXX0x=~L{*7}Gjr=sfxcw7J(pb|V#KnZNT9Ium6`eM96_D?&%KaYO6TcMWtP&{ zGKIO@e)-B3kLvW#8`=4<=^yjixjT#LrNY(!4^T@10+V>UhLb(J8Uh#xlUch+0;~y> zqq{x~lMDa=cW-iJFJ*3IldiiNlLovR5O@y&0C#V4WG`rCVPs`;F_W>n6q7`}8Un-; zlVH3&0wxxdp1eE)Q5uunyg>qgAd?@xJpvdklU}_@0$eSVsJ%Y}WG(=cpL-dTwYm_K z6TTV(q%V^%zCHr=MU!v7I|3P7ldQf#0<>L|?!G<(JYkbAzdZsDWRq>bJOcMNyE8*)ihop8eLKDcWL35(Sd7;{GJtOrpfs(SVFqLX3a3Od})5Fbp3iUUzl1hm1m}SmSgd^ z#d0ZMs8rDN%-q7wT;&2CF8^7)(PqlIWpp!t3@A?JXLIFh;j``-T;f5bDQ!v}9EeXb z5Sk&+4GtwF9!j2qw;C8oOf?XCtAUZEbR&gKPEI!xKRA+-ZX{uFBsJYg1LQP6NZ_T# z!U8&Zy;PphRngD#jj8!u`O~GvOK9N5T(x+uI9IIRLSwSBKTNK;@M(%SLU(mWm=|V$ z5|5xv&6j2hbHa>2O6h|OOXY=WdjF-){qXA3RhGj-&>9Y zJ94{41q+7SRJkyR;8OcsX!9|E*Dey_yh0*1IYP8Ol9GZ zq0%v?@?GwRaf&h7${&Yd1;#0M0n5ddf&DKN7+_{8(Ga}gzXyE4?SZi>Gu4^dWW)J5 znu2?C)!b~Z(qS4h;`Nw8-P`lA~QrE>1t9C{rV9ez`seUuKpV5Q!HqBO~xyY33GuE}|3S^kS}@`v~z6r<$T+ImmW| zqez8T;iy9Yprg~s;GFs7g9|Kw%L=@%37tb$;d*Xqt{OOlN54|WA6Kil=Fn?S-^?NU zlP*kM{>@b9B>9hicS;M@3c7H%xPZng-L+P20EiUXLuIXzcgC@>%Z|L_^S-5)AED+yry z-vUBeELDo2g{O1ZDy6xlYT^C4!u9Gj`#yl+Qf{tzV__POy#J?5=v@k*P4n;1S4x-s z+b$s&qgu@8<}ML+ezSmoAbJClE&{6ks&j>h29dzgsGG15E!6&`#6mTg{Uiw1rFJ!ESlC3F46kA z1arl|BE%z68DtY)q-;Vtzk3HB$mbS(Ho!HZ?;dj)Dqd!m5G5J8{HJrJ8!@B{tFV@+ zXl4xf%9dn0au_Iod(U7{(nA;qy-(x?m327Di19>*P`@blE1K@cuJ`c=%hD{VSiVj-DA1;qflS0`akPgwu#-gEu@EAUU-?*p)3D39|U;P`;S82wgQ z#`j3|F~8rjZ$s_b|CO6BglHQ~Jwu2Qb591uDDsYfAPGFkn&XI3r6T@>UJ0;xHFv#WmP^YseZ&_2lJ>&P$-m+>W1Cl* z*2^_-x5ju6H@&AdrghkG8(U24Rl|F-!L%QI<=%h9c=xv5|FiGzt$I66@AECjZQN(P zoh|Qw&VK7Mut87An38qbaU_M0 zBZWE6##Yy$6z(~5+!IA!ncdu}|oUoUIF-qiZKPM}g%<%{s<^p6o(K!x? zmT3U%L{;`lsymkVzHNkPrhe>5jx8Fd7001}r?C?b9a-XS&N5@^%h9}+3GH@i7ZN;w zEHCjavb$E?zaM$4TQMjZS@fzVsBt9Q1Xo$&ieq`1*O=DZ74ON4_xO1nsUs_njm(J& zu1*kFkf-xQYm4PVrBJ?ExBv)5|0GdndhizIyPcAQ**aYHzF2E-)ndIQbuhzej}=&p zSLHagH?c>uloJAwnE-O4U4P^?_G8F@30}8E*0D49<<1MPmZvL)eDw;DcmG7;Wx`^Oa{%D52^7T@w8t(?0x>~$(6{2|%2<9}X5JL|| z-(^+60L_5j@*%~MfW#kK)S!kd_K6Kk}w~Cd0RBT z1_s#ljioC7NmFI{(i}jY3N(?&*>+s?31Ril)F91T!H+^;t`w_z^!|eEr@{z$Pm3wM zrz`ILTI%Wxwoyf%&9xvj_#i%!kEFwN$Q2%oHXe> zEQzFKrvGZ57rM_2PbYS`J}5L~MR8;eaH6H?wh^V|hR{Wr0*=J6Ebtm<^Ao;}iD51cqlPKc zNQ?-EqL`XK;klR?;aOguV#O&o4QfI)W3)K5kWDPxaK{8SaiSN^Rj&^sie;3I4`lHk~! zqKQy>bKGo4C?uiD?P~5?g?{>{I_ZqXQU%xZ@SRJ;FHt3bwzG(p4p&*oE&jFyd2n(( z0EGVOii#s?hCyZXXw#)``^(0I)DTh9>vxTTRkqXV%6dmz(s{zGE&EZ& znvP~^dK`nh7Z)dqy34;OJuRo1o7{VBj9JMl=cqz|tVrA`&WdCMyqzOviXj0P^nIG? zrg6~mp)s=lX>*37i=rNj4^MB}ekYZGTV5!XnO|M`w_i^)cnKC#&aV)i$HA|`Yl*#OP?i$utp1x@KA#4xhK!f23e=yM4!6VOORHy3ED62S1Wn2@3|A#oPZi$WYH zaMBqiPIluQbVhN%-eg)Yn(qD)(`v4`-|u_7>leX3M@G1}`yJywZo;}0IOx?^y}eq0 z;3{;V_qzV`8>IbP4P@!pp0o~XrNQbFkt5fb1slB3?Fu{Oax= zB1rV)CmRC z!mqMjYd<7Zga~}Eh8~7qZ^u2T0kPb#x!>+E?)^FljF%G+?MST zDy_!tL6l&*f=;ctUw;SU1>q72AEeHRnz%^$|4c7;Z||5*#|^Kx2M^e;d5>1;+rzhZ z{aNe3w_py;Jx1J$eoZJ0$yvsk0rtn&*3hF_xNllTDBn$&@N>V8gI&{qu?(AyQ_yEhl4Nvn_z8(h_Z#y%r^|Mhu*E5Ol*DBhh0vc2Q$ zTh`WXi_~j>on<_a;7kVmJi-%M;wb1AAJlwviFh>NbGZjA?MGm=)j`^WpYrr}tGUwU z&$RMO7ED%<@Fps!jJL3i3~pgHnEInFtbC>!?m_lAdP1)XKz^n7a@!9zK!Ac=2eJ`? zy!G-Y#4|r4YX$qg_~L*+8}JD4C14fFF$I&;Qe!U091DIU`UFo z583r5VJ3I^6dccl>0%7Q!7LuFqU#tO0Gz(!gdXsYbFOeaU2-`>tRWBXWplvRJ_}Qg zW2f1R#r&Ck`D5@D6|BI4@Z)p!w1D9ZqUrL0`*$9&aTz;8o5wED8N3r zFQq4c9qA_fN@cyT6f03K?>Q`}0*w=e9wsA)_lN6K{(TlfFwLomwx!y~I9_BAD#79% ze-EmNr5G>~#%F>~f1_$XfP-FIoGC3`OHGT(ZU%S-UnF+dB};?9Y*+3dtpi%C9EwN-n<(0ow6=6!RQ@peCd zhhk1x@Yi~|;(fm}p|D^`7x@CB=u9+kYziYa<+zUh=QrKz_3$E6S|o-`e{nTxFwX(? z@U)(NuMSmQP$%-Jj($Xk7PIUraI~ zNsiu1pKh^J=;8;gO#NjPJ5BfH6DVlFrP+0FXKU;VQ!-e^a-3s=UB76Bsfem7^LSzW zgbU&*%rvcA&$uMy9o|&+$ewc(8VFIC!L~G{Sdr+=-Tn3!xCYzagXX(ODUxn~I)aY( z)tXRB9GyuDUfo8+d%NYYB=jp>2a8|>E7AIws*#e|hgP5j(4MQ`JF^+%HdQp%RQPiyo$;TvlTYC4zo~X&H#0itYdrTT2%SXsEuiLQJ22>+$ zWyq+PFW#h*n64_Jd(s397gv`wI+_385B8B#X+n%yWh*O;|LhDwneo)6r5>v{=EI zq_pFrq;~}-Sw%T^B(Z{O*|IiiyAu;h$1I{H0rf!ab6o9{l1pONQUyuUql}m#6qQU8 z3!0-_iaM!ch%1Seu`{`Utnj+SIZ;Y@f|7naaI=QE+1uMe)*$p&go-=t<{UK94P!@_ zB5AyAX_HWG3UpzSeD4WzPZ{qaU@IW1TL-Va?Y)3>Zg16*QHLr$o0wL~Km;ov}D?|<( zabW3)vSip0R39HKm(VL$s-^O+3LFiC*X7@#OPH&0O^la+7BrFN1cSP~NnV<6zof~g z)4gtRCiD#1eu-S1U~))fF3pomi*q-jjYZJHLFYc|wR)z4Hw4<0Dtxb*aIJ5oYbFTx zo^kqBe(1bY42gwB@5UKmgx9u7?|af~6Lv%()CbLO|90d(-lR*H81&WqVhzVaXeYg$ zL+>6W#=&TR_wK#M&97T;4&B`?+~PjCy#_8id%5N9tkK^3)Z~ZD(W^X#Uc6t!IPTj$ z_q!(PmflzUhy|S=x4}KHQ*?#XMP5+#6lH}m$u5${2DbRR=3^@*+Cy%K>FfD?VX>N9 z$QKy1Ttot{n2P}yR#Qb?VKebygPiARif+f~mY0Bk-*~^b5xrwT4k4GZ{rDNUi$K`z zwKZ?&2p4zku44MGuU(|8?dV1@{w1(+%wC(+dOU}HK7vjD-GgQ~QpiBlc-Y;+efiTx z+RGh%?tbUh_uPFl)a%VeeI`YYh5C4KCC@zuh%mwRSFo~??p@J%j>H8tAVg5ctsn2# zkUvj<R!g_P*rRz$ z9L0eugGAC;u}l_O0hyG!o;s*^e!^@I0C@O+1uWj}NFL~_c?b81_r6(2(531QU$a%m zOwl9|A4cs@+H21kGyuX7uIFexbMHOF%=LN&U+?1-@f_Bl^)=Yc=*dc40i-zw(vDfj zoWmg>t>`3HReBm_M=821*g(O)rXZi(tXCD@JrCOYS z&s7V|udZJCbs~VMS9|yJ3x@~Cv#O@6nQTFir_g7WIUMx8A1}Da)rinp$qAWPPrH+?0vUYA+))XW~Pf?~y7++yoO%6>rgebdr z$hoESPBCO8{YC8zNnPJQ>P)(;#7HlH+_lb-jTP%fqIQ=U1Kgh5aI z-TBE~-|`-=Vz+(2={@`sds(<@knWj9WLI>EV0X*?;lBe`yZgg4_s@q>i`Jgjh(Sc{ zr;fQ5-}~oS*^tB(l@2laGLi{L^ZrBd8(|2f^Zq3?x}XY~v}z2BrZL#zLZ3u`>cTAU zW(OUvOUQCVnFYI0;Ox5lhp-zQc(VaFmikKVN1HUr<~^hqKlCslUKQ4?*dKd^O!^w| z)`KR~-hdwbh(+RVOJeYvB5|4M%Tq%o{%_b$HY3+IqV$t1bgSWj0rPHy) zIs(tyl9|nd^3w)85htCP&VG1U)BE}@w2XJR@CLWA%6kttOz91B_JnbNy5S%!%kW0n z@nw%}vVtHADRMeldd=~bM$J?u#RQKs)#?k6yPJc-@R_vn^1$bjs;QI z3nZQ%iN8`BD&F1Tp$;xUb-RMsp z@(=exeDA`tP9S~^r-xtAOuipz!laIg_Rcdzv6v~4e!)SF9_0~;GX;U&59zgTWkB4h zhN6g?g8_E_VU86vRn1t&JgT{WL)4DNMo4@Euk-2(61WY2#8r<3fnj!<$aCrG8w-&< zulAzbcRfLX73@=v9dG6Gv5tLwJvz=H2d4{$s%KNba}uyfALNKvCZT8o&vDLZ)<<-Z zgJW&Q6wL7!dXHsM1wU+2MTaYsAS8S=(o=l&aWbiuAWO+Jm{e3-^nUt)rGU1>jW@C| zt{|8gHGABD3_JsDWJ+j6f5gBE2kU~_%sUZ{IoiV^QWDeb06D2&Nn3|8G~Kz2ysvHC zlwxNCS)Wb!-rH{EC!}3|Utj#ehy^i;qB`p1&P0&JBSS;u3$Va`_#D}?wB?Yyv6VFM zDe{7-YvU`5ilm^kU3{Ua4yWrl7<1-Lcz?xbqzNB?8c746a=<8$iXV7)qqcY;{?pE( z_su$x9!VVUZge6J?hntsz1zrz!a)b9K!TQcHNPH!maWs)*m$wW6C8+0n!uNJ&auU8 z`mUZf!a`(6*R^ujI|=%(=Y*i_ev5;ceho{z4)SPV4BFo;OgceZ@nDe)_-;FgaltRD zswm-qecI1G_@Sx+(;i;h27!dPd)~KeUCzLG7%Z9S#^&1fAA#=SiV^GoCEapl(|#x5 z8b#I!7;k~-1{cB5xD2@>ZuADPy})s~gjHIiDswE$jn|VqCzTSSDVjDXf@VJtu!!(* zdm;-FPD9K}2~##$Q67yCqk{+vtBL6Jcw;ty<8l(EF}vEGt)ns+3R@R3@U7^qW++0| zJ*~&tX+hbvUm-? zpOf1;LZ_k6?1Qh+uhng@@r-GI*~A-^5-T}$4>f8i4^MyhbWZe5mS72gCz+R`X4bZU zR9-Msq&ePg-%${4q$-s2uvS^{_3tp>vEya5|Kremy5Seh<2vkqgRO@`UvHvg-G$4c z%s{w+@&qsg-Uk90;=y+`4}Gz_hM$f(oG(ZrZBlCHbjQ?9+@kaRV=W9Wz1ToL`Qzu< zS>Id7E0@Uu5EOTB<7yb%K{d5ME}NWxbll#H=LDRjS3(Dz{mU16SfJ~Q_jxH4;;Wz< z{0`y(>ZT9sL=Ly;XuPV9nAJKf@a?QP>%aupwLIB?EzrEz&)xfLgV6VL`VrnZxebn! zMLY?beh8Xrv-&CffoCI`tRSDq;_R$<{5!YFWY*>k(=bPaN3_9&<1+~^!pF%rS%^dnvN$prCyT5!F?3?kpDY=y%xB)zc+8ng-4rCtnbfJDpkF#P za~axjE-GV*`2_Yr0Y~-q3eDBHPuHM4uJwP9Vr&6E;GO#0tdKoT!H(*5m?ImXCO0@0 z!O>VD%`Rl`c=5HsNrq#b3quiqmpOIWYe4EmWe@_kI3ZW;@c7&5lH|;NNWD-d~ZTN?P#P3BxWCPM; zP%w&Q11%_j5b%=vDnmizVVfV{)A5^{z92#m!&x7)yAot45xTzJNl@Xb2z6xaAq(m@eo0*OnUMTe6uoj(s{<;TL-Z-q!> zq|Kr0<)hqtfA2o*zz*UmWl&1c4T}@U+(r1DxS}j?DdMTO!aE69REXF9O_3a)Q(>Cp za76`0Q&`m)Z;j+w>Y9arp>@rH3>Ue+yYCPBQ`C?#9n=pwlm8xa!EhMZfT8WX2qS%;X0f{!+_FxO|VK zC9#)68fBA(>V5~k#4!q6=8-N-oiTq`V-%cf*s3C&ix>sgM_s-e5I2d-8@mMCNnJ&k zQ`3+|r>fd#hv3GU*oDEjC5Te6lBDY5JAwgPHM)WLKdhKNAQiBGyjpX=qgB(vZJv7? znlauBzu6@&34XqR>b>5I>nxkP%p2JhQ=T2*`aR5o;Pf}h4u^Xf#QpI)8*9Thgh-a} zB51#DdXJm!S_9wQT!rQwk2Vu53briS6s6G|q%#6`zb2hRt5cdzyW00eCBa4bIE43G2S*tUg~JM&tl*B_ zU|v=^QFXF0MCos;Yd=N_!!%HNlp-gXU} zBBUzPPqQTUwKa_u6h1{2_PgzC^QO*8YMMPBPu?oV+aY)5(13VO!q6M*m~DHj0^0Rg z-o1U?S-k#JfLZ-&0kW$84)lTtZcb1`Dq6DWu;(IwKYARLdn6sxe*9NR@dsC+5XYh` z8hsc;pv;G8t8p9sOPs@(O26`g=^6Yb)(dT+>1$M%@B{z!H1!=|<}Ss-XRzo5{C?lX+d#mGcq6I1UTG3*8MP zLlxV9AxYx*X?+@vYa(01@4*OVLv)oql&;_oq5hCN&EQ_BWU+p1Lgx(5mZb4|GpFrH zU!5&2&CSGs2FoH>T1>N7(|L2HV=h0|HBmFg(b|zjyV43T7$U2WH;OYZS6Yj9fr%hY zf{uuxaNIY8aWZUc9?y@Kc}p;|F+(B|o4Fr<%?ge#NfST%WOK0niHU$wc+BicHIEIh9v?q(bAp5vGsQllKHzx*Ek~+`h|CY zZ;$#sIC;|BNeee`4!A_AgB7yIv%>i(5^AE$kH9f{o0$DxJG{~rJV|NrcL z?Qh#wmiNCR1Q_6XfXtLHm%L=KEx^~^0d|3)*_r*ga2z!?# zWw@(pZ?e z@#)8x1VNKTMR)p_?D}U@w`UjO9roWPy82c61h=j&el=SsxBh-=mVC*jkKiIa{LI`< za`k%sv-t-39ik?{dQ+b*)*I~AN9;k_DyRMM-(35pD5U&)@9>fL!+!FAd;j<;g<|bZ z|Mk)Ml<(bLC&cHVysEppB-=oM@+g0sJnX{aeB-MHxSB-WPkuvgsa=D6I38M5Y}Xb9 zJ^MpnZNNp@K(->D@=JnuuEHgxtCowi{J1Z#%-#Ni-8wV-``PeDDpvHpU*Cvb`zZQ> zIe2fj{uy~3ECnBFu=lQi53O|FS{Po3-Wefo;_uF}hH`ls{ z?V7*()?3~ERjvEeF}cg%d|xB$_|Lzqc`x7lZF1ZFb?;~$uJ<;7+qLfDn{KCB>%KW4 zf9O{~J@U7fYyOK)_tlZV)2#WOztcY}%IT{1$@YR z*c^wLvS_KULCH4p#02@gvjs+XYnNKrzufb_UGvtry#1qpnt!xY^VXJn8-&z-GBWbl zz*M(i5{vo9Up)X?6K4#F>ObA^H~-e#JYoX=J}Yf?O~$sJWB0vywC&x0L-w&+@8OR` z`C*$P7yNdszmpu*ywwA5=e@tz1p4;*0A%#uHM?)tVJjni7?yZy6FM(p)p2YB!mg!S zg^2M;x)!j1nOtqm%#%&zt1GeJ7E(LKgZ;PL3yVBrhg@AnraB?CNdB?T!s5&qQ;YT5 z|G9Sc|6WOP-j!=tIq0D{x~^!lITk&Fcj!+TBDZN9rmK}JdS!)VVrpQ!>9xPhBAhAf z>^<^#9~H1ptJ!<9HU2u>;hrM8l4_gabWKjUr&y|g>RO7G{h^u8#{JBnPq-J^Q1gU) z&kwviEpRUUokwIFJn~lG4Z=RANj0VjeLuLF9?yBJFa4EP;NiiYUUQ4Yi8cSu0r>!I z!r*>CKJxcgAolYfeCIb`!3Nx0?!fx~lOO4)SUkwK>FgUSRve3jc{$P@oSB1Exw+W! zoPdyjtzle$bCt3Eq>ZE>ox7^nr~9$UqK zz2*J+J=YS>+>Pi0Df=d2vG=y=t+#-k{_c{0-+E6S|3@tlm-QBJ>?287v0a`N(M0G; zdR$4_3(^QQj6+zmObSz*uD>I;!R7bTG0e<2{&>|jx zJ7yt>#uZRvMt>@q^*g%W zDWRs6R{guPO-yDME~Tu~c{u(e{*#V>|C<6Hrl23i9j_umv2@*?taw#6HA6GR91mTU zCkro6Qi-Lz>5~KR&j%21de7Iu^CwDw;jJF{n_(zQB+`4ZK^>j#eR{*=W10)@S2MYb zm$4n47B=p#P~T{82~-h$qs^Dy|ABa;O%`P=07ccX4Bt}aaNyGmmsId+1*2bhW6>@6>I2VxtSXyrI;xC+CL$Ud zNzBaVVPFmRk1m7qN9f!Aspb9fava(s)0IWpnTR~XDB32<;?7a;Srh(v54Zb)wP7T$5 z^g8>!$H`U7RNyGld7{l(SeWwl)E*bG&RJJBRU&KxGRn0?MMsKQuys>#a}?RD%4Yt` zX7BOW#LWYADZ`CMs+!FfR0X`w7TH~EOb>%ff&XmD-vb|}`>F#@3RAd$07TV)lX{5M zh4lWkOC6p)@~;-X98K?@UMhXK?Kj&ss8@V{K(Vts@8MbQzadXv>vpzj)rCP`nHK=d zb$@zK9u4;H?&~%3OWHkfw6bpKs-dc`h;nRUA9#V(KnOWPA#j+eQkLO4;&I}}(^P=& z4MDOZF6D2Ryp11vMD&<{a(H`RlNa%vMqU>a>%@Fm%6L%Yi$eK;xU0lfKMskzL*kj8 zb?^HoP%<=h(0N42LR+^YHf<^=#uFcBDf z+FDKv8#7iMx5!c)A}nD;K$22!{9Sa&g$&VFRkggrNOa$;igWbN%!Tz4*wZIa9ixE} zH3&7P&wyddtfa+%{m6)_pR_Eaw7tN`NYVAs)oH#0Xf43F{(1~hM{qN#;h^YRs`^07 z#K5%o@M}Wxm`g>0U+rH=`O$YOa%|nslTYMKm!vA{ zc)@8xx+2Bv$QztmvLcFwBYHIu?)%>a z5mBrq4%~U~aH+SwF;*{@B$$?E6oOwmZz8h>YKkw|dE>8a(}Empx&*7bx#Hb9q8AQX z>n6mjN0ET3`}%KSiwA^eDTD%oCQ&z4Nyn3b{p1v7N`+L_*X5m{Z zR1;}=8sMq~OTj@u_&#qp|M62WFUfE2b`P78Jj%f7q;0&=`o#*>K@VhRWh(F&4OEh) z4l*i#X6dx8L2Q%^{$Bb2K;ykN_TWHL@BW_%NxR3Ln*a5I|1@l`i-H06mb*tw;H3tQ ziEC^A=Di%wzGkY9M)j;5?Mqd)i(S7LEkP7Dv+(-8pdf>6x*SyD4}$0}JFq*$<~Su~ z8ZYWotzO*)zzEUo0c<7O+80fKAgy;f3Jvdn zKpK!r$=$ChczpFG@fxT!ggx}U>3Zy_mhnNTTDr}RcF_0pq@YyG7md{s;0tAV)B&Lx z$e08ak;^q5#dPd)n>Qz<*<8W4Dk^wlXpuiv#y7nTnS!V~)_B#F^i-KB3X-df<)XpQ zzS&$&ODa&WE(@2E*XcbgVCpxUH#z=)I{wM&;rZ5~<1RU5QZ_`x!PaE85Xg#bScaT? zI9io%$&;K&ZZ;nVRx`D%L7(G^A*@hx^bQ6VF{UzRS3rJ3}}&pDJgD}x{6KJl*O`g z5h@l0%aY5T3Q-m^1E=A3Xqh03a3-%44QIw*jW}k++7z-5F)#(Ja}ouVEP@g;H0)ZF zHRn!sW!*+Xj-pPLdKd$L7m+%>fa&Ck_KcuPnAQ(VUOZpwJzp6V2u{yGurGy~14rQ@ zU19zq_~dSHs~OC24{{R4%q9>uO*0&|JY-R-a9wO{19EgMi$dWu?aHXLQF!S<(@q$m z6d6ts-Y{wjE8I+cYtZGf&(44g{K;7AjXIcp9m1WZV4NUWg}s$1SE!*0K(2bFzuY!TF z?QAqwT}{JC`LGA@amKZ(;2>2hX142D&>|kfW+4dY_&sDe80q6#!t}USl1)>?cDdv( zr5#00ZAW3=Z5CD}uTxY2>A&6ZU-O)xty&6}%#u$EEGx->piKxjde53z zHUHUqklRmx$Uwa41pO(&VQ}5oOTGJTC=9@iivD!|0T9Cf%X07ede+g#lB+uimv_i~ zs;ph?Y=eMJ$0?{OEvkWKc=c$MS0BVftL@&_G4;Y})YNZ}pt~=Gzc4ceQVLYA`$5$} zYbiH2jKT*av`Mu+ofK!L(v881F%vMaX&fmcbB-4(1swEa2)x0Fawb7jKD#p z8-}cZ0dbqhgj_Z6&JpyRM9aDfDF~XLj?cmf2iel3TtAv-(jUuC1|Of<{0 zx7J$@2i?%r+1q^zM+n=a`hW(;5BTs?@~HCL(t1DS(lY@&`-^`&`qa+!waGX zlZ!K&gzc{dtV6>t4ndSn#nvTM$WcbAl2UZ`L2xZm(afr^;v)1_P_3jV4iBGt;B_{C z26H7N35O)K1KbBCE$Dm(qyik-6*!wvwG6TdY4C@^w!Yf-{?Z{n0onK=!rLNoLHH_o z91@F!p(0!duYui^b><+(ie=&)6Q4eC#DgtZl5G_}@Uje_bL7Euu~;gIW5cRqY(4{V zB=69?S9~x-%&}zNe{_~>s6Ho3Mxh_a?wPTbNPsV5>FC_nUP|80-_`V4{^EH z+iDWl1%{`egBT`y5M&Li#~BTRtC*H3Pekx~IuB0if9;21ecRm6A;k0{-ktEnK8al8 z=>^IuXx53vx_}6xOdy8dYwz~+#_jN2j&L4w{*c%a1xd3fBKMZTJV9y(`l{%E4oBx{ z!fpvejUFF)?KeQZ6HJ1P=UZUFA4ve+-z*_%1jxa@2@5|G+~FM_)BN6HllEAp?d3-`?qeJvh$7kmS{vJs5wTVup9p9&8S=5kyx>!WMORN$Q6Isc??<5RnfEyKija3KtUN1C`7jndcMplvO3(m z5swC-6#Rmf+lh-0CE{q~f#2MP4&gy`#y-p+2MD@}6-6opGJW1e@Bj8%l>8JM)z|(o zJWj+y@b}wLwlrU{xa^I8|7<-&b6OTx zOe;waMw&B`ZS9hnTGK4%I12C15#Yw|aE1vml9+hG<%(|6VS2+sys+c2!6 zMP`89K8_7AKf$5^A{nch!fJPy>AJKa9d?JqWVVL~A|k z{IFr9{Kwh}7)!1_F+o-SKtkr6kA;z-;_msPb zCkVGQ#VCU1Iu?k7R%A6o9UV zeB|5B;rF5hR3udmY;X}AF5|0`>Y63~gx}U1i!;+xv$bope>2ndL~&ibJ{$ZAmbyOs zALQG<{P>cl(iw@tSkxPTpx;SvFy|Y@yOkcr|#_nxDP>#a!h5@B+PMZvJ1)sX6e**{k2O zSD^w2{9YEIL-baJnM8I*Yx3PC*^uNLf5!_-I%|9e?1$M25Zq*fiaHf(_9^kCfAuI zNX9npr{Hiqht0;+!t~6{$CtdlN9@$EwzshfD}{z6;jPaNBBR6CBlc!!V>p9v1iST{ zYYFy?Quh>IQ;9o&UJH_o$XNpuvtlt!2 zWzJ7BkcA9K{dc@Rf#-VB@6skLJAQ|UD`5OBOx65 z=ikT&0&q=n79%r16-~D!g=X5hP0tZ#H5a_lH z^(^n74 zgGv@S)msNm_UY-cHGi*3b$Z~CpKIuiEmgL3iDzDQ#ZJN`xe(QsuxzO!9^v|)xoV51 zjpWK9&!F0(Kw|Dk-Vgi#_zC*^ULOS~e+i$bMk7mb6pIJ=R&lW~UtHB}&9dbY5ztv{ zv_cGxHZsLm$wE}4MS8e*`#Z8zKk|1Ug~OT7U9V+TRt-_9^qP~Gqn&X0!*F9mXh#95 znu#0^N-GY=3OG;fQZONi>30J8@r*P9K4(ZJ)&v1dR+TL0 z_(rf>dEv8wPd;y6BP6@F%yqa?#cOcgih<8cnr&Fv0Ro?q-N+4+9B)gDe~V$B%n@-x z1xMo<=uru1klI(m>HaWc>Gf{!!ErF_t0X%$v9e_%P1CuKIj&@jD|^9X`>?6Vvf_@| za!Rs&XDnf=CCi4WfZ$XT#%aCO#F=?8DX-n42w^q|qkLO-#f1_+Y8F6;P~L7%8Ln-?P?k!eYm?#1YY7B?}Sl7L|S};Q0y+=G_B5Z*@D%!^Z)h zty-&CmsF{Or<}1`tD>xHnsc$#8f&KMDqQDyR~-aSSx7+xo1vUe#;?YgGoFR~A6Gabocw4n%v`KctM! zzdT1JmjuI7RjUG(b27G=>>$zv&2cZ9l1q-PxJDJdWl(ZSh@GSnj16W9yuo=od53}& zQ%3V=+6h*g21PK*)qdF@F)5K#l zl#9~PR89$wDY?2C>;x63MsaF%<{SPbp@>CMHC@x<30#J-j-vpO@prfYkQWR^j8y|G zl5kOJGbCz#6tOfw5hIBYMJ!l?3`Y}A$}bI3#38ETMW_1;f6mT=GT`OD#iH>-cmf)Q z5YwYN0?@Gkq(g3m1IZt3gt%dU8)^d_1jCvu>bAlI6iCDk4_!PRHym7|B0n5zN)8h7 z2M=GC(M0JIzzUYW*tQe{ykMad4 z3{kC!x-1K$e`Xz34(=cnNw8m(x~K5^f*`7ihppS zLN{|tNip>c#nxf7$On{_YFP}otLzs;^B4? z;};4kU?4}ZY?a2_6b5wOnFbqctMX_S zoP&%76&aWZ+4Zx-IS5#lZN!CTyhu0)d4O|}e=#4OobQAfUqIiSmhb0kq9D4KM^|tM8JD;c%nMc66BCNDAKS#oCF{w z9y;DPD+~V>t|im8;EDxCj9!z%^@q&f_4)bVeKFPe-L=K329%R$2+io8FgNuD`O5$N zfA{%mNfNOv2r4~?^~>Qy=p&REww@=CAI|oa!17OHoagxVtY46J?D~K-4mC`SFoAT_ zkEVkT6p=Ej0v*IYT!9WogAOE73e;@)GTi`&E{jMCY(V^OO;!e9m<&g7$Qr8Z=$umJ zy=(fdmwD_J?8g%;S*h|Pkto!5s)K=f<;QQgdVgFA4kJnzBlyEU(TI{T$zembf1v29 z%T>!M#$hWA^>gmlPcRJGc2s!oN_x4ywVIg6{&DzgAC6!lQ^&|fRT#i2Sc;HCqdX)e>qJAE~K-8 zbjh&=xvFh&ihzuBF#n=D8M z$dbu5L#+}3!gNv6b8!E{fBG7hDH*0(wZ8CjUl1nH)v#5JjbRl>h9)DKbx>7Ijxw3k ziGV+e!(3%ulU38<(5YglQZCe|7q2!lu78bui1JrebVH~7{k%SPqu%(m{#m_IpPPoJ zkU-+tlU%AbXgfjU*EhmG5qQ6EbqI52=5Ej5USRLtx_J$H8o&sOf4V?r>vI^#rP1*A z%Jlq=deE8x_Yz5l@0-5`qoe551SbA~_oEG%0n}{pnzdYouh_HGCI)!<+5G$>ywr8@ zaIW0Ey+~gMk3Bs<3t|*hJ&~la%Qxny0d?O0-Lo@u^#%G>$avWP39$qdc!OaK5et^xoN0000000000 z0000002l`V0C#V4WG`fIV|8t1Zgi6|wG@+ovl;?6RFj*tNCL`MljXBM46#`N0C#V4 zWG`iIWRvi-8Iwq~8UmJFlVr3!4dPz_0C#V4WG`lKZ*-Gyv=@`av>F0LW0T;tJOXcL zlODA}0-bG>VYNL1HhGhvwMYVbdXwt4KLdh$0F!|(8IyLj5R+B58Un(6lX12_0uz&y zv9>z`H>i{Dwm<^Xs*^CcJ_1^L&g9A diff --git "a/docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/Backlog \353\260\234\355\221\234.md" "b/docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/Product_Backlog_\353\260\234\355\221\234_\353\214\200\353\263\270.md" similarity index 100% rename from "docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/Backlog \353\260\234\355\221\234.md" rename to "docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/Product_Backlog_\353\260\234\355\221\234_\353\214\200\353\263\270.md" diff --git "a/docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/[\354\226\221\354\213\235 5] \354\213\234\354\212\244\355\205\234 \352\265\254\354\241\260 \354\204\244\352\263\204 \353\260\217 \352\260\234\353\260\234 \355\231\230\352\262\275 \354\226\221\354\213\235 (1).docx" "b/docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/[\354\226\221\354\213\235 5] \354\213\234\354\212\244\355\205\234 \352\265\254\354\241\260 \354\204\244\352\263\204 \353\260\217 \352\260\234\353\260\234 \355\231\230\352\262\275 \354\226\221\354\213\235.docx" similarity index 100% rename from "docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/[\354\226\221\354\213\235 5] \354\213\234\354\212\244\355\205\234 \352\265\254\354\241\260 \354\204\244\352\263\204 \353\260\217 \352\260\234\353\260\234 \355\231\230\352\262\275 \354\226\221\354\213\235 (1).docx" rename to "docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/[\354\226\221\354\213\235 5] \354\213\234\354\212\244\355\205\234 \352\265\254\354\241\260 \354\204\244\352\263\204 \353\260\217 \352\260\234\353\260\234 \355\231\230\352\262\275 \354\226\221\354\213\235.docx" diff --git "a/docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/[\354\226\221\354\213\235 5] \354\213\234\354\212\244\355\205\234 \352\265\254\354\241\260 \354\204\244\352\263\204 \353\260\217 \352\260\234\353\260\234 \355\231\230\352\262\275.md" "b/docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/[\354\226\221\354\213\235 5] \354\213\234\354\212\244\355\205\234 \352\265\254\354\241\260 \354\204\244\352\263\204 \353\260\217 \352\260\234\353\260\234 \355\231\230\352\262\275.md" new file mode 100644 index 0000000..e1b789f --- /dev/null +++ "b/docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/[\354\226\221\354\213\235 5] \354\213\234\354\212\244\355\205\234 \352\265\254\354\241\260 \354\204\244\352\263\204 \353\260\217 \352\260\234\353\260\234 \355\231\230\352\262\275.md" @@ -0,0 +1,382 @@ +# Project Document + +# System Architecture Design & Development Environment + +## Project Name + +**SafeCrowd: 군중 안전 시뮬레이터** + +02조 +202002520 은민수 +202102629 김준용 +202202546 금소현 +202302543 김학찬 +지도교수: 고영준 교수님 + +## Document Revision History + +| Rev# | Date | Affected Section | Author | +| --- | --- | --- | --- | +| 1 | 2026/04/06 | 초안 작성 및 Markdown 변환 | 02조 공동 | + +## 0. Meta Information + +| Item | Value | +| --- | --- | +| Project | SafeCrowd | +| Team | 02조 | +| Version | v1.0 | +| Framework | C++20, Qt6 Widgets, CMake, vcpkg, ECS runtime | +| Scope | Sprint 1 MVP(US-01~US-03, US-07~US-11) 중심 구조와 Sprint 2~3 확장 가능 아키텍처 | + +## 1. Project Overview + +### Vision + +SafeCrowd는 건물 관리자, 행사장 운영자, 안전관리자, 건축·공간 설계자, 재난 대응 담당자가 실제 공간 구조를 반영한 군중 시뮬레이션을 직접 다룰 수 있게 하는 데스크톱 시스템이다. +이 시스템은 실제 훈련을 반복하기 어려운 상황에서 병목, 정체, 압력 집중, 낙상, 탈출 지연 같은 위험을 사전에 식별하도록 돕는다. +사용자는 DXF 기반 공간 구조를 불러오고, 운영 조건을 바꾼 여러 시나리오를 비교하면서 더 안전한 대안을 찾을 수 있다. +SafeCrowd는 전문가 전용 범용 시뮬레이터가 아니라, 비전문가도 이해할 수 있는 UI와 설명 가능한 위험 지표를 갖춘 의사결정 지원 도구를 목표로 한다. + +### Scope + +#### In Scope + +- DXF 도면으로부터 보행 가능 영역, 벽, 출구, 장애물을 추출하는 시설 레이아웃 import 파이프라인 +- 임포트 결과를 `RawImportModel -> CanonicalGeometry -> FacilityLayout2D`로 정규화하는 도메인 모델 +- 출구 누락, 연결 단절, 최소 폭 미달을 검증하는 구조 검토 및 실행 가능 상태 판정 +- `application -> domain -> engine` 계층을 따르는 Qt 기반 데스크톱 애플리케이션 +- 고정 timestep 기반 ECS runtime과 시작, 일시정지, 정지, 상태 요약을 포함한 실행 제어 +- Sprint 2~3에서 결과 비교, 위험 분석, 추천 기능으로 확장 가능한 구조 설계 + +#### Out of Scope + +- 웹 서비스, 모바일 앱, 멀티유저 협업 기능 +- 결제, 사용자 계정, 권한 관리 같은 운영 지원 시스템 +- 실시간 IoT 센서 연동이나 외부 관제 시스템과의 온라인 통합 +- 서버 중심 REST API 아키텍처 +- 초기 버전에서의 3D 렌더링과 물리 기반 시각 효과 + +### Success Metrics + +- 하나의 공간 도면으로 기준안 1개와 대안 2개 이상을 구성하고 비교할 수 있다. +- 대표 시나리오에서 1,000명 규모의 군중 시뮬레이션을 안정적으로 실행할 수 있다. +- 총 대피 시간, 90%·95% 대피 시간, 최대 밀도, 압박 위험, 낙상, 미대피 인원 등 핵심 안전 지표 6종 이상을 자동 산출한다. +- 위험 히트맵으로 시나리오별 위험 구역과 변화 정도를 직관적으로 비교할 수 있다. +- 분석 결과를 바탕으로 운영 대안 3개 이상을 근거와 함께 제안할 수 있다. + +## 2. Architecture Design + +### System Context Diagram + +```mermaid +flowchart LR + U1["건물 관리자 / 안전관리자"] --> APP["SafeCrowd Desktop Application"] + U2["행사장 운영자 / 재난 대응 담당자"] --> APP + U3["건축·공간 설계자"] --> APP + + FILE["DXF 도면 파일"] --> APP + APP --> OUT1["레이아웃 검토 결과"] + APP --> OUT2["시뮬레이션 상태 및 위험 지표"] + APP --> OUT3["비교 결과 및 운영 대안"] +``` + +시스템의 1차 입력은 사용자의 공간 도면과 시나리오 조건이며, 1차 출력은 레이아웃 검토 결과, 시뮬레이션 상태, 위험 지표와 비교 결과이다. 초기 버전은 외부 온라인 API보다 동일 프로세스 내부의 계층 분리를 우선하며, 데스크톱 애플리케이션 하나 안에서 입력, 분석, 시각화를 모두 수행한다. + +### Logical Architecture + +```mermaid +flowchart LR + subgraph Application["application layer"] + MW["MainWindow"] + UI["Scenario / Import / Result UI (planned)"] + end + + subgraph Domain["domain layer"] + SD["SafeCrowdDomain"] + DXF["DxfImportService"] + FLB["FacilityLayoutBuilder"] + IVS["ImportValidationService"] + DM["Scenario / Risk / Recommendation modules (planned)"] + end + + subgraph Engine["engine layer"] + RT["EngineRuntime"] + FC["FrameClock"] + ER["EntityRegistry"] + PCS["PackedComponentStorage"] + SYS["EngineSystem / WorldQuery / CommandBuffer"] + end + + QT["Qt6 Widgets"] --> Application + FILESYS["DXF file system input"] --> DXF + + MW --> SD + UI --> DXF + UI --> IVS + SD --> RT + DXF --> FLB + DXF --> IVS + DM --> RT + RT --> FC + RT --> ER + RT --> PCS + RT --> SYS +``` + +### Layer Responsibilities + +| Layer | 주요 요소 | 책임 | 금지/제한 | +| --- | --- | --- | --- | +| `application` | `MainWindow`, Qt signal/slot, 향후 import/scenario/result UI | 사용자 입력 수집, 도메인 서비스 호출, 상태 표시 | ECS 내부 로직과 위험 계산식을 직접 가지지 않음 | +| `domain` | `SafeCrowdDomain`, `DxfImportService`, `FacilityLayoutBuilder`, `ImportValidationService`, 향후 시나리오/위험/추천 모듈 | SafeCrowd 문제 영역 규칙, 공간 구조 정규화, 실행 가능성 검토, 위험 지표 정의 | Qt UI 의존 금지 | +| `engine` | `EngineRuntime`, `FrameClock`, `EntityRegistry`, `ComponentRegistry`, `PackedComponentStorage`, `WorldQuery`, `CommandBuffer` | 범용 ECS runtime, fixed timestep, world 상태 관리, 시스템 실행 기반 제공 | SafeCrowd 도메인 지식 의존 금지 | + +핵심 의존 방향은 아래 한 줄로 요약된다. + +`application -> domain -> engine` + +### Core Flow 1: 시뮬레이션 시작 및 프레임 업데이트 + +```mermaid +sequenceDiagram + participant User as User + participant MW as MainWindow + participant Domain as SafeCrowdDomain + participant Runtime as EngineRuntime + participant Clock as FrameClock + + User->>MW: Start 클릭 + MW->>Domain: start() + Domain->>Runtime: play() + + loop every 16ms + MW->>Domain: update(1/60) + Domain->>Runtime: stepFrame(deltaSeconds) + Runtime->>Clock: accumulate delta + Clock-->>Runtime: fixed step count + alpha + Runtime-->>Domain: EngineStats 갱신 + MW->>Domain: summary() + Domain-->>MW: SimulationSummary + MW-->>User: 상태 / Frames / Fixed Steps 표시 + end +``` + +현재 Qt 애플리케이션은 `Start`, `Pause`, `Stop` 버튼과 `QTimer`를 사용해 실행 루프를 구동한다. `SafeCrowdDomain`은 application과 engine 사이의 얇은 파사드 역할을 수행하며, `EngineRuntime`은 프레임 누적과 상태 관리의 실제 책임을 가진다. + +### Core Flow 2: DXF 도면 import 및 실행 가능 레이아웃 생성 + +```mermaid +sequenceDiagram + participant User as User + participant App as Application UI + participant Importer as DxfImportService + participant Builder as FacilityLayoutBuilder + participant Validator as ImportValidationService + participant Result as ImportResult + + User->>App: DXF 파일 선택 + App->>Importer: importFile(ImportRequest) + Importer->>Importer: DXF ASCII parse + Importer->>Importer: RawImportModel 생성 + Importer->>Importer: CanonicalGeometry 정규화 + Importer->>Builder: build(canonicalGeometry) + Builder-->>Importer: FacilityLayout2D + build issues + Importer->>Validator: validate(layout) + Validator-->>Importer: validation issues + Importer-->>App: ImportResult + App->>Result: readyForSimulation() + Result-->>App: 실행 가능 / 차단 사유 + App-->>User: 검토 결과, 경고, 차단 이슈 표시 +``` + +이 흐름은 Sprint 1의 핵심 가치인 `도면 불러오기 -> 구조 검토 -> 실행 가능 여부 판단`을 담당한다. `DxfImportService`는 파일 포맷 처리와 정규화를 담당하고, `FacilityLayoutBuilder`는 시뮬레이션 입력에 가까운 레이아웃 객체를 만들며, `ImportValidationService`는 출구 연결성과 최소 조건을 검증한다. 현재 저장소에는 domain 중심의 import 파이프라인이 구현되어 있고, application의 전용 import 화면 연결은 후속 작업으로 남아 있다. + +## 3. 데이터 설계 and/or API 설계 + +본 프로젝트는 데이터베이스 중심 CRUD 시스템이 아니라 데스크톱 시뮬레이션 시스템이므로, 전통적인 ERD 대신 도메인 데이터 모델과 내부 인터페이스를 설계 기준으로 사용한다. + +### Data Model Diagram + +```mermaid +classDiagram + class ImportRequest { + sourcePath + requestedFormat + preserveRawModel + runValidation + } + + class RawImportModel { + format + unit + sourceDocumentId + levelId + entities[] + } + + class CanonicalGeometry { + levelId + walkableAreas[] + walls[] + openings[] + obstacles[] + verticalLinks[] + } + + class FacilityLayout2D { + id + name + levelId + zones[] + connections[] + barriers[] + controls[] + } + + class ImportIssue { + severity + code + message + isBlocking + } + + class ImportResult { + rawModel + canonicalGeometry + layout + issues[] + traceRefs[] + reviewStatus + readyForSimulation() + } + + class SafeCrowdDomain { + start() + pause() + stop() + update(deltaSeconds) + summary() + } + + class EngineRuntime { + play() + pause() + stop() + stepFrame(deltaSeconds) + stats() + state() + } + + ImportRequest --> ImportResult : importFile() + ImportResult o--> RawImportModel + ImportResult o--> CanonicalGeometry + ImportResult o--> FacilityLayout2D + ImportResult o--> ImportIssue + SafeCrowdDomain --> EngineRuntime +``` + +### Integrity / Consistency Rules + +- `FacilityLayout2D`에는 최소 1개의 `Exit` zone이 있어야 한다. +- 모든 non-exit zone은 적어도 1개의 exit zone으로 연결되는 경로를 가져야 한다. +- `Connection2D.effectiveWidth`가 데모 최소 폭 0.9m보다 작으면 경고를 발생시킨다. +- blocking import issue가 존재하면 시뮬레이션은 시작할 수 없다. +- `ImportResult.reviewStatus`는 `Approved` 또는 `NotRequired`이어야 실행 가능 상태가 된다. +- `engine` 레이어는 SafeCrowd 고유 타입을 모르고, `domain`은 Qt 타입을 모른다. + +### Internal Interface Catalog + +초기 버전은 외부 REST API를 주 인터페이스로 사용하지 않는다. 대신 동일 프로세스 내부에서 계층 간 계약을 명확히 하는 방식으로 설계한다. + +| Interface | Input | Output | Purpose | +| --- | --- | --- | --- | +| `DxfImportService::importFile` | `ImportRequest` | `ImportResult` | DXF 파일을 읽어 raw/canonical/layout 단계 결과와 이슈를 함께 반환 | +| `FacilityLayoutBuilder::build` | `CanonicalGeometry` | `FacilityLayoutBuildResult` | 추상 기하 정보를 시뮬레이션 친화적 레이아웃으로 변환 | +| `ImportValidationService::validate` | `FacilityLayout2D` | `std::vector` | 출구 누락, 단절 구역, 최소 폭 미달 검증 | +| `ImportResult::readyForSimulation` | 내부 상태 | `bool` | 검토 승인과 차단 이슈를 종합해 실행 가능 여부 판정 | +| `SafeCrowdDomain::start/pause/stop/update/summary` | 사용자 명령, `deltaSeconds` | `SimulationSummary` | application에서 engine 실행을 제어하는 도메인 파사드 | +| `EngineRuntime::play/pause/stop/stepFrame` | 실행 명령, 프레임 시간 | `EngineStats`, `EngineState` | 고정 timestep 기반 runtime 상태와 진행 통계 관리 | + +## 4. Development Environment + +### Environment Summary + +| Item | Value | +| --- | --- | +| OS | Windows x64 개발 환경 | +| Language | C++20 | +| Generator / Compiler | Visual Studio 17 2022 / MSVC | +| Build System | CMake 3.25+ | +| Package Manager | vcpkg | +| UI Library | Qt6 Widgets (`qtbase`, `widgets` feature) | +| Test | CTest + `safecrowd_tests` | +| Source Root | `src/application`, `src/domain`, `src/engine` | +| Main Targets | `ecs_engine`, `safecrowd_domain`, `safecrowd_app` | + +### Build / Test Commands + +```powershell +cmake --preset windows-debug +cmake --build --preset build-debug +ctest --preset test-debug +``` + +Qt 앱 없이 engine/domain/test만 빠르게 확인할 때는 아래 경로를 사용한다. + +```powershell +cmake --preset windows-debug-no-app +cmake --build --preset build-no-app-debug +ctest --preset test-no-app-debug +``` + +### Preset / Dependency Notes + +- `CMakePresets.json`은 `windows-debug`, `windows-debug-no-app`, `windows-release`, `windows-release-no-app` 구성을 제공한다. +- Qt를 포함하는 preset은 `VCPKG_ROOT`가 설정된 환경에서 `CMAKE_TOOLCHAIN_FILE=$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake`를 사용한다. +- `vcpkg.json`은 `qtbase`의 default feature를 끄고 `widgets` feature만 활성화한다. +- import stack은 `cmake/SafeCrowdImportStack.cmake`를 통해 domain 계층에서만 연결되며, 기본 경로는 CI와 로컬 최소 환경을 위해 보수적으로 유지한다. + +### Repository Structure + +```text +Project/ + CMakeLists.txt + CMakePresets.json + vcpkg.json + src/ + application/ + domain/ + engine/ + tests/ + docs/ + uml/ + external/ +``` + +### Development Conventions + +- include root는 `src/`이며, `#include "application/..."`, `#include "domain/..."`, `#include "engine/..."` 형식을 사용한다. +- `engine`은 `domain`이나 `application`을 참조하지 않는다. +- `domain`은 Qt UI 코드를 참조하지 않는다. +- CI는 빠른 피드백을 위해 우선 `SAFECROWD_BUILD_APP=OFF` 경로를 검증하고, 로컬에서는 전체 Qt 앱 빌드도 유지한다. + +## 5. Traceability + +### Requirement to Design Element Summary + +| Requirement | Design Element | Notes | +| --- | --- | --- | +| US-01 도면 불러오기 | `DxfImportService`, `RawImportModel`, `CanonicalGeometry`, `FacilityLayoutBuilder` | DXF 파일을 시뮬레이션 입력 구조로 변환하는 Sprint 1 핵심 흐름 | +| US-02 구조 검토 및 경고 확인 | `ImportValidationService`, `ImportIssue`, `ImportTraceRef`, `ImportResult.reviewStatus` | 차단 이슈와 추적 정보를 함께 제공해 검토 가능 상태 구성 | +| US-03 수동 보정 후 실행 가능 상태 확정 | `FacilityLayout2D`, `Connection2D`, `ControlPoint2D`, `ImportResult::readyForSimulation()` | 레이아웃 수정과 승인 결과를 반영해 실행 가능 여부 판정 | +| US-07 인원 배치 기반 실행 제어 | `MainWindow`, `SafeCrowdDomain`, `EngineRuntime::play/pause/stop/stepFrame` | Start/Pause/Stop 중심의 application-domain-engine 연결 | +| US-09 실시간 진행 상태 확인 | `SimulationSummary`, `EngineStats`, `MainWindow::refreshStatusLabel` | 상태, frame index, fixed step index, alpha 표시 | +| US-10 병목·정체 탐지 | `FacilityLayout2D.connections/zones`, 향후 `LocalDensityField`, `FlowMeasurementSystem`, `CongestionStateSystem` | 현재 레이아웃 기반 입력을 마련했고, 위험 탐지 로직은 `docs/위험 정의.md`를 기준으로 확장 설계 | +| US-11 압력 집중 위험 탐지 | 향후 `CompressionForce`, `CompressionExposure`, `CompressionLoadSystem`, `AsphyxiationRiskSystem` | 압박 위험 모델은 도메인 확장 설계 항목으로 정의됨 | +| US-15~US-17 결과 시각화 및 비교 | 향후 Result UI, 히트맵 레이어, 비교 요약 뷰 | 현재 계층 구조는 Sprint 2 비교/시각화 기능을 application layer에 추가할 수 있게 설계됨 | +| US-18~US-19 운영 대안 추천 | 향후 Recommendation module, scenario diff, rationale model | 현재 문서 구조와 위험 지표 정의를 기반으로 Sprint 3에서 연결 예정 | + +### Traceability Note + +현재 저장소에는 Sprint 1 중심의 import, 실행 제어, 상태 요약 구조가 구현되어 있으며, Sprint 2~3 기능은 백로그와 위험 정의 문서를 근거로 확장 설계가 정리되어 있다. 따라서 본 문서는 현재 구현 구조를 기준으로 하되, 이후 결과 비교와 운영 대안 추천까지 수용할 수 있는 계층 및 데이터 모델을 함께 제시한다. diff --git "a/docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/\353\224\224\354\236\220\354\235\270\352\260\234\354\232\224\354\204\234_2\355\214\200.docx" "b/docs/\354\240\234\354\266\234\354\232\251/\354\242\205\355\225\251\354\204\244\352\263\204/\353\224\224\354\236\220\354\235\270\352\260\234\354\232\224\354\204\234_2\355\214\200.docx" index 4c25216d565fc432cbf538d300134df646035810..344779da246f487accf1d3a0369f5b20717dca21 100644 GIT binary patch delta 14344 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 PPMF+3(}1mb5=adI&E7B# delta 17219 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

|PlhH3{8 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 I@hKpc0L?%-RR910 From 46c6e336161b6952395e345d6f2d66c253808c18 Mon Sep 17 00:00:00 2001 From: learncold Date: Tue, 7 Apr 2026 01:59:38 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=8B=9C?= =?UTF-8?q?=EB=82=98=EB=A6=AC=EC=98=A4=20=EB=AC=B8=EC=84=9C=20=EB=B3=B5?= =?UTF-8?q?=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...34\353\202\230\353\246\254\354\230\244.md" | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 "docs/product/\354\202\254\354\232\251\354\236\220 \354\213\234\353\202\230\353\246\254\354\230\244.md" diff --git "a/docs/product/\354\202\254\354\232\251\354\236\220 \354\213\234\353\202\230\353\246\254\354\230\244.md" "b/docs/product/\354\202\254\354\232\251\354\236\220 \354\213\234\353\202\230\353\246\254\354\230\244.md" new file mode 100644 index 0000000..4042b7d --- /dev/null +++ "b/docs/product/\354\202\254\354\232\251\354\236\220 \354\213\234\353\202\230\353\246\254\354\230\244.md" @@ -0,0 +1,144 @@ +# SafeCrowd 사용자 시나리오 + +--- + +## 문서 목적 +본 문서는 SafeCrowd를 사용하는 대표 이해당사자가 어떤 상황에서 시스템을 활용하는지 설명한다. 각 시나리오는 개요서의 핵심 목표인 위험 식별, 시나리오 비교, 운영 대안 추천, 의사결정 지원에 맞춰 작성한다. + +--- + +## 시나리오 1. 재난 대응 담당자의 비상 대응 계획 검토 + +### 사용자 +재난 대응 담당자 + +### 상황 +실제 대피 훈련은 비용과 시간이 많이 들며, 동일 조건으로 반복 검증하기 어렵다. 담당자는 화재, 출구 통제, 연기 확산, 특정 구역 혼잡 같은 다양한 비상 상황을 가정하여 대응 계획을 사전에 검토하고자 한다. + +### 목표 +- 실제 훈련 전에 다양한 비상 상황을 가상으로 검토한다. +- 병목, 낙상, 압박 고위험 상태, 탈출 지연, 미대피 또는 제한시간 초과 가능성이 높은 조건을 식별한다. +- 대응 우선순위와 통제 전략을 수립한다. + +### 사전 조건 +- 대상 시설의 공간 구조 데이터가 준비되어 있다. +- 대피 인원 규모와 기본 이동 목적지가 설정되어 있다. + +### 주요 흐름 +1. 사용자는 대상 시설의 구조 데이터를 불러오거나 직접 입력한다. +2. 사용자는 기본 대피 시나리오를 생성하고 인원 수, 출구 위치, 통로 폭, 대피 시작 조건을 설정한다. +3. 사용자는 출구 폐쇄, 특정 구역 통제, 장애물 추가, 연기 발생, 인원 밀집 같은 비상 변수를 적용한 대안 시나리오를 여러 개 만든다. +4. 시스템은 각 시나리오를 시뮬레이션 가능한 형태로 생성하고 실행 준비 상태를 보여준다. +5. 사용자는 여러 시나리오를 선택해 실행한다. +6. 시스템은 시뮬레이션 도중 혼잡 구역, 밀도 증가, 압력 증가, 낙상 발생, 탈출 지연 가능성을 시각적으로 표시한다. +7. 시스템은 시나리오 종료 후 총 대피 시간, 구역별 핵심 위험 지표, 낙상 인원, 압박 고위험 노출 인원, 미대피 또는 제한시간 초과 인원, 위험 히트맵을 요약하여 보여준다. +8. 시스템은 결과를 바탕으로 안내 인력 추가, 대체 출구 유도, 통제 구역 재설정, 순차 퇴장 같은 대응안 후보를 우선순위와 근거와 함께 제안한다. +9. 사용자는 추천안을 검토해 그대로 적용하거나 일부를 수정해 새로운 대안 시나리오로 만든다. +10. 사용자는 수정된 시나리오를 다시 실행해 이전 결과와 비교한다. + +### 대안 흐름 +- 구조 데이터가 없으면 사용자는 시스템 내 편집 기능으로 통로, 출구, 장애물을 직접 배치한다. +- 특정 시나리오에서 미대피 또는 제한시간 초과 비율이 높게 나오면 시스템은 순차 퇴장, 출구 추가 개방, 통제 구역 재설정 같은 대응안을 우선 추천하고, 사용자는 이를 검토한다. + +### 산출물 +- 시나리오별 대피 시간 비교표 +- 위험 구간 히트맵 +- 낙상, 압박 고위험 노출, 미대피/제한시간 초과 인원 통계 +- 추천 운영 대안 목록과 각 대안의 제안 근거 +- 대응 계획 수립에 사용할 근거 자료 + +### 기대 결과 +- 반복 훈련 없이도 다양한 재난 조건을 검토할 수 있다. +- 위험 구간과 취약 상황을 빠르게 식별할 수 있다. +- 실제 대응 계획의 완성도를 높일 수 있다. +- 위험 구간 분석에서 대응안 도출까지 걸리는 시간을 줄일 수 있다. + +--- + +## 시나리오 2. 행사장 운영자 및 안전 관리자의 대규모 인파 분산 계획 검토 + +### 사용자 +행사장 운영자 및 안전 관리자 + +### 상황 +공연장, 경기장, 축제장 같은 대형 행사 공간에서는 종료 직후 짧은 시간 안에 많은 인원이 동시에 이동한다. 운영자는 퇴장 동선, 출구 개방 방식, 통제 구역 설정에 따라 병목과 압박 고위험 상태가 크게 달라질 수 있으므로, 실제 행사 전에 대규모 인파 분산 계획을 검토하고자 한다. + +### 목표 +- 대규모 인파 이동 상황에서 위험 구간을 사전에 식별한다. +- 퇴장 유도와 구역 통제 방식에 따른 핵심 위험 지표 차이를 비교한다. +- 행사 운영 계획 수립에 필요한 객관적 근거를 확보한다. + +### 사전 조건 +- 행사장 구조와 주요 출입구, 통로, 계단 정보가 시스템에 반영되어 있다. +- 행사 종료 시점의 예상 인원 규모와 구역별 분포가 정리되어 있다. + +### 주요 흐름 +1. 사용자는 행사장 구조를 불러오고 주요 출구, 복도, 계단, 펜스 구역, 통제 가능 구역을 확인한다. +2. 사용자는 행사 종료 직후를 기준으로 구역별 인원 규모와 이동 방향을 설정한다. +3. 사용자는 출구 일부 폐쇄, 구역별 순차 퇴장, 유도 펜스 설치, 특정 통로 일방화, 안전요원 배치 같은 인파 분산 대안을 여러 개 생성한다. +4. 시스템은 각 운영 대안을 기반으로 대규모 군중 이동 시뮬레이션을 실행한다. +5. 시스템은 병목 구간, 최대 밀도, 압력 집중 구역, 역방향 흐름 충돌 가능성, 탈출 지연 구간을 시각화한다. +6. 시스템은 각 대안의 핵심 위험 지표와 이동 흐름을 비교하고, 출구 추가 개방, 구역별 순차 퇴장, 일방통행 전환 같은 분산 계획 후보를 우선순위화해 제안한다. +7. 사용자는 제안된 후보와 직접 만든 대안을 함께 검토하여 어떤 분산 계획이 가장 안전한지 확인한다. +8. 사용자는 가장 적절한 계획을 선택하고 실제 행사 운영 대안에 반영한다. + +### 대안 흐름 +- 특정 출구 앞에서 밀도와 압력이 임계치 이상으로 높게 나타나면 사용자는 출구 추가 개방 또는 구역별 분산 퇴장 시나리오를 다시 생성한다. +- 특정 대안에서 역방향 흐름 충돌이 반복되면 시스템은 동선 분리, 일방통행, 통제 구역 확장 같은 수정안을 우선 추천하고, 사용자는 이를 검토한다. + +### 산출물 +- 인파 분산안별 대피 시간 및 핵심 위험 지표 비교 자료 +- 병목, 압력 집중, 탈출 지연 구간 시각화 결과 +- 출구 운영 방식, 통제 방식, 유도 방식에 대한 비교 근거 +- 추천 분산 계획 목록과 우선순위 근거 + +### 기대 결과 +- 행사 종료 후 대규모 인파 이동에서 사고 가능성이 높은 구간을 사전에 파악할 수 있다. +- 인파 분산 계획 변경이 안전성에 미치는 영향을 빠르게 검토할 수 있다. +- 행사 운영 판단을 뒷받침할 객관적 자료를 확보할 수 있다. +- 운영자가 직접 모든 대안을 떠올리지 않아도 우선 검토할 계획 후보를 빠르게 얻을 수 있다. + +--- + +## 시나리오 3. 건축·공간 설계자의 설계안 안전성 비교 + +### 사용자 +건축·공간 설계자 + +### 상황 +건물 또는 행사장의 초기 설계 단계에서는 통로 폭, 출구 수, 공간 배치가 군중 흐름에 어떤 영향을 주는지 직관적으로 판단하기 어렵다. 설계자는 여러 설계안을 비교하여 더 안전한 동선을 찾고자 한다. + +### 목표 +- 설계안별 군중 흐름과 대피 성능을 비교한다. +- 병목과 위험 구간이 적은 구조를 선택한다. +- 설계 변경의 타당성을 설명할 수 있는 자료를 확보한다. + +### 사전 조건 +- 비교할 설계안이 2개 이상 준비되어 있다. +- 각 설계안의 공간 배치와 출구 정보가 입력 가능하다. + +### 주요 흐름 +1. 사용자는 설계안 A, 설계안 B처럼 비교할 공간 구조를 각각 시스템에 입력한다. +2. 사용자는 동일한 인원 조건과 이용 목적을 기준으로 비교 시나리오를 생성한다. +3. 사용자는 필요 시 특정 설계안에 출구 추가, 통로 확장, 장애물 제거 같은 구조 변경안을 반영한다. +4. 시스템은 동일한 조건에서 각 설계안을 시뮬레이션하여 이동 흐름을 재현한다. +5. 시스템은 설계안별 총 이동 시간, 병목 위치, 최대 밀도, 미대피 또는 제한시간 초과 여부를 시각화하고 비교한다. +6. 시스템은 출구 폭 확대, 출구 분산 배치, 장애물 제거, 통로 재구성 같은 수정안 후보를 근거와 함께 제안한다. +7. 사용자는 위험 구간이 집중되는 구조적 원인을 확인하고, 제안된 수정안 또는 직접 만든 수정안을 다시 비교한다. +8. 사용자는 더 안전하고 효율적인 설계안을 선택한다. + +### 대안 흐름 +- 특정 설계안에서 출구 앞 아치형 정체가 심하면 시스템은 출구 폭 확대 또는 출구 분산 배치를 우선 추천하고, 사용자는 이를 검토한다. +- 시야 제한 조건에서도 핵심 위험 지표가 높게 나타나면 시스템은 표지 배치 강화나 동선 구조 조정을 후보로 제안한다. + +### 산출물 +- 설계안별 대피 성능 비교표 +- 병목 및 위험 구역 시각화 결과 +- 구조 변경 전후 비교 자료 +- 설계 수정안 추천 목록과 추천 근거 + +### 기대 결과 +- 설계 단계에서 잠재적 위험을 미리 발견할 수 있다. +- 공간 구조 변경이 군중 흐름에 주는 영향을 빠르게 검토할 수 있다. +- 설계안 선택과 수정에 필요한 근거를 확보할 수 있다. +- 설계자가 먼저 시도해 볼 수정안 후보를 시스템이 제시해 검토 속도를 높일 수 있다.