using Microsoft.Win32; using System; using System.Linq; using System.Numerics; using System.Threading; using Windows.Foundation; using Windows.Graphics.Printing3D; using Windows.Storage; using Windows.Storage.Streams; namespace Printing3DWalkthrough { class App { static AsyncStatus asyncStatus = AsyncStatus.Started; [STAThread] static void Main(string[] args) { var package = CreatePackage(); SavePackage(package); } static Printing3D3MFPackage CreatePackage() { var package = new Printing3D3MFPackage(); var model = new Printing3DModel() { Unit = Printing3DModelUnit.Millimeter }; var mesh = new Printing3DMesh(); SetVertices(mesh); SetTriangleIndices(mesh); var component = new Printing3DComponent() { Mesh = mesh }; var componentWithMetrix = new Printing3DComponentWithMatrix() { Component = component, Matrix = Matrix4x4.Identity }; model.Meshes.Add(mesh); model.Components.Add(component); model.Build.Components.Add(componentWithMetrix); var saveModel = package.SaveModelToPackageAsync(model); var saveModelCompleted = new EventWaitHandle(false, EventResetMode.ManualReset); saveModel.Completed += (operation, status) => { saveModelCompleted.Set(); }; saveModelCompleted.WaitOne(); saveModelCompleted.Dispose(); return package; } static void SavePackage(Printing3D3MFPackage package) { var saveFileDialog = new SaveFileDialog() { Filter = "3D Manufacturing Format|*.3mf" }; while (saveFileDialog.ShowDialog() != true) ; string filePath = saveFileDialog.FileName; string folderPath = filePath.Substring(0, filePath.LastIndexOf('\\')); var getStorageFolder = StorageFolder.GetFolderFromPathAsync(folderPath); var getStorageFolderCompleted = new EventWaitHandle(false, EventResetMode.ManualReset); var storageFolder = (StorageFolder)null; getStorageFolder.Completed += (operation, status) => { storageFolder = operation.GetResults(); getStorageFolderCompleted.Set(); }; getStorageFolderCompleted.WaitOne(); getStorageFolderCompleted.Dispose(); var createStorageFile = storageFolder.CreateFileAsync(saveFileDialog.SafeFileName, CreationCollisionOption.ReplaceExisting); var createStorageFileCompleted = new EventWaitHandle(false, EventResetMode.ManualReset); var storageFile = (StorageFile)null; createStorageFile.Completed += (operation, status) => { storageFile = operation.GetResults(); createStorageFileCompleted.Set(); }; createStorageFileCompleted.WaitOne(); createStorageFileCompleted.Dispose(); var save = package.SaveAsync(); var saveCompleted = new EventWaitHandle(false, EventResetMode.ManualReset); var stream = (IRandomAccessStream)null; save.Completed += (operation, status) => { stream = operation.GetResults(); saveCompleted.Set(); }; saveCompleted.WaitOne(); saveCompleted.Dispose(); stream.Seek(0); var dataReader = new DataReader(stream); var load = dataReader.LoadAsync((uint)stream.Size); var loadCompleted = new EventWaitHandle(false, EventResetMode.ManualReset); load.Completed += (operation, status) => { loadCompleted.Set(); }; loadCompleted.WaitOne(); loadCompleted.Dispose(); var buffer = dataReader.ReadBuffer((uint)stream.Size); var writeBuffer = FileIO.WriteBufferAsync(storageFile, buffer); var writeBufferCompleted = new EventWaitHandle(false, EventResetMode.ManualReset); writeBuffer.Completed += (operation, status) => { writeBufferCompleted.Set(); }; writeBufferCompleted.WaitOne(); writeBufferCompleted.Dispose(); dataReader.Dispose(); stream.Dispose(); } static void SetVertices(Printing3DMesh mesh) { Printing3DBufferDescription description = new Printing3DBufferDescription() { Format = Printing3DBufferFormat.Printing3DDouble, Stride = 3 }; mesh.VertexPositionsDescription = description; mesh.VertexCount = 8; mesh.CreateVertexPositions(sizeof(double) * description.Stride * mesh.VertexCount); var stream = new InMemoryRandomAccessStream(); double[] vertices = { 0, 0, 0, 10, 0, 0, 0, 10, 0, 10, 10, 0, 0, 0, 10, 10, 0, 10, 0, 10, 10, 10, 10, 10, }; var dataWriter = new DataWriter(stream); var vertexData = vertices.SelectMany(v => BitConverter.GetBytes(v)).ToArray(); dataWriter.WriteBytes(vertexData); var store = dataWriter.StoreAsync(); var storeCompleted = new EventWaitHandle(false, EventResetMode.ManualReset); store.Completed += (operation, status) => { asyncStatus = status; storeCompleted.Set(); }; storeCompleted.WaitOne(); storeCompleted.Dispose(); dataWriter.DetachStream(); dataWriter.Dispose(); stream.Seek(0); var read = stream.ReadAsync(mesh.GetVertexPositions(), (uint)stream.Size, InputStreamOptions.ReadAhead); var readCompleted = new EventWaitHandle(false, EventResetMode.ManualReset); read.Completed += (operation, status) => { asyncStatus = status; readCompleted.Set(); }; readCompleted.WaitOne(); readCompleted.Dispose(); stream.Dispose(); } static void SetTriangleIndices(Printing3DMesh mesh) { Printing3DBufferDescription description = new Printing3DBufferDescription() { Format = Printing3DBufferFormat.Printing3DUInt, Stride = 3 }; mesh.IndexCount = 12; mesh.TriangleIndicesDescription = description; mesh.CreateTriangleIndices(sizeof(uint) * description.Stride * mesh.IndexCount); var stream = new InMemoryRandomAccessStream(); var dataWriter = new DataWriter(stream); uint[] indices = { 1, 0, 2, 1, 2, 3, 0, 1, 5, 0, 5, 4, 1, 3, 7, 1, 7, 5, 2, 7, 3, 2, 6, 7, 0, 6, 2, 0, 4, 6, 6, 5, 7, 4, 5, 6, }; var indexData = indices.SelectMany(v => BitConverter.GetBytes(v)).ToArray(); dataWriter.WriteBytes(indexData); var store = dataWriter.StoreAsync(); var storeCompleted = new EventWaitHandle(false, EventResetMode.ManualReset); store.Completed += (operation, status) => { asyncStatus = status; storeCompleted.Set(); }; storeCompleted.WaitOne(); storeCompleted.Dispose(); dataWriter.DetachStream(); dataWriter.Dispose(); stream.Seek(0); var read = stream.ReadAsync(mesh.GetTriangleIndices(), (uint)stream.Size, InputStreamOptions.ReadAhead); var readCompleted = new EventWaitHandle(false, EventResetMode.ManualReset); read.Completed += (operation, status) => { asyncStatus = status; readCompleted.Set(); }; readCompleted.WaitOne(); readCompleted.Dispose(); stream.Dispose(); } } }
<PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <ProjectGuid>{03322B37-8BFE-4EB2-AB0F-F3DCCF1E27DB}</ProjectGuid> <OutputType>Exe</OutputType> <RootNamespace>Verify</RootNamespace> <AssemblyName>Verify</AssemblyName> <TargetPlatformVersion>10.0.17763.0</TargetPlatformVersion> <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> <FileAlignment>512</FileAlignment> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <Deterministic>true</Deterministic> </PropertyGroup>
<ItemGroup> <Reference Include="PresentationFramework" /> <Reference Include="System.Runtime" /> <Reference Include="System.Runtime.InteropServices.WindowsRuntime" /> <Reference Include="System.Runtime.WindowsRuntime" /> <Reference Include="Windows.Foundation" /> <Reference Include="Windows.Graphics" /> <Reference Include="Windows.Security" /> <Reference Include="Windows.Storage" /> </ItemGroup>