2017-03-03 1 views
0

Teechart를 사용하여 winforms에서 3D 플롯을 만듭니다. 차트에 첫 번째 서페이스를 추가하면 범례 상자에 색으로 채워진 상자가있는 범례 항목 (값)이 표시됩니다. 그러나 둘 이상의 서페이스를 추가하면 범례의 범례 항목 상자 (서페이스를 나타내는)가 흰색입니다. 나는 그 (것)들이 표면 또는 시리즈 색깔로 채워질 것이라는 점을 예상한다.3D TeeChart의 legendbox 색상을 기본 데이터 시리즈의 색상으로 설정하는 방법은 무엇입니까?

은 내가

tChart.Legend.FontSeriesColor true로

을 설정하여 범례 항목의 텍스트의 색상을 설정 관리,하지만 나는 전설을 채우는 방법을 이해할 수 없었다 색 상자입니다.

나는 두 시나리오의 스크린 샷을 첨부 -

One surface합니다. Two surfaces

모두에게 감사드립니다.

샘플 코드는 : 그것은 세포를 그릴 수있는 ColorRange을 사용하는 경우

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      DisplayChart(); 
     } 

     private void DisplayChart() 
     { 
      tChart1.Series.Clear(); 
      tChart1.Legend.FontSeriesColor = true; 
      CreateSurface(new Plot3DSurface("X", "Y", "Z", new List<double> { 1.0, 2.0, 3.0 }, new List<double> { 3, 4, 7 }, new List<double> { 3, 5, 7 }, GetPoints(3, 3), "First", Color.Blue)); 
      CreateSurface(new Plot3DSurface("X", "Y", "Z", new List<double> { 1.0, 3.0, 6.0 }, new List<double> { 3, 5, 8 }, new List<double> { 5, 8, 10.5 }, GetPoints(3, 3), "Second", Color.Green)); 

     } 


     private static List<Point> GetPoints(int x, int y) 
     { 
      var points = new List<Point>(); 

      for (var p = 0; p < x; p++) 
      { 
       for (var t = 0; t < y; t++) 
       { 
        points.Add(new Point(p, t)); 
       } 
      } 

      return points; 

     } 
     private void CreateSurface(IPlot3DSurface surfaceInfo) 
     { 
      Custom3D surface; 

      var xCount = surfaceInfo.IndexesUsed.Select(index => index.X).Distinct().Count(); 
      var yCount = surfaceInfo.IndexesUsed.Select(index => index.Y).Distinct().Count(); 


      if (xCount < 2 || yCount < 2) 
      { 
       surface = new Points3D(tChart1.Chart); 
      } 
      else 
      { 
       surface = new Surface(tChart1.Chart) 
       { 
        Title = surfaceInfo.Title, 
        WireFrame = false, 
        DotFrame = false, 
        UseColorRange = true, 
        UsePalette = false, 
        ColorEach = false, 
        IrregularGrid = true, 
        PaletteStyle = PaletteStyles.Strong, 
        StartColor = surfaceInfo.Color, 
        Color = surfaceInfo.Color, 

       }; 
      } 

      DrawPoints(surfaceInfo, surface); 

     } 

     private void DrawPoints(IPlot3DSurface surfaceInfo, Custom3D surface) 
     { 
      foreach (var point in surfaceInfo.IndexesUsed) 
      { 
       surface.Add(surfaceInfo.GetXValue(point.X), surfaceInfo.GetZValue(point.X), surfaceInfo.GetYValue(point.Y)); 

      } 
     } 
    } 

public class Plot3DSurface : IPlot3DSurface 
    { 
     public Plot3DSurface(string xCoordinatePropertyName, string yCoordinatePropertyName, string zCoordinatePropertyName, 
      List<double> dataSourceListXCoordinate, List<double> dataSourceListYCoordinate, List<double> dataSourceZCoordinate, 
      List<Point> dataSourceIndexList, string title, Color color) 
     { 
      DataSourceListXCoordinate = dataSourceListXCoordinate; 
      DataSourceListYCoordinate = dataSourceListYCoordinate; 

      DataSourceListZCoordinate = dataSourceZCoordinate; 

      XCoordinatePropertyName = xCoordinatePropertyName; 
      YCoordinatePropertyName = yCoordinatePropertyName; 
      ZCoordinatePropertyName = zCoordinatePropertyName; 

      Title = title; 
      Color = color; 

      IndexesUsed = dataSourceIndexList; 
     } 

     private List<Point> _indexesUsed; 

     public List<Point> IndexesUsed 
     { 
      get 
      { 
       if (_indexesUsed != null) return _indexesUsed; 

       var ind = new List<Point>(); 

       for (var i = 0; i < DataCountXCoordinate; i++) 
        for (var j = 0; j < DataCountYCoordinate; j++) 
         ind.Add(new Point(i, j)); 

       return ind; 
      } 
      private set { _indexesUsed = value; } 
     } 

     private IList<double> DataSourceListXCoordinate { get; set; } 

     private IList<double> DataSourceListYCoordinate { get; set; } 

     private IList<double> DataSourceListZCoordinate { get; set; } 

     private int DataCountXCoordinate 
     { 
      get { return DataSourceListXCoordinate.Count; } 
     } 

     private int DataCountYCoordinate 
     { 
      get { return DataSourceListYCoordinate.Count; } 
     } 

     private string XCoordinatePropertyName { get; set; } 

     private string YCoordinatePropertyName { get; set; } 

     private string ZCoordinatePropertyName { get; set; } 

     public string XCoordinatePropertyDisplayName 
     { 
      get { return XCoordinatePropertyName + " (" + DataSourceListXCoordinate[0] + ")"; } 
     } 

     public string YCoordinatePropertyDisplayName 
     { 
      get { return YCoordinatePropertyName + " (" + DataSourceListYCoordinate[0] + ")"; } 
     } 

     public string ZCoordinatePropertyDisplayName 
     { 
      get { return ZCoordinatePropertyName + " (" + DataSourceListZCoordinate[0] + ")"; } 
     } 

     public string Title { get; private set; } 

     public Color Color { get; private set; } 

     public double? GetXValue(int i) 
     { 
      return DataSourceListXCoordinate[i]; 
     } 

     public double? GetYValue(int i) 
     { 
      return DataSourceListYCoordinate[i]; 
     } 

     public double? GetZValue(int i) 
     { 
      return DataSourceListZCoordinate[i]; 
     } 

     public double GetMinX 
     { 
      get { return DataSourceListXCoordinate.Min(v => v); } 
     } 

     public double GetMaxX 
     { 
      get { return DataSourceListXCoordinate.Max(v => v); } 
     } 

     public double GetMinY 
     { 
      get { return DataSourceListYCoordinate.Min(v => v); } 
     } 

     public double GetMaxY 
     { 
      get { return DataSourceListYCoordinate.Max(v => v); } 
     } 

     public double GetMinZ 
     { 
      get { return DataSourceListZCoordinate.Min(v => v); } 
     } 

     public double GetMaxZ 
     { 
      get { return DataSourceListZCoordinate.Max(v => v); } 
     } 



    } 

    public interface IPlot3DSurface 
    { 
     List<Point> IndexesUsed { get; } 

     string XCoordinatePropertyDisplayName { get; } 

     string YCoordinatePropertyDisplayName { get; } 

     string ZCoordinatePropertyDisplayName { get; } 

     string Title { get; } 

     double? GetXValue(int i); 

     double? GetYValue(int i); 

     double? GetZValue(int i); 

     double GetMinX { get; } 

     double GetMaxX { get; } 

     double GetMinY { get; } 

     double GetMaxY { get; } 

     double GetMinZ { get; } 

     double GetMaxZ { get; } 

     Color Color { get; } 
    } 

답변

1

Surface 시리즈는 브러시없이 전설 기호를 그립니다. 거기에 기호를 그릴 수동으로

tChart1.Legend.Symbol.OnSymbolDraw += Symbol_OnSymbolDraw; 

그리고 :

private void Symbol_OnSymbolDraw(object sender, SymbolDrawEventArgs e) 
{ 
    if (e.Series != null) 
    { 
    tChart1.Graphics3D.Brush.Color = e.Series.Color; 
    } 
    tChart1.Graphics3D.Rectangle(e.Rect); 
} 
+0

감사 Yeray을
당신이 시리즈의 색상을 강제하려는 경우가 전설 기호에 그려 질, 당신은 OnSymbolDraw 이벤트를 사용할 수 있습니다. 그것은 작동합니다. – Manish

관련 문제