Skip to content

Instantly share code, notes, and snippets.

@petebankhead
Last active February 1, 2021 13:25
Show Gist options
  • Select an option

  • Save petebankhead/2cab4873e001ab42e03c864666284c5f to your computer and use it in GitHub Desktop.

Select an option

Save petebankhead/2cab4873e001ab42e03c864666284c5f to your computer and use it in GitHub Desktop.
Flip a ROI vertically or horizontally in QuPath v0.2
/**
* Flip the ROIs for QuPath objects (usually annotations) vertically or horizontally.
*
* This creates new objects that are then added to the current image hierarchy.
*
* This also shows the method by which any arbitrary AffineTransform may be
* applied to an object by scripting.
*
* Note: This version is updated for QuPath v0.2.
*
* @author Pete Bankhead
*/
import java.awt.geom.AffineTransform
// Parameters to adjust
boolean flipHorizontal = true
boolean flipVertical = false
boolean keepExisting = false
// Get selected object & its ROI
def selected = getSelectedObjects().findAll {it.hasROI()}
if (!selected) {
print 'No objects selected!'
return
}
// Create the transform
def server = getCurrentServer()
def transform = new AffineTransform()
if (flipHorizontal) {
transform.scale(-1, 1)
transform.translate(-server.getWidth(), 0)
}
if (flipVertical) {
transform.scale(1, -1)
transform.translate(0, -server.getHeight())
}
// Apply transform & add objects
def transformedObjects = selected.collect { PathObjectTools.transformObject(it, transform, false) }
if (!keepExisting)
removeObjects(selected, true)
addObjects(transformedObjects)
selectObjects(transformedObjects)
@AIR7217
Copy link
Copy Markdown

AIR7217 commented Jan 21, 2021

Hello,
I have tried this script but I don't know why it's not working. This is the error message:

ERROR: It looks like you have tried to import a class 'qupath.lib.roi.PathROIToolsAwt' that doesn't exist!

ERROR: MultipleCompilationErrorsException at line 14: startup failed:
Script8.groovy: 15: unable to resolve class qupath.lib.roi.PathROIToolsAwt
@ line 15, column 1.
import qupath.lib.roi.PathROIToolsAwt
^

Script8.groovy: 16: unable to resolve class qupath.lib.scripting.QPEx
@ line 16, column 1.
import qupath.lib.scripting.QPEx
^

2 errors

ERROR: org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:287)
org.codehaus.groovy.control.CompilationUnit$ISourceUnitOperation.doPhaseOperation(CompilationUnit.java:893)
org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:623)
groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:389)
groovy.lang.GroovyClassLoader.lambda$parseClass$3(GroovyClassLoader.java:332)
org.codehaus.groovy.runtime.memoize.StampedCommonCache.compute(StampedCommonCache.java:163)
org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:154)
groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:330)
groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:314)
groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:257)
org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.getScriptClass(GroovyScriptEngineImpl.java:336)
org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:153)
qupath.lib.gui.scripting.DefaultScriptEditor.executeScript(DefaultScriptEditor.java:926)
qupath.lib.gui.scripting.DefaultScriptEditor.executeScript(DefaultScriptEditor.java:859)
qupath.lib.gui.scripting.DefaultScriptEditor.executeScript(DefaultScriptEditor.java:782)
qupath.lib.gui.scripting.DefaultScriptEditor$ProjectTask.call(DefaultScriptEditor.java:1428)
qupath.lib.gui.scripting.DefaultScriptEditor$ProjectTask.call(DefaultScriptEditor.java:1375)
javafx.concurrent.Task$TaskCallable.call(Task.java:1425)
java.base/java.util.concurrent.FutureTask.run(Unknown Source)
java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
java.base/java.util.concurrent.FutureTask.run(Unknown Source)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.base/java.lang.Thread.run(Unknown Source)

@petebankhead
Copy link
Copy Markdown
Author

@AIR7217 The script was originally written for QuPath v0.1.2. I've updated it now for v0.2.

@AIR7217
Copy link
Copy Markdown

AIR7217 commented Feb 1, 2021

Thank you so much, that's perfect.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment