Last active
February 1, 2021 13:25
-
-
Save petebankhead/2cab4873e001ab42e03c864666284c5f to your computer and use it in GitHub Desktop.
Flip a ROI vertically or horizontally in QuPath v0.2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * 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) |
Author
@AIR7217 The script was originally written for QuPath v0.1.2. I've updated it now for v0.2.
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
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)