Š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>
88 lines
4.0 KiB
C#
88 lines
4.0 KiB
C#
using Rozpisky.Rendering;
|
||
using Xunit;
|
||
using AcColor = ACadSharp.Color;
|
||
|
||
namespace Rozpisky.Tests;
|
||
|
||
/// <summary>
|
||
/// Paleta indexovaných barev AutoCADu. Rozhoduje o tom, jak vypadá náhled proti CADu –
|
||
/// v exportu se index zapisuje číslem, takže tahle tabulka do souboru nikdy neproteče.
|
||
/// </summary>
|
||
public class AciPaletaTesty
|
||
{
|
||
[Theory]
|
||
[InlineData(1, 0xFF0000)] [InlineData(2, 0xFFFF00)] [InlineData(3, 0x00FF00)]
|
||
[InlineData(4, 0x00FFFF)] [InlineData(5, 0x0000FF)] [InlineData(6, 0xFF00FF)]
|
||
[InlineData(7, 0xFFFFFF)] [InlineData(8, 0x414141)] [InlineData(9, 0x808080)]
|
||
[InlineData(255, 0xFFFFFF)] [InlineData(250, 0x333333)]
|
||
public void ZakladniBarvySedle(int index, int rgb) => Assert.Equal(rgb, AciPaleta.Rgb(index));
|
||
|
||
[Theory]
|
||
// Odstínová část: první čtveřice ze skupiny červené a modrozelené, ověřená proti AutoCADu.
|
||
[InlineData(10, 0xFF0000)] [InlineData(11, 0xFF7F7F)] [InlineData(12, 0xA50000)]
|
||
[InlineData(13, 0xA55252)] [InlineData(20, 0xFF3F00)] [InlineData(21, 0xFF9F7F)]
|
||
[InlineData(22, 0xA52900)] [InlineData(136, 0x004C4C)] [InlineData(18, 0x260000)]
|
||
public void OdstinySeDopocitavajiSpravne(int index, int rgb) => Assert.Equal(rgb, AciPaleta.Rgb(index));
|
||
|
||
[Fact]
|
||
public void MimoRozsahJeCerna()
|
||
{
|
||
Assert.Equal(0x000000, AciPaleta.Rgb(-1));
|
||
Assert.Equal(0x000000, AciPaleta.Rgb(256));
|
||
Assert.Equal(0x000000, AciPaleta.Rgb(0)); // 0 = ByBlock, samostatně se nekreslí
|
||
}
|
||
|
||
[Fact]
|
||
public void KazdyOdstinMaVlastniBarvu()
|
||
{
|
||
// 24 skupin po 10 – žádné dvě sousední skupiny nesmí vyjít stejně. Přesně tímhle se
|
||
// ACadSharp plete (29 a 39 tam mají tutéž barvu), a proto máme paletu vlastní.
|
||
for (int skupina = 0; skupina + 1 < 24; skupina++)
|
||
for (int pozice = 0; pozice < 10; pozice++)
|
||
Assert.NotEqual(AciPaleta.Rgb(10 + skupina * 10 + pozice),
|
||
AciPaleta.Rgb(20 + skupina * 10 + pozice));
|
||
}
|
||
|
||
/// <summary>Indexy, kde se <c>ACadSharp.Color.GetIndexRGB</c> od AutoCADu liší o víc než
|
||
/// zaokrouhlení: dva stupně šedi (8, 9), šedý klín na konci palety (250–254) a poslední
|
||
/// index většiny desítek odstínů (29, 119, 139, …), kde ACadSharp bere barvu ze sousední
|
||
/// skupiny – proto tam vycházejí i barvy mimo jas dané pozice.</summary>
|
||
private static readonly int[] ZnameOdchylky =
|
||
{
|
||
8, 9, 29, 91, 109, 119, 129, 139, 145, 147, 149, 157, 159, 167, 169, 177, 179,
|
||
187, 189, 192, 197, 199, 203, 209, 219, 229, 239, 249, 250, 251, 252, 253, 254,
|
||
};
|
||
|
||
[Fact]
|
||
public void ShodujeSeSAcadSharpKromeZnamychOdchylek()
|
||
{
|
||
// Pojistka proti tichému rozejití při upgradu balíčku. Jinde než v seznamu se smí lišit
|
||
// nanejvýš o 1 na kanál (jiné zaokrouhlení při dopočtu odstínu) – to okem nepoznat.
|
||
var zname = new HashSet<int>(ZnameOdchylky);
|
||
var novaOdchylka = new List<int>();
|
||
var zmizelaOdchylka = new List<int>();
|
||
|
||
for (int i = 0; i <= 255; i++)
|
||
{
|
||
var acad = AcColor.GetIndexRGB((byte)i);
|
||
int nas = AciPaleta.Rgb(i);
|
||
int rozdil = Math.Max(Math.Abs(acad[0] - ((nas >> 16) & 0xFF)),
|
||
Math.Max(Math.Abs(acad[1] - ((nas >> 8) & 0xFF)),
|
||
Math.Abs(acad[2] - (nas & 0xFF))));
|
||
if (rozdil > 1 && !zname.Contains(i)) novaOdchylka.Add(i);
|
||
if (rozdil <= 1 && zname.Contains(i)) zmizelaOdchylka.Add(i);
|
||
}
|
||
|
||
Assert.Empty(novaOdchylka); // ACadSharp se rozešel s AutoCADem na dalším indexu
|
||
Assert.Empty(zmizelaOdchylka); // ACadSharp se opravil – seznam zúžit
|
||
}
|
||
|
||
[Fact]
|
||
public void NejblizsiIndexNajdePresnouShoduIPriblizek()
|
||
{
|
||
Assert.Equal(1, AciPaleta.NejblizsiIndex(0xFF0000));
|
||
Assert.Equal(5, AciPaleta.NejblizsiIndex(0x0000FF));
|
||
Assert.Equal(0xFF0000, AciPaleta.Rgb(AciPaleta.NejblizsiIndex(0xFE0101)));
|
||
}
|
||
}
|