Skip to content

Commit bd85af5

Browse files
committed
feat(transform-io): add readTransform, writeTransform
And support code.
1 parent 5b8eb2f commit bd85af5

File tree

2,114 files changed

+36247
-120
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

2,114 files changed

+36247
-120
lines changed

packages/core/typescript/itk-wasm/src/bindgen/python-web-demo/input-parameters-python.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import snakeCase from "../snake-case.js"
1+
import snakeCase from '../snake-case.js'
22

33
function inputParametersPython(functionName, indent, parameter, required) {
44
let initResult = ''
@@ -54,7 +54,9 @@ function inputParametersPython(functionName, indent, parameter, required) {
5454
methodResult += `${indent} self.model.${modelProperty}['${parameterName}'] = int(self.${inputIdentifier}.value)\n\n`
5555
break
5656
default:
57-
console.error(`Unexpected interface type: ${parameter.type}`)
57+
console.error(
58+
`inputParametersPython: Unexpected interface type: ${parameter.type}`
59+
)
5860
process.exit(1)
5961
}
6062
return { init: initResult, method: methodResult }

packages/core/typescript/itk-wasm/src/bindgen/python-web-demo/output-python.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
import snakeCase from "../snake-case.js"
1+
import snakeCase from '../snake-case.js'
22

33
function outputPython(functionName, prefix, indent, parameter) {
44
const parameterName = snakeCase(parameter.name)
55
let initResult = ''
66
let methodResult = ''
77
let runResult = ''
88

9-
switch(parameter.type) {
9+
switch (parameter.type) {
1010
// case 'OUTPUT_TEXT_FILE:FILE':
1111
// case 'OUTPUT_TEXT_STREAM':
12-
// result += `${indent}<sl-textarea disabled name="${parameter.name}" label="${snakeCase(parameter.name)}" help-text="${parameter.description}"></sl-textarea>\n`
13-
// result += `${indent}<sl-button variant="neutral" name="${parameter.name}-download">${snakeCase(parameter.name)}</sl-button>\n`
14-
// result += `<br /><br />\n`
15-
// break
12+
// result += `${indent}<sl-textarea disabled name="${parameter.name}" label="${snakeCase(parameter.name)}" help-text="${parameter.description}"></sl-textarea>\n`
13+
// result += `${indent}<sl-button variant="neutral" name="${parameter.name}-download">${snakeCase(parameter.name)}</sl-button>\n`
14+
// result += `<br /><br />\n`
15+
// break
1616
case 'OUTPUT_BINARY_FILE:FILE':
1717
case 'OUTPUT_BINARY_STREAM':
1818
initResult += `${indent} ${parameterName}_download_element = js.document.querySelector('#${functionName}-outputs sl-button[name=${parameter.name}-download]')\n`
@@ -53,7 +53,9 @@ function outputPython(functionName, prefix, indent, parameter) {
5353
// result += `<br /><br />\n`
5454
// break
5555
default:
56-
console.error(`Unexpected interface type: ${parameter.type}`)
56+
console.error(
57+
`outputPython: Unexpected interface type: ${parameter.type}`
58+
)
5759
process.exit(1)
5860
}
5961
return { init: initResult, method: methodResult, run: runResult }

packages/core/typescript/itk-wasm/src/bindgen/typescript/demo/all-demo-types-supported.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ const demoSupportedInputTypes = new Set([
1212
'INPUT_JSON',
1313
'INPUT_IMAGE',
1414
'INPUT_MESH',
15-
'INPUT_POINT_SET'
15+
'INPUT_POINT_SET',
16+
'INPUT_TRANSFORM'
1617
])
1718
const demoSupportedOutputTypes = new Set([
1819
'OUTPUT_TEXT_FILE',
@@ -22,7 +23,8 @@ const demoSupportedOutputTypes = new Set([
2223
'OUTPUT_JSON',
2324
'OUTPUT_IMAGE',
2425
'OUTPUT_MESH',
25-
'OUTPUT_POINT_SET'
26+
'OUTPUT_POINT_SET',
27+
'OUTPUT_TRANSFORM'
2628
])
2729

2830
function allDemoTypesSupported(interfaceJson) {

packages/core/typescript/itk-wasm/src/bindgen/typescript/demo/input-parameters-demo-html.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ function inputParametersDemoHtml(
6767
case 'INPUT_JSON':
6868
case 'INPUT_MESH':
6969
case 'INPUT_POINT_SET':
70+
case 'INPUT_TRANSFORM':
7071
result += `${prefix}${indent}<label for="${parameter.name}-file"><sl-button name="${parameter.name}-file-button" variant="primary" outline onclick="this.parentElement.nextElementSibling.click()">Upload</sp-button></label><input type="file" name="${parameter.name}-file" style="display: none"/>\n`
7172
result += `${prefix}${indent}<sl-tooltip ${tooltipContent}><sl-details id="${functionName}-${parameter.name}-details" summary="${label}: ${description}" disabled></sl-details></sl-tooltip>\n`
7273
result += '<br /><br />\n'
@@ -76,8 +77,11 @@ function inputParametersDemoHtml(
7677
result += `${prefix}${indent}<sl-tooltip ${tooltipContent}><itk-image-details id="${functionName}-${parameter.name}-details" summary="${label}: ${description}" disabled></itk-image-details></sl-tooltip>\n`
7778
result += '<br /><br />\n'
7879
break
80+
break
7981
default:
80-
console.error(`Unexpected interface type: ${parameterType}`)
82+
console.error(
83+
`inputParametersDemoHtml: Unexpected interface type: ${parameterType}`
84+
)
8185
process.exit(1)
8286
}
8387
return result

packages/core/typescript/itk-wasm/src/bindgen/typescript/demo/input-parameters-demo-typescript.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ function inputParametersDemoTypeScript(
114114
case 'INPUT_IMAGE':
115115
case 'INPUT_MESH':
116116
case 'INPUT_POINT_SET':
117+
case 'INPUT_TRANSFORM':
117118
result += `${indent}const ${inputIdentifier} = document.querySelector('#${functionName}Inputs input[name=${parameter.name}-file]')\n`
118119
result += `${indent}${inputIdentifier}.addEventListener('change', async (event) => {\n`
119120
result += `${indent}${indent}const dataTransfer = event.dataTransfer\n`
@@ -172,12 +173,29 @@ function inputParametersDemoTypeScript(
172173
result += `${indent}${indent}const details = document.getElementById("${functionName}-${parameter.name}-details")\n`
173174
result += `${indent}${indent}details.innerHTML = \`<pre>$\{globalThis.escapeHtml(JSON.stringify(pointSet, globalThis.interfaceTypeJsonReplacer, 2))}</pre>\`\n`
174175
}
176+
} else if (parameterType === 'INPUT_TRANSFORM') {
177+
if (parameter.itemsExpectedMax > 1) {
178+
result += `${indent}${indent}const readTransform = await Promise.all(Array.from(files).map(async (file) => readTransform(file)))\n`
179+
result += `${indent}${indent}readTransform.forEach(t => t.webWorker.terminate())\n`
180+
result += `${indent}${indent}const inputTransform = readTransform.map(t => t.transform)\n`
181+
result += `${indent}${indent}model.${modelProperty}.set("${parameterName}", inputTransform)\n`
182+
result += `${indent}${indent}const details = document.getElementById("${functionName}-${parameter.name}-details")\n`
183+
result += `${indent}${indent}details.innerHTML = \`<pre>$\{globalThis.escapeHtml(JSON.stringify(inputTransform, globalThis.interfaceTypeJsonReplacer, 2))}</pre>\`\n`
184+
} else {
185+
result += `${indent}${indent}const { transform, webWorker } = await readTransform(files[0])\n`
186+
result += `${indent}${indent}webWorker.terminate()\n`
187+
result += `${indent}${indent}model.${modelProperty}.set("${parameterName}", transform)\n`
188+
result += `${indent}${indent}const details = document.getElementById("${functionName}-${parameter.name}-details")\n`
189+
result += `${indent}${indent}details.innerHTML = \`<pre>$\{globalThis.escapeHtml(JSON.stringify(transform, globalThis.interfaceTypeJsonReplacer, 2))}</pre>\`\n`
190+
}
175191
}
176192
result += `${indent}${indent}details.disabled = false\n`
177193
result += `${indent}})\n\n`
178194
break
179195
default:
180-
console.error(`Unexpected interface type: ${parameterType}`)
196+
console.error(
197+
`inputParametersDemoTypeScript: Unexpected interface type: ${parameterType}`
198+
)
181199
process.exit(1)
182200
}
183201
return result

packages/core/typescript/itk-wasm/src/bindgen/typescript/demo/interface-functions-demo-typescript.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ function interfaceFunctionsDemoTypeScript(
2424
needReadImage,
2525
needReadMesh,
2626
needReadPointSet,
27+
needReadTransform,
2728
needWriteImage,
2829
needWriteMesh,
29-
needWritePointSet
30+
needWritePointSet,
31+
needWriteTransform
3032
} = ioPackagesNeeded(interfaceJson)
3133
if (needReadMesh) {
3234
if (packageName === '@itk-wasm/mesh-io') {
@@ -49,6 +51,13 @@ function interfaceFunctionsDemoTypeScript(
4951
result += `import { readImage } from '@itk-wasm/image-io'\n`
5052
}
5153
}
54+
if (needReadTransform) {
55+
if (packageName === '@itk-wasm/transform-io') {
56+
result += `import { readTransform } from '../../../dist/index.js'\n`
57+
} else {
58+
result += `import { readTransform } from '@itk-wasm/transform-io'\n`
59+
}
60+
}
5261
if (needWriteMesh) {
5362
if (packageName === '@itk-wasm/mesh-io') {
5463
result += `import { writeMesh } from '../../../dist/index.js'\n`
@@ -70,6 +79,13 @@ function interfaceFunctionsDemoTypeScript(
7079
result += `import { writeImage } from '@itk-wasm/image-io'\n`
7180
}
7281
}
82+
if (needWriteTransform) {
83+
if (packageName === '@itk-wasm/transform-io') {
84+
result += `import { writeTransform } from '../../../dist/index.js'\n`
85+
} else {
86+
result += `import { writeTransform } from '@itk-wasm/transform-io'\n`
87+
}
88+
}
7389

7490
result += `import * as ${camelCase(bundleName)} from '../../../dist/index.js'\n`
7591

packages/core/typescript/itk-wasm/src/bindgen/typescript/demo/io-packages-needed.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ function ioPackagesNeeded(interfaceJson) {
44
let needReadMesh = false
55
let needReadImage = false
66
let needReadPointSet = false
7+
let needReadTransform = false
78
const pipelineComponents = ['inputs', 'parameters']
89
pipelineComponents.forEach((pipelineComponent) => {
910
needReadMesh =
@@ -22,6 +23,12 @@ function ioPackagesNeeded(interfaceJson) {
2223
interfaceJson[pipelineComponent].filter(
2324
(value) => interfaceJsonTypeToInterfaceType.get(value.type) === 'Image'
2425
).length > 0
26+
needReadTransform =
27+
needReadTransform ||
28+
interfaceJson[pipelineComponent].filter(
29+
(value) =>
30+
interfaceJsonTypeToInterfaceType.get(value.type) === 'TransformList'
31+
).length > 0
2532
})
2633
const needWriteMesh =
2734
interfaceJson.outputs.filter(
@@ -35,13 +42,20 @@ function ioPackagesNeeded(interfaceJson) {
3542
interfaceJson.outputs.filter(
3643
(value) => interfaceJsonTypeToInterfaceType.get(value.type) === 'Image'
3744
).length > 0
45+
const needWriteTransform =
46+
interfaceJson.outputs.filter(
47+
(value) =>
48+
interfaceJsonTypeToInterfaceType.get(value.type) === 'TransformList'
49+
).length > 0
3850
return {
3951
needReadImage,
4052
needReadMesh,
4153
needReadPointSet,
54+
needReadTransform,
4255
needWriteImage,
4356
needWriteMesh,
44-
needWritePointSet
57+
needWritePointSet,
58+
needWriteTransform
4559
}
4660
}
4761

packages/core/typescript/itk-wasm/src/bindgen/typescript/demo/output-demo-html.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,24 @@ function outputDemoHtml(functionName, prefix, indent, parameter) {
9696
result += `<br /><br />\n`
9797
}
9898
break
99+
case 'OUTPUT_TRANSFORM':
100+
{
101+
result += `${prefix}${indent}<sl-details disabled id="${functionName}-${parameter.name}-details" summary="${camelCase(parameter.name)}: ${description}"></sl-details>\n`
102+
103+
result += `${prefix}${indent}<sl-select id="${functionName}-${parameter.name}-output-format" placeholder="Format">\n`
104+
const formats = ['h5', 'txt', 'mat', 'xfm']
105+
formats.forEach((format) => {
106+
result += `${prefix}${indent}${indent}<sl-option value="${format}">${format}</sl-option>\n`
107+
})
108+
result += `${prefix}${indent}</sl-select>\n`
109+
result += `${prefix}${indent}<sl-button variant="neutral" outline name="${parameter.name}-download" disabled>Download</sl-button>\n`
110+
result += `<br /><br />\n`
111+
}
112+
break
99113
default:
100-
console.error(`Unexpected interface type: ${parameterType}`)
114+
console.error(
115+
`outputDemoHtml: Unexpected interface type: ${parameterType}`
116+
)
101117
process.exit(1)
102118
}
103119
return result

packages/core/typescript/itk-wasm/src/bindgen/typescript/demo/output-demo-run-typescript.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ function outputDemoRunTypeScript(functionName, prefix, indent, parameter) {
4848
case 'OUTPUT_IMAGE':
4949
case 'OUTPUT_MESH':
5050
case 'OUTPUT_POINT_SET':
51+
case 'OUTPUT_TRANSFORM':
5152
result += `${prefix}${indent}${parameterName}OutputDownload.variant = "success"\n`
5253
result += `${prefix}${indent}${parameterName}OutputDownload.disabled = false\n`
5354
result += `${indent}${indent}const ${parameterName}Details = document.getElementById("${functionName}-${parameter.name}-details")\n`
@@ -62,7 +63,9 @@ function outputDemoRunTypeScript(functionName, prefix, indent, parameter) {
6263
}
6364
break
6465
default:
65-
console.error(`Unexpected interface type: ${parameter.type}`)
66+
console.error(
67+
`outputDemoRunTypeScript: Unexpected interface type: ${parameter.type}`
68+
)
6669
process.exit(1)
6770
}
6871
return result

packages/core/typescript/itk-wasm/src/bindgen/typescript/demo/output-demo-typescript.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,25 @@ function outputDemoTypeScript(functionName, prefix, indent, parameter) {
102102
result += `${prefix}${indent}${indent}}\n`
103103
result += `${prefix}${indent}})\n`
104104
break
105+
case 'OUTPUT_TRANSFORM':
106+
result += `${prefix}${indent}const ${parameterName}OutputDownload = document.querySelector('#${functionName}Outputs sl-button[name=${parameter.name}-download]')\n`
107+
result += `${prefix}${indent}${parameterName}OutputDownload.addEventListener('click', async (event) => {\n`
108+
result += `${prefix}${indent}${indent}event.preventDefault()\n`
109+
result += `${prefix}${indent}${indent}event.stopPropagation()\n`
110+
result += `${prefix}${indent}${indent}if (model.outputs.has("${parameterName}")) {\n`
111+
result += `${prefix}${indent}${indent}${indent}const ${parameterName}DownloadFormat = document.getElementById('${functionName}-${parameter.name}-output-format')\n`
112+
result += `${prefix}${indent}${indent}${indent}const downloadFormat = ${parameterName}DownloadFormat.value || 'h5'\n`
113+
result += `${prefix}${indent}${indent}${indent}const fileName = \`${parameterName}.\${downloadFormat}\`\n`
114+
result += `${prefix}${indent}${indent}${indent}const { webWorker, serializedTransform } = await writeTransform(model.outputs.get("${parameterName}"), fileName)\n\n`
115+
result += `${prefix}${indent}${indent}${indent}webWorker.terminate()\n`
116+
result += `${prefix}${indent}${indent}${indent}globalThis.downloadFile(serializedTransform.data, fileName)\n`
117+
result += `${prefix}${indent}${indent}}\n`
118+
result += `${prefix}${indent}})\n`
119+
break
105120
default:
106-
console.error(`Unexpected interface type: ${parameter.type}`)
121+
console.error(
122+
`outputDemoTypeScript: Unexpected interface type: ${parameter.type}`
123+
)
107124
process.exit(1)
108125
}
109126
return result

0 commit comments

Comments
 (0)