Page 1 of 1

Alternative TGauge labels

Posted: Thu May 19, 2005 9:13 am
by 9236183
Hi,
We have TChart 7.04 VCL. I was trying to display alternative axis labels on the TGauge graph but have had no luck. With the TLineSeries this could be done with code similar to :-
TChartAxis *axis = graph_->Axes->Right;
axis->Items->Clear(); // remove all custom labels
// add custom labels
axis->Items->Add(0.0, "N");
This does not seem to work with the TGauge even if you get the TGaugeSeries.Axis.......
TIA,
Brett

Posted: Thu May 26, 2005 10:23 am
by Pep
Hi Brett,

for the moment the only way to do this (using Gauge Series) is by setting the Left axis labels visible to False (which are the labels of the Gauge) and then use the Canvas techniques to draw text on the Canvas.

This feature is on our wish list to be considered for further releases.

Posted: Thu May 26, 2005 8:35 pm
by 9236183
Thanks Pep for the reply.

It took me a while to work out but your suggestion was the work around I was using.

I have it working to some extent at the present time, however I seem to strike a probelm when I try and use the AngleToPos() function and the RotationAnlge is not set to 90 or 270, can someone explain this function ?

The angle passed to AngleToPos() is a radian value but I need to make it negative to display correctly at 90 and 270.........at any other rotation angle the values are all over the place......

Thanks for any help,
Brett

Posted: Fri May 27, 2005 7:29 am
by narcis
Hi Brett,
I have it working to some extent at the present time, however I seem to strike a probelm when I try and use the AngleToPos() function and the RotationAnlge is not set to 90 or 270, can someone explain this function ?
According to TeeChart help files:

procedure AngleToPos(Const Angle, AXRadius, AYRadius: Double; Var X, Y: Integer);

Description
The AngleToPos functions returns the exact Screen position for a given pair of Angle and Radius values.

Angles must be expressed in radians from 0 to 2*PI. Radius parameter is in number of pixels.

Posted: Wed Jun 01, 2005 2:42 am
by 9236183
Hi,
I guess I didn't explain myself enough, I was aware of the help file definition of the AngleToPos() function. My question is why do I need to put in a negative angle to get the correct screen coordinate when the RotationAngle propertie is set to 90 or 270 degrees ?

When its not a 90 or 270 degrees I don't get the screen coordinate that corresponds to the angle put into the AngleToPos() function ?

Thanks for you help,
Brett.

Posted: Thu Jun 16, 2005 8:32 am
by Pep
Hi Brett,

using similar code to the following code (which is the one used to show the labels) you should be to draw your custom labels :

Code: Select all

Procedure Tform1.DrawAngleLabel(Angle:Double; AIndex:Integer);
 { MS : 5.02 - replaced old code }
    var X         : Integer;
        Y         : Integer;
        tmpHeight : Integer;
        tmpWidth  : Integer;
        AngleRad  : Double;
        tmpSt     : String;
        tmpXRad   : Integer;
        tmpYRad   : Integer;
        tmpMult   : Integer;
        tmpMargin : Double;
    begin
      With Chart1.Canvas do
      begin
//        AssignFont(CircleLabelsFont);
        tmpHeight:=FontHeight;
        if Angle>=360 then Angle:=Angle-360;

        tmpSt:=  GetCircleLabel(Angle,AIndex);

        tmpXRad:=XRadius;
        tmpYRad:=YRadius;

//          tmpMargin:=LabelsMargin/100.0;

        Inc(tmpXRad,Round(tmpXRad*tmpMargin));
        Inc(tmpYRad,Round(tmpYRad*tmpMargin));


        AngleToPos(Angle*PiDegree,tmpXRad,tmpYRad,X,Y);

        Angle:=Angle+RotationAngle;
        AngleRad:=Angle*PiDegree;

        if CircleLabelsRotated then
        begin
          if (Angle>90) and (Angle<270) then
             tmpMult:= 1  { right aligned }
          else
             tmpMult:=-1; { left aligned }

          Inc(X, tmpMult*Round(0.5*tmpHeight*Sin(AngleRad)));
          Inc(Y, tmpMult*Round(0.5*tmpHeight*Cos(AngleRad)));
        end;

        if Angle>=360 then Angle:=Angle-360;

        if FCircleLabelsRot then
        begin
          if (Angle>90) and (Angle<270) then
          begin
            TextAlign:=TA_RIGHT;
            Angle:=Angle+180;
          end
          else TextAlign:=TA_LEFT;

          RotateLabel3D(X,Y,EndZ,tmpSt,Angle);
        end
        else
        begin
          if (Angle=0) or (Angle=180) then Dec(Y,tmpHeight div 2)
          else
          if (Angle>0) and (Angle<180) then Dec(Y,tmpHeight);
          if (Angle=90) or (Angle=270) then TextAlign:=ta_Center
          else
          begin
            if FCircleLabelsInside then
               if (Angle>90) and (Angle<270) then TextAlign:=ta_Left
                                             else TextAlign:=ta_Right
            else
               if (Angle>90) and (Angle<270) then TextAlign:=ta_Right
                                             else TextAlign:=ta_Left;
          end;

          tmpWidth:=TextWidth('0') div 2;

          if Angle=0 then Inc(x,tmpWidth) else
          if Angle=180 then Dec(x,tmpWidth);

          TextOut3D(X,Y,EndZ,tmpSt);
        end;
      end;
    end;


procedure TForm1.Chart1AfterDraw(Sender: TObject);
begin
while tmpValue<360 do
    begin
      DrawAngleLabel(tmpValue,tmpIndex);
      tmpValue:=tmpValue+tmpIncrement;
      Inc(tmpIndex);
    end;
end;