private Model3D CreateModel()
        {
            bool isCylindarMode = CylindarMode && ExpendedBrush != null && (SlideDirection == CooridinateDirection.ZN || SlideDirection == CooridinateDirection.ZP);
            bool isIntersectionmode = IntersectionMode && SectionBrush != null;
            bool isIntersectedCylindarMode = isCylindarMode && isIntersectionmode;

            var plotModel = new Model3DGroup();

            var axesMeshBuilder = new MeshBuilder();

            _realRect3D = GetSampleImageBox();
            axesMeshBuilder.AddBoundingBox(_realRect3D, 0.01);

            plotModel.Children.Add(new GeometryModel3D(axesMeshBuilder.ToMesh(), Materials.Yellow));

            var flipTransform = new ScaleTransform(1, -1, 0.5, 0.5);
            var znBrush = ZNBrush?.Clone();
            var zpBrush = ZPBrush?.Clone();
            if (zpBrush != null)
            {
                zpBrush.Transform = flipTransform;
            }
            var ynBrush = YNBrush?.Clone();
            var ypBrush = YPBrush?.Clone();

            if (ypBrush != null)
            {
                ypBrush.Transform = flipTransform;
            }
            var xnBrush = XNBrush?.Clone();
            var xpBrush = XPBrush?.Clone();
            if (xpBrush != null)
            {
                xpBrush.Transform = flipTransform;
            }
            var expBrush = ExpendedBrush?.Clone();

            Rect3D rectDraw = _realRect3D;

            if (isIntersectionmode)
            {
                switch (SlideDirection)
                {
                    case CooridinateDirection.XP:
                        {
                            rectDraw.SizeX = SectionPosition;
                            xpBrush = SectionBrush.Clone();
                            xpBrush.Transform = flipTransform;
                            double c = SectionPosition / _realRect3D.SizeX;
                            ynBrush.Viewbox = new Rect(0, 0, 1, c);
                            ypBrush.Viewbox = new Rect(0, 0, 1, c);
                            znBrush.Viewbox = new Rect(0, 0, c, 1);
                            zpBrush.Viewbox = new Rect(0, 0, c, 1);
                        }
                        break;

                    case CooridinateDirection.XN:
                        {
                            rectDraw.X = SectionPosition;
                            rectDraw.SizeX -= rectDraw.X;
                            xnBrush = SectionBrush.Clone();
                            double c = SectionPosition / _realRect3D.SizeX;
                            ynBrush.Viewbox = new Rect(0, c, 1, 1 - c);
                            ypBrush.Viewbox = new Rect(0, c, 1, 1 - c);
                            znBrush.Viewbox = new Rect(c, 0, 1 - c, 1);
                            zpBrush.Viewbox = new Rect(c, 0, 1 - c, 1);
                        }
                        break;

                    case CooridinateDirection.YP:
                        {
                            rectDraw.SizeY = SectionPosition;
                            ypBrush = SectionBrush.Clone();
                            ypBrush.Transform = flipTransform;
                            double c = SectionPosition / _realRect3D.SizeY;
                            xnBrush.Viewbox = new Rect(0, 0, c, 1);
                            xpBrush.Viewbox = new Rect(0, 0, c, 1);
                            znBrush.Viewbox = new Rect(0, 0, 1, c);
                            zpBrush.Viewbox = new Rect(0, 0, 1, c);
                        }
                        break;

                    case CooridinateDirection.YN:
                        {
                            rectDraw.Y = SectionPosition;
                            rectDraw.SizeY -= rectDraw.Y;
                            ynBrush = SectionBrush.Clone();
                            double c = SectionPosition / _realRect3D.SizeY;
                            xnBrush.Viewbox = new Rect(c, 0, 1 - c, 1);
                            xpBrush.Viewbox = new Rect(c, 0, 1 - c, 1);
                            znBrush.Viewbox = new Rect(0, c, 1, 1 - c);
                            zpBrush.Viewbox = new Rect(0, c, 1, 1 - c);
                        }
                        break;

                    case CooridinateDirection.ZP:
                        {
                            rectDraw.SizeZ = SectionPosition;
                            zpBrush = SectionBrush.Clone();
                            zpBrush.Transform = flipTransform;
                            double c = SectionPosition / _realRect3D.SizeZ;
                            ynBrush.Viewbox = new Rect(0, 0, c, 1);
                            ypBrush.Viewbox = new Rect(0, 0, c, 1);
                            xnBrush.Viewbox = new Rect(0, 0, 1, c);
                            xpBrush.Viewbox = new Rect(0, 0, 1, c);
                            expBrush.Viewbox = new Rect(0, 0, 1, c);
                        }
                        break;

                    case CooridinateDirection.ZN:
                        {
                            rectDraw.Z = SectionPosition;
                            rectDraw.SizeZ -= rectDraw.Z;
                            znBrush = SectionBrush.Clone();
                            double c = SectionPosition / _realRect3D.SizeZ;
                            ynBrush.Viewbox = new Rect(c, 0, 1 - c, 1);
                            ypBrush.Viewbox = new Rect(c, 0, 1 - c, 1);
                            xnBrush.Viewbox = new Rect(0, c, 1, 1 - c);
                            xpBrush.Viewbox = new Rect(0, c, 1, 1 - c);
                            expBrush.Viewbox = new Rect(0, c, 1, 1 - c);
                        }
                        break;

                    default:
                        break;
                }
            }

            MeshBuilder mb = null;

            if (!isCylindarMode)
            {
                // draw faces in z directions
                mb = new MeshBuilder();
                mb.AddRectangularMesh(
                    new[] {
                        new Point3D(rectDraw.X,rectDraw.Y,rectDraw.Z),                          //0,0,0
                        new Point3D(rectDraw.X+rectDraw.SizeX,rectDraw.Y,rectDraw.Z),                      //1,0,0
                        new Point3D(rectDraw.X,rectDraw.Y+rectDraw.SizeY,rectDraw.Z),                      //0,1,0
                        new Point3D(rectDraw.X+rectDraw.SizeX,rectDraw.Y+rectDraw.SizeY,rectDraw.Z)                   //1,1,0
                    }, 2);

                plotModel.Children.Add(new GeometryModel3D(mb.ToMesh(), MaterialHelper.CreateMaterial(znBrush)));

                mb = new MeshBuilder(); mb.AddRectangularMesh(
                    new[] {
                        new Point3D(rectDraw.X,rectDraw.Y+rectDraw.SizeY,rectDraw.Z+rectDraw.SizeZ),                  // 0,1,1
                        new Point3D(rectDraw.X+rectDraw.SizeX,rectDraw.Y+rectDraw.SizeY,rectDraw.Z+rectDraw.SizeZ),              // 1,1,1
                        new Point3D(rectDraw.X,rectDraw.Y,rectDraw.Z+rectDraw.SizeZ),                      // 0,0,1
                        new Point3D(rectDraw.X+rectDraw.SizeX,rectDraw.Y,rectDraw.Z+rectDraw.SizeZ)                   // 1,0,1
                    }
                    , 2);

                plotModel.Children.Add(new GeometryModel3D(mb.ToMesh(), MaterialHelper.CreateMaterial(zpBrush)));

                // draw faces in y directions
                mb = new MeshBuilder();
                mb.AddRectangularMesh(
                    new[] {
                        new Point3D(rectDraw.X,rectDraw.Y,rectDraw.Z),
                        new Point3D(rectDraw.X,rectDraw.Y,rectDraw.Z+rectDraw.SizeZ),
                        new Point3D(rectDraw.X+rectDraw.SizeX,rectDraw.Y,rectDraw.Z),
                        new Point3D(rectDraw.X+rectDraw.SizeX,rectDraw.Y,rectDraw.Z+rectDraw.SizeZ)
                    }, 2);

                plotModel.Children.Add(new GeometryModel3D(mb.ToMesh(), MaterialHelper.CreateMaterial(ynBrush)));

                mb = new MeshBuilder(); mb.AddRectangularMesh(
                    new[] {
                        new Point3D(rectDraw.X+rectDraw.SizeX,rectDraw.Y+rectDraw.SizeY,rectDraw.Z),
                        new Point3D(rectDraw.X+rectDraw.SizeX,rectDraw.Y+rectDraw.SizeY,rectDraw.Z+rectDraw.SizeZ),
                        new Point3D(rectDraw.X,rectDraw.Y+rectDraw.SizeY,rectDraw.Z),
                        new Point3D(rectDraw.X,rectDraw.Y+rectDraw.SizeY,rectDraw.Z+rectDraw.SizeZ)
                    }, 2);

                plotModel.Children.Add(new GeometryModel3D(mb.ToMesh(), MaterialHelper.CreateMaterial(ypBrush)));

                // draw faces in x directions
                mb = new MeshBuilder();
                mb.AddRectangularMesh(
                    new[] {
                        new Point3D(rectDraw.X,rectDraw.Y,rectDraw.Z),
                        new Point3D(rectDraw.X,rectDraw.Y+rectDraw.SizeY,rectDraw.Z),
                        new Point3D(rectDraw.X,rectDraw.Y,rectDraw.Z+rectDraw.SizeZ),
                        new Point3D(rectDraw.X,rectDraw.Y+rectDraw.SizeY,rectDraw.Z+rectDraw.SizeZ)
                    }, 2);

                plotModel.Children.Add(new GeometryModel3D(mb.ToMesh(), MaterialHelper.CreateMaterial(xnBrush)));

                mb = new MeshBuilder(); mb.AddRectangularMesh(
                    new[] {
                        new Point3D(rectDraw.X+rectDraw.SizeX,rectDraw.Y,rectDraw.Z+rectDraw.SizeZ),
                        new Point3D(rectDraw.X+rectDraw.SizeX,rectDraw.Y+rectDraw.SizeY,rectDraw.Z+rectDraw.SizeZ),
                        new Point3D(rectDraw.X+rectDraw.SizeX,rectDraw.Y,rectDraw.Z),
                        new Point3D(rectDraw.X+rectDraw.SizeX,rectDraw.Y+rectDraw.SizeY,rectDraw.Z)
                    }, 2);

                plotModel.Children.Add(new GeometryModel3D(mb.ToMesh(), MaterialHelper.CreateMaterial(xpBrush)));
            }

            if (isCylindarMode)
            {
                int div = 121;
                mb = new MeshBuilder();
                double s = Math.Min(_realRect3D.SizeX, _realRect3D.SizeY);
                double shiftx = (_realRect3D.SizeX - s) / 2;
                double shifty = (_realRect3D.SizeY - s) / 2;
                var startCentre = new Point3D(Centre.X * s + shiftx, Centre.Y * s + shifty, rectDraw.Z);
                var endCentre = new Point3D(Centre.X * s + shiftx, Centre.Y * s + shifty, rectDraw.Z + rectDraw.SizeZ);
                double r = Radius * s;
                mb.AddCylindarZ(startCentre, r, rectDraw.SizeZ, div);
                plotModel.Children.Add(new GeometryModel3D(mb.ToMesh(), MaterialHelper.CreateMaterial(expBrush)));

                mb = new MeshBuilder();

                mb.AddCircleInZCross(startCentre, r, div, false);

                znBrush.Viewbox = new Rect((startCentre.X - r) / _realRect3D.SizeX, (startCentre.Y - r) / _realRect3D.SizeY, (2 * r) / _realRect3D.SizeX, (2 * r) / _realRect3D.SizeY);
                plotModel.Children.Add(new GeometryModel3D(mb.ToMesh(), MaterialHelper.CreateMaterial(znBrush)));

                mb = new MeshBuilder();

                mb.AddCircleInZCross(endCentre, r, div, true);

                zpBrush.Viewbox = new Rect((startCentre.X - r) / _realRect3D.SizeX, (startCentre.Y - r) / _realRect3D.SizeY, (2 * r) / _realRect3D.SizeX, (2 * r) / _realRect3D.SizeY);
                zpBrush.Transform = null;
                plotModel.Children.Add(new GeometryModel3D(mb.ToMesh(), MaterialHelper.CreateMaterial(zpBrush)));
            }

            return plotModel;
        }