From 953cadfd99bec254ddd9448574ab1156cbb9ff2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Thu, 12 Mar 2026 12:39:15 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[pmis]=20BIM=20=EB=B7=B0=EC=96=B4=203D?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=86=A0=ED=83=80=EC=9E=85=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Three.js 기반 3D 건물 모델 뷰어 - 기둥/보/벽/창/지붕 등 요소별 색상 구분 및 클릭 선택 - 시점 전환(투시도/정면/우측/상부/배면), 요소 토글, 와이어프레임 - PMIS 사이드바 아코디언 메뉴 + BIM 뷰어 링크 추가 --- .../Controllers/Juil/PlanningController.php | 9 + resources/views/juil/bim-viewer.blade.php | 551 ++++++++++++++++++ .../views/juil/construction-pmis.blade.php | 37 +- routes/web.php | 1 + 4 files changed, 587 insertions(+), 11 deletions(-) create mode 100644 resources/views/juil/bim-viewer.blade.php diff --git a/app/Http/Controllers/Juil/PlanningController.php b/app/Http/Controllers/Juil/PlanningController.php index 97baaf3d..7de5f8db 100644 --- a/app/Http/Controllers/Juil/PlanningController.php +++ b/app/Http/Controllers/Juil/PlanningController.php @@ -48,6 +48,15 @@ public function constructionPmis(Request $request): View|Response return view('juil.construction-pmis'); } + public function bimViewer(Request $request): View|Response + { + if ($request->header('HX-Request')) { + return response('', 200)->header('HX-Redirect', route('juil.construction-pmis.bim-viewer')); + } + + return view('juil.bim-viewer'); + } + public function pmisWeather(WeatherService $weatherService): JsonResponse { $forecasts = $weatherService->getWeeklyForecast(); diff --git a/resources/views/juil/bim-viewer.blade.php b/resources/views/juil/bim-viewer.blade.php new file mode 100644 index 00000000..c8f22db4 --- /dev/null +++ b/resources/views/juil/bim-viewer.blade.php @@ -0,0 +1,551 @@ +@extends('layouts.app') + +@section('title', 'BIM 뷰어') + +@section('content') +
+@endsection + +@push('scripts') + + + + +@include('partials.react-cdn') + +@endpush diff --git a/resources/views/juil/construction-pmis.blade.php b/resources/views/juil/construction-pmis.blade.php index 04b5088c..91ab51e2 100644 --- a/resources/views/juil/construction-pmis.blade.php +++ b/resources/views/juil/construction-pmis.blade.php @@ -20,7 +20,9 @@ ════════════════════════════════════════════════ */ const PMIS_MENUS = [ - { icon: 'ri-building-2-line', label: 'BIM 관리', id: 'bim' }, + { icon: 'ri-building-2-line', label: 'BIM 관리', id: 'bim', children: [ + { label: 'BIM 뷰어', url: '/juil/construction-pmis/bim-viewer' }, + ]}, { icon: 'ri-line-chart-line', label: '시공관리', id: 'construction' }, { icon: 'ri-file-list-3-line', label: '품질관리', id: 'quality' }, { icon: 'ri-shield-check-line', label: '안전관리', id: 'safety' }, @@ -29,6 +31,7 @@ function PmisSidebar({ onOpenProfile }) { const [profile, setProfile] = useState(null); + const [expandedMenu, setExpandedMenu] = useState(null); useEffect(() => { fetch('/juil/construction-pmis/profile', { headers: { 'Accept': 'application/json' } }) @@ -73,16 +76,28 @@ className="absolute top-3 right-3 p-1 rounded-lg text-gray-400 hover:text-gray-6 {/* 네비게이션 메뉴 */}
{PMIS_MENUS.map(menu => ( - +
+ + {expandedMenu === menu.id && menu.children && ( +
+ {menu.children.map(child => ( + + {child.label} + + ))} +
+ )} +
))}
diff --git a/routes/web.php b/routes/web.php index ff8a2947..d73a1035 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1728,6 +1728,7 @@ Route::get('/construction-pmis/weather', [PlanningController::class, 'pmisWeather'])->name('construction-pmis.weather'); Route::get('/construction-pmis/profile', [PlanningController::class, 'pmisProfile'])->name('construction-pmis.profile'); Route::put('/construction-pmis/profile', [PlanningController::class, 'pmisProfileUpdate'])->name('construction-pmis.profile.update'); + Route::get('/construction-pmis/bim-viewer', [PlanningController::class, 'bimViewer'])->name('construction-pmis.bim-viewer'); // 공사현장 사진대지 Route::prefix('construction-photos')->name('construction-photos.')->group(function () {