Hello,
I want to custom draw the marks arrow of piechart and I complete it in the AfterDraw event, but which the line which is not the vertical line or horizontal line , it will be more balck, is this a bug or is there any property I should to set?
The attachement is my application.
Thanks!
Custom marks arrow of piechart
Custom marks arrow of piechart
- Attachments
-
- WindowsFormsApplication1.rar
- (66.25 KiB) Downloaded 585 times
Re: Custom marks arrow of piechart
Hello Candy,
I have modified your project comment the TChart.Refresh that you have in the After Draw Event and added a tChart.Draw here:
Could you tell us if attached project works as you expected?
I hope will helps.
Thanks,
I have modified your project comment the TChart.Refresh that you have in the After Draw Event and added a tChart.Draw here:
Code: Select all
public Form1()
{
InitializeComponent();
tChart1.Draw();
}
Thanks,
Best Regards,
Sandra Pazos / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |
Re: Custom marks arrow of piechart
Hello,
Thanks for your reply. It works well now. But I find an other issue.When I set the 3D property of tChart to true, the coordinate of arrow's start and end is not correct.What should I do ?
Thanks!
Thanks for your reply. It works well now. But I find an other issue.When I set the 3D property of tChart to true, the coordinate of arrow's start and end is not correct.What should I do ?
Thanks!
- Attachments
-
- 3DChart.JPG (31.51 KiB) Viewed 8206 times
Re: Custom marks arrow of piechart
Hello Candy,
Sorry for the delay. If you want that arrow draw correctly when you have 3D chart you need use z value of method g.Line(Point p0,Point p1,int z). I have modified your code using (int)tChart1.Axes.Depth.Maximum to adjust the z point anyway if you prefer you can modify it as you want. Could you tell us if project works as you expected?
Thanks,
Sorry for the delay. If you want that arrow draw correctly when you have 3D chart you need use z value of method g.Line(Point p0,Point p1,int z). I have modified your code using (int)tChart1.Axes.Depth.Maximum to adjust the z point anyway if you prefer you can modify it as you want. Could you tell us if project works as you expected?
Thanks,
Best Regards,
Sandra Pazos / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |
Re: Custom marks arrow of piechart
Hello,
Now I want to custom marks arrow of piechart in web using the same method as before. But it doesn't works well . There's no Draw method in webchart ,so when I load the page first ,the marks position is not changed. What should I do ?
The attachment is my web application .
Now I want to custom marks arrow of piechart in web using the same method as before. But it doesn't works well . There's no Draw method in webchart ,so when I load the page first ,the marks position is not changed. What should I do ?
The attachment is my web application .
- Attachments
-
- WebApplication1.rar
- (16.12 KiB) Downloaded 573 times
Re: Custom marks arrow of piechart
Hello Candy,
I have modified your code, changing AfterDrawSeries to AfterDraw of Chart and adding WebChart1.Chart.Bitmap() to repaint the Chart:
Could you please, check if previous code works as you want?
I hope will helps.
Thanks,
I have modified your code, changing AfterDrawSeries to AfterDraw of Chart and adding WebChart1.Chart.Bitmap() to repaint the Chart:
Code: Select all
protected void Page_Load(object sender, EventArgs e)
{
Pie pie1 = new Pie(WebChart1.Chart);
pie1.FillSampleValues(20);
WebChart1.Chart.Aspect.View3D = false;
WebChart1.AfterDraw += new Steema.TeeChart.PaintChartEventHandler(WebChart1_AfterDraw);
System.Drawing.Bitmap bmp = WebChart1.Chart.Bitmap((int)WebChart1.Width.Value, (int)WebChart1.Height.Value);
}
void WebChart1_AfterDraw(object sender, Steema.TeeChart.Drawing.Graphics3D g)
{
foreach (Series series in (sender as WebChart).Chart.Series)
{
if ((series as Steema.TeeChart.Styles.Pie) != null)
{
Rectangle[] MarksOfPie = new Rectangle[series.Marks.Positions.Count];
int circleXCenter = (series as Steema.TeeChart.Styles.Pie).CircleXCenter;
int circleYCenter = (series as Steema.TeeChart.Styles.Pie).CircleYCenter;
int pieWidth = (series as Steema.TeeChart.Styles.Pie).CircleWidth;
int pieHeight = (series as Steema.TeeChart.Styles.Pie).CircleHeight;
for (int i = 0; i < series.Marks.Positions.Count; i++)
{
MarksOfPie[i].X = series.Marks.Positions[i].LeftTop.X;
MarksOfPie[i].Y = series.Marks.Positions[i].LeftTop.Y;
MarksOfPie[i].Width = series.Marks.Positions[i].Width;
MarksOfPie[i].Height = series.Marks.Positions[i].Height;
}
int NumOfLeftT = 0;
int NumOfRightT = 0;
int MaxXLeft = 0;
int MaxXRight = 0;
int NumOfLeftB = 0;
int NumOfRightB = 0;
for (int i = 0; i < series.Marks.Positions.Count; i++)
{
if (series.Marks.Positions[i].ArrowFrom.X > circleXCenter)
{
if (MaxXRight < MarksOfPie[i].X)
{
MaxXRight = MarksOfPie[i].X;
}
if (series.Marks.Positions[i].ArrowFrom.Y > circleYCenter)
{
NumOfRightB += 1;
}
else
{
NumOfRightT += 1;
}
}
else
{
if (MaxXLeft > MarksOfPie[i].X)
{
MaxXLeft = MarksOfPie[i].X + MarksOfPie[i].Width;
}
if (series.Marks.Positions[i].ArrowFrom.Y > circleYCenter)
{
NumOfLeftB += 1;
}
else
{
NumOfLeftT += 1;
}
}
}
int MarkMaxWidth = 0;
for (int i = 0; i < series.Marks.Positions.Count; i++)
{
if (series.Marks.Positions[i].ArrowFrom.X < circleXCenter)
{
if (MarksOfPie[i].Width > MarkMaxWidth)
{
MarkMaxWidth = MarksOfPie[i].Width;
}
}
}
int DistanceOfMarksLeft = 0;
int DistanceOfMarksRight = 0;
int WidthOfMarkRight = 0;
int WidthOfMarkLeft = 0;
int CountLeftT = NumOfLeftT;
int CountRightT = NumOfRightT;
int CountLeftB = NumOfLeftB;
int CountRightB = NumOfRightB;
if ((NumOfLeftT + NumOfLeftB) != 0)
{
DistanceOfMarksLeft = ((sender as WebChart).Chart.Height - 40 - MarksOfPie[0].Height * (NumOfLeftT + NumOfLeftB)) / (NumOfLeftT + NumOfLeftB);
}
if ((NumOfRightB + NumOfRightT) != 0)
{
DistanceOfMarksRight = ((sender as WebChart).Chart.Height - 40 - MarksOfPie[0].Height * (NumOfRightB + NumOfRightT)) / (NumOfRightB + NumOfRightT);
}
for (int i = series.Marks.Positions.Count - 1; i >= 0; i--)
{
series.Marks.Positions[i].Custom = true;
if (series.Marks.Positions[i].ArrowFrom.X < circleXCenter)
{
if (series.Marks.Positions[i].ArrowFrom.Y > circleYCenter)
{
int LeftButtonY = 20 + ((CountLeftB + NumOfLeftT) * (DistanceOfMarksLeft + MarksOfPie[0].Height));
series.Marks.Positions[i].ArrowTo.X = MaxXLeft;
series.Marks.Positions[i].ArrowTo.Y = LeftButtonY;
series.Marks.Positions[i].LeftTop.X = MaxXLeft;
series.Marks.Positions[i].LeftTop.Y = LeftButtonY;
//(sender as TChart).Refresh();
//series.RefreshSeries();
CountLeftB--;
}
else
{
int LeftTopY = ((CountLeftT) * (DistanceOfMarksLeft + MarksOfPie[0].Height));
series.Marks.Positions[i].ArrowTo.X = MaxXLeft;
series.Marks.Positions[i].ArrowTo.Y = LeftTopY;
series.Marks.Positions[i].LeftTop.X = MaxXLeft;
series.Marks.Positions[i].LeftTop.Y = LeftTopY;
//(sender as TChart).Refresh();
// series.RefreshSeries();
CountLeftT--;
}
}
else
{
if (series.Marks.Positions[i].ArrowFrom.Y > circleYCenter)
{
int RightButtonY = 20 + ((NumOfRightT + NumOfRightB - CountRightB) * (DistanceOfMarksRight + MarksOfPie[0].Height));
series.Marks.Positions[i].ArrowTo.X = MaxXRight;
series.Marks.Positions[i].ArrowTo.Y = RightButtonY;
series.Marks.Positions[i].LeftTop.X = MaxXRight;
series.Marks.Positions[i].LeftTop.Y = RightButtonY;
//(sender as TChart).Refresh();
// series.RefreshSeries();
CountRightB--;
}
else
{
int RightTopY = 20 + ((NumOfRightT - CountRightT) * (DistanceOfMarksRight + MarksOfPie[0].Height));
series.Marks.Positions[i].ArrowTo.X = MaxXRight;
series.Marks.Positions[i].ArrowTo.Y = RightTopY;
series.Marks.Positions[i].LeftTop.X = MaxXRight;
series.Marks.Positions[i].LeftTop.Y = RightTopY;
//(sender as TChart).Refresh();
// series.RefreshSeries();
CountRightT--;
}
}
}
for (int i = 0; i < series.Marks.Positions.Count; i++)
{
MarksOfPie[i].X = series.Marks.Positions[i].LeftTop.X;
MarksOfPie[i].Y = series.Marks.Positions[i].LeftTop.Y;
MarksOfPie[i].Width = series.Marks.Positions[i].Width;
MarksOfPie[i].Height = series.Marks.Positions[i].Height;
}
int NumLeftC = 0;
int NumRightC = 0;
for (int i = 0; i < series.Marks.Positions.Count; i++)
{
if (series.Marks.Positions[i].ArrowFrom.X < circleXCenter)
{
if (series.Marks.Positions[i].ArrowTo.Y > circleYCenter - pieHeight / 2 && series.Marks.Positions[i].ArrowTo.Y < circleYCenter + pieHeight / 2)
{
NumLeftC++;
}
}
else
{
if (series.Marks.Positions[i].ArrowTo.Y > circleYCenter - pieHeight / 2 && series.Marks.Positions[i].ArrowTo.Y < circleYCenter + pieHeight / 2)
{
NumRightC++;
}
}
}
int CountLeftC = NumLeftC;
int CountRightC = NumRightC;
if (NumLeftC != 0)
{
WidthOfMarkLeft = (circleXCenter - pieWidth / 2 - MaxXLeft - MarkMaxWidth) / NumLeftC;
}
if (NumOfRightT != 0)
{
WidthOfMarkRight = (MaxXRight - circleXCenter - pieWidth / 2) / NumRightC;
}
CountRightT = NumOfRightT;
CountLeftT = NumOfLeftT;
for (int i = 0; i < series.Marks.Positions.Count; i++)
{
int arrowstartX = series.Marks.Positions[i].ArrowFrom.X;
int arrowstartY = series.Marks.Positions[i].ArrowFrom.Y;
int MarksX = series.Marks.Positions[i].ArrowTo.X;
int MarksY = series.Marks.Positions[i].ArrowTo.Y;
if (MarksX > circleXCenter)
{
if (MarksY < circleYCenter - pieHeight / 2)
{
g.Line(new Point(arrowstartX, arrowstartY), new Point(arrowstartX, series.Marks.Positions[i].LeftTop.Y), (int)WebChart1.Chart.Axes.Depth.Maximum);
g.Line(new Point(arrowstartX, series.Marks.Positions[i].LeftTop.Y), new Point(MarksX, MarksY), (int)WebChart1.Chart.Axes.Depth.Maximum);
}
else if (MarksY > circleYCenter - pieHeight / 2 && MarksY < circleYCenter + pieHeight / 2)
{
g.Line(new Point(arrowstartX, arrowstartY), new Point(MarksX, MarksY), (int)WebChart1.Chart.Axes.Depth.Maximum);
}
else
{
g.Line(new Point(arrowstartX, arrowstartY), new Point(arrowstartX, MarksY), (int)WebChart1.Chart.Axes.Depth.Maximum);
g.Line(new Point(arrowstartX, MarksY), new Point(MarksX, MarksY), (int)WebChart1.Chart.Axes.Depth.Maximum);
}
}
else
{
if (MarksY < circleYCenter - pieHeight / 2)
{
g.Line(new Point(arrowstartX, arrowstartY), new Point(arrowstartX, series.Marks.Positions[i].LeftTop.Y), (int)WebChart1.Chart.Axes.Depth.Maximum);
g.Line(new Point(arrowstartX, series.Marks.Positions[i].LeftTop.Y), new Point(MarksX + MarksOfPie[i].Width, MarksY), (int)WebChart1.Chart.Axes.Depth.Maximum);
}
else if (MarksY > circleYCenter - pieHeight / 2 && MarksY < circleYCenter + pieHeight / 2)
{
g.Line(new Point(arrowstartX, arrowstartY), new Point(MarksX + MarksOfPie[i].Width, MarksY), (int)WebChart1.Chart.Axes.Depth.Maximum);
}
else
{
g.Line(new Point(arrowstartX, arrowstartY), new Point(arrowstartX, MarksY), (int)WebChart1.Chart.Axes.Depth.Maximum);
g.Line(new Point(arrowstartX, MarksY), new Point(MarksX + MarksOfPie[i].Width, MarksY), (int)WebChart1.Chart.Axes.Depth.Maximum);
}
}
}
}
}
}
I hope will helps.
Thanks,
Best Regards,
Sandra Pazos / Development & Support Steema Software Avinguda Montilivi 33, 17003 Girona, Catalonia Tel: 34 972 218 797 http://www.steema.com |
Instructions - How to post in this forum |