config.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // 配置对象和工具函数
  2. // 来源: u-charts.ts
  3. /**
  4. * uCharts 默认配置接口
  5. */
  6. export interface UChartsConfig {
  7. /** 版本号 */
  8. version: string;
  9. /** Y 轴宽度 */
  10. yAxisWidth: number;
  11. /** X 轴高度 */
  12. xAxisHeight: number;
  13. /** 内边距 [上, 右, 下, 左] */
  14. padding: [number, number, number, number];
  15. /** 是否旋转图表 */
  16. rotate: boolean;
  17. /** 默认字体大小 */
  18. fontSize: number;
  19. /** 默认字体颜色 */
  20. fontColor: string;
  21. /** 数据点形状列表 */
  22. dataPointShape: string[];
  23. /** 主题颜色列表 */
  24. color: string[];
  25. /** 渐变色列表 */
  26. linearColor: string[];
  27. /** 饼图折线间距 */
  28. pieChartLinePadding: number;
  29. /** 饼图文字间距 */
  30. pieChartTextPadding: number;
  31. /** 标题字体大小 */
  32. titleFontSize: number;
  33. /** 副标题字体大小 */
  34. subtitleFontSize: number;
  35. /** 雷达图标签文字边距 */
  36. radarLabelTextMargin: number;
  37. }
  38. /**
  39. * uCharts 默认配置对象
  40. */
  41. export const config: UChartsConfig = {
  42. version: 'v2.5.0-20230101',
  43. yAxisWidth: 15,
  44. xAxisHeight: 22,
  45. padding: [10, 10, 10, 10],
  46. rotate: false,
  47. fontSize: 13,
  48. fontColor: '#666666',
  49. dataPointShape: ['circle', 'circle', 'circle', 'circle'],
  50. color: ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc'],
  51. linearColor: ['#0EE2F8', '#2BDCA8', '#FA7D8D', '#EB88E2', '#2AE3A0', '#0EE2F8', '#EB88E2', '#6773E3', '#F78A85'],
  52. pieChartLinePadding: 15,
  53. pieChartTextPadding: 5,
  54. titleFontSize: 20,
  55. subtitleFontSize: 15,
  56. radarLabelTextMargin: 13,
  57. };
  58. /**
  59. * 深度合并对象
  60. * @param target - 目标对象
  61. * @param varArgs - 源对象数组
  62. * @returns 合并后的对象
  63. * @throws TypeError 如果 target 为 null 或 undefined
  64. */
  65. export function assign<T>(target: T, ...varArgs: Partial<T>[]): T {
  66. if (target == null) {
  67. throw new TypeError('[uCharts] Cannot convert undefined or null to object');
  68. }
  69. if (!varArgs || varArgs.length <= 0) {
  70. return target;
  71. }
  72. // 深度合并对象
  73. function deepAssign(obj1: any, obj2: any): any {
  74. for (let key in obj2) {
  75. obj1[key] = obj1[key] && obj1[key].toString() === "[object Object]" ?
  76. deepAssign(obj1[key], obj2[key]) : obj1[key] = obj2[key];
  77. }
  78. return obj1;
  79. }
  80. varArgs.forEach(val => {
  81. target = deepAssign(target, val);
  82. });
  83. return target;
  84. }
  85. /**
  86. * 坐标点接口
  87. */
  88. export interface Point {
  89. x: number;
  90. y: number;
  91. }
  92. /**
  93. * 碰撞对象接口
  94. */
  95. export interface CollisionObject {
  96. start: Point;
  97. end?: Point;
  98. width: number;
  99. height: number;
  100. center?: Point;
  101. area?: {
  102. start: Point;
  103. end: Point;
  104. width: number;
  105. height: number;
  106. };
  107. }
  108. /**
  109. * 工具函数集合接口
  110. */
  111. export interface Util {
  112. /** 保留小数位数 */
  113. toFixed(num: number, limit?: number): number | string;
  114. /** 判断是否为浮点数 */
  115. isFloat(num: number): boolean;
  116. /** 判断两个数是否近似相等 */
  117. approximatelyEqual(num1: number, num2: number): boolean;
  118. /** 判断两个数是否同号 */
  119. isSameSign(num1: number, num2: number): boolean;
  120. /** 判断两个点是否在相同的 X 坐标区域 */
  121. isSameXCoordinateArea(p1: Point, p2: Point): boolean;
  122. /** 检测两个对象是否碰撞 */
  123. isCollision(obj1: CollisionObject, obj2: CollisionObject): boolean;
  124. }
  125. /**
  126. * 工具函数集合
  127. */
  128. export const util: Util = {
  129. toFixed: function toFixed(num: number, limit: number = 2): number | string {
  130. limit = limit || 2;
  131. if (this.isFloat(num)) {
  132. num = Number(num.toFixed(limit));
  133. }
  134. return num;
  135. },
  136. isFloat: function isFloat(num: number): boolean {
  137. return num % 1 !== 0;
  138. },
  139. approximatelyEqual: function approximatelyEqual(num1: number, num2: number): boolean {
  140. return Math.abs(num1 - num2) < 1e-10;
  141. },
  142. isSameSign: function isSameSign(num1: number, num2: number): boolean {
  143. return Math.abs(num1) === num1 && Math.abs(num2) === num2 || Math.abs(num1) !== num1 && Math.abs(num2) !== num2;
  144. },
  145. isSameXCoordinateArea: function isSameXCoordinateArea(p1: Point, p2: Point): boolean {
  146. return this.isSameSign(p1.x, p2.x);
  147. },
  148. isCollision: function isCollision(obj1: CollisionObject, obj2: CollisionObject): boolean {
  149. obj1.end = {} as Point;
  150. obj1.end.x = obj1.start.x + obj1.width;
  151. obj1.end.y = obj1.start.y - obj1.height;
  152. obj2.end = {} as Point;
  153. obj2.end.x = obj2.start.x + obj2.width;
  154. obj2.end.y = obj2.start.y - obj2.height;
  155. let flag = obj2.start.x > obj1.end.x || obj2.end.x < obj1.start.x || obj2.end.y > obj1.start.y || obj2.start.y < obj1.end.y;
  156. return !flag;
  157. }
  158. };