From d4eb3f2102f45af5e5f5e9114a09bb4354266f4a Mon Sep 17 00:00:00 2001 From: Josef Marek Date: Mon, 7 Sep 2026 10:35:50 +0200 Subject: [PATCH] =?UTF-8?q?Restrukturalizace=20slo=C5=BEky=20podle=20?= =?UTF-8?q?=C3=BA=C4=8Delu=20podklad=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .claude/agents/render-dxf.md | 9 +++--- .claude/agents/wpf-ui.md | 4 +-- CLAUDE.md | 30 +++++++++++++----- Rozpisky.Tests/TestData.cs | 6 ++-- .../Podklady/Rozpiska.dxf | 0 SEZNAM.xlsx => Rozpisky/Podklady/SEZNAM.xlsx | Bin .../Podklady/SZ_SM011_P10_Manual_v6.pdf | Bin Rozpisky/{ => Podklady}/ciselniky.json | 0 Rozpisky/{ => Podklady}/loga/README.txt | 0 .../{ => Podklady}/loga/eu_op_doprava.dxf | 0 .../{ => Podklady}/loga/exprojekt+mco.dxf | 0 Rozpisky/{ => Podklady}/loga/exprojekt.dxf | 0 Rozpisky/{ => Podklady}/loga/mco.dxf | 0 Rozpisky/{ => Podklady}/loga/md_sfdi.dxf | 0 .../{ => Podklady}/loga/signalprojekt.dxf | 0 .../{ => Podklady}/loga/sprava_zeleznic.dxf | 0 Rozpisky/{ => Podklady}/loga/sudopBrno.dxf | 0 Rozpisky/{ => Podklady}/loga/tesia.dxf | 0 Rozpisky/{ => Podklady}/mapovani.json | 0 Rozpisky/Rozpisky.csproj | 25 ++++++++------- .../PODKLAD_CAD_Layout_Tisk.md | 0 ROZHRANI.md => docs/ROZHRANI.md | 4 +-- ROZPISKY.md => docs/ROZPISKY.md | 26 +++++++-------- .../SZ_SM011_P10_Manual_v6.md | 0 schema.dxf => vzorky/schema.dxf | 0 25 files changed, 60 insertions(+), 44 deletions(-) rename Rozpiska.dxf => Rozpisky/Podklady/Rozpiska.dxf (100%) rename SEZNAM.xlsx => Rozpisky/Podklady/SEZNAM.xlsx (100%) rename SZ_SM011_P10_Manual_v6.pdf => Rozpisky/Podklady/SZ_SM011_P10_Manual_v6.pdf (100%) rename Rozpisky/{ => Podklady}/ciselniky.json (100%) rename Rozpisky/{ => Podklady}/loga/README.txt (100%) rename Rozpisky/{ => Podklady}/loga/eu_op_doprava.dxf (100%) rename Rozpisky/{ => Podklady}/loga/exprojekt+mco.dxf (100%) rename Rozpisky/{ => Podklady}/loga/exprojekt.dxf (100%) rename Rozpisky/{ => Podklady}/loga/mco.dxf (100%) rename Rozpisky/{ => Podklady}/loga/md_sfdi.dxf (100%) rename Rozpisky/{ => Podklady}/loga/signalprojekt.dxf (100%) rename Rozpisky/{ => Podklady}/loga/sprava_zeleznic.dxf (100%) rename Rozpisky/{ => Podklady}/loga/sudopBrno.dxf (100%) rename Rozpisky/{ => Podklady}/loga/tesia.dxf (100%) rename Rozpisky/{ => Podklady}/mapovani.json (100%) rename PODKLAD_CAD_Layout_Tisk.md => docs/PODKLAD_CAD_Layout_Tisk.md (100%) rename ROZHRANI.md => docs/ROZHRANI.md (99%) rename ROZPISKY.md => docs/ROZPISKY.md (90%) rename SZ_SM011_P10_Manual_v6.md => docs/SZ_SM011_P10_Manual_v6.md (100%) rename schema.dxf => vzorky/schema.dxf (100%) 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