Files
marekandClaude Opus 5 d66aec5299 Barvy: zachovat ACI index a ByLayer po celé cestě DXF → model → DXF
Š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>
2026-09-07 12:13:32 +02:00

88 lines
4.0 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 (250254) 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)));
}
}