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; }