use of ini.trakem2.display.Layer in project TrakEM2 by trakem2.
the class AreaList method keyPressed.
@Override
public void keyPressed(final KeyEvent ke) {
final Object source = ke.getSource();
if (!(source instanceof DisplayCanvas))
return;
final DisplayCanvas dc = (DisplayCanvas) source;
final Layer layer = dc.getDisplay().getLayer();
final int keyCode = ke.getKeyCode();
final long layer_id = layer.getId();
if (KeyEvent.VK_K == keyCode) {
final Roi roi = dc.getFakeImagePlus().getRoi();
if (null == roi)
return;
if (!M.isAreaROI(roi)) {
Utils.log("AreaList only accepts region ROIs, not lines.");
return;
}
final ShapeRoi sroi = new ShapeRoi(roi);
try {
final AreaList p = part(layer_id, sroi);
if (null != p) {
project.getProjectTree().addSibling(this, p);
}
Display.repaint(layer, getBoundingBox(), 5);
linkPatches();
} catch (final NoninvertibleTransformException nite) {
IJError.print(nite);
}
ke.consume();
} else {
Area a = getArea(layer_id);
if (null == a) {
a = new Area();
ht_areas.put(layer_id, a);
}
new AreaWrapper(this, a).keyPressed(ke, dc, layer);
}
}
use of ini.trakem2.display.Layer in project TrakEM2 by trakem2.
the class AreaList method getStack.
/**
* Returns a stack of images representing the pixel data of this LayerSet inside this AreaList.
*/
public ImagePlus getStack(final int type, final double scale) {
final ImageProcessor ref_ip = Utils.createProcessor(type, 2, 2);
if (null == ref_ip) {
Utils.log("AreaList.getStack: Unknown type " + type);
return null;
}
final Rectangle b = getBoundingBox();
final int w = (int) (0.5 + b.width * scale);
final int h = (int) (0.5 + b.height * scale);
final ImageStack stack = new ImageStack(w, h);
for (final Layer la : getLayerRange()) {
final Area area = getArea(la);
final double z = layer.getZ();
project.getLoader().releaseToFit(w * h * 10);
final ImageProcessor ip = ref_ip.createProcessor(w, h);
if (null == area) {
stack.addSlice(Double.toString(z), ip);
continue;
}
// Create a ROI from the area at Layer la:
final AffineTransform aff = getAffineTransformCopy();
aff.translate(-b.x, -b.y);
aff.scale(scale, scale);
final ShapeRoi roi = new ShapeRoi(area.createTransformedArea(aff));
// Create a cropped snapshot of the images at Layer la under the area:
final ImageProcessor flat = Patch.makeFlatImage(type, la, b, scale, la.getAll(Patch.class), Color.black);
flat.setRoi(roi);
final Rectangle rb = roi.getBounds();
ip.insert(flat.crop(), rb.x, rb.y);
// Clear the outside
final ImagePlus bimp = new ImagePlus("", ip);
bimp.setRoi(roi);
ip.setValue(0);
ip.setBackgroundValue(0);
IJ.run(bimp, "Clear Outside", "");
stack.addSlice(Double.toString(z), ip);
}
final ImagePlus imp = new ImagePlus("AreaList stack for " + this, stack);
imp.setCalibration(layer_set.getCalibrationCopy());
return imp;
}
use of ini.trakem2.display.Layer in project TrakEM2 by trakem2.
the class Project method createLayerTemplates.
private void createLayerTemplates() {
if (null == layer_template) {
layer_template = new TemplateThing("layer");
layer_set_template = new TemplateThing("layer_set");
layer_set_template.addChild(layer_template);
// adding a new instance to keep parent/child relationships clean
layer_template.addChild(layer_set_template);
// No need, there won't ever be a loop so far WARNING may change in the future.
}
}
use of ini.trakem2.display.Layer in project TrakEM2 by trakem2.
the class Project method newFSProject.
public static Project newFSProject(String arg, TemplateThing template_root, String storage_folder, boolean autocreate_one_layer) {
if (Utils.wrongImageJVersion())
return null;
FSLoader loader = null;
try {
String dir_project = storage_folder;
if (null == dir_project || !new File(dir_project).isDirectory()) {
DirectoryChooser dc = new DirectoryChooser("Select storage folder");
dir_project = dc.getDirectory();
// user cancelled dialog
if (null == dir_project)
return null;
if (!Loader.canReadAndWriteTo(dir_project)) {
Utils.showMessage("Can't read/write to the selected storage folder.\nPlease check folder permissions.");
return null;
}
if (IJ.isWindows())
dir_project = dir_project.replace('\\', '/');
}
loader = new FSLoader(dir_project);
Project project = createNewProject(loader, !("blank".equals(arg) || "amira".equals(arg)), template_root);
// help the helpless users:
if (autocreate_one_layer && null != project && ControlWindow.isGUIEnabled()) {
Utils.log2("Creating automatic Display.");
// add a default layer
Layer layer = new Layer(project, 0, 1, project.layer_set);
project.layer_set.add(layer);
project.layer_tree.addLayer(project.layer_set, layer);
layer.recreateBuckets();
Display.createDisplay(project, layer);
}
try {
// waiting cheaply for asynchronous swing calls
Thread.sleep(200);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
if ("amira".equals(arg) || "stack".equals(arg)) {
// forks into a task thread
loader.importStack(project.layer_set.getLayer(0), null, true);
}
project.restartAutosaving();
return project;
} catch (Exception e) {
IJError.print(e);
if (null != loader)
loader.destroy();
}
return null;
}
use of ini.trakem2.display.Layer in project TrakEM2 by trakem2.
the class Project method adjustProperties.
public void adjustProperties() {
// should be more generic, but for now it'll do
GenericDialog gd = new GenericDialog("Properties");
gd.addMessage("Ignore image linking for:");
boolean link_labels = addBox(gd, DLabel.class);
boolean nolink_segmentations = "true".equals(ht_props.get("segmentations_nolinks"));
gd.addCheckbox("Segmentations", nolink_segmentations);
gd.addMessage("Currently linked objects will remain so\nunless explicitly unlinked.");
boolean dissector_zoom = "true".equals(ht_props.get("dissector_zoom"));
gd.addCheckbox("Zoom-invariant markers for Dissector", dissector_zoom);
gd.addChoice("Image_resizing_mode: ", Loader.MIPMAP_MODES.values().toArray(new String[Loader.MIPMAP_MODES.size()]), Loader.getMipMapModeName(mipmaps_mode));
gd.addChoice("mipmaps format:", FSLoader.MIPMAP_FORMATS, FSLoader.MIPMAP_FORMATS[loader.getMipMapFormat()]);
gd.addNumericField("Save mipmap images from level", this.first_mipmap_level_saved, 0);
boolean layer_mipmaps = "true".equals(ht_props.get("layer_mipmaps"));
gd.addCheckbox("Layer_mipmaps", layer_mipmaps);
boolean keep_mipmaps = "true".equals(ht_props.get("keep_mipmaps"));
// coping with the fact that thee is no Action context ... there should be one in the Worker thread.
gd.addCheckbox("Keep_mipmaps_when_deleting_images", keep_mipmaps);
int bucket_side = (int) getProperty("bucket_side", Bucket.MIN_BUCKET_SIZE);
gd.addNumericField("Bucket side length: ", bucket_side, 0, 6, "pixels");
boolean no_shutdown_hook = "true".equals(ht_props.get("no_shutdown_hook"));
gd.addCheckbox("No_shutdown_hook to save the project", no_shutdown_hook);
int n_undo_steps = getProperty("n_undo_steps", 32);
gd.addSlider("Undo steps", 32, 200, n_undo_steps);
boolean flood_fill_to_image_edge = "true".equals(ht_props.get("flood_fill_to_image_edge"));
gd.addCheckbox("AreaList_flood_fill_to_image_edges", flood_fill_to_image_edge);
int look_ahead_cache = (int) getProperty("look_ahead_cache", 0);
gd.addNumericField("Look_ahead_cache:", look_ahead_cache, 0, 6, "layers");
// default: every 10 minutes
int autosaving_interval = getProperty("autosaving_interval", 10);
gd.addNumericField("Autosave every:", autosaving_interval, 0, 6, "minutes");
int n_mipmap_threads = getProperty("n_mipmap_threads", 1);
gd.addSlider("Number of threads for mipmaps", 1, n_mipmap_threads, n_mipmap_threads);
int meshResolution = getProperty("mesh_resolution", 32);
gd.addSlider("Default mesh resolution for images", 1, 512, meshResolution);
//
gd.showDialog();
//
if (gd.wasCanceled())
return;
setLinkProp(link_labels, gd.getNextBoolean(), DLabel.class);
boolean nolink_segmentations2 = gd.getNextBoolean();
if (nolink_segmentations) {
if (!nolink_segmentations2)
ht_props.remove("segmentations_nolinks");
} else if (nolink_segmentations2)
ht_props.put("segmentations_nolinks", "true");
if (adjustProp("dissector_zoom", dissector_zoom, gd.getNextBoolean())) {
// TODO: should repaint nested LayerSets as well
Display.repaint(layer_set);
}
this.mipmaps_mode = Loader.getMipMapModeIndex(gd.getNextChoice());
final int new_mipmap_format = gd.getNextChoiceIndex();
final int old_mipmap_format = loader.getMipMapFormat();
if (new_mipmap_format != old_mipmap_format) {
YesNoDialog yn = new YesNoDialog("MipMaps format", "Changing mipmaps format to '" + FSLoader.MIPMAP_FORMATS[new_mipmap_format] + "'requires regenerating all mipmaps. Proceed?");
if (yn.yesPressed()) {
if (loader.setMipMapFormat(new_mipmap_format)) {
loader.updateMipMapsFormat(old_mipmap_format, new_mipmap_format);
}
}
}
setFirstMipMapLevelSaved(gd.getNextNumber());
boolean layer_mipmaps2 = gd.getNextBoolean();
if (adjustProp("layer_mipmaps", layer_mipmaps, layer_mipmaps2)) {
if (layer_mipmaps && !layer_mipmaps2) {
// TODO
// 1 - ask first
// 2 - remove all existing images from layer.mipmaps folder
} else if (!layer_mipmaps && layer_mipmaps2) {
// TODO
// 1 - ask first
// 2 - create de novo all layer mipmaps in a background task
}
}
adjustProp("keep_mipmaps", keep_mipmaps, gd.getNextBoolean());
Utils.log2("keep_mipmaps: " + getBooleanProperty("keep_mipmaps"));
//
bucket_side = (int) gd.getNextNumber();
if (bucket_side > Bucket.MIN_BUCKET_SIZE) {
setProperty("bucket_side", Integer.toString(bucket_side));
layer_set.recreateBuckets(true);
}
adjustProp("no_shutdown_hook", no_shutdown_hook, gd.getNextBoolean());
n_undo_steps = (int) gd.getNextNumber();
if (n_undo_steps < 0)
n_undo_steps = 0;
setProperty("n_undo_steps", Integer.toString(n_undo_steps));
adjustProp("flood_fill_to_image_edge", flood_fill_to_image_edge, gd.getNextBoolean());
double d_look_ahead_cache = gd.getNextNumber();
if (!Double.isNaN(d_look_ahead_cache) && d_look_ahead_cache >= 0) {
setProperty("look_ahead_cache", Integer.toString((int) d_look_ahead_cache));
if (0 == d_look_ahead_cache) {
Display.clearColumnScreenshots(this.layer_set);
} else {
Utils.logAll("WARNING: look-ahead cache is incomplete.\n Expect issues when editing objects, adding new ones, and the like.\n Use \"Project - Flush image cache\" to fix any lack of refreshing issues you encounter.");
}
} else {
Utils.log2("Ignoring invalid 'look ahead cache' value " + d_look_ahead_cache);
}
double autosaving_interval2 = gd.getNextNumber();
if (((int) (autosaving_interval2)) == autosaving_interval) {
// do nothing
} else if (autosaving_interval2 < 0 || Double.isNaN(autosaving_interval)) {
Utils.log("IGNORING invalid autosaving interval: " + autosaving_interval2);
} else {
setProperty("autosaving_interval", Integer.toString((int) autosaving_interval2));
restartAutosaving();
}
int n_mipmap_threads2 = (int) Math.max(1, gd.getNextNumber());
if (n_mipmap_threads != n_mipmap_threads2) {
setProperty("n_mipmap_threads", Integer.toString(n_mipmap_threads2));
// WARNING: this does it for a static service, affecting all projects!
FSLoader.restartMipMapThreads(n_mipmap_threads2);
}
int meshResolution2 = (int) gd.getNextNumber();
if (meshResolution != meshResolution2) {
if (meshResolution2 > 0) {
setProperty("mesh_resolution", Integer.toString(meshResolution2));
} else {
Utils.log("WARNING: ignoring invalid mesh resolution value " + meshResolution2);
}
}
}
Aggregations