This digital micrograph script will change all the open image windows to be of the same displayed numerical scalebar length (e.g. 20 micrometers). If the images are of different magnifications then the scalebar sizes will be different, but numerically the same. Calibrations are not changed, scalebars are still correct. I wrote this script to serve a single purpose, and perhaps you will find it useful. If you don’t like it, that’s cool, you’re free to write your own. I kinda posted it here because I didn’t have many options.
If you’re into DM Scripting, then you might be interested in The DigitalMicrograph™ script database at The Austrian Centre for Electron Microscopy and Nanoanalysis, or Dave Mitchell’s DigitalMicrograph™ Scripting Website, which are great resources.
You can also get this script from Github.
// A script to set all the open images to the same displayed scalebar length.
// Doesn't change calibration of images, so if images have different magnifications the bars will be different (but correct) lengths
// Scalebar position doesn't change, but will change length.
//
// Note DM quantizes scalebar display to specific values (0.5 nm, 1 nm, 2 nm, 5 nm, 10 nm, 20 nm, etc), regardless of what you enter.
// Also, choice of a larger fontsize may make the scalebar snap to the next highest display value. Decrease your fontsize in that case.
//
// Steven Cogswell, P.Eng.
// October 2012
//
// Thanks to Pavel Potapov and D.R.G. Mitchell (Scale_bar_control.s) for information how to handle scalebars and annotations in DM script
Image curr
ImageDocument imgdoc
number NumAnn, AnnID,AnnType,Fontsize
number TextID, left,right,bottom,top, retval, numwindows, i
number scalex,scaley, nmscale, barwidth
string imagename
// User chance to abort entire operation
retval = ContinueCancelDialog("This script tries to give all open images the same displayed scalebar value")
if (retval == 0) { // 0 if user cancelled, 1 if okay
result("Cancelled.\n")
exit(0)
}
// Get desired scalebar length
nmscale=20
retval = GetNumber("Desired Scalebar Length", 20, nmscale)
if (retval == 0) { // 0 if user cancelled, 1 if okay
result("Cancelled.\n")
exit(0)
}
result("User entered scale "+nmscale+"\n")
nmscale=nmscale+0.01 // Rounding makes the scale a little short, this just bumps it up.
// Get desired font size
Fontsize=20
retval = GetNumber("Desired Font Size", 20, Fontsize)
if (retval == 0) { // 0 if user cancelled, 1 if okay
result("Cancelled.\n")
exit(0)
}
result("User entered font size "+Fontsize+"\n");
// Processing
numwindows = CountDocumentWindowsOfType(5)
// Get number of images open
result("Processing "+numwindows+" images\n")
// Loop over all open windows
for (i=0; i<;numwindows; i++) {
imgdoc=GetImageDocument(i)
curr:=imgdoc.ImageDocumentGetImage(0) // The current image being processed
imagename = curr.GetName() // Display name of image
GetScale(curr,scalex,scaley)
result("Image "+imagename+" X scale: "+scalex+" Y scale:"+scaley+"\n")
barwidth=nmscale/scalex // number of pixels a bar of nmscale would actually be
//loop through annotation index
NumAnn = CountAnnotations(Curr) // Get number of annotations in current image
for (number j=0; j<NumAnn; j++)
{
AnnId = GetNthannotationId(curr, j)
annType=AnnotationType(curr,AnnID)
if(annType==31) // type 31 seems to be the scalebars
{
result("scale bar found: ")
GetAnnotationRect(Curr, AnnId, top, left, bottom, right)
result("scalebar box: L:"+left+",R:"+right+",B:"+bottom+",T:"+top+"\n")
SetAnnotationRect(Curr, AnnId, top,left, bottom, left+barwidth) // Same position, lengthen bar to length of nmscale
SetAnnotationSize(Curr, AnnId, FontSize) // Set the font size
}
}
}
result("All Images Done.\n")