line.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var tslib_1 = require("tslib");
  4. var matrix_util_1 = require("@antv/matrix-util");
  5. var util_1 = require("@antv/util");
  6. var base_1 = require("./base");
  7. var OverlapUtil = require("./overlap");
  8. var Line = /** @class */ (function (_super) {
  9. tslib_1.__extends(Line, _super);
  10. function Line() {
  11. return _super !== null && _super.apply(this, arguments) || this;
  12. }
  13. Line.prototype.getDefaultCfg = function () {
  14. var cfg = _super.prototype.getDefaultCfg.call(this);
  15. return tslib_1.__assign(tslib_1.__assign({}, cfg), { type: 'line', locationType: 'region',
  16. /**
  17. * 起始点, x, y
  18. * @type {object}
  19. */
  20. start: null,
  21. /**
  22. * 结束点, x, y
  23. * @type {object}
  24. */
  25. end: null });
  26. };
  27. // 获取坐标轴线的 path
  28. Line.prototype.getLinePath = function () {
  29. var start = this.get('start');
  30. var end = this.get('end');
  31. var path = [];
  32. path.push(['M', start.x, start.y]);
  33. path.push(['L', end.x, end.y]);
  34. return path;
  35. };
  36. // 重新计算 layout bbox,考虑到 line 不显示
  37. Line.prototype.getInnerLayoutBBox = function () {
  38. var start = this.get('start');
  39. var end = this.get('end');
  40. var bbox = _super.prototype.getInnerLayoutBBox.call(this);
  41. var minX = Math.min(start.x, end.x, bbox.x);
  42. var minY = Math.min(start.y, end.y, bbox.y);
  43. var maxX = Math.max(start.x, end.x, bbox.maxX);
  44. var maxY = Math.max(start.y, end.y, bbox.maxY);
  45. return {
  46. x: minX,
  47. y: minY,
  48. minX: minX,
  49. minY: minY,
  50. maxX: maxX,
  51. maxY: maxY,
  52. width: maxX - minX,
  53. height: maxY - minY,
  54. };
  55. };
  56. Line.prototype.isVertical = function () {
  57. var start = this.get('start');
  58. var end = this.get('end');
  59. return util_1.isNumberEqual(start.x, end.x);
  60. };
  61. Line.prototype.isHorizontal = function () {
  62. var start = this.get('start');
  63. var end = this.get('end');
  64. return util_1.isNumberEqual(start.y, end.y);
  65. };
  66. Line.prototype.getTickPoint = function (tickValue) {
  67. var self = this;
  68. var start = self.get('start');
  69. var end = self.get('end');
  70. var regionX = end.x - start.x;
  71. var regionY = end.y - start.y;
  72. return {
  73. x: start.x + regionX * tickValue,
  74. y: start.y + regionY * tickValue,
  75. };
  76. };
  77. // 直线坐标轴下任一点的向量方向都相同
  78. Line.prototype.getSideVector = function (offset) {
  79. var axisVector = this.getAxisVector();
  80. var normal = matrix_util_1.vec2.normalize([0, 0], axisVector);
  81. var factor = this.get('verticalFactor');
  82. var verticalVector = [normal[1], normal[0] * -1]; // 垂直方向,逆时针方向
  83. return matrix_util_1.vec2.scale([0, 0], verticalVector, offset * factor);
  84. };
  85. // 获取坐标轴的向量
  86. Line.prototype.getAxisVector = function () {
  87. var start = this.get('start');
  88. var end = this.get('end');
  89. return [end.x - start.x, end.y - start.y];
  90. };
  91. Line.prototype.processOverlap = function (labelGroup) {
  92. var _this = this;
  93. var isVertical = this.isVertical();
  94. var isHorizontal = this.isHorizontal();
  95. // 非垂直,或者非水平时不处理遮挡问题
  96. if (!isVertical && !isHorizontal) {
  97. return;
  98. }
  99. var labelCfg = this.get('label');
  100. var titleCfg = this.get('title');
  101. var verticalLimitLength = this.get('verticalLimitLength');
  102. var labelOffset = labelCfg.offset;
  103. var limitLength = verticalLimitLength;
  104. var titleHeight = 0;
  105. var titleSpacing = 0;
  106. if (titleCfg) {
  107. titleHeight = titleCfg.style.fontSize;
  108. titleSpacing = titleCfg.spacing;
  109. }
  110. if (limitLength) {
  111. limitLength = limitLength - labelOffset - titleSpacing - titleHeight;
  112. }
  113. var overlapOrder = this.get('overlapOrder');
  114. util_1.each(overlapOrder, function (name) {
  115. if (labelCfg[name] && _this.canProcessOverlap(name)) {
  116. _this.autoProcessOverlap(name, labelCfg[name], labelGroup, limitLength);
  117. }
  118. });
  119. if (titleCfg) {
  120. if (util_1.isNil(titleCfg.offset)) {
  121. // 调整 title 的 offset
  122. var bbox = labelGroup.getCanvasBBox();
  123. var length_1 = isVertical ? bbox.width : bbox.height;
  124. // 如果用户没有设置 offset,则自动计算
  125. titleCfg.offset = labelOffset + length_1 + titleSpacing + titleHeight / 2;
  126. }
  127. }
  128. };
  129. /**
  130. * 是否可以执行某一 overlap
  131. * @param name
  132. */
  133. Line.prototype.canProcessOverlap = function (name) {
  134. var labelCfg = this.get('label');
  135. // 对 autoRotate,如果配置了旋转角度,直接进行固定角度旋转
  136. if (name === 'autoRotate') {
  137. return util_1.isNil(labelCfg.rotate);
  138. }
  139. // 默认所有 overlap 都可执行
  140. return true;
  141. };
  142. Line.prototype.autoProcessOverlap = function (name, value, labelGroup, limitLength) {
  143. var _this = this;
  144. var isVertical = this.isVertical();
  145. var hasAdjusted = false;
  146. var util = OverlapUtil[name];
  147. if (value === true) {
  148. var labelCfg = this.get('label');
  149. // true 形式的配置:使用 overlap 默认的的处理方法进行处理
  150. hasAdjusted = util.getDefault()(isVertical, labelGroup, limitLength);
  151. }
  152. else if (util_1.isFunction(value)) {
  153. // 回调函数形式的配置: 用户可以传入回调函数
  154. hasAdjusted = value(isVertical, labelGroup, limitLength);
  155. }
  156. else if (util_1.isObject(value)) {
  157. // object 形式的配置方式:包括 处理方法 type, 和可选参数配置 cfg
  158. var overlapCfg = value;
  159. if (util[overlapCfg.type]) {
  160. hasAdjusted = util[overlapCfg.type](isVertical, labelGroup, limitLength, overlapCfg.cfg);
  161. }
  162. }
  163. else if (util[value]) {
  164. // 字符串类型的配置:按照名称执行 overlap 处理方法
  165. hasAdjusted = util[value](isVertical, labelGroup, limitLength);
  166. }
  167. if (name === 'autoRotate') {
  168. // 文本旋转后,文本的对齐方式可能就不合适了
  169. if (hasAdjusted) {
  170. var labels = labelGroup.getChildren();
  171. var verticalFactor_1 = this.get('verticalFactor');
  172. util_1.each(labels, function (label) {
  173. var textAlign = label.attr('textAlign');
  174. if (textAlign === 'center') {
  175. // 居中的文本需要调整旋转度
  176. var newAlign = verticalFactor_1 > 0 ? 'end' : 'start';
  177. label.attr('textAlign', newAlign);
  178. }
  179. });
  180. }
  181. }
  182. else if (name === 'autoHide') {
  183. var children = labelGroup.getChildren().slice(0); // 复制数组,删除时不会出错
  184. util_1.each(children, function (label) {
  185. if (!label.get('visible')) {
  186. if (_this.get('isRegister')) {
  187. // 已经注册过了,则删除
  188. _this.unregisterElement(label);
  189. }
  190. label.remove(); // 防止 label 数量太多,所以统一删除
  191. }
  192. });
  193. }
  194. };
  195. return Line;
  196. }(base_1.default));
  197. exports.default = Line;
  198. //# sourceMappingURL=line.js.map