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> {
* Default class logger.
*/
@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
* 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.
......@@ -144,8 +146,8 @@ public abstract class BioEntityConverter<T extends BioEntity> {
}
/**
* Checks if {@link BioEntity} is visible according to visualization
* given in params.
* Checks if {@link BioEntity} is visible according to visualization given in
* params.
*
* @param bioEntity
* visibility of this object will be checked
......@@ -155,7 +157,7 @@ public abstract class BioEntityConverter<T extends BioEntity> {
*/
protected boolean isVisible(BioEntity bioEntity, ConverterParams params) {
if (params.isSemanticZoomingOn()) {
boolean result = matchLevel(params.getLevel(), bioEntity.getSemanticZoomLevelVisibility());
boolean result = semanticZoomLevelMatcher.matchLevel(params.getLevel(), bioEntity.getSemanticZoomLevelVisibility());
if (bioEntity instanceof Element) {
Compartment compartment = ((Element) bioEntity).getCompartment();
if (compartment != null) {
......@@ -219,33 +221,4 @@ public abstract class BioEntityConverter<T extends BioEntity> {
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;
import lcsb.mapviewer.converter.graphics.DrawingException;
import lcsb.mapviewer.converter.graphics.MapGenerator;
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.sbgnml.SbgnmlXmlConverter;
import lcsb.mapviewer.converter.zip.ZipEntryFile;
......@@ -612,40 +613,64 @@ public class ProjectService implements IProjectService {
int counter = 0;
for (final Model model : models) {
for (int i = 0; i < model.getLayouts().size(); i++) {
String directory = model.getLayouts().get(i).getDirectory();
Layout layout = model.getLayouts().get(i);
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 finalSize = size;
MapGeneratorParams imgParams = generator.new MapGeneratorParams()
.model(output).directory(directory).sbgn(params.isSbgnFormat()).nested(layout.isHierarchicalView()).updater(new IProgressUpdater() {
@Override
public void setProgress(double progress) {
updateProjectStatus(
originalModel.getProject(), ProjectStatus.GENERATING_IMAGES,
IProgressUpdater.MAX_PROGRESS * imgCounter / finalSize + progress / finalSize, params);
}
});
if (layout.getTitle().contains(BuildInLayout.SEMANTIC.getTitle())) {
imgParams.semanticZoom(params.isSemanticZoom());
}
generator.generateMapImages(imgParams);
IProgressUpdater updater = new IProgressUpdater() {
@Override
public void setProgress(double progress) {
updateProjectStatus(
originalModel.getProject(), ProjectStatus.GENERATING_IMAGES, IProgressUpdater.MAX_PROGRESS * imgCounter / finalSize + progress / finalSize,
params);
}
};
generateImagesForBuiltInOverlay(params, model, layout, updater);
}
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.
*
......@@ -702,7 +727,6 @@ public class ProjectService implements IProjectService {
model.setZoomLevels(generator.computeZoomLevels(model));
model.setTileSize(MapGenerator.TILE_SIZE);
Map<BuildInLayout, Layout> topLayoutsByType = new HashMap<>();
List<BuildInLayout> buildInLayouts = new ArrayList<>();
if (params.isNetworkLayoutAsDefault()) {
buildInLayouts.add(BuildInLayout.NORMAL);
......@@ -728,29 +752,26 @@ public class ProjectService implements IProjectService {
Collections.reverse(buildInLayouts);
for (BuildInLayout buildInLayout : buildInLayouts) {
Layout layout = new Layout(buildInLayout.getTitle(), params.getProjectDir() + "/" + buildInLayout.getDirectorySuffix() + model.getId() + "/", true);
layout.setStatus(LayoutStatus.NA);
layout.setProgress(0.0);
layout.setHierarchicalView(buildInLayout.isNested());
model.addLayout(0, layout);
topLayoutsByType.put(buildInLayout, layout);
}
int submodelId = 1;
for (ModelSubmodelConnection connection : model.getSubmodelConnections()) {
for (BuildInLayout buildInLayout : buildInLayouts) {
Layout topLayout = new Layout(buildInLayout.getTitle(), params.getProjectDir() + "/" + buildInLayout.getDirectorySuffix() + model.getId() + "/", true);
topLayout.setStatus(LayoutStatus.NA);
topLayout.setProgress(0.0);
topLayout.setHierarchicalView(buildInLayout.isNested());
model.addLayout(0, topLayout);
int submodelId = 1;
for (ModelSubmodelConnection connection : model.getSubmodelConnections()) {
Layout layout = new Layout(buildInLayout.getTitle(), params.getProjectDir() + "/" + buildInLayout.getDirectorySuffix() + submodelId + "/", true);
layout.setStatus(LayoutStatus.NA);
layout.setProgress(0.0);
layout.setHierarchicalView(buildInLayout.isNested());
layout.setParentLayout(topLayoutsByType.get(buildInLayout));
layout.setParentLayout(topLayout);
connection.getSubmodel().addLayout(0, layout);
}
submodelId++;
submodelId++;
connection.getSubmodel().setZoomLevels(generator.computeZoomLevels(connection.getSubmodel().getModel()));
connection.getSubmodel().setTileSize(MapGenerator.TILE_SIZE);
connection.getSubmodel().setZoomLevels(generator.computeZoomLevels(connection.getSubmodel().getModel()));
connection.getSubmodel().setTileSize(MapGenerator.TILE_SIZE);
}
}
if (params.isUpdateAnnotations()) {
Map<Class<?>, List<ElementAnnotator>> annotators = 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