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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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):**
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user