Restrukturalizace složky podle účelu podkladů

Kořen mísil tři nesouvisející věci. Nově:
- docs/            – podklady jen pro tvorbu programu (ROZPISKY, ROZHRANI,
                     PODKLAD_CAD, manuál SŽ v .md)
- Rozpisky/Podklady/ – podklady nutné k běhu, dodávané vedle .exe
                     (Rozpiska.dxf, SEZNAM.xlsx, manuál .pdf, ciselniky.json,
                     mapovani.json, loga/)
- vzorky/          – cizí vstupy pro ruční zkoušení (schema.dxf)

Mění se jen zdrojový strom. Rozvržení vedle .exe zůstává ploché (+ loga\)
přes metadata Link v .csproj, takže všechny resolvery nad AppContext.BaseDirectory
fungují beze změny. Konec odkazů přes ..\ ven z projektu.

Doprovodně: cesty v TestData.Logo, odkazy v dokumentaci, CLAUDE.md a v promptech
subagentů.

Build 0 chyb / 0 varování, 36 testů zelených.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-07 10:35:50 +02:00
co-authored by Claude Opus 5
parent d733d7dd6b
commit d4eb3f2102
25 changed files with 60 additions and 44 deletions
+5 -4
View File
@@ -1,4 +1,4 @@
---
---
name: render-dxf
description: Specialista na kreslicí a DXF vrstvu Rozpisek (Rozpisky/Rendering/, Rozpisky/Dxf/). Použij pro změny v renderování (Skia, PNG, PDF, DXF výstup), ve čtečce DXF šablony, v mapování hodnot do polí, v kódech příloh a v práci s logy. Nepoužívej pro UI, ViewModely ani COM (CAD/Excel).
tools: Read, Edit, Write, Grep, Glob, Bash, PowerShell
@@ -24,7 +24,7 @@ teče na obrazovku, do PNG, do PDF i do DXF. Nový výstup = **nová implementac
duplikovaný kreslicí kód. `DxfTemplate` jen čte DXF a přehrává ho do rozhraní — logika výstupu
do ní nepatří.
## Tvrdá pravidla DXF (z ROZPISKY.md, ověř si je tam)
## Tvrdá pravidla DXF (z docs/ROZPISKY.md, ověř si je tam)
- Tloušťka čáry = `Layer.LineWeight`, enum v 1/100 mm, **jen** povolené hodnoty:
0, 5, 9, 13, 15, 18, 20, 25, 30, 35, 40, 50, 53, 60, 70, 80, 90, 100, 106, 120, 140, 158, 200, 211.
@@ -40,11 +40,12 @@ do ní nepatří.
## Konvence
Kód, komentáře i názvy typů česky. `Nullable` je zapnutý. Nepřidávej NuGet balíčky.
Needituj produkční data: `Rozpiska.dxf`, `schema.dxf`, `Rozpisky/loga/*.dxf`.
Needituj produkční data: `Rozpisky/Podklady/Rozpiska.dxf`, `vzorky/schema.dxf`,
`Rozpisky/Podklady/loga/*.dxf`.
## Postup
1. Přečti si relevantní kapitolu `ROZPISKY.md` a dotčené soubory, než začneš editovat.
1. Přečti si relevantní kapitolu `docs/ROZPISKY.md` a dotčené soubory, než začneš editovat.
2. Změň kód co nejmenším zásahem, ve stylu okolního kódu.
3. Ověř:
`dotnet build "Rozpisky.sln" -nologo -v q -clp:ErrorsOnly` a
+2 -2
View File
@@ -1,4 +1,4 @@
---
---
name: wpf-ui
description: Specialista na WPF prezentační vrstvu Rozpisek (ViewModels/, Views/, Themes/, Behaviors/, Converters/, Theming/). Použij pro změny obrazovek, XAML, bindingů, příkazů, chování gridů a vzhledu. Nepoužívej pro kreslicí/DXF jádro ani pro COM vrstvu.
tools: Read, Edit, Write, Grep, Glob, Bash, PowerShell
@@ -31,7 +31,7 @@ nebo `Rozpisky/Xlsx/` jen popiš v odpovědi a nech je na volajícím.
## Postup
1. `ROZHRANI.md` popisuje obrazovky, pole a datový model — přečti relevantní kapitolu, než
1. `docs/ROZHRANI.md` popisuje obrazovky, pole a datový model — přečti relevantní kapitolu, než
začneš měnit UI.
2. `MainViewModel.cs` je velký; hledej v něm grepem, nečti ho celý zbytečně.
3. Ověř: `dotnet build "Rozpisky.sln" -nologo -v q -clp:ErrorsOnly` a
+22 -8
View File
@@ -1,4 +1,4 @@
# Rozpisky — pokyny pro Claude Code
# 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".
@@ -21,7 +21,7 @@ Tatáž kresba teče na obrazovku, do PNG, do PDF i do DXF. **Nový výstupní f
`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`](ROZPISKY.md). Nečíst celý,
Podrobnosti (vrstvy, NuGet API, pravidla zápisu DXF) — [`ROZPISKY.md`](docs/ROZPISKY.md). Nečíst celý,
jen relevantní kapitolu.
## Konvence
@@ -36,12 +36,26 @@ jen relevantní kapitolu.
- `Nullable` a `ImplicitUsings` jsou zapnuté v obou projektech.
- COM (CAD, MS Excel) jde přes pozdní vazbu (`dynamic`) — nepřidávat interop assembly.
## 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
- `Rozpiska.dxf`, `schema.dxf` — produkční DXF šablony.
- `Rozpisky/loga/*.dxf` — dodávaná loga (9 ks, testy je renderují).
- `SEZNAM.xlsx` — mustr „Seznam příloh".
- `SZ_SM011_P10_Manual_v6.md/.pdf` — normativní podklad SŽ, jen ke čtení.
- `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í
@@ -51,5 +65,5 @@ celý do jedné z těchto domén je použít; drobnosti napříč vrstvami řeš
## Další dokumentace
[`ROZHRANI.md`](ROZHRANI.md) — obrazovky, pole a datový model.
[`PODKLAD_CAD_Layout_Tisk.md`](PODKLAD_CAD_Layout_Tisk.md) — CAD, layouty a tisk přes COM.
[`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.
+3 -3
View File
@@ -1,4 +1,4 @@
using System.IO;
using System.IO;
namespace Rozpisky.Tests;
@@ -8,8 +8,8 @@ public static class TestData
/// <summary>Kořen repozitáře nalezen od bin složky testů směrem nahoru podle Rozpisky.sln.</summary>
public static string RepoRoot { get; } = NajdiKoren();
/// <summary>Plná cesta k logu ve zdrojové složce <c>Rozpisky\loga</c>.</summary>
public static string Logo(string fileName) => Path.Combine(RepoRoot, "Rozpisky", "loga", fileName);
/// <summary>Plná cesta k logu ve zdrojové složce <c>Rozpisky\Podklady\loga</c>.</summary>
public static string Logo(string fileName) => Path.Combine(RepoRoot, "Rozpisky", "Podklady", "loga", fileName);
/// <summary>Všech 9 log dodávaných s programem.</summary>
public static readonly string[] VsechnaLoga =
+13 -12
View File
@@ -22,21 +22,22 @@
<Resource Include="Rozpisky.ico" />
</ItemGroup>
<!-- Podklady dodávané s programem (Podklady\) kopírují se vedle .exe do ploché struktury
(+ podsložka loga\). Link určuje umístění ve výstupu; zdrojový strom je tím oddělený
od rozvržení instalace. Aplikace je jen čte, nikdy do nich nezapisuje. -->
<ItemGroup>
<!-- DXF šablona rozpisky (leží v kořeni solution) kopíruje se vedle .exe. -->
<None Include="..\Rozpiska.dxf" Link="Rozpiska.dxf" CopyToOutputDirectory="PreserveNewest" />
<!-- DXF šablona rozpisky. -->
<None Update="Podklady\Rozpiska.dxf" Link="Rozpiska.dxf" CopyToOutputDirectory="PreserveNewest" />
<!-- Mustr „Seznam příloh“ (Otevřená verze .xlsx) šablona vyplňovaná při exportu seznamu. -->
<None Include="..\SEZNAM.xlsx" Link="SEZNAM.xlsx" CopyToOutputDirectory="PreserveNewest" />
<!-- Závazný manuál SŽ (PDF) kopíruje se vedle .exe pro otevření z nabídky Nápověda. -->
<None Include="..\SZ_SM011_P10_Manual_v6.pdf" Link="SZ_SM011_P10_Manual_v6.pdf" CopyToOutputDirectory="PreserveNewest" />
<!-- Výchozí číselníky (data z původního Excelu) dodávají se vedle .exe.
Update (ne Include): .json je už implicitní None item. PreserveNewest = uživatelovy
úpravy v output složce se při rebuildu nepřepíšou (přepíše jen novější zdroj). -->
<None Update="ciselniky.json" CopyToOutputDirectory="PreserveNewest" />
<None Update="Podklady\SEZNAM.xlsx" Link="SEZNAM.xlsx" CopyToOutputDirectory="PreserveNewest" />
<!-- Závazný manuál SŽ (PDF) otevírá se z nabídky Nápověda. -->
<None Update="Podklady\SZ_SM011_P10_Manual_v6.pdf" Link="SZ_SM011_P10_Manual_v6.pdf" CopyToOutputDirectory="PreserveNewest" />
<!-- Výchozí číselníky (data z původního Excelu). -->
<None Update="Podklady\ciselniky.json" Link="ciselniky.json" CopyToOutputDirectory="PreserveNewest" />
<!-- Mapování „pole programu → DXF atribut“ (RozpiskaValues přes reflexi). Editovatelné vedle .exe. -->
<None Update="mapovani.json" CopyToOutputDirectory="PreserveNewest" />
<!-- Loga dodávaná s programem (DXF) kopírují se do složky loga\ vedle .exe. -->
<None Include="loga\**\*" CopyToOutputDirectory="PreserveNewest" LinkBase="loga" />
<None Update="Podklady\mapovani.json" Link="mapovani.json" CopyToOutputDirectory="PreserveNewest" />
<!-- Loga dodávaná s programem (DXF) do podsložky loga\ vedle .exe. -->
<None Update="Podklady\loga\*" Link="loga\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
</Project>
+2 -2
View File
@@ -1,4 +1,4 @@
# Rozpisky rozhraní aplikace, datový model a budoucí funkcionality
# Rozpisky rozhraní aplikace, datový model a budoucí funkcionality
Tento dokument popisuje **standalone aplikaci Rozpisky** z pohledu uživatele a dat: jaké má
obrazovky, co se v nich vyplňuje, jaké akce nabízí a jak je vnitřně uspořádaný datový model.
@@ -153,7 +153,7 @@ Na revize se odkazují řádkové revizní sloupce přílohy (R1R4) a revizn
### 3.6 Mapování `pole aplikace ↔ DXF ATTDEF tag`
Šablona [`Rozpiska.dxf`](Rozpiska.dxf) obsahuje **101 polí (`ATTDEF`)**. Tag pole = klíč do
Šablona [`Rozpiska.dxf`](../Rozpisky/Podklady/Rozpiska.dxf) obsahuje **101 polí (`ATTDEF`)**. Tag pole = klíč do
`values` při vyplnění (viz `DxfTemplate.Replay(g, values)` v `ROZPISKY.md`). Mapování na zdroj dat:
**Projektová pole (z údajů projektu):**
+13 -13
View File
@@ -1,4 +1,4 @@
# Rozpisky generátor výkresových rohových razítek (C# / .NET)
# Rozpisky generátor výkresových rohových razítek (C# / .NET)
Standalone WPF aplikace (náhrada původního excelového nástroje „Rozpisky 1.0.8"). Spravuje projekt,
seznam příloh, revize a číselníky, a z **DXF šablony rozpisky** generuje **náhled**, **PDF na A4**,
@@ -6,9 +6,9 @@ seznam příloh, revize a číselníky, a z **DXF šablony rozpisky** generuje *
i **tisk rozvržení**.
Celé kreslení stojí na jedné myšlence: existuje jedno **kreslicí rozhraní**
([`IProfileRenderer`](Rozpisky/Rendering/IProfileRenderer.cs) „kam se kreslí") a několik jeho
([`IProfileRenderer`](../Rozpisky/Rendering/IProfileRenderer.cs) „kam se kreslí") a několik jeho
implementací. Tatáž kresba teče na obrazovku (náhled), do PNG, do PDF i do DXF. Čtečka šablony
([`DxfTemplate`](Rozpisky/Dxf/DxfTemplate.cs)) jen čte DXF a „přehrává" ho do tohoto rozhraní.
([`DxfTemplate`](../Rozpisky/Dxf/DxfTemplate.cs)) jen čte DXF a „přehrává" ho do tohoto rozhraní.
---
@@ -39,7 +39,7 @@ zvláštní `PlatformTarget` se nenastavuje.
- Pole, která byla v šabloně `ATTDEF`, se při vyplnění zapisují jako obyčejné `TEXT`/`MTEXT` entity
(žádné atributy bloku).
- Objekty v netisknutelných hladinách (`PlotFlag=0`) se **nevykreslují**, ale ví se o nich kvůli
místům pro loga (viz [`DxfTemplate.PlaceholderHladiny`](Rozpisky/Dxf/DxfTemplate.cs)).
místům pro loga (viz [`DxfTemplate.PlaceholderHladiny`](../Rozpisky/Dxf/DxfTemplate.cs)).
---
@@ -122,7 +122,7 @@ Implementace:
## 4. Čtečka šablony a fasáda pro UI
Nízkoúrovňová čtečka [`DxfTemplate`](Rozpisky/Dxf/DxfTemplate.cs):
Nízkoúrovňová čtečka [`DxfTemplate`](../Rozpisky/Dxf/DxfTemplate.cs):
```csharp
var tpl = new DxfTemplate("Rozpiska.dxf");
@@ -136,7 +136,7 @@ tpl.Replay(g, values, includeNoPrint); // + volitelně A4 rámeček !!NOPRINT (p
vystředění), `Placeholders` vrací rámečky pro loga/schéma podle vyhrazených hladin, `Bounds` bbox
kresby (pro fit vkládaného fragmentu).
Fasáda pro UI [`RozpiskaRenderer`](Rozpisky/Dxf/RozpiskaRenderer.cs) spojuje šablonu, mapování hodnot
Fasáda pro UI [`RozpiskaRenderer`](../Rozpisky/Dxf/RozpiskaRenderer.cs) spojuje šablonu, mapování hodnot
a exportéry na jedno místo (šablona se cachuje):
```csharp
@@ -147,16 +147,16 @@ r.ExportPdf(projekt, priloha, revize, ciselniky, "rozpiska.pdf", loga); // A4
r.ExportPng(projekt, priloha, revize, ciselniky, "nahled.png", loga); // A4 PNG
```
Hodnoty polí sestavuje [`RozpiskaValues`](Rozpisky/Dxf/RozpiskaValues.cs): mapování „pole programu →
Hodnoty polí sestavuje [`RozpiskaValues`](../Rozpisky/Dxf/RozpiskaValues.cs): mapování „pole programu →
DXF atribut" **není v kódu**, čte se z `mapovani.json` a hodnoty se dotahují reflexí. K tomu se
algoritmicky doplní 47-poziční strojový kód (`K1``K47`, viz
[`KodPrilohy`](Rozpisky/Dxf/KodPrilohy.cs)).
[`KodPrilohy`](../Rozpisky/Dxf/KodPrilohy.cs)).
---
## 5. Export na A4 (`Exporters`)
[`Exporters`](Rozpisky/Dxf/Exporters.cs) vykreslí **libovolný** `Action<IProfileRenderer>`:
[`Exporters`](../Rozpisky/Dxf/Exporters.cs) vykreslí **libovolný** `Action<IProfileRenderer>`:
```csharp
Exporters.PngA4(draw, "rozpiska.png", dpi: 200, frame: sheetFrame); // A4 raster
@@ -172,7 +172,7 @@ přes `SKDocument.CreatePdf` (1 mm = 72/25,4 bodu; text vektorový, tloušťky v
## 6. Demo data (`DemoData`)
[`DemoData`](Rozpisky/Data/DemoData.cs) naplní úvodní stav při startu:
[`DemoData`](../Rozpisky/Data/DemoData.cs) naplní úvodní stav při startu:
`SeedProjekt(vm)` (ukázkový projekt + přílohy), `SeedCiselniky(c)` a `SeedKraje(c)` (výchozí
číselníky, pokud `ciselniky.json` chybí).
@@ -190,17 +190,17 @@ přes `SKDocument.CreatePdf` (1 mm = 72/25,4 bodu; text vektorový, tloušťky v
| Aktualizace/tisk rozvržení | přílohy | přejmenování/tisk v CADu | `Cad/CadLayoutService`, `Cad/CadTiskService` (COM) |
Aplikace **nemá CLI režim** vše jede z GUI. Neočekávané výjimky zachytává globální síť v
[`App.xaml.cs`](Rozpisky/App.xaml.cs) a zapisuje je do `error.log` vedle .exe.
[`App.xaml.cs`](../Rozpisky/App.xaml.cs) a zapisuje je do `error.log` vedle .exe.
---
## 8. Persistence a robustnost
- **Projekt `.rzp`** ([`ProjektStore`](Rozpisky/Data/ProjektStore.cs)) JSON s exkluzivním zámkem
- **Projekt `.rzp`** ([`ProjektStore`](../Rozpisky/Data/ProjektStore.cs)) JSON s exkluzivním zámkem
drženým po dobu otevření (ostatní procesy smí jen číst). Zápis serializuje **před** useknutím
souboru, aby pád nezanechal prázdný soubor.
- **Configy vedle .exe** (`ciselniky.json`, `cad.json`, `layout.json`, `mapovani.json`) jdou přes
[`JsonConfigFile`](Rozpisky/Data/JsonConfigFile.cs): **atomický zápis** (přes `.tmp`) a při
[`JsonConfigFile`](../Rozpisky/Data/JsonConfigFile.cs): **atomický zápis** (přes `.tmp`) a při
poškozeném souboru **záloha do `.bak` + upozornění** (místo tichého přepsání výchozími daty).
- **Zamčený cíl exportu** před zápisem PDF/XLSX/DXF se ověří, zda soubor nedrží jiný program
(Excel, prohlížeč PDF), a nabídne Pokračovat/Přerušit.
View File