@aurigma/design-atoms-model
Version:
Design Atoms is a part of Customer's Canvas SDK which allows for manipulating individual design elements through your code.
113 lines • 5.01 kB
JavaScript
import { EventObject } from "../EventObject";
import { EqualsOfFloatNumbers, ConvertDegreeToRadian } from "./Common";
import { Matrix } from "./Matrix";
export class Transform {
constructor(scaleX, scaleY, translateX, translateY, angle) {
this._angle = 0;
this._scaleX = 0;
this._scaleY = 0;
this._translateX = 0;
this._translateY = 0;
this._transformChangedEvent = new EventObject();
this._angle = (angle) ? angle : 0;
this._scaleX = (scaleX || scaleX === 0) ? scaleX : 1;
this._scaleY = (scaleY || scaleX === 0) ? scaleY : 1;
this._translateX = (translateX) ? translateX : 0;
this._translateY = (translateY) ? translateY : 0;
}
addTransformChanged(handler) {
this._transformChangedEvent.add(handler);
}
removeTransformChanged(handler) {
this._transformChangedEvent.remove(handler);
}
_setProperty(propName, value, supressOnChanged = false) {
const fieldName = `_${propName}`;
if (this[fieldName] !== value) {
this[fieldName] = value;
if (!supressOnChanged)
this._transformChangedEvent.notify();
}
}
get angle() { return this._angle; }
setAngle(value, supressOnChanged) { this._setProperty("angle", value, supressOnChanged); }
get scaleX() { return this._scaleX; }
setScaleX(value, supressOnChanged) { this._setProperty("scaleX", value, supressOnChanged); }
get scaleY() { return this._scaleY; }
setScaleY(value, supressOnChanged) { this._setProperty("scaleY", value, supressOnChanged); }
get translateX() { return this._translateX; }
setTranslateX(value, supressOnChanged) { this._setProperty("translateX", value, supressOnChanged); }
get translateY() { return this._translateY; }
setTranslateY(value, supressOnChanged) { this._setProperty("translateY", value, supressOnChanged); }
move(x, y) {
const t = this.clone();
if (x != null)
this.setTranslateX(this._translateX + x, true);
if (y != null)
this.setTranslateY(this._translateY + y, true);
if (!t.equals(this))
this._transformChangedEvent.notify();
}
rotate(angle) {
if (angle == null || EqualsOfFloatNumbers(angle, 0))
return;
this._angle += angle;
this._transformChangedEvent.notify();
}
clone() {
return new Transform(this._scaleX, this._scaleY, this._translateX, this._translateY, this._angle);
}
equals(transform, tolerance) {
return transform != null &&
EqualsOfFloatNumbers(this._scaleX, transform._scaleX, tolerance) &&
EqualsOfFloatNumbers(this._scaleY, transform._scaleY, tolerance) &&
EqualsOfFloatNumbers(this._translateX, transform._translateX, tolerance) &&
EqualsOfFloatNumbers(this._translateY, transform._translateY, tolerance) &&
EqualsOfFloatNumbers(this._angle, transform._angle, tolerance);
}
static isEqual(a, b, tolerance = 0.0001) {
if (a == null && b == null)
return true;
if (a == null || b == null)
return false;
return a.equals(b, tolerance);
}
toMatrix() {
const angle = this._angle;
const sin = Math.sin(ConvertDegreeToRadian(angle));
const cos = Math.cos(ConvertDegreeToRadian(angle));
return new Matrix(cos * this._scaleX, sin * this._scaleX, -sin * this._scaleY, cos * this._scaleY, this._translateX, this._translateY);
}
clear({ keepAngle = false, supressOnChanged = false } = {}) {
this._scaleX = 1;
this._scaleY = 1;
this._translateX = 0;
this._translateY = 0;
if (!keepAngle)
this._angle = 0;
if (!supressOnChanged)
this._transformChangedEvent.notify();
}
applyMatrix(matrix, supressOnChanged = false) {
if (matrix.isIdentity)
return;
const targetMatrix = this.toMatrix().concatenate(matrix);
this._angle = targetMatrix.angle;
this._scaleX = targetMatrix.scaleX;
this._scaleY = targetMatrix.scaleY;
this._translateX = targetMatrix.translateX;
this._translateY = targetMatrix.translateY;
if (!supressOnChanged)
this._transformChangedEvent.notify();
}
get isEmpty() {
return EqualsOfFloatNumbers(this._scaleX, 1) && EqualsOfFloatNumbers(this._scaleY, 1) &&
EqualsOfFloatNumbers(this._translateX, 0) && EqualsOfFloatNumbers(this._translateY, 0) &&
EqualsOfFloatNumbers(this._angle, 0);
}
toString() {
let r = [this.translateX, this.translateY, this.scaleX, this.scaleY, this.angle].map(x => x.toFixed(2));
return `{ tx: ${r[0]}, ty: ${r[1]}, sx: ${r[2]}, sy: ${r[3]}, a: ${r[4]}}`;
}
}
//# sourceMappingURL=Transform.js.map