rt-sim-training-client/src/jmap/transformHandle.js
2019-07-19 09:23:56 +08:00

87 lines
1.9 KiB
JavaScript

import * as matrix from 'zrender/src/core/matrix';
function createTransform(zoom) {
let transform = matrix.create();
transform = matrix.scale(matrix.create(), transform, [zoom.scaleRate, zoom.scaleRate]);
transform = matrix.translate(matrix.create(), transform, [-zoom.offsetX, -zoom.offsetY]);
return transform;
}
function createBoundingRect(view) {
const rect = view.getBoundingRect();
const scale = view.scale[0];
const offsetX = view.position[0];
const offsetY = view.position[1];
rect.width = rect.width * scale;
rect.height = rect.height * scale;
rect.x = rect.x * scale + offsetX;
rect.y = rect.y * scale + offsetY;
return rect;
}
class TransformHandle {
constructor(painter, zr) {
this.$painter = painter;
this.$zr = zr;
this.rect = { x: 0, y: 0, width: this.$zr.getWidth(), height: this.$zr.getHeight() };
this.transform = createTransform({ scale: 1, offsetX: 0, offsetY: 0 });
}
checkVisible(view) {
return createBoundingRect(view).intersect(this.rect);
}
revisibleView(view) {
if (this.checkVisible(view)) {
view.show();
} else {
view.hide();
}
view.dirty();
}
// 视图进行缩放/平移
transformView(view) {
if (view) {
view.transform = this.transform;
view.decomposeTransform();
this.revisibleView(view);
}
return view;
}
// 处理所有视图缩放/平移
transformAll() {
const parentLevel = this.$painter.getParentLevel();
if (parentLevel) {
parentLevel.eachChild((level) => {
level.eachChild((view) => {
this.transformView(view);
});
});
}
}
// 重新计算显示图形
revisibleAll() {
const parentLevel = this.$painter.getParentLevel();
if (parentLevel) {
parentLevel.eachChild((level) => {
level.eachChild((view) => {
this.revisibleView(view);
});
});
}
}
// 更新偏移量
updateTransform(zoom) {
this.transform = createTransform(zoom);
this.transformAll();
}
}
export default TransformHandle;