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

📄 iplotchannelcustom.pas

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