作成日: 2021/02/16 最終更新日: 2021/04/28
文書種別
不具合
状況
修正済み
詳細
ヒートマップのGradientColorScaleの最大値(Min)と最小値(Max)に設定する値によって、例外が発生するときがあります。
例えば、下記コードのようにGradientColorScaleの値を小数点3桁への丸めた後、ヒートマップのColorScaleに設定する場合、maxValue=13.95を用いると例外が発生します。
※maxValue=13.94では発生しません。
◎サンプルコード(C#)
例えば、下記コードのようにGradientColorScaleの値を小数点3桁への丸めた後、ヒートマップのColorScaleに設定する場合、maxValue=13.95を用いると例外が発生します。
※maxValue=13.94では発生しません。
◎サンプルコード(C#)
private void SetColorScaleData(double minValue, double maxValue)
{
List colorList = Jet32();
// カラースケール作成
double dCoe = Math.Pow(10d, 3);
var scale = new C1.Win.Chart.Extended.GradientColorScale()
{
// そのままdouble値を設定するとDataによっては下記エラーが発生:
// 「System.ArgumentOutOfRangeException: 'インデックスが範囲を超えています。
// 負でない値で、コレクションのサイズよりも小さくなければなりません。」
// そのため小数点3桁に丸め込みを行う
Min = Math.Floor(minValue * dCoe) / dCoe,
Max = Math.Ceiling(maxValue * dCoe) / dCoe,
Axis = new C1.Win.Chart.Extended.ColorAxis()
{ Position = C1.Chart.Position.Right, Title = "レベル", TickLength = 30 },
Colors = colorList
};
// データ取得
double[,] colorScaleData = new double[_dataSource.GetLength(0), _dataSource.GetLength(1)];
// HeatMapへ設定
_heatmap.DataSource = colorScaleData;
_heatmap.ColorScale = scale;
}
回避方法
この問題は2021J v1(4.5.20211.492)で修正されました。
※修正版を適用しない場合の回避方法は以下の通りです。
コンポーネントが提供するGradientColorScaleクラス(C1.Win.Chart.Extended.GradientColorScale)を拡張したカスタムクラスを使用して、ヒートマップのColorScaleを設定します。
◎サンプルコード(C#)
※修正版を適用しない場合の回避方法は以下の通りです。
コンポーネントが提供するGradientColorScaleクラス(C1.Win.Chart.Extended.GradientColorScale)を拡張したカスタムクラスを使用して、ヒートマップのColorScaleを設定します。
◎サンプルコード(C#)
private void SetColorScaleData(double minValue, double maxValue)
{
List colorList = Jet32();
// カラースケール作成
double dCoe = Math.Pow(10d, 3);
var scale = new ColorScale() // 回避方法(1/2)
{
Min = Math.Floor(minValue * dCoe) / dCoe,
Max = Math.Ceiling(maxValue * dCoe) / dCoe,
Axis = new C1.Win.Chart.Extended.ColorAxis()
{ Position = C1.Chart.Position.Right, Title = "レベル", TickLength = 30 },
Colors = colorList
};
// データ取得
double[,] colorScaleData = new double[_dataSource.GetLength(0), _dataSource.GetLength(1)];
// HeatMapへ設定
_heatmap.DataSource = colorScaleData;
_heatmap.ColorScale = scale;
}
・・・途中省略・・・
// 回避方法(2/2)
public class ColorScale : C1.Win.Chart.Extended.GradientColorScale,
C1.Chart.IColorScale
{
int C1.Chart.IColorScale.Convert(double value)
{
var clrs = GetColors();
var cnt = clrs != null ? clrs.Count : 0;
if (cnt == 0)
return 0;
var pos = (clrs.Count - 1) * (value - Min) / (Max - Min);
var ipos = (int)pos;
if (ipos < 0 || ipos > clrs.Count - 1)
return 0;
if (pos >= cnt - 1)
return clrs[cnt - 1];
return Interpolate(Color.FromArgb(clrs[ipos]),
Color.FromArgb(clrs[ipos + 1]), pos - ipos).ToArgb();
}
public static Color Interpolate(Color clr1, Color clr2, double pos)
{
var a = clr1.A + (clr2.A - clr1.A) * pos;
var r = clr1.R + (clr2.R - clr1.R) * pos;
var g = clr1.G + (clr2.G - clr1.G) * pos;
var b = clr1.B + (clr2.B - clr1.B) * pos;
return Color.FromArgb((byte)a, (byte)r, (byte)g, (byte)b);
}
}
旧文書番号
86415