gojs
Version:
Interactive diagrams, charts, and graphs, such as trees, flowcharts, orgcharts, UML, BPMN, or business diagrams
198 lines (187 loc) • 8.06 kB
JavaScript
/*
* Copyright (C) 1998-2023 by Northwoods Software Corporation
* All Rights Reserved.
*
* FLOOR PLANNER CODE: TEMPLATES - FURNITURE
* GraphObject templates for interactional furniture nodes (and their dependecies) used in the Floor Planner sample
* Includes Default Node (Furniture), MultiPurpose Node
*/
/*
* Furniture Node Dependencies:
* Node Tool Tip, Furniture Resize Adornment Template, Furniture Rotate Adornment Template, Invert Color
*/
// Node Tool Tip
function makeNodeToolTip() {
var $ = go.GraphObject.make;
return $(go.Adornment, "Auto",
$(go.Shape, { fill: "#FFFFCC" }),
$(go.TextBlock, { margin: 4 },
new go.Binding("text", "", function (text, obj) {
var data = obj.part.adornedObject.data;
var name = (obj.part.adornedObject.category === "MultiPurposeNode") ? data.text : data.caption;
return "Name: " + name + "\nNotes: " + data.notes;
}).ofObject())
)
}
// Furniture Resize Adornment
function makeFurnitureResizeAdornmentTemplate() {
var $ = go.GraphObject.make;
function makeHandle(alignment, cursor) {
return $(go.Shape, { alignment: alignment, cursor: cursor, figure: "Rectangle", desiredSize: new go.Size(7, 7), fill: "#ffffff", stroke: "#808080" },
new go.Binding("fill", "color"),
new go.Binding("stroke", "stroke"));
}
return $(go.Adornment, "Spot",
$(go.Placeholder),
makeHandle(go.Spot.Top, "n-resize"),
makeHandle(go.Spot.TopRight, "n-resize"),
makeHandle(go.Spot.BottomRight, "se-resize"),
makeHandle(go.Spot.Right, "e-resize"),
makeHandle(go.Spot.Bottom, "s-resize"),
makeHandle(go.Spot.BottomLeft, "sw-resize"),
makeHandle(go.Spot.Left, "w-resize"),
makeHandle(go.Spot.TopLeft, "nw-resize")
);
}
// Furniture Rotate Adornment
function makeFurnitureRotateAdornmentTemplate() {
var $ = go.GraphObject.make;
return $(go.Adornment,
$(go.Shape, "Circle", { cursor: "pointer", desiredSize: new go.Size(7, 7), fill: "#ffffff", stroke: "#808080" },
new go.Binding("fill", "", function (obj) { return (obj.adornedPart === null) ? "#ffffff" : obj.adornedPart.data.color; }).ofObject(),
new go.Binding("stroke", "", function (obj) { return (obj.adornedPart === null) ? "#000000" : obj.adornedPart.data.stroke; }).ofObject())
);
}
// Return inverted color (in hex) of a given hex code color; used to determine furniture node stroke color
function invertColor(hexnum) {
if (hexnum.includes('#')) hexnum = hexnum.substring(1);
if (hexnum.length != 6) {
console.error("Hex color must be six hex numbers in length.");
return false;
}
hexnum = hexnum.toUpperCase();
var splitnum = hexnum.split("");
var resultnum = "";
var simplenum = "FEDCBA9876".split("");
var complexnum = new Array();
complexnum.A = "5";
complexnum.B = "4";
complexnum.C = "3";
complexnum.D = "2";
complexnum.E = "1";
complexnum.F = "0";
for (i = 0; i < 6; i++) {
if (!isNaN(splitnum[i])) {
resultnum += simplenum[splitnum[i]];
} else if (complexnum[splitnum[i]]) {
resultnum += complexnum[splitnum[i]];
} else {
console.error("Hex colors must only include hex numbers 0-9, and A-F");
return false;
}
}
return '#' + resultnum;
}
/*
* Furniture Node Templates:
* Default Node, MultiPurpose Node
*/
// Default Node
function makeDefaultNode() {
var $ = go.GraphObject.make;
return $(go.Node, "Spot",
{
resizable: true,
rotatable: true,
toolTip: makeNodeToolTip(),
resizeAdornmentTemplate: makeFurnitureResizeAdornmentTemplate(),
rotateAdornmentTemplate: makeFurnitureRotateAdornmentTemplate(),
contextMenu: makeContextMenu(),
locationObjectName: "SHAPE",
resizeObjectName: "SHAPE",
rotateObjectName: "SHAPE",
minSize: new go.Size(5, 5),
locationSpot: go.Spot.Center,
selectionAdorned: false, // use a Binding on the Shape.stroke to show selection
doubleClick: function (e) {
if (e.diagram.floorplanUI) e.diagram.floorplanUI.hideShow("selectionInfoWindow")
}
},
// remember Node location
new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
// move selected Node to Foreground layer so it's not obscuerd by non-selected Parts
new go.Binding("layerName", "isSelected", function (s) {
return s ? "Foreground" : "";
}).ofObject(),
$(go.Shape,
{
name: "SHAPE", stroke: "#000000",
fill: "rgba(128, 128, 128, 0.5)"
},
new go.Binding("figure", "shape"),
new go.Binding("geometryString", "geo"),
new go.Binding("width").makeTwoWay(),
new go.Binding("height").makeTwoWay(),
new go.Binding("angle").makeTwoWay(),
new go.Binding("fill", "color"),
new go.Binding("stroke", "isSelected", function (s, obj) {
return s ? go.Brush.lightenBy(obj.stroke, .5) : invertColor(obj.part.data.color);
}).ofObject())
)
}
// MultiPurpose Node
function makeMultiPurposeNode() {
var $ = go.GraphObject.make;
return $(go.Node, "Spot",
{
contextMenu: makeContextMenu(),
toolTip: makeNodeToolTip(),
locationSpot: go.Spot.Center,
resizeAdornmentTemplate: makeFurnitureResizeAdornmentTemplate(),
rotateAdornmentTemplate: makeFurnitureRotateAdornmentTemplate(),
locationObjectName: "SHAPE",
resizable: true,
rotatable: true,
resizeObjectName: "SHAPE",
rotateObjectName: "SHAPE",
minSize: new go.Size(5, 5),
selectionAdorned: false,
doubleClick: function (e) {
if (e.diagram.floorplanUI) e.diagram.floorplanUI.hideShow("selectionInfoWindow")
}
},
// remember location, angle, height, and width of the node
new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
// move a selected part into the Foreground layer so it's not obscuerd by non-selected Parts
new go.Binding("layerName", "isSelected", function (s) { return s ? "Foreground" : ""; }).ofObject(),
$(go.Shape,
{ strokeWidth: 1, name: "SHAPE", fill: "rgba(128, 128, 128, 0.5)", },
new go.Binding("angle").makeTwoWay(),
new go.Binding("width").makeTwoWay(),
new go.Binding("height").makeTwoWay(),
new go.Binding("fill", "color"),
new go.Binding("stroke", "isSelected", function (s, obj) {
return s ? go.Brush.lightenBy(obj.stroke, .5) : invertColor(obj.part.data.color);
}).ofObject()
),
$(go.TextBlock,
{
margin: 5,
wrap: go.TextBlock.WrapFit,
textAlign: "center",
editable: true,
isMultiline: false,
stroke: '#454545',
font: "10pt sans-serif"
},
new go.Binding("text").makeTwoWay(),
new go.Binding("angle", "angle").makeTwoWay(),
new go.Binding("font", "height", function (height) {
if (height > 25) return "10pt sans-serif";
if (height < 25 && height > 15) return "8pt sans-serif";
else return "6pt sans-serif";
}),
new go.Binding("stroke", "color", function (color) { return invertColor(color); })
)
)
}