# fujiwo/shos.wpfcadsample architecture

> Architecture diagram of the GitHub repository fujiwo/shos.wpfcadsample, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/fujiwo/shos.wpfcadsample
- Repository: https://github.com/fujiwo/shos.wpfcadsample

## Overview

Shos.WpfCadSample is a small WPF 2D CAD editor. The main workflow is pointer input through the drawing surface and view model to the editor controller, which interprets tool interactions and commits edits to the undoable drawing; the view then displays the updated shapes. Separate branches handle document open/save, clipboard operations, properties, and persisted settings. The README documents several unsampled UI bindings and capabilities; edges for those are limited to documented relationships rather than inferred from names.

Main entry points: [`Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/MainViewModel.cs`](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/MainViewModel.cs) (Application commands), [`Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/DrawingViewModel.cs`](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/DrawingViewModel.cs) (Drawing view state), [`Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Controllers/EditorController.cs`](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Controllers/EditorController.cs) (Editor controller), [`Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/ClipboardService.cs`](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/ClipboardService.cs) (System clipboard)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["WPF interface"]
  node_surface["Drawing surface<br/>[DrawingSurface.cs]"]
  node_views["WPF views<br/>[Views]"]
  node_mainvm["Application commands<br/>[MainViewModel.cs]"]
  node_drawingvm["Drawing view state"]
  node_propertiesvm["Properties state"]
end

subgraph group_editing["Editing core"]
  node_editor["Editor controller"]
  node_interactions["Tool interactions<br/>[Controllers]"]
  node_drawing["Undoable drawing<br/>[Drawing.cs]"]
  node_shapes["Shape models<br/>[Models]"]
  node_outline["Outline geometry<br/>[Outline.cs]"]
  node_viewport["Viewport transform<br/>[Viewport.cs]"]
  node_hitgeometry["Geometry primitives<br/>[Geometry]"]
end

subgraph group_persistence["Documents and settings"]
  node_docstorage["Document storage<br/>[DocumentStorage.cs]"]
  node_serializer["Document serializer"]
  node_clipboardshapes["Clipboard format<br/>[ClipboardShapes.cs]"]
  node_settings["Settings storage<br/>[SettingsStorage.cs]"]
end

subgraph group_integration["Desktop integrations"]
  node_dialogcontract["Dialog contract<br/>[IDialogService.cs]"]
  node_clipboardcontract["Clipboard contract"]
  node_dialogimpl["WPF dialogs<br/>[DialogService.cs]"]
  node_clipboardimpl["System clipboard"]
  node_nativeclipboard["Native clipboard<br/>[NativeClipboard.cs]"]
  node_metafile["Metafile renderer"]
end

node_user(("CAD user"))
node_externalapp(("Other applications"))

node_user -->|"provides input"| node_surface
node_surface -->|"sends pointer events"| node_drawingvm
node_drawingvm -->|"converts and forwards"| node_editor
node_editor -->|"transforms coordinates"| node_viewport
node_editor -->|"dispatches input"| node_interactions
node_interactions -.->|"edits shapes"| node_drawing
node_editor -->|"commits edits"| node_drawing
node_drawing -->|"holds shape list"| node_shapes
node_shapes -->|"creates outlines"| node_outline
node_outline -.->|"uses primitives"| node_hitgeometry
node_drawingvm -->|"observes document"| node_drawing
node_drawingvm -->|"binds drawing state"| node_views
node_views -->|"binds properties"| node_propertiesvm
node_propertiesvm -.->|"edits attributes"| node_editor
node_mainvm -.->|"coordinates commands"| node_drawingvm
node_mainvm -->|"loads and saves"| node_docstorage
node_docstorage -->|"serializes documents"| node_serializer
node_serializer -.->|"encodes shapes"| node_shapes
node_mainvm -->|"requests clipboard operations"| node_clipboardcontract
node_mainvm -->|"encodes pasted shapes"| node_clipboardshapes
node_mainvm -->|"shows prompts"| node_dialogcontract
node_mainvm -->|"loads and saves settings"| node_settings
node_dialogimpl -->|"implements"| node_dialogcontract
node_clipboardimpl -->|"implements"| node_clipboardcontract
node_clipboardimpl -->|"uses native access"| node_nativeclipboard
node_clipboardimpl -->|"renders metafiles"| node_metafile
node_clipboardimpl -->|"exports images"| node_externalapp

click node_surface "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample/Views/DrawingSurface.cs"
click node_views "https://github.com/fujiwo/shos.wpfcadsample/tree/main/Source/Shos.WpfCadSample/Shos.WpfCadSample/Views"
click node_mainvm "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/MainViewModel.cs"
click node_drawingvm "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/DrawingViewModel.cs"
click node_propertiesvm "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/PropertiesViewModel.cs"
click node_editor "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Controllers/EditorController.cs"
click node_interactions "https://github.com/fujiwo/shos.wpfcadsample/tree/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Controllers"
click node_drawing "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Drawing.cs"
click node_shapes "https://github.com/fujiwo/shos.wpfcadsample/tree/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models"
click node_outline "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Geometry/Outline.cs"
click node_viewport "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Geometry/Viewport.cs"
click node_hitgeometry "https://github.com/fujiwo/shos.wpfcadsample/tree/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Geometry"
click node_docstorage "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Serialization/DocumentStorage.cs"
click node_serializer "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Serialization/DocumentSerializer.cs"
click node_clipboardshapes "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Serialization/ClipboardShapes.cs"
click node_settings "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Settings/SettingsStorage.cs"
click node_dialogcontract "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Services/IDialogService.cs"
click node_clipboardcontract "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Services/IClipboardService.cs"
click node_dialogimpl "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/DialogService.cs"
click node_clipboardimpl "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/ClipboardService.cs"
click node_nativeclipboard "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/NativeClipboard.cs"
click node_metafile "https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/MetafileRenderer.cs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_surface,node_views,node_mainvm,node_drawingvm,node_propertiesvm,node_user toneBlue
class node_editor,node_interactions,node_drawing,node_shapes,node_outline,node_viewport,node_hitgeometry toneAmber
class node_docstorage,node_serializer,node_clipboardshapes,node_settings toneMint
class node_dialogcontract,node_clipboardcontract,node_dialogimpl,node_clipboardimpl,node_nativeclipboard,node_metafile toneRose
class node_externalapp toneIndigo
```

## Components

### WPF interface

- [Drawing surface](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample/Views/DrawingSurface.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample/Views/DrawingSurface.cs`
- [WPF views](https://github.com/fujiwo/shos.wpfcadsample/tree/main/Source/Shos.WpfCadSample/Shos.WpfCadSample/Views): `Source/Shos.WpfCadSample/Shos.WpfCadSample/Views`
- [Application commands](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/MainViewModel.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/MainViewModel.cs`
- [Drawing view state](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/DrawingViewModel.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/DrawingViewModel.cs`
- [Properties state](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/PropertiesViewModel.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/PropertiesViewModel.cs`

### Editing core

- [Editor controller](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Controllers/EditorController.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Controllers/EditorController.cs`
- [Tool interactions](https://github.com/fujiwo/shos.wpfcadsample/tree/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Controllers): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Controllers`
- [Undoable drawing](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Drawing.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Drawing.cs`
- [Shape models](https://github.com/fujiwo/shos.wpfcadsample/tree/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models`
- [Outline geometry](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Geometry/Outline.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Geometry/Outline.cs`
- [Viewport transform](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Geometry/Viewport.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Geometry/Viewport.cs`
- [Geometry primitives](https://github.com/fujiwo/shos.wpfcadsample/tree/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Geometry): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Geometry`

### Documents and settings

- [Document storage](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Serialization/DocumentStorage.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Serialization/DocumentStorage.cs`
- [Document serializer](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Serialization/DocumentSerializer.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Serialization/DocumentSerializer.cs`
- [Clipboard format](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Serialization/ClipboardShapes.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Serialization/ClipboardShapes.cs`
- [Settings storage](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Settings/SettingsStorage.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Settings/SettingsStorage.cs`

### Desktop integrations

- [Dialog contract](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Services/IDialogService.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Services/IDialogService.cs`
- [Clipboard contract](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Services/IClipboardService.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Services/IClipboardService.cs`
- [WPF dialogs](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/DialogService.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/DialogService.cs`
- [System clipboard](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/ClipboardService.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/ClipboardService.cs`
- [Native clipboard](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/NativeClipboard.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/NativeClipboard.cs`
- [Metafile renderer](https://github.com/fujiwo/shos.wpfcadsample/blob/main/Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/MetafileRenderer.cs): `Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/MetafileRenderer.cs`

### Other components

- **CAD user**
- **Other applications**

## Connections

- CAD user → Drawing surface: provides input (evidence: `README.md`)
- Drawing surface → Drawing view state: sends pointer events (evidence: `README.md`)
- Drawing view state → Editor controller: converts and forwards (evidence: `README.md`)
- Editor controller → Viewport transform: transforms coordinates (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Controllers/EditorController.cs`)
- Editor controller → Tool interactions: dispatches input (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Controllers/EditorController.cs`)
- Tool interactions → Undoable drawing: edits shapes (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Controllers/EditorController.cs`)
- Editor controller → Undoable drawing: commits edits (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Controllers/EditorController.cs`)
- Undoable drawing → Shape models: holds shape list (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Drawing.cs`)
- Shape models → Outline geometry: creates outlines (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Models/Shape.cs`)
- Outline geometry → Geometry primitives: uses primitives
- Drawing view state → Undoable drawing: observes document (evidence: `README.md`)
- Drawing view state → WPF views: binds drawing state (evidence: `README.md`)
- WPF views → Properties state: binds properties (evidence: `README.md`)
- Properties state → Editor controller: edits attributes
- Application commands → Drawing view state: coordinates commands (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/MainViewModel.cs`)
- Application commands → Document storage: loads and saves (evidence: `README.md`)
- Document storage → Document serializer: serializes documents (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/Serialization/DocumentStorage.cs`)
- Document serializer → Shape models: encodes shapes
- Application commands → Clipboard contract: requests clipboard operations (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/MainViewModel.cs`)
- Application commands → Clipboard format: encodes pasted shapes (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/MainViewModel.cs`)
- Application commands → Dialog contract: shows prompts (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/MainViewModel.cs`)
- Application commands → Settings storage: loads and saves settings (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample.Core/ViewModels/MainViewModel.cs`)
- WPF dialogs → Dialog contract: implements (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/DialogService.cs`)
- System clipboard → Clipboard contract: implements (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/ClipboardService.cs`)
- System clipboard → Native clipboard: uses native access (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/ClipboardService.cs`)
- System clipboard → Metafile renderer: renders metafiles (evidence: `Source/Shos.WpfCadSample/Shos.WpfCadSample/Infrastructure/ClipboardService.cs`)
- System clipboard → Other applications: exports images (evidence: `README.md`)
