Files
Rozpisky/Rozpisky.Tests/DxfBarvyRoundTripTesty.cs
T
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

100 lines
3.7 KiB
C#
Raw 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 System.IO;
using ACadSharp.Entities;
using ACadSharp.IO;
using Rozpisky.Dxf;
using Rozpisky.Rendering;
using Xunit;
namespace Rozpisky.Tests;
/// <summary>
/// Cesta barev tam a zpět: <c>Rozpiska.dxf</c> → <see cref="DxfProfileRenderer"/> → soubor →
/// zpátky. Šablona i všech 9 log jsou zapsané výhradně indexovanými barvami AutoCADu
/// (group 62); dřív z nich export dělal natvrdo RGB (group 420), takže výkres v CADu přestal
/// reagovat na tabulku barev a ByLayer se rozpadlo na kopie barvy hladiny.
/// </summary>
public class DxfBarvyRoundTripTesty : IDisposable
{
private readonly string _soubor = Path.Combine(Path.GetTempPath(), "rozpisky-barvy-" + Guid.NewGuid().ToString("N") + ".dxf");
public void Dispose()
{
try { File.Delete(_soubor); } catch (IOException) { }
GC.SuppressFinalize(this);
}
/// <summary>Přehraje šablonu do DXF rendereru, zapíše a načte zpět.</summary>
private ACadSharp.CadDocument Kolecko(bool sRameckem = true)
{
var tpl = new DxfTemplate(TestData.Sablona);
var dxf = new DxfProfileRenderer();
tpl.Replay(dxf, values: null, includeNoPrint: sRameckem);
DxfWriter.Write(_soubor, dxf.Document, binary: true);
return DxfReader.Read(_soubor);
}
[Fact]
public void ZadnaEntitaNevyjdeJakoTrueColor()
{
var doc = Kolecko();
var prohresky = doc.Entities.OfType<Entity>().Where(e => e.Color.IsTrueColor).ToList();
Assert.Empty(prohresky);
}
[Fact]
public void PouziteIndexyOdpovidajiZdroji()
{
// Indexy, které kreslítko dostalo ze šablony, musí být tytéž, jaké skončí v souboru.
var zaznam = new RecordingRenderer();
new DxfTemplate(TestData.Sablona).Replay(zaznam, values: null, includeNoPrint: true);
var zdrojove = zaznam.Stavy.Where(s => s.Barva.Druh == BarvaDruh.Index)
.Select(s => (int)s.Barva.Index).ToHashSet();
var doc = Kolecko();
var vysledne = doc.Entities.OfType<Entity>()
.Where(e => !e.Color.IsByLayer && !e.Color.IsByBlock)
.Select(e => (int)e.Color.Index).ToHashSet();
Assert.NotEmpty(zdrojove);
Assert.Equal(zdrojove, vysledne);
}
[Fact]
public void ByLayerZustaneByLayer()
{
// Šablona má 41 entit s barvou 256 (ByLayer). Když se rozbalí na konkrétní RGB,
// přestane jít barva výkresu měnit přes hladinu přesně to uživatel hlásí.
var zaznam = new RecordingRenderer();
new DxfTemplate(TestData.Sablona).Replay(zaznam, values: null, includeNoPrint: true);
int zdrojovych = zaznam.Stavy.Count(s => s.Barva.Druh == BarvaDruh.ByLayer);
Assert.True(zdrojovych > 0, "šablona žádnou ByLayer entitu nemá test ztratil smysl");
var doc = Kolecko();
Assert.Contains(doc.Entities.OfType<Entity>(), e => e.Color.IsByLayer);
}
[Fact]
public void HladinyMajiVlastnostiZTabulkyNeZPrvniEntity()
{
var zdroj = ACadSharp.IO.DxfReader.Read(TestData.Sablona);
var doc = Kolecko();
foreach (var vrstva in doc.Layers)
{
if (!zdroj.Layers.TryGetValue(vrstva.Name, out var puvodni)) continue;
Assert.Equal(puvodni.Color.Index, vrstva.Color.Index);
Assert.Equal(puvodni.PlotFlag, vrstva.PlotFlag);
}
}
[Fact]
public void RamecekNoPrintZustaneNetisknutelny()
{
// Rámeček A4 se do exportu kreslí jako reference, ale tisknout se nesmí.
var doc = Kolecko();
Assert.True(doc.Layers.TryGetValue(DxfTemplate.HladinaNoPrint, out var vrstva),
"hladina !!NOPRINT v exportu chybí");
Assert.False(vrstva!.PlotFlag);
}
}