A Windows desktop application for evaluating precision electronic level measurements used in machine tool geometry inspection and granite surface plate qualification.
The software guides the operator through a defined measurement procedure, acquires readings from a precision electronic level instrument, computes a best-fit surface map using least-squares adjustment, detects suspect readings, and displays results graphically.
- Guided measurement workflow — step-by-step instructions with a live map showing position, orientation arrow, and progress indicator
- Surface plate qualification — Full Grid and Union Jack measurement strategies for granite surface plates and similar flat objects
- Full Grid — boustrophedon row and column traversal ensures every interior grid point is measured twice for redundancy
- Union Jack — eight arms from the centre with configurable segment count; Full (with closure loops) and Circumference variants
- Least-squares surface fitting — closure errors are distributed optimally across all steps simultaneously
- Outlier detection — suspect readings flagged automatically when their residual exceeds a configurable sigma threshold (default: 2.5σ)
- Correction workflow — flagged steps can be re-measured in a guided mini-session; original readings are always preserved
- 3D surface plot — colour-mapped dot-and-wire visualisation of the fitted height map
- Parallel Ways — straightness and parallelism evaluation for machine tool beds, slideways, and rail pairs
- Configurable number of rails, step distance, and optional bridge measurements between rails
- Forward-only or forward-and-return passes per rail/bridge task
- Two solver modes: Global Least-Squares and Independent-then-Reconcile
- Per-rail straightness (peak-to-valley after best-fit line removal) and per-pair parallelism results
- Flatness / straightness result — peak-to-valley value and residual RMS displayed alongside the plot
- Project persistence — projects are saved as
.levelprojfiles (JSON), human-readable and version-control friendly - Open existing project — load a
.levelprojfile at any time; if the file contains all readings but no computed result the solver runs automatically on load - Preferences — configurable default project folder and Light / Dark / Follow system theme, both remembered across sessions
- About dialog — Help → About LevelApp shows the current version, copyright, license, and links to the license text and GitHub repository
- Contextual help — ⓘ flyout buttons on all section headers and algorithmic concepts (least-squares, flagged steps, sigma threshold, correction rounds, etc.); tooltips on all metric labels and input fields
- Localised UI — full English (en-US) and German (de-DE) localisation; the OS language setting selects the active locale automatically
- Extensible architecture — geometry modules, measurement strategies, instrument providers and display modules are all plugin-style interfaces; new object types and instruments can be added without touching existing code
(Screenshots coming soon.)
| Concern | Choice |
|---|---|
| Language | C# (.NET 8/9) |
| UI Framework | WinUI 3 / Windows App SDK |
| UI Pattern | MVVM |
| Persistence | JSON via System.Text.Json |
| Bluetooth (planned) | Windows.Devices.Bluetooth (WinRT) |
| USB HID (planned) | Windows.Devices.HumanInterfaceDevice (WinRT) |
- Windows 10 version 1809 or later (Windows 11 recommended)
- Windows App SDK runtime
- .NET 8 or .NET 9 runtime
git clone https://github.com/soldernerd/LevelApp.git
cd LevelAppOpen LevelApp.slnx in Visual Studio 2022 and build the solution (Ctrl+Shift+B). Run the LevelApp.App project.
- Enter a project name, operator name and optional notes
- Select a geometry type:
- Surface Plate — enter plate dimensions (mm) and grid size; choose Full Grid or Union Jack strategy
- Parallel Ways — define two or more rails (label, length, separation), add measurement tasks (along-rail and/or bridge), and choose solver options
- Click Start Measurement
The app guides you step by step. For each step it shows:
- The grid map with the current position highlighted
- The required instrument orientation (North / South / East / West)
- A plain-text instruction
- A reading entry field (mm/m)
Enter the reading from your electronic level and click Accept Reading. Repeat for all steps.
After all steps are complete the app runs the least-squares solver and displays:
- A 3D colour-mapped surface plot
- Peak-to-valley flatness value
- Residual RMS (σ)
- Any flagged steps that warrant re-measurement
LevelApp/
├── LevelApp.Core/ # No UI dependencies — fully unit-testable
│ ├── Models/ # Project, Session, Step, Result, RailDefinition, …
│ ├── Interfaces/ # IMeasurementStrategy, ISurfaceCalculator
│ ├── Geometry/ # StrategyFactory, CalculatorFactory,
│ │ # Calculators/, SurfacePlate/Strategies/,
│ │ # ParallelWays/ (strategy + calculator)
│ └── Serialization/ # ProjectSerializer, ObjectValueConverter,
│ # OrientationConverter
├── LevelApp.App/ # WinUI 3 application
│ ├── Views/ # ProjectSetupView, MeasurementView,
│ │ # ResultsView, CorrectionView, Dialogs/
│ ├── ViewModels/ # MVVM view models
│ ├── Controls/ # HelpButton, HelpLabel (reusable UserControls)
│ ├── Services/ # ProjectFileService, SettingsService, ThemeService,
│ │ # LocalisationService
│ ├── Helpers/ # ThemeHelper (shared colour resolution for all renderers)
│ ├── Strings/ # en-US/Resources.resw, de-DE/Resources.resw
│ ├── Styles/ # ThemeColors.xaml, TextStyles.xaml, ControlStyles.xaml,
│ │ # HelpButtonStyle.xaml
│ └── DisplayModules/ # SurfacePlot3DDisplay, MeasurementsGridRenderer,
│ # StrategyPreviewRenderer, ParallelWaysDisplay
├── LevelApp.Tests/ # xUnit unit tests (Core only)
└── docs/
├── architecture.md # Full architecture and design reference
└── levelproj.md # .levelproj JSON format reference
- Union Jack measurement strategy
- Parallel Ways geometry module (straightness + parallelism for rails/slideways)
- Light / Dark / Follow system theme with live preview and persistence
- Contextual help (tooltips + ⓘ flyouts) and en-US / de-DE localisation
- Parallel Ways correction workflow
- Heat map display module
- Numerical table display module
- Residuals chart display module
- Bluetooth LE instrument provider
- USB HID instrument provider
- Additional geometry modules (squareness, lathe bed, …)
- PDF report export
The full architecture and design rationale is documented in docs/architecture.md. It covers the data model hierarchy, the least-squares algorithm, the guided measurement state machine, the JSON file format with schema versioning, and the plugin interface contracts.
Contributions are welcome. Please open an issue to discuss significant changes before submitting a pull request.
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Commit your changes (
git commit -m 'Add my feature') - Push to the branch (
git push origin feature/my-feature) - Open a pull request
Copyright (C) 2026 Lukas Fässler
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.