public void CreatePrintBed(Vector3 displayVolume, Vector2 bedCenter, BedShape bedShape)
        {
            if (MeshViewerWidget.BedCenter == bedCenter &&
                MeshViewerWidget.bedShape == bedShape &&
                MeshViewerWidget.displayVolume == displayVolume)
            {
                return;
            }

            MeshViewerWidget.BedCenter     = bedCenter;
            MeshViewerWidget.bedShape      = bedShape;
            MeshViewerWidget.displayVolume = displayVolume;
            Vector3 displayVolumeToBuild = Vector3.ComponentMax(displayVolume, new Vector3(1, 1, 1));

            double sizeForMarking = Math.Max(displayVolumeToBuild.x, displayVolumeToBuild.y);
            double divisor        = 10;
            int    skip           = 1;

            if (sizeForMarking > 1000)
            {
                divisor = 100;
                skip    = 10;
            }
            else if (sizeForMarking > 300)
            {
                divisor = 50;
                skip    = 5;
            }

            switch (bedShape)
            {
            case BedShape.Rectangular:
                if (displayVolumeToBuild.z > 0)
                {
                    buildVolume = PlatonicSolids.CreateCube(displayVolumeToBuild);
                    foreach (Vertex vertex in buildVolume.Vertices)
                    {
                        vertex.Position = vertex.Position + new Vector3(0, 0, displayVolumeToBuild.z / 2);
                    }
                }
                CreateRectangularBedGridImage(displayVolumeToBuild, bedCenter, divisor, skip);
                printerBed = PlatonicSolids.CreateCube(displayVolumeToBuild.x, displayVolumeToBuild.y, 4);
                {
                    Face face = printerBed.Faces[0];
                    CommonShapes.PlaceTextureOnFace(face, BedImage);
                }
                break;

            case BedShape.Circular:
            {
                if (displayVolumeToBuild.z > 0)
                {
                    buildVolume = VertexSourceToMesh.Extrude(new Ellipse(new Vector2(), displayVolumeToBuild.x / 2, displayVolumeToBuild.y / 2), displayVolumeToBuild.z);
                    foreach (Vertex vertex in buildVolume.Vertices)
                    {
                        vertex.Position = vertex.Position + new Vector3(0, 0, .2);
                    }
                }
                CreateCircularBedGridImage((int)(displayVolumeToBuild.x / divisor), (int)(displayVolumeToBuild.y / divisor), skip);
                printerBed = VertexSourceToMesh.Extrude(new Ellipse(new Vector2(), displayVolumeToBuild.x / 2, displayVolumeToBuild.y / 2), 2);
                {
                    foreach (Face face in printerBed.Faces)
                    {
                        if (face.normal.z > 0)
                        {
                            FaceTextureData faceData = FaceTextureData.Get(face);
                            faceData.Textures.Add(BedImage);
                            foreach (FaceEdge faceEdge in face.FaceEdges())
                            {
                                FaceEdgeTextureUvData edgeUV = FaceEdgeTextureUvData.Get(faceEdge);
                                edgeUV.TextureUV.Add(new Vector2((displayVolumeToBuild.x / 2 + faceEdge.firstVertex.Position.x) / displayVolumeToBuild.x,
                                                                 (displayVolumeToBuild.y / 2 + faceEdge.firstVertex.Position.y) / displayVolumeToBuild.y));
                            }
                        }
                    }
                }
            }
            break;

            default:
                throw new NotImplementedException();
            }

            foreach (Vertex vertex in printerBed.Vertices)
            {
                vertex.Position = vertex.Position - new Vector3(-bedCenter, 2.2);
            }

            if (buildVolume != null)
            {
                foreach (Vertex vertex in buildVolume.Vertices)
                {
                    vertex.Position = vertex.Position - new Vector3(-bedCenter, 2.2);
                }
            }

            Invalidate();
        }
        public void CreatePrintBed(Vector3 displayVolume, Vector2 bedCenter, BedShape bedShape)
        {
            if (this.bedCenter == bedCenter &&
                this.bedShape == bedShape &&
                this.displayVolume == displayVolume)
            {
                return;
            }

            this.bedCenter     = bedCenter;
            this.bedShape      = bedShape;
            displayVolume      = Vector3.ComponentMax(displayVolume, new Vector3(1, 1, 1));
            this.displayVolume = displayVolume;

            switch (bedShape)
            {
            case BedShape.Rectangular:
                if (displayVolume.z > 0)
                {
                    buildVolume = PlatonicSolids.CreateCube(displayVolume);
                    foreach (Vertex vertex in buildVolume.Vertices)
                    {
                        vertex.Position = vertex.Position + new Vector3(0, 0, displayVolume.z / 2);
                    }
                }
                CreateRectangularBedGridImage((int)(displayVolume.x / 10), (int)(displayVolume.y / 10));
                printerBed = PlatonicSolids.CreateCube(displayVolume.x, displayVolume.y, 4);
                {
                    Face face = printerBed.Faces[0];
                    {
                        FaceTextureData faceData = FaceTextureData.Get(face);
                        faceData.Textures.Add(BedImage);
                        foreach (FaceEdge faceEdge in face.FaceEdges())
                        {
                            FaceEdgeTextureUvData edgeUV = FaceEdgeTextureUvData.Get(faceEdge);
                            edgeUV.TextureUV.Add(new Vector2((displayVolume.x / 2 + faceEdge.firstVertex.Position.x) / displayVolume.x,
                                                             (displayVolume.y / 2 + faceEdge.firstVertex.Position.y) / displayVolume.y));
                        }
                    }
                }
                foreach (Vertex vertex in printerBed.Vertices)
                {
                    vertex.Position = vertex.Position - new Vector3(0, 0, 2.2);
                }
                break;

            case BedShape.Circular:
            {
                if (displayVolume.z > 0)
                {
                    buildVolume = VertexSourceToMesh.Extrude(new Ellipse(new Vector2(), displayVolume.x / 2, displayVolume.y / 2), displayVolume.z);
                    foreach (Vertex vertex in buildVolume.Vertices)
                    {
                        vertex.Position = vertex.Position + new Vector3(0, 0, .2);
                    }
                }
                CreateCircularBedGridImage((int)(displayVolume.x / 10), (int)(displayVolume.y / 10));
                printerBed = VertexSourceToMesh.Extrude(new Ellipse(new Vector2(), displayVolume.x / 2, displayVolume.y / 2), 2);
                {
                    foreach (Face face in printerBed.Faces)
                    {
                        if (face.normal.z > 0)
                        {
                            FaceTextureData faceData = FaceTextureData.Get(face);
                            faceData.Textures.Add(BedImage);
                            foreach (FaceEdge faceEdge in face.FaceEdges())
                            {
                                FaceEdgeTextureUvData edgeUV = FaceEdgeTextureUvData.Get(faceEdge);
                                edgeUV.TextureUV.Add(new Vector2((displayVolume.x / 2 + faceEdge.firstVertex.Position.x) / displayVolume.x,
                                                                 (displayVolume.y / 2 + faceEdge.firstVertex.Position.y) / displayVolume.y));
                            }
                        }
                    }
                }

                foreach (Vertex vertex in printerBed.Vertices)
                {
                    vertex.Position = vertex.Position - new Vector3(0, 0, 2.2);
                }
            }
            break;

            default:
                throw new NotImplementedException();
            }

            Invalidate();
        }