Nacti() uložilo dodávanou vrstvu do referenčního snímku _vychozi a tytéž objekty vložilo do kolekcí, na které se váže mřížka. Úprava buňky tak mutovala i ten snímek – UlozRozdil pak porovnával stav sám se sebou, rozdíl vyšel prázdný a oprava dodávané položky zmizela. Mazání a přidávání přitom fungovalo (tam se reference nesdílí), takže se chyba dobře schovala. Sluc nově vkládá dodávané položky jako hluboké kopie (serializací, stejně jako klonování přílohy), takže snímek zůstane netknutý. Nahlášeno na přejmenování kraje Karlovarský – přesně ten scénář teď hlídají dva regresní testy; bez opravy oba padají. Build 0 chyb / 0 varování, 57 testů zelených. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
78 lines
4.3 KiB
Markdown
78 lines
4.3 KiB
Markdown
# Rozpisky — pokyny pro Claude Code
|
|
|
|
WPF desktopová aplikace (.NET 10, `net10.0-windows`, AnyCPU) — generátor výkresových rohových
|
|
razítek („rozpisek") pro Správu železnic. Náhrada původního excelového nástroje „Rozpisky 1.0.8".
|
|
|
|
## Příkazy
|
|
|
|
```powershell
|
|
dotnet build "Rozpisky.sln" -nologo -v q -clp:ErrorsOnly
|
|
dotnet test "Rozpisky.Tests\Rozpisky.Tests.csproj" -nologo -v q
|
|
dotnet run --project "Rozpisky\Rozpisky.csproj"
|
|
```
|
|
|
|
Baseline: build bez chyb a varování, **57 testů zelených**. Před hlášením hotovo obojí spustit
|
|
(nebo použít `/overit`).
|
|
|
|
## Architektura — jediné pravidlo, které se nesmí porušit
|
|
|
|
Veškerá kresba jde přes jedno rozhraní [`IProfileRenderer`](Rozpisky/Rendering/IProfileRenderer.cs).
|
|
Tatáž kresba teče na obrazovku, do PNG, do PDF i do DXF. **Nový výstupní formát = nová implementace
|
|
`IProfileRenderer`, nikdy nový kreslicí kód.** Čtečka [`DxfTemplate`](Rozpisky/Dxf/DxfTemplate.cs)
|
|
jen čte DXF šablonu a „přehrává" ji do tohoto rozhraní.
|
|
|
|
Podrobnosti (vrstvy, NuGet API, pravidla zápisu DXF) — [`ROZPISKY.md`](docs/ROZPISKY.md). Nečíst celý,
|
|
jen relevantní kapitolu.
|
|
|
|
## Konvence
|
|
|
|
- **Kód, komentáře, commity i názvy typů jsou česky** (`BoundsTesty`, `PlaceholderHladiny`,
|
|
`NajdiKoren`). Držet se toho, nepřejmenovávat do angličtiny.
|
|
- MVVM bez frameworku: znovupoužít [`RelayCommand`](Rozpisky/ViewModels/RelayCommand.cs)
|
|
a [`ObservableObject`](Rozpisky/Models/ObservableObject.cs) — nepsat vlastní ani nepřidávat
|
|
NuGet (CommunityToolkit apod.).
|
|
- XAML: barvy a rozměry **jen** z `Rozpisky/Themes/Colors.Dark.xaml` a `Metrics.xaml`
|
|
(WPF-DarkTheme-Kit). Žádné hardcoded `#RRGGBB` ani natvrdo zadané odsazení.
|
|
- `Nullable` a `ImplicitUsings` jsou zapnuté v obou projektech.
|
|
- COM (CAD, MS Excel) jde přes pozdní vazbu (`dynamic`) — nepřidávat interop assembly.
|
|
- Uživatelská data (číselníky, výběr CADu, logy) jdou přes
|
|
[`UzivatelskaData`](Rozpisky/Data/UzivatelskaData.cs) do `%APPDATA%\Rozpisky`. Do složky u `.exe`
|
|
se **nezapisuje** — může být jen pro čtení a přeinstalace ji přepíše. Číselníky navíc žijí ve dvou
|
|
vrstvách ([`CiselnikyStore`](Rozpisky/Data/CiselnikyStore.cs)) a loga ve dvou složkách
|
|
([`LogaResolver`](Rozpisky/Dxf/LogaResolver.cs)): dodávané + uživatelské navrch.
|
|
**Při konfliktu vyhrává uživatelská vrstva** — jinak by se jeho úprava tiše neprojevila.
|
|
Výjimka jsou data, která drží správnost výstupu (`mapovani.json`, `Rozpiska.dxf`) — tam vyhrává
|
|
program. Změnu slučování vždy pokrýt testem: chyba tam se projeví tichou ztrátou dat.
|
|
|
|
## Rozvržení složky — tři druhy podkladů
|
|
|
|
| Kde | Co to je |
|
|
|---|---|
|
|
| `docs/` | Podklady **jen pro tvorbu programu** — architektura, datový model, normativní manuál SŽ v `.md`. Nedodává se uživateli. |
|
|
| `Rozpisky/Podklady/` | Podklady **nutné k běhu** — kopírují se vedle `.exe` (plochá struktura + `loga\`, řídí `Link` v `.csproj`). Aplikace je **jen čte**. |
|
|
| `%APPDATA%\Rozpisky` | Podklady **vznikající za běhu** — vše, co píše uživatel. V repu nejsou a nemají tam co dělat. |
|
|
| `vzorky/` | Cizí vstupy pro ruční zkoušení (`schema.dxf`). Nedodává se. |
|
|
|
|
Nové dodávané datum = do `Rozpisky/Podklady/` **a** řádek v `.csproj` s `Link`, ať výstup
|
|
zůstane plochý. Nový zapisovaný soubor = přes `UzivatelskaData.Cesta(...)`, nikdy
|
|
`AppContext.BaseDirectory`.
|
|
|
|
## Kam nesahat
|
|
|
|
- `Rozpisky/Podklady/Rozpiska.dxf`, `vzorky/schema.dxf` — produkční DXF šablony.
|
|
- `Rozpisky/Podklady/loga/*.dxf` — dodávaná loga (9 ks, testy je renderují).
|
|
- `Rozpisky/Podklady/SEZNAM.xlsx` — mustr „Seznam příloh".
|
|
- `docs/SZ_SM011_P10_Manual_v6.md`, `Rozpisky/Podklady/SZ_SM011_P10_Manual_v6.pdf`
|
|
— normativní podklad SŽ, jen ke čtení.
|
|
|
|
## Delegování
|
|
|
|
Specializovaní subagenti v `.claude/agents/`: `render-dxf` (Rendering/, Dxf/), `wpf-ui`
|
|
(ViewModels/, Views/, Themes/), `verifikator` (read-only build + testy). Pro úkol spadající
|
|
celý do jedné z těchto domén je použít; drobnosti napříč vrstvami řešit v hlavním vlákně.
|
|
|
|
## Další dokumentace
|
|
|
|
[`ROZHRANI.md`](docs/ROZHRANI.md) — obrazovky, pole a datový model.
|
|
[`PODKLAD_CAD_Layout_Tisk.md`](docs/PODKLAD_CAD_Layout_Tisk.md) — CAD, layouty a tisk přes COM.
|