// hit = 0x01< 0 ) { getCursorLoc( x, y, z, flags ); Overlay.getBounds( id, bx, by, bw, bh ); if( id < 0 ) break; Overlay.moveSelection( id, x - bw / 2, y - bh / 2 ); Overlay.getBounds( id, bx, by, bw, bh ); d = newArray( bx, bx + bw / 2, bx + bw, by, by + bw / 2, by + bh ); while( Overlay.size > n ) Overlay.removeSelection( Overlay.size - 1 ); hit = 0x00; for( i = 0; i < r.length; i = i + 6 ) { // each element for( p = 0; p < 6; p ++ ) // each remarkable point if( abs( d [ p ]- r [ i + p ] )< 5 ) { hit = hit |( 0x01 << p ); // allows for multiple hits } if( hit > 0 ) { ihit = i; break; } } for( i = 0; i < 6; i ++ ) { if( hit &( 1 << i )> 0 ) { if( i < 3 ) { Overlay.getBounds( id, bx, by, bw, bh ); Overlay.drawLine( r [ ihit + i ], 0, r [ ihit + i ], getHeight ); if( i == 0 ) Overlay.moveSelection( id, r [ ihit + i ], by ); if( i == 1 ) Overlay.moveSelection( id, r [ ihit + i ]- bw / 2, by ); if( i == 2 ) Overlay.moveSelection( id, r [ ihit + i ]- bw, by ); } if( i >= 3 ) { Overlay.getBounds( id, bx, by, bw, bh ); Overlay.drawLine( 0, r [ ihit + i ], getWidth, r [ ihit + i ] ); if( i == 3 ) Overlay.moveSelection( id, bx, r [ ihit + i ] ); if( i == 4 ) Overlay.moveSelection( id, bx, r [ ihit + i ]- bh / 2 ); if( i == 5 ) Overlay.moveSelection( id, bx, r [ ihit + i ]- bh ); } } } Overlay.show; wait( 20 ); } while( Overlay.size > n ) Overlay.removeSelection( Overlay.size - 1 ); } // a tool to select one or more overlay elements // selection is stored in preferences // click outside a roi to deselect all // a menu tool to align selected overlay elements macro "Select Overlay Tool - Ce00R22fbC0e0o0044C037L77ffL777aL77a7" { getCursorLoc( x, y, z, flags ); Overlay.removeRois( 'ToolSelectedOverlayElement' ); Overlay.show; n = Overlay.size; if( n < 1 ) exit( "Overlay required" ); id = Overlay.indexAt( x, y ); if( id < 0 ) { selectNone( ); call( 'ij.Prefs.set', 'overlaytoolset.selected', '' ); exit( ); } if( flags & 1 > 0 ) { Overlay.activateSelection( id ); if( Roi.getName != 'ToolSelectedOverlayElement' ) selectElement( id, true ); } else { Overlay.activateSelection( id ); if( Roi.getName != 'ToolSelectedOverlayElement' ) selectElement( id, false ); } run( "Select None" ); highlightSelectedROIs( ); } function highlightSelectedROIs( ) { Overlay.removeRois( 'ToolSelectedOverlayElement' ); selected = getSelectedElements( ); s = split( selected, ',' ); //print( selected ); for( i = 0; i < s.length; i ++ ) { id = s [ i ]; Overlay.getBounds( id, bx, by, bw, bh ); makeRectangle( bx, by, bw, bh ); Roi.setName( 'ToolSelectedOverlayElement' ); Overlay.addSelection( '#90ff0000', 3 ); } run( "Select None" ); Overlay.show; } function selectNone( ) { Overlay.removeRois( 'ToolSelectedOverlayElement' ); Overlay.show; //call( 'ij.Prefs.set', 'overlaytoolset.selected', '' ); } function selectElement( id, add ) { if( add == true ) { selected = getSelectedElements( ); s = split( selected, ',' ); isSelected = false; for( i = 0; i < s.length; i ++ ) { if( 1 * s [ i ]== id ) isSelected = true; } if( ! isSelected ) { call( 'ij.Prefs.set', 'overlaytoolset.selected', selected + ',' + id ); selected = getSelectedElements( ); } else { unselectElement( id ); } } else { call( 'ij.Prefs.set', 'overlaytoolset.selected', id ); } highlightSelectedROIs( ); } function unselectElement( id ) { selected = getSelectedElements( ); s = split( selected, ',' ); selected = ''; for( i = 0; i < s.length; i ++ ) { if( s [ i ]!= id ) selected = selected + s [ i ]+ ','; } call( 'ij.Prefs.set', 'overlaytoolset.selected', selected ); selected = getSelectedElements( ); highlightSelectedROIs( ); run( "Select None" ); } function getSelectedElements( ) { selected = call( 'ij.Prefs.get', 'overlaytoolset.selected', '' ); while( selected.endsWith( "," ) ) selected = substring( selected, 0, lengthOf( selected )- 1 ); while( selected.startsWith( "," ) ) selected = substring( selected, 1, lengthOf( selected ) ); return selected; } var dCmds = newMenu( "Align Overlay Menu Tool", newArray( "Top", "Middle", "Bottom", "-", "Left", "Center", "Right" ) ); // a menu tool to align selected ROIs macro "Align Overlay Menu Tool - C037L00f0R2244R8248" { cmd = getArgument( ); if( cmd == "Top" ) { s = getSelectedElements( ); s = split( s, ',' ); if( s.length < 1 ) exit( ); tops = newArray( s.length ); for( i = 0; i < tops.length; i ++ ) { Overlay.getBounds( s [ i ], x, y, w, h ); tops [ i ]= y; } //Array.print( tops ); Array.getStatistics( tops, min, max, mean, stdDev ); for( i = 0; i < tops.length; i ++ ) { Overlay.getBounds( s [ i ], x, y, w, h ); Overlay.moveSelection( s [ i ], x, min ); } Overlay.show( ); } else if( cmd == "Bottom" ) { s = getSelectedElements( ); s = split( s, ',' ); if( s.length < 1 ) exit( ); tops = newArray( s.length ); for( i = 0; i < tops.length; i ++ ) { Overlay.getBounds( s [ i ], x, y, w, h ); tops [ i ]= y + h; } Array.getStatistics( tops, min, max, mean, stdDev ); for( i = 0; i < tops.length; i ++ ) { Overlay.getBounds( s [ i ], x, y, w, h ); Overlay.moveSelection( s [ i ], x, max - h ); } selectNone( ); } else if( cmd == "Left" ) { s = getSelectedElements( ); s = split( s, ',' ); if( s.length < 1 ) exit( ); tops = newArray( s.length ); for( i = 0; i < tops.length; i ++ ) { Overlay.getBounds( s [ i ], x, y, w, h ); tops [ i ]= x; } Array.getStatistics( tops, min, max, mean, stdDev ); for( i = 0; i < tops.length; i ++ ) { Overlay.getBounds( s [ i ], x, y, w, h ); Overlay.moveSelection( s [ i ], min, y ); } selectNone( ); } else if( cmd == "Right" ) { s = getSelectedElements( ); s = split( s, ',' ); if( s.length < 1 ) exit( ); tops = newArray( s.length ); for( i = 0; i < tops.length; i ++ ) { Overlay.getBounds( s [ i ], x, y, w, h ); tops [ i ]= x + w; } Array.getStatistics( tops, min, max, mean, stdDev ); for( i = 0; i < tops.length; i ++ ) { Overlay.getBounds( s [ i ], x, y, w, h ); Overlay.moveSelection( s [ i ], max - w, y ); } selectNone( ); } else if( cmd == "Middle" ) { s = getSelectedElements( ); s = split( s, ',' ); if( s.length < 1 ) exit( ); Overlay.getBounds( s [ 0 ], x, y, w, h ); middle = y + h / 2; for( i = 0; i < s.length; i ++ ) { Overlay.getBounds( s [ i ], x, y, w, h ); Overlay.moveSelection( s [ i ], x, middle - h / 2 ); } selectNone( ); } else if( cmd == "Center" ) { s = getSelectedElements( ); s = split( s, ',' ); if( s.length < 1 ) exit( ); Overlay.getBounds( s [ 0 ], x, y, w, h ); center = x + w / 2; for( i = 0; i < s.length; i ++ ) { Overlay.getBounds( s [ i ], x, y, w, h ); Overlay.moveSelection( s [ i ], center - w / 2, y ); } selectNone( ); } highlightSelectedROIs( ); } // Click to delete Overlay element // A confirm dialog is shown // you can choose not to show it. macro "Delete Overlay Tool - C037R00ddB58Cd00L0088L0880" { getCursorLoc( x, y, z, flags ); selectNone( ); call( 'ij.Prefs.set', 'overlaytoolset.selected', '' ); id = Overlay.indexAt( x, y ); if( id != - 1 ) { showWarning = call( "ij.Prefs.get", "overlaytoolset.deletewarning", true ); mustDelete = true; if( showWarning == true ) { Dialog.create( "Delete ROI tool options" ); Dialog.addCheckbox( "Delete this ROI", true ); Dialog.addCheckbox( "Show this dialog", showWarning ); Dialog.show( ); mustDelete = Dialog.getCheckbox( ); showWarning = Dialog.getCheckbox( ); call( "ij.Prefs.set", "overlaytoolset.deletewarning", showWarning ); } if( mustDelete ) Overlay.removeSelection( id ); } } macro "Overlay Toolset Help Action Tool - C037T3f18?" { html = "" + "Toolset Description
" + "

* Move overlay tool" + "
Click and drag an overlay element;" + "
It snaps to alignment guides to other elements.

" + "

* Overlay select tool" + "
Click an overlay element to select it." + "
Shift-click to add elements to the selection." + "
Shift-click a selected element to deselect it.

" + "

* Overlay align tool menu" + "
Use this menu to align selected elements

" + "

* Overlay delete tool" + "
Click to remove an overlay element

" + "

* Overlay toolset help action tool" + "
This dialog. You can leave it open to try toolset functions.

" + ""; Dialog.createNonBlocking( "Overlay Toolset Help" ); Dialog.addMessage( html ); Dialog.show( ); }