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

📄 iplotchannel.pas

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