Example #1
0
		private AxisItem GetAxisItemFromPoint(AxisType axisType, Point point, string label)
		{
			if (point == null)
			{
				return null;
			}
			AxisItem item = new AxisItem();
			double markSize = 3;

			TextBlock tb = new TextBlock();
			Line ln = new Line();

			tb.Text = label;
			tb.TextAlignment = TextAlignment.Right;
			ln.Stroke = new SolidColorBrush(Colors.Black);
			switch (axisType)
			{
				case AxisType.X:
					Canvas.SetBottom(tb, 0);
					Canvas.SetLeft(tb, point.X);

					ln.Y1 = point.Y;
					ln.Y2 = point.Y - markSize;
					ln.X1 = point.X;
					ln.X2 = ln.X1;
					break;
				case AxisType.Y:
					throw new NotImplementedException();
				default:
					break;
			}

			item = new AxisItem
			{
				Label = tb,
				Mark = ln
			};

			return item;
		}
Example #2
0
		private void ResultCanvasPainter(CalculateMethod method)
		{
			resultCanvas.Children.Clear();
			Brush fillBrush = (Brush)FindResource("ResultLineGradientBlue");
			double height = resultCanvas.ActualHeight;
			double width = resultCanvas.ActualWidth;
			double dotDiameter = width * 0.05;
			if (dotDiameter > 20) dotDiameter = 20;
			double axisGap = 18;
			int power = 0;

			Polyline yLine = new Polyline();
			yLine.Stroke = fillBrush;
			List<Ellipse> dots = new List<Ellipse>();
			List<AxisItem> xAxisItems = new List<AxisItem>();
			List<AxisItem> yAxisItems = new List<AxisItem>();

			Polyline xAxis = new Polyline();
			Polyline yAxis = new Polyline();
			xAxis.Points.Add(new Point(0, height - axisGap));
			xAxis.Points.Add(new Point(width, height - axisGap));
			xAxis.Stroke = new SolidColorBrush(Colors.Black);
			yAxis.Points.Add(new Point(axisGap, 0));
			yAxis.Points.Add(new Point(axisGap, height));
			yAxis.Stroke = new SolidColorBrush(Colors.Black);

			TextBlock yHeader = new TextBlock();
			TextBlock xAxisHeader = new TextBlock();
			xAxisHeader.FontSize = 12;
			TextBlock yAxisHeader = new TextBlock();
			yAxisHeader.FontSize = 12;
			
			Canvas.SetLeft(yHeader, width * 0.382);
			Canvas.SetLeft(yLine, axisGap);
			Canvas.SetBottom(xAxisHeader, axisGap + 3);
			Canvas.SetRight(xAxisHeader, 0);
			Canvas.SetTop(yAxisHeader, -axisGap);
			switch (method)
			{
				case CalculateMethod.Rayleigh:
					if (Impeller.InnerImpeller.Y.Count <= 0) return;
					yLine.Points = GetPointsFromY(Impeller.InnerImpeller, height - axisGap, width - axisGap);
					xAxisItems = GetAxisItemsFromDoubleList(Impeller.Sections.Select(sec => sec.Position).ToList(), AxisType.X, new Point(axisGap, height - axisGap), width - axisGap, showMin:false);
					yAxisItems = GetAxisItemsFromDoubleList(Impeller.InnerImpeller.Y, AxisType.Y, new Point(axisGap, height - axisGap), height - axisGap, showMax:false);
					yHeader.Text = "振型曲线";
					xAxisHeader.Text = "Position(m)";
					yAxisHeader.Text = "Y(m)";
					break;
				case CalculateMethod.Iteration:
					if (Impeller.InnerImpeller.Y.Count <= 0) return;
					yLine.Points = GetPointsFromY(Impeller.InnerImpeller, height - axisGap, width - axisGap);
					xAxisItems = GetAxisItemsFromDoubleList(Impeller.Sections.Select(sec => sec.Position).ToList(), AxisType.X, new Point(axisGap, height - axisGap), width - axisGap, showMin: false);
					yAxisItems = GetAxisItemsFromDoubleList(Impeller.InnerImpeller.Y, AxisType.Y, new Point(axisGap, height - axisGap), height - axisGap);
					yHeader.Text = "振型曲线";
					xAxisHeader.Text = "Position(m)";
					yAxisHeader.Text = "Y(1)";
					break;
				case CalculateMethod.Prohl:
					if (Impeller.InnerImpeller.VibrationFrequency.Count <= 0) return;
					double heightScale = (height - axisGap - dotDiameter) / (Impeller.State.CheckToOmega / (2 * Math.PI));
					List<double> freqRange = new List<double>(100);
					for (int i = 0; i <= 100; i++)
					{
						freqRange.Add(Impeller.State.CheckFromOmega / (2 * Math.PI) 
							+ i * (Impeller.State.CheckToOmega - Impeller.State.CheckFromOmega) / (2 * Math.PI * 100));
					}
					yAxisItems = GetAxisItemsFromDoubleList(freqRange, AxisType.Y, new Point(axisGap, height - axisGap), height - axisGap);
					yHeader.Text = "各阶固有频率分布";
					xAxisHeader.Text = "阶数";
					yAxisHeader.Text = "频率(Hz)";

					foreach (var freq in Impeller.InnerImpeller.VibrationFrequency)
					{
						var freqDot = new Ellipse();
						var axisItem = new AxisItem();
						double xPosition = 0;
						freqDot.Height = dotDiameter;
						freqDot.Width = dotDiameter;
						freqDot.Fill = fillBrush;
						freqDot.ToolTip = "第" + (++power) + "阶\n" + freq + " Hz";
						freqDot.MouseEnter += new MouseEventHandler(freqDot_MouseEnter);
						freqDot.MouseLeave += new MouseEventHandler(freqDot_MouseLeave);

						xPosition = axisGap + (width - axisGap - dotDiameter) * power / (Impeller.InnerImpeller.VibrationFrequency.Count + 1);
						Canvas.SetLeft(freqDot, xPosition);
						Canvas.SetBottom(freqDot, freq * heightScale + axisGap);
						xAxisItems.Add(GetAxisItemFromPoint(AxisType.X, new Point(xPosition + dotDiameter / 2, height - axisGap), power.ToString()));
						dots.Add(freqDot);
					}
					break;
				default:
					break;
			}
			resultCanvas.Children.Add(xAxis);
			resultCanvas.Children.Add(yAxis);
			resultCanvas.Children.Add(xAxisHeader);
			resultCanvas.Children.Add(yAxisHeader);
			resultCanvas.Children.Add(yHeader);
			resultCanvas.Children.Add(yLine);
			foreach (var item in xAxisItems)
			{
				resultCanvas.Children.Add(item.Label);
				resultCanvas.Children.Add(item.Mark);
			}
			foreach (var item in yAxisItems)
			{
				resultCanvas.Children.Add(item.Label);
				resultCanvas.Children.Add(item.Mark);
			}
			foreach (var dot in dots)
			{
				resultCanvas.Children.Add(dot);
			}
		}