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>
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
using Rozpisky.Rendering;
|
||||
using Xunit;
|
||||
|
||||
namespace Rozpisky.Tests;
|
||||
|
||||
/// <summary>
|
||||
/// Rozřešení stavu kresby: co se má nakreslit, když barvu neurčí entita, ale hladina.
|
||||
/// Chyba tady se projeví špatnou barvou v náhledu, ne pádem – proto explicitní testy.
|
||||
/// </summary>
|
||||
public class BarvaTesty
|
||||
{
|
||||
private static KresliciStav Stav(Barva entita, Barva hladina)
|
||||
=> new(HladinaStav.Vychozi with { Barva = hladina }, entita);
|
||||
|
||||
[Fact]
|
||||
public void VlastniBarvaEntityPrebijiHladinu()
|
||||
{
|
||||
Assert.Equal(0x0000FF, Stav(Barva.Aci(5), Barva.Aci(1)).RgbProKresbu());
|
||||
Assert.Equal(0x123456, Stav(Barva.Prima(0x123456), Barva.Aci(1)).RgbProKresbu());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ByLayerSiVezmeBarvuHladiny()
|
||||
=> Assert.Equal(0xFF0000, Stav(Barva.ZHladiny, Barva.Aci(1)).RgbProKresbu());
|
||||
|
||||
[Fact]
|
||||
public void ByBlockMimoBlokSeChovaJakoByLayer()
|
||||
=> Assert.Equal(0xFF0000, Stav(Barva.ZBloku, Barva.Aci(1)).RgbProKresbu());
|
||||
|
||||
[Fact]
|
||||
public void ByLayerNadHladinouBezBarvyDaCernou()
|
||||
=> Assert.Equal(0x000000, Stav(Barva.ZHladiny, Barva.ZHladiny).RgbProKresbu());
|
||||
|
||||
[Fact]
|
||||
public void TloustkaPadaZEntityNaHladinuAPakNaVychozi()
|
||||
{
|
||||
var h = HladinaStav.Vychozi with { TloustkaMm = 0.5 };
|
||||
Assert.Equal(0.35, new KresliciStav(h, Barva.ZHladiny, TloustkaMm: 0.35).TloustkaKresby(), 3);
|
||||
Assert.Equal(0.5, new KresliciStav(h, Barva.ZHladiny).TloustkaKresby(), 3);
|
||||
Assert.Equal(KresliciStav.VychoziTloustkaMm,
|
||||
new KresliciStav(HladinaStav.Vychozi, Barva.ZHladiny).TloustkaKresby(), 3);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TypCaryPadaZEntityNaHladinuAPakNaContinuous()
|
||||
{
|
||||
var h = HladinaStav.Vychozi with { TypCary = "DASHED" };
|
||||
Assert.Equal("CENTER", new KresliciStav(h, Barva.ZHladiny, TypCary: "CENTER").TypCaryKresby());
|
||||
Assert.Equal("DASHED", new KresliciStav(h, Barva.ZHladiny).TypCaryKresby());
|
||||
Assert.Equal("Continuous",
|
||||
new KresliciStav(h with { TypCary = "" }, Barva.ZHladiny).TypCaryKresby());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void IndexNeseIRgbProKresbu()
|
||||
{
|
||||
var b = Barva.Aci(5);
|
||||
Assert.Equal(BarvaDruh.Index, b.Druh);
|
||||
Assert.Equal(5, b.Index);
|
||||
Assert.Equal(0x0000FF, b.Rgb);
|
||||
Assert.True(b.JeVlastni);
|
||||
Assert.False(Barva.ZHladiny.JeVlastni);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user