Last active
June 24, 2020 16:26
-
-
Save oeway/157b970d2ab993084a2ac650197c077c to your computer and use it in GitHub Desktop.
This file contains 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
<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> |
This file contains 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
<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