From c32082be2620e04c983fd61ef4af7b10a8cbaba0 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Sun, 26 Nov 2023 00:30:18 +0000 Subject: [PATCH] fpspreadsheet: Chart links supports a very basic radar series. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9044 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../visual/fpschart/fpschartlink/main.pas | 3 +- .../source/visual/fpspreadsheetchart.pas | 38 ++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/components/fpspreadsheet/examples/visual/fpschart/fpschartlink/main.pas b/components/fpspreadsheet/examples/visual/fpschart/fpschartlink/main.pas index 637f4416d..71e34740e 100644 --- a/components/fpspreadsheet/examples/visual/fpschart/fpschartlink/main.pas +++ b/components/fpspreadsheet/examples/visual/fpschart/fpschartlink/main.pas @@ -35,12 +35,13 @@ implementation {$R *.lfm} const - FILE_NAME = '../../../other/chart/bars.ods'; +// FILE_NAME = '../../../other/chart/bars.ods'; // FILE_NAME = '../../../other/chart/area.ods'; // FILE_NAME = '../../../other/chart/area-sameImg.ods'; // FILE_NAME = '../../../other/chart/pie.ods'; // FILE_NAME = '../../../other/chart/scatter.ods'; // FILE_NAME = '../../../other/chart/regression.ods'; + FILE_NAME = '../../../other/chart/radar.ods'; { TForm1 } diff --git a/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas b/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas index 6042a35b7..b5fc7e49b 100644 --- a/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas +++ b/components/fpspreadsheet/source/visual/fpspreadsheetchart.pas @@ -51,6 +51,7 @@ type FPointsNumber: Cardinal; FTitleCol, FTitleRow: Cardinal; FTitleSheetName: String; + FCyclicX: Boolean; function GetRange(AIndex: TsXYLRange): String; function GetTitle: String; function GetWorkbook: TsWorkbook; @@ -68,6 +69,7 @@ type procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure Prepare; overload; procedure Prepare(AIndex: TsXYLRange); overload; + procedure SetXCount(AValue: Cardinal); override; procedure SetYCount(AValue: Cardinal); override; public destructor Destroy; override; @@ -86,6 +88,7 @@ type published property WorkbookSource: TsWorkbookSource read FWorkbookSource write SetWorkbookSource; property ColorRange: String index rngColor read GetRange write SetRange; + property CyclicX: Boolean read FCyclicX write FCyclicX default false; property LabelRange: String index rngLabel read GetRange write SetRange; property XRange: String index rngX read GetRange write SetRange; property YRange: String index rngY read GetRange write SetRange; @@ -134,6 +137,7 @@ type procedure UpdateBarSeries(AWorkbookSeries: TsBarSeries; AChartSeries: TBarSeries); procedure UpdateLineSeries(AWorkbookSeries: TsLineSeries; AChartSeries: TLineSeries); procedure UpdatePieSeries(AWorkbookSeries: TsPieSeries; AChartSeries: TPieSeries); + procedure UpdatePolarSeries(AWorkbookSeries: TsRadarSeries; AChartSeries: TPolarSeries); procedure UpdateScatterSeries(AWorkbookSeries: TsScatterSeries; AChartSeries: TLineSeries); public @@ -320,7 +324,12 @@ begin if FRanges[rngX] <> nil then GetXYItem(rngX, AIndex, FCurItem.X, tmpLabel) else - FCurItem.X := AIndex; + begin + if FCyclicX then + FCurItem.X := AIndex / FPointsNumber * 2*pi + else + FCurItem.X := AIndex; + end; GetXYItem(rngY, AIndex, FCurItem.Y, dummyString); @@ -673,6 +682,11 @@ begin Prepare; end; +procedure TsWorkbookChartSource.SetXCount(AValue: Cardinal); +begin + FXCount := AValue; +end; + {@@ ---------------------------------------------------------------------------- Inherited ChartSource method telling the series how many y values are used. Currently we support only single valued data (YCount = 1, by default). @@ -726,6 +740,9 @@ begin ser := TAreaSeries.Create(FChart); ctPie, ctRing: ser := TPieSeries.Create(FChart); + ctRadar, + ctFilledRadar: + ser := TPolarSeries.Create(FChart); end; src.SetTitleAddr(ASeries.TitleAddr); @@ -747,6 +764,8 @@ begin UpdateScatterSeries(TsScatterSeries(ASeries), TLineSeries(ser)); ctPie, ctRing: UpdatePieSeries(TsPieSeries(ASeries), TPieSeries(ser)); + ctRadar, ctFilledRadar: + UpdatePolarSeries(TsRadarSeries(ASeries), TPolarSeries(ser)); end; end; @@ -1433,6 +1452,23 @@ begin FChart.Frame.Visible := false; end; +procedure TsWorkbookChartLink.UpdatePolarSeries(AWorkbookSeries: TsRadarSeries; + AChartSeries: TPolarSeries); +begin + UpdateChartPen(AWorkbookSeries.Chart, AWorkbookSeries.Line, AChartSeries.LinePen); + UpdateChartBrush(AWorkbookSeries.Chart, AWorkbookSeries.Fill, AChartSeries.Brush); + AChartSeries.Transparency := round(AWorkbookSeries.Fill.Transparency * 255); + AChartSeries.CloseCircle := true; + AChartSeries.Filled := (AWorkbookSeries.ChartType = ctFilledRadar); + (AChartSeries.Source as TsWorkbookChartSource).CyclicX := true; + + FChart.LeftAxis.Minors.Clear; + FChart.LeftAxis.Grid.Visible := false; + FChart.BottomAxis.Minors.Clear; + FChart.BottomAxis.Grid.Visible := false; + FChart.Proportional := true; +end; + procedure TsWorkbookChartLink.UpdateScatterSeries(AWorkbookSeries: TsScatterSeries; AChartSeries: TLineSeries); var