Hi,
I want to link my node from link to its closest port while auto arranging the layout right now i am using this layout
//#region LayeredDigraphLayout
function ArrangingLDLayout() {
go.LayeredDigraphLayout.call(this);
this._singletons = null;
}
go.Diagram.inherit(ArrangingLDLayout, go.LayeredDigraphLayout);
ArrangingLDLayout.prototype.makeNetwork = function (coll) {
var net = go.LayeredDigraphLayout.prototype.makeNetwork.call(this, coll);
// delete all vertexes that have no edges
var singletons = new go.Set();
net.vertexes.each(function (v) {
if (v.edgesCount === 0 && v.node !== null) singletons.add(v.node);
});
singletons.each(function (n) {
net.deleteNode(n);
});
this._singletons = singletons; // remember for commitLayout
return net;
};
ArrangingLDLayout.prototype.commitLayout = function () {
go.LayeredDigraphLayout.prototype.commitLayout.call(this);
var p = this.arrangementOrigin.copy();
p.x += this.columnSpacing / 2; // horizontal indent
this.network.vertexes.each(function (v) {
var n = v.node;
if (n === null) return;
p.y = Math.max(p.y, n.actualBounds.bottom);
});
p.y += 50; // vertical spacing
var hspace = this.columnSpacing;
this._singletons.each(function (n) {
n.move(p);
p.x += n.actualBounds.width + 50; // horizontal spacing
});
};
//#endregion
and i want to link my nodes to its closest port when i apply this layout to my model
the link coming from ( A -> D ) is not linking for top its get link to right side i want to link to the closest port so that my link layout will get improved please let me know how would it is possible for node creation i am using this code
to create Port
function makePort(id, align, spot) {
var port = (go.Shape,
{
fill: "transparent",
stroke: null,
portId: id,
alignment: align,
cursor: "pointer",
fromSpot: spot,
fromLinkable: true,
fromLinkableDuplicates: true,
fromLinkableSelfNode: true,
toSpot: spot,
toLinkable: true,
toLinkableSelfNode: true,
toLinkableDuplicates: true,
mouseEnter: portMouseEnter,
mouseLeave: portMouseLeave,
toolTip: // define a tooltip for each node that displays the color as text
(go.Adornment, “Auto”,
(go.Shape, { fill: "#FFFFCC" }),
(go.TextBlock, { margin: 4 },
new go.Binding(“text”, “”, diagramInfo))
) // end of Adornment
});
if (align.equals(go.Spot.Top) || align.equals(go.Spot.Bottom)) {
port.height = 3;
port.stretch = go.GraphObject.Horizontal;
} else {
port.width = 3;
port.stretch = go.GraphObject.Vertical;
}
return port;
}
and for node
var nodeResizeAdornmentTemplate =
(go.Adornment, "Spot",
{ locationSpot: go.Spot.Right },
(go.Placeholder),
(go.Shape, { alignment: go.Spot.TopLeft, cursor: "nw-resize", desiredSize: new go.Size(6, 6), fill: "lightblue", stroke: "deepskyblue", maxSize: new go.Size(250, 150) }),
(go.Shape, { alignment: go.Spot.Top, cursor: “n-resize”, desiredSize: new go.Size(6, 6), fill: “lightblue”, stroke: “deepskyblue”, maxSize: new go.Size(250, 150) }),
$(go.Shape, { alignment: go.Spot.TopRight, cursor: “ne-resize”, desiredSize: new go.Size(6, 6), fill: “lightblue”, stroke: “deepskyblue”, maxSize: new go.Size(250, 150) }),
$(go.Shape, { alignment: go.Spot.Left, cursor: "w-resize", desiredSize: new go.Size(6, 6), fill: "lightblue", stroke: "deepskyblue", maxSize: new go.Size(250, 150) }),
$(go.Shape, { alignment: go.Spot.Right, cursor: "e-resize", desiredSize: new go.Size(6, 6), fill: "lightblue", stroke: "deepskyblue", maxSize: new go.Size(250, 150) }),
$(go.Shape, { alignment: go.Spot.BottomLeft, cursor: "se-resize", desiredSize: new go.Size(6, 6), fill: "lightblue", stroke: "deepskyblue", maxSize: new go.Size(250, 150) }),
$(go.Shape, { alignment: go.Spot.Bottom, cursor: "s-resize", desiredSize: new go.Size(6, 6), fill: "lightblue", stroke: "deepskyblue", maxSize: new go.Size(250, 150) }),
$(go.Shape, { alignment: go.Spot.BottomRight, cursor: "sw-resize", desiredSize: new go.Size(6, 6), fill: "lightblue", stroke: "deepskyblue", maxSize: new go.Size(250, 150) })
);
var nodeShape = "RoundedRectangle";
myDiagram.nodeTemplate =
$(go.Node, "Auto",
{ layoutConditions: go.Part.LayoutAdded | go.Part.LayoutRemoved, isLayoutPositioned: true, zOrder: 2 },
new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
{ resizable: false, resizeObjectName: "PANEL", resizeAdornmentTemplate: nodeResizeAdornmentTemplate, desiredSize: new go.Size(108, 67), minSize: new go.Size(108, 67), maxSize: new go.Size(220, 120) },
new go.Binding("angle").makeTwoWay(),
new go.Binding("position", "position", go.Point.parse).makeTwoWay(go.Point.stringify),
new go.Binding("desiredSize", "size", go.Size.parse).makeTwoWay(go.Size.stringify),
$(go.Shape, nodeShape,
{
portId: "",
parameter1: 2,
fill: nodebackground, stroke: nodeStroke, strokeWidth: 2,
spot1: new go.Spot(0, 0, 1, 1),
spot2: new go.Spot(1, 1, -1, 0),
minSize: new go.Size(95, 59),
maxSize: new go.Size(220, 120),
},
new go.Binding("strokeWidth", "isHighlighted", function (s, obj) {
}).ofObject(),
new go.Binding("stroke", "isHighlighted", function (s, obj) {
if (s && $scope.pathHighlight) { return "#bf31d8"; } else { if (obj.part.data.hasOwnProperty('AssociatedID')) { return "gray"; } else { return nodeStroke; } }
}).ofObject(),
new go.Binding("figure", "figure").makeTwoWay(),
new go.Binding("fill", "fill").makeTwoWay(),
new go.Binding("stroke", "stroke").makeTwoWay()
),
$(go.Panel, "Vertical",
{
alignment: go.Spot.Top,
stretch: go.GraphObject.Horizontal,
minSize: new go.Size(108, 67)
},
$(go.Panel, "Table",
{
background: "lightblue",
stretch: go.GraphObject.Horizontal,
width: 15.5, height: 13,
margin: new go.Margin(2, 3, 0, 3)
},
$(go.Shape, "StopSign", {
alignment: go.Spot.TopLeft, margin: 2,
fill: "red", width: 8, height: 8, stroke: null,
visible: visible
}, new go.Binding("visible", "visible").makeTwoWay()),
$("Button", {
alignment: go.Spot.Right,
width: 16,
height: 15,
margin: new go.Margin(0, 0, 0, 90),
click: add_IP_OP,
visible: false,
cursor: "pointer"
}, new go.Binding("visible", "stroke", function (color) {
if (color != "#00b9ff") {
if (color == "gray" && MbtDiagramInstance.getModelTitleName != "Published Model")
return true;
else
return false;
}
}),
$(go.TextBlock, {
text: '',
textAlign: "center",
font: '10px FontAwesome'
}),
)),
$(go.TextBlock,
{
font: "12px Arial, sans-serif", //stroke: lightText,
margin: new go.Margin(4, 6, 4, 6),
stretch: go.GraphObject.Horizontal, textAlign: "center",
height: 38,
maxLines: 3,
verticalAlignment: go.Spot.Center,
editable: true, isMultiline: true, //textValidation: validateText,
textEdited: function (textBlock, previousText, currentText) {
},
},
new go.Binding("text", "text").makeTwoWay())),
{ contextMenu: $(go.Adornment) },
makePort("T", go.Spot.Top, go.Spot.TopSide),
makePort("L", go.Spot.Left, go.Spot.LeftSide),
makePort("R", go.Spot.Right, go.Spot.RightSide),
makePort("B", go.Spot.Bottom, go.Spot.BottomSide)
);