Search in sources :

Example 61 with Layer

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);
    }
}
Also used : NoninvertibleTransformException(java.awt.geom.NoninvertibleTransformException) ShapeRoi(ij.gui.ShapeRoi) Area(java.awt.geom.Area) ShapeRoi(ij.gui.ShapeRoi) Roi(ij.gui.Roi) PolygonRoi(ij.gui.PolygonRoi) Point(java.awt.Point) USHORTPaint(ini.trakem2.display.paint.USHORTPaint)

Example 62 with 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;
}
Also used : ImageProcessor(ij.process.ImageProcessor) Area(java.awt.geom.Area) ShapeRoi(ij.gui.ShapeRoi) ImageStack(ij.ImageStack) Rectangle(java.awt.Rectangle) AffineTransform(java.awt.geom.AffineTransform) ImagePlus(ij.ImagePlus) Point(java.awt.Point) USHORTPaint(ini.trakem2.display.paint.USHORTPaint)

Example 63 with Layer

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.
    }
}
Also used : TemplateThing(ini.trakem2.tree.TemplateThing)

Example 64 with Layer

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;
}
Also used : FSLoader(ini.trakem2.persistence.FSLoader) JarFile(java.util.jar.JarFile) File(java.io.File) Layer(ini.trakem2.display.Layer) DirectoryChooser(ij.io.DirectoryChooser)

Example 65 with Layer

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);
        }
    }
}
Also used : GenericDialog(ij.gui.GenericDialog) YesNoDialog(ini.trakem2.display.YesNoDialog)

Aggregations

Layer (ini.trakem2.display.Layer)61 ArrayList (java.util.ArrayList)52 Patch (ini.trakem2.display.Patch)43 Rectangle (java.awt.Rectangle)34 HashSet (java.util.HashSet)27 ImagePlus (ij.ImagePlus)26 Displayable (ini.trakem2.display.Displayable)25 AffineTransform (java.awt.geom.AffineTransform)23 GenericDialog (ij.gui.GenericDialog)22 Worker (ini.trakem2.utils.Worker)22 Point (mpicbg.models.Point)22 HashMap (java.util.HashMap)21 Point (java.awt.Point)19 Area (java.awt.geom.Area)19 NoninvertibleTransformException (java.awt.geom.NoninvertibleTransformException)18 File (java.io.File)16 Future (java.util.concurrent.Future)16 LayerSet (ini.trakem2.display.LayerSet)15 ExecutorService (java.util.concurrent.ExecutorService)14 Collection (java.util.Collection)13