gojs
Version:
Interactive diagrams, charts, and graphs, such as trees, flowcharts, orgcharts, UML, BPMN, or business diagrams
134 lines (116 loc) • 5.48 kB
JavaScript
/*
* Copyright (C) 1998-2020 by Northwoods Software Corporation
* All Rights Reserved.
*
* FLOOR PLANNER - WALL BUILDING TOOL
* Used to construct new Walls in a Floorplan with mouse clicking / mouse point
* Depends on functionality in Floorplan.js
*/
// Constructor
function WallBuildingTool() {
go.Tool.call(this);
this.name = "WallBuilding";
this._startPoint = null;
this._endPoint = null;
this._wallReshapingTool = null;
} go.Diagram.inherit(WallBuildingTool, go.Tool);
// Get / set the current startPoint
Object.defineProperty(WallBuildingTool.prototype, "startPoint", {
get: function () { return this._startPoint; },
set: function (val) { this._startPoint = val; }
});
// Get / set the current endPoint
Object.defineProperty(WallBuildingTool.prototype, "endPoint", {
get: function () { return this._endPoint; },
set: function (val) { this._endPoint = val; }
});
// Get / set the diagram's wallReshapingTool
Object.defineProperty(WallBuildingTool.prototype, "wallReshapingTool", {
get: function () { return this._wallReshapingTool; },
set: function (val) { this._wallReshapingTool = val; }
});
// Tool can start iff diagram exists, is editable, and tool is enabled
WallBuildingTool.prototype.canStart = function () {
var diagram = this.diagram;
if (diagram !== null && !diagram.isReadOnly && this.isEnabled) return true;
return false;
}
// Start transaction, capture the mouse, use a crosshair cursor
WallBuildingTool.prototype.doActivate = function () {
this.endPoint = null;
this.startTransaction(this.name);
this.isMouseCaptured = true;
var diagram = this.diagram;
var tool = this;
// update wallThickness, based on the current value of the HTML input element
// pre-condition: diagram.floorplanUI exists
if (diagram.floorplanUI) {
var el = document.getElementById(diagram.floorplanUI.state.wallThicknessInputId);
if (isNaN(el.value) || el.value === null || el.value === '' || el.value === undefined) el.value = diagram.convertPixelsToUnits(5);
diagram.model.setDataProperty(diagram.model.modelData, "wallThickness", diagram.convertUnitsToPixels(parseFloat(el.value)));
}
else diagram.model.setDataProperty(diagram.model.modelData, "wallThickness", diagram.convertUnitsToPixels(parseFloat(5)));
// assign startpoint based on grid
var point1 = tool.diagram.lastInput.documentPoint;
var gs = diagram.model.modelData.gridSize;
if (!(tool.diagram.toolManager.draggingTool.isGridSnapEnabled)) gs = 1;
var newx = gs * Math.round(point1.x / gs);
var newy = gs * Math.round(point1.y / gs);
var newPoint1 = new go.Point(newx, newy);
this.startPoint = newPoint1;
this.wallReshapingTool = tool.diagram.toolManager.mouseDownTools.elt(3);
// Default functionality:
this.isActive = true;
}
// When user clicks, add wall model data to model and initialize a Wall Reshaping Tool to handle the shaping of its construction
WallBuildingTool.prototype.doMouseDown = function () {
var diagram = this.diagram;
var tool = this;
tool.diagram.currentCursor = 'crosshair';
var data = { key: "wall", category: "WallGroup", caption: "Wall", type: "Wall", startpoint: tool.startPoint, endpoint: tool.startPoint, thickness: parseFloat(diagram.model.modelData.wallThickness), isGroup: true, notes: "" };
this.diagram.model.addNodeData(data);
var wall = diagram.findPartForKey(data.key);
diagram.updateWall(wall);
var part = diagram.findPartForData(data);
// set the TransactionResult before raising event, in case it changes the result or cancels the tool
tool.transactionResult = tool.name;
diagram.raiseDiagramEvent('PartCreated', part);
// start the wallReshapingTool, tell it what wall it's reshaping (more accurately, the shape that will have the reshape handle)
tool.wallReshapingTool.isEnabled = true;
diagram.select(part);
tool.wallReshapingTool.isBuilding = true;
tool.wallReshapingTool.adornedShape = part.findObject("SHAPE");
tool.wallReshapingTool.doActivate();
}
// If user presses Esc key, cancel the wall building
WallBuildingTool.prototype.doKeyDown = function () {
var diagram = this.diagram;
var e = diagram.lastInput;
if (e.key === "Esc") {
var wall = diagram.selection.first();
diagram.remove(wall);
diagram.pointNodes.iterator.each(function (node) { diagram.remove(node); });
diagram.dimensionLinks.iterator.each(function (link) { diagram.remove(link); });
diagram.pointNodes.clear();
diagram.dimensionLinks.clear();
this.doDeactivate();
}
go.Tool.prototype.doKeyDown.call(this);
}
// When the mouse moves, reshape the wall
WallBuildingTool.prototype.doMouseMove = function () {
this.wallReshapingTool.doMouseMove();
}
// End transaction
WallBuildingTool.prototype.doDeactivate = function () {
var diagram = this.diagram;
this.diagram.currentCursor = "";
this.diagram.isMouseCaptured = false;
this.wallReshapingTool.isEnabled = false;
this.wallReshapingTool.adornedShape = null;
this.wallReshapingTool.doDeactivate();
this.wallReshapingTool.isBuilding = false;
diagram.updateWallDimensions();
this.stopTransaction(this.name);
this.isActive = false; // Default functionality
}