📄 iplotchannel.pas
字号:
Point1YValue := DataY[i];
Break;
end;
end;
if (FInterpolationStyle = ipistDifferential) and not Point1Empty then
begin
Canvas.Pen.Color := Color;
DrawLine(Canvas, XYAxisReverse, Point1XValue, Point1YValue, XAxis.Max, Point1YValue, ipurScale);
end;
end;
//****************************************************************************************************************************************************
procedure TiPlotChannel.DrawMarkers(Canvas: TCanvas; XYAxisReverse: Boolean);
var
i : Integer;
DataX : Double;
DataY : Double;
PixelsX : Integer;
PixelsY : Integer;
begin
if StartIndex = - 1 then Exit;
if StopIndex = - 1 then Exit;
if not MarkersVisible then Exit;
if FDigitalEnabled then
begin
for i := StartIndex to StopIndex do
begin
if DataNull[i] then Continue;
if DataEmpty[i] then Continue;
if not DataMarkerShow[i] then Continue;
DataX := GetDataX(i);
DataY := GetDataY(i);
if XAxis.ValueOnScale(DataX) and YAxis.ValueOnScale(DataY) then
begin
PixelsX := XAxis.PositionToPixels(DataX);
if DataY = 0 then PixelsY := FPixelsLow else PixelsY := FPixelsHigh;
if XYAxisReverse then DrawMarker(Canvas, i, Point(PixelsY, PixelsX))
else DrawMarker(Canvas, i, Point(PixelsX, PixelsY));
end;
end;
end
else inherited DrawMarkers(Canvas, XYAxisReverse);
end;
//****************************************************************************************************************************************************
procedure TiPlotChannel.DrawPointSet(const Canvas: TCanvas; const XYAxisReverse: Boolean; const Point1, Point2, Point3: TiPlotMinMaxPoint);
begin
if not Point1.Empty then
if Point1.YMin <> Point1.YMax then DrawLine(Canvas, XYAxisReverse, Point1.XValue, Point1.YMin, Point1.XValue, Point1.YMax, ipurScale);
if not Point2.Empty then
if Point2.YMin <> Point2.YMax then DrawLine(Canvas, XYAxisReverse, Point2.XValue, Point2.YMin, Point2.XValue, Point2.YMax, ipurScale);
if (not Point1.Empty) and (not Point2.Empty) then
DrawLine(Canvas, XYAxisReverse, Point1.XValue, Point1.YLast, Point2.XValue, Point2.YFirst, ipurScale);
if (not Point2.Empty) and (not Point3.Empty) then
DrawLine(Canvas, XYAxisReverse, Point2.XValue, Point2.YLast, Point3.XValue, Point3.YFirst, ipurScale);
end;
//****************************************************************************************************************************************************
procedure TiPlotChannel.DrawFast(Canvas: TCanvas; XYAxisReverse: Boolean);
var
i : Integer;
Point1 : TiPlotMinMaxPoint;
Point2 : TiPlotMinMaxPoint;
Point3 : TiPlotMinMaxPoint;
XValue : Double;
YValue : Double;
Empty : Boolean;
Null : Boolean;
XPixels : Integer;
begin
if StartIndex = StopIndex then exit;
Point1 := TiPlotMinMaxPoint.Create; try
Point2 := TiPlotMinMaxPoint.Create; try
Point3 := TiPlotMinMaxPoint.Create; try
for i := StartIndex to StopIndex do
begin
GetXYEmptyNull(i, XValue, YValue, Empty, Null);
if Empty then Continue;
if Null then
begin
DrawPointSet(Canvas, XYAxisReverse, Point1, Point2, Point3);
Point1.Clear;
Point2.Clear;
Point3.Clear;
Continue;
end;
XPixels := XAxis.PositionToPixels(XValue);
if Point1.Empty then Point1.AddData(XValue, YValue, XPixels)
else if XPixels = Point1.XPixels then Point1.AddData(XValue, YValue, XPixels)
else if Point2.Empty then Point2.AddData(XValue, YValue, XPixels)
else if XPixels = Point2.XPixels then Point2.AddData(XValue, YValue, XPixels)
else
begin
Point3.AddData(XValue, YValue, XPixels);
DrawPointSet(Canvas, XYAxisReverse, Point1, Point2, Point3);
Point1.AssignDown(Point3);
Point2.Clear;
Point3.Clear;
end;
end;
DrawPointSet(Canvas, XYAxisReverse, Point1, Point2, Point3);
finally Point3.Free; end;
finally Point2.Free; end;
finally Point1.Free; end;
end;
//****************************************************************************************************************************************************
procedure TiPlotChannel.DrawDigitalSequence(Canvas: TCanvas; XYAxisReverse: Boolean; SequenceData: TDigitalSequenceData);
var
PointDouble1 : TPointDouble;
PointDouble2 : TPointDouble;
PointDouble3 : TPointDouble;
PointDouble4 : TPointDouble;
begin
Canvas.Brush.Style := FFillStyle;
if FillUseChannelColor then Canvas.Brush.Color := Color else Canvas.Brush.Color := FillColor;
if SequenceData.TransitionSet then
begin
if FFillEnabled then
begin
Canvas.Pen.Color := Canvas.Brush.Color;
PointDouble1.x := SequenceData.StartXValue;
PointDouble1.y := FFillReference;
PointDouble2.x := SequenceData.StartXValue;
if SequenceData.StartYValue then PointDouble2.y := FDigitalReferenceHigh else PointDouble2.y := FDigitalReferenceLow;
PointDouble3.x := SequenceData.TransitionXValue;
if SequenceData.StartYValue then PointDouble3.y := FDigitalReferenceHigh else PointDouble3.y := FDigitalReferenceLow;
PointDouble4.x := SequenceData.TransitionXValue;
PointDouble1.y := FFillReference;
DrawQuadPolygon(Canvas, XYAxisReverse, PointDouble1, PointDouble2, PointDouble3, PointDouble4);
Canvas.Pen.Color := Color;
end;
if SequenceData.StartYValue then
DrawLine(Canvas, XYAxisReverse, SequenceData.StartXValue, FDigitalReferenceHigh, SequenceData.TransitionXValue, FDigitalReferenceHigh, TiPlotUnitReferenceStyle(ord(FDigitalReferenceStyle)))
else
DrawLine(Canvas, XYAxisReverse, SequenceData.StartXValue, FDigitalReferenceLow, SequenceData.TransitionXValue, FDigitalReferenceLow, TiPlotUnitReferenceStyle(ord(FDigitalReferenceStyle)));
if SequenceData.StartYValue then
DrawLine(Canvas, XYAxisReverse, SequenceData.TransitionXValue, FDigitalReferenceHigh, SequenceData.TransitionXValue, FDigitalReferenceLow, TiPlotUnitReferenceStyle(ord(FDigitalReferenceStyle)))
else
DrawLine(Canvas, XYAxisReverse, SequenceData.TransitionXValue, FDigitalReferenceLow, SequenceData.TransitionXValue, FDigitalReferenceHigh, TiPlotUnitReferenceStyle(ord(FDigitalReferenceStyle)));
end
else if SequenceData.StartSet and SequenceData.StopSet then
begin
if FFillEnabled then
begin
Canvas.Pen.Color := Color;
PointDouble1.x := SequenceData.StartXValue;
PointDouble1.y := FFillReference;
PointDouble2.x := SequenceData.StartXValue;
if SequenceData.StartYValue then PointDouble2.y := FDigitalReferenceHigh else PointDouble2.y := FDigitalReferenceLow;
PointDouble3.x := SequenceData.StopXValue;
if SequenceData.StartYValue then PointDouble3.y := FDigitalReferenceHigh else PointDouble3.y := FDigitalReferenceLow;
PointDouble4.x := SequenceData.StopXValue;
PointDouble1.y := FFillReference;
DrawQuadPolygon(Canvas, XYAxisReverse, PointDouble1, PointDouble2, PointDouble3, PointDouble4);
Canvas.Pen.Color := Color;
end;
if SequenceData.StartYValue then
DrawLine(Canvas, XYAxisReverse, SequenceData.StartXValue, FDigitalReferenceHigh, SequenceData.StopXValue, FDigitalReferenceHigh, TiPlotUnitReferenceStyle(ord(FDigitalReferenceStyle)))
else
DrawLine(Canvas, XYAxisReverse, SequenceData.StartXValue, FDigitalReferenceLow, SequenceData.StopXValue, FDigitalReferenceLow, TiPlotUnitReferenceStyle(ord(FDigitalReferenceStyle)));
end;
SequenceData.Clear;
end;
//****************************************************************************************************************************************************
procedure TiPlotChannel.DrawDigital(Canvas: TCanvas; XYAxisReverse: Boolean);
var
i : Integer;
SequenceData : TDigitalSequenceData;
begin
SequenceData := TDigitalSequenceData.Create;
try
SequenceData.Clear;
if StartIndex = StopIndex then exit;
for i := StartIndex to StopIndex do
begin
if DataEmpty[i] then Continue;
if DataNull[i] then
begin
DrawDigitalSequence(Canvas, XYAxisReverse, SequenceData);
Continue;
end;
if not SequenceData.StartSet then
begin
SequenceData.StartSet := True;
SequenceData.StartXValue := DataX[i];
SequenceData.StartYValue := DataY[i] <> 0;
end
else
begin
if (DataY[i] <> 0) = SequenceData.StartYValue then
begin
SequenceData.StopSet := True;
SequenceData.StopXValue := DataX[i];
end
else
begin
SequenceData.TransitionSet := True;
SequenceData.TransitionXValue := DataX[i];
DrawDigitalSequence(Canvas, XYAxisReverse, SequenceData);
SequenceData.StartSet := True;
SequenceData.StartXValue := DataX[i];
SequenceData.StartYValue := DataY[i] <> 0;
end;
end;
end;
DrawDigitalSequence(Canvas, XYAxisReverse, SequenceData);
finally
SequenceData.Free;
end;
end;
//****************************************************************************************************************************************************
procedure TiPlotChannel.DrawCubicSplineSet(Canvas: TCanvas; XYAxisReverse: Boolean; XArray, YArray, Y2Array: DoubleDynamicArray; Size: Integer);
var
i : Integer;
XPixelsStart : Integer;
XPixelsStop : Integer;
XStart : Double;
XStop : Double;
XValue : Double;
YValue : Double;
X1, X2 : Double;
Y1, Y2 : Double;
begin
if Size < 2 then Exit;
Spline(XArray, YArray, Size, 1E30, 1E30, Y2Array);
Canvas.Brush.Style := FFillStyle;
if FillUseChannelColor then Canvas.Brush.Color := Color else Canvas.Brush.Color := FillColor;
XStart := XArray[1];
XStop := XArray[Size];
if XStart < XAxis.Min then XStart := XAxis.Min;
if XStop > XAxis.Max then XStop := XAxis.Max;
XPixelsStart := XAxis.PositionToPixels(XStart);
XPixelsStop := XAxis.PositionToPixels(XStop);
if XPixelsStart > XPixelsStop then SwapIntegers(XPixelsStart, XPixelsStop);
XValue := XAxis.PixelsToPosition(XPixelsStart);
SplineInterpolation(XArray, YArray, Y2Array, Size, XValue, YValue);
X1 := XValue;
Y1 := YValue;
if FFillEnabled and (FFillStyle <> bsClear) then
begin
Canvas.Pen.Color := Canvas.Brush.Color;
DrawLine(Canvas, XYAxisReverse, X1, FFillReference, X1, Y1, ipurScale);
Canvas.Pen.Color := Color;
AddPixelListValue(XAxis.PositionToPixels(X1), Y1);
end;
for i := XPixelsStart+1 to XPixelsStop do
begin
XValue := XAxis.PixelsToPosition(i);
SplineInterpolation(XArray, YArray, Y2Array, Size, XValue, YValue);
X2 := XValue;
Y2 := YValue;
if FFillEnabled and (FFillStyle <> bsClear) then
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -