gpt4 book ai didi

javascript - 保存和加载 jsPlumb 流程图,包括精确的 anchor 和连接

转载 作者:行者123 更新时间:2023-12-03 06:47:12 24 4
gpt4 key购买 nike

这是jsFiddle我正在构建的流程图编辑器的一部分。

这是一个可以通过“添加决策”+“添加任务”连接和移动元素轻松创建的示例。

Example flowchart - user configured

现在是最困难的部分:我希望能够保存和加载确切的流程图。为此,我开始基于 similar thread位于 Stackoverflow。

为此,我添加了“保存”和“加载”按钮,用于将流程图导出到 JSON 或从 JSON 导入流程图(保存后以文本形式显示在 jsFiddle 中 - 可以使用相同的文本形式进行加载)。

保存功能:

function saveFlowchart(){
var nodes = []
$(".node").each(function (idx, elem) {
var $elem = $(elem);
var endpoints = jsPlumb.getEndpoints($elem.attr('id'));
console.log('endpoints of '+$elem.attr('id'));
console.log(endpoints);
nodes.push({
blockId: $elem.attr('id'),
nodetype: $elem.attr('data-nodetype'),
positionX: parseInt($elem.css("left"), 10),
positionY: parseInt($elem.css("top"), 10)
});
});
var connections = [];
$.each(jsPlumb.getConnections(), function (idx, connection) {
connections.push({
connectionId: connection.id,
pageSourceId: connection.sourceId,
pageTargetId: connection.targetId
});
});

var flowChart = {};
flowChart.nodes = nodes;
flowChart.connections = connections;
flowChart.numberOfElements = numberOfElements;

var flowChartJson = JSON.stringify(flowChart);
//console.log(flowChartJson);

$('#jsonOutput').val(flowChartJson);
}

上面示例的结果 JSON:

{"nodes":[{"blockId":"startpoint","nodetype":"startpoint","positionX":273,"positionY":8},{"blockId":"endpoint","nodetype":"endpoint","positionX":310,"positionY":385},{"blockId":"taskcontainer1","nodetype":"task","positionX":381,"positionY":208},{"blockId":"decisioncontainer2","nodetype":"decision","positionX":261,"positionY":103}],"connections":[{"connectionId":"con_18","pageSourceId":"decisioncontainer2","pageTargetId":"taskcontainer1"},{"connectionId":"con_25","pageSourceId":"taskcontainer1","pageTargetId":"endpoint"},{"connectionId":"con_32","pageSourceId":"decisioncontainer2","pageTargetId":"endpoint"},{"connectionId":"con_46","pageSourceId":"startpoint","pageTargetId":"decisioncontainer2"}],"numberOfElements":2}

这样我就可以保存元素的位置以及部分连接信息。这里是加载函数:

function loadFlowchart(){
var flowChartJson = $('#jsonOutput').val();
var flowChart = JSON.parse(flowChartJson);
var nodes = flowChart.nodes;
$.each(nodes, function( index, elem ) {
if(elem.nodetype === 'startpoint'){
repositionElement('startpoint', elem.positionX, elem.positionY);
}else if(elem.nodetype === 'endpoint'){
repositionElement('endpoint', elem.positionX, elem.positionY);
}else if(elem.nodetype === 'task'){
var id = addTask(elem.blockId);
repositionElement(id, elem.positionX, elem.positionY);
}else if(elem.nodetype === 'decision'){
var id = addDecision(elem.blockId);
repositionElement(id, elem.positionX, elem.positionY);
}else{

}
});

var connections = flowChart.connections;
$.each(connections, function( index, elem ) {
var connection1 = jsPlumb.connect({
source: elem.pageSourceId,
target: elem.pageTargetId,
anchors: ["BottomCenter", [0.75, 0, 0, -1]]

});
});

numberOfElements = flowChart.numberOfElements;
}

但是, anchor 和连接的确切位置会丢失。还是同样的例子,删除元素然后加载导出的 JSON 后的结果:

Flowchart after loading JSON

这并不令人意外,因为我还没有存储这些信息。但我现在陷入困境。

我的问题是:我需要为整个流程图设计存储哪些有关 anchor /连接器位置的信息以及如何从 jsPlumb 中提取它(并再次加载到其中)?

最佳答案

查看此JSFiddle寻求解决方案。

您需要按如下方式保存 anchor 详细信息。这符合定义的 anchor 表示 here 。请注意双重嵌套,以避免 JQuery 在 map 上自动展平。

    $.each(jsPlumb.getConnections(), function (idx, connection) {
connections.push({
connectionId: connection.id,
pageSourceId: connection.sourceId,
pageTargetId: connection.targetId,
anchors: $.map(connection.endpoints, function(endpoint) {

return [[endpoint.anchor.x,
endpoint.anchor.y,
endpoint.anchor.orientation[0],
endpoint.anchor.orientation[1],
endpoint.anchor.offsets[0],
endpoint.anchor.offsets[1]]];

})
});
});

...并加载它们,如下所示:

    $.each(connections, function( index, elem ) {
var connection1 = jsPlumb.connect({
source: elem.pageSourceId,
target: elem.pageTargetId,
anchors: elem.anchors
});

});

请注意,此解决方案不保留端点详细信息,包括端点的形状和类型。它仅按照您的要求保留 anchor 详细信息。

关于javascript - 保存和加载 jsPlumb 流程图,包括精确的 anchor 和连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20620719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com