Prevent two connections from sharing the same anchor

自作多情 提交于 2019-12-23 19:08:44

问题


I am using jsPlumb to allow users to build graphs. I allow users to drag these elements around, so I'm using a collection of anchors for each endpoint, letting jsPlumb pick the "best" anchor from that collection for me when connections are made. The problem I'm having is that I can potentially have up to a dozen connections coming from any given endpoint, so these connections will become visually distracting when many end up choosing the same "best" anchor - creating an appearance of congestion in the graph. To resolve this problem, I would like to tell jsPlumb to restrict any two connections from sharing the same anchor on an endpoint.

The easiest way to visualize what I hope to achieve is in this demo: https://jsplumbtoolkit.com/community/demo/dynamicAnchors/index.html

Out of the box, none of the connections in this demo will overlap.

If you read the source code, you can see this is done by having a 'source' set of anchors and a 'target' set of anchors and connections are exclusively made from the first set of anchors to the second. However, as I stated above, I can have up to a dozen types of connections that can connect from or to my endpoints, so I do not want to have to specify a unique set of anchors for each of them. That would restrict the amount of spacing I can leave between each potential anchor along the endpoint's edge, since each set of anchors could not intersect with any other set of anchors.

Is there a way to tell jsPlumb that I don't want connections to share the same anchors?


回答1:


jsPlumb.bind('connection',function(info){
 var con=info.connection;
 var arr=jsPlumb.select({source:con.sourceId,target:con.targetId});
 if(arr.length>1){
    jsPlumb.detach(con);
 }
});

A concise one with the updated API of jsPlumb.

See if there is another connection with same source & target exists, if yes then detach the newly created one. (jsPlumb ver. 1.5.5 - 1.6.1)

Update:

Use jsPlumb.deleteConnection instead of jsPlumb.detach, in versions after than 2.4




回答2:


Is there a way to tell jsPlumb that I don't want connections to share the same anchors?

Demo with JS Fiddle

JQuery

jsPlumb.bind("jsPlumbConnection", function (CurrentConnection) {
    var DuplicateCount = 0;
    var allConn = jsPlumb.getAllConnections();
    var length = allConn["green dot"].length;
    for (var i = 0; i < length; i++) {
        if (allConn["green dot"][i].targetId ==               
                                         CurrentConnection.connection.targetId) {
            DuplicateCount = DuplicateCount + 1;
        }
    }
    if (DuplicateCount > 1) {
        jsPlumb.detach(CurrentConnection.connection);
        return;
    } 
});

You can connect Pink with Green. Pink with Pink and Green with Pink and Green with Green not allowed.



来源:https://stackoverflow.com/questions/15030762/prevent-two-connections-from-sharing-the-same-anchor

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!