using System.IO; using ACadSharp.Entities; using ACadSharp.IO; using Rozpisky.Dxf; using Rozpisky.Rendering; using Xunit; namespace Rozpisky.Tests; /// /// Cesta barev tam a zpět: Rozpiska.dxf → 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. /// 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); } /// Přehraje šablonu do DXF rendereru, zapíše a načte zpět. 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().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() .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(), 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); } }