Skip to content

Instantly share code, notes, and snippets.

@oeway
Last active June 24, 2020 16:26
Show Gist options
  • Save oeway/157b970d2ab993084a2ac650197c077c to your computer and use it in GitHub Desktop.
Save oeway/157b970d2ab993084a2ac650197c077c to your computer and use it in GitHub Desktop.
<docs>
A hello world example for running fiji script in ImJoy.
</docs>
<config lang="json">
{
"name": "FijiScriptHelloWorld",
"type": "scijava",
"tags": [],
"ui": "",
"version": "0.1.0",
"cover": "",
"description": "A hello world example for running fiji script in ImJoy.",
"icon": "extension",
"inputs": null,
"outputs": null,
"api_version": "0.1.8",
"env": "",
"permissions": [],
"requirements": [],
"dependencies": ["https://gist.githubusercontent.com/oeway/157b970d2ab993084a2ac650197c077c/raw/SciJavaEngine.imjoy.html"]
}
</config>
<script lang="ijm">
#@ String name
#@ int age
#@ String city
#@output Object greeting
greeting = "Hi " + name + ". You are " + age + " years old, and live in " + city + "."
</script>
<docs lang="markdown">
## SciJava Engine
Support running scijava/Fiji/ImageJ scripts as a plugin
</docs>
<config lang="json">
{
"name": "SciJava Engine",
"type": "native-python",
"version": "0.1.7",
"api_version": "0.1.2",
"description": "Support running SciJava/Fiji/ImageJ scripts as a plugin",
"tags": [],
"ui": "",
"inputs": null,
"outputs": null,
"flags": ["engine"],
"icon": "extension",
"env": ["conda create -n imagej", {"type": "binder", "spec": "oeway/pyimagej-binder-image/master", "skip_requirements": true}],
"requirements": ["conda: openjdk=8", "conda: -c conda-forge pyimagej", "pip: scikit-image pillow"],
"dependencies": [],
"runnable": false
}
</config>
<script lang="python">
from imjoy import api
import imagej
import numpy as np
import skimage
from skimage import io
import numpy as np
from PIL import Image
import base64
from io import BytesIO
ij = imagej.init('sc.fiji:fiji:2.0.0-pre-10')
from jnius import autoclass
ScriptInfo = autoclass('org.scijava.script.ScriptInfo')
StringReader = autoclass('java.io.StringReader')
def get_module_info(custom_script, name=None):
name = name or "scijava_script"
moduleinfo = ScriptInfo(ij.getContext(), name, StringReader(custom_script))
inputs = []
outputs = []
for inp in ij.py.from_java(moduleinfo.inputs()):
input_type = inp.getType().getName()
input_name = inp.getName()
print(input_type, input_name)
inputs.append({"name": input_name, "type": input_type})
for outp in ij.py.from_java(moduleinfo.outputs()):
output_type = outp.getType().getName()
output_name = outp.getName()
outputs.append({"name": output_name, "type": output_type})
return {'id': moduleinfo.getIdentifier(), "outputs": outputs, "inputs": inputs }
def connect():
return True
def disconnect():
pass
def heartbeat():
return True
SchemaIOTypeMapping = {
"boolean": "checkbox",
"byte": "number",
"short": "number",
"int": "number",
"long": "number",
"char": "text",
"java.lang.Boolean": "checkbox",
"java.lang.Byte": "number",
"java.lang.Short": "number",
"java.lang.Int": "number",
"java.lang.Long": "number",
"java.lang.Float": "number",
"java.lang.String": "text",
"java.lang.Character": "text",
# TODO: BigInteger | BigDecimal
# TODO: Dataset | ImagePlus (>=2 images) triggers a dropdown list
# TODO: ColorRGB color chooser
# TODO: Date date chooser
# TODO: File file chooser
}
async def start_plugin(config, imjoy_interface, engine_utils):
script = config["scripts"][0]["content"]
language_extension = config["scripts"][0]["attrs"]["lang"]
module_info = get_module_info(script)
def setup():
api.showMessage('Plugin initialized: ' + config['name'])
async def run(ctx):
# args = {}
fields = []
for inp in module_info['inputs']:
widget_type = SchemaIOTypeMapping[inp["type"]]
if widget_type in ['text', 'number']:
fields.append({"type": "input", "inputType": widget_type, "label": inp["name"], "model": inp["name"]})
else:
fields.append({"type": widget_type, "label": inp["name"], "model": inp["name"]})
# args[inp['name']] = await api.prompt("What is your " + inp["name"] + "("+ inp["type"] + ")")
dialog = await api.showDialog({
"type": 'imjoy/schema-io',
"name": config["name"],
"data": {
"id": 0,
"type": 'form',
"schema": {
"fields": fields
},
"data": {},
"options": {
"validateAfterLoad": True,
"validateAfterChanged": True
},
"description": "",
"buttons": [{"label": 'Run', "event_id": 'run', "class": 'md-primary md-raised'}]
}
})
def run_script(args):
dialog.close()
output_name = module_info['outputs'][0]['name']
result = ij.py.run_script(language_extension, script, args).getOutput(output_name)
api.alert(result)
dialog.on('run', run_script)
return {"_rintf": True, "setup": setup, "run": run}
async def setup():
await api.register({
"_rintf": True,
"type": "engine",
"pluginType": "scijava",
"icon": "🚀",
"name": 'scijava',
"url": 'imagej.net',
"connect": connect,
"disconnect": disconnect,
"startPlugin": start_plugin,
"heartbeat": heartbeat
})
api.export({"setup": setup})
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment