⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iplotchannelcustom.pas

📁 iocopm3.04源码,一套很好的工控开发工具
💻 PAS
📖 第 1 页 / 共 5 页
字号:
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 + -