I hope this does something like what you are looking for:
myDiagram.linkTemplate =
$(go.Link,
{
routing: go.Link.Orthogonal, // also works when Normal (not Orthogonal)
click: function(e, link) {
var mousePoint = e.documentPoint;
var segment = link.findClosestSegment(mousePoint);
var startPoint = link.points.elt(segment);
var endPoint = link.points.elt(segment + 1);
var linePoint = new go.Point().projectOntoLineSegmentPoint(startPoint, endPoint);
var fraction = 0; // assume segment is linear
if (Math.abs(startPoint.x-endPoint.x) < Math.abs(startPoint.y-endPoint.y)) {
fraction = (mousePoint.y - startPoint.y) / (endPoint.y - startPoint.y);
} else {
fraction = (mousePoint.x - startPoint.x) / (endPoint.x - startPoint.x);
}
e.diagram.commit(function(diag) {
var ad = $(go.Adornment, "Link");
var shape = $(go.Shape, "Circle", { width: 8, height: 8 });
ad.add(shape);
ad.adornedObject = link;
shape.segmentIndex = segment;
shape.segmentFraction = fraction;
if (!link.RightAdornment) { // check last Adornment added
shape.segmentOffset = new go.Point(0, 8);
shape.fill = "red";
link.addAdornment("Right", ad);
} else {
shape.segmentOffset = new go.Point(0, -8);
shape.fill = "green";
link.addAdornment("Left", ad);
}
link.RightAdornment = !link.RightAdornment;
}, null);
}
},
$(go.Shape),
$(go.Shape, { toArrow: "OpenTriangle" })
);