Baseline: současný stav projektu Rozpisky

První commit — WPF aplikace pro generování výkresových rohových razítek
(.NET 10, SkiaSharp, ACadSharp, ClosedXML) včetně xUnit testů, DXF šablony,
log a dokumentace. Build výstupy (bin/, obj/, .vs/) jsou ignorovány.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-07 09:45:49 +02:00
co-authored by Claude Opus 5
commit a6377ab583
107 changed files with 349485 additions and 0 deletions
+55
View File
@@ -0,0 +1,55 @@
using Rozpisky.Dxf;
using Rozpisky.Rendering;
using Xunit;
namespace Rozpisky.Tests;
/// <summary>
/// Bbox pro fit fragmentu (loga do placeholderu): dřív se text počítal jen jako vkládací bod,
/// takže textová loga mohla přetéct rámeček. Teď se bbox počítá replayem do BoundsRenderer.
/// </summary>
public class BoundsTesty
{
[Fact]
public void VsechnaLoga_MajiNeprazdneBounds()
{
foreach (var name in TestData.VsechnaLoga)
{
var tpl = new DxfTemplate(TestData.Logo(name));
Assert.True(tpl.Bounds is { W: > 0, H: > 0 }, $"{name}: Bounds = {tpl.Bounds}");
}
}
[Fact]
public void Bounds_ZahrnujiTextIVyplne()
{
// sprava_zeleznic: 2 texty + 2 SOLID šrafy. Bbox musí obsáhnout všechny smyčky výplní
// a být širší než samotné výplně (texty SPRÁVA/ŽELEZNIC vedle značky).
var tpl = new DxfTemplate(TestData.Logo("sprava_zeleznic.dxf"));
var rec = new RecordingRenderer();
tpl.Replay(rec);
var body = rec.Fills.SelectMany(f => f).SelectMany(l => l).ToList();
Assert.NotEmpty(body);
var b = tpl.Bounds!.Value;
Assert.True(body.All(p => p.X >= b.X - 1e-6 && p.X <= b.X + b.W + 1e-6
&& p.Y >= b.Y - 1e-6 && p.Y <= b.Y + b.H + 1e-6));
double vyplneW = body.Max(p => p.X) - body.Min(p => p.X);
Assert.True(b.W > vyplneW, $"bbox W={b.W:F2} nezahrnuje texty (výplně W={vyplneW:F2})");
}
[Fact]
public void BoundsRenderer_RespektujeZarovnaniTextu()
{
// Center/Right roste od kotvy doleva; Top dolů dřív box rostl vždy jen doprava nahoru.
var stred = new BoundsRenderer();
stred.Text(0, 0, "ABCD", 10, HAlign.Center, VAlign.Middle);
Assert.True(stred.MinX < 0 && stred.MaxX > 0, $"Center: {stred.MinX}..{stred.MaxX}");
Assert.True(stred.MinY < 0 && stred.MaxY > 0, $"Middle: {stred.MinY}..{stred.MaxY}");
var vpravo = new BoundsRenderer();
vpravo.Text(0, 0, "ABCD", 10, HAlign.Right, VAlign.Top);
Assert.True(vpravo.MinX < 0 && vpravo.MaxX <= 1e-9, $"Right: {vpravo.MinX}..{vpravo.MaxX}");
Assert.True(vpravo.MinY < 0 && vpravo.MaxY <= 1e-9, $"Top: {vpravo.MinY}..{vpravo.MaxY}");
}
}