diff --git a/docs/network/nodes.html b/docs/network/nodes.html index 0a68ff55..ca2d9397 100644 --- a/docs/network/nodes.html +++ b/docs/network/nodes.html @@ -834,7 +834,7 @@ network.setOptions(options); ellipse, circle, database, box, text. Always scalable are: image, circularImage, diamond, dot, - star, triangle, triangleDown, square and + star, triangle, triangleDown, hexagon, square and icon. Keep in mind that when using scaling, the size option is neglected. @@ -975,7 +975,7 @@ mySize = minSize + diff * scale; ellipse, circle, database, box, text. The ones with the label outside of it are: image, circularImage, diamond, dot, star, triangle, - triangleDown, square and icon. + triangleDown, hexagon, square and icon. @@ -1031,7 +1031,7 @@ mySize = minSize + diff * scale; 25 The size is used to determine the size of node shapes that do not have the label inside of them. These shapes are: image, circularImage, diamond, dot, - star, triangle, triangleDown, square and + star, triangle, triangleDown, hexagon, square and icon diff --git a/lib/network/modules/components/Node.js b/lib/network/modules/components/Node.js index 26428e0d..19c8013b 100644 --- a/lib/network/modules/components/Node.js +++ b/lib/network/modules/components/Node.js @@ -12,6 +12,7 @@ var Ellipse = require('./nodes/shapes/Ellipse').default; var Icon = require('./nodes/shapes/Icon').default; var Image = require('./nodes/shapes/Image').default; var Square = require('./nodes/shapes/Square').default; +var Hexagon = require('./nodes/shapes/Hexagon').default; var Star = require('./nodes/shapes/Star').default; var Text = require('./nodes/shapes/Text').default; var Triangle = require('./nodes/shapes/Triangle').default; @@ -368,6 +369,9 @@ class Node { case 'square': this.shape = new Square(this.options, this.body, this.labelModule); break; + case 'hexagon': + this.shape = new Hexagon(this.options, this.body, this.labelModule); + break; case 'star': this.shape = new Star(this.options, this.body, this.labelModule); break; diff --git a/lib/network/modules/components/nodes/shapes/Hexagon.js b/lib/network/modules/components/nodes/shapes/Hexagon.js new file mode 100644 index 00000000..6f4618ff --- /dev/null +++ b/lib/network/modules/components/nodes/shapes/Hexagon.js @@ -0,0 +1,44 @@ +'use strict'; + +import ShapeBase from '../util/ShapeBase' + +/** + * A Hexagon Node/Cluster shape. + * + * @extends ShapeBase + */ +class Hexagon extends ShapeBase { + /** + * @param {Object} options + * @param {Object} body + * @param {Label} labelModule + */ + constructor(options, body, labelModule) { + super(options, body, labelModule) + } + + /** + * + * @param {CanvasRenderingContext2D} ctx + * @param {number} x width + * @param {number} y height + * @param {boolean} selected + * @param {boolean} hover + * @param {{toArrow: boolean, toArrowScale: (allOptions.edges.arrows.to.scaleFactor|{number}|allOptions.edges.arrows.middle.scaleFactor|allOptions.edges.arrows.from.scaleFactor|Array|number), toArrowType: *, middleArrow: boolean, middleArrowScale: (number|allOptions.edges.arrows.middle.scaleFactor|{number}|Array), middleArrowType: (allOptions.edges.arrows.middle.type|{string}|string|*), fromArrow: boolean, fromArrowScale: (allOptions.edges.arrows.to.scaleFactor|{number}|allOptions.edges.arrows.middle.scaleFactor|allOptions.edges.arrows.from.scaleFactor|Array|number), fromArrowType: *, arrowStrikethrough: (*|boolean|allOptions.edges.arrowStrikethrough|{boolean}), color: undefined, inheritsColor: (string|string|string|allOptions.edges.color.inherit|{string, boolean}|Array|*), opacity: *, hidden: *, length: *, shadow: *, shadowColor: *, shadowSize: *, shadowX: *, shadowY: *, dashes: (*|boolean|Array|allOptions.edges.dashes|{boolean, array}), width: *}} values + */ + draw(ctx, x, y, selected, hover, values) { + this._drawShape(ctx, 'hexagon', 4, x, y, selected, hover, values); + } + + /** + * + * @param {CanvasRenderingContext2D} ctx + * @param {number} angle + * @returns {number} + */ + distanceToBorder(ctx, angle) { + return this._distanceToBorder(ctx,angle); + } +} + +export default Hexagon; \ No newline at end of file diff --git a/lib/network/options.js b/lib/network/options.js index 3db878dd..06697f10 100644 --- a/lib/network/options.js +++ b/lib/network/options.js @@ -319,7 +319,7 @@ let allOptions = { y: { number }, __type__: { object, boolean: bool } }, - shape: { string: ['ellipse', 'circle', 'database', 'box', 'text', 'image', 'circularImage', 'diamond', 'dot', 'star', 'triangle', 'triangleDown', 'square', 'icon'] }, + shape: { string: ['ellipse', 'circle', 'database', 'box', 'text', 'image', 'circularImage', 'diamond', 'dot', 'star', 'triangle', 'triangleDown', 'square', 'icon', 'hexagon'] }, shapeProperties: { borderDashes: { boolean: bool, array }, borderRadius: { number }, @@ -466,7 +466,7 @@ let configureOptions = { x: [5, -30, 30, 1], y: [5, -30, 30, 1] }, - shape: ['ellipse', 'box', 'circle', 'database', 'diamond', 'dot', 'square', 'star', 'text', 'triangle', 'triangleDown'], + shape: ['ellipse', 'box', 'circle', 'database', 'diamond', 'dot', 'square', 'star', 'text', 'triangle', 'triangleDown','hexagon'], shapeProperties: { borderDashes: false, borderRadius: [6, 0, 20, 1], diff --git a/lib/network/shapes.js b/lib/network/shapes.js index e1665bba..42489254 100644 --- a/lib/network/shapes.js +++ b/lib/network/shapes.js @@ -320,5 +320,22 @@ if (typeof CanvasRenderingContext2D !== 'undefined') { } }; + /** + * Draw a Hexagon shape with 6 sides + * @param {Number} x horizontal center + * @param {Number} y vertical center + * @param {Number} r radius + */ + CanvasRenderingContext2D.prototype.hexagon = function (x, y, r) { + this.beginPath(); + var sides = 6; + var a = (Math.PI*2)/sides; + this.moveTo(x+r,y); + for (var i = 1; i < sides; i++) { + this.lineTo(x+r*Math.cos(a*i),y+r*Math.sin(a*i)); + } + this.closePath(); + }; + } diff --git a/test/Network.test.js b/test/Network.test.js index 8a5359b0..43a6d76f 100644 --- a/test/Network.test.js +++ b/test/Network.test.js @@ -190,7 +190,15 @@ describe('Network', function () { after(function() { - this.jsdom_global(); + try { + this.jsdom_global(); + } catch(e) { + if (e.message() === 'window is undefined') { + console.warning("'" + e.message() + "' happened again"); + } else { + throw e; + } + } });