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,99 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user