2017-09-21 3 views
0

Ich habe ein Diagramm (source credit) wo ich einen (oder mehrere) Knoten und seine verbundenen Kanten auswählen kann (die Kanten werden blau, wenn ich auswählen ein Knoten). Nun, wie muss ich vorgehen, wenn ich einen neuen Graphen zeigen wollte, der aus den ausgewählten Knoten und Kanten besteht, wenn ich mit der rechten Maustaste auf einen der bereits ausgewählten Knoten klicke?cytoscape.js zeigen ausgewählte Knoten und Kanten in einem neuen Diagramm mit der rechten Maustaste

Hier ist, was ich bisher getan habe:

cytoscape.js von here

index.html:

<!doctype html> 
<!-- source: http://blog.js.cytoscape.org/public/demos/getting-started/index-layout.html --> 

<html> 

<head> 
    <meta charset="utf-8"></meta> 
    <title>Tutorial 1: Getting Started</title> 
    <script src="cytoscape.js"></script> 
</head> 

<style> 
    #cy { 
     width: 100%; 
     height: 100%; 
     position: absolute; 
     top: 0px; 
     left: 0px; 
    } 
</style> 

<body> 
    <div id="cy"></div> 
    <script> 
     var cy = cytoscape({ 
      container: document.getElementById('cy'), 
      elements: [ 
      // nodes 
      { data: { id: 'a' } }, 
      { data: { id: 'b' } }, 
      { data: { id: 'c' } }, 
      { data: { id: 'd' } }, 
      { data: { id: 'e' } }, 
      { data: { id: 'f' } }, 
      // edges 
      { 
       data: { 
       id: 'ab', 
       source: 'a', 
       target: 'b' 
       } 
      }, 
      { 
       data: { 
       id: 'cd', 
       source: 'c', 
       target: 'd' 
       } 
      }, 
      { 
       data: { 
       id: 'ef', 
       source: 'e', 
       target: 'f' 
       } 
      }, 
      { 
       data: { 
       id: 'ac', 
       source: 'a', 
       target: 'c' 
       } 
      }, 
      { 
       data: { 
       id: 'be', 
       source: 'b', 
       target: 'e' 
       } 
      } 
      ], 
      style: [ 
      { 
       selector: 'node', 
       style: { 
       shape: 'vee', 
       'background-color': '#A60059', 
       label: 'data(id)' 
       } 
      }], 

      layout: { 
      name: 'grid' 
      } 
     }); 


     cy.on('select', 'node', function(evt){ 
      evt.cyTarget.connectedEdges().animate({ 
      style: { lineColor: 'blue' } 
      }); 
     }); 

     /* cy.on('cxttap', 'node', function(evt) { 
     evt.cyTarget.connectedEdges().animate({ 
     style: {lineColor: 'green'} 
     }); 
     });*/ 

    </script> 
</body> 

Die cy.on('cxttap','node', function()...) kommentiert zeigt die Ereignisbehandlung, die Kanten in grüne Farbe zu drehen, wenn rechts- Klicken Sie auf einen Knoten. Aber wie bekomme ich alle zuvor ausgewählten Knoten und Kanten in einen neuen Graphen (und lade ihn ein)? Ich habe this Post, gesehen, die sagt, dass man etw wie verwenden hat:

cy.$(':selected').jsons()

Aber ehrlich gesagt, ich bin ein bisschen, wie das zu tun verloren. Jede Hilfe wäre sehr willkommen.

EDIT:

OK, also mit dem Hauch von maxkfranz, konnte ich die ausgewählten Knoten (und die Kanten) an einem anderen Graphen cy2 erhalten. Wenn ich also mehrere Knoten auswähle ("Strg + Ziehen-Auswahl-über-Knoten") und dann mit der rechten Maustaste auf einen der ausgewählten Knoten klicke, werden diese in einem anderen Diagramm in ein neues Diagramm gezeichnet. Hier ist meine aktualisierte Code (Daten jetzt wird von einer externen json-Datei geladen):

testdata.json:

{ "nodes" : [ 
     {"data": {"id": "a"}}, 
     {"data": {"id": "b"}}, 
     {"data": {"id": "c"}}, 
     {"data": {"id": "d"}}, 
     {"data": {"id": "e"}}, 
     {"data": {"id": "f"}} 
    ], 

    "edges" : [ 
     { 
     "data": { 
     "id": "ab", 
     "source": "a", 
     "target": "b" 
     } 
     }, 
     { 
     "data": { 
     "id": "cd", 
     "source": "c", 
     "target": "d" 
     } 
     }, 
     { 
     "data": { 
     "id": "ef", 
     "source": "e", 
     "target": "f" 
     } 
     }, 
     { 
     "data": { 
     "id": "ac", 
     "source": "a", 
     "target": "c" 
     } 
     }, 
     { 
     "data": { 
     "id": "be", 
     "source": "b", 
     "target": "e" 
     } 
     } 
    ] 

} 

index.html:

<!doctype html> 
<!-- source: http://blog.js.cytoscape.org/public/demos/getting-started/index-layout.html --> 

<html> 

<head> 
    <meta charset="utf-8"></meta> 
    <title>Tutorial 1: Getting Started</title> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
    <script src="cytoscape.js"></script> 
</head> 

<style> 
    #cy { 
     width: 50%; 
     height: 50%; 
     position: absolute; 
     top: 0px; 
     left: 0px; 
    } 

    #cy2 { 
     width: 50%; 
     height: 50%; 
     position: absolute; 
     top: 0px; 
     right: 0px; 
    } 
</style> 

<body> 
    <div id="cy"></div> 
    <div id="cy2"></div> 
    <script> 
     var cy2 = cytoscape({ 
     container: document.getElementById('cy2'), 
      style: [ 
      { 
       selector: 'node', 
       style: { 
       shape: 'vee', 
       'background-color': '#A60059', 
       label: 'data(id)' 
       } 
      }], 

      layout: { 
      name: 'grid' 
      } 

     }); 

     $.getJSON("testdata.json", function (data) { 
      //console.log(data); 
      var cy = cytoscape({ 
       container: document.getElementById('cy'), 
       elements: data, 
       style: [ 
      { 
       selector: 'node', 
       style: { 
       shape: 'vee', 
       'background-color': '#A60059', 
       label: 'data(id)' 
       } 
      }], 

      layout: { 
      name: 'grid' 
      } 
      }); 

     cy.on('select', 'node', function(evt){ 
      evt.cyTarget.connectedEdges().animate({ 
      style: { lineColor: 'blue' } 
      }); 
      evt.cyTarget.nodes().animate({ 
      style: {'background-color': 'yellow'} 
     }); 
     }); 

     cy.on('cxttap', 'node', function(evt) { 
     var newData = cy.$(':selected'); 
     console.log(newData); 
     cy2.add(newData.jsons()); 
     }); 

     console.log(cy.$('node:selected'));  
     }); 

    </script> 
</body> 

Das Problem ist jetzt ist, dass dies wie erwartet für die gleichzeitig ausgewählten Knoten und deren Kanten funktioniert. Wenn jedoch z.B. Wählen Sie zuerst die Knoten c und d aus und wählen Sie dann in einem nächsten Schritt den Knoten a. Wenn Sie auf den Knoten a klicken, enthält der neue Graph cy2 nur diesen einzelnen Knoten ohne die zuvor ausgewählten Knoten. Jetzt denke ich, dass ich z. Wählen Sie alle Knoten mit der Hintergrundfarbe Gelb mit ihren Kanten aus (dies sollte dann prinzipiell alle einmal ausgewählten Knoten zurückgeben). Aber das Problem ist, dass ich nicht weiß, wie das geht. So etwas wie

cy.$('background-color:yellow')

funktioniert nicht.

Noch einmal, jede Hilfe hier würde sehr geschätzt werden.

Antwort

1
cy2.add(copy(elementsOfInterest.jsons())); 

// where copy deep copies json, e.g. obj => _.cloneDeep(obj) or obj => JSON.parse(JSON.stringify(obj)) 

Lesen Sie die Dokumentation: http://js.cytoscape.org/#notation/object-ownership

Wenn Objekte zu Cytoscape.js zum Erstellen von Elementen vorbei, Animationen, Layouts, usw., werden die Objekte von Cytoscape Besitz betrachtet.Objekte wie Elemente weisen mehrere Ebenen auf und tiefe Kopien dieser Objekte jedes Mal, wenn sie an Cytoscape übergeben werden, verursachen zusätzliche Kosten. Wenn gewünscht, kann der Entwickler Objekte manuell kopieren, bevor sie an Cytoscape übergeben werden. Kopieren ist jedoch für die meisten Entwickler die meiste Zeit nicht notwendig.

Sie können nicht zwei Eigentümer für ein Objekt haben.

+1

Bitte fügen Sie eine Erklärung hinzu, wie/warum dies das Problem von OP löst, so dass das Problem verstanden und gelöst und nicht einfach behoben wird –

Verwandte Themen