Add OpenNest.Reporting (net8.0, PDFsharp-MigraDoc 6.2.4) with a detached report snapshot and a PDF writer for an empty/demand-only job or a single plate layout: Letter portrait summary with vector part thumbnails and a landscape plate page with a vector sheet diagram, both with Page X of Y. - Snapshot uses reference identity for document-local R### IDs, recounts nested quantities from placements x copies with checked wide integers, excludes cutoffs from accounting, and retains no live domain objects. - Geometry keeps Cut/Display material paths, drops rapid/scribe/lead paths, preserves native arcs, holes and intentional tab gaps, and rejects malformed programs with plate/part identification. - Open contours and cutoffs are stroked per contour so PDFsharp cannot join a tab gap to the next contour. - Bundled DejaVu Sans via a custom resolver (including MigraDoc's error font); unsupported text fails with the field and code point. - Layouts beyond this slice (multiple plates, page overflow, labels that do not fit) fail with NotSupportedException before the destination is replaced; output is rendered to a temporary sibling and moved atomically.
28 lines
969 B
C#
28 lines
969 B
C#
namespace OpenNest.Reporting;
|
|
|
|
internal static class AtomicReportFile
|
|
{
|
|
internal static void Write(string destination, Action<Stream> render)
|
|
{
|
|
ArgumentException.ThrowIfNullOrWhiteSpace(destination);
|
|
ArgumentNullException.ThrowIfNull(render);
|
|
var target = Path.GetFullPath(destination);
|
|
var temporary = Path.Combine(Path.GetDirectoryName(target)!,
|
|
"." + Path.GetFileName(target) + "." + Guid.NewGuid().ToString("N") + ".tmp");
|
|
try
|
|
{
|
|
using (var stream = new FileStream(temporary, FileMode.CreateNew, FileAccess.Write, FileShare.None))
|
|
{
|
|
render(stream);
|
|
stream.Flush(flushToDisk: true);
|
|
}
|
|
// The sibling stays on the same filesystem. Never truncate/delete the target first.
|
|
File.Move(temporary, target, overwrite: true);
|
|
}
|
|
finally
|
|
{
|
|
File.Delete(temporary);
|
|
}
|
|
}
|
|
}
|