170 lines
5.4 KiB
JavaScript
170 lines
5.4 KiB
JavaScript
import "../../../lib/easeljs.js";
|
|
import Colors from "./colors";
|
|
import $ from "jquery";
|
|
|
|
function Panel(panel, isDualTilt, scale = 10, treatCoordinatesAsCenterpoints = true) {
|
|
this.Container_constructor();
|
|
this.panel = panel;
|
|
this.isDualTilt = isDualTilt;
|
|
this.textOverlays = {};
|
|
this.selected = false;
|
|
this.scale = scale;
|
|
this.treatCoordinatesAsCenterpoints = treatCoordinatesAsCenterpoints;
|
|
this.setup();
|
|
}
|
|
|
|
const panelMethods = {
|
|
setup() {
|
|
if (this.treatCoordinatesAsCenterpoints) {
|
|
this.x = (this.panel.x - (this.panel.width / 2.0)) * this.scale;
|
|
this.y = (this.panel.y - (this.panel.height / 2.0)) * this.scale;
|
|
} else {
|
|
this.x = this.panel.x * this.scale;
|
|
this.y = this.panel.y * this.scale;
|
|
}
|
|
this.width = this.scale * this.panel.width;
|
|
this.height = this.scale * this.panel.height;
|
|
this.drawBackground();
|
|
},
|
|
|
|
drawBackground() {
|
|
if (this.background === undefined) {
|
|
this.background = new createjs.Shape();
|
|
} else {
|
|
this.removeChild(this.background);
|
|
}
|
|
let fillColor;
|
|
let borderColor;
|
|
let textColor;
|
|
let secondFillColor;
|
|
if (this.panel.data.seismic_anchors > 0 && this.panel.data.wind_anchors > 0) {
|
|
fillColor = Colors.seismic_background;
|
|
secondFillColor = Colors.wind_background;
|
|
textColor = Colors.dark_text;
|
|
borderColor = Colors.border;
|
|
} else if (this.panel.data.seismic_anchors > 0) {
|
|
fillColor = Colors.seismic_background;
|
|
textColor = Colors.dark_text;
|
|
borderColor = Colors.border;
|
|
} else if (this.panel.data.wind_anchors > 0) {
|
|
fillColor = Colors.wind_background;
|
|
textColor = Colors.dark_text;
|
|
borderColor = Colors.border;
|
|
} else {
|
|
fillColor = Colors.default_background;
|
|
textColor = Colors.light_text;
|
|
borderColor = fillColor;
|
|
}
|
|
|
|
if (this.selected) {
|
|
fillColor = Colors.selected_background;
|
|
textColor = Colors.dark_text;
|
|
borderColor = Colors.border;
|
|
}
|
|
|
|
this.textColor = textColor;
|
|
|
|
let width = this.width;
|
|
let height = this.height;
|
|
|
|
let borderWidth = 0.5;
|
|
|
|
// main background fill rectangle with white border
|
|
this.background.graphics.setStrokeStyle(borderWidth)
|
|
.beginStroke('white')
|
|
.beginFill(fillColor)
|
|
.drawRect(0, 0, width, height)
|
|
.endFill()
|
|
.endStroke();
|
|
|
|
// diagonal split background color for multiple anchor types
|
|
if (secondFillColor !== undefined) {
|
|
this.background.graphics.beginFill(secondFillColor)
|
|
.moveTo(borderWidth, borderWidth)
|
|
.lineTo(width - borderWidth, height - borderWidth)
|
|
.lineTo(width - borderWidth, borderWidth)
|
|
.closePath()
|
|
.endFill()
|
|
.endStroke();
|
|
}
|
|
|
|
// inner border for use with light background colors
|
|
this.background.graphics.beginStroke(borderColor)
|
|
.drawRect(borderWidth, borderWidth, width - 2 * borderWidth, height - 2 * borderWidth)
|
|
.endStroke();
|
|
|
|
// line drawing of dual-tilt indicator (the right-facing triangle)
|
|
if (this.isDualTilt) {
|
|
this.background.graphics.setStrokeStyle(0.25)
|
|
.beginStroke(Colors.border)
|
|
.moveTo(width / 2., borderWidth)
|
|
.lineTo(width / 2., height - borderWidth)
|
|
.lineTo(width - borderWidth, height / 2.)
|
|
.closePath()
|
|
.endStroke();
|
|
}
|
|
this.addChildAt(this.background, 0);
|
|
},
|
|
|
|
select() {
|
|
this.selected = true;
|
|
this.drawBackground();
|
|
this.redrawOverlays();
|
|
},
|
|
|
|
deselect() {
|
|
this.selected = false;
|
|
this.drawBackground();
|
|
this.redrawOverlays();
|
|
},
|
|
|
|
setOverlay(overlay) {
|
|
let data = this.panel.data;
|
|
let self = this;
|
|
$.each(this.textOverlays, function (idx, overlay) {
|
|
self.removeChild(overlay);
|
|
});
|
|
this.textOverlays = {};
|
|
if (overlay == "ALL") {
|
|
this.addOverlay('panel_id', data.panel_id, "2.5px", 0.3, 0.55);
|
|
this.addOverlay('wind_zones', data.wind_zones, '2.5px', 0.7, 0.55);
|
|
this.addOverlay('ballast', data.ballast, "1.5px", 0.125, 0.25);
|
|
this.addOverlay('wind_anchors', data.wind_anchors, "1.5px", 0.125, 0.8);
|
|
this.addOverlay('seismic_anchors', "S".repeat(data.seismic_anchors), "1.5px", 0.35, 0.8);
|
|
this.addOverlay('cross_trays', data.cross_trays, "1.5px", 0.6, 0.25);
|
|
this.addOverlay('link_trays', data.link_trays, "1.5px", 0.85, 0.25);
|
|
this.addOverlay('subarray', data.subarray, "1.5px", 0.6, 0.8);
|
|
this.addOverlay('psf', data.psf.toPrecision(3), "1.5px", 0.35, 0.25);
|
|
this.addOverlay('panel_type', data.panel_type, "1.5px", 0.85, 0.8);
|
|
} else if (overlay == 'ANCHOR') {
|
|
this.addOverlay('ballast', data.ballast, "2.5px", 0.3, 0.55);
|
|
this.addOverlay('anchors', data.seismic_anchors + data.wind_anchors, '2.5px', 0.7, 0.55);
|
|
}
|
|
this.currentOverlay = overlay;
|
|
},
|
|
|
|
addOverlay(name, text, fontSize, relativeX, relativeY) {
|
|
let overlay = new createjs.Text();
|
|
overlay.text = text;
|
|
overlay.font = fontSize + " sans-serif";
|
|
overlay.x = this.width * relativeX;
|
|
overlay.y = this.height * relativeY;
|
|
overlay.textAlign = "center";
|
|
overlay.textBaseline = "middle";
|
|
overlay.color = this.textColor;
|
|
overlay.maxWidth = this.width * 0.5;
|
|
this.textOverlays[name] = overlay;
|
|
this.addChild(overlay);
|
|
},
|
|
|
|
redrawOverlays() {
|
|
this.setOverlay(this.currentOverlay);
|
|
}
|
|
};
|
|
|
|
Object.assign(Panel.prototype, createjs.extend(Panel, createjs.Container));
|
|
Object.assign(Panel.prototype, panelMethods);
|
|
Panel = createjs.promote(Panel, "Container");
|
|
|
|
export {Panel};
|