Сохраните и загрузите блок-схему на jsPlumb

Как лучше всего сохранить и загрузить блок-схему на jsPlumb?


person Diogo Cardoso    schedule 13.09.2011    source источник
comment
stackoverflow.com/q/20620719/453767   -  person Amit Kumar Gupta    schedule 14.05.2014


Ответы (5)


Мне удалось сохранить диаграмму, просто поместив все элементы в массив объектов, где каждый объект имеет исходные и целевые узлы, координаты x, y.

При сохранении просто выполните JSON.stringify(whole_object), а при загрузке просто JSON.parse() и вручную расположите узлы и соедините их.

person lukas.pukenis    schedule 27.05.2012
comment
не могли бы вы поделиться кодом? Я запутался в том, как загрузить и подключить их. - person coding_idiot; 04.04.2014
comment
О.. Это было давно, но насколько я помню, просто сохраняйте данные с помощью JSON.stringify(objectCollection). Есть отношения, позиции и т. д. Теперь, когда вы хотите загрузить, выполните JSON.parse(generatedStrnig), а затем вручную просмотрите каждый узел в объекте, расположите его (с помощью CSS) и соедините их (с помощью API jsPlumb). Извините, точно не помню :) - person lukas.pukenis; 04.04.2014

Мое решение сохраняет и загружает jsPlumb:

function Save() {
    $(".node").resizable("destroy");
    Objs = [];
    $('.node').each(function() {
        Objs.push({id:$(this).attr('id'), html:$(this).html(),left:$(this).css('left'),top:$(this).css('top'),width:$(this).css('width'),height:$(this).css('height')});
    });
    console.log(Objs);
}


function Load() {
    var s="";
    for(var i in Objs) {
        var o = Objs[i];
        console.log(o);
        s+='<div id="'+ o.id+'" class="node" style="left:'+ o.left+'; top:'+ o.top+'; width:'+ o.width +'; height:'+ o.height +' "> '+ o.html+'</div>';
    }
    $('#main').html(s);
}

Демонстрация UPD: http://jsfiddle.net/Rra6Y/137/

Примечание: если демо не работает в JsFiddle, убедитесь, что оно указывает на существующую ссылку jsPlumb (ссылки перечислены в пункте меню JsFiddle «Внешние ресурсы»).

person sergi0    schedule 23.05.2013
comment
Привет и спасибо за эти подсказки. Я просто пытаюсь создать онлайн-конструктор конечного автомата с помощью jsplumb, и для правильного сохранения/загрузки мне нужно передать больше данных, чем html, который вы добавили в мой массив. Что-то вроде названия штата, connectTo и так далее. Знаете, что-то, что на самом деле спасло бы мою конечную машину, а не только мой рисунок. Возможно, у вас есть подсказка, как это сделать? было бы замечательно! - person Dominik; 27.06.2013
comment
ссылка jsfiddle не работает. Невозможно перетащить, и соединения не создаются. В консоли есть ошибки для сохранения, загрузки и очистки. - person coding_idiot; 04.04.2014

Моя функция сохранения делает немного больше, чем просто сохраняет положение x, y элемента и его соединения. Я также добавил сохранение наложения метки соединения, а также пользовательского текста для каждого элемента. Вы можете адаптировать это решение в соответствии с вашими требованиями, но в основном это:

   //save functionality
    function IterateDrawnElements(){  //part of save
        var dict = {};
        $('#id_diagram_container').children('div.window').each(function () {
            var pos = $(this).position()
            var diagram_label = $(this).children('div.asset-label').children('div.asset-diagram-label').text()
            if (diagram_label == null || diagram_label == ''){
                diagram_label='';
            }
            dict[this.id] = [pos.left, pos.top, diagram_label];
        });
        return dict;
    }
    function IterateConnections(){  //part of save
        var list = [];
        var conns = jsPlumb.getConnections()
        for (var i = 0; i < conns.length; i++) {
            var source = conns[i].source.id;
            var target = conns[i].target.id;
            try{
                var label = conns[i].getOverlay("label-overlay").labelText;
            }
            catch(err) {
                label = null
            }
            //list.push([source, target])
            if (source != null && target != null){
                list.push([source, target, label]);
            };
        }
        return list;
    }

Я инициирую все это, когда пользователь нажимает кнопку сохранения, ajax-вызов возвращается на сервер, в этом случае Django перехватывает ajax-запрос и сохраняет данные в базу данных.

// вызов ajax при нажатии кнопки сохранения $save_btn.click(function() {

//drawn elements
var d_elements = IterateDrawnElements();
var d_conns = IterateConnections();
var d_name =$('#id_diagram_name').val();

$.ajax({
    url : ".",
    type : "POST",
    dataType: "json",
    data : {
        drawn_elements: JSON.stringify(d_elements),
        conns: JSON.stringify(d_conns),
        diagram_name: d_name,
        csrfmiddlewaretoken: '{{ csrf_token }}'
    },
    success: function (result) {

        if (result.success == true){
            save_status.html(result.message)
        }
        //console.log(JSON.stringify(result));
        $save_btn.attr('disabled','disabled');
        if (result.old_name != false){
            //alert()
            $('#id_diagram_name').val(result.old_name)
        }
    },
    error: function(xhr, textStatus, errorThrown) {
        alert("Please report this error: "+errorThrown+xhr.status+xhr.responseText);
    }
});
//return false; // always return error?

});

Загрузить все это еще проще, и есть много способов сделать это. В Django вы можете просто сгенерировать html прямо в своем шаблоне, а также js для соединений, или вы можете создать объект JSON в javascript для всего, а затем javascript отрисует все это на основе массива. Я использовал jquery для этого.

//js & connections load

var asset_conns = [
    {% for conn in diagram_conns  %}
    [ {{ conn.source.id }}, {{ conn.target.id }}, '{{ conn.name }}' ],
    {% endfor %}
]


// Takes loaded connections and connects them
for (var i = 0; i< asset_conns.length; i++){
    var source = asset_conns[i][0].toString();
    var target = asset_conns[i][1].toString();
    var label = asset_conns[i][2];
    var c = jsPlumb.connect({source: source, target: target, detachable:true, reattach: true });  //on init already know what kind of anchor to use!
    if (label != null && label != 'None'){
        c.addOverlay([ "Label", { label: label,  id:"label-overlay"} ]);
    }
}

//html right into django template to draw elements, asset element interchangeable terms

{% for element in drawn_elements %}
    <div id="{{ element.asset.id }}" class="window" style="left:{{ element.left }}px;top:{{ element.top }}px;background-image: url('{% static element.asset.asset_mold.image.url %}'); width: {{ element.asset.asset_mold.image.width }}px;height: {{ element.asset.asset_mold.image.height }}px;">
        <div class="asset-label" id="label-{{ element.asset.id }}">
            {#{{ element.asset }}#}<a class="lbl-link" id="lbl-link-{{ element.asset.id }}" href="{{ element.asset.get_absolute_url }}">{{ element.asset }}</a>
            <div class='asset-diagram-label' id="lbl-{{ element.asset.id }}">{% if element.asset.diagram_label  %}{{ element.asset.diagram_label }}{% endif %}</div>
        </div>
        <div class='ep' id="ep-{{ element.asset.id }}"></div>
    </div>
{% endfor %}

Вы можете значительно упростить это, но у меня также есть фон для элемента, а также метка и форма элемента для использования с якорями по периметру. Это решение работает и проверено. Я скоро выпущу для этого приложение Djago с открытым исходным кодом на PyPi.

person radtek    schedule 20.05.2014

Я использую YUI с ним. Я сохраняю положение каждого элемента коробки, связанного в таблице. У них есть отдельная таблица, в которой хранятся отношения между родительскими и дочерними элементами между элементами, которые используются для определения линий, которые должен рисовать jsPlumb. Я определяю это с помощью процесса выбора, в котором первый выбранный элемент является родительским, а все остальные элементы являются дочерними. При нажатии кнопки «подключиться» выбор родительских/дочерних элементов очищается. Я также переключаю это, если вы щелкаете по выбранному родителю — он также очищает выбор дочерних элементов.

person JasonMichael    schedule 16.09.2011

Недавно я написал этот пост в блоге о том, почему jsPlumb не имеет функции сохранения (и что я рекомендую вам сделать):

http://jsplumb.tumblr.com/post/11297005239/why-doesnt-jsplumb-offer-a-save-function

...может кому пригодится.

person Community    schedule 08.11.2011
comment
Люди ищут простой способ сказать: сохраните эту диаграмму в xml/json или сохраните ее каким-либо другим способом, который можно легко проанализировать и сопоставить для обновления модели данных... Кажется, что это очевидная вещь для удобства использования. . Похоже, то, что вы здесь описали, заставит меня предпринять много надоедливых дополнительных шагов, чтобы добраться туда, куда я хочу. - person Brian MacKay; 23.08.2012