2012-04-04 6 views
1

ノードに「Color」文字列プロパティがあるGraphMLファイルを読み込むプリフューズアプリケーションがあります。すなわち、GraphMLノードの着色Prefuse

<node id="1"> 
    <data key="Color">Green</data> 
<node> 

私は、事前に定義された色の範囲を指定できるようにしたい、と私はすべての色を使用するようにGraphMLを作成するプログラムを強制する必要はありません。

私はこれが単純な仕事(そしておそらくそれは?)だと思っていましたが、プレヒューズは毎回私と戦っているようです。私は2つの部分的な解決策を考え出しましたが、どちらも問題があります。私の最初のアプローチは、手動でそのように、「色」の文字列に対応付けられた新しい整数プロパティを追加することでした:

// Add new property to Graph g 
g.addColumn("ColorNumber", int.class); 

// Add property to each node 
Iterator<Node> it = g.nodes(); 
while(it.hasNext()) { 
    Node n = it.next(); 
    String type = n.getString("Color"); 
    // Compare to an array of accepted types 
    for(int i=0; i < colorMap.length; i++) { 
     if(type.equalsIgnoreCase(colorMap[i])) { 
      n.setInt("ColorNumber", i); 
      break; 
     } 
    } 
} 

その後、あなたは配列のインデックスにこれらの整数をリンクするためにプレフューズのデフォルトのカラーマネージャを使用することができます。

draw.add(new DataColorAction("graph.nodes", "ColorNumber", Constants.NUMERICAL, VisualItem.FILLCOLOR, fillArray)); 

(それは洗練されての上)このアプローチの最大の問題は、以下の3つのユニークな色がユーザによって指定された場合、それが失敗したということです。 2つの色が指定されている場合、prefuseはカラー配列の最初と最後の要素を使用します。もしあれば、最初の。 Meh。

私の他の解決策は、手動で各ノードの色を設定することです。

// Iterate over VisualItems in Visualization vis 
Iterator<VisualItem> v_it = vis.items("graph.nodes"); 
while(v_it.hasNext()) { 
    VisualItem item = v_it.next(); 
    String type = item.getString("Color"); 
    for(int i=0; i < typeMap.length; i++) { 
     if(type.equalsIgnoreCase(typeMap[i])) { 
      item.setFillColor(fill[i]); 
      item.setEndFillColor(fill[i]); 
      break; 
     } 
    } 
} 
vis.repaint(); 

これは任意の数の色で機能しますが、ランダムに混乱します。プリフューズは、自分のスレッド上でこれらのメソッドを処理すると思います。何らかの理由で、ゆっくりと実行されます。小規模のネットワークでは、固定待機時間を設定できます(Thread.join()メソッドを使用していません)。しかし、これは大規模なネットワークではうまくいけない(読んだ:私のコンピュータをクラッシュ)。

だから、あなたはそれを持っています。簡単な作業でなければならないものに対する不必要に長い時間のコミットメント。誰かがこれを達成することができましたか?簡単な方法はありますか?私はこれを思っています。

答えて

1

私は非常によくプレフューズについて、このような経験を知っている: -/

最初のアプローチは正しい道を進んでいるが、誤ったデータ型を指定しました。色はNOMINALです。

DataColorAction color = new DataColorAction("graph.nodes", "Color", 
    Constants.NOMINAL, VisualItem.FILLCOLOR, fillArray); 

ColorNumberフィールドは必要ありません。

2番目のアプローチに関する結論は正しいです。プリフューズは別のスレッドでActionListを実行します。したがって、視覚的なプロパティを手動で設定すべきではありません。

さらに詳細なコードが必要な場合は、DataColorActionを拡張できます。

+0

DataColorActionを拡張することは、私が最後にやった解決策です。また、私はStackOverflowの質問をよりよくフォローアップする必要があります。 – PattimusPrime