Search in sources :

Example 21 with Worker

use of ini.trakem2.utils.Worker in project TrakEM2 by trakem2.

the class Display method importNextImage.

protected Bureaucrat importNextImage() {
    final Worker worker = new // / all this verbosity is what happens when functions are not first class citizens. I could abstract it away by passing a string name "importImage" and invoking it with reflection, but that is an even bigger PAIN
    Worker(// / all this verbosity is what happens when functions are not first class citizens. I could abstract it away by passing a string name "importImage" and invoking it with reflection, but that is an even bigger PAIN
    "Import image") {

        @Override
        public void run() {
            startedWorking();
            try {
                final Rectangle srcRect = canvas.getSrcRect();
                // - imp.getWidth() / 2;
                final int x = srcRect.x + srcRect.width / 2;
                // - imp.getHeight()/ 2;
                final int y = srcRect.y + srcRect.height / 2;
                final Patch p = project.getLoader().importNextImage(project, x, y);
                if (null == p) {
                    Utils.showMessage("Could not open next image.");
                    finishedWorking();
                    return;
                }
                Display.this.getLayerSet().addLayerContentStep(layer);
                // will add it to the proper Displays
                layer.add(p);
                Display.this.getLayerSet().addLayerContentStep(layer);
            } catch (final Exception e) {
                IJError.print(e);
            }
            finishedWorking();
        }
    };
    return Bureaucrat.createAndStart(worker, getProject());
}
Also used : Rectangle(java.awt.Rectangle) Worker(ini.trakem2.utils.Worker) Point(java.awt.Point) NoninvertibleTransformException(java.awt.geom.NoninvertibleTransformException)

Example 22 with Worker

use of ini.trakem2.utils.Worker in project TrakEM2 by trakem2.

the class ProjectTree method actionPerformed.

public void actionPerformed(final ActionEvent ae) {
    if (!project.isInputEnabled())
        return;
    super.dispatcher.exec(new Runnable() {

        public void run() {
            try {
                if (null == selected_node)
                    return;
                final Object ob = selected_node.getUserObject();
                if (!(ob instanceof ProjectThing))
                    return;
                final ProjectThing thing = (ProjectThing) ob;
                int i_position = 0;
                String command = ae.getActionCommand();
                final Object obd = thing.getObject();
                if (command.startsWith("new ") || command.equals("Duplicate")) {
                    ProjectThing new_thing = null;
                    if (command.startsWith("new ")) {
                        // if it's a Displayable, it will be added to whatever layer is in the front Display
                        new_thing = thing.createChild(command.substring(4));
                    } else if (command.equals("Duplicate")) {
                        // just to keep myself from screwing in the future
                        if (Project.isBasicType(thing.getType()) && null != thing.getParent()) {
                            new_thing = ((ProjectThing) thing.getParent()).createClonedChild(thing);
                        }
                        // adjust parent
                        selected_node = (DefaultMutableTreeNode) selected_node.getParent();
                    }
                    // add it to the tree
                    if (null != new_thing) {
                        DefaultMutableTreeNode new_node = new DefaultMutableTreeNode(new_thing);
                        ((DefaultTreeModel) ProjectTree.this.getModel()).insertNodeInto(new_node, selected_node, i_position);
                        TreePath treePath = new TreePath(new_node.getPath());
                        ProjectTree.this.scrollPathToVisible(treePath);
                        ProjectTree.this.setSelectionPath(treePath);
                    }
                    // bring the display to front
                    if (new_thing.getObject() instanceof Displayable) {
                        Display.getFront().getFrame().toFront();
                    }
                } else if (command.equals("many...")) {
                    ArrayList<TemplateThing> children = thing.getTemplate().getChildren();
                    if (null == children || 0 == children.size())
                        return;
                    String[] cn = new String[children.size()];
                    int i = 0;
                    for (final TemplateThing child : children) {
                        cn[i] = child.getType();
                        i++;
                    }
                    GenericDialog gd = new GenericDialog("Add many children");
                    gd.addNumericField("Amount: ", 1, 0);
                    gd.addChoice("New child: ", cn, cn[0]);
                    gd.addCheckbox("Recursive", true);
                    gd.showDialog();
                    if (gd.wasCanceled())
                        return;
                    int amount = (int) gd.getNextNumber();
                    if (amount < 1) {
                        Utils.showMessage("Makes no sense to create less than 1 child!");
                        return;
                    }
                    project.getRootLayerSet().addChangeTreesStep();
                    final ArrayList<ProjectThing> nc = thing.createChildren(cn[gd.getNextChoiceIndex()], amount, gd.getNextBoolean());
                    addLeafs(nc, new Runnable() {

                        public void run() {
                            project.getRootLayerSet().addChangeTreesStep();
                        }
                    });
                } else if (command.equals("Unhide")) {
                    thing.setVisible(true);
                } else if (command.equals("Select in display")) {
                    boolean shift_down = 0 != (ae.getModifiers() & ActionEvent.SHIFT_MASK);
                    selectInDisplay(thing, shift_down);
                } else if (command.equals("Show centered in Display")) {
                    if (obd instanceof Displayable) {
                        Displayable displ = (Displayable) obd;
                        Display.showCentered(displ.getLayer(), displ, true, 0 != (ae.getModifiers() & ActionEvent.SHIFT_MASK));
                    }
                } else if (command.equals("Show tabular view")) {
                    ((Tree<?>) obd).createMultiTableView();
                } else if (command.equals("Show in 3D")) {
                    Display3D.showAndResetView(thing);
                } else if (command.equals("Remove from 3D view")) {
                    Display3D.removeFrom3D(thing);
                } else if (command.equals("Hide")) {
                    // find all Thing objects in this subtree starting at Thing and hide their Displayable objects.
                    thing.setVisible(false);
                } else if (command.equals("Delete...")) {
                    // store old state
                    project.getRootLayerSet().addChangeTreesStep();
                    remove(true, thing, selected_node);
                    // store new state
                    project.getRootLayerSet().addChangeTreesStep();
                    return;
                } else if (command.equals("Rename...")) {
                    // if (!Project.isBasicType(thing.getType())) {
                    rename(thing);
                // }
                } else if (command.equals("Measure")) {
                    // block displays while measuring
                    Bureaucrat.createAndStart(new Worker("Measuring") {

                        public void run() {
                            startedWorking();
                            try {
                                thing.measure();
                            } catch (Throwable e) {
                                IJError.print(e);
                            } finally {
                                finishedWorking();
                            }
                        }
                    }, thing.getProject());
                } else /* else if (command.equals("Export 3D...")) {
				GenericDialog gd = ControlWindow.makeGenericDialog("Export 3D");
				String[] choice = new String[]{".svg [preserves links and hierarchical grouping]", ".shapes [limited to one profile per layer per profile_list]"};
				gd.addChoice("Export to: ", choice, choice[0]);
				gd.addNumericField("Z scaling: ", 1, 2);
				gd.showDialog();
				if (gd.wasCanceled()) return;
				double z_scale = gd.getNextNumber();
				switch (gd.getNextChoiceIndex()) {
					case 0:
						Render.exportSVG(thing, z_scale);
						break;
					case 1:
						new Render(thing).save(z_scale);
						break;
				}
			}*/
                if (command.equals("Export project...") || command.equals("Save as...")) {
                    // "Save as..." is for a FS project
                    Utils.log2("Calling export project at " + System.currentTimeMillis());
                    thing.getProject().getLoader().saveTask(thing.getProject(), "Save as...");
                } else if (command.equals("Save")) {
                    // overwrite the xml file of a FSProject
                    // Just do the same as in "Save as..." but without saving the images and overwritting the XML file without asking.
                    thing.getProject().getLoader().saveTask(thing.getProject(), "Save");
                } else if (command.equals("Info")) {
                    showInfo(thing);
                    return;
                } else if (command.equals("Move up")) {
                    move(selected_node, -1);
                } else if (command.equals("Move down")) {
                    move(selected_node, 1);
                } else if (command.equals("Collapse nodes of children nodes")) {
                    if (null == selected_node)
                        return;
                    Enumeration<?> c = selected_node.children();
                    while (c.hasMoreElements()) {
                        DefaultMutableTreeNode child = (DefaultMutableTreeNode) c.nextElement();
                        if (child.isLeaf())
                            continue;
                        collapsePath(new TreePath(child.getPath()));
                    }
                } else if (command.equals("Sibling project")) {
                    sendToSiblingProjectTask(selected_node);
                } else {
                    Utils.log("ProjectTree.actionPerformed: don't know what to do with the command: " + command);
                    return;
                }
            } catch (Exception e) {
                IJError.print(e);
            }
        }
    });
}
Also used : Displayable(ini.trakem2.display.Displayable) ZDisplayable(ini.trakem2.display.ZDisplayable) DefaultMutableTreeNode(javax.swing.tree.DefaultMutableTreeNode) TreePath(javax.swing.tree.TreePath) GenericDialog(ij.gui.GenericDialog) AreaTree(ini.trakem2.display.AreaTree) Tree(ini.trakem2.display.Tree) JTree(javax.swing.JTree) Worker(ini.trakem2.utils.Worker) DBObject(ini.trakem2.persistence.DBObject)

Example 23 with Worker

use of ini.trakem2.utils.Worker in project TrakEM2 by trakem2.

the class Polyline method mousePressed.

@Override
public void mousePressed(final MouseEvent me, final Layer layer, int x_p, int y_p, final double mag) {
    // transform the x_p, y_p to the local coordinates
    final int x_pd = x_p;
    final int y_pd = y_p;
    if (!this.at.isIdentity()) {
        final Point2D.Double po = inverseTransformPoint(x_p, y_p);
        x_p = (int) po.x;
        y_p = (int) po.y;
    }
    final int tool = ProjectToolbar.getToolId();
    final Display display = ((DisplayCanvas) me.getSource()).getDisplay();
    final long layer_id = layer.getId();
    index = findPoint(x_p, y_p, layer_id, mag);
    if (ProjectToolbar.PENCIL == tool && n_points > 0 && -1 == index && !me.isShiftDown() && !Utils.isControlDown(me)) {
        // Check that there are any images -- otherwise may hang. TODO
        if (layer_set.getDisplayables(Patch.class).isEmpty()) {
            Utils.log("No images are present!");
            return;
        }
        final double scale = layer_set.getVirtualizationScale();
        // Ok now with all found images, create a virtual stack that provides access to them all, with caching.
        final Worker[] worker = new Worker[2];
        final TraceParameters tr_ = tr_map.get(layer_set);
        final TraceParameters tr = null == tr_ ? new TraceParameters() : tr_;
        if (null == tr_) {
            synchronized (tr_map) {
                tr_map.put(layer_set, tr);
            }
        }
        if (tr.update) {
            worker[0] = new Worker("Preparing Hessian...") {

                @Override
                public void run() {
                    startedWorking();
                    try {
                        Utils.log("Push ESCAPE key to cancel autotrace anytime.");
                        final ImagePlus virtual = new LayerStack(layer_set, scale, ImagePlus.GRAY8, Patch.class, display.getDisplayChannelAlphas(), Segmentation.fmp.SNT_invert_image).getImagePlus();
                        // virtual.show();
                        final Calibration cal = virtual.getCalibration();
                        double minimumSeparation = 1;
                        if (cal != null)
                            minimumSeparation = Math.min(cal.pixelWidth, Math.min(cal.pixelHeight, cal.pixelDepth));
                        final ComputeCurvatures hessian = new ComputeCurvatures(virtual, minimumSeparation, null, cal != null);
                        hessian.run();
                        tr.virtual = virtual;
                        // tr.scale = scale;
                        tr.hessian = hessian;
                        tr.update = false;
                    } catch (final Exception e) {
                        IJError.print(e);
                    }
                    finishedWorking();
                }
            };
            Bureaucrat.createAndStart(worker[0], project);
        }
        final Point2D.Double po = transformPoint(p[0][n_points - 1], p[1][n_points - 1]);
        final int start_x = (int) po.x;
        final int start_y = (int) po.y;
        // 0-based
        final int start_z = layer_set.indexOf(layer_set.getLayer(p_layer[n_points - 1]));
        // must transform into virtual space
        final int goal_x = (int) (x_pd * scale);
        final int goal_y = (int) (y_pd * scale);
        final int goal_z = layer_set.indexOf(layer);
        /*
			Utils.log2("x_pd, y_pd : " + x_pd + ", " + y_pd);
			Utils.log2("scale: " + scale);
			Utils.log2("start: " + start_x + "," + start_y + ", " + start_z);
			Utils.log2("goal: " + goal_x + "," + goal_y + ", " + goal_z);
			Utils.log2("virtual: " + tr.virtual);
			*/
        final boolean simplify = me.isAltDown();
        worker[1] = new Worker("Tracer - waiting on hessian") {

            @Override
            public void run() {
                startedWorking();
                try {
                    if (null != worker[0]) {
                        // Wait until hessian is ready
                        worker[0].join();
                    }
                    setTaskName("Tracing path");
                    final int reportEveryMilliseconds = 2000;
                    tr.tracer = new TracerThread(tr.virtual, 0, 255, // timeout seconds
                    120, reportEveryMilliseconds, start_x, start_y, start_z, goal_x, goal_y, goal_z, // reciproal pix values at start and goal
                    true, tr.virtual.getStackSize() == 1, tr.hessian, null == tr.hessian ? 1 : 4, null, null != tr.hessian);
                    tr.tracer.addProgressListener(new SearchProgressCallback() {

                        @Override
                        public void pointsInSearch(final SearchInterface source, final int inOpen, final int inClosed) {
                            worker[1].setTaskName("Tracing path: open=" + inOpen + " closed=" + inClosed);
                        }

                        @Override
                        public void finished(final SearchInterface source, final boolean success) {
                            if (!success) {
                                Utils.logAll("Could NOT trace a path");
                            }
                        }

                        @Override
                        public void threadStatus(final SearchInterface source, final int currentStatus) {
                            // This method gets called every reportEveryMilliseconds
                            if (worker[1].hasQuitted()) {
                                source.requestStop();
                            }
                        }
                    });
                    tr.tracer.run();
                    final Path result = tr.tracer.getResult();
                    tr.tracer = null;
                    if (null == result) {
                        // : "+
                        Utils.log("Finding a path failed");
                        // not public //SearchThread.exitReasonStrings[tracer.getExitReason()]);
                        return;
                    }
                    // TODO: precise_x_positions etc are likely to be broken (calibrated or something)
                    // Remove bogus points: those at the end with 0,0 coords
                    int len = result.points;
                    final double[][] pos = result.getXYZUnscaled();
                    for (int i = len - 1; i > -1; i--) {
                        if (0 == pos[0][i] && 0 == pos[1][i]) {
                            len--;
                        } else
                            break;
                    }
                    // Transform points: undo scale, and bring to this Polyline AffineTransform:
                    final AffineTransform aff = new AffineTransform();
                    /* Inverse order: */
                    /* 2 */
                    aff.concatenate(Polyline.this.at.createInverse());
                    /* 1 */
                    aff.scale(1 / scale, 1 / scale);
                    final double[] po = new double[len * 2];
                    for (int i = 0, j = 0; i < len; i++, j += 2) {
                        po[j] = pos[0][i];
                        po[j + 1] = pos[1][i];
                    }
                    final double[] po2 = new double[len * 2];
                    // what a stupid format: consecutive x,y pairs
                    aff.transform(po, 0, po2, 0, len);
                    long[] p_layer_ids = new long[len];
                    double[] pox = new double[len];
                    double[] poy = new double[len];
                    for (int i = 0, j = 0; i < len; i++, j += 2) {
                        // z_positions in 0-(N-1), not in 1-N like slices!
                        p_layer_ids[i] = layer_set.getLayer((int) pos[2][i]).getId();
                        pox[i] = po2[j];
                        poy[i] = po2[j + 1];
                    }
                    // Simplify path: to steps of 5 calibration units, or 5 pixels when not calibrated.
                    if (simplify) {
                        setTaskName("Simplifying path");
                        final Object[] ob = Polyline.simplify(pox, poy, p_layer_ids, 10000, layer_set);
                        pox = (double[]) ob[0];
                        poy = (double[]) ob[1];
                        p_layer_ids = (long[]) ob[2];
                        len = pox.length;
                    }
                    // Record the first newly-added autotraced point index:
                    last_autotrace_start = Polyline.this.n_points;
                    Polyline.this.appendPoints(pox, poy, p_layer_ids, len);
                    Polyline.this.repaint(true, null);
                    Utils.logAll("Added " + len + " new points.");
                } catch (final Exception e) {
                    IJError.print(e);
                }
                finishedWorking();
            }
        };
        Bureaucrat.createAndStart(worker[1], project);
        index = -1;
        return;
    }
    if (ProjectToolbar.PEN == tool || ProjectToolbar.PENCIL == tool) {
        if (Utils.isControlDown(me) && me.isShiftDown()) {
            final long lid = Display.getFrontLayer(this.project).getId();
            if (-1 == index || lid != p_layer[index]) {
                index = findNearestPoint(x_p, y_p, layer_id);
            }
            if (-1 != index) {
                // delete point
                removePoint(index);
                index = -1;
                repaint(false, null);
            }
            // In any case, terminate
            return;
        }
        if (// disable!
        -1 != index && layer_id != p_layer[index])
            // disable!
            index = -1;
        else // if no conditions are met, attempt to add point
        if (-1 == index && !me.isShiftDown() && !me.isAltDown()) {
            // add a new point
            index = addPoint(x_p, y_p, layer_id, mag);
            is_new_point = true;
            repaint(false, null);
            return;
        }
    }
}
Also used : Path(tracing.Path) SearchInterface(tracing.SearchInterface) ComputeCurvatures(features.ComputeCurvatures) Calibration(ij.measure.Calibration) ImagePlus(ij.ImagePlus) NoninvertibleTransformException(java.awt.geom.NoninvertibleTransformException) Point2D(java.awt.geom.Point2D) LayerStack(ini.trakem2.imaging.LayerStack) TracerThread(tracing.TracerThread) Worker(ini.trakem2.utils.Worker) AffineTransform(java.awt.geom.AffineTransform) SearchProgressCallback(tracing.SearchProgressCallback)

Example 24 with Worker

use of ini.trakem2.utils.Worker in project TrakEM2 by trakem2.

the class StitchingTEM method montageWithPhaseCorrelation.

/**
 * @param layers
 * @param worker Optional, the {@link Worker} running this task.
 */
public static void montageWithPhaseCorrelation(final List<Layer> layers, final Worker worker) {
    final PhaseCorrelationParam param = new PhaseCorrelationParam();
    final Collection<Displayable> col = layers.get(0).getDisplayables(Patch.class);
    if (!param.setup(col.size() > 0 ? (Patch) col.iterator().next() : null)) {
        return;
    }
    final int i = 1;
    for (final Layer la : layers) {
        if (Thread.currentThread().isInterrupted() || (null != worker && worker.hasQuitted()))
            return;
        if (null != worker)
            worker.setTaskName("Montage layer " + i + "/" + layers.size());
        final Collection<Patch> patches = (Collection<Patch>) (Collection) la.getDisplayables(Patch.class);
        AlignTask.transformPatchesAndVectorData(patches, new Runnable() {

            @Override
            public void run() {
                montageWithPhaseCorrelation(patches, param);
            }
        });
    }
}
Also used : Displayable(ini.trakem2.display.Displayable) Collection(java.util.Collection) Layer(ini.trakem2.display.Layer) Patch(ini.trakem2.display.Patch) Point(mpicbg.models.Point)

Example 25 with Worker

use of ini.trakem2.utils.Worker in project TrakEM2 by trakem2.

the class DistortionCorrectionTask method correctDistortionFromSelection.

public static final Bureaucrat correctDistortionFromSelection(final Selection selection) {
    final List<Patch> patches = new ArrayList<Patch>();
    for (final Displayable d : Display.getFront().getSelection().getSelected()) if (d instanceof Patch)
        patches.add((Patch) d);
    if (patches.size() < 2) {
        Utils.log("No images in the selection.");
        return null;
    }
    final Worker worker = new Worker("Lens correction") {

        @Override
        public final void run() {
            try {
                startedWorking();
                if (!correctDistortionFromSelectionParam.setup(selection))
                    return;
                DistortionCorrectionTask.run(correctDistortionFromSelectionParam.clone(), patches, selection.getActive(), selection.getLayer(), null);
                Display.repaint();
            } catch (final Exception e) {
                IJError.print(e);
            } finally {
                finishedWorking();
            }
        }
    };
    return Bureaucrat.createAndStart(worker, selection.getProject());
}
Also used : Displayable(ini.trakem2.display.Displayable) ArrayList(java.util.ArrayList) Worker(ini.trakem2.utils.Worker) Patch(ini.trakem2.display.Patch)

Aggregations

Worker (ini.trakem2.utils.Worker)20 ArrayList (java.util.ArrayList)10 ImagePlus (ij.ImagePlus)9 Patch (ini.trakem2.display.Patch)8 File (java.io.File)8 GenericDialog (ij.gui.GenericDialog)7 Displayable (ini.trakem2.display.Displayable)7 Rectangle (java.awt.Rectangle)7 HashSet (java.util.HashSet)7 IOException (java.io.IOException)6 Future (java.util.concurrent.Future)6 FormatException (loci.formats.FormatException)6 DirectoryChooser (ij.io.DirectoryChooser)5 Project (ini.trakem2.Project)5 Layer (ini.trakem2.display.Layer)5 VectorString3D (ini.trakem2.vector.VectorString3D)5 HashMap (java.util.HashMap)5 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)5 Calibration (ij.measure.Calibration)4 ZDisplayable (ini.trakem2.display.ZDisplayable)4