Šablona i všech 9 log jsou zapsané výhradně indexovanými barvami AutoCADu (group 62) – true color v nich není ani jednou. Kreslicí rozhraní přitom neslo jen `int rgb`, takže se index i ByLayer ztratily už při čtení a export zapisoval všechno jako natvrdo RGB (group 420). Výkres v CADu pak přestal reagovat na tabulku barev a barva hladiny se rozpadla na kopie na entitách. `IProfileRenderer.Layer(name, rgb, mm)` se mění na `Stav(in KresliciStav)`. Stav nese barvu i s původem (`Barva`: ACI index / true color / ByLayer / ByBlock), typ čáry, tloušťku a celý popis hladiny (`HladinaStav`) – hladina se ve výstupu staví z tabulky hladin, ne z první entity, která na ní přistála. Rámeček `!!NOPRINT` proto zůstane netisknutelný. Paleta ACI je vlastní (`AciPaleta`), ne z ACadSharp: ta se od AutoCADu liší u 33 indexů, mimo jiné u 8 (použitý v šabloně) a u posledního indexu většiny desítek odstínů, kde vrací barvu ze sousední skupiny – 29 a 39 tam dokonce dostanou tutéž barvu. Rozsah 10–249 se dopočítává, ne vypisuje. Co ověřují nové testy (93 zelených): - paleta proti AutoCADu i proti ACadSharp, se seznamem známých odchylek, - rozřešení ByLayer/ByBlock, tloušťky a typu čáry, - kolečko šablona → export → načtení: žádná entita není true color, indexy odpovídají zdroji, ByLayer zůstane ByLayer, hladiny mají barvu i příznak tisku ze zdrojové tabulky. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
54 lines
2.1 KiB
C#
54 lines
2.1 KiB
C#
using Rozpisky.Rendering;
|
||
using SkiaSharp;
|
||
using Xunit;
|
||
|
||
namespace Rozpisky.Tests;
|
||
|
||
/// <summary>
|
||
/// Skutečný render Skií (ne jen zplošťení obrysu): plná kružnice tvořená jedinou obloukovou
|
||
/// hranou (sweep 360°) se musí vykreslit, ne „propadnout" degenerovaným <c>ArcTo</c>.
|
||
/// </summary>
|
||
public class SkiaRenderTesty
|
||
{
|
||
/// <summary>Vykreslí kresbu na 200×200 px bitmapu (mm 1:1, střed plátna = mm (0,0)) a vrátí
|
||
/// počet nebílých pixelů.</summary>
|
||
private static int PocetVyplnenych(Action<IProfileRenderer> draw)
|
||
{
|
||
const int S = 200;
|
||
using var bmp = new SKBitmap(S, S);
|
||
using var canvas = new SKCanvas(bmp);
|
||
canvas.Clear(SKColors.White);
|
||
SKPoint Map(double x, double y) => new((float)(S / 2 + x * 10), (float)(S / 2 - y * 10)); // 10 px/mm, Y nahoru
|
||
using (var r = new SkiaProfileRenderer(canvas, Map, pxPerMm: 10))
|
||
draw(r);
|
||
|
||
int n = 0;
|
||
for (int y = 0; y < S; y++)
|
||
for (int x = 0; x < S; x++)
|
||
if (bmp.GetPixel(x, y) != SKColors.White) n++;
|
||
return n;
|
||
}
|
||
|
||
[Fact]
|
||
public void PlnaKruznice_JakoJednaObloukovaHrana_SeVyplni()
|
||
{
|
||
// Kruh r=5 mm ze středu (0,0), jediná Arc hrana se sweepem 360°.
|
||
var edge = Edge.Arc(5, 0, 5, 0, 0, 0, r: 5, a0: 0, sweep: 2 * Math.PI);
|
||
var contour = new Contour(new[] { edge }, Closed: true);
|
||
|
||
int filled = PocetVyplnenych(g => { g.Stav(KresliciStav.Vychozi); g.Fill(new[] { contour }); });
|
||
|
||
// Plocha kruhu r=5 mm × (10 px/mm)² = π·2500 ≈ 7854 px; tolerantně > 5000.
|
||
Assert.True(filled > 5000, $"plná kružnice se nevykreslila (vyplněno {filled} px)");
|
||
}
|
||
|
||
[Fact]
|
||
public void ObloukovyOblouk_SeVykresli_Stroke()
|
||
{
|
||
// Kontrolní: běžný oblouk (< 360°) přes Stroke musí něco nakreslit.
|
||
var edge = Edge.Arc(5, 0, 0, 5, 0, 0, r: 5, a0: 0, sweep: Math.PI / 2);
|
||
int filled = PocetVyplnenych(g => { g.Stav(KresliciStav.Vychozi); g.Stroke(new Contour(new[] { edge }, Closed: false)); });
|
||
Assert.True(filled > 50, $"oblouk se nevykreslil (vyplněno {filled} px)");
|
||
}
|
||
}
|