📄 iplotchannelcustom.pas
字号:
function TiPlotChannelCustom.GetOPCUpdateRate : Integer; begin Result := FOPCItemManager.Items[0].UpdateRate; end;
function TiPlotChannelCustom.GetOPCAutoConnect : Boolean; begin Result := FOPCItemManager.Items[0].AutoConnect; end;
function TiPlotChannelCustom.GetOPCActive : Boolean; begin Result := FOPCItemManager.Items[0].Active; end;
function TiPlotChannelCustom.GetOPCQualityGood : Boolean; begin Result := FOPCItemManager.Items[0].QualityGood; end;
{$endif}
//****************************************************************************************************************************************************
procedure TiPlotChannelCustom.SetLogFileName(const Value: String);
begin
if FLogFileName <> Value then
begin
if FLoggingActive then raise Exception.Create(GetTranslation('Log File Name can not be changed while logging is active.'));
FLogFileName := Value;
end;
end;
//****************************************************************************************************************************************************
function TiPlotChannelCustom.GetNewY(DataX1, DataY1, DataX2, DataY2, NewX : Double) : Double;
var
Slope : Double;
Constant : Double;
begin
if (DataX2-DataX1) <> 0 then
begin
Slope := (DataY2-DataY1)/(DataX2-DataX1);
Constant := DataY1 - Slope*DataX1;
Result := Slope*NewX + Constant;
end
else
Result := 0;
end;
//****************************************************************************************************************************************************
function TiPlotChannelCustom.GetNewX(DataX1, DataY1, DataX2, DataY2, NewY : Double) : Double;
var
Slope : Double;
Constant : Double;
begin
if (DataX2-DataX1) <> 0 then
begin
Slope := (DataY2-DataY1)/(DataX2-DataX1);
Constant := DataY1 - Slope*DataX1;
if Slope <> 0 then Result := (NewY - Constant)/Slope else Result := DataY1;
end
else
Result := DataX1;
end;
//****************************************************************************************************************************************************
procedure TiPlotChannelCustom.GetViewIntersectPoint(ValueXInView, ValueYInView: Double; var ValueXOutOfView: Double; var ValueYOutOfView: Double);
var
Slope : Double;
Constant : Double;
begin
if (ValueXOutOfView-ValueXInView) <> 0 then
begin
Slope := (ValueYOutOfView-ValueYInView)/(ValueXOutOfView-ValueXInView);
Constant := ValueYInView - Slope*ValueXInView;
if not XAxis.ValueOnScale(ValueXOutOfView) then
begin
if ValueXOutOfView >= XAxis.Max then
begin
ValueXOutOfView := XAxis.Max;
ValueYOutOfView := Slope*XAxis.Max + Constant;
end
else
begin
ValueXOutOfView := XAxis.Min;
ValueYOutOfView := Slope*XAxis.Min + Constant;
end
end
else
begin
if ValueYOutOfView >= YAxis.Max then
begin
ValueYOutOfView := YAxis.Max;
if Slope <> 0 then ValueXOutOfView := (YAxis.Max - Constant)/Slope;
end
else
begin
ValueYOutOfView := YAxis.Min;
if Slope <> 0 then ValueXOutOfView := (YAxis.Min - Constant)/Slope;
end ;
end;
end
else
begin
ValueXOutOfView := ValueXInView;
if ValueYOutOfView > YAxis.Max then ValueYOutOfView := YAxis.Max
else ValueYOutOfView := YAxis.Min;
end;
end;
//****************************************************************************************************************************************************
procedure TiPlotChannelCustom.DrawConnectPoints(Canvas: TCanvas; XYAxisReverse: Boolean);
var
i : Integer;
Point1Empty : Boolean;
Point1XValue : Double;
Point1YValue : Double;
AInteger : Integer;
begin
if not FTraceVisible then Exit;
Canvas.Pen.Color := Color;
Canvas.Brush.Style := bsClear;
Canvas.Pen.Style := TPenStyle(TraceLineStyle);
if TraceLineWidth = 1 then Canvas.Pen.Width := 0 else Canvas.Pen.Width := TraceLineWidth;
if FStartIndex = FStopIndex then exit;
Point1Empty := True;
Point1XValue := 0;
Point1YValue := 0;
for i := FStartIndex to FStopIndex do
begin
if DataEmpty[i] then Continue;
if DataNull[i] then
begin
Point1Empty := True;
Continue;
end;
if Point1Empty then
begin
Point1Empty := False;
Point1XValue := DataX[i];
Point1YValue := DataY[i];
end
else
begin
Canvas.Pen.Color := DataTraceLineColor[i];
Canvas.Pen.Style := TPenStyle(DataTraceLineStyle[i]);
AInteger := DataTraceLineWidth[i];
if AInteger = 1 then Canvas.Pen.Width := 0 else Canvas.Pen.Width := AInteger;
DrawLine(Canvas, XYAxisReverse, Point1XValue, Point1YValue, DataX[i], DataY[i], ipurScale);
Point1XValue := DataX[i];
Point1YValue := DataY[i];
end;
end;
end;
//****************************************************************************************************************************************************
procedure TiPlotChannelCustom.DrawQuadPolygon(Canvas: TCanvas; XYAxisReverse: Boolean; Point1, Point2, Point3, Point4: TPointDouble);
var
PointArray : array[0..3] of TPoint;
begin
if XYAxisReverse then
begin
PointArray[0].y := XAxis.PositionToPixels(Point1.x);
PointArray[0].x := YAxis.PositionToPixels(Point1.y);
PointArray[1].y := XAxis.PositionToPixels(Point2.x);
PointArray[1].x := YAxis.PositionToPixels(Point2.y);
PointArray[2].y := XAxis.PositionToPixels(Point3.x);
PointArray[2].x := YAxis.PositionToPixels(Point3.y);
PointArray[3].y := XAxis.PositionToPixels(Point4.x);
PointArray[3].x := YAxis.PositionToPixels(Point4.y);
end
else
begin
PointArray[0].x := XAxis.PositionToPixels(Point1.x);
PointArray[0].y := YAxis.PositionToPixels(Point1.y);
PointArray[1].x := XAxis.PositionToPixels(Point2.x);
PointArray[1].y := YAxis.PositionToPixels(Point2.y);
PointArray[2].x := XAxis.PositionToPixels(Point3.x);
PointArray[2].y := YAxis.PositionToPixels(Point3.y);
PointArray[3].x := XAxis.PositionToPixels(Point4.x);
PointArray[3].y := YAxis.PositionToPixels(Point4.y);
end;
Canvas.Polygon(PointArray);
end;
//****************************************************************************************************************************************************
procedure TiPlotChannelCustom.DrawLine(Canvas: TCanvas; XYAxisReverse: Boolean; X1, Y1, X2, Y2: Double; YRef: TiPlotUnitReferenceStyle);
var
PixelsX1 : Integer; // m = Slope == DeltaY/DeltaX
PixelsX2 : Integer; // b = Constant
PixelsY2 : Integer; // y = mx + b
PixelsY1 : Integer; // b = y - mx
DataX1 : Double;
DataX2 : Double;
DataY1 : Double;
DataY2 : Double;
Point1InView : Boolean;
Point2InView : Boolean;
XCrossesView : Boolean;
YCrossesView : Boolean;
begin
with Canvas do
begin
if X1 <= X2 then
begin
DataX1 := X1;
DataY1 := Y1;
DataX2 := X2;
DataY2 := Y2;
end
else
begin
DataX1 := X2;
DataY1 := Y2;
DataX2 := X1;
DataY2 := Y1;
end;
XCrossesView := False;
if (DataX1 < XAxis.Min) and (DataX2 > XAxis.Max) then XCrossesView := True;
if (DataX1 >= XAxis.Min) and (DataX1 <= XAxis.Max) then XCrossesView := True;
if (DataX2 >= XAxis.Min) and (DataX2 <= XAxis.Max) then XCrossesView := True;
if YRef = ipurScale then
begin
YCrossesView := False;
if (DataY1 < YAxis.Min) and (DataY2 > YAxis.Max) then YCrossesView := True;
if (DataY1 > YAxis.Max) and (DataY2 < YAxis.Min) then YCrossesView := True;
if (DataY1 >= YAxis.Min) and (DataY1 <= YAxis.Max) then YCrossesView := True;
if (DataY2 >= YAxis.Min) and (DataY2 <= YAxis.Max) then YCrossesView := True;
end
else
YCrossesView := True;
if not XCrossesView then Exit;
if not YCrossesView then Exit;
if DataX1 < XAxis.Min then
begin
DataY1 := GetNewY(DataX1, DataY1, DataX2, DataY2, XAxis.Min);
DataX1 := XAxis.Min;
end;
if DataX2 > XAxis.Max then
begin
DataY2 := GetNewY(DataX1, DataY1, DataX2, DataY2, XAxis.Max);
DataX2 := XAxis.Max;
end;
if YRef = ipurScale then
begin
if DataY1 > YAxis.Max then
begin
DataX1 := GetNewX(DataX1, DataY1, DataX2, DataY2, YAxis.Max);
DataY1 := YAxis.Max;
end
else if DataY1 < YAxis.Min then
begin
DataX1 := GetNewX(DataX1, DataY1, DataX2, DataY2, YAxis.Min);
DataY1 := YAxis.Min;
end;
if DataY2 > YAxis.Max then
begin
DataX2 := GetNewX(DataX1, DataY1, DataX2, DataY2, YAxis.Max);
DataY2 := YAxis.Max;
end
else if DataY2 < YAxis.Min then
begin
DataX2 := GetNewX(DataX1, DataY1, DataX2, DataY2, YAxis.Min);
DataY2 := YAxis.Min;
end;
Point1InView := XAxis.ValueOnScale(DataX1) and YAxis.ValueOnScale(DataY1);
Point2InView := XAxis.ValueOnScale(DataX2) and YAxis.ValueOnScale(DataY2);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -