Manual image alignment script

edited February 2014 in Ruby Scripting
Hi everyone-

I put this code together to be able to align layout to images taken during failure analysis on photo emission microscopes.
The alignment is done manually using shortcut keys and not by using landmarks.
The usage is pretty self explanatory (it also has help button).

Things I wish to improve in the code (but don't know how to)-
1. The IMAGE & STEPSIZE are global constants that are re-defined frequently. This cause warning messages in the develpoement console bar, but i did not find better way to pass it between the handlers. Shurely there is a better way to do it (w/o warnings)
2. After the image is fully aligned to layout, is it possible to save new manipulated image file so when this new file is loaded again it is already aligned to layout?
3. Maybe it is possible to over-ride some of the default key-bindidngs while this macro is running? (such as + / - / 0 / 1)
4. This code works fine on version 0.23, but did not work previous version (I think it was 0.19). the error i got was regarding DCPLEX parameters.


Your comments/questions are welcome.
Enjoy, Itamar



module Image_Alignment

include RBA

app = Application.instance
mw = app.main_window

lv = mw.current_view

class MenuHandler < RBA::Action
def initialize( t, k, i, &action )
self.title = t
self.shortcut = k
self.icon = i
@action = action
end
def triggered
@action.call( self )
end
private
@action
end

### Execute the icon in the menu
$menu_handler_delete_prev = MenuHandler.new( "Delete Images |","Shift+D","" ) {
view = RBA::Application.instance.main_window.current_view
view.clear_images
}

$menu_handler_load_file = MenuHandler.new( "Open Image |","Shift+O", "" ) {
view = RBA::Application.instance.main_window.current_view
image = RBA::FileDialog::get_open_file_name("Title", ".", "Image files (*.*)")
IMAGE = RBA::Image::new(image.to_s)
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, 0, false, view.box.center.x, view.box.center.y))
view.clear_images
view.insert_image(@image_temp)
IMAGE=@image_temp
}

$menu_handler_help = MenuHandler.new( "Help |","Shift+H", "" ) {
s = "Delete all images - Shift+D\n"
s += "Open image file - Shift+O\n"
s += "Move image up - 8 \n"
s += "Move image down - 2\n"
s += "Move image left - 4\n"
s += "Move image right - 6\n"
s += "Make image bigger - /\n"
s += "Make image smaller - .\n"
s += "Rotate image ccw - 7\n"
s += "Rotate image cw - 9\n"
s += "Show/Hide image - 5\n"
s += "Smaller step size - Shift+W\n"
s += "Bigger step size - Shift+Q\n"
s += "Mirror image X - Shift+U\n"
s += "Mirror image Y - Shift+Y\n"
MessageBox::info("Shape Statistics", s, MessageBox::Ok)
}

$menu_handler_stepsize = MenuHandler.new( "Step Size = Normal","", "" ) {}

$menu_handler_transparent = MenuHandler.new( "","5", "" ) {
active_layout = RBA::CellView::active.layout
view = RBA::Application.instance.main_window.current_view
if IMAGE.is_visible?
IMAGE.visible=false
else
IMAGE.visible=true
end
view.clear_images
view.insert_image(IMAGE)
}

$menu_handler_larger = MenuHandler.new( "","/", "" ) {
view = RBA::Application.instance.main_window.current_view
case STEPSIZE
when 10000
@mag = 2
when 1000
@mag = 1.5
when 100
@mag = 1.1
when 10
@mag = 1.01
when 1
@mag = 1.001
end
IMAGE.pixel_height = IMAGE.pixel_height*@mag
IMAGE.pixel_width = IMAGE.pixel_width*@mag
view.clear_images
view.insert_image(IMAGE)
}

$menu_handler_smaller = MenuHandler.new( "",".", "" ) {
view = RBA::Application.instance.main_window.current_view
case STEPSIZE
when 10000
@mag = 2
when 1000
@mag = 1.5
when 100
@mag = 1.1
when 10
@mag = 1.01
when 1
@mag = 1.001
end
IMAGE.pixel_height = IMAGE.pixel_height/@mag
IMAGE.pixel_width = IMAGE.pixel_width/@mag
view.clear_images
view.insert_image(IMAGE)
}

$menu_handler_right = MenuHandler.new( "","6", "" ) {
view = RBA::Application.instance.main_window.current_view
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, 0, false, STEPSIZE, 0))
view.clear_images
view.insert_image(@image_temp)
IMAGE=@image_temp
}

$menu_handler_left = MenuHandler.new( "","4", "" ) {
view = RBA::Application.instance.main_window.current_view
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, 0, false, -STEPSIZE, 0))
view.clear_images
view.insert_image(@image_temp)
IMAGE=@image_temp
}

$menu_handler_up = MenuHandler.new( "","8", "" ) {
view = RBA::Application.instance.main_window.current_view
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, 0, false, 0, STEPSIZE))
view.clear_images
view.insert_image(@image_temp)
IMAGE=@image_temp
}

$menu_handler_down = MenuHandler.new( "","2", "" ) {
view = RBA::Application.instance.main_window.current_view
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, 0, false, 0, -STEPSIZE))
view.clear_images
view.insert_image(@image_temp)
IMAGE=@image_temp
}

$menu_handler_cw = MenuHandler.new( "","9", "" ) {
view = RBA::Application.instance.main_window.current_view
case STEPSIZE
when 10000
@angle = 90
when 1000
@angle = 45
when 100
@angle = 10
when 10
@angle = 1
when 1
@angle = 0.1
end
@image_x = IMAGE.box.center.x
@image_y = IMAGE.box.center.y
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, -1*@angle, false, 0, 0))
@image_x_new = @image_temp.box.center.x
@image_y_new = @image_temp.box.center.y
IMAGE=@image_temp
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, 0, false, @image_x-@image_x_new, @image_y-@image_y_new))
IMAGE=@image_temp
view.clear_images
view.insert_image(@image_temp)
}

$menu_handler_ccw = MenuHandler.new( "","7", "" ) {
view = RBA::Application.instance.main_window.current_view
case STEPSIZE
when 10000
@angle = 90
when 1000
@angle = 45
when 100
@angle = 10
when 10
@angle = 1
when 1
@angle = 0.1
end
@image_x = IMAGE.box.center.x
@image_y = IMAGE.box.center.y
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, @angle, false, 0, 0))
@image_x_new = @image_temp.box.center.x
@image_y_new = @image_temp.box.center.y
IMAGE=@image_temp
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, 0, false, @image_x-@image_x_new, @image_y-@image_y_new))
IMAGE=@image_temp
view.clear_images
view.insert_image(@image_temp)
}

$menu_handler_fat = MenuHandler.new( "","Shift+F", "" ) {
view = RBA::Application.instance.main_window.current_view
case STEPSIZE
when 10000
@ar = 1.1
when 1000
@ar = 1.05
when 100
@ar = 1.01
when 10
@ar = 1.005
when 1
@ar = 1.001
end
IMAGE.pixel_width = IMAGE.pixel_height/@ar
view.clear_images
view.insert_image(IMAGE)
}

$menu_handler_thin = MenuHandler.new( "","Shift+T", "" ) {
view = RBA::Application.instance.main_window.current_view
case STEPSIZE
when 10000
@ar = 1.1
when 1000
@ar = 1.05
when 100
@ar = 1.01
when 10
@ar = 1.005
when 1
@ar = 1.001
end
IMAGE.pixel_height = IMAGE.pixel_height*@ar
view.clear_images
view.insert_image(IMAGE)
}

$menu_handler_fine = MenuHandler.new( "","Shift+Q", "" ) {
if STEPSIZE > 1
STEPSIZE = STEPSIZE/10
end
case STEPSIZE
when 10000
@sens = "Super Coarse"
when 1000
@sens = "Coarse"
when 100
@sens = "Normal"
when 10
@sens = "Fine"
when 1
@sens = "Ultra Fine"
end
app = RBA::Application.instance
menu = app.main_window.menu
$menu_handler_stepsize = MenuHandler.new( "Step Size = " + @sens ,"", "" ) {}
menu.insert_item("@toolbar.#14", "menu_item16", $menu_handler_stepsize)
}

$menu_handler_coarse = MenuHandler.new( " ","Shift+W", "" ) {
if STEPSIZE < 10000
STEPSIZE=STEPSIZE*10
end
case STEPSIZE
when 10000
@sens = "Super Coarse"
when 1000
@sens = "Coarse"
when 100
@sens = "Normal"
when 10
@sens = "Fine"
when 1
@sens = "Ultra Fine"
end
app = RBA::Application.instance
menu = app.main_window.menu
$menu_handler_stepsize = MenuHandler.new( "Step Size = " + @sens,"", "" ) {}
menu.insert_item("@toolbar.#14", "menu_item16", $menu_handler_stepsize)
}

$menu_handler_mirror_x = MenuHandler.new( "","Shift+U", "" ) {
view = RBA::Application.instance.main_window.current_view
@image_x = IMAGE.box.center.x
@image_y = IMAGE.box.center.y
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, 90, false, 0, 0))
IMAGE=@image_temp
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, 0, true, 0, 0))
IMAGE=@image_temp
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, -90, false, 0, 0))
@image_x_new = @image_temp.box.center.x
@image_y_new = @image_temp.box.center.y
IMAGE=@image_temp
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, 0, false, @image_x-@image_x_new, @image_y-@image_y_new))
IMAGE=@image_temp
view.clear_images
view.insert_image(@image_temp)
}

$menu_handler_mirror_y = MenuHandler.new( "","Shift+Y", "" ) {
view = RBA::Application.instance.main_window.current_view
@image_x = IMAGE.box.center.x
@image_y = IMAGE.box.center.y
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, 0, true, 0, 0))
@image_x_new = @image_temp.box.center.x
@image_y_new = @image_temp.box.center.y
IMAGE=@image_temp
@image_temp=IMAGE.transformed(RBA::DCplxTrans::new(1, 0, false, @image_x-@image_x_new, @image_y-@image_y_new))
IMAGE=@image_temp
view.clear_images
view.insert_image(@image_temp)
}

####MAIN###
STEPSIZE=100
app = RBA::Application.instance
menu = app.main_window.menu
menu.insert_item("@toolbar.end", "menu_item", $menu_handler_delete_prev)
menu.insert_item("tools_menu.end", "menu_item", $menu_handler_delete_prev)
menu.insert_item("@toolbar.end", "menu_item2", $menu_handler_load_file)
menu.insert_item("tools_menu.end", "menu_item2", $menu_handler_load_file)
menu.insert_item("@toolbar.end", "menu_item17", $menu_handler_help)
menu.insert_item("tools_menu.end", "menu_item17", $menu_handler_help)
menu.insert_item("@toolbar.end", "menu_item16", $menu_handler_stepsize)
menu.insert_item("@toolbar.end", "menu_item3", $menu_handler_transparent)
menu.insert_item("tools_menu.end", "menu_item3", $menu_handler_transparent)
menu.insert_item("@toolbar.end", "menu_item4", $menu_handler_larger)
menu.insert_item("tools_menu.end", "menu_item4", $menu_handler_larger)
menu.insert_item("@toolbar.end", "menu_item5", $menu_handler_smaller)
menu.insert_item("tools_menu.end", "menu_item5", $menu_handler_smaller)
menu.insert_item("@toolbar.end", "menu_item6", $menu_handler_right)
menu.insert_item("tools_menu.end", "menu_item6", $menu_handler_right)
menu.insert_item("@toolbar.end", "menu_item7", $menu_handler_left)
menu.insert_item("tools_menu.end", "menu_item7", $menu_handler_left)
menu.insert_item("@toolbar.end", "menu_item8", $menu_handler_up)
menu.insert_item("tools_menu.end", "menu_item8", $menu_handler_up)
menu.insert_item("@toolbar.end", "menu_item9", $menu_handler_down)
menu.insert_item("tools_menu.end", "menu_item9", $menu_handler_down)
menu.insert_item("@toolbar.end", "menu_item10", $menu_handler_cw)
menu.insert_item("tools_menu.end", "menu_item10", $menu_handler_cw)
menu.insert_item("@toolbar.end", "menu_item11", $menu_handler_ccw)
menu.insert_item("tools_menu.end", "menu_item11", $menu_handler_ccw)
menu.insert_item("@toolbar.end", "menu_item12", $menu_handler_fat)
menu.insert_item("tools_menu.end", "menu_item12", $menu_handler_fat)
menu.insert_item("@toolbar.end", "menu_item13", $menu_handler_thin)
menu.insert_item("tools_menu.end", "menu_item13", $menu_handler_thin)
menu.insert_item("@toolbar.end", "menu_item14", $menu_handler_fine)
menu.insert_item("tools_menu.end", "menu_item14", $menu_handler_fine)
menu.insert_item("@toolbar.end", "menu_item15", $menu_handler_coarse)
menu.insert_item("tools_menu.end", "menu_item15", $menu_handler_coarse)
menu.insert_item("@toolbar.end", "menu_item18", $menu_handler_mirror_x)
menu.insert_item("tools_menu.end", "menu_item18", $menu_handler_mirror_x)
menu.insert_item("@toolbar.end", "menu_item19", $menu_handler_mirror_y)
menu.insert_item("tools_menu.end", "menu_item19", $menu_handler_mirror_y)


end

Comments

  • edited February 2014

    Hi Itamar,

    Instead of constants, you can use global variables, i.e. "$image" instead of IMAGE. That avoids these redefinition warnings.

    Global variables are not common in Ruby. With global variables you risk potential name clashes with other scripts since they are not local to your module. You can however use module members (i.e. @image) instead of global variables. That basically has the same effect but these variable names are local to your module and the risk of name clashing is small. Using module members for local variables (i.e. "@angle") is possible, but since that is truly a local value, I'd use a local variable without the "@".

    BTW, there is an alternative (and newer) way to attach code to menus. Instead of reimplementing the Action class, you can directly attach code:

    $menu_handler_delete_prev = Action.new
    a.title = "Delete Images"
    a.shortcut = "Shift+D"
    a.on_triggered {
      view = RBA::Application.instance.main_window.current_view
      view.clear_images
    } 
    
    menu.insert_item("@toolbar.end", "menu_item", $menu_handler_delete_prev)
    menu.insert_item("tools_menu.end", "menu_item", $menu_handler_delete_prev)
    

    Thank you for providing the code.

    Matthias

Sign In or Register to comment.