Example #1
0
File: Print3D.cs Project: ice0/test
    private async Task CreateData()
    {
        package = new Printing3D3MFPackage();

        var model = new Printing3DModel();

        model.Unit = Printing3DModelUnit.Millimeter;

        var mesh = new Printing3DMesh();

        // save vertices
        await GetVerticesAsync(mesh);

        // save indices
        await GetIndicesAsync(mesh);

        // save material indices
        await GetMaterialIndicesAsync(mesh);

        // to make sure we don't use the same byte array from Unity
        if (pngBytes != null)
        {
            // texture2Coord Group
            var tex2CoordGroup = new Printing3DTexture2CoordMaterialGroup(groupId);

            // save texture coords
            for (int i = 0; i < uvPrint.Length / 2; i++)
            {
                var tex2CoordMaterial = new Printing3DTexture2CoordMaterial();
                tex2CoordMaterial.U = uvPrint[i * 2];
                tex2CoordMaterial.V = uvPrint[i * 2 + 1];
                tex2CoordGroup.Texture2Coords.Add(tex2CoordMaterial);
            }

            var copyPngBytes = new byte[pngBytes.Length];
            pngBytes.CopyTo(copyPngBytes, 0);

            var randomAccessStream = new InMemoryRandomAccessStream();
            await randomAccessStream.WriteAsync(copyPngBytes.AsBuffer());

            randomAccessStream.Seek(0);

            var texture = new Printing3DModelTexture();
            Printing3DTextureResource texResource = new Printing3DTextureResource();
            texResource.Name        = "/3D/Texture/skeleton.png";
            texResource.TextureData = new MyRandomAccessStream(randomAccessStream);
            package.Textures.Add(texResource);

            // add metadata about the texture
            model.Metadata.Add("tex" + groupId, "/3D/Texture/skeleton.png");
            model.Material.Texture2CoordGroups.Add(tex2CoordGroup);
        }
        else
        {
            // put color material into material group
            var newColor = Windows.UI.Color.FromArgb(a, r, g, b);
            var colrMat  = new Printing3DColorMaterial();
            colrMat.Color = newColor;

            var colorGroup = new Printing3DColorMaterialGroup(groupId);
            colorGroup.Colors.Add(colrMat);
            model.Material.ColorGroups.Add(colorGroup);
        }

        model.Meshes.Add(mesh);

        Printing3DComponent component = new Printing3DComponent();

        component.Mesh = mesh;

        model.Components.Add(component);

        var componentWithMatrix = new Printing3DComponentWithMatrix();

        componentWithMatrix.Component = component;

        componentWithMatrix.Matrix = System.Numerics.Matrix4x4.Identity;

        model.Build.Components.Add(componentWithMatrix);

        await package.SaveModelToPackageAsync(model);

        var modelStream = package.ModelPart;

        package.ModelPart = await FixTextureContentType(modelStream);

        // save to file and easy to debug
        // var stream = await package.SaveAsync();
        // await SaveStreamTo3MF(stream);
    }
    private async Task CreateData()
    {            
        package = new Printing3D3MFPackage();
           
        var model = new Printing3DModel();

        model.Unit = Printing3DModelUnit.Millimeter;

        var mesh = new Printing3DMesh();
    
        // save vertices
        await GetVerticesAsync(mesh);

        // save indices
        await GetIndicesAsync(mesh);
            
        // save material indices
        await GetMaterialIndicesAsync(mesh);
    
        // to make sure we don't use the same byte array from Unity
        if (pngBytes != null)
        {
            // texture2Coord Group
            var tex2CoordGroup = new Printing3DTexture2CoordMaterialGroup(groupId);
            
            // save texture coords
            for (int i = 0; i < uvPrint.Length / 2; i++)
            {
                var tex2CoordMaterial = new Printing3DTexture2CoordMaterial();
                tex2CoordMaterial.U = uvPrint[i * 2];
                tex2CoordMaterial.V = uvPrint[i * 2 + 1];
                tex2CoordGroup.Texture2Coords.Add(tex2CoordMaterial);
            }

            var copyPngBytes = new byte[pngBytes.Length];
            pngBytes.CopyTo(copyPngBytes, 0);
 
            var randomAccessStream = new InMemoryRandomAccessStream();
            await randomAccessStream.WriteAsync(copyPngBytes.AsBuffer());
            randomAccessStream.Seek(0); 

            var texture = new Printing3DModelTexture();
            Printing3DTextureResource texResource = new Printing3DTextureResource();
            texResource.Name = "/3D/Texture/skeleton.png";
            texResource.TextureData = new MyRandomAccessStream(randomAccessStream);
            package.Textures.Add(texResource);

            // add metadata about the texture
            model.Metadata.Add("tex" + groupId, "/3D/Texture/skeleton.png");
            model.Material.Texture2CoordGroups.Add(tex2CoordGroup);
        }
        else
        {
			// put color material into material group
            var newColor = Windows.UI.Color.FromArgb(a, r, g, b);
            var colrMat = new Printing3DColorMaterial();
            colrMat.Color = newColor;

            var colorGroup = new Printing3DColorMaterialGroup(groupId);
            colorGroup.Colors.Add(colrMat);
            model.Material.ColorGroups.Add(colorGroup);
        }

        model.Meshes.Add(mesh);

        Printing3DComponent component = new Printing3DComponent();

        component.Mesh = mesh;

        model.Components.Add(component);

        var componentWithMatrix = new Printing3DComponentWithMatrix();

        componentWithMatrix.Component = component;

        componentWithMatrix.Matrix = System.Numerics.Matrix4x4.Identity;

        model.Build.Components.Add(componentWithMatrix);

        await package.SaveModelToPackageAsync(model);
		
        var modelStream = package.ModelPart;
        package.ModelPart = await FixTextureContentType(modelStream);
		
        // save to file and easy to debug
        // var stream = await package.SaveAsync();
        // await SaveStreamTo3MF(stream);
    }
        private async Task <bool> CreateData()
        {
            //<SnippetInitClasses>
            var localPackage = new Printing3D3MFPackage();
            var model        = new Printing3DModel();

            // specify scaling units for model data
            model.Unit = Printing3DModelUnit.Millimeter;

            //</SnippetInitClasses>



            // create new mesh on model
            var mesh = new Printing3DMesh();

            // create vertices on the mesh
            await this.GetVerticesAsync(mesh);

            // create triangles on the mesh
            await SetTriangleIndicesAsync(mesh);

            //<SnippetMeshAdd>
            // add the mesh to the model
            model.Meshes.Add(mesh);
            //</SnippetMeshAdd>


            // create material indices
            await SetMaterialIndicesAsync(mesh);

            //<SnippetBaseMaterialGroup>
            // add material group
            // all material indices need to start from 1: 0 is a reserved id
            // create new base materialgroup with id = 1
            var baseMaterialGroup = new Printing3DBaseMaterialGroup(1);

            // create color objects
            // 'A' should be 255 if alpha = 100%
            var darkBlue = Windows.UI.Color.FromArgb(255, 20, 20, 90);
            var orange   = Windows.UI.Color.FromArgb(255, 250, 120, 45);
            var teal     = Windows.UI.Color.FromArgb(255, 1, 250, 200);

            // create new ColorMaterials, assigning color objects
            var colrMat = new Printing3DColorMaterial();

            colrMat.Color = darkBlue;

            var colrMat2 = new Printing3DColorMaterial();

            colrMat2.Color = orange;

            var colrMat3 = new Printing3DColorMaterial();

            colrMat3.Color = teal;

            // setup new materials using the ColorMaterial objects
            // set desired material type in the Name property
            var baseMaterial = new Printing3DBaseMaterial {
                Name  = Printing3DBaseMaterial.Pla,
                Color = colrMat
            };

            var baseMaterial2 = new Printing3DBaseMaterial {
                Name  = Printing3DBaseMaterial.Abs,
                Color = colrMat2
            };

            // add base materials to the basematerialgroup

            // material group index 0
            baseMaterialGroup.Bases.Add(baseMaterial);
            // material group index 1
            baseMaterialGroup.Bases.Add(baseMaterial2);

            // add material group to the basegroups property of the model
            model.Material.BaseGroups.Add(baseMaterialGroup);
            //</SnippetBaseMaterialGroup>


            //<SnippetColorMaterialGroup>
            // add ColorMaterials to the Color Material Group (with id 2)
            var colorGroup = new Printing3DColorMaterialGroup(2);

            // add the previous ColorMaterial objects to this ColorMaterialGroup
            colorGroup.Colors.Add(colrMat);
            colorGroup.Colors.Add(colrMat2);
            colorGroup.Colors.Add(colrMat3);

            // add colorGroup to the ColorGroups property on the model
            model.Material.ColorGroups.Add(colorGroup);
            //</SnippetColorMaterialGroup>

            //<SnippetMetadata>
            model.Metadata.Add("Title", "Cube");
            model.Metadata.Add("Designer", "John Smith");
            model.Metadata.Add("CreationDate", "1/1/2016");
            //</SnippetMetadata>



            //<SnippetCompositeMaterialGroup>
            // CompositeGroups
            // create new composite material group with id = 3
            var compositeGroup = new Printing3DCompositeMaterialGroup(3);

            // indices point to base materials in BaseMaterialGroup with id =1
            compositeGroup.MaterialIndices.Add(0);
            compositeGroup.MaterialIndices.Add(1);

            // create new composite materials
            var compMat = new Printing3DCompositeMaterial();

            // fraction adds to 1.0
            compMat.Values.Add(0.2); // .2 of first base material in BaseMaterialGroup 1
            compMat.Values.Add(0.8); // .8 of second base material in BaseMaterialGroup 1

            var compMat2 = new Printing3DCompositeMaterial();

            // fraction adds to 1.0
            compMat2.Values.Add(0.5);
            compMat2.Values.Add(0.5);

            var compMat3 = new Printing3DCompositeMaterial();

            // fraction adds to 1.0
            compMat3.Values.Add(0.8);
            compMat3.Values.Add(0.2);

            var compMat4 = new Printing3DCompositeMaterial();

            // fraction adds to 1.0
            compMat4.Values.Add(0.4);
            compMat4.Values.Add(0.6);

            // add composites to group
            compositeGroup.Composites.Add(compMat);
            compositeGroup.Composites.Add(compMat2);
            compositeGroup.Composites.Add(compMat3);
            compositeGroup.Composites.Add(compMat4);

            // add group to model
            model.Material.CompositeGroups.Add(compositeGroup);
            //</SnippetCompositeMaterialGroup>

            //<SnippetTextureResource>
            // texture resource setup
            Printing3DTextureResource texResource = new Printing3DTextureResource();

            // name conveys the path within the 3MF document
            texResource.Name = "/3D/Texture/msLogo.png";

            // in this case, we reference texture data in the sample appx, convert it to
            // an IRandomAccessStream, and assign it as the TextureData
            Uri         texUri = new Uri("ms-appx:///Assets/msLogo.png");
            StorageFile file   = await StorageFile.GetFileFromApplicationUriAsync(texUri);

            IRandomAccessStreamWithContentType iRandomAccessStreamWithContentType = await file.OpenReadAsync();

            texResource.TextureData = iRandomAccessStreamWithContentType;
            // add this testure resource to the 3MF Package
            localPackage.Textures.Add(texResource);

            // assign this texture resource to a Printing3DModelTexture
            var modelTexture = new Printing3DModelTexture();

            modelTexture.TextureResource = texResource;
            //</SnippetTextureResource>

            //<SnippetTexture2CoordMaterialGroup>
            // texture2Coord Group
            // create new Texture2CoordMaterialGroup with id = 4
            var tex2CoordGroup = new Printing3DTexture2CoordMaterialGroup(4);

            // create texture materials:
            // set up four tex2coordmaterial objects with four (u,v) pairs,
            // mapping to each corner of the image:

            var tex2CoordMaterial = new Printing3DTexture2CoordMaterial();

            tex2CoordMaterial.U = 0.0;
            tex2CoordMaterial.V = 1.0;
            tex2CoordGroup.Texture2Coords.Add(tex2CoordMaterial);

            var tex2CoordMaterial2 = new Printing3DTexture2CoordMaterial();

            tex2CoordMaterial2.U = 1.0;
            tex2CoordMaterial2.V = 1.0;
            tex2CoordGroup.Texture2Coords.Add(tex2CoordMaterial2);

            var tex2CoordMaterial3 = new Printing3DTexture2CoordMaterial();

            tex2CoordMaterial3.U = 0.0;
            tex2CoordMaterial3.V = 0.0;
            tex2CoordGroup.Texture2Coords.Add(tex2CoordMaterial3);

            var tex2CoordMaterial4 = new Printing3DTexture2CoordMaterial();

            tex2CoordMaterial4.U = 1.0;
            tex2CoordMaterial4.V = 0.0;
            tex2CoordGroup.Texture2Coords.Add(tex2CoordMaterial4);

            // add our Printing3DModelTexture to the Texture property of the group
            tex2CoordGroup.Texture = modelTexture;

            // add metadata about the texture so that u,v values can be used
            model.Metadata.Add("tex4", "/3D/Texture/msLogo.png");
            // add group to groups on the model's material
            model.Material.Texture2CoordGroups.Add(tex2CoordGroup);
            //</SnippetTexture2CoordMaterialGroup>


            //<SnippetComponents>
            // create new component
            Printing3DComponent component = new Printing3DComponent();

            // assign mesh to the component's mesh
            component.Mesh = mesh;

            // add component to the model's list of all used components
            // a model can have references to multiple components
            model.Components.Add(component);

            // create the transform matrix
            var componentWithMatrix = new Printing3DComponentWithMatrix();

            // assign component to this componentwithmatrix
            componentWithMatrix.Component = component;

            // create an identity matrix
            var identityMatrix = Matrix4x4.Identity;

            // use the identity matrix as the transform matrix (no transformation)
            componentWithMatrix.Matrix = identityMatrix;

            // add component to the build property.
            model.Build.Components.Add(componentWithMatrix);
            //</SnippetComponents>


            //<SnippetSavePackage>
            // save the model to the package:
            await localPackage.SaveModelToPackageAsync(model);

            // get the model stream
            var modelStream = localPackage.ModelPart;

            // fix any textures in the model file
            localPackage.ModelPart = await FixTextureContentType(modelStream);

            //</SnippetSavePackage>

            return(true);
        }
Example #4
0
        private static async Task <Printing3D3MFPackage> CreatePackageAsync()
        {
            var package = new Printing3D3MFPackage();

            var model = new Printing3DModel();

            model.Unit = Printing3DModelUnit.Millimeter;

            // Material indices start at 1. (0 is reserved.)

            #region Color materials
            // Create color materials.
            var colorMaterial1 = new Printing3DColorMaterial {
                Color = Color.FromArgb(255, 20, 20, 90)
            };
            var colorMaterial2 = new Printing3DColorMaterial {
                Color = Color.FromArgb(255, 250, 120, 45)
            };

            // Create a color group with id 1 and add the colors to it.
            var colorGroup = new Printing3DColorMaterialGroup(1);
            colorGroup.Colors.Add(colorMaterial1);
            colorGroup.Colors.Add(colorMaterial2);

            // add the color group to the model.
            model.Material.ColorGroups.Add(colorGroup);
            #endregion

            #region Base materials
            // Create base materials.
            var material1 = new Printing3DBaseMaterial {
                Name = Printing3DBaseMaterial.Pla, Color = colorMaterial1
            };
            var material2 = new Printing3DBaseMaterial {
                Name = Printing3DBaseMaterial.Abs, Color = colorMaterial2
            };

            // Create a new base material group with id 2 and add the base materials to it.
            var materialGroup = new Printing3DBaseMaterialGroup(2);
            materialGroup.Bases.Add(material1);
            materialGroup.Bases.Add(material2);

            // Add the material group to the base groups on the model.
            model.Material.BaseGroups.Add(materialGroup);

            #endregion

            #region Composite material groups
            // Create a composite material group with id 3.
            var compositeMaterialGroup = new Printing3DCompositeMaterialGroup(3);

            // Add it to the metadata.
            // The key is the string "composite" followed by the composite material group id.
            // The value specifies that the default base material group to use is id 2.
            model.Metadata.Add("composite3", "2");

            // The indices are relative to the material indices that will be set by SetMaterialIndicesAsync.
            compositeMaterialGroup.MaterialIndices.Add(0);
            compositeMaterialGroup.MaterialIndices.Add(1);

            // Create new composite materials.
            // The Values correspond to the materials added in the compositeMaterialGroup,
            // and they must sum to 1.0.

            // Composite material 1 consists of 20% material1 and 80% material2.
            var compositeMaterial1 = new Printing3DCompositeMaterial();
            compositeMaterial1.Values.Add(0.2);
            compositeMaterial1.Values.Add(0.8);

            // Composite material 2 consists of 50% material1 and 50% material2.
            var compositeMaterial2 = new Printing3DCompositeMaterial();
            compositeMaterial2.Values.Add(0.5);
            compositeMaterial2.Values.Add(0.5);

            // Composite material 3 consists of 80% material1 and 20% material2.
            var compositeMaterial3 = new Printing3DCompositeMaterial();
            compositeMaterial3.Values.Add(0.8);
            compositeMaterial3.Values.Add(0.2);

            // Composite material 4 consists of 40% material1 and 60% material2.
            var compositeMaterial4 = new Printing3DCompositeMaterial();
            compositeMaterial4.Values.Add(0.4);
            compositeMaterial4.Values.Add(0.6);

            // Add the composite materials to the compositeMaterialGroup.
            compositeMaterialGroup.Composites.Add(compositeMaterial1);
            compositeMaterialGroup.Composites.Add(compositeMaterial2);
            compositeMaterialGroup.Composites.Add(compositeMaterial3);
            compositeMaterialGroup.Composites.Add(compositeMaterial4);

            // Add the composite material group to the model.
            model.Material.CompositeGroups.Add(compositeMaterialGroup);
            #endregion

            #region Texture resource
            Printing3DTextureResource textureResource = new Printing3DTextureResource();

            // Set the texture path in the 3MF file.
            textureResource.Name = "/3D/Texture/msLogo.png";

            // Load the texture from our package.
            StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/msLogo.png"));

            textureResource.TextureData = await file.OpenReadAsync();

            package.Textures.Add(textureResource);
            #endregion

            #region 2D texture materials
            // Create a texture material group with id 4.
            var texture2CoordGroup = new Printing3DTexture2CoordMaterialGroup(4);

            // Add it to the metadata.
            // The key is the string "tex" followed by the texture material group id.
            // The value is the name of the texture resource (see textureResource.Name above).
            model.Metadata.Add("tex4", "/3D/Texture/msLogo.png");

            // Create texture materials and add them to the group.
            texture2CoordGroup.Texture2Coords.Add(new Printing3DTexture2CoordMaterial()
            {
                U = 0.0, V = 1.0
            });
            texture2CoordGroup.Texture2Coords.Add(new Printing3DTexture2CoordMaterial()
            {
                U = 1.0, V = 1.0
            });
            texture2CoordGroup.Texture2Coords.Add(new Printing3DTexture2CoordMaterial()
            {
                U = 0.0, V = 0.0
            });
            texture2CoordGroup.Texture2Coords.Add(new Printing3DTexture2CoordMaterial()
            {
                U = 1.0, V = 0.0
            });

            // Add the texture material group to the model.
            model.Material.Texture2CoordGroups.Add(texture2CoordGroup);
            #endregion

            #region Mesh
            var mesh = new Printing3DMesh();

            await SetVerticesAsync(mesh);
            await SetTriangleIndicesAsync(mesh);
            await SetMaterialIndicesAsync(mesh);

            // add the mesh to the model
            model.Meshes.Add(mesh);
            #endregion

            #region Adding a component to the build
            // create a component.
            Printing3DComponent component = new Printing3DComponent();

            // assign the mesh to the component's mesh.
            component.Mesh = mesh;

            // Add the component to the model. A model can have multiple components.
            model.Components.Add(component);

            // The world matrix for the component is the identity matrix.
            var componentWithMatrix = new Printing3DComponentWithMatrix()
            {
                Component = component, Matrix = Matrix4x4.Identity
            };

            // add the componentWithMatrix to the build.
            // The build defines what is to be printed from within a Printing3DModel.
            // If you leave a mesh out of the build, it will not be printed.
            model.Build.Components.Add(componentWithMatrix);
            #endregion

            // Save the completed model into a package.
            await package.SaveModelToPackageAsync(model);

            // fix any textures in the model file.
            await FixTextureContentTypeAsync(package);

            return(package);
        }
        private static async Task<Printing3D3MFPackage> CreatePackageAsync()
        {
            var package = new Printing3D3MFPackage();

            var model = new Printing3DModel();
            model.Unit = Printing3DModelUnit.Millimeter;

            // Material indices start at 1. (0 is reserved.)

            #region Color materials
            // Create color materials.
            var colorMaterial1 = new Printing3DColorMaterial { Color = Color.FromArgb(255, 20, 20, 90) };
            var colorMaterial2 = new Printing3DColorMaterial { Color = Color.FromArgb(255, 250, 120, 45) };

            // Create a color group with id 1 and add the colors to it.
            var colorGroup = new Printing3DColorMaterialGroup(1);
            colorGroup.Colors.Add(colorMaterial1);
            colorGroup.Colors.Add(colorMaterial2);

            // add the color group to the model.
            model.Material.ColorGroups.Add(colorGroup);
            #endregion

            #region Base materials
            // Create base materials.
            var material1 = new Printing3DBaseMaterial { Name = Printing3DBaseMaterial.Pla, Color = colorMaterial1 };
            var material2 = new Printing3DBaseMaterial { Name = Printing3DBaseMaterial.Abs, Color = colorMaterial2 };

            // Create a new base material group with id 2 and add the base materials to it.
            var materialGroup = new Printing3DBaseMaterialGroup(2);
            materialGroup.Bases.Add(material1);
            materialGroup.Bases.Add(material2);

            // Add the material group to the base groups on the model.
            model.Material.BaseGroups.Add(materialGroup);

            #endregion

            #region Composite material groups
            // Create a composite material group with id 3.
            var compositeMaterialGroup = new Printing3DCompositeMaterialGroup(3);

            // Add it to the metadata.
            // The key is the string "composite" followed by the composite material group id.
            // The value specifies that the default base material group to use is id 2.
            model.Metadata.Add("composite3", "2");

            // The indices are relative to the material indices that will be set by SetMaterialIndicesAsync.
            compositeMaterialGroup.MaterialIndices.Add(0);
            compositeMaterialGroup.MaterialIndices.Add(1);

            // Create new composite materials.
            // The Values correspond to the materials added in the compositeMaterialGroup,
            // and they must sum to 1.0.

            // Composite material 1 consists of 20% material1 and 80% material2.
            var compositeMaterial1 = new Printing3DCompositeMaterial();
            compositeMaterial1.Values.Add(0.2);
            compositeMaterial1.Values.Add(0.8);

            // Composite material 2 consists of 50% material1 and 50% material2.
            var compositeMaterial2 = new Printing3DCompositeMaterial();
            compositeMaterial2.Values.Add(0.5);
            compositeMaterial2.Values.Add(0.5);

            // Composite material 3 consists of 80% material1 and 20% material2.
            var compositeMaterial3 = new Printing3DCompositeMaterial();
            compositeMaterial3.Values.Add(0.8);
            compositeMaterial3.Values.Add(0.2);

            // Composite material 4 consists of 40% material1 and 60% material2.
            var compositeMaterial4 = new Printing3DCompositeMaterial();
            compositeMaterial4.Values.Add(0.4);
            compositeMaterial4.Values.Add(0.6);

            // Add the composite materials to the compositeMaterialGroup.
            compositeMaterialGroup.Composites.Add(compositeMaterial1);
            compositeMaterialGroup.Composites.Add(compositeMaterial2);
            compositeMaterialGroup.Composites.Add(compositeMaterial3);
            compositeMaterialGroup.Composites.Add(compositeMaterial4);

            // Add the composite material group to the model.
            model.Material.CompositeGroups.Add(compositeMaterialGroup);
            #endregion

            #region Texture resource
            Printing3DTextureResource textureResource = new Printing3DTextureResource();

            // Set the texture path in the 3MF file.
            textureResource.Name = "/3D/Texture/msLogo.png";

            // Load the texture from our package.
            StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/msLogo.png"));
            textureResource.TextureData = await file.OpenReadAsync();

            package.Textures.Add(textureResource);
            #endregion

            #region 2D texture materials
            // Create a texture material group with id 4.
            var texture2CoordGroup = new Printing3DTexture2CoordMaterialGroup(4);

            // Add it to the metadata.
            // The key is the string "tex" followed by the texture material group id.
            // The value is the name of the texture resource (see textureResource.Name above).
            model.Metadata.Add("tex4", "/3D/Texture/msLogo.png");

            // Create texture materials and add them to the group.
            texture2CoordGroup.Texture2Coords.Add(new Printing3DTexture2CoordMaterial() { U = 0.0, V = 1.0 });
            texture2CoordGroup.Texture2Coords.Add(new Printing3DTexture2CoordMaterial() { U = 1.0, V = 1.0 });
            texture2CoordGroup.Texture2Coords.Add(new Printing3DTexture2CoordMaterial() { U = 0.0, V = 0.0 });
            texture2CoordGroup.Texture2Coords.Add(new Printing3DTexture2CoordMaterial() { U = 1.0, V = 0.0 });

            // Add the texture material group to the model.
            model.Material.Texture2CoordGroups.Add(texture2CoordGroup);
            #endregion

            #region Mesh
            var mesh = new Printing3DMesh();

            await SetVerticesAsync(mesh);
            await SetTriangleIndicesAsync(mesh);
            await SetMaterialIndicesAsync(mesh);

            // add the mesh to the model
            model.Meshes.Add(mesh);
            #endregion

            #region Adding a component to the build
            // create a component.
            Printing3DComponent component = new Printing3DComponent();

            // assign the mesh to the component's mesh.
            component.Mesh = mesh;

            // Add the component to the model. A model can have multiple components.
            model.Components.Add(component);

            // The world matrix for the component is the identity matrix.
            var componentWithMatrix = new Printing3DComponentWithMatrix() { Component = component, Matrix = Matrix4x4.Identity };

            // add the componentWithMatrix to the build.
            // The build defines what is to be printed from within a Printing3DModel.
            // If you leave a mesh out of the build, it will not be printed.
            model.Build.Components.Add(componentWithMatrix);
            #endregion

            // Save the completed model into a package.
            await package.SaveModelToPackageAsync(model);

            // fix any textures in the model file.
            await FixTextureContentTypeAsync(package);

            return package;
        }