Skip to content
Snippets Groups Projects
Commit 76dabffa authored by Piotr Gawron's avatar Piotr Gawron
Browse files

code for generating semantic-zoom overlays with fixed levels

parent 6f295e05
No related branches found
No related tags found
1 merge request!44Resolve "semantic zoom"
...@@ -38,13 +38,15 @@ public abstract class BioEntityConverter<T extends BioEntity> { ...@@ -38,13 +38,15 @@ public abstract class BioEntityConverter<T extends BioEntity> {
* Default class logger. * Default class logger.
*/ */
@SuppressWarnings("unused") @SuppressWarnings("unused")
private final Logger logger = Logger.getLogger(BioEntityConverter.class); private final Logger logger = Logger.getLogger(BioEntityConverter.class);
private SemanticZoomLevelMatcher semanticZoomLevelMatcher = new SemanticZoomLevelMatcher();
/** /**
* Alpha value (0..255) used for visualizing overlay data that are normally * Alpha value (0..255) used for visualizing overlay data that are normally
* visualized in javascript. * visualized in javascript.
*/ */
public static final int LAYOUT_ALPHA = 200; public static final int LAYOUT_ALPHA = 200;
/** /**
* This function draw representation of the alias on the graphics object. * This function draw representation of the alias on the graphics object.
...@@ -144,8 +146,8 @@ public abstract class BioEntityConverter<T extends BioEntity> { ...@@ -144,8 +146,8 @@ public abstract class BioEntityConverter<T extends BioEntity> {
} }
/** /**
* Checks if {@link BioEntity} is visible according to visualization * Checks if {@link BioEntity} is visible according to visualization given in
* given in params. * params.
* *
* @param bioEntity * @param bioEntity
* visibility of this object will be checked * visibility of this object will be checked
...@@ -155,7 +157,7 @@ public abstract class BioEntityConverter<T extends BioEntity> { ...@@ -155,7 +157,7 @@ public abstract class BioEntityConverter<T extends BioEntity> {
*/ */
protected boolean isVisible(BioEntity bioEntity, ConverterParams params) { protected boolean isVisible(BioEntity bioEntity, ConverterParams params) {
if (params.isSemanticZoomingOn()) { if (params.isSemanticZoomingOn()) {
boolean result = matchLevel(params.getLevel(), bioEntity.getSemanticZoomLevelVisibility()); boolean result = semanticZoomLevelMatcher.matchLevel(params.getLevel(), bioEntity.getSemanticZoomLevelVisibility());
if (bioEntity instanceof Element) { if (bioEntity instanceof Element) {
Compartment compartment = ((Element) bioEntity).getCompartment(); Compartment compartment = ((Element) bioEntity).getCompartment();
if (compartment != null) { if (compartment != null) {
...@@ -219,33 +221,4 @@ public abstract class BioEntityConverter<T extends BioEntity> { ...@@ -219,33 +221,4 @@ public abstract class BioEntityConverter<T extends BioEntity> {
return result; return result;
} }
/**
* Checks if level belongs to the range defined in
* semanticZoomLevelVisibility.
*
* @param level
* level to ve checked
* @param semanticZoomLevelVisibility
* range of levels to be checked
* @return true if level is in the range
*/
protected boolean matchLevel(int level, String semanticZoomLevelVisibility) {
if (semanticZoomLevelVisibility == null || semanticZoomLevelVisibility.isEmpty()) {
return true;
}
if (semanticZoomLevelVisibility.contains("{")) {
String strLevels = semanticZoomLevelVisibility.replace("{", "").replace("}", "");
String[] ranges = strLevels.split(",");
for (String string : ranges) {
if (Integer.valueOf(string).equals(level)) {
return true;
}
}
}
if (Integer.valueOf(semanticZoomLevelVisibility) <= level) {
return true;
}
return false;
}
} }
package lcsb.mapviewer.converter.graphics.bioEntity;
public class SemanticZoomLevelMatcher {
/**
* Checks if level belongs to the range defined in
* semanticZoomLevelVisibility.
*
* @param level
* level to ve checked
* @param semanticZoomLevelVisibility
* range of levels to be checked
* @return true if level is in the range
*/
public boolean matchLevel(int level, String semanticZoomLevelVisibility) {
if (semanticZoomLevelVisibility == null || semanticZoomLevelVisibility.isEmpty()) {
return true;
}
if (semanticZoomLevelVisibility.contains("{")) {
String strLevels = semanticZoomLevelVisibility.replace("{", "").replace("}", "");
String[] ranges = strLevels.split(",");
for (String string : ranges) {
if (Integer.valueOf(string).equals(level)) {
return true;
}
}
}
if (Integer.valueOf(semanticZoomLevelVisibility) <= level) {
return true;
}
return false;
}
}
...@@ -52,6 +52,7 @@ import lcsb.mapviewer.converter.InvalidInputDataExecption; ...@@ -52,6 +52,7 @@ import lcsb.mapviewer.converter.InvalidInputDataExecption;
import lcsb.mapviewer.converter.graphics.DrawingException; import lcsb.mapviewer.converter.graphics.DrawingException;
import lcsb.mapviewer.converter.graphics.MapGenerator; import lcsb.mapviewer.converter.graphics.MapGenerator;
import lcsb.mapviewer.converter.graphics.MapGenerator.MapGeneratorParams; import lcsb.mapviewer.converter.graphics.MapGenerator.MapGeneratorParams;
import lcsb.mapviewer.converter.graphics.bioEntity.SemanticZoomLevelMatcher;
import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser; import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser;
import lcsb.mapviewer.converter.model.sbgnml.SbgnmlXmlConverter; import lcsb.mapviewer.converter.model.sbgnml.SbgnmlXmlConverter;
import lcsb.mapviewer.converter.zip.ZipEntryFile; import lcsb.mapviewer.converter.zip.ZipEntryFile;
...@@ -612,40 +613,64 @@ public class ProjectService implements IProjectService { ...@@ -612,40 +613,64 @@ public class ProjectService implements IProjectService {
int counter = 0; int counter = 0;
for (final Model model : models) { for (final Model model : models) {
for (int i = 0; i < model.getLayouts().size(); i++) { for (int i = 0; i < model.getLayouts().size(); i++) {
String directory = model.getLayouts().get(i).getDirectory();
Layout layout = model.getLayouts().get(i); Layout layout = model.getLayouts().get(i);
if (layout.getInputData() == null) { if (layout.getInputData() == null) {
Model output = model;
if (layout.isHierarchicalView()) {
output = new CopyCommand(model).execute();
}
if (layout.getTitle().equals(BuildInLayout.CLEAN.getTitle())) {
output = new CopyCommand(model).execute();
new ClearColorModelCommand(output).execute();
}
final double imgCounter = counter; final double imgCounter = counter;
final double finalSize = size; final double finalSize = size;
MapGeneratorParams imgParams = generator.new MapGeneratorParams() IProgressUpdater updater = new IProgressUpdater() {
.model(output).directory(directory).sbgn(params.isSbgnFormat()).nested(layout.isHierarchicalView()).updater(new IProgressUpdater() { @Override
@Override public void setProgress(double progress) {
public void setProgress(double progress) { updateProjectStatus(
updateProjectStatus( originalModel.getProject(), ProjectStatus.GENERATING_IMAGES, IProgressUpdater.MAX_PROGRESS * imgCounter / finalSize + progress / finalSize,
originalModel.getProject(), ProjectStatus.GENERATING_IMAGES, params);
IProgressUpdater.MAX_PROGRESS * imgCounter / finalSize + progress / finalSize, params); }
} };
});
if (layout.getTitle().contains(BuildInLayout.SEMANTIC.getTitle())) { generateImagesForBuiltInOverlay(params, model, layout, updater);
imgParams.semanticZoom(params.isSemanticZoom());
}
generator.generateMapImages(imgParams);
} }
counter++; counter++;
} }
} }
} }
private void generateImagesForBuiltInOverlay(final CreateProjectParams params, final Model model, Layout layout, IProgressUpdater updater)
throws CommandExecutionException, IOException, DrawingException {
String directory = layout.getDirectory();
Model output = model;
if (layout.isHierarchicalView()) {
output = new CopyCommand(model).execute();
}
if (layout.getTitle().equals(BuildInLayout.CLEAN.getTitle())) {
output = new CopyCommand(model).execute();
new ClearColorModelCommand(output).execute();
}
MapGeneratorParams imgParams = generator.new MapGeneratorParams()
.directory(directory).sbgn(params.isSbgnFormat()).nested(layout.isHierarchicalView()).updater(updater);
if (layout.getTitle().contains(BuildInLayout.SEMANTIC.getTitle())) {
imgParams.semanticZoom(params.isSemanticZoom());
if (Character.isDigit(layout.getTitle().charAt(layout.getTitle().length() - 1))) {
output = prepareSemanticZoomModel(model, layout.getTitle().replaceAll("[^0-9.]", ""));
}
}
imgParams.model(output);
generator.generateMapImages(imgParams);
}
private Model prepareSemanticZoomModel(final Model model, String levelStr) {
SemanticZoomLevelMatcher matcher = new SemanticZoomLevelMatcher();
int level = Integer.valueOf(levelStr);
Model output = new CopyCommand(model).execute();
for (BioEntity bioEntity : output.getAnnotatedObjects()) {
if (matcher.matchLevel(level, bioEntity.getSemanticZoomLevelVisibility())) {
bioEntity.setSemanticZoomLevelVisibility(null);
} else {
bioEntity.setSemanticZoomLevelVisibility(Integer.MAX_VALUE + "");
}
}
return output;
}
/** /**
* Creates project. Loads model from the input and run PostLoadModification. * Creates project. Loads model from the input and run PostLoadModification.
* *
...@@ -702,7 +727,6 @@ public class ProjectService implements IProjectService { ...@@ -702,7 +727,6 @@ public class ProjectService implements IProjectService {
model.setZoomLevels(generator.computeZoomLevels(model)); model.setZoomLevels(generator.computeZoomLevels(model));
model.setTileSize(MapGenerator.TILE_SIZE); model.setTileSize(MapGenerator.TILE_SIZE);
Map<BuildInLayout, Layout> topLayoutsByType = new HashMap<>();
List<BuildInLayout> buildInLayouts = new ArrayList<>(); List<BuildInLayout> buildInLayouts = new ArrayList<>();
if (params.isNetworkLayoutAsDefault()) { if (params.isNetworkLayoutAsDefault()) {
buildInLayouts.add(BuildInLayout.NORMAL); buildInLayouts.add(BuildInLayout.NORMAL);
...@@ -728,29 +752,26 @@ public class ProjectService implements IProjectService { ...@@ -728,29 +752,26 @@ public class ProjectService implements IProjectService {
Collections.reverse(buildInLayouts); Collections.reverse(buildInLayouts);
for (BuildInLayout buildInLayout : buildInLayouts) { for (BuildInLayout buildInLayout : buildInLayouts) {
Layout layout = new Layout(buildInLayout.getTitle(), params.getProjectDir() + "/" + buildInLayout.getDirectorySuffix() + model.getId() + "/", true); Layout topLayout = new Layout(buildInLayout.getTitle(), params.getProjectDir() + "/" + buildInLayout.getDirectorySuffix() + model.getId() + "/", true);
layout.setStatus(LayoutStatus.NA); topLayout.setStatus(LayoutStatus.NA);
layout.setProgress(0.0); topLayout.setProgress(0.0);
layout.setHierarchicalView(buildInLayout.isNested()); topLayout.setHierarchicalView(buildInLayout.isNested());
model.addLayout(0, layout); model.addLayout(0, topLayout);
topLayoutsByType.put(buildInLayout, layout); int submodelId = 1;
} for (ModelSubmodelConnection connection : model.getSubmodelConnections()) {
int submodelId = 1;
for (ModelSubmodelConnection connection : model.getSubmodelConnections()) {
for (BuildInLayout buildInLayout : buildInLayouts) {
Layout layout = new Layout(buildInLayout.getTitle(), params.getProjectDir() + "/" + buildInLayout.getDirectorySuffix() + submodelId + "/", true); Layout layout = new Layout(buildInLayout.getTitle(), params.getProjectDir() + "/" + buildInLayout.getDirectorySuffix() + submodelId + "/", true);
layout.setStatus(LayoutStatus.NA); layout.setStatus(LayoutStatus.NA);
layout.setProgress(0.0); layout.setProgress(0.0);
layout.setHierarchicalView(buildInLayout.isNested()); layout.setHierarchicalView(buildInLayout.isNested());
layout.setParentLayout(topLayoutsByType.get(buildInLayout)); layout.setParentLayout(topLayout);
connection.getSubmodel().addLayout(0, layout); connection.getSubmodel().addLayout(0, layout);
} submodelId++;
submodelId++;
connection.getSubmodel().setZoomLevels(generator.computeZoomLevels(connection.getSubmodel().getModel())); connection.getSubmodel().setZoomLevels(generator.computeZoomLevels(connection.getSubmodel().getModel()));
connection.getSubmodel().setTileSize(MapGenerator.TILE_SIZE); connection.getSubmodel().setTileSize(MapGenerator.TILE_SIZE);
}
} }
if (params.isUpdateAnnotations()) { if (params.isUpdateAnnotations()) {
Map<Class<?>, List<ElementAnnotator>> annotators = null; Map<Class<?>, List<ElementAnnotator>> annotators = null;
if (params.getAnnotatorsMap() != null) { if (params.getAnnotatorsMap() != null) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment