Windows 10 and 3D Manufacturing Format, A Desktop-App Sample

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>

猜你喜欢

转载自www.cnblogs.com/JebediahKerman/p/Windows_10_and_3D_Manufacturing_Format_A_Desktop_App_Sample.html