Files
Rozpisky/CLAUDE.md
T
marekandClaude Opus 5 1e5a552c13 Oprava: exportovaná šrafa šla ven bez definice vzoru a ve špatném měřítku
Nahlásil uživatel: šrafa v exportovaném DXF nedrží měřítko, takže na první
pohled ani nevypadá jako šrafa, a v každém výkresu se chová jinak.

Dvě příčiny:

1. Do výstupu šlo jen *jméno* vzoru (ANSI31), bez definičních čar — ověřeno
   na exportovaném souboru: definicnichCar=0. DXF přitom nese definici vzoru
   uvnitř entity HATCH; bez ní si ji cílový CAD dosadí ze svých .pat, ve svých
   jednotkách a měřítku. Odtud „v každém výkresu jinak". Vypln proto nese
   VzorCara (úhel, vztažný bod, rozteč, čárkování) a export ji zapisuje.

2. Vzor se neškáloval spolu s geometrií. Logo se do rámečku rozpisky vejde jen
   zmenšené (typicky ~0,1×), ale rozteč vzoru zůstávala původní — v CADu z toho
   byla buď plná plocha, nebo pár čar přes celé logo. TransformRenderer teď
   mapuje i definici: vztažný bod celou transformací, rozteč jako vektor (bez
   posunu), délky čárek a měřítko × měřítko transformace.

Měřítko a úhel se do HATCH zapisují neutrální (1 a 0) a efektivní hodnoty nese
definice. ACadSharp totiž při zápisu násobí rozteč hodnotou PatternScale, ale
při čtení zpátky nedělí — s nenulovým měřítkem by se vzor s každým kolečkem
desetkrát roztáhl (změřeno).

Po opravě je rozteč v exportu shodná se zdrojem 1:1 a při zmenšení loga 0,1×
klesne desetkrát, takže počet čar přes logo zůstává stejný. Náhledy všech
9 log jsou pixel po pixelu beze změny. 119 testů zelených.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 15:08:54 +02:00

4.9 KiB

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

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í, 119 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. 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 jen čte DXF šablonu a „přehrává" ji do tohoto rozhraní.

Z toho plyne druhé pravidlo: co má přežít cestu DXF → model → DXF, musí protéct rozhraním. Zdrojové soubory jsou zapsané indexovanými barvami AutoCADu, takže stav kresby (KresliciStav) nese barvu i s původem (ACI index / true color / ByLayer / ByBlock), název textového stylu a vzor šrafy — ne jen výsledné RGB. Nová vlastnost, kterou má export zachovat, patří do rozhraní; obcházet ho stranou (sáhnout z rendereru zpátky na CadDocument šablony) je porušení prvního pravidla.

Podrobnosti (vrstvy, NuGet API, pravidla zápisu DXF, tabulka čtených entit a známá omezení) — 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 a ObservableObject — 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 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) a loga ve dvou složkách (LogaResolver): 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 — obrazovky, pole a datový model. PODKLAD_CAD_Layout_Tisk.md — CAD, layouty a tisk přes COM.