100 lines
5.9 KiB
Markdown
100 lines
5.9 KiB
Markdown
# CLAUDE.md
|
|
|
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
|
|
## Project Overview
|
|
|
|
VisionBuilder.UI is a modular .NET 8.0 WinForms application for industrial computer vision. It processes images through configurable operation pipelines, supports AI inference (YOLO/ONNX), and integrates with HawkEye camera hardware. The solution uses Ninject for DI and follows MVVM patterns.
|
|
|
|
## Build Commands
|
|
|
|
```bash
|
|
dotnet build VisionBuilder.UI.sln -c Debug # GPU build (YoloV8.Gpu + OnnxRuntime.Gpu)
|
|
dotnet build VisionBuilder.UI.sln -c CPU # CPU-only build (YoloV8 + OnnxRuntime)
|
|
dotnet build VisionBuilder.UI.sln -c Release # Production build
|
|
```
|
|
|
|
The `Debug` and `Release` configurations pull GPU NuGet packages; `CPU` configuration pulls CPU-only packages. This is controlled by conditional `<PackageReference>` blocks in `Hawkeye.VisionBuilder.Workflow.csproj`.
|
|
|
|
## Testing
|
|
|
|
Test framework: **MSTest** (Microsoft.NET.Test.Sdk 17.12.0, MSTest 3.6.4)
|
|
|
|
```bash
|
|
dotnet test VisionBuilder.UI.sln # Run all tests
|
|
dotnet test VisionBuilder.UI.Tests/ # Primary unit tests only
|
|
dotnet test --filter "FullyQualifiedName~ClassName.Method" # Single test
|
|
```
|
|
|
|
Test projects: `VisionBuilder.UI.Tests`, `VisionBuilder.UI.Recipes.Scripted.Tests`, `IDSTest`
|
|
|
|
## Solution Architecture
|
|
|
|
The solution is organized into logical groups:
|
|
|
|
**Starters** (entry points):
|
|
- `Hawkeye.VisionBuilder` — Main WinExe. `Program.cs` bootstraps the Ninject kernel, creates the `WorkflowList` and `OperationDiscoveryService`, then runs `MainWindow`.
|
|
|
|
**Core Modules**:
|
|
- `Hawkeye.VisionBuilder.Workflow` — Image processing pipeline engine. Contains `BaseOperation`, `Context`, `WorkflowList`, `OperationDiscoveryService`, and all operation implementations. See its own `CLAUDE.md` for detailed operation/recipe documentation.
|
|
- `VisionBuilder.UI.Common` — Shared contracts: `IPlugin`, `IVisionBuilderModule`, `IRecognitionControl`, `IImageSource`, service interfaces, MVVM ViewModels, command/event system.
|
|
- `VisionBuilder.UI.Windows` — WinForms UI controls (PreviewWindow, ErrorPreview, Stats, SingleCameraControl).
|
|
|
|
**Framework** (reusable libraries under `framework/`):
|
|
- `Inspectron.Camera`, `Inspectron.Settings`, `Inspectron.HawkEye`, `Inspectron.Fastbuffer`, `Inspectron.Ringbuffer`, `MaterialSkin.Core` — Hardware abstraction, settings management, and UI theming. Some target `netstandard2.1`.
|
|
|
|
**Sources** (image input providers):
|
|
- `Sources.Emulation` — File-based emulated camera for development.
|
|
- `Sources.Hawkeye` — Real HawkEye hardware source.
|
|
- `Sources.IDS` — IDS industrial camera integration.
|
|
|
|
**Plugins** (extend functionality via `IPlugin` interface):
|
|
- `B24SiemensPlugin`, `CandyboxPlugin`, `PralinenPLC`, `PackstrasseBarcodeReader`, etc.
|
|
- Plugins register services into the Ninject kernel at global and per-camera scope.
|
|
|
|
**Recipes** (workflow serialization):
|
|
- `Recipes.HawkeyeRecipe` — Binary `.hrcp` and XML `.xhrcp` recipe formats.
|
|
- `Recipes.Scripted` — Script-based recipe execution.
|
|
|
|
## Key Architectural Patterns
|
|
|
|
### Operation Pipeline
|
|
Images flow through a chain of `BaseOperation` subclasses. Each operation receives a `Context` (holding `ActiveImage`, `Memory` dictionary, `GraphicsElements`) and implements `InterpretInternal(Context)`. Operations are discovered at runtime via reflection by `OperationDiscoveryService`. Categories: `AI/`, `Simple/`, `Filters/`, `Morphology/`, `Image/`, `Basic/`.
|
|
|
|
### Plugin System
|
|
Plugins implement `IPlugin` with two registration points:
|
|
- `RegisterGlobalModules(IKernel)` — app-wide services
|
|
- `RegisterCameraModules(IKernel, string cameraName)` — per-camera services
|
|
|
|
Modules implement `IVisionBuilderModule.InitializeModule()` for deferred initialization.
|
|
|
|
For detailed plugin architecture documentation and step-by-step implementation guide, see [`docs/PLUGIN_SYSTEM.md`](docs/PLUGIN_SYSTEM.md).
|
|
|
|
### Recognition Control
|
|
`IRecognitionControl` manages the per-camera image processing lifecycle (start/stop/pause, image loop, events). `BaseRecognitionControl` provides the threading, loop, and event infrastructure — subclasses implement `Initialize`, `WarmUp`, `ProcessImage`, and `GetRecipesData`. Each camera gets its own singleton instance via the child kernel. For full implementation guide, settings reference, and existing implementations, see [`docs/RECOGNITION_CONTROL.md`](docs/RECOGNITION_CONTROL.md).
|
|
|
|
### DI Container
|
|
Ninject `StandardKernel` is the root container. Child kernels (`Ninject.Extensions.ChildKernel`) scope per-camera services. All service resolution flows through the kernel — avoid `new` for services.
|
|
|
|
### Event/Command System
|
|
`IEvent` / `IEventHandler<TEvent>` in `VisionBuilder.UI.Common/Commands/`. Key events: `SessionStartedEvent`, `SessionEndedEvent`, `ImageProcessedEvent`, `ErrorsInSequenceEvent`. `IRecognitionControl` surfaces these as `Action<T>` events.
|
|
|
|
## Key Dependencies
|
|
|
|
- **OpenCvSharp4** — Core image processing
|
|
- **YoloV8 / YoloV8.Gpu** — AI object detection (conditional on build config)
|
|
- **IronPython 3.4.0** — Python scripting integration
|
|
- **Ninject** — Dependency injection
|
|
- **CommunityToolkit.Mvvm** — MVVM support (ObservableObject, RelayCommand)
|
|
- **Serilog** — Structured logging
|
|
- **Scintilla.NET** — Code editor component in UI
|
|
- **MaterialSkin.Core** — Material Design WinForms theming
|
|
|
|
## Conventions
|
|
|
|
- Target platform is **x64** Windows, but new code should be cross-platform — use Avalonia for UI, avoid WinForms-only or Windows-specific APIs.
|
|
- Culture is forced to `en-US` at startup.
|
|
- Nullable reference types are enabled across most projects.
|
|
- Operation attributes: `[Category("name")]` for UI grouping, `[NotForTool]` to exclude properties from serialization, `[IgnoreOperation]` to hide from discovery.
|
|
- Recipe serialization supports both binary (`.hrcp`) and XML (`.xhrcp`) formats. Prefer XML for new work. Override `SaveXML`/`LoadXML`/`GetOperationElementName` for custom serialization.
|