Donut Marks Position

TeeChart VCL for Borland/CodeGear/Embarcadero RAD Studio, Delphi and C++ Builder.
Post Reply
Eic
Newbie
Newbie
Posts: 18
Joined: Mon Apr 18, 2016 12:00 am

Donut Marks Position

Post by Eic » Tue Dec 13, 2016 4:05 pm

Hello.

I use the following code to generate donuts. I have little room to generate my graph.

Code: Select all

	TChart * Chart1 = new TChart(this);
	Chart1->Parent = this;
	Chart1->View3D = false;

	Chart1->Width = 270;
	Chart1->Height = 245;

	TDonutSeries* serie = new TDonutSeries(Chart1);
	serie->CustomXRadius = 47;
	serie->CustomYRadius = serie->CustomXRadius;
	serie->Legend->Visible = false;

	serie->Add(82, UnicodeString("Protection \r\n sociale \r\n 82%"), clBlue);
	serie->Add(1, UnicodeString("Avantages en \r\n nature \r\n 1%"), clRed);
	serie->Add(17, UnicodeString("Revenu \r\n immédiat \r\n 17%"), clWhite);

	Chart1->AddSeries(serie);
One of the marks is not positioning correctly. She leaves the panel, while she might be positioned elsewhere. I suspect that the positioning algorithm may not be easy to manage, but maybe you can improve it.
Graph.png
Graph.png (10.79 KiB) Viewed 8486 times

Yeray
Site Admin
Site Admin
Posts: 9614
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Donut Marks Position

Post by Yeray » Wed Dec 14, 2016 7:53 am

Hello,

Indeed the antiovelap algorithm could be improved to better handle some situations. However the more complex the alrogirthm, slower it will be.
Have you tried using the TDragMarksTool to manually position your marks?
Project3_2016-12-14_08-50-44.png
Project3_2016-12-14_08-50-44.png (9.09 KiB) Viewed 8476 times
(I'm not sure why some programs show the blue in that screenshot as purple :roll: )
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Eic
Newbie
Newbie
Posts: 18
Joined: Mon Apr 18, 2016 12:00 am

Re: Donut Marks Position

Post by Eic » Wed Dec 14, 2016 8:29 am

Hello,

Thank you for your reply.
Your solution is interesting, but alas in our situation, the graphics are not visualized. They are generated, exported as an image and integrated into a document.

Using the TDragMarksTool is not possible.

Yeray
Site Admin
Site Admin
Posts: 9614
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Donut Marks Position

Post by Yeray » Wed Dec 14, 2016 11:42 am

Hello,

I've added it to the public tracker:
http://bugs.teechart.net/show_bug.cgi?id=1719

Also note here you can find proposed solutions for the marks overlapping:
http://www.teechart.net/support/viewtop ... lap#p29938
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Yeray
Site Admin
Site Admin
Posts: 9614
Joined: Tue Dec 05, 2006 12:00 am
Location: Girona, Catalonia
Contact:

Re: Donut Marks Position

Post by Yeray » Wed Dec 14, 2016 12:14 pm

Hello,

Here a simple example:

Code: Select all

uses Series, TeeDonut, TeeTools;

procedure TForm1.FormCreate(Sender: TObject);
var tmpRect: TRect;
begin
  Chart1.View3D:=False;
  Chart1.Legend.Visible:=False;
  Chart1.Title.Visible:=False;

  with Chart1.AddSeries(TDonutSeries) as TDonutSeries do
  //with Chart1.AddSeries(TPieSeries) as TPieSeries do
  begin
    Add(82, 'Protection'+sLineBreak+'sociale'+sLineBreak+'82%', clBlue);
    Add(1, 'Avantages en'+sLineBreak+'nature'+sLineBreak+'1%', clRed);
    Add(17, 'Revenu'+sLineBreak+'immédiat'+sLineBreak+'17%', clWhite);
  end;

  Chart1.Tools.Add(TDragMarksTool);

  AntiOverlap;
end;

procedure TForm1.AntiOverlap;
var R1,R2,DummyRect: TRect;
    i, j: Integer;
    mp1, mp2: TSeriesMarkPosition;
begin
  Chart1[0].Marks.Automatic.Move:=false;
  Chart1.Draw;

  mp1:=TSeriesMarkPosition.Create;
  mp2:=TSeriesMarkPosition.Create;

  for i:=0 to Chart1[0].Count-1 do
  begin
    mp1:=Chart1[0].Marks.Positions.Position[i];

    for j:=0 to Chart1[0].Count-1 do
    begin
      if (j<>i) then
      begin
        mp2:=Chart1[0].Marks.Positions.Position[j];

        R1:=mp1.Bounds;
        R2:=mp2.Bounds;

        while (IntersectRect(DummyRect, R1, R2)) do
        begin
          mp1.Custom:=true;
          mp1.LeftTop.x:=mp1.LeftTop.x+4;
          mp1.LeftTop.y:=mp1.LeftTop.y+4;
          mp1.ArrowTo.x:=mp1.LeftTop.x+4;
          mp1.ArrowTo.y:=mp1.LeftTop.y+4;
          R1:=mp1.Bounds;
          R2:=mp2.Bounds;
        end;

        Chart1.Refresh;
      end;
    end;
  end;
end;
It gives a better result, but you could probably improve the algorithm to better fit your needs.
Project1_2016-12-14_13-12-03.png
Project1_2016-12-14_13-12-03.png (9.69 KiB) Viewed 8459 times
Best Regards,
ImageYeray Alonso
Development & Support
Steema Software
Av. Montilivi 33, 17003 Girona, Catalonia (SP)
Image Image Image Image Image Image Please read our Bug Fixing Policy

Post Reply