/*
* GNU AFFERO GENERAL PUBLIC LICENSE
* Version 3, 19 November 2007
* Copyright (C) 2007 Free Software Foundation, Inc.
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Numerics;
using UVtools.Core.Extensions;
using UVtools.Core.FileFormats;
namespace UVtools.Core.MeshFormats;
public class AMFMeshFile : MeshFile
{
#region Members
private readonly Dictionary _vertexCache = new(VertexCacheSize);
private FileStream _triangleStream = null!;
#endregion
#region Properties
public static FileExtension FileExtension => new(typeof(AMFMeshFile), "amf", "Additive Manufacturing Format");
#endregion
#region Constructor
public AMFMeshFile(string filePath, FileMode fileMode, MeshFileFormat fileFormat = MeshFileFormat.ASCII, FileFormat? slicerFile = null) : base(filePath, fileMode, MeshFileFormat.ASCII, slicerFile) { }
#endregion
#region Methods
public override void BeginWrite()
{
/* Create a stream to store the triangles (faces) as they come through */
_triangleStream = new FileStream(PathExtensions.GetTemporaryFilePathWithExtension("trig", $"{About.Software}_"), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, FileOptions.DeleteOnClose);
MeshStream.WriteLineLF("");
MeshStream.WriteLineLF("");
MeshStream.WriteLineLF($"\t{FilenameWithoutExtension}");
MeshStream.WriteLineLF($"\t{HeaderComment}");
MeshStream.WriteLineLF("\t");
MeshStream.WriteLineLF("");
var tmpFile = PathExtensions.GetTemporaryFilePathWithExtension("tmp", $"{About.Software}_");
if (File.Exists(tmpFile)) File.Delete(tmpFile);
using (var zip = ZipFile.Open(tmpFile, ZipArchiveMode.Create))
{
MeshStream.Seek(0, SeekOrigin.Begin);
zip.PutFileContent(Filename, MeshStream, ZipArchiveMode.Create);
}
MeshStream.Dispose();
File.Move(tmpFile, FilePath, true);
}
#endregion
}