Skip to content

Commit 11fcdf8

Browse files
committed
feat(mesh-io): node MZ3 support
1 parent f40f11e commit 11fcdf8

File tree

8 files changed

+226
-0
lines changed

8 files changed

+226
-0
lines changed

packages/mesh-io/typescript/README.md

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import {
3333
freeSurferAsciiWriteMesh,
3434
freeSurferBinaryReadMesh,
3535
freeSurferBinaryWriteMesh,
36+
mz3ReadMesh,
37+
mz3WriteMesh,
3638
objReadMesh,
3739
objWriteMesh,
3840
offReadMesh,
@@ -47,6 +49,8 @@ import {
4749
wasmWriteMesh,
4850
wasmZstdReadMesh,
4951
wasmZstdWriteMesh,
52+
mz3ReadPointSet,
53+
mz3WritePointSet,
5054
objReadPointSet,
5155
objWritePointSet,
5256
offReadPointSet,
@@ -388,6 +392,73 @@ async function freeSurferBinaryWriteMesh(
388392
| `serializedMesh` | *BinaryFile* | Output mesh |
389393
| `webWorker` | *Worker* | WebWorker used for computation. |
390394

395+
#### mz3ReadMesh
396+
397+
*Read a mesh file format and convert it to the itk-wasm file format*
398+
399+
```ts
400+
async function mz3ReadMesh(
401+
serializedMesh: File | BinaryFile,
402+
options: Mz3ReadMeshOptions = {}
403+
) : Promise<Mz3ReadMeshResult>
404+
```
405+
406+
| Parameter | Type | Description |
407+
| :--------------: | :-----------------: | :--------------------------------------- |
408+
| `serializedMesh` | *File | BinaryFile* | Input mesh serialized in the file format |
409+
410+
**`Mz3ReadMeshOptions` interface:**
411+
412+
| Property | Type | Description |
413+
| :---------------: | :-------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------- |
414+
| `informationOnly` | *boolean* | Only read image metadata -- do not read pixel data. |
415+
| `webWorker` | *null or Worker or boolean* | WebWorker for computation. Set to null to create a new worker. Or, pass an existing worker. Or, set to `false` to run in the current thread / worker. |
416+
| `noCopy` | *boolean* | When SharedArrayBuffer's are not available, do not copy inputs. |
417+
418+
**`Mz3ReadMeshResult` interface:**
419+
420+
| Property | Type | Description |
421+
| :---------: | :--------------: | :----------------------------------------------------------------------- |
422+
| `couldRead` | *JsonCompatible* | Whether the input could be read. If false, the output mesh is not valid. |
423+
| `mesh` | *Mesh* | Output mesh |
424+
| `webWorker` | *Worker* | WebWorker used for computation. |
425+
426+
#### mz3WriteMesh
427+
428+
*Write an itk-wasm file format converted to an mesh file format*
429+
430+
```ts
431+
async function mz3WriteMesh(
432+
mesh: Mesh,
433+
serializedMesh: string,
434+
options: Mz3WriteMeshOptions = {}
435+
) : Promise<Mz3WriteMeshResult>
436+
```
437+
438+
| Parameter | Type | Description |
439+
| :--------------: | :------: | :---------- |
440+
| `mesh` | *Mesh* | Input mesh |
441+
| `serializedMesh` | *string* | Output mesh |
442+
443+
**`Mz3WriteMeshOptions` interface:**
444+
445+
| Property | Type | Description |
446+
| :---------------: | :-------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------- |
447+
| `informationOnly` | *boolean* | Only write image metadata -- do not write pixel data. |
448+
| `useCompression` | *boolean* | Use compression in the written file, if supported |
449+
| `binaryFileType` | *boolean* | Use a binary file type in the written file, if supported |
450+
| `webWorker` | *null or Worker or boolean* | WebWorker for computation. Set to null to create a new worker. Or, pass an existing worker. Or, set to `false` to run in the current thread / worker. |
451+
| `noCopy` | *boolean* | When SharedArrayBuffer's are not available, do not copy inputs. |
452+
453+
**`Mz3WriteMeshResult` interface:**
454+
455+
| Property | Type | Description |
456+
| :--------------: | :--------------: | :-------------------------------------------------------------------------- |
457+
| `couldWrite` | *JsonCompatible* | Whether the input could be written. If false, the output mesh is not valid. |
458+
| `serializedMesh` | *BinaryFile* | Output mesh |
459+
| `webWorker` | *Worker* | WebWorker used for computation. |
460+
461+
391462
#### objReadMesh
392463

393464
*Read a mesh file format and convert it to the itk-wasm file format*
@@ -885,6 +956,8 @@ import {
885956
freeSurferAsciiWriteMeshNode,
886957
freeSurferBinaryReadMeshNode,
887958
freeSurferBinaryWriteMeshNode,
959+
mz3ReadMeshNode,
960+
mz3WriteMeshNode,
888961
objReadMeshNode,
889962
objWriteMeshNode,
890963
offReadMeshNode,
@@ -899,6 +972,8 @@ import {
899972
wasmWriteMeshNode,
900973
wasmZstdReadMeshNode,
901974
wasmZstdWriteMeshNode,
975+
mz3ReadPointSetNode,
976+
mz3WritePointSetNode,
902977
objReadPointSetNode,
903978
objWritePointSetNode,
904979
offReadPointSetNode,
@@ -1092,6 +1167,66 @@ async function freeSurferBinaryWriteMeshNode(
10921167
| `couldWrite` | *JsonCompatible* | Whether the input could be written. If false, the output mesh is not valid. |
10931168
| `serializedMesh` | *BinaryFile* | Output mesh |
10941169

1170+
#### mz3ReadMeshNode
1171+
1172+
*Read a mesh file format and convert it to the itk-wasm file format*
1173+
1174+
```ts
1175+
async function mz3ReadMeshNode(
1176+
serializedMesh: string,
1177+
options: Mz3ReadMeshNodeOptions = {}
1178+
) : Promise<Mz3ReadMeshNodeResult>
1179+
```
1180+
1181+
| Parameter | Type | Description |
1182+
| :--------------: | :------: | :--------------------------------------- |
1183+
| `serializedMesh` | *string* | Input mesh serialized in the file format |
1184+
1185+
**`Mz3ReadMeshNodeOptions` interface:**
1186+
1187+
| Property | Type | Description |
1188+
| :---------------: | :-------: | :-------------------------------------------------- |
1189+
| `informationOnly` | *boolean* | Only read image metadata -- do not read pixel data. |
1190+
1191+
**`Mz3ReadMeshNodeResult` interface:**
1192+
1193+
| Property | Type | Description |
1194+
| :---------: | :--------------: | :----------------------------------------------------------------------- |
1195+
| `couldRead` | *JsonCompatible* | Whether the input could be read. If false, the output mesh is not valid. |
1196+
| `mesh` | *Mesh* | Output mesh |
1197+
1198+
#### mz3WriteMeshNode
1199+
1200+
*Write an itk-wasm file format converted to an mesh file format*
1201+
1202+
```ts
1203+
async function mz3WriteMeshNode(
1204+
mesh: Mesh,
1205+
serializedMesh: string,
1206+
options: Mz3WriteMeshNodeOptions = {}
1207+
) : Promise<Mz3WriteMeshNodeResult>
1208+
```
1209+
1210+
| Parameter | Type | Description |
1211+
| :--------------: | :------: | :---------- |
1212+
| `mesh` | *Mesh* | Input mesh |
1213+
| `serializedMesh` | *string* | Output mesh |
1214+
1215+
**`Mz3WriteMeshNodeOptions` interface:**
1216+
1217+
| Property | Type | Description |
1218+
| :---------------: | :-------: | :------------------------------------------------------- |
1219+
| `informationOnly` | *boolean* | Only write image metadata -- do not write pixel data. |
1220+
| `useCompression` | *boolean* | Use compression in the written file, if supported |
1221+
| `binaryFileType` | *boolean* | Use a binary file type in the written file, if supported |
1222+
1223+
**`Mz3WriteMeshNodeResult` interface:**
1224+
1225+
| Property | Type | Description |
1226+
| :--------------: | :--------------: | :-------------------------------------------------------------------------- |
1227+
| `couldWrite` | *JsonCompatible* | Whether the input could be written. If false, the output mesh is not valid. |
1228+
| `serializedMesh` | *BinaryFile* | Output mesh |
1229+
10951230
#### objReadMeshNode
10961231

10971232
*Read a mesh file format and convert it to the itk-wasm file format*

packages/mesh-io/typescript/src/extension-to-mesh-io.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const extensionToMeshIo = new Map([
33
['byu', 'byu'],
44
['fsa', 'free-surfer-ascii'],
55
['fsb', 'free-surfer-binary'],
6+
['mz3', 'mz3'],
67
['obj', 'obj'],
78
['off', 'off'],
89
['stl', 'stl'],

packages/mesh-io/typescript/src/extension-to-point-set-io.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const extensionToPointSetIo = new Map([
22
["vtk", "vtk"],
33
["obj", "obj"],
44
["off", "off"],
5+
["mz3", "mz3"],
56
["iwm", "wasm"],
67
["iwm.cbor", "wasm"],
78
["iwm.cbor.zst", "wasm-zstd"],

packages/mesh-io/typescript/src/index-common.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ export type { FreeSurferBinaryReadMeshOptions };
2525
import FreeSurferBinaryWriteMeshOptions from "./free-surfer-binary-write-mesh-options.js";
2626
export type { FreeSurferBinaryWriteMeshOptions };
2727

28+
import offReadMeshOptions from "./off-read-mesh-options.js";
29+
export type { offReadMeshOptions };
30+
31+
import offWriteMeshOptions from "./off-write-mesh-options.js";
32+
export type { offWriteMeshOptions };
33+
2834
import ObjReadMeshOptions from "./obj-read-mesh-options.js";
2935
export type { ObjReadMeshOptions };
3036

@@ -106,6 +112,13 @@ export type { WasmZstdReadPointSetOptions };
106112
import WasmZstdWritePointSetOptions from "./wasm-zstd-write-point-set-options.js";
107113
export type { WasmZstdWritePointSetOptions };
108114

115+
import Mz3ReadPointSetOptions from "./mz3-read-point-set-options.js";
116+
export type { Mz3ReadPointSetOptions };
117+
118+
import Mz3WritePointSetOptions from "./mz3-write-point-set-options.js";
119+
export type { Mz3WritePointSetOptions };
120+
121+
109122
export type { JsonCompatible } from "itk-wasm";
110123
export type { Mesh } from "itk-wasm";
111124
export type { PointSet } from "itk-wasm";

packages/mesh-io/typescript/src/index-node-only.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ export { freeSurferBinaryReadMeshNode };
4343
import FreeSurferBinaryWriteMeshNodeResult from "./free-surfer-binary-write-mesh-node-result.js";
4444
export type { FreeSurferBinaryWriteMeshNodeResult };
4545

46+
import Mz3ReadMeshNodeResult from "./mz3-read-mesh-node-result.js";
47+
export type { Mz3ReadMeshNodeResult };
48+
49+
import mz3ReadMeshNode from "./mz3-read-mesh-node.js";
50+
export { mz3ReadMeshNode };
51+
52+
import Mz3WriteMeshNodeResult from "./mz3-write-mesh-node-result.js";
53+
export type { Mz3WriteMeshNodeResult };
54+
55+
import mz3WriteMeshNode from "./mz3-write-mesh-node.js";
56+
export { mz3WriteMeshNode };
57+
4658
import freeSurferBinaryWriteMeshNode from "./free-surfer-binary-write-mesh-node.js";
4759
export { freeSurferBinaryWriteMeshNode };
4860

@@ -130,6 +142,18 @@ export type { WasmZstdWriteMeshNodeResult };
130142
import wasmZstdWriteMeshNode from "./wasm-zstd-write-mesh-node.js";
131143
export { wasmZstdWriteMeshNode };
132144

145+
import Mz3ReadPointSetNodeResult from "./mz3-read-point-set-node-result.js";
146+
export type { Mz3ReadPointSetNodeResult };
147+
148+
import mz3ReadPointSetNode from "./mz3-read-point-set-node.js";
149+
export { mz3ReadPointSetNode };
150+
151+
import Mz3WritePointSetNodeResult from "./mz3-write-point-set-node-result.js";
152+
export type { Mz3WritePointSetNodeResult };
153+
154+
import mz3WritePointSetNode from "./mz3-write-point-set-node.js";
155+
export { mz3WritePointSetNode };
156+
133157
import ObjReadPointSetNodeResult from "./obj-read-point-set-node-result.js";
134158
export type { ObjReadPointSetNodeResult };
135159

packages/mesh-io/typescript/src/mesh-io-index-node.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import vtkPolyDataReadMeshNode from "./vtk-poly-data-read-mesh-node.js";
22
import vtkPolyDataWriteMeshNode from "./vtk-poly-data-write-mesh-node.js";
3+
import mz3ReadMeshNode from "./mz3-read-mesh-node.js";
4+
import mz3WriteMeshNode from "./mz3-write-mesh-node.js";
35
import objReadMeshNode from "./obj-read-mesh-node.js";
46
import objWriteMeshNode from "./obj-write-mesh-node.js";
57
import stlReadMeshNode from "./stl-read-mesh-node.js";
@@ -24,6 +26,7 @@ const meshIoIndexNode = new Map([
2426
["obj", [objReadMeshNode, objWriteMeshNode]],
2527
["stl", [stlReadMeshNode, stlWriteMeshNode]],
2628
["off", [offReadMeshNode, offWriteMeshNode]],
29+
["mz3", [mz3ReadMeshNode, mz3WriteMeshNode]],
2730
["wasm", [wasmReadMeshNode, wasmWriteMeshNode]],
2831
["wasmZstd", [wasmZstdReadMeshNode, wasmZstdWriteMeshNode]],
2932
["swc", [swcReadMeshNode, swcWriteMeshNode]],

packages/mesh-io/typescript/src/mesh-io-index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import stlReadMesh from "./stl-read-mesh.js";
66
import stlWriteMesh from "./stl-write-mesh.js";
77
import offReadMesh from "./off-read-mesh.js";
88
import offWriteMesh from "./off-write-mesh.js";
9+
import mz3ReadMesh from "./mz3-read-mesh.js";
10+
import mz3WriteMesh from "./mz3-write-mesh.js";
911
import wasmReadMesh from "./wasm-read-mesh.js";
1012
import wasmWriteMesh from "./wasm-write-mesh.js";
1113
import wasmZstdReadMesh from "./wasm-zstd-read-mesh.js";
@@ -24,6 +26,7 @@ const meshIoIndex = new Map([
2426
["obj", [objReadMesh, objWriteMesh]],
2527
["stl", [stlReadMesh, stlWriteMesh]],
2628
["off", [offReadMesh, offWriteMesh]],
29+
["mz3", [mz3ReadMesh, mz3WriteMesh]],
2730
["wasm", [wasmReadMesh, wasmWriteMesh]],
2831
["wasmZstd", [wasmZstdReadMesh, wasmZstdWriteMesh]],
2932
["swc", [swcReadMesh, swcWriteMesh]],
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import test from "ava";
2+
import path from "path";
3+
4+
import { mz3ReadMeshNode, mz3WriteMeshNode } from "../../dist/index-node.js";
5+
import { IntTypes, FloatTypes, PixelTypes } from "itk-wasm";
6+
7+
import { testInputPath, testOutputPath } from "./common.js";
8+
9+
const testInputFilePath = path.resolve(testInputPath, "11ScalarMesh.mz3");
10+
const testOutputFilePath = path.resolve(
11+
testOutputPath,
12+
"mz3-test-11ScalarMesh.mz3"
13+
);
14+
15+
const verifyMesh = (t, mesh) => {
16+
t.is(mesh.meshType.dimension, 3);
17+
t.is(mesh.meshType.pointComponentType, FloatTypes.Float32);
18+
t.is(mesh.meshType.cellComponentType, IntTypes.UInt32);
19+
t.is(mesh.meshType.pointPixelType, PixelTypes.Scalar);
20+
t.is(mesh.meshType.cellPixelType, PixelTypes.Scalar);
21+
t.is(mesh.numberOfPoints, 6);
22+
t.is(mesh.numberOfCells, 8);
23+
};
24+
25+
test("mz3ReadMeshNode reads a MZ3 file path given on the local filesystem", async (t) => {
26+
const { couldRead, mesh } = await mz3ReadMeshNode(testInputFilePath);
27+
t.true(couldRead);
28+
verifyMesh(t, mesh);
29+
});
30+
31+
test("mz3WriteMeshNode writes a MZ3 file path on the local filesystem", async (t) => {
32+
const { couldRead, mesh } = await mz3ReadMeshNode(testInputFilePath);
33+
t.true(couldRead);
34+
35+
const useCompression = false;
36+
const { couldWrite } = await mz3WriteMeshNode(mesh, testOutputFilePath, {
37+
useCompression,
38+
});
39+
t.true(couldWrite);
40+
41+
const { couldRead: couldReadBack, mesh: meshBack } = await mz3ReadMeshNode(
42+
testOutputFilePath
43+
);
44+
t.true(couldReadBack);
45+
verifyMesh(t, meshBack);
46+
});

0 commit comments

Comments
 (0)