2016-08-12 18 views
0

어쨌든 그래프 스트림을 사용하여 그래프에서 특정 수의 노드를 접을 수 있습니까? ui.hide 특성을 추가하려고했지만 원하는 것은 아닙니다. 이상적으로 나는 접힌 첫 번째 노드에 + 기호를 넣고 + 기호를 클릭하면 나머지 노드가 나타나야합니다. 아무도 이것으로 나를 도울 수 있습니까? TIAGraphstream의 노드 축소

답변

1

정확히 맞았는지는 모르겠지만, 여러분은 IDE (eclipse, netbean ...)의 패키지/파일 시스템보기와 같은 트리를 접거나 펼치 길 원합니다.

제가 맞다면 GraphStream에서 도움이 될 수있는 몇 가지 트릭이 있습니다.

  • 위에서 언급 한 바와 같이 노드와 가장자리에 사용 된 ui.hide 속성입니다.
  • 선택한 노드에서 레이아웃 알고리즘을 차단하고 위치를 제어 할 수있는 layout.frozen 속성입니다. 클릭 된 노드의 위치에서 "접힌"시각적 느낌을주기 위해 "접힌"위치의 위치를 ​​설정할 수 있습니다.
  • CSS 클래스를 노드에 할당하고 노드 접기/펼치기 노드에 특정 스타일을 지정할 수있는 ui.class 속성 (예 : "더하기"기호 아이콘 추가).
  • 노드가 클릭되었을 때 알림을 받으려면 뷰어에서 ProxyPipe을 검색하고 해당 뷰어에서 오는 수정 사항을 수신해야합니다. 특히 ui.clicked 속성은 클릭 한 노드에 자동으로 할당됩니다.

    ProxyPipe fromViewer = viewer.newViewerPipe(); 
    fromViewer.addSink(new SinkAdapter(){ 
        @Override 
        public void nodeAttributeAdded(String sourceId, long timeId, String nodeId, String attribute, Object value) { 
         if(attribute.equals("ui.clicked")){ 
          // Being notified that a node was clicked... 
         } 
        } 
    }); 
    
  • 마지막으로 접을 노드를 결정해야합니다. 클릭 한 노드를 기반으로하는 간단한 반복기가 필요한 것입니다.

    // let n be the clicked node... 
    Iterator<Node> it = n.getBreadthFirstIterator(true); 
    while(it.hasNext()){ 
        Node m = it.next(); 
        for(Edge e : m.getLeavingEdgeSet()) { 
         e.setAttribute("ui.hide"); 
        } 
        if(n != m) { 
         m.setAttribute("ui.hide"); 
        } 
    } 
    

그런 다음 레이아웃 알고리즘은 노드 위치와 안정화 제한에 관한 귀찮은하지만 정말 중요한이 없습니다. Tree graph before collapsing sub-trees

:

여기 https://gist.github.com/pigne/2d4c0cbe8583f8a8f6b03309becaff3f

하위 트리를 붕괴하기 전에 예를 들어 트리 그래프 :

당신은 클릭 노드는 자신의 서브 트리를 축소 요지의 작동 예를 찾을 수 있습니다 클릭 후 노드 13 및 15가 축소 된 동일한 그래프 : Same graph with node 13 and 15 collapsed