NINA.PlateSolving provides a uniform orchestration layer over multiple plate-solving engines. It does not own image capture or telescope control itself; instead it coordinates those concerns through interfaces and mediators.
Build shape from NINA.PlateSolving.csproj:
- Target framework:
net10.0-windows - Output type:
Library - WPF enabled
- Root-level orchestration types
PlateSolverFactory,ImageSolver,CaptureSolver,CenteringSolver, parameter/result/progress types Interfaces/IPlateSolver,IImageSolver,ICaptureSolver,ICenteringSolver,IPlateSolverFactorySolvers/Concrete solver integrations:ASTAPSolverAstrometryPlateSolverLocalPlateSolverPlatesolve2SolverPlatesolve3SolverAllSkyPlateSolverTheSkyXImageLinkSolverDc3PinPointSolver- base classes such as
BaseSolverandCLISolver
PlateSolverFactory.cs is the central selection point:
GetPlateSolver(...)mapsPlateSolverEnumvalues to concrete solver implementations.GetBlindSolver(...)mapsBlindSolverEnumvalues to the corresponding solver choice.PlateSolverFactoryProxyalso constructs higher-level orchestration objects:ImageSolverCaptureSolverCenteringSolver
Those orchestration types separate concerns:
ImageSolverSolves an already prepared image.CaptureSolverCaptures throughIImagingMediator, optionally restores filter state, and retries according toCaptureSolverParameter.CenteringSolverRepeatedly solves and slews through imaging, telescope, filter wheel, and dome mediators until the target is centered.
Solvers/BaseSolver.cs provides shared mechanics used by the concrete solvers:
- validates solver configuration through
EnsureSolverValid(...) - creates
PlateSolveImageProperties - manages a shared working directory and failed-solve directory under
%LOCALAPPDATA%\\NINA\\PlateSolver
Concrete solvers only implement SolveAsyncImpl(...).
Project references:
NINA.CoreNINA.AstrometryNINA.EquipmentNINA.ImageNINA.Profile
That matches the architecture:
- settings come from the profile layer
- image preparation comes from the imaging layer
- telescope/capture/filter/dome actions come from equipment mediators
- solver orchestration and engine-specific parsing live here
- Add new solver integrations under
Solvers/and register them inPlateSolverFactory. - Keep solver-specific process execution, file parsing, and result translation inside the solver class.
- Keep capture/slew orchestration in
CaptureSolverorCenteringSolver, not inside individual solver implementations. - Reuse the existing
PlateSolveParameter,PlateSolveResult, andPlateSolveImagePropertiesflow instead of inventing per-solver parameter objects unless the data is truly solver-private.