auto-rotate.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.unfixedAngle = exports.fixedAngle = exports.getDefault = void 0;
  4. var util_1 = require("@antv/util");
  5. var label_1 = require("../../util/label");
  6. var matrix_1 = require("../../util/matrix");
  7. var theme_1 = require("../../util/theme");
  8. // 统一设置文本的角度
  9. function setLabelsAngle(labels, angle) {
  10. util_1.each(labels, function (label) {
  11. var x = label.attr('x');
  12. var y = label.attr('y');
  13. var matrix = matrix_1.getMatrixByAngle({ x: x, y: y }, angle);
  14. label.attr('matrix', matrix);
  15. });
  16. }
  17. // 旋转文本
  18. function labelRotate(isVertical, labelsGroup, limitLength, getAngle) {
  19. var labels = labelsGroup.getChildren();
  20. if (!labels.length) {
  21. return false;
  22. }
  23. if (!isVertical && labels.length < 2) {
  24. // 水平时至少有两个时才旋转
  25. return false;
  26. }
  27. var maxWidth = label_1.getMaxLabelWidth(labels);
  28. var isOverlap = false;
  29. if (isVertical) {
  30. // limitLength 为 0 或者 null 时不生效
  31. isOverlap = !!limitLength && maxWidth > limitLength;
  32. }
  33. else {
  34. // 同 limitLength 无关
  35. var tickWidth = Math.abs(labels[1].attr('x') - labels[0].attr('x'));
  36. isOverlap = maxWidth > tickWidth;
  37. }
  38. if (isOverlap) {
  39. var angle = getAngle(limitLength, maxWidth);
  40. setLabelsAngle(labels, angle);
  41. }
  42. return isOverlap;
  43. }
  44. function getDefault() {
  45. return fixedAngle;
  46. }
  47. exports.getDefault = getDefault;
  48. /**
  49. * 固定角度旋转文本
  50. * @param {boolean} isVertical 是否垂直方向
  51. * @param {IGroup} labelsGroup 文本的 group
  52. * @param {number} limitLength 限定长度
  53. * @param {number} customRotate 自定义旋转角度
  54. * @return {boolean} 是否发生了旋转
  55. */
  56. function fixedAngle(isVertical, labelsGroup, limitLength, customRotate) {
  57. return labelRotate(isVertical, labelsGroup, limitLength, function () {
  58. if (util_1.isNumber(customRotate)) {
  59. return customRotate;
  60. }
  61. return isVertical ? theme_1.default.verticalAxisRotate : theme_1.default.horizontalAxisRotate;
  62. });
  63. }
  64. exports.fixedAngle = fixedAngle;
  65. /**
  66. * 非固定角度旋转文本
  67. * @param {boolean} isVertical 是否垂直方向
  68. * @param {IGroup} labelsGroup 文本的 group
  69. * @param {number} limitLength 限定长度
  70. * @return {boolean} 是否发生了旋转
  71. */
  72. function unfixedAngle(isVertical, labelsGroup, limitLength) {
  73. return labelRotate(isVertical, labelsGroup, limitLength, function (length, maxWidth) {
  74. if (!length) {
  75. // 如果没有设置 limitLength,则使用固定的角度旋转
  76. return isVertical ? theme_1.default.verticalAxisRotate : theme_1.default.horizontalAxisRotate;
  77. }
  78. if (isVertical) {
  79. // 垂直时不需要判定 limitLength > maxWidth ,因为此时不会 overlap
  80. return -Math.acos(length / maxWidth);
  81. }
  82. else {
  83. var angle = 0;
  84. if (length > maxWidth) {
  85. // 需要判定,asin 的参数 -1, 1
  86. angle = Math.PI / 4;
  87. }
  88. else {
  89. angle = Math.asin(length / maxWidth);
  90. if (angle > Math.PI / 4) {
  91. // 大于 Math.PI / 4 时没意义
  92. angle = Math.PI / 4;
  93. }
  94. }
  95. return angle;
  96. }
  97. });
  98. }
  99. exports.unfixedAngle = unfixedAngle;
  100. //# sourceMappingURL=auto-rotate.js.map