diff --git a/Assets/XCharts/Documentation/XCharts问答.md b/Assets/XCharts/Documentation/XCharts问答.md index 54e9ddd7..59e82412 100644 --- a/Assets/XCharts/Documentation/XCharts问答.md +++ b/Assets/XCharts/Documentation/XCharts问答.md @@ -155,10 +155,12 @@ 答:1.6.0版本为了减少隐式转换,将所有的绘制相关的`Color`都改为了`Color32`,所以会导致一些自定义的颜色的丢失。影响到的主要组件有:`ItemStyle`,`LineStyle`,`AreaStyle`,`Vessel`,`VisualMap`,`AxisSplitArea`,`AxisSplitLine`,`GaugeAxis`,`SerieLabel`等。可以用脚本[UpgradeChartColor.cs](https://github.com/monitor1394/unity-ugui-XCharts/blob/master/Assets/XCharts/Editor/Tools/UpgradeChartColor.cs)进行升级。 升级步骤如下: 1. 备份项目。 -2. 下载或拷贝脚本[UpgradeChartColor.cs](https://github.com/monitor1394/unity-ugui-XCharts/blob/master/Assets/XCharts/Editor/Tools/UpgradeChartColor.cs)放到旧项目的`Editor`下,将里面编译报错的`color`字段改为`Color.clear`(因为旧版本可能有些字段还不存在)。 -3. 编译通过后,通过`菜单栏->XCharts->ExportColorConfig`导出旧版本的颜色配置文件(配置文件默认保存到`Assets`下的`color.config`)。 -4. 升级`XCharts`到最新版本。 -5. 通过`菜单栏->XCharts->ImportColorConfig`将`color.config`导入即可恢复自定义的颜色(如果`color.config`不在升级后的项目的`Assets`下的话需要拷贝到此目录下)。 +2. 下载或拷贝脚本[UpgradeChartColor.cs](https://github.com/monitor1394/unity-ugui-XCharts/blob/master/Assets/XCharts/Editor/Tools/UpgradeChartColor.cs)放到旧项目的`Editor`下,由于旧版本可也能不存在某些图表或者某些属性配置,可能会编译错误,所要处理一下。 +3. 若是由`itemStyle.toColor2`引起的编译报错,可将导出地方的`itemStyle.toColor2`改为`Color.clear`;导入的地方注释掉即可。 +4. 若是由`LiquidChart`引起的编译报错,将所有涉及`LiquidChart`的地方都注释掉即可。 +5. 编译通过后,通过`菜单栏->XCharts->ExportColorConfig`导出旧版本的颜色配置文件(配置文件默认保存到`Assets`下的`color.config`)。 +6. 升级`XCharts`到最新版本。 +7. 通过`菜单栏->XCharts->ImportColorConfig`将`color.config`导入即可恢复自定义的颜色(如果`color.config`不在升级后的项目的`Assets`下的话需要拷贝到此目录下)。 [返回首页](https://github.com/monitor1394/unity-ugui-XCharts) [XChartsAPI接口](XChartsAPI.md) diff --git a/Assets/XCharts/Editor/Tools/UpgradeChartColor.cs b/Assets/XCharts/Editor/Tools/UpgradeChartColor.cs new file mode 100644 index 00000000..2b7f4861 --- /dev/null +++ b/Assets/XCharts/Editor/Tools/UpgradeChartColor.cs @@ -0,0 +1,376 @@ +using System; +/******************************************/ +/* */ +/* Copyright (c) 2018 monitor1394 */ +/* https://github.com/monitor1394 */ +/* */ +/******************************************/ + +using System.Collections.Generic; +using System.IO; +using System.Text; +using UnityEditor; +using UnityEngine; + +namespace XCharts +{ + /// + /// 升级旧版本的颜色配置到1.6.0以上版本,参考[问答29](https://github.com/monitor1394/unity-ugui-XCharts/blob/master/Assets/XCharts/Documentation/XCharts问答.md)进行升级 + /// 导出:菜单栏->XCharts->ExportColorConfig + /// 导入:菜单栏->XCharts->ImportColorConfig + /// + public static class UpgradeChartColor + { + private const string CONFIG_PATH = "/colors.config"; // /Assets/ + + [MenuItem("XCharts/ExportColorConfig")] + /// + /// Export all the color configuration associated with drawing. + /// 导出所有图表的和绘制相关的颜色配置。保存在Assets目录下的colors.config文件里。 + /// + public static void ExportColorConfig() + { + Debug.Log("ExportColorConfig"); + var charts = Resources.FindObjectsOfTypeAll(typeof(BaseChart)); + var sb = new StringBuilder(); + foreach (var chart in charts) + { + if (chart is CoordinateChart) ExportCoordinateChart(sb, chart as CoordinateChart); + else if (chart is LiquidChart) ExportLiquidChart(sb, chart as LiquidChart); //如果这里编译失败,说明改版本不存在LiquidChart,可以整行注释掉。 + else if (chart is RadarChart) ExportRadarChart(sb, chart as RadarChart); + else ExportSeries(sb, chart as BaseChart); + sb.Append("\n"); + } + Debug.LogFormat("ExportColorConfig DONE: {0} charts.", charts.Length); + File.WriteAllText(Application.dataPath + CONFIG_PATH, sb.ToString()); + } + + [MenuItem("XCharts/ImportColorConfig")] + /// + /// 导入旧版本的颜色配置。 + /// + public static void ImportColorConfig() + { + Debug.Log("ImportColorConfig"); + var configPath = Application.dataPath + CONFIG_PATH; + if (!File.Exists(configPath)) + { + Debug.LogError("ImportColorConfig ERROR:can't found config:" + configPath); + return; + } + var charts = Resources.FindObjectsOfTypeAll(typeof(BaseChart)); + var chartDic = new Dictionary(); + foreach (var chart in charts) + { + chartDic[chart.GetInstanceID()] = chart as BaseChart; + } + var allLines = File.ReadAllLines(configPath); + var chartSet = new HashSet(); + foreach (var line in allLines) + { + if (string.IsNullOrEmpty(line)) continue; + var temp = line.Split('='); + var instanceId = int.Parse(temp[0]); + if (!chartDic.ContainsKey(instanceId)) + { + Debug.LogError("can't find chart:" + instanceId); + continue; + } + if (!chartSet.Contains(instanceId)) chartSet.Add(instanceId); + var chart = chartDic[instanceId]; + var colorList = ConvertToColorList(temp[2]); + var temp2 = temp[1].Split('_'); + var allType = temp[1]; + var strType = temp2[0]; + if (allType.Equals("visualMap")) ImportColorList((chart as CoordinateChart).visualMap.inRange, colorList); + else if (allType.Equals("xAxis0_splitArea")) ImportColorList((chart as CoordinateChart).xAxis0.splitArea.color, colorList); + else if (allType.Equals("xAxis1_splitArea")) ImportColorList((chart as CoordinateChart).xAxis1.splitArea.color, colorList); + else if (allType.Equals("yAxis0_splitArea")) ImportColorList((chart as CoordinateChart).yAxis0.splitArea.color, colorList); + else if (allType.Equals("yAxis1_splitArea")) ImportColorList((chart as CoordinateChart).yAxis1.splitArea.color, colorList); + else if (allType.Equals("xAxis0_splitLine")) (chart as CoordinateChart).xAxis0.splitLine.lineStyle.color = colorList[0]; + else if (allType.Equals("xAxis1_splitLine")) (chart as CoordinateChart).xAxis1.splitLine.lineStyle.color = colorList[0]; + else if (allType.Equals("yAxis0_splitLine")) (chart as CoordinateChart).yAxis0.splitLine.lineStyle.color = colorList[0]; + else if (allType.Equals("yAxis1_splitLine")) (chart as CoordinateChart).yAxis1.splitLine.lineStyle.color = colorList[0]; + else if (allType.Equals("vessel")) ImportVesselColor(chart, int.Parse(temp2[1]), colorList); //没有LiquidChart的版本该行可以注释掉。 + else if (allType.Equals("radarSplitLine")) ImportRadarSplitLineColor(chart, int.Parse(temp2[1]), colorList); + else if (allType.Equals("radarSplitArea")) ImportRadarSplitAreaColor(chart, int.Parse(temp2[1]), colorList); + else if (strType.Equals("serie")) + { + var index = int.Parse(temp2[1]); + var strSubType = temp2[2]; + var serie = chart.series.GetSerie(index); + if (strSubType.Equals("lineStyle")) serie.lineStyle.color = colorList[0]; + else if (strSubType.Equals("areaStyle")) serie.areaStyle.color = colorList[1]; + else if (strSubType.Equals("label")) ImportLabelColor(serie.label, colorList); + else if (strSubType.Equals("labelEmphasis")) ImportLabelColor(serie.emphasis.label, colorList); + else if (strSubType.Equals("itemStyle")) ImportItemStyleColor(serie.itemStyle, colorList); + else if (strSubType.Equals("itemStyleEmphasis")) ImportItemStyleColor(serie.emphasis.itemStyle, colorList); + else if (strSubType.Equals("gaugeAxisLine")) ImportGaugeAxisLineColor(serie.gaugeAxis, colorList); + else if (strSubType.Equals("gaugeSplitLine")) serie.gaugeAxis.splitLine.lineStyle.color = colorList[0]; + else if (strSubType.Equals("gaugeAxisTick")) serie.gaugeAxis.axisTick.lineStyle.color = colorList[0]; + } + else if (strType.Equals("serieData")) + { + var index = int.Parse(temp2[1]); + var dataIndex = int.Parse(temp2[2]); + var strSubType = temp2[3]; + var serieData = chart.series.GetSerie(index).GetSerieData(dataIndex); + if (strSubType.Equals("label")) ImportLabelColor(serieData.label, colorList); + else if (strSubType.Equals("labelEmphasis")) ImportLabelColor(serieData.emphasis.label, colorList); + else if (strSubType.Equals("itemStyle")) ImportItemStyleColor(serieData.itemStyle, colorList); + else if (strSubType.Equals("itemStyleEmphasis")) ImportItemStyleColor(serieData.emphasis.itemStyle, colorList); + } + chart.RefreshChart(); + } + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + Debug.LogFormat("ImportColorConfig DONE: {0} charts.", chartSet.Count); + } + + private static void ExportCoordinateChart(StringBuilder sb, CoordinateChart chart) + { + var instanceId = chart.GetInstanceID(); + if (chart.visualMap.show) + { + AppendColor(sb, instanceId, "visualMap", chart.visualMap.inRange); + } + if (chart.xAxis0.show) + { + if (chart.xAxis0.splitArea.show) + AppendColor(sb, instanceId, "xAxis0_splitArea", chart.xAxis0.splitArea.color); + if (chart.xAxis0.splitLine.show) + AppendColor(sb, instanceId, "xAxis0_splitLine", chart.xAxis0.splitLine.lineStyle.color); + } + if (chart.xAxis1.show) + { + if (chart.xAxis1.splitArea.show) + AppendColor(sb, instanceId, "xAxis1_splitArea", chart.xAxis1.splitArea.color); + if (chart.xAxis1.splitLine.show) + AppendColor(sb, instanceId, "xAxis1_splitLine", chart.xAxis1.splitLine.lineStyle.color); + } + if (chart.yAxis0.show) + { + if (chart.yAxis0.splitArea.show) + AppendColor(sb, instanceId, "yAxis0_splitArea", chart.yAxis0.splitArea.color); + if (chart.yAxis0.splitLine.show) + AppendColor(sb, instanceId, "yAxis0_splitLine", chart.yAxis0.splitLine.lineStyle.color); + } + if (chart.yAxis1.show) + { + if (chart.yAxis1.splitArea.show) + AppendColor(sb, instanceId, "yAxis1_splitArea", chart.yAxis1.splitArea.color); + if (chart.yAxis1.splitLine.show) + AppendColor(sb, instanceId, "yAxis1_splitLine", chart.yAxis1.splitLine.lineStyle.color); + } + ExportSeries(sb, chart); + } + + /// + /// LiquidChart不在该版本时整个函数可以注释掉 + /// + /// + /// + private static void ExportLiquidChart(StringBuilder sb, LiquidChart chart) + { + var instanceId = chart.GetInstanceID(); + var key = "vessel_"; + for (int i = 0; i < chart.vessels.Count; i++) + { + var vessel = chart.vessels[i]; + AppendColor(sb, instanceId, key + i, vessel.color, vessel.backgroundColor); + } + ExportSeries(sb, chart); + } + + private static void ExportRadarChart(StringBuilder sb, RadarChart chart) + { + var instanceId = chart.GetInstanceID(); + for (int i = 0; i < chart.radars.Count; i++) + { + var radar = chart.radars[i]; + AppendColor(sb, instanceId, "radarSplitLine_" + i, radar.splitLine.lineStyle.color); + AppendColor(sb, instanceId, "radarSplitArea_" + i, radar.splitArea.color); + } + ExportSeries(sb, chart); + } + + private static void ExportSeries(StringBuilder sb, BaseChart chart) + { + var instanceId = chart.GetInstanceID(); + for (int i = 0; i < chart.series.list.Count; i++) + { + var serie = chart.series.GetSerie(i); + var key = "serie_" + i; + AppendColor(sb, instanceId, key + "_itemStyle", serie.itemStyle.color, serie.itemStyle.toColor, serie.itemStyle.toColor2, serie.itemStyle.backgroundColor, serie.itemStyle.borderColor); + //AppendColor(sb, instanceId, key + "_itemStyle", serie.itemStyle.color, serie.itemStyle.toColor, Color.clear, serie.itemStyle.backgroundColor, serie.itemStyle.borderColor); + AppendColor(sb, instanceId, key + "_label", serie.label.backgroundColor, serie.label.borderColor); + AppendColor(sb, instanceId, key + "_itemStyleEmphasis", serie.emphasis.itemStyle.color, serie.emphasis.itemStyle.toColor, serie.emphasis.itemStyle.toColor2, serie.emphasis.itemStyle.backgroundColor, serie.emphasis.itemStyle.borderColor); + //AppendColor(sb, instanceId, key + "_itemStyleEmphasis", serie.emphasis.itemStyle.color, serie.emphasis.itemStyle.toColor, Color.clear, serie.emphasis.itemStyle.backgroundColor, serie.emphasis.itemStyle.borderColor); + AppendColor(sb, instanceId, key + "_labelEmphasis", serie.emphasis.label.backgroundColor, serie.emphasis.label.borderColor); + if (serie.type == SerieType.Line) + { + AppendColor(sb, instanceId, key + "_lineStyle", serie.lineStyle.color); + AppendColor(sb, instanceId, key + "_areaStyle", serie.areaStyle.color, serie.areaStyle.toColor, serie.areaStyle.highlightColor, serie.areaStyle.highlightToColor); + } + if (serie.type == SerieType.Gauge) + { + var axisLineColors = new List(); + axisLineColors.Add(serie.gaugeAxis.axisLine.barColor); + axisLineColors.Add(serie.gaugeAxis.axisLine.barBackgroundColor); + for (int n = 0; n < serie.gaugeAxis.axisLine.stageColor.Count; n++) + { + axisLineColors.Add(serie.gaugeAxis.axisLine.stageColor[n].color); + } + AppendColor(sb, instanceId, key + "_gaugeAxisLine", axisLineColors); + AppendColor(sb, instanceId, key + "_gaugeSplitLine", serie.gaugeAxis.splitLine.lineStyle.color); + AppendColor(sb, instanceId, key + "_gaugeAxisTick", serie.gaugeAxis.axisTick.lineStyle.color); + } + for (int j = 0; j < serie.dataCount; j++) + { + key = string.Format("serieData_{0}_{1}", i, j); + var serieData = serie.GetSerieData(j); + if (serieData.enableItemStyle) + AppendColor(sb, instanceId, key + "_itemStyle", serieData.itemStyle.color, serieData.itemStyle.toColor, serieData.itemStyle.toColor2, serieData.itemStyle.backgroundColor, serieData.itemStyle.borderColor); + //AppendColor(sb, instanceId, key + "_itemStyle", serieData.itemStyle.color, serieData.itemStyle.toColor, Color.clear, serieData.itemStyle.backgroundColor, serieData.itemStyle.borderColor); + if (serieData.enableLabel) + AppendColor(sb, instanceId, key + "_label", serieData.label.backgroundColor, serieData.label.borderColor); + if (serieData.enableEmphasis) + AppendColor(sb, instanceId, key + "_itemStyleEmphasis", serieData.emphasis.itemStyle.color, serieData.emphasis.itemStyle.toColor, serieData.emphasis.itemStyle.toColor2, serieData.emphasis.itemStyle.backgroundColor, serieData.emphasis.itemStyle.borderColor); + //AppendColor(sb, instanceId, key + "_itemStyleEmphasis", serieData.emphasis.itemStyle.color, serieData.emphasis.itemStyle.toColor, Color.clear, serieData.emphasis.itemStyle.backgroundColor, serieData.emphasis.itemStyle.borderColor); + if (serieData.enableEmphasis) + AppendColor(sb, instanceId, key + "_labelEmphasis", serieData.emphasis.label.backgroundColor, serieData.emphasis.label.borderColor); + } + } + } + + private static void ExportGague(GaugeAxis gauge, StringBuilder sb) + { + + } + + private static void AppendColor(StringBuilder sb, int instanceId, string key, List list) + { + if (list.Count <= 0) return; + sb.AppendFormat("{0}={1}=", instanceId, key); + for (int i = 0; i < list.Count; i++) + { + sb.AppendFormat("{0}|", GetColorRGBA(list[i])); + } + sb.Append("\n"); + } + + private static void AppendColor(StringBuilder sb, int instanceId, string key, params Color[] color) + { + sb.AppendFormat("{0}={1}=", instanceId, key); + for (int i = 0; i < color.Length; i++) + { + sb.AppendFormat("{0}|", GetColorRGBA(color[i])); + } + sb.Append("\n"); + } + + private static void AppendColor(StringBuilder sb, int instanceId, string key, List list) + { + if (list.Count <= 0) return; + sb.AppendFormat("{0}={1}=", instanceId, key); + for (int i = 0; i < list.Count; i++) + { + sb.AppendFormat("{0}|", GetColorRGBA(list[i])); + } + sb.Append("\n"); + } + + private static string GetColorRGBA(Color color) + { + Color32 color32 = color; + return string.Format("{0},{1},{2},{3}", color32.r, color32.g, color32.b, color32.a); + } + + private static List ConvertToColorList(string strInfo) + { + var temp = strInfo.Split('|'); + var list = new List(); + for (int i = 0; i < temp.Length; i++) + { + if (!string.IsNullOrEmpty(temp[i])) + { + var temp2 = temp[i].Split(','); + var r = byte.Parse(temp2[0]); + var g = byte.Parse(temp2[1]); + var b = byte.Parse(temp2[2]); + var a = byte.Parse(temp2[3]); + list.Add(new Color32(r, g, b, a)); + } + } + return list; + } + + private static void ImportColorList(List target, List colorList) + { + target.Clear(); + for (int i = 0; i < colorList.Count; i++) + { + target.Add(colorList[i]); + } + } + + private static void ImportColorList(List target, List colorList) + { + target.Clear(); + for (int i = 0; i < colorList.Count; i++) + { + target.Add(colorList[i]); + } + } + + private static void ImportLabelColor(SerieLabel label, List colorList) + { + label.backgroundColor = colorList[0]; + label.borderColor = colorList[1]; + } + + private static void ImportItemStyleColor(ItemStyle itemStyle, List colorList) + { + itemStyle.color = colorList[0]; + itemStyle.toColor = colorList[1]; + itemStyle.toColor2 = colorList[2];//没有toColor2的版本可以注释掉改行 + itemStyle.backgroundColor = colorList[3]; + itemStyle.borderColor = colorList[4]; + } + + private static void ImportGaugeAxisLineColor(GaugeAxis gauge, List colorList) + { + gauge.axisLine.barColor = colorList[0]; + gauge.axisLine.barBackgroundColor = colorList[1]; + for (int i = 2; i < colorList.Count; i++) + { + gauge.axisLine.stageColor[i - 2].color = colorList[i]; + } + } + + /// + /// 没有LiquidChart的版本这个函数可以注释掉 + /// + /// + /// + /// + private static void ImportVesselColor(BaseChart chart, int index, List colorList) + { + var vessel = (chart as LiquidChart).GetVessel(index); + vessel.color = colorList[0]; + vessel.backgroundColor = colorList[1]; + } + + private static void ImportRadarSplitLineColor(BaseChart chart, int index, List colorList) + { + var radar = (chart as RadarChart).GetRadar(index); + radar.splitLine.lineStyle.color = colorList[0]; + } + + private static void ImportRadarSplitAreaColor(BaseChart chart, int index, List colorList) + { + var radar = (chart as RadarChart).GetRadar(index); + ImportColorList(radar.splitArea.color, colorList); + } + } +} \ No newline at end of file diff --git a/Assets/XCharts/Editor/Tools/UpgradeChartColor.cs.meta b/Assets/XCharts/Editor/Tools/UpgradeChartColor.cs.meta new file mode 100644 index 00000000..6490c9b9 --- /dev/null +++ b/Assets/XCharts/Editor/Tools/UpgradeChartColor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0c7ad8674f7b24e82a92138976f5e969 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: