Switch v Replay neměl default větev: INSERT, ELLIPSE, POINT, SOLID, 3DFACE a POLYLINE3D propadly bez akce a bez záznamu. V dodávaných souborech žádná z nich není, ale uživatel si přidává vlastní loga – to nejhorší, co se mu může stát, je logo, které se nevykreslí a nikdo mu to neřekne. - INSERT se rozvine rekurzivně (vztažný bod, měřítko os, natočení), s ochranou proti bloku vkládajícímu sám sebe. Uvnitř bloku se hladina „0" a barva ByBlock berou od vkládající entity – proto jde stejný blok vložit dvakrát a pokaždé v jiné barvě. - TransformRenderer umí celou afinní transformaci, ne jen měřítko a posun. Oblouk zůstane obloukem jen u podobnosti bez zrcadlení; jinak by z kružnice byla elipsa, kterou kreslicí rozhraní nezná, tak se rozloží na lomenou čáru. - ELLIPSE, POINT, SOLID, 3DFACE, POLYLINE3D se kreslí. U SOLID pozor na prohozený 3. a 4. roh, jinak vyjdou přesýpací hodiny. - Zbytek se počítá do DxfTemplate.NezpracovaneEntity a souhrn exportu (PDF i DXF) ho vypíše. Export se kvůli tomu nezastaví. - Spline se dělí podle délky (dřív pevných 64 dílků – málo pro dlouhé křivky, zbytečně moc pro krátké). - Verze výstupního DXF se zafixovala na AC1027 (jako zdrojová šablona). Dřív ji určoval default ACadSharp, který může upgrade balíčku tiše změnit. Šablona i všech 9 log projdou s prázdným počítadlem (test). Render log do PNG je pixel po pixelu shodný s předchozím stavem. 114 testů zelených. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
109 lines
4.1 KiB
C#
109 lines
4.1 KiB
C#
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 VerzeVystupuJeZafixovana()
|
||
{
|
||
// Bez explicitního nastavení určí verzi výchozí hodnota ACadSharp – a tu může upgrade
|
||
// balíčku tiše změnit. Verze rozhoduje, čím půjde výkres u kolegy otevřít.
|
||
var doc = Kolecko();
|
||
Assert.Equal(DxfProfileRenderer.VerzeVystupu, doc.Header.Version);
|
||
}
|
||
|
||
[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);
|
||
}
|
||
}
|