cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
174 lines (173 loc) • 6.97 kB
JavaScript
import "../../../../echarts/lib/echarts.mjs";
import { createTextStyle } from "../../../../echarts/lib/label/labelStyle.mjs";
import graphicGL from "../../util/graphicGL.mjs";
import LinesGeometry from "../../util/geometry/Lines3D.mjs";
import retrieve from "../../util/retrieve.mjs";
import LabelsMesh from "../../util/mesh/LabelsMesh.mjs";
import Model from "../../../../echarts/lib/model/Model.mjs";
import ZRText from "../../../../zrender/lib/graphic/Text.mjs";
var firstNotNull = retrieve.firstNotNull;
var dimIndicesMap = {
x: 0,
y: 2,
z: 1
};
function Grid3DAxis(dim, linesMaterial) {
var linesMesh = new graphicGL.Mesh({
geometry: new LinesGeometry({
useNativeLine: false
}),
material: linesMaterial,
castShadow: false,
ignorePicking: true,
renderOrder: 2
});
var axisLabelsMesh = new LabelsMesh();
axisLabelsMesh.material.depthMask = false;
var rootNode = new graphicGL.Node();
rootNode.add(linesMesh);
rootNode.add(axisLabelsMesh);
this.rootNode = rootNode;
this.dim = dim;
this.linesMesh = linesMesh;
this.labelsMesh = axisLabelsMesh;
this.axisLineCoords = null;
this.labelElements = [];
}
var otherDim = {
x: "y",
y: "x",
z: "y"
};
Grid3DAxis.prototype.update = function(grid3DModel, axisLabelSurface, api) {
var cartesian = grid3DModel.coordinateSystem;
var axis = cartesian.getAxis(this.dim);
var linesGeo = this.linesMesh.geometry;
var labelsGeo = this.labelsMesh.geometry;
linesGeo.convertToDynamicArray(true);
labelsGeo.convertToDynamicArray(true);
var axisModel = axis.model;
var extent = axis.getExtent();
var dpr = api.getDevicePixelRatio();
var axisLineModel = axisModel.getModel("axisLine", grid3DModel.getModel("axisLine"));
var axisTickModel = axisModel.getModel("axisTick", grid3DModel.getModel("axisTick"));
var axisLabelModel = axisModel.getModel("axisLabel", grid3DModel.getModel("axisLabel"));
var axisLineColor = axisLineModel.get("lineStyle.color");
if (axisLineModel.get("show")) {
var axisLineStyleModel = axisLineModel.getModel("lineStyle");
var p0 = [0, 0, 0];
var p1 = [0, 0, 0];
var idx = dimIndicesMap[axis.dim];
p0[idx] = extent[0];
p1[idx] = extent[1];
this.axisLineCoords = [p0, p1];
var color = graphicGL.parseColor(axisLineColor);
var lineWidth = firstNotNull(axisLineStyleModel.get("width"), 1);
var opacity = firstNotNull(axisLineStyleModel.get("opacity"), 1);
color[3] *= opacity;
linesGeo.addLine(p0, p1, color, lineWidth * dpr);
}
if (axisTickModel.get("show")) {
var lineStyleModel = axisTickModel.getModel("lineStyle");
var lineColor = graphicGL.parseColor(firstNotNull(lineStyleModel.get("color"), axisLineColor));
var lineWidth = firstNotNull(lineStyleModel.get("width"), 1);
lineColor[3] *= firstNotNull(lineStyleModel.get("opacity"), 1);
var ticksCoords = axis.getTicksCoords();
var tickLength = axisTickModel.get("length");
for (var i = 0; i < ticksCoords.length; i++) {
var tickCoord = ticksCoords[i].coord;
var p0 = [0, 0, 0];
var p1 = [0, 0, 0];
var idx = dimIndicesMap[axis.dim];
var otherIdx = dimIndicesMap[otherDim[axis.dim]];
p0[idx] = p1[idx] = tickCoord;
p1[otherIdx] = tickLength;
linesGeo.addLine(p0, p1, lineColor, lineWidth * dpr);
}
}
this.labelElements = [];
var dpr = api.getDevicePixelRatio();
if (axisLabelModel.get("show")) {
var ticksCoords = axis.getTicksCoords();
var categoryData = axisModel.get("data");
var labelMargin = axisLabelModel.get("margin");
var labels = axis.getViewLabels();
for (var i = 0; i < labels.length; i++) {
var tickValue = labels[i].tickValue;
var formattedLabel = labels[i].formattedLabel;
var rawLabel = labels[i].rawLabel;
var tickCoord = axis.dataToCoord(tickValue);
var p = [0, 0, 0];
var idx = dimIndicesMap[axis.dim];
var otherIdx = dimIndicesMap[otherDim[axis.dim]];
p[idx] = p[idx] = tickCoord;
p[otherIdx] = labelMargin;
var itemTextStyleModel = axisLabelModel;
if (categoryData && categoryData[tickValue] && categoryData[tickValue].textStyle) {
itemTextStyleModel = new Model(categoryData[tickValue].textStyle, axisLabelModel, axisModel.ecModel);
}
var textColor = firstNotNull(itemTextStyleModel.get("color"), axisLineColor);
var textEl = new ZRText({
style: createTextStyle(itemTextStyleModel, {
text: formattedLabel,
fill: typeof textColor === "function" ? textColor(
axis.type === "category" ? rawLabel : axis.type === "value" ? tickValue + "" : tickValue,
i
) : textColor,
verticalAlign: "top",
align: "left"
})
});
var coords = axisLabelSurface.add(textEl);
var rect = textEl.getBoundingRect();
labelsGeo.addSprite(p, [rect.width * dpr, rect.height * dpr], coords);
this.labelElements.push(textEl);
}
}
if (axisModel.get("name")) {
var nameTextStyleModel = axisModel.getModel("nameTextStyle");
var p = [0, 0, 0];
var idx = dimIndicesMap[axis.dim];
var otherIdx = dimIndicesMap[otherDim[axis.dim]];
var labelColor = firstNotNull(nameTextStyleModel.get("color"), axisLineColor);
var strokeColor = nameTextStyleModel.get("borderColor");
var lineWidth = nameTextStyleModel.get("borderWidth");
p[idx] = p[idx] = (extent[0] + extent[1]) / 2;
p[otherIdx] = axisModel.get("nameGap");
var textEl = new ZRText({
style: createTextStyle(nameTextStyleModel, {
text: axisModel.get("name"),
fill: labelColor,
stroke: strokeColor,
lineWidth
})
});
var coords = axisLabelSurface.add(textEl);
var rect = textEl.getBoundingRect();
labelsGeo.addSprite(p, [rect.width * dpr, rect.height * dpr], coords);
textEl.__idx = this.labelElements.length;
this.nameLabelElement = textEl;
}
this.labelsMesh.material.set("textureAtlas", axisLabelSurface.getTexture());
this.labelsMesh.material.set("uvScale", axisLabelSurface.getCoordsScale());
linesGeo.convertToTypedArray();
labelsGeo.convertToTypedArray();
};
Grid3DAxis.prototype.setSpriteAlign = function(textAlign, textVerticalAlign, api) {
var dpr = api.getDevicePixelRatio();
var labelGeo = this.labelsMesh.geometry;
for (var i = 0; i < this.labelElements.length; i++) {
var labelEl = this.labelElements[i];
var rect = labelEl.getBoundingRect();
labelGeo.setSpriteAlign(i, [rect.width * dpr, rect.height * dpr], textAlign, textVerticalAlign);
}
var nameLabelEl = this.nameLabelElement;
if (nameLabelEl) {
var rect = nameLabelEl.getBoundingRect();
labelGeo.setSpriteAlign(nameLabelEl.__idx, [rect.width * dpr, rect.height * dpr], textAlign, textVerticalAlign);
labelGeo.dirty();
}
this.textAlign = textAlign;
this.textVerticalAlign = textVerticalAlign;
};
export { Grid3DAxis as default };