Grid Patterns
It is common to want to display a grid of lines drawn at regular intervals. You may also want to force dragged parts to be aligned on grid points, and to resize parts to be multiples of the grid cell size.
Default Grid
To display a grid pattern in the background of the diagram, you can just make the Diagram.grid visible:
diagram.grid.visible = true; diagram.initialContentAlignment = go.Spot.Center; diagram.nodeTemplate = $(go.Node, "Auto", $(go.Shape, "Rectangle", { fill: "lightgray" }), $(go.TextBlock, { margin: 5}, new go.Binding("text", "key")) ); var nodeDataArray = [ { key: "Alpha" }, { key: "Beta" }, { key: "Gamma" } ]; diagram.model = new go.GraphLinksModel(nodeDataArray);
Grid Snapping
The DraggingTool and ResizingTool can change their behavior based on the background grid pattern, if you set the DraggingTool.isGridSnapEnabled and/or ResizingTool.isGridSnapEnabled properties to true.
diagram.grid.visible = true; diagram.toolManager.draggingTool.isGridSnapEnabled = true; diagram.toolManager.resizingTool.isGridSnapEnabled = true; diagram.initialContentAlignment = go.Spot.Center; diagram.nodeTemplate = $(go.Node, "Auto", { resizable: true }, $(go.Shape, "Rectangle", { fill: "lightgray" }), $(go.TextBlock, { margin: 5}, new go.Binding("text", "key")) ); var nodeDataArray = [ { key: "Alpha" }, { key: "Beta" }, { key: "Gamma" } ]; diagram.model = new go.GraphLinksModel(nodeDataArray);
Simple Grid Customization
You can change the size of the grid cell by setting Panel.gridCellSize:
diagram.grid.visible = true; diagram.grid.gridCellSize = new go.Size(30, 20); diagram.toolManager.draggingTool.isGridSnapEnabled = true; diagram.toolManager.resizingTool.isGridSnapEnabled = true; diagram.initialContentAlignment = go.Spot.Center; diagram.nodeTemplate = $(go.Node, "Auto", { resizable: true }, $(go.Shape, "Rectangle", { fill: "lightgray" }), $(go.TextBlock, { margin: 5}, new go.Binding("text", "key")) ); var nodeDataArray = [ { key: "Alpha" }, { key: "Beta" }, { key: "Gamma" } ]; diagram.model = new go.GraphLinksModel(nodeDataArray);
The cell size used when snapping the locations of Parts during a drag need not be exactly the same as the background grid's cell size. The value of DraggingTool.gridSnapCellSize takes precedence over the Panel.gridCellSize.
diagram.grid.visible = true; diagram.toolManager.draggingTool.isGridSnapEnabled = true; diagram.toolManager.resizingTool.isGridSnapEnabled = true; // snap to every other point both vertically and horizontally // (the default background grid has a cell size of 10x10) diagram.toolManager.draggingTool.gridSnapCellSize = new go.Size(20, 20); diagram.initialContentAlignment = go.Spot.Center; diagram.nodeTemplate = $(go.Node, "Auto", { resizable: true }, $(go.Shape, "Rectangle", { fill: "lightgray" }), $(go.TextBlock, { margin: 5}, new go.Binding("text", "key")) ); var nodeDataArray = [ { key: "Alpha" }, { key: "Beta" }, { key: "Gamma" } ]; diagram.model = new go.GraphLinksModel(nodeDataArray);
Custom Grids
Grid patterns are implemented by the Panel class when its Panel.type is Panel.Grid. The elements of a Grid Panel must be Shapes whose Shape.figure is one of a small set of known kinds of figures.
diagram.grid = $(go.Panel, go.Panel.Grid, // or "Grid" { gridCellSize: new go.Size(25, 25) }, $(go.Shape, "LineH", { stroke: "blue" }), $(go.Shape, "LineV", { stroke: "green" }) );
The Shape.interval property is also used by a Grid Panel to determine how frequently a line should be drawn. The value should be a positive integer specifying how many cells there are between drawings of this particular line.
diagram.grid = $(go.Panel, "Grid", { gridCellSize: new go.Size(10, 10) }, $(go.Shape, "LineH", { stroke: "lightblue" }), $(go.Shape, "LineV", { stroke: "lightgreen" }), $(go.Shape, "LineH", { stroke: "blue", interval: 5 }), $(go.Shape, "LineV", { stroke: "green", interval: 5 }) ); diagram.initialContentAlignment = go.Spot.Center; diagram.nodeTemplate = $(go.Node, "Auto", { resizable: true }, $(go.Shape, "Rectangle", { fill: "lightgray" }), $(go.TextBlock, { margin: 5}, new go.Binding("text", "key")) ); var nodeDataArray = [ { key: "Alpha" } ]; diagram.model = new go.GraphLinksModel(nodeDataArray);