📄 qiplotchannelcustom.pas
字号:
else
begin
Point1InView := XAxis.ValueOnScale(DataX1);
Point2InView := XAxis.ValueOnScale(DataX2);
end;
if Point1InView and Point2InView then
begin
PixelsX1 := XAxis.PositionToPixels(DataX1);
if YRef = ipurScale then
begin
PixelsY1 := YAxis.PositionToPixels(DataY1);
end
else
begin
if not XYAxisReverse then PixelsY1 := TiPlotComponentAccess(Owner).DataView[0].PositionPercentToPixelsY(DataY1)
else PixelsY1 := TiPlotComponentAccess(Owner).DataView[0].PositionPercentToPixelsX(DataY1);
end;
PixelsX2 := XAxis.PositionToPixels(DataX2);
if YRef = ipurScale then
begin
PixelsY2 := YAxis.PositionToPixels(DataY2);
end
else
begin
if not XYAxisReverse then PixelsY2 := TiPlotComponentAccess(Owner).DataView[0].PositionPercentToPixelsY(DataY2)
else PixelsY2 := TiPlotComponentAccess(Owner).DataView[0].PositionPercentToPixelsX(DataY2);
end;
if XYAxisReverse then Polyline([Point(PixelsY1, PixelsX1), Point(PixelsY2, PixelsX2)])
else Polyline([Point(PixelsX1, PixelsY1), Point(PixelsX2, PixelsY2)]);
end;
end;
end;
//****************************************************************************************************************************************************
function TiPlotChannelCustom.GetDataMarkerShowing(const Index: Integer): Boolean;
begin
Result := False;
if not MarkersVisible then Exit;
if DataNull[Index] then Exit;
if DataEmpty[Index] then Exit;
if not Assigned(XAxis) then Exit;
if not Assigned(YAxis) then Exit;
if FMarkersAllowIndividual then if not DataMarkerShow[Index] then Exit;
if not XAxis.ValueOnScale(DataList.X[Index]) then Exit;
if not YAxis.ValueOnScale(DataList.Y[Index]) then Exit;
Result := True;
end;
//****************************************************************************************************************************************************
procedure TiPlotChannelCustom.DrawMarkers(Canvas: TCanvas; XYAxisReverse : Boolean);
var
i : Integer;
PixelsX : Integer;
PixelsY : Integer;
begin
if not MarkersVisible then Exit;
Canvas.Font.Assign(FMarkersFont);
if (FMarkersTurnOffLimit > 0) and (ABS(FStopIndex - FStartIndex) > FMarkersTurnOffLimit) then Exit;
for i := FStartIndex to FStopIndex do
begin
if not GetDataMarkerShowing(i) then Continue;
PixelsX := XAxis.PositionToPixels(GetDataX(i));
PixelsY := YAxis.PositionToPixels(GetDataY(i));
if XYAxisReverse then DrawMarker(Canvas, i, Point(PixelsY, PixelsX))
else DrawMarker(Canvas, i, Point(PixelsX, PixelsY));
end;
end;
//****************************************************************************************************************************************************
procedure TiPlotChannelCustom.DrawMarker(Canvas: TCanvas; Index: Integer; CenterPoint : TPoint);
var
MarkerStyle : TiPlotMarkerStyle;
MarkerSize : Integer;
ARect : TRect;
begin
if not MarkersVisible then Exit;
with Canvas do
begin
if Index <> - 1 then
begin
if MarkersAllowIndividual then
begin
MarkerStyle := DataMarkerStyle[Index];
MarkerSize := DataMarkerSize[Index];
Pen.Width := DataMarkerPenWidth[Index];
Pen.Style := DataMarkerPenStyle[Index];
Brush.Style := DataMarkerBrushStyle[Index];
if FMarkersPenUseChannelColor then Pen.Color := Color else Pen.Color := DataMarkerPenColor[Index];
if FMarkersBrushUseChannelColor then Brush.Color := Color else Brush.Color := DataMarkerBrushColor[Index];
end
else
begin
MarkerStyle := MarkersStyle;
MarkerSize := MarkersSize;
Pen.Width := MarkersPenWidth;
Pen.Style := MarkersPenStyle;
Brush.Style := MarkersBrushStyle;
if FMarkersPenUseChannelColor then Pen.Color := Color else Pen.Color := MarkersPenColor;
if FMarkersBrushUseChannelColor then Brush.Color := Color else Brush.Color := MarkersBrushColor;
end;
end
else //Legend Requesting Draw
begin
MarkerStyle := MarkersStyle;
MarkerSize := MarkersSize; if MarkerSize > 6 then MarkerSize := 6; //Legend Maximum
Pen.Width := MarkersPenWidth;
Pen.Style := MarkersPenStyle;
if FMarkersPenUseChannelColor then Pen.Color := Color else Pen.Color := MarkersPenColor;
if FMarkersBrushUseChannelColor then Brush.Color := Color else Brush.Color := MarkersBrushColor;
end;
Brush.Style := MarkersBrushStyle;
case MarkerStyle of
ipmsCircle : Ellipse ( CenterPoint.X - MarkerSize, CenterPoint.Y - MarkerSize, CenterPoint.X + MarkerSize, CenterPoint.Y + MarkerSize);
ipmsSquare : Rectangle ( CenterPoint.X - MarkerSize, CenterPoint.Y - MarkerSize, CenterPoint.X + MarkerSize, CenterPoint.Y + MarkerSize);
ipmsDiamond : Polygon ([Point(CenterPoint.X + MarkerSize, CenterPoint.Y ),
Point(CenterPoint.X , CenterPoint.Y + MarkerSize),
Point(CenterPoint.X - MarkerSize, CenterPoint.Y ),
Point(CenterPoint.X , CenterPoint.Y - MarkerSize)]);
ipmsCross : begin
PolyLine([Point(CenterPoint.X + MarkerSize, CenterPoint.Y + MarkerSize),
Point(CenterPoint.X - MarkerSize, CenterPoint.Y - MarkerSize)]);
PolyLine([Point(CenterPoint.X + MarkerSize, CenterPoint.Y - MarkerSize),
Point(CenterPoint.X - MarkerSize, CenterPoint.Y + MarkerSize)]);
end;
ipmsPlus : begin
PolyLine([Point(CenterPoint.X , CenterPoint.Y + MarkerSize),
Point(CenterPoint.X , CenterPoint.Y - MarkerSize)]);
PolyLine([Point(CenterPoint.X + MarkerSize, CenterPoint.Y ),
Point(CenterPoint.X - MarkerSize, CenterPoint.Y )]);
end;
ipmsTriangleUp : Polygon ([Point(CenterPoint.X - MarkerSize, CenterPoint.Y + MarkerSize),
Point(CenterPoint.X , CenterPoint.Y ),
Point(CenterPoint.X + MarkerSize, CenterPoint.Y + MarkerSize)]);
ipmsTriangleDown : Polygon ([Point(CenterPoint.X - MarkerSize, CenterPoint.Y - MarkerSize),
Point(CenterPoint.X , CenterPoint.Y ),
Point(CenterPoint.X + MarkerSize, CenterPoint.Y - MarkerSize)]);
ipmsTriangleLeft : Polygon ([Point(CenterPoint.X + MarkerSize, CenterPoint.Y - MarkerSize),
Point(CenterPoint.X , CenterPoint.Y ),
Point(CenterPoint.X + MarkerSize, CenterPoint.Y + MarkerSize)]);
ipmsTriangleRight : Polygon ([Point(CenterPoint.X - MarkerSize, CenterPoint.Y - MarkerSize),
Point(CenterPoint.X , CenterPoint.Y ),
Point(CenterPoint.X - MarkerSize, CenterPoint.Y + MarkerSize)]);
ipmsVerticalLine : PolyLine ([Point(CenterPoint.X, CenterPoint.Y - MarkerSize), Point(CenterPoint.X, CenterPoint.Y + MarkerSize)]);
ipmsHorizontalLine : PolyLine ([Point(CenterPoint.X - MarkerSize, CenterPoint.Y), Point(CenterPoint.X + MarkerSize, CenterPoint.Y)]);
ipmsCharacter : if DataMarkerCharacter[Index] <> #0 then
begin
ARect := Rect(CenterPoint.X, CenterPoint.Y, CenterPoint.X, CenterPoint.Y);
Brush.Style := bsClear;
iDrawText(Canvas, DataMarkerCharacter[Index], ARect, [itfSingleLine, itfNoClip, itfHCenter, itfVCenter]);
end;
end;
end;
end;
//****************************************************************************************************************************************************
function TiPlotChannelCustom.AxesValid: Boolean;
begin
if Assigned(XAxis) and Assigned(YAxis) then Result := True else Result := False;
end;
//****************************************************************************************************************************************************
procedure TiPlotChannelCustom.GetPointPixels(ValueX, ValueY : Double; var PixelsX : Integer; var PixelsY : Integer);
begin
if AxesValid then
begin
PixelsX := XAxis.PositionToPixels(ValueX);
PixelsY := YAxis.PositionToPixels(ValueY);
end
else
begin
PixelsX := 0;
PixelsY := 0;
end;
end;
//****************************************************************************************************************************************************
procedure TiPlotChannelCustom.Clear;
begin
FRunningXMax := -1E+300;
FRunningXMin := 1E+300;
FRunningXMean := 0;
FRunningYMax := -1E+300;
FRunningYMin := 1E+300;
FRunningYMean := 0;
FStartIndex := -1;
FStopIndex := -1;
if FLoggingActive then LogDeactivate;
DataList.Clear;
TriggerChange(Self);
end;
//****************************************************************************************************************************************************
function TiPlotChannelCustom.AddXY(const X, Y: Double) : Integer;
var
NeedsWriteLog : Boolean;
begin
Result := DataList.Add(X, Y);
if X > FRunningXMax then FRunningXMax := X;
if X < FRunningXMin then FRunningXMin := X;
if Y > FRunningYMax then FRunningYMax := Y;
if Y < FRunningYMin then FRunningYMin := Y;
Inc(FRunningCount);
FRunningXTotal := FRunningXTotal + X;
FRunningXMean := FRunningXTotal / FRunningCount;
FRunningYTotal := FRunningYTotal + Y;
FRunningYMean := FRunningYTotal / FRunningCount;
if FXAxisTrackingEnabled or FYAxisTrackingEnabled then
begin
if MarkersVisible then
begin
if FXAxisTrackingEnabled then if Assigned(XAxis) then
begin
XAxis.NewTrackingData(GetDataXDrawMax(Count-1));
XAxis.NewTrackingData(GetDataXDrawMin(Count-1));
end;
if FYAxisTrackingEnabled then if Assigned(YAxis) then
begin
YAxis.NewTrackingData(GetDataYDrawMax(Count-1));
YAxis.NewTrackingData(GetDataYDrawMin(Count-1));
end;
end
else
begin
if FXAxisTrackingEnabled then if Assigned(XAxis) then XAxis.NewTrackingData(X);
if FYAxisTrackingEnabled then if Assigned(YAxis) then YAxis.NewTrackingData(Y);
end;
end;
if FLoggingActive then
begin
FLogBufferCount := FLogBufferCount + 1;
NeedsWriteLog := False;
if FLogBufferSize < 2 then NeedsWriteLog := True;
if FLogBufferCount >= FLogBufferSize then NeedsWriteLog := True;
if NeedsWriteLog then WriteLog;
end;
TriggerChange(Self);
end;
//****************************************************************************************************************************************************
procedure TiPlotChannelCustom.AddXYArrays(XData, YData: Variant);
var
x : Integer;
LowBoundX : Integer;
LowBoundY : Integer;
HighBoundX : Integer;
HighBoundY : Integer;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -