engine-bridge v3 live: /scene /camera /selection all real (#10)

Live end-to-end verification against EG-BIM Modeler succeeded on the
second attempt:

  /health    -> {"status":"ok","port":38080}
  /scene     -> {"object_count":4,"document_path":"NewSpace0"}
  /camera    -> {"eye":[192.97,-328.52,170.72],
                 "target":[33.03,-72.61,10.78],
                 "up":[0,0,1],"fov":45}
  /selection -> {"selected_ids":["ac0380a2-...","d9a287ee-..."]}

1st attempt returned default-zero camera. Root cause: the viewport lambda
used EditorPlugin.View, which is only populated when the plugin is
actually Run() by a user trigger; our bridge plugin just boots an HTTP
server from its constructor and never runs a command, so View stayed
null. Space access worked because RootSpace goes through AppManager,
which is populated for the whole app.

Fix (HmEgBridgePlugin.BuildProvider):

  Before: viewportProvider = () => View;
  After:  viewportProvider = () => {
              var vm = AppManager?.ViewportManager;
              if (vm is null) return null;
              return vm.FocusedViewport ?? vm.Viewports.FirstOrDefault();
          };

Confirmed against read-only view of
  HmEGApplicationManagementLibrary/SubManager/ViewportManager.cs
which exposes FocusedViewport and Viewports. EGViewport : HmEGViewport
so the lambda matches the Func<HmEGViewport?> contract directly.

Plus: scripts/deploy-egbim-plugin.bat for one-click deploy. Checks for
a running SUT, builds Debug, purges the legacy Recordingtest.EgPlugin
folder, cleans the destination, copies 3 DLLs (+ PDBs) into
  EG-BIM Modeler/Plugins/Recordingtest.Sut.EgBim.PluginHost/
and prints the curl commands for verification. HmEG.dll and the
Editor*.dll assemblies are deliberately NOT copied — the SUT already
supplies them.

PROGRESS.md: engine-bridge v3 row finalized; the long-running "라이브
검증 대기" item is done. PLAN.md P1 advances to the Runner <-> sidecar
integration (snapshot /scene /camera /selection at scenario end and
include in the golden baseline).

Follow-up (noted in history): document_path returned "NewSpace0" for
an unsaved scratch document — need to retest with a saved .hmeg file
to confirm the real FileManager.CurrentFile round-trip.

Ref: #10 follow-up, engine-bridge-v3 contract DoD D7 satisfied.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
minsung
2026-04-09 11:38:51 +09:00
parent 9fe053619f
commit 062a285462
5 changed files with 217 additions and 10 deletions

View File

@@ -0,0 +1,85 @@
@echo off
REM Deploy Recordingtest.Sut.EgBim.PluginHost into the local EG-BIM Modeler
REM Plugins folder. Build first, then copy the plugin + HmEG-aware + generic
REM bridge DLLs side-by-side so MEF discovery picks them up as one plugin.
REM
REM Usage: double-click, or: scripts\deploy-egbim-plugin.bat
setlocal enableextensions
cd /d "%~dp0.."
set "CSPROJ=src\Sut\EgBim\Recordingtest.Sut.EgBim.PluginHost\Recordingtest.Sut.EgBim.PluginHost.csproj"
set "OUTDIR=src\Sut\EgBim\Recordingtest.Sut.EgBim.PluginHost\bin\Debug\net8.0-windows"
set "DEST=EG-BIM Modeler\Plugins\Recordingtest.Sut.EgBim.PluginHost"
echo ============================================================
echo [1/4] Safety check — is EG-BIM Modeler running?
echo ============================================================
tasklist /FI "IMAGENAME eq EG-BIM Modeler.exe" 2>nul | find /I "EG-BIM Modeler.exe" >nul
if not errorlevel 1 (
echo.
echo [WARN] EG-BIM Modeler is running. Close it before deploying
echo to avoid locked plugin DLLs.
echo.
pause
exit /b 1
)
echo ============================================================
echo [2/4] Build Recordingtest.Sut.EgBim.PluginHost (Debug)
echo ============================================================
dotnet build "%CSPROJ%" -c Debug -nologo -v q
if errorlevel 1 (
echo.
echo [ERROR] Build failed. Aborting deploy.
pause
exit /b 1
)
echo ============================================================
echo [3/4] Purge legacy and fresh-copy plugin folder
echo ============================================================
if exist "EG-BIM Modeler\Plugins\Recordingtest.EgPlugin" (
echo Removing legacy Recordingtest.EgPlugin folder...
rmdir /s /q "EG-BIM Modeler\Plugins\Recordingtest.EgPlugin"
)
if exist "%DEST%" (
echo Cleaning existing %DEST%...
rmdir /s /q "%DEST%"
)
mkdir "%DEST%"
REM Copy plugin entry + HmEG-aware provider + generic contract.
REM Intentionally *not* copying HmEG.dll / Editor*.dll — those are already
REM provided by the SUT at runtime.
copy /y "%OUTDIR%\Recordingtest.Sut.EgBim.PluginHost.dll" "%DEST%\" >nul || goto :copy_fail
copy /y "%OUTDIR%\Recordingtest.Hmeg.Bridge.dll" "%DEST%\" >nul || goto :copy_fail
copy /y "%OUTDIR%\Recordingtest.Bridge.Abstractions.dll" "%DEST%\" >nul || goto :copy_fail
REM Optional PDBs for in-SUT debugging (ignore if missing)
copy /y "%OUTDIR%\Recordingtest.Sut.EgBim.PluginHost.pdb" "%DEST%\" >nul 2>&1
copy /y "%OUTDIR%\Recordingtest.Hmeg.Bridge.pdb" "%DEST%\" >nul 2>&1
copy /y "%OUTDIR%\Recordingtest.Bridge.Abstractions.pdb" "%DEST%\" >nul 2>&1
echo ============================================================
echo [4/4] Deployed files:
echo ============================================================
dir /b "%DEST%"
echo.
echo OK — Recordingtest.Sut.EgBim.PluginHost deployed.
echo Next: launch EG-BIM Modeler, then in a shell:
echo curl http://localhost:38080/health
echo curl http://localhost:38080/scene
echo curl http://localhost:38080/camera
echo curl http://localhost:38080/selection
echo.
pause
exit /b 0
:copy_fail
echo.
echo [ERROR] Copy failed. Check that the build output exists:
echo %OUTDIR%
pause
exit /b 1