Search in sources :

Example 16 with Loader

use of ini.trakem2.persistence.Loader in project TrakEM2 by trakem2.

the class Project method createNewProject.

private static Project createNewProject(Loader loader, boolean ask_for_template, TemplateThing template_root, boolean clone_ids) {
    Project project = new Project(loader);
    // Utils.log2("ask_for_template: " + ask_for_template);
    if (ask_for_template)
        template_root = project.loader.askForXMLTemplate(project);
    if (null == template_root) {
        template_root = new TemplateThing("anything");
    } else if (clone_ids) {
        // the given template_root belongs to another project from which we are cloning
        template_root = template_root.clone(project, true);
    }
    // else, use the given template_root as is.
    // create tree
    project.template_tree = new TemplateTree(project, template_root);
    project.root_tt = template_root;
    // collect unique TemplateThing instances
    synchronized (project.ht_unique_tt) {
        project.ht_unique_tt.clear();
        project.ht_unique_tt.putAll(template_root.getUniqueTypes(new HashMap<String, TemplateThing>()));
    }
    // add all TemplateThing objects to the database, recursively
    if (!clone_ids)
        template_root.addToDatabase(project);
    // else already done when cloning the root_tt
    // create a non-database bound template for the project Thing
    TemplateThing project_template = new TemplateThing("project");
    project.ht_unique_tt.put("project", project_template);
    project_template.addChild(template_root);
    // create the project Thing, to be root of the whole project thing tree
    try {
        project.root_pt = new ProjectThing(project_template, project, project);
    } catch (Exception e) {
        IJError.print(e);
    }
    // create the user objects tree
    project.project_tree = new ProjectTree(project, project.root_pt);
    // create the layer's tree
    project.createLayerTemplates();
    // initialized with default values, and null parent to signal 'root'
    project.layer_set = new LayerSet(project, "Top Level", 0, 0, null, 2048, 2048);
    try {
        project.root_lt = new LayerThing(Project.layer_set_template, project, project.layer_set);
        project.layer_tree = new LayerTree(project, project.root_lt);
    } catch (Exception e) {
        project.remove();
        IJError.print(e);
    }
    // create the project control window, containing the trees in a double JSplitPane
    // beware that this call is asynchronous, dispatched by the SwingUtilities.invokeLater to avoid havok with Swing components.
    ControlWindow.add(project, project.template_tree, project.project_tree, project.layer_tree);
    // register
    al_open_projects.add(project);
    return project;
}
Also used : ProjectTree(ini.trakem2.tree.ProjectTree) LayerTree(ini.trakem2.tree.LayerTree) HashMap(java.util.HashMap) LayerSet(ini.trakem2.display.LayerSet) LayerThing(ini.trakem2.tree.LayerThing) TemplateThing(ini.trakem2.tree.TemplateThing) TemplateTree(ini.trakem2.tree.TemplateTree) ProjectThing(ini.trakem2.tree.ProjectThing)

Example 17 with Loader

use of ini.trakem2.persistence.Loader 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 18 with Loader

use of ini.trakem2.persistence.Loader in project TrakEM2 by trakem2.

the class Display method adjustProperties.

public void adjustProperties() {
    final GenericDialog gd = new GenericDialog("Properties", Display.this.frame);
    // gd.addNumericField("layer_scroll_step: ", this.scroll_step, 0);
    gd.addSlider("layer_scroll_step: ", 1, layer.getParent().size(), Display.this.scroll_step);
    gd.addChoice("snapshots_mode", LayerSet.snapshot_modes, LayerSet.snapshot_modes[layer.getParent().getSnapshotsMode()]);
    gd.addCheckbox("prefer_snapshots_quality", layer.getParent().snapshotsQuality());
    final Loader lo = getProject().getLoader();
    final boolean using_mipmaps = lo.isMipMapsRegenerationEnabled();
    gd.addCheckbox("enable_mipmaps", using_mipmaps);
    gd.addCheckbox("enable_layer_pixels virtualization", layer.getParent().isPixelsVirtualizationEnabled());
    final double max = layer.getParent().getLayerWidth() < layer.getParent().getLayerHeight() ? layer.getParent().getLayerWidth() : layer.getParent().getLayerHeight();
    gd.addSlider("max_dimension of virtualized layer pixels: ", 0, max, layer.getParent().getPixelsMaxDimension());
    gd.addCheckbox("Show arrow heads in Treeline/AreaTree", layer.getParent().paint_arrows);
    gd.addCheckbox("Show edge confidence boxes in Treeline/AreaTree", layer.getParent().paint_edge_confidence_boxes);
    gd.addSlider("Stroke width (Treeline, AreaTree, Ball)", 1.0, 10.0, DisplayCanvas.DEFAULT_STROKE.getLineWidth());
    gd.addCheckbox("Show color cues", layer.getParent().color_cues);
    gd.addSlider("+/- layers to color cue", 0, 10, layer.getParent().n_layers_color_cue);
    gd.addCheckbox("Show color cues for areas", layer.getParent().area_color_cues);
    gd.addCheckbox("Use red/blue for color cues", layer.getParent().use_color_cue_colors);
    gd.addCheckbox("Prepaint images", layer.getParent().prepaint);
    gd.addSlider("Preload ahead from sections: ", 0, layer.getParent().size(), layer.getParent().preload_ahead);
    // --------
    gd.showDialog();
    if (gd.wasCanceled())
        return;
    // --------
    int sc = (int) gd.getNextNumber();
    if (sc < 1)
        sc = 1;
    Display.this.scroll_step = sc;
    updateInDatabase("scroll_step");
    // 
    layer.getParent().setSnapshotsMode(gd.getNextChoiceIndex());
    layer.getParent().setSnapshotsQuality(gd.getNextBoolean());
    // 
    final boolean using_mipmaps2 = gd.getNextBoolean();
    if (using_mipmaps2 == using_mipmaps) {
    // Nothing changed
    } else if (!using_mipmaps2 && using_mipmaps) {
        // Desactivate mipmaps
        lo.setMipMapsRegeneration(false);
        lo.flushMipMaps(true);
    } else if (using_mipmaps2 && !using_mipmaps) {
        // Reactivate mipmaps
        lo.setMipMapsRegeneration(true);
        lo.generateMipMaps(layer.getParent().getDisplayables(Patch.class));
    }
    // 
    layer.getParent().setPixelsVirtualizationEnabled(gd.getNextBoolean());
    layer.getParent().setPixelsMaxDimension((int) gd.getNextNumber());
    layer.getParent().paint_arrows = gd.getNextBoolean();
    layer.getParent().paint_edge_confidence_boxes = gd.getNextBoolean();
    DisplayCanvas.DEFAULT_STROKE = new BasicStroke((float) Math.max(1, gd.getNextNumber()), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
    layer.getParent().color_cues = gd.getNextBoolean();
    layer.getParent().n_layers_color_cue = (int) gd.getNextNumber();
    layer.getParent().area_color_cues = gd.getNextBoolean();
    layer.getParent().use_color_cue_colors = gd.getNextBoolean();
    layer.getParent().prepaint = gd.getNextBoolean();
    layer.getParent().preload_ahead = (int) Math.min(gd.getNextNumber(), layer.getParent().size());
    Display.repaint(layer.getParent());
}
Also used : BasicStroke(java.awt.BasicStroke) GenericDialog(ij.gui.GenericDialog) Loader(ini.trakem2.persistence.Loader) Point(java.awt.Point)

Example 19 with Loader

use of ini.trakem2.persistence.Loader in project TrakEM2 by trakem2.

the class Project method destroy.

public boolean destroy() {
    if (null == loader) {
        return true;
    }
    if (loader.hasChanges() && !getBooleanProperty("no_shutdown_hook")) {
        // DBLoader always returns false
        if (ControlWindow.isGUIEnabled()) {
            final YesNoDialog yn = ControlWindow.makeYesNoDialog("TrakEM2", "There are unsaved changes in project " + title + ". Save them?");
            if (yn.yesPressed()) {
                save();
            }
        } else {
            Utils.log2("WARNING: closing project '" + title + "' with unsaved changes.");
        }
    }
    try {
        if (null != autosaving)
            autosaving.cancel(true);
    } catch (Throwable t) {
    }
    al_open_projects.remove(this);
    // flush all memory
    if (null != loader) {
        // the last project is destroyed twice for some reason, if several are open. This is a PATCH
        // and disconnect
        loader.destroy();
        loader = null;
    }
    if (null != layer_set)
        layer_set.destroy();
    // AFTER loader.destroy() call.
    ControlWindow.remove(this);
    if (null != template_tree)
        template_tree.destroy();
    if (null != project_tree)
        project_tree.destroy();
    if (null != layer_tree)
        layer_tree.destroy();
    Polyline.flushTraceCache(this);
    // flag to mean: we're closing
    this.template_tree = null;
    // close all open Displays
    Display.close(this);
    Search.removeTabs(this);
    synchronized (ptcache) {
        ptcache.clear();
    }
    return true;
}
Also used : YesNoDialog(ini.trakem2.display.YesNoDialog)

Example 20 with Loader

use of ini.trakem2.persistence.Loader in project TrakEM2 by trakem2.

the class Project method openDBProject.

/**
 * Open a TrakEM2 project from the database. Queries the database for existing projects and if more than one, asks which one to open.
 */
public static Project openDBProject() {
    if (Utils.wrongImageJVersion())
        return null;
    DBLoader loader = new DBLoader();
    if (!loader.isReady())
        return null;
    // check connection
    if (!loader.isConnected()) {
        Utils.showMessage("Can't talk to database.");
        loader.destroy();
        return null;
    }
    // query the database for existing projects
    Project[] projects = loader.getProjects();
    if (null == projects) {
        Utils.showMessage("Can't talk to database (null list of projects).");
        loader.destroy();
        return null;
    }
    Project project = null;
    if (0 == projects.length) {
        Utils.showMessage("No projects in this database.");
        loader.destroy();
        return null;
    } else if (1 == projects.length) {
        project = projects[0];
    } else {
        // ask to choose one
        String[] titles = new String[projects.length];
        for (int i = 0; i < projects.length; i++) {
            titles[i] = projects[i].title;
        }
        GenericDialog gd = new GenericDialog("Choose");
        gd.addMessage("Choose project to open:");
        gd.addChoice("project: ", titles, titles[titles.length - 1]);
        gd.showDialog();
        if (gd.wasCanceled()) {
            loader.destroy();
            return null;
        }
        project = projects[gd.getNextChoiceIndex()];
    }
    // check if the selected project is open already
    for (final Project p : al_open_projects) {
        if (loader.isIdenticalProjectSource(p.loader) && p.id == project.id && p.title.equals(project.title)) {
            Utils.showMessage("A project with title " + p.title + " and id " + p.id + " from the same database is already open.");
            loader.destroy();
            return null;
        }
    }
    // now, open the selected project
    // assign loader
    project.loader = loader;
    // grab the XML template
    TemplateThing template_root = loader.getTemplateRoot(project);
    if (null == template_root) {
        Utils.showMessage("Failed to retrieve the template tree.");
        project.destroy();
        return null;
    }
    project.template_tree = new TemplateTree(project, template_root);
    synchronized (project.ht_unique_tt) {
        project.ht_unique_tt.clear();
        project.ht_unique_tt.putAll(template_root.getUniqueTypes(new HashMap<String, TemplateThing>()));
    }
    // create the project Thing, to be root of the whole user Thing tree (and load all its objects)
    // to collect all created displayables, and  then reassign to the proper layers.
    HashMap<Long, Displayable> hs_d = new HashMap<Long, Displayable>();
    try {
        // create a template for the project Thing
        TemplateThing project_template = new TemplateThing("project");
        project.ht_unique_tt.put("project", project_template);
        project_template.addChild(template_root);
        project.root_pt = loader.getRootProjectThing(project, template_root, project_template, hs_d);
        // restore parent/child and attribute ownership and values (now that all Things exist)
        project.root_pt.setup();
    } catch (Exception e) {
        Utils.showMessage("Failed to retrieve the Thing tree for the project.");
        IJError.print(e);
        project.destroy();
        return null;
    }
    // create the user objects tree
    project.project_tree = new ProjectTree(project, project.root_pt);
    // restore the expanded state of each node
    loader.restoreNodesExpandedState(project);
    // create the layers templates
    project.createLayerTemplates();
    // fetch the root layer thing and the root layer set (will load all layers and layer sets, with minimal contents of patches; gets the basic objects -profile, pipe, etc.- from the project.root_pt). Will open all existing displays for each layer.
    LayerThing root_layer_thing = null;
    try {
        root_layer_thing = loader.getRootLayerThing(project, project.root_pt, Project.layer_set_template, Project.layer_template);
        if (null == root_layer_thing) {
            project.destroy();
            Utils.showMessage("Could not retrieve the root layer thing.");
            return null;
        }
        // set the child/parent relationships now that everything exists
        root_layer_thing.setup();
        project.layer_set = (LayerSet) root_layer_thing.getObject();
        if (null == project.layer_set) {
            project.destroy();
            Utils.showMessage("Could not retrieve the root layer set.");
            return null;
        }
        // set the active layer to each ZDisplayable
        project.layer_set.setup();
        // debug:
        // Utils.log2("$$$ root_lt: " + root_layer_thing + "   ob: " + root_layer_thing.getObject().getClass().getName() + "\n children: " + ((LayerSet)root_layer_thing.getObject()).getLayers().size());
        project.layer_tree = new LayerTree(project, root_layer_thing);
        project.root_lt = root_layer_thing;
    } catch (Exception e) {
        Utils.showMessage("Failed to retrieve the Layer tree for the project.");
        IJError.print(e);
        project.destroy();
        return null;
    }
    // if all when well, register as open:
    al_open_projects.add(project);
    // create the project control window, containing the trees in a double JSplitPane
    ControlWindow.add(project, project.template_tree, project.project_tree, project.layer_tree);
    // now open the displays that were stored for later, if any:
    Display.openLater();
    return project;
}
Also used : Displayable(ini.trakem2.display.Displayable) ZDisplayable(ini.trakem2.display.ZDisplayable) HashMap(java.util.HashMap) LayerThing(ini.trakem2.tree.LayerThing) TemplateTree(ini.trakem2.tree.TemplateTree) ProjectTree(ini.trakem2.tree.ProjectTree) LayerTree(ini.trakem2.tree.LayerTree) DBLoader(ini.trakem2.persistence.DBLoader) GenericDialog(ij.gui.GenericDialog) TemplateThing(ini.trakem2.tree.TemplateThing)

Aggregations

Loader (ini.trakem2.persistence.Loader)20 ImagePlus (ij.ImagePlus)13 Patch (ini.trakem2.display.Patch)11 FSLoader (ini.trakem2.persistence.FSLoader)11 ArrayList (java.util.ArrayList)7 HashMap (java.util.HashMap)7 LayerThing (ini.trakem2.tree.LayerThing)6 Rectangle (java.awt.Rectangle)6 ImageProcessor (ij.process.ImageProcessor)5 Layer (ini.trakem2.display.Layer)5 TemplateThing (ini.trakem2.tree.TemplateThing)5 ZDisplayable (ini.trakem2.display.ZDisplayable)4 ProjectThing (ini.trakem2.tree.ProjectThing)4 IllDefinedDataPointsException (mpicbg.models.IllDefinedDataPointsException)4 NotEnoughDataPointsException (mpicbg.models.NotEnoughDataPointsException)4 ImageStack (ij.ImageStack)3 GenericDialog (ij.gui.GenericDialog)3 Displayable (ini.trakem2.display.Displayable)3 LayerSet (ini.trakem2.display.LayerSet)3 LayerTree (ini.trakem2.tree.LayerTree)3