Skip to content

Commit

Permalink
edit visual style. make colors random, and make them not change when …
Browse files Browse the repository at this point in the history
…new nodes are added
  • Loading branch information
stuppie committed Aug 24, 2016
1 parent 7eaa139 commit c977884
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 34 deletions.
2 changes: 1 addition & 1 deletion dependency-reduced-pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<artifactId>WikiDataScape</artifactId>
<packaging>bundle</packaging>
<name>WikiDataScape</name>
<version>1.0.6</version>
<version>1.0.8</version>
<build>
<resources>
<resource>
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.cytoscape.WikiDataScape</groupId>
<artifactId>WikiDataScape</artifactId>
<version>1.0.6</version>
<version>1.0.8</version>

<name>WikiDataScape</name>
<packaging>bundle</packaging>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
https://github.com/svn2github/cytoscape/blob/a3df8f63dba4ec49942027c91ecac6efa920c195/csplugins/trunk/ucsd/mes/cy3-shared-local-tables/impl/vizmap-gui-impl/src/main/java/org/cytoscape/view/vizmap/gui/internal/util/mapgenerator/RandomColorMappingGenerator.java
*/
package org.cytoscape.WikiDataScape.internal;

import java.awt.Color;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import org.cytoscape.view.vizmap.gui.util.DiscreteMappingGenerator;

/**
* Mapping generator from any attributes to random color
*/
public class RandomColorMappingGenerator implements DiscreteMappingGenerator<Color> {

private final int MAX_COLOR = 256 * 256 * 256;
private final long seed = System.currentTimeMillis();
private final Random rand = new Random(seed);

@Override
public <T> Map<T, Color> generateMap(Set<T> attributeSet) {
final Map<T, Color> valueMap = new HashMap<>();

for (T key : attributeSet) {
valueMap.put(key, new Color(((Number) (rand.nextFloat() * MAX_COLOR)).intValue()));
}

return valueMap;
}

@Override
public Class<Color> getDataType() {
return Color.class;
}
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,26 @@
package org.cytoscape.WikiDataScape.internal.tasks;

import java.awt.Color;
import java.awt.Paint;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import org.cytoscape.WikiDataScape.internal.CyActivator;
import org.cytoscape.WikiDataScape.internal.RainbowColorMappingGenerator;
import org.cytoscape.WikiDataScape.internal.RandomColorMappingGenerator;
import org.cytoscape.app.CyAppAdapter;
import org.cytoscape.model.CyNetwork;
import org.cytoscape.model.CyNetworkManager;
import org.cytoscape.model.CyRow;
import org.cytoscape.model.CyTable;
import org.cytoscape.view.model.CyNetworkView;
import org.cytoscape.view.model.CyNetworkViewManager;
import org.cytoscape.view.presentation.property.ArrowShapeVisualProperty;
import org.cytoscape.view.presentation.property.LineTypeVisualProperty;
import org.cytoscape.view.presentation.property.BasicVisualLexicon;
import org.cytoscape.view.vizmap.VisualMappingFunction;
import org.cytoscape.view.vizmap.VisualMappingFunctionFactory;
import org.cytoscape.view.vizmap.VisualMappingManager;
import org.cytoscape.view.vizmap.VisualPropertyDependency;
import org.cytoscape.view.vizmap.VisualStyle;
import org.cytoscape.view.vizmap.VisualStyleFactory;
import org.cytoscape.view.vizmap.gui.util.DiscreteMappingGenerator;
import org.cytoscape.view.vizmap.mappings.DiscreteMapping;
import org.cytoscape.work.AbstractTask;
import org.cytoscape.work.TaskIterator;
Expand Down Expand Up @@ -54,61 +49,108 @@ private VisualStyle createVisualStyle() {
VisualMappingFunctionFactory vmfPassFactory = adapter.getVisualMappingFunctionPassthroughFactory();

VisualStyle vs = visualStyleFactory.createVisualStyle(vmmServiceRef.getDefaultVisualStyle());
/*
VisualStyle base = vmmServiceRef.getAllVisualStyles().stream().filter(x -> x.getTitle().equals("Marquee")).findFirst().get();
VisualStyle vs = visualStyleFactory.createVisualStyle(base);
*/
vs.setTitle("WikiDataScape");

// edge label: passthrough "interaction" column
VisualMappingFunction<String, String> edgeLabel = vmfPassFactory.createVisualMappingFunction("interaction", String.class, BasicVisualLexicon.EDGE_LABEL);
vs.addVisualMappingFunction(edgeLabel);

// node face color mapping: discrete "instance of" random color
DiscreteMapping nodeColor = (DiscreteMapping) vmfDiscreteFactory.createVisualMappingFunction(column, String.class, BasicVisualLexicon.NODE_FILL_COLOR);

CyNetwork myNet = cyView.getModel();
CyTable nodeTable = myNet.getDefaultNodeTable();
HashSet<String> attributes = new HashSet<>();

if (nodeTable.getColumn(column) != null){
nodeTable.getColumn(column).getValues(List.class).stream().filter((x) -> (x!=null)).forEach((x) -> {
if (nodeTable.getColumn(column) != null) {
nodeTable.getColumn(column).getValues(List.class).stream().filter((x) -> (x != null)).forEach((x) -> {
attributes.addAll(x);
});
if (!attributes.isEmpty()){
RainbowColorMappingGenerator d = new RainbowColorMappingGenerator();
if (!attributes.isEmpty()) {
RandomColorMappingGenerator d = new RandomColorMappingGenerator();
Map<String, Color> generateMap = d.generateMap(attributes);
nodeColor.putAll(generateMap);
vs.addVisualMappingFunction(nodeColor);
}
}
nodeColor.putMapValue("", Color.GRAY);
vs.addVisualMappingFunction(nodeColor);

// edge stroke color: discrete mapping to "instance of" random color
DiscreteMapping edgeColor = (DiscreteMapping) vmfDiscreteFactory.createVisualMappingFunction("interaction", String.class, BasicVisualLexicon.EDGE_UNSELECTED_PAINT);
CyTable edgeTable = myNet.getDefaultEdgeTable();
HashSet<String> interactions = new HashSet<>(edgeTable.getColumn("interaction").getValues(String.class));
if (!interactions.isEmpty()) {
RandomColorMappingGenerator d = new RandomColorMappingGenerator();
Map<String, Color> generateMap = d.generateMap(interactions);
edgeColor.putAll(generateMap);
}
edgeColor.putMapValue("", Color.black);
vs.addVisualMappingFunction(edgeColor);

// edge line type mapping a couple major edge types
DiscreteMapping edgeLineType = (DiscreteMapping) vmfDiscreteFactory.createVisualMappingFunction("interaction", String.class, BasicVisualLexicon.EDGE_LINE_TYPE);
edgeLineType.putMapValue("subclass of", LineTypeVisualProperty.DASH_DOT);
edgeLineType.putMapValue("instance of", LineTypeVisualProperty.DOT);
edgeLineType.putMapValue("has part", LineTypeVisualProperty.EQUAL_DASH);
vs.addVisualMappingFunction(edgeLineType);

vs.setDefaultValue(BasicVisualLexicon.NODE_FILL_COLOR, Color.GRAY);
vs.setDefaultValue(BasicVisualLexicon.EDGE_TARGET_ARROW_SHAPE, ArrowShapeVisualProperty.ARROW);

// Enable "Custom Graphics fit to Node" and "Edge color to arrows" dependency
// Also disable "Lock Node height and width"
// copied from here, because this isn't documented anywhere
// https://github.com/idekerlab/dot-app/blob/24e308b9f869abf0e7007f6a508c99e99ebec52d/src/main/java/org/cytoscape/intern/read/DotReaderTask.java
for (VisualPropertyDependency<?> dep : vs.getAllVisualPropertyDependencies()) {
if (dep.getIdString().equals("nodeCustomGraphicsSizeSync")
|| dep.getIdString().equals("arrowColorMatchesEdge")) {
dep.setDependency(true);
} else if (dep.getIdString().equals("nodeSizeLocked")) {
dep.setDependency(false);
}

}

vmmServiceRef.addVisualStyle(vs);

return vs;
}

private void updateVisualStyle(VisualStyle vs){
CyAppAdapter adapter = CyActivator.getCyAppAdapter();
VisualMappingFunctionFactory vmfDiscreteFactory = adapter.getVisualMappingFunctionDiscreteFactory();
CyNetworkViewManager cnvm = adapter.getCyNetworkViewManager();

DiscreteMapping nodeColor = (DiscreteMapping) vmfDiscreteFactory.createVisualMappingFunction(column, String.class, BasicVisualLexicon.NODE_FILL_COLOR);


private void updateVisualStyle(VisualStyle vs) {

// update node face color
DiscreteMapping nodeColor = (DiscreteMapping) vs.getVisualMappingFunction(BasicVisualLexicon.NODE_FILL_COLOR);
CyNetwork myNet = cyView.getModel();
CyTable nodeTable = myNet.getDefaultNodeTable();
HashSet<String> attributes = new HashSet<>();

if (nodeTable.getColumn(column) != null){
if (nodeTable.getColumn(column) != null) {
List<List> instances = nodeTable.getColumn(column).getValues(List.class);
instances.stream().filter((x) -> (x!=null)).forEach((x) -> {
instances.stream().filter((x) -> (x != null)).forEach((x) -> {
attributes.addAll(x);
});
System.out.println("attributes: " + attributes);
if (!attributes.isEmpty()){
RainbowColorMappingGenerator d = new RainbowColorMappingGenerator();
if (!attributes.isEmpty()) {
Map currentMap = nodeColor.getAll();
RandomColorMappingGenerator d = new RandomColorMappingGenerator();
Map<String, Color> generateMap = d.generateMap(attributes);
generateMap.putAll(currentMap);
nodeColor.putAll(generateMap);
vs.addVisualMappingFunction(nodeColor);
}
}

// update edge stroke color
DiscreteMapping edgeColor = (DiscreteMapping) vs.getVisualMappingFunction(BasicVisualLexicon.EDGE_UNSELECTED_PAINT);
CyTable edgeTable = myNet.getDefaultEdgeTable();
HashSet<String> interactions = new HashSet<>(edgeTable.getColumn("interaction").getValues(String.class));
if (!interactions.isEmpty()) {
// This reuses the same colors
Map currentMap = edgeColor.getAll();
RandomColorMappingGenerator d = new RandomColorMappingGenerator();
Map<String, Color> generateMap = d.generateMap(interactions);
generateMap.putAll(currentMap);
edgeColor.putAll(generateMap);
}
}

@Override
Expand Down
4 changes: 2 additions & 2 deletions target/classes/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Manifest-Version: 1.0
Bnd-LastModified: 1471631704904
Bnd-LastModified: 1472015545798
Build-Jdk: 1.8.0_91
Built-By: gstupp
Bundle-Activator: org.cytoscape.WikiDataScape.internal.CyActivator
Expand All @@ -16,7 +16,7 @@ Bundle-ClassPath: .,wdtk-wikibaseapi-0.6.0.jar,wdtk-datamodel-0.6.0.jar,
Bundle-ManifestVersion: 2
Bundle-Name: WikiDataScape
Bundle-SymbolicName: org.cytoscape.WikiDataScape.WikiDataScape
Bundle-Version: 1.0.6
Bundle-Version: 1.0.8
Created-By: Apache Maven Bundle Plugin
Embed-Dependency: *;scope=!provided|test;groupId=!org.cytoscape
Embed-Transitive: true
Expand Down

0 comments on commit c977884

Please sign in to comment.