diff --git a/.claude/agents/render-dxf.md b/.claude/agents/render-dxf.md
index 01db87e..4419aa6 100644
--- a/.claude/agents/render-dxf.md
+++ b/.claude/agents/render-dxf.md
@@ -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
diff --git a/.claude/agents/wpf-ui.md b/.claude/agents/wpf-ui.md
index 254143d..5b08bd6 100644
--- a/.claude/agents/wpf-ui.md
+++ b/.claude/agents/wpf-ui.md
@@ -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
diff --git a/CLAUDE.md b/CLAUDE.md
index 93d9cac..763ec1b 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -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.
diff --git a/Rozpisky.Tests/TestData.cs b/Rozpisky.Tests/TestData.cs
index 52e3dd4..50d3988 100644
--- a/Rozpisky.Tests/TestData.cs
+++ b/Rozpisky.Tests/TestData.cs
@@ -1,4 +1,4 @@
-using System.IO;
+using System.IO;
namespace Rozpisky.Tests;
@@ -8,8 +8,8 @@ public static class TestData
/// Kořen repozitáře – nalezen od bin složky testů směrem nahoru podle Rozpisky.sln.
public static string RepoRoot { get; } = NajdiKoren();
- /// Plná cesta k logu ve zdrojové složce Rozpisky\loga.
- public static string Logo(string fileName) => Path.Combine(RepoRoot, "Rozpisky", "loga", fileName);
+ /// Plná cesta k logu ve zdrojové složce Rozpisky\Podklady\loga.
+ public static string Logo(string fileName) => Path.Combine(RepoRoot, "Rozpisky", "Podklady", "loga", fileName);
/// Všech 9 log dodávaných s programem.
public static readonly string[] VsechnaLoga =
diff --git a/Rozpiska.dxf b/Rozpisky/Podklady/Rozpiska.dxf
similarity index 100%
rename from Rozpiska.dxf
rename to Rozpisky/Podklady/Rozpiska.dxf
diff --git a/SEZNAM.xlsx b/Rozpisky/Podklady/SEZNAM.xlsx
similarity index 100%
rename from SEZNAM.xlsx
rename to Rozpisky/Podklady/SEZNAM.xlsx
diff --git a/SZ_SM011_P10_Manual_v6.pdf b/Rozpisky/Podklady/SZ_SM011_P10_Manual_v6.pdf
similarity index 100%
rename from SZ_SM011_P10_Manual_v6.pdf
rename to Rozpisky/Podklady/SZ_SM011_P10_Manual_v6.pdf
diff --git a/Rozpisky/ciselniky.json b/Rozpisky/Podklady/ciselniky.json
similarity index 100%
rename from Rozpisky/ciselniky.json
rename to Rozpisky/Podklady/ciselniky.json
diff --git a/Rozpisky/loga/README.txt b/Rozpisky/Podklady/loga/README.txt
similarity index 100%
rename from Rozpisky/loga/README.txt
rename to Rozpisky/Podklady/loga/README.txt
diff --git a/Rozpisky/loga/eu_op_doprava.dxf b/Rozpisky/Podklady/loga/eu_op_doprava.dxf
similarity index 100%
rename from Rozpisky/loga/eu_op_doprava.dxf
rename to Rozpisky/Podklady/loga/eu_op_doprava.dxf
diff --git a/Rozpisky/loga/exprojekt+mco.dxf b/Rozpisky/Podklady/loga/exprojekt+mco.dxf
similarity index 100%
rename from Rozpisky/loga/exprojekt+mco.dxf
rename to Rozpisky/Podklady/loga/exprojekt+mco.dxf
diff --git a/Rozpisky/loga/exprojekt.dxf b/Rozpisky/Podklady/loga/exprojekt.dxf
similarity index 100%
rename from Rozpisky/loga/exprojekt.dxf
rename to Rozpisky/Podklady/loga/exprojekt.dxf
diff --git a/Rozpisky/loga/mco.dxf b/Rozpisky/Podklady/loga/mco.dxf
similarity index 100%
rename from Rozpisky/loga/mco.dxf
rename to Rozpisky/Podklady/loga/mco.dxf
diff --git a/Rozpisky/loga/md_sfdi.dxf b/Rozpisky/Podklady/loga/md_sfdi.dxf
similarity index 100%
rename from Rozpisky/loga/md_sfdi.dxf
rename to Rozpisky/Podklady/loga/md_sfdi.dxf
diff --git a/Rozpisky/loga/signalprojekt.dxf b/Rozpisky/Podklady/loga/signalprojekt.dxf
similarity index 100%
rename from Rozpisky/loga/signalprojekt.dxf
rename to Rozpisky/Podklady/loga/signalprojekt.dxf
diff --git a/Rozpisky/loga/sprava_zeleznic.dxf b/Rozpisky/Podklady/loga/sprava_zeleznic.dxf
similarity index 100%
rename from Rozpisky/loga/sprava_zeleznic.dxf
rename to Rozpisky/Podklady/loga/sprava_zeleznic.dxf
diff --git a/Rozpisky/loga/sudopBrno.dxf b/Rozpisky/Podklady/loga/sudopBrno.dxf
similarity index 100%
rename from Rozpisky/loga/sudopBrno.dxf
rename to Rozpisky/Podklady/loga/sudopBrno.dxf
diff --git a/Rozpisky/loga/tesia.dxf b/Rozpisky/Podklady/loga/tesia.dxf
similarity index 100%
rename from Rozpisky/loga/tesia.dxf
rename to Rozpisky/Podklady/loga/tesia.dxf
diff --git a/Rozpisky/mapovani.json b/Rozpisky/Podklady/mapovani.json
similarity index 100%
rename from Rozpisky/mapovani.json
rename to Rozpisky/Podklady/mapovani.json
diff --git a/Rozpisky/Rozpisky.csproj b/Rozpisky/Rozpisky.csproj
index 935ae39..db9d136 100644
--- a/Rozpisky/Rozpisky.csproj
+++ b/Rozpisky/Rozpisky.csproj
@@ -22,21 +22,22 @@
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
diff --git a/PODKLAD_CAD_Layout_Tisk.md b/docs/PODKLAD_CAD_Layout_Tisk.md
similarity index 100%
rename from PODKLAD_CAD_Layout_Tisk.md
rename to docs/PODKLAD_CAD_Layout_Tisk.md
diff --git a/ROZHRANI.md b/docs/ROZHRANI.md
similarity index 99%
rename from ROZHRANI.md
rename to docs/ROZHRANI.md
index c0a0160..145146b 100644
--- a/ROZHRANI.md
+++ b/docs/ROZHRANI.md
@@ -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 (R1–R4) 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):**
diff --git a/ROZPISKY.md b/docs/ROZPISKY.md
similarity index 90%
rename from ROZPISKY.md
rename to docs/ROZPISKY.md
index 59efa53..1931a21 100644
--- a/ROZPISKY.md
+++ b/docs/ROZPISKY.md
@@ -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`:
+[`Exporters`](../Rozpisky/Dxf/Exporters.cs) vykreslí **libovolný** `Action`:
```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.
diff --git a/SZ_SM011_P10_Manual_v6.md b/docs/SZ_SM011_P10_Manual_v6.md
similarity index 100%
rename from SZ_SM011_P10_Manual_v6.md
rename to docs/SZ_SM011_P10_Manual_v6.md
diff --git a/schema.dxf b/vzorky/schema.dxf
similarity index 100%
rename from schema.dxf
rename to vzorky/schema.dxf