예제 #1
0
 protected override IEnumerable <Main.DocumentNodeAndName> GetDocumentNodeChildrenWithName()
 {
     if (null != _dataBounds)
     {
         yield return(new Main.DocumentNodeAndName(_dataBounds, () => _dataBounds = null, "DataBounds"));
     }
     if (null != _rescaling)
     {
         yield return(new Main.DocumentNodeAndName(_rescaling, () => _rescaling = null, "Rescaling"));
     }
     if (null != _tickSpacing)
     {
         yield return(new Main.DocumentNodeAndName(_tickSpacing, () => _tickSpacing = null, "TickSpacing"));
     }
 }
예제 #2
0
 /// <summary>
 /// Creates a default linear axis with org=0 and end=1.
 /// </summary>
 public LinearScale()
 {
     _dataBounds = new FiniteNumericalBoundaries()
     {
         ParentObject = this
     };
     _rescaling = new LinearScaleRescaleConditions()
     {
         ParentObject = this
     };
     _tickSpacing = new Ticks.LinearTickSpacing()
     {
         ParentObject = this
     };
     UpdateTicksAndOrgEndUsingRescalingObject();
 }
예제 #3
0
 /// <summary>
 /// Creates a default cumulative probability scale.
 /// </summary>
 public CumulativeProbabilityScale()
 {
     _dataBounds = new CumulativeProbabilityBoundaries()
     {
         ParentObject = this
     };
     _rescaling = new CumulativeProbabilityScaleRescaleConditions()
     {
         ParentObject = this
     };
     _tickSpacing = new Ticks.CumulativeProbabilityTickSpacing()
     {
         ParentObject = this
     };
     UpdateTicksAndOrgEndUsingRescalingObject();
 }
예제 #4
0
파일: Log10Scale.cs 프로젝트: olesar/Altaxo
 /// <summary>
 /// Creates a default logarithmic axis with org=1 and end=10.
 /// </summary>
 public Log10Scale()
 {
     _dataBounds = new PositiveFiniteNumericalBoundaries()
     {
         ParentObject = this
     };
     _rescaling = new LogarithmicScaleRescaleConditions()
     {
         ParentObject = this
     };
     _tickSpacing = new Ticks.Log10TickSpacing()
     {
         ParentObject = this
     };
     UpdateTicksAndOrgEndUsingRescalingObject();
 }
예제 #5
0
 /// <summary>
 /// Creates a default linear axis with org=0 and end=1.
 /// </summary>
 public InverseScale()
 {
     _dataBounds = new InverseNumericalBoundaries()
     {
         ParentObject = this
     };
     _rescaling = new InverseScaleRescaleConditions()
     {
         ParentObject = this
     };
     _tickSpacing = new Ticks.InverseTickSpacing()
     {
         ParentObject = this
     };
     UpdateTicksAndOrgEndUsingRescalingObject();
 }
예제 #6
0
		protected override System.Collections.Generic.IEnumerable<Main.DocumentNodeAndName> GetDocumentNodeChildrenWithName()
		{
			if (null != _dataBounds)
				yield return new Main.DocumentNodeAndName(_dataBounds, () => _dataBounds = null, "DataBounds");

			if (null != _rescaling)
				yield return new Main.DocumentNodeAndName(_rescaling, () => _rescaling = null, "Rescaling");

			if (null != _tickSpacing)
				yield return new Main.DocumentNodeAndName(_tickSpacing, () => _tickSpacing = null, "TickSpacing");
		}
예제 #7
0
		/// <summary>
		/// Creates a default linear axis with org=0 and end=1.
		/// </summary>
		public LinearScale()
		{
			_dataBounds = new FiniteNumericalBoundaries() { ParentObject = this };
			_rescaling = new LinearScaleRescaleConditions() { ParentObject = this };
			_tickSpacing = new Ticks.LinearTickSpacing() { ParentObject = this };
			UpdateTicksAndOrgEndUsingRescalingObject();
		}
예제 #8
0
		public TickSpacing(TickSpacing from)
		{
			CopyFrom(from);
		}
예제 #9
0
파일: TextScale.cs 프로젝트: Altaxo/Altaxo
		public TextScale()
		{
			_dataBounds = new TextBoundaries() { ParentObject = this };
			_rescaling = new LinearScaleRescaleConditions() { ParentObject = this };
			_tickSpacing = new Ticks.TextTickSpacing() { ParentObject = this };
			UpdateTicksAndOrgEndUsingRescalingObject();
		}
예제 #10
0
파일: Log10Scale.cs 프로젝트: Altaxo/Altaxo
		/// <summary>
		/// Creates a default logarithmic axis with org=1 and end=10.
		/// </summary>
		public Log10Scale()
		{
			_dataBounds = new PositiveFiniteNumericalBoundaries() { ParentObject = this };
			_rescaling = new LogarithmicScaleRescaleConditions() { ParentObject = this };
			_tickSpacing = new Ticks.Log10TickSpacing() { ParentObject = this };
			UpdateTicksAndOrgEndUsingRescalingObject();
		}
예제 #11
0
			public DensityLegendArea(PointD2D size, bool isXYInterchanged, bool isXReversed, Scale scale, TickSpacing tickSpacing)
			{
				_size = size;
				_scales = new ScaleCollection() { ParentObject = this };
				_scales[0] = scale; scale.TickSpacing = tickSpacing;
				_scales[1] = new LinearScale() { TickSpacing = new NoTickSpacing() };
				_coordinateSystem = new Altaxo.Graph.Gdi.CS.G2DCartesicCoordinateSystem() { ParentObject = this };
				_coordinateSystem.IsXYInterchanged = isXYInterchanged;
				_coordinateSystem.IsXReverse = isXReversed;
				_coordinateSystem.UpdateAreaSize(_size);
			}
예제 #12
0
		/// <summary>
		/// Paint the axis in the Graphics context.
		/// </summary>
		/// <param name="g">The graphics context painting to.</param>
		/// <param name="layer">The layer the axis belongs to.</param>
		/// <param name="styleInfo">The axis information of the axis to paint.</param>
		/// <param name="customTickSpacing">If not <c>null</c>, this parameter provides a custom tick spacing that is used instead of the default tick spacing of the scale.</param>
		public void Paint(Graphics g, IPlotArea layer, CSAxisInformation styleInfo, TickSpacing customTickSpacing)
		{
			CSLineID styleID = styleInfo.Identifier;
			_cachedAxisStyleInfo = styleInfo;
			Scale axis = layer.Scales[styleID.ParallelAxisNumber];

			TickSpacing ticking = null != customTickSpacing ? customTickSpacing : layer.Scales[styleID.ParallelAxisNumber].TickSpacing;

			Logical3D r0 = styleID.GetLogicalPoint(styleInfo.LogicalValueAxisOrg);
			Logical3D r1 = styleID.GetLogicalPoint(styleInfo.LogicalValueAxisEnd);

			layer.CoordinateSystem.DrawIsoline(g, _axisPen, r0, r1);

			Logical3D outer;

			// now the major ticks
			PointD2D outVector;
			double[] majorticks = ticking.GetMajorTicksNormal(axis);
			for (int i = 0; i < majorticks.Length; i++)
			{
				double r = majorticks[i];

				if (_showFirstUpMajorTicks)
				{
					outer = layer.CoordinateSystem.GetLogicalDirection(styleID.ParallelAxisNumber, CSAxisSide.FirstUp);
					var tickorg = layer.CoordinateSystem.GetNormalizedDirection(r0, r1, r, outer, out outVector);
					var tickend = tickorg + outVector * _majorTickLength;
					g.DrawLine(_majorTickPen, (PointF)tickorg, (PointF)tickend);
				}
				if (_showFirstDownMajorTicks)
				{
					outer = layer.CoordinateSystem.GetLogicalDirection(styleID.ParallelAxisNumber, CSAxisSide.FirstDown);
					var tickorg = layer.CoordinateSystem.GetNormalizedDirection(r0, r1, r, outer, out outVector);
					var tickend = tickorg + outVector * _majorTickLength;
					g.DrawLine(_majorTickPen, (PointF)tickorg, (PointF)tickend);
				}
			}
			// now the major ticks
			double[] minorticks = ticking.GetMinorTicksNormal(axis);
			for (int i = 0; i < minorticks.Length; i++)
			{
				double r = minorticks[i];

				if (_showFirstUpMinorTicks)
				{
					outer = layer.CoordinateSystem.GetLogicalDirection(styleID.ParallelAxisNumber, CSAxisSide.FirstUp);
					var tickorg = layer.CoordinateSystem.GetNormalizedDirection(r0, r1, r, outer, out outVector);
					var tickend = tickorg + outVector * _minorTickLength;
					g.DrawLine(_minorTickPen, (PointF)tickorg, (PointF)tickend);
				}
				if (_showFirstDownMinorTicks)
				{
					outer = layer.CoordinateSystem.GetLogicalDirection(styleID.ParallelAxisNumber, CSAxisSide.FirstDown);
					var tickorg = layer.CoordinateSystem.GetNormalizedDirection(r0, r1, r, outer, out outVector);
					var tickend = tickorg + outVector * _minorTickLength;
					g.DrawLine(_minorTickPen, (PointF)tickorg, (PointF)tickend);
				}
			}
		}
예제 #13
0
 public TickSpacing(TickSpacing from)
 {
     CopyFrom(from);
 }
예제 #14
0
		/// <summary>
		/// Creates a default linear axis with org=0 and end=1.
		/// </summary>
		public InverseScale()
		{
			_dataBounds = new InverseNumericalBoundaries() { ParentObject = this };
			_rescaling = new InverseScaleRescaleConditions() { ParentObject = this };
			_tickSpacing = new Ticks.InverseTickSpacing() { ParentObject = this };
			UpdateTicksAndOrgEndUsingRescalingObject();
		}
예제 #15
0
		/// <summary>
		/// Paint the axis in the Graphics context.
		/// </summary>
		/// <param name="g">The graphics context painting to.</param>
		/// <param name="layer">The layer the axis belongs to.</param>
		/// <param name="styleInfo">The axis information of the axis to paint.</param>
		/// <param name="customTickSpacing">If not <c>null</c>, this parameter provides a custom tick spacing that is used instead of the default tick spacing of the scale.</param>
		public void Paint(IGraphicsContext3D g, IPlotArea layer, CSAxisInformation styleInfo, TickSpacing customTickSpacing)
		{
			CSLineID styleID = styleInfo.Identifier;
			_cachedAxisStyleInfo = styleInfo;
			Scale axis = layer.Scales[styleID.ParallelAxisNumber];

			TickSpacing ticking = null != customTickSpacing ? customTickSpacing : layer.Scales[styleID.ParallelAxisNumber].TickSpacing;

			Logical3D r0 = styleID.GetLogicalPoint(styleInfo.LogicalValueAxisOrg);
			Logical3D r1 = styleID.GetLogicalPoint(styleInfo.LogicalValueAxisEnd);

			var sweepPath = layer.CoordinateSystem.GetIsoline(r0, r1);
			g.DrawLine(_axisPen, sweepPath);

			_cachedMainLinePointsUsedForHitTesting = sweepPath.Points.ToArray();
			var majorTickLinesUsedForHitTesting = new List<LineD3D>();
			var minorTickLinesUsedForHitTesting = new List<LineD3D>();

			Logical3D outer;

			// now the major ticks
			VectorD3D outVector;
			double[] majorticks = ticking.GetMajorTicksNormal(axis);
			for (int i = 0; i < majorticks.Length; i++)
			{
				double r = majorticks[i];

				if (_showFirstUpMajorTicks)
				{
					outer = layer.CoordinateSystem.GetLogicalDirection(styleID.ParallelAxisNumber, CSAxisSide.FirstUp);
					var tickorg = layer.CoordinateSystem.GetPositionAndNormalizedDirection(r0, r1, r, outer, out outVector);
					var tickend = tickorg + outVector * _majorTickLength;
					g.DrawLine(_majorTickPen, tickorg, tickend);
					majorTickLinesUsedForHitTesting.Add(new LineD3D(tickorg, tickend));
				}
				if (_showFirstDownMajorTicks)
				{
					outer = layer.CoordinateSystem.GetLogicalDirection(styleID.ParallelAxisNumber, CSAxisSide.FirstDown);
					var tickorg = layer.CoordinateSystem.GetPositionAndNormalizedDirection(r0, r1, r, outer, out outVector);
					var tickend = tickorg + outVector * _majorTickLength;
					g.DrawLine(_majorTickPen, tickorg, tickend);
					majorTickLinesUsedForHitTesting.Add(new LineD3D(tickorg, tickend));
				}
				if (_showSecondUpMajorTicks)
				{
					outer = layer.CoordinateSystem.GetLogicalDirection(styleID.ParallelAxisNumber, CSAxisSide.SecondUp);
					var tickorg = layer.CoordinateSystem.GetPositionAndNormalizedDirection(r0, r1, r, outer, out outVector);
					var tickend = tickorg + outVector * _majorTickLength;
					g.DrawLine(_majorTickPen, tickorg, tickend);
					majorTickLinesUsedForHitTesting.Add(new LineD3D(tickorg, tickend));
				}
				if (_showSecondDownMajorTicks)
				{
					outer = layer.CoordinateSystem.GetLogicalDirection(styleID.ParallelAxisNumber, CSAxisSide.SecondDown);
					var tickorg = layer.CoordinateSystem.GetPositionAndNormalizedDirection(r0, r1, r, outer, out outVector);
					var tickend = tickorg + outVector * _majorTickLength;
					g.DrawLine(_majorTickPen, tickorg, tickend);
					majorTickLinesUsedForHitTesting.Add(new LineD3D(tickorg, tickend));
				}
			}

			// now the major ticks
			double[] minorticks = ticking.GetMinorTicksNormal(axis);
			for (int i = 0; i < minorticks.Length; i++)
			{
				double r = minorticks[i];

				if (_showFirstUpMinorTicks)
				{
					outer = layer.CoordinateSystem.GetLogicalDirection(styleID.ParallelAxisNumber, CSAxisSide.FirstUp);
					var tickorg = layer.CoordinateSystem.GetPositionAndNormalizedDirection(r0, r1, r, outer, out outVector);
					var tickend = tickorg + outVector * _minorTickLength;
					g.DrawLine(_minorTickPen, tickorg, tickend);
					minorTickLinesUsedForHitTesting.Add(new LineD3D(tickorg, tickend));
				}
				if (_showFirstDownMinorTicks)
				{
					outer = layer.CoordinateSystem.GetLogicalDirection(styleID.ParallelAxisNumber, CSAxisSide.FirstDown);
					var tickorg = layer.CoordinateSystem.GetPositionAndNormalizedDirection(r0, r1, r, outer, out outVector);
					var tickend = tickorg + outVector * _minorTickLength;
					g.DrawLine(_minorTickPen, tickorg, tickend);
					minorTickLinesUsedForHitTesting.Add(new LineD3D(tickorg, tickend));
				}

				if (_showSecondUpMinorTicks)
				{
					outer = layer.CoordinateSystem.GetLogicalDirection(styleID.ParallelAxisNumber, CSAxisSide.SecondUp);
					var tickorg = layer.CoordinateSystem.GetPositionAndNormalizedDirection(r0, r1, r, outer, out outVector);
					var tickend = tickorg + outVector * _minorTickLength;
					g.DrawLine(_minorTickPen, tickorg, tickend);
					minorTickLinesUsedForHitTesting.Add(new LineD3D(tickorg, tickend));
				}
				if (_showSecondDownMinorTicks)
				{
					outer = layer.CoordinateSystem.GetLogicalDirection(styleID.ParallelAxisNumber, CSAxisSide.SecondDown);
					var tickorg = layer.CoordinateSystem.GetPositionAndNormalizedDirection(r0, r1, r, outer, out outVector);
					var tickend = tickorg + outVector * _minorTickLength;
					g.DrawLine(_minorTickPen, tickorg, tickend);
					minorTickLinesUsedForHitTesting.Add(new LineD3D(tickorg, tickend));
				}
			}

			_cachedMajorTickLinesUsedForHitTesting = majorTickLinesUsedForHitTesting.ToArray();
			_cachedMinorTickLinesUsedForHitTesting = minorTickLinesUsedForHitTesting.ToArray();
		}
예제 #16
0
		/// <summary>
		/// Paints the axis style labels.
		/// </summary>
		/// <param name="g">Graphics environment.</param>
		/// <param name="coordSyst">The coordinate system. Used to get the path along the axis.</param>
		/// <param name="scale">Scale.</param>
		/// <param name="tickSpacing">If not <c>null</c>, this parameter provides a custom tick spacing that is used instead of the default tick spacing of the scale.</param>
		/// <param name="styleInfo">Information about begin of axis, end of axis.</param>
		/// <param name="outerDistance">Distance between axis and labels.</param>
		/// <param name="useMinorTicks">If true, minor ticks are shown.</param>
		public virtual void Paint(IGraphicsContext3D g, G3DCoordinateSystem coordSyst, Scale scale, TickSpacing tickSpacing, CSAxisInformation styleInfo, double outerDistance, bool useMinorTicks)
		{
			_cachedAxisStyleInfo = styleInfo;
			CSLineID styleID = styleInfo.Identifier;
			Scale raxis = scale;
			TickSpacing ticking = tickSpacing;

			var math = Matrix4x3.Identity;

			Logical3D r0 = styleID.GetLogicalPoint(styleInfo.LogicalValueAxisOrg);
			Logical3D r1 = styleID.GetLogicalPoint(styleInfo.LogicalValueAxisEnd);

			VectorD3D outVector;
			Logical3D outer;

			double[] relpositions;
			AltaxoVariant[] ticks;
			if (useMinorTicks)
			{
				relpositions = ticking.GetMinorTicksNormal(raxis);
				ticks = ticking.GetMinorTicksAsVariant();
			}
			else
			{
				relpositions = ticking.GetMajorTicksNormal(raxis);
				ticks = ticking.GetMajorTicksAsVariant();
			}

			if (!_suppressedLabels.IsEmpty)
			{
				List<AltaxoVariant> filteredTicks = new List<AltaxoVariant>();
				List<double> filteredRelPositions = new List<double>();

				for (int i = 0; i < ticks.Length; i++)
				{
					if (_suppressedLabels.ByValues.Contains(ticks[i]))
						continue;
					if (_suppressedLabels.ByNumbers.Contains(i))
						continue;
					if (_suppressedLabels.ByNumbers.Contains(i - ticks.Length))
						continue;

					filteredTicks.Add(ticks[i]);
					filteredRelPositions.Add(relpositions[i]);
				}
				ticks = filteredTicks.ToArray();
				relpositions = filteredRelPositions.ToArray();
			}

			IMeasuredLabelItem[] labels = _labelFormatting.GetMeasuredItems(g, _font, ticks);

			double emSize = _font.Size;
			CSAxisSide labelSide = null != _labelSide ? _labelSide.Value : styleInfo.PreferredLabelSide;
			var labelOutlines = new RectangularObjectOutline[ticks.Length];
			for (int i = 0; i < ticks.Length; i++)
			{
				double r = relpositions[i];

				if (!Altaxo.Calc.RMath.IsInIntervalCC(r, -1000, 1000))
					continue;

				outer = coordSyst.GetLogicalDirection(styleID.ParallelAxisNumber, labelSide);
				PointD3D tickorg = coordSyst.GetPositionAndNormalizedDirection(r0, r1, r, outer, out outVector);
				PointD3D tickend = tickorg + outVector * outerDistance;

				var msize = labels[i].Size;
				var morg = tickend;

				if (_automaticRotationShift)
				{
					// if this option is choosen, we have to find a shift value that shifts the center of the text outwards so that the bounding box of the text will not cross the plane that is
					// defined by the tickend point and the normal vector outVector

					// Assume that the text is now centered x, y, and z around the point tickend (but here we use origin instead tickend)
					math = Matrix4x3.NewRotation(_rotationX, _rotationY, _rotationZ);
					// we have to find all points with negative distance to the plane spanned by tickend and the vector outVector (but again instead of tickend we use origin)
					var msizePad = msize + new VectorD3D(
					(_font.Size * 1) / 3, // whereas above and below text no padding is neccessary, it is optically nicer to have left and right padding of the string by 1/6 of font size.
					0,
					(_font.Size * 1) / 3 // same padding applies to z
					);
					var crect = new RectangleD3D((PointD3D)(-0.5 * msizePad), msizePad); // our text centered around origin

					double shift = 0;
					foreach (PointD3D p in crect.Vertices)
					{
						PointD3D ps = math.Transform(p);
						double distance = Math3D.GetDistancePointToPlane(ps, PointD3D.Empty, outVector);
						if (-distance > shift)
							shift = -distance; // only negative distances will count here
					}
					morg += outVector * shift;
				}
				else
				{
					morg = morg.WithXPlus(outVector.X * _font.Size / 3);
				}

				var mrect = new RectangleD3D(morg, msize);
				if (_automaticRotationShift)
					mrect = AdjustRectangle(mrect, Alignment.Center, Alignment.Center, Alignment.Center);
				else
					mrect = AdjustRectangle(mrect, _alignmentX, _alignmentY, _alignmentZ);

				math = Matrix4x3.Identity;
				math.TranslatePrepend(morg.X, morg.Y, morg.Z);

				if (this._rotationZ != 0)
					math.RotationZDegreePrepend(this._rotationZ);
				if (this._rotationY != 0)
					math.RotationYDegreePrepend(this._rotationY);
				if (this._rotationX != 0)
					math.RotationXDegreePrepend(this._rotationX);

				math.TranslatePrepend((mrect.X - morg.X + emSize * _offsetX), (mrect.Y - morg.Y + emSize * _offsetY), (mrect.Z - morg.Z + emSize * _offsetZ));

				var gs = g.SaveGraphicsState();
				g.PrependTransform(math);

				if (this._backgroundStyle != null)
				{
					var itemRectangle = new RectangleD3D(PointD3D.Empty, msize);
					_backgroundStyle.Measure(itemRectangle);
					_backgroundStyle.Draw(g, itemRectangle);
				}

				labels[i].Draw(g, _brush, PointD3D.Empty);
				labelOutlines[i] = new RectangularObjectOutline(new RectangleD3D(PointD3D.Empty, msize), math);
				g.RestoreGraphicsState(gs); // Restore the graphics state
			}

			_cachedLabelOutlines = labelOutlines;
		}
예제 #17
0
		/// <summary>
		/// Paints the axis style labels.
		/// </summary>
		/// <param name="g">Graphics environment.</param>
		/// <param name="coordSyst">The coordinate system. Used to get the path along the axis.</param>
		/// <param name="scale">Scale.</param>
		/// <param name="tickSpacing">If not <c>null</c>, this parameter provides a custom tick spacing that is used instead of the default tick spacing of the scale.</param>
		/// <param name="styleInfo">Information about begin of axis, end of axis.</param>
		/// <param name="outerDistance">Distance between axis and labels.</param>
		/// <param name="useMinorTicks">If true, minor ticks are shown.</param>
		public virtual void Paint(Graphics g, G2DCoordinateSystem coordSyst, Scale scale, TickSpacing tickSpacing, CSAxisInformation styleInfo, double outerDistance, bool useMinorTicks)
		{
			_cachedAxisStyleInfo = styleInfo;
			CSLineID styleID = styleInfo.Identifier;
			Scale raxis = scale;
			TickSpacing ticking = tickSpacing;

			_enclosingPath.Reset();
			_enclosingPath.FillMode = FillMode.Winding; // with Winding also overlapping rectangles are selected
			GraphicsPath helperPath = new GraphicsPath();
			Matrix math = new Matrix();

			Logical3D r0 = styleID.GetLogicalPoint(styleInfo.LogicalValueAxisOrg);
			Logical3D r1 = styleID.GetLogicalPoint(styleInfo.LogicalValueAxisEnd);

			PointD2D outVector;
			Logical3D outer;
			var dist_x = outerDistance; // Distance from axis tick point to label
			var dist_y = outerDistance; // y distance from axis tick point to label

			// dist_x += this._font.SizeInPoints/3; // add some space to the horizontal direction in order to separate the chars a little from the ticks

			// next statement is necessary to have a consistent string length both
			// on 0 degree rotated text and rotated text
			// without this statement, the text is fitted to the pixel grid, which
			// leads to "steps" during scaling
			g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

			double[] relpositions;
			AltaxoVariant[] ticks;
			if (useMinorTicks)
			{
				relpositions = ticking.GetMinorTicksNormal(raxis);
				ticks = ticking.GetMinorTicksAsVariant();
			}
			else
			{
				relpositions = ticking.GetMajorTicksNormal(raxis);
				ticks = ticking.GetMajorTicksAsVariant();
			}

			if (!_suppressedLabels.IsEmpty)
			{
				List<AltaxoVariant> filteredTicks = new List<AltaxoVariant>();
				List<double> filteredRelPositions = new List<double>();

				for (int i = 0; i < ticks.Length; i++)
				{
					if (_suppressedLabels.ByValues.Contains(ticks[i]))
						continue;
					if (_suppressedLabels.ByNumbers.Contains(i))
						continue;
					if (_suppressedLabels.ByNumbers.Contains(i - ticks.Length))
						continue;

					filteredTicks.Add(ticks[i]);
					filteredRelPositions.Add(relpositions[i]);
				}
				ticks = filteredTicks.ToArray();
				relpositions = filteredRelPositions.ToArray();
			}

			IMeasuredLabelItem[] labels = _labelFormatting.GetMeasuredItems(g, _font, _stringFormat, ticks);

			double emSize = _font.Size;
			CSAxisSide labelSide = null != _labelSide ? _labelSide.Value : styleInfo.PreferredLabelSide;
			for (int i = 0; i < ticks.Length; i++)
			{
				double r = relpositions[i];

				if (!Altaxo.Calc.RMath.IsInIntervalCC(r, -1000, 1000))
					continue;

				outer = coordSyst.GetLogicalDirection(styleID.ParallelAxisNumber, labelSide);
				PointD2D tickorg = coordSyst.GetNormalizedDirection(r0, r1, r, outer, out outVector);
				PointD2D tickend = tickorg + outVector * outerDistance;

				PointD2D msize = labels[i].Size;
				PointD2D morg = tickend;

				if (_automaticRotationShift)
				{
					double alpha = _rotation * Math.PI / 180 - Math.Atan2(outVector.Y, outVector.X);
					double shift = msize.Y * 0.5 * Math.Abs(Math.Sin(alpha)) + (msize.X + _font.Size / 2) * 0.5 * Math.Abs(Math.Cos(alpha));
					morg = morg + outVector * shift;
				}
				else
				{
					morg = morg.WithXPlus(outVector.X * _font.Size / 3);
				}

				RectangleD2D mrect = new RectangleD2D(morg, msize);
				if (_automaticRotationShift)
					AdjustRectangle(ref mrect, StringAlignment.Center, StringAlignment.Center);
				else
					AdjustRectangle(ref mrect, _horizontalAlignment, _verticalAlignment);

				math.Reset();
				math.Translate((float)morg.X, (float)morg.Y);
				if (this._rotation != 0)
				{
					math.Rotate((float)-this._rotation);
				}
				math.Translate((float)(mrect.X - morg.X + emSize * _xOffset), (float)(mrect.Y - morg.Y + emSize * _yOffset));

				System.Drawing.Drawing2D.GraphicsState gs = g.Save();
				g.MultiplyTransform(math);

				if (this._backgroundStyle != null)
					_backgroundStyle.Draw(g, new RectangleD2D(PointD2D.Empty, msize));

				_brush.SetEnvironment(new RectangleD2D(PointD2D.Empty, msize), BrushX.GetEffectiveMaximumResolution(g, 1));
				labels[i].Draw(g, _brush, new PointF(0, 0));
				g.Restore(gs); // Restore the graphics state

				helperPath.Reset();
				helperPath.AddRectangle(new RectangleF(PointF.Empty, (SizeF)msize));
				helperPath.Transform(math);

				_enclosingPath.AddPath(helperPath, true);
			}
		}
예제 #18
0
		public FloatingScale(Main.Properties.IReadOnlyPropertyBag context)
			: base(new ItemLocationDirectAutoSize())
		{
			_scaleSpanValue = 0.25;
			_tickSpacing = new SpanTickSpacing();
			_axisStyle = new AxisStyle(new CSLineID(0, 0), true, false, true, null, context);
		}