From 6c6c0c56ff965a73fe7e46bb41111bca787a569c Mon Sep 17 00:00:00 2001 From: Albert Cardona Date: Tue, 21 Apr 2009 15:31:22 -0400 Subject: [PATCH] Now importing a sequence as grid and related use the new AlignTask --- ini/trakem2/imaging/StitchingTEM.java | 7 +++- mpicbg/trakem2/align/AlignTask.java | 77 ++++++++++++++++++++++++++++++----- 2 files changed, 72 insertions(+), 12 deletions(-) diff --git a/ini/trakem2/imaging/StitchingTEM.java b/ini/trakem2/imaging/StitchingTEM.java index 7beab998..ef8a05f1 100644 --- a/ini/trakem2/imaging/StitchingTEM.java +++ b/ini/trakem2/imaging/StitchingTEM.java @@ -65,6 +65,7 @@ import java.util.Iterator; import java.util.Vector; import java.awt.geom.AffineTransform; +import mpicbg.trakem2.align.AlignTask; /** Given: * - list of images @@ -144,9 +145,11 @@ public class StitchingTEM { case StitchingTEM.TOP_LEFT_RULE: return StitchingTEM.stitchTopLeft(patch, grid_width, percent_overlap, (scale > 1 ? 1 : scale), default_bottom_top_overlap, default_left_right_overlap, optimize); case StitchingTEM.FREE_RULE: - HashSet hs = new HashSet(); + final HashSet hs = new HashSet(); for (int i=0; i fixed = new ArrayList(); + fixed.add(patch[0]); + return AlignTask.alignPatchesTask( new ArrayList(hs), fixed ); } return null; } diff --git a/mpicbg/trakem2/align/AlignTask.java b/mpicbg/trakem2/align/AlignTask.java index 0ae46561..949342d6 100644 --- a/mpicbg/trakem2/align/AlignTask.java +++ b/mpicbg/trakem2/align/AlignTask.java @@ -68,22 +68,83 @@ final public class AlignTask }; return Bureaucrat.createAndStart( worker, selection.getProject() ); } - - + + final static public void alignSelection( final Selection selection ) { List< Patch > patches = new ArrayList< Patch >(); - for ( Displayable d : Display.getFront().getSelection().getSelected() ) + for ( Displayable d : selection.getSelected() ) if ( d instanceof Patch ) patches.add( ( Patch )d ); + List< Patch > fixedPatches = new ArrayList< Patch >(); + + // Add active Patch, if any, as the nail + Displayable active = selection.getActive(); + if ( null != active && active instanceof Patch ) + fixedPatches.add( (Patch)active ); + + // Add all locked Patch instances to fixedPatches + for (final Patch patch : patches) + if ( patch.isLocked() ) + fixedPatches.add( patch ); + + alignPatches( patches, fixedPatches ); + } + + final static public Bureaucrat alignPatchesTask ( final List< Patch > patches , final List< Patch > fixedPatches ) + { + if ( 0 == patches.size()) + { + Utils.log("Can't align zero patches."); + return null; + } + Worker worker = new Worker("Aligning images", false, true) { + public void run() { + startedWorking(); + try { + alignPatches( patches, fixedPatches ); + Display.repaint(); + } catch (Throwable e) { + IJError.print(e); + } finally { + finishedWorking(); + } + } + public void cleanup() { + patches.get(0).getLayer().getParent().undoOneStep(); + } + }; + return Bureaucrat.createAndStart( worker, patches.get(0).getProject() ); + } + + /** + * @param patches: the list of Patch instances to align, all belonging to the same Layer. + * @param fixed: the list of Patch instances to keep locked in place, if any. + */ + final static public void alignPatches( final List< Patch > patches , final List< Patch > fixedPatches ) + { if ( patches.size() < 2 ) { - Utils.log("No images to align in the selection."); + Utils.log("No images to align."); return; } - + + for ( final Patch patch : fixedPatches ) + { + if ( !patches.contains( patch ) ) + { + Utils.log("The list of fixed patches contains at least one Patch not included in the list of patches to align!"); + return; + } + if ( patch.isLinked() && !patch.isOnlyLinkedTo( Patch.class ) ) + { + Utils.log("At least one Patch is linked to non-image data, can't align!"); + return; + } + } + //final Align.ParamOptimize p = Align.paramOptimize; - final GenericDialog gd = new GenericDialog( "Align Selected Tiles" ); + final GenericDialog gd = new GenericDialog( "Align Tiles" ); Align.paramOptimize.addFields( gd ); gd.addMessage( "Miscellaneous:" ); @@ -102,10 +163,6 @@ final public class AlignTask deleteDisconnectedTiles = gd.getNextBoolean(); final Align.ParamOptimize p = Align.paramOptimize.clone(); - List< Patch > fixedPatches = new ArrayList< Patch >(); - final Displayable active = selection.getActive(); - if ( active != null && active instanceof Patch ) - fixedPatches.add( ( Patch )active ); List< AbstractAffineTile2D< ? > > tiles = new ArrayList< AbstractAffineTile2D< ? > >(); List< AbstractAffineTile2D< ? > > fixedTiles = new ArrayList< AbstractAffineTile2D< ? > > (); -- 2.11.4.GIT