@niivue/niivue 0.44.0 → 0.44.2-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -107,6 +107,18 @@ declare enum LabelLineTerminator {
107
107
  CIRCLE = "circle",
108
108
  RING = "ring"
109
109
  }
110
+ declare enum LabelAnchorPoint {
111
+ NONE = 0,
112
+ TOPLEFT = 9,
113
+ TOPCENTER = 10,
114
+ TOPRIGHT = 12,
115
+ MIDDLELEFT = 17,
116
+ MIDDLECENTER = 18,
117
+ MIDDLERIGHT = 20,
118
+ BOTTOMLEFT = 33,
119
+ BOTTOMCENTER = 34,
120
+ BOTTOMRIGHT = 36
121
+ }
110
122
  /**
111
123
  * Class representing label style.
112
124
  * @ignore
@@ -140,12 +152,14 @@ declare class NVLabel3D {
140
152
  text: string;
141
153
  style: NVLabel3DStyle;
142
154
  points?: number[] | number[][];
155
+ anchor: LabelAnchorPoint;
156
+ onClick?: (label: NVLabel3D) => void;
143
157
  /**
144
158
  * @param text - The text of the label
145
159
  * @param style - The style of the label
146
160
  * @param points - An array of points label for label lines
147
161
  */
148
- constructor(text: string, style: NVLabel3DStyle, points?: number[] | number[][]);
162
+ constructor(text: string, style: NVLabel3DStyle, points?: number[] | number[][], anchor?: LabelAnchorPoint, onClick?: (label: NVLabel3D) => void);
149
163
  }
150
164
 
151
165
  /**
@@ -437,7 +451,7 @@ declare class NVImage {
437
451
  * read a 3D slab of voxels from a volume
438
452
  * @param voxStart - first row, column and slice (RAS order) for selection
439
453
  * @param voxEnd - final row, column and slice (RAS order) for selection
440
- * @param dataType - array data type. Options: 'same' (default), 'uint8', 'float32'
454
+ * @param dataType - array data type. Options: 'same' (default), 'uint8', 'float32', 'scaled', 'normalized', 'windowed'
441
455
  * @returns the an array where ret[0] is the voxel values and ret[1] is dimension of selection
442
456
  * @see {@link https://niivue.github.io/niivue/features/slab_selection.html | live demo usage}
443
457
  */
@@ -584,7 +598,8 @@ declare enum DRAG_MODE {
584
598
  measurement = 2,
585
599
  pan = 3,
586
600
  slicer3D = 4,
587
- callbackOnly = 5
601
+ callbackOnly = 5,
602
+ roiSelection = 6
588
603
  }
589
604
  /**
590
605
  * NVConfigOptions
@@ -619,6 +634,7 @@ type NVConfigOptions = {
619
634
  isOrientCube: boolean;
620
635
  multiplanarPadPixels: number;
621
636
  multiplanarForceRender: boolean;
637
+ multiplanarEqualSize: boolean;
622
638
  multiplanarShowRender: SHOW_RENDER;
623
639
  isRadiologicalConvention: boolean;
624
640
  meshThicknessOn2D: number | string;
@@ -653,13 +669,21 @@ type NVConfigOptions = {
653
669
  renderOverlayBlend: number;
654
670
  sliceMosaicString: string;
655
671
  centerMosaic: boolean;
672
+ penSize: number;
656
673
  clickToSegment: boolean;
657
674
  clickToSegmentRadius: number;
658
- clickToSegmentSteps: number;
659
675
  clickToSegmentBright: boolean;
676
+ clickToSegmentAutoIntensity: boolean;
677
+ clickToSegmentIntensityMax: number;
678
+ clickToSegmentIntensityMin: number;
679
+ clickToSegmentPercent: number;
680
+ clickToSegmentMaxDistanceMM: number;
681
+ selectionBoxLineThickness: number;
682
+ selectionBoxIsOutline: boolean;
660
683
  };
661
684
  declare const DEFAULT_OPTIONS: NVConfigOptions;
662
685
  type SceneData = {
686
+ gamma: number;
663
687
  azimuth: number;
664
688
  elevation: number;
665
689
  crosshairPos: vec3;
@@ -672,6 +696,7 @@ type SceneData = {
672
696
  clipVolumeHigh: number[];
673
697
  };
674
698
  declare const INITIAL_SCENE_DATA: {
699
+ gamma: number;
675
700
  azimuth: number;
676
701
  elevation: number;
677
702
  crosshairPos: vec3;
@@ -696,6 +721,7 @@ type Scene = {
696
721
  pan2Dxyzmm: vec4;
697
722
  _elevation?: number;
698
723
  _azimuth?: number;
724
+ gamma?: number;
699
725
  };
700
726
  type DocumentData = {
701
727
  title: string;
@@ -958,6 +984,18 @@ type NiiVueLocation = {
958
984
  vox: vec3;
959
985
  xy: [number, number];
960
986
  };
987
+ type SyncOpts = {
988
+ '3d'?: boolean;
989
+ '2d'?: boolean;
990
+ zoomPan?: boolean;
991
+ cal_min?: boolean;
992
+ cal_max?: boolean;
993
+ gamma?: boolean;
994
+ useSliceOffset?: boolean;
995
+ sliceType?: boolean;
996
+ crosshair?: boolean;
997
+ clipPlane?: boolean;
998
+ };
961
999
 
962
1000
  type ValuesArray = Array<{
963
1001
  id: string;
@@ -1191,6 +1229,9 @@ declare class NVMesh {
1191
1229
  unloadMesh(gl: WebGL2RenderingContext): void;
1192
1230
  updateMesh(gl: WebGL2RenderingContext): void;
1193
1231
  reverseFaces(gl: WebGL2RenderingContext): void;
1232
+ hierarchicalOrder(): number;
1233
+ decimateFaces(n: number, ntarget: number): void;
1234
+ decimateHierarchicalMesh(gl: WebGL2RenderingContext, order?: number): boolean;
1194
1235
  setLayerProperty(id: number, key: keyof NVMeshLayer, val: number | string | boolean, gl: WebGL2RenderingContext): void;
1195
1236
  setProperty(key: keyof this, val: unknown, gl: WebGL2RenderingContext): void;
1196
1237
  generatePosNormClr(pts: Float32Array, tris: Uint32Array, rgba255: Uint8Array): Float32Array;
@@ -1503,6 +1544,7 @@ declare class NVMeshLoaders {
1503
1544
  static readLayer(name: string, buffer: ArrayBuffer, nvmesh: NVMesh, opacity?: number, colormap?: string, colormapNegative?: string, useNegativeCmap?: boolean, cal_min?: number | null, cal_max?: number | null, outlineBorder?: number): NVMeshLayer | undefined;
1504
1545
  static readSMP(buffer: ArrayBuffer, n_vert: number): Float32Array;
1505
1546
  static readSTC(buffer: ArrayBuffer, n_vert: number): Float32Array;
1547
+ static isCurv(buffer: ArrayBuffer): boolean;
1506
1548
  static readCURV(buffer: ArrayBuffer, n_vert: number): Float32Array;
1507
1549
  static readANNOT(buffer: ArrayBuffer, n_vert: number, isReadColortables?: boolean): ANNOT;
1508
1550
  static readNV(buffer: ArrayBuffer): DefaultMeshType;
@@ -1520,6 +1562,7 @@ declare class NVMeshLoaders {
1520
1562
  static readSRF(buffer: ArrayBuffer): DefaultMeshType;
1521
1563
  static readTxtSTL(buffer: ArrayBuffer): DefaultMeshType;
1522
1564
  static readSTL(buffer: ArrayBuffer): DefaultMeshType;
1565
+ static decimateLayerVertices(nVertLayer: number, nVertMesh: number): number;
1523
1566
  static readNII2(buffer: ArrayBuffer, n_vert?: number, anatomicalStructurePrimary?: string): Int32Array | Float32Array | Int16Array | Uint8Array;
1524
1567
  static readNII(buffer: ArrayBuffer, n_vert?: number, anatomicalStructurePrimary?: string): Float32Array | Uint8Array | Int32Array | Int16Array;
1525
1568
  static readMGH(buffer: ArrayBuffer, n_vert?: number, isReadColortables?: boolean): MGH;
@@ -1527,6 +1570,26 @@ declare class NVMeshLoaders {
1527
1570
  static readGII(buffer: ArrayBuffer, n_vert?: number): GII;
1528
1571
  }
1529
1572
 
1573
+ type Extents = {
1574
+ mxDx: number;
1575
+ extentsMin: number | number[];
1576
+ extentsMax: number | number[];
1577
+ };
1578
+ /**
1579
+ * Utilities class for common mesh functions
1580
+ */
1581
+ declare class NVMeshUtilities {
1582
+ static getClusterBoundaryU8(u8: Uint8Array, faces: number[] | Uint32Array): boolean[];
1583
+ static createMZ3(vertices: Float32Array, indices: Uint32Array, compress?: boolean): ArrayBuffer;
1584
+ static createOBJ(vertices: Float32Array, indices: Uint32Array): ArrayBuffer;
1585
+ static createSTL(vertices: Float32Array, indices: Uint32Array): ArrayBuffer;
1586
+ static downloadArrayBuffer(buffer: ArrayBuffer, filename: string): void;
1587
+ static saveMesh(vertices: Float32Array, indices: Uint32Array, filename?: string, compress?: boolean): ArrayBuffer;
1588
+ static getClusterBoundary(rgba8: Uint8Array, faces: number[] | Uint32Array): boolean[];
1589
+ static getExtents(pts: number[] | Float32Array): Extents;
1590
+ static generateNormals(pts: number[] | Float32Array, tris: number[] | Uint32Array): Float32Array;
1591
+ }
1592
+
1530
1593
  type ColormapListEntry = {
1531
1594
  name: string;
1532
1595
  min: number;
@@ -1569,6 +1632,7 @@ type Descriptive = {
1569
1632
  cal_max: number;
1570
1633
  robust_min: number;
1571
1634
  robust_max: number;
1635
+ area: number | null;
1572
1636
  };
1573
1637
  type SliceScale = {
1574
1638
  volScale: number[];
@@ -1653,6 +1717,7 @@ declare class Niivue {
1653
1717
  orientCubeShader?: Shader;
1654
1718
  orientCubeShaderVAO: WebGLVertexArrayObject | null;
1655
1719
  rectShader?: Shader;
1720
+ rectOutlineShader?: Shader;
1656
1721
  renderShader?: Shader;
1657
1722
  lineShader?: Shader;
1658
1723
  line3DShader?: Shader;
@@ -1697,7 +1762,7 @@ declare class Niivue {
1697
1762
  extentsMin?: vec3;
1698
1763
  extentsMax?: vec3;
1699
1764
  private resizeObserver;
1700
- syncOpts: Record<string, unknown>;
1765
+ syncOpts: SyncOpts;
1701
1766
  readyForSync: boolean;
1702
1767
  uiData: UIData;
1703
1768
  back: NVImage | null;
@@ -1718,7 +1783,7 @@ declare class Niivue {
1718
1783
  screen2frac?: number[];
1719
1784
  }>;
1720
1785
  cuboidVertexBuffer?: WebGLBuffer;
1721
- otherNV: Niivue | Niivue[] | null;
1786
+ otherNV: Niivue[] | null;
1722
1787
  volumeObject3D: NiivueObject3D | null;
1723
1788
  pivot3D: number[];
1724
1789
  furthestFromPivot: number;
@@ -1973,7 +2038,7 @@ declare class Niivue {
1973
2038
  * @deprecated use broadcastTo instead
1974
2039
  * @see {@link https://niivue.github.io/niivue/features/sync.mesh.html | live demo usage}
1975
2040
  */
1976
- syncWith(otherNV: Niivue, syncOpts?: {
2041
+ syncWith(otherNV: Niivue | Niivue[], syncOpts?: {
1977
2042
  '2d': boolean;
1978
2043
  '3d': boolean;
1979
2044
  }): void;
@@ -1992,6 +2057,15 @@ declare class Niivue {
1992
2057
  '2d': boolean;
1993
2058
  '3d': boolean;
1994
2059
  }): void;
2060
+ doSync3d(otherNV: Niivue): void;
2061
+ doSync2d(otherNV: Niivue): void;
2062
+ doSyncGamma(otherNV: Niivue): void;
2063
+ doSyncZoomPan(otherNV: Niivue): void;
2064
+ doSyncCrosshair(otherNV: Niivue): void;
2065
+ doSyncCalMin(otherNV: Niivue): void;
2066
+ doSyncCalMax(otherNV: Niivue): void;
2067
+ doSyncSliceType(otherNV: Niivue): void;
2068
+ doSyncClipPlane(otherNV: Niivue): void;
1995
2069
  /**
1996
2070
  * Sync the scene controls (orientation, crosshair location, etc.) from one Niivue instance to another. useful for using one canvas to drive another.
1997
2071
  * @internal
@@ -2264,6 +2338,15 @@ declare class Niivue {
2264
2338
  * @see {@link https://niivue.github.io/niivue/features/clipplanes.html | live demo usage}
2265
2339
  */
2266
2340
  indexNearestXYZmm(mesh: number, Xmm: number, Ymm: number, Zmm: number): number[];
2341
+ /**
2342
+ * reduce complexity of FreeSurfer mesh
2343
+ * @param mesh - identity of mesh to change
2344
+ * @param order - decimation order 0..6
2345
+ * @example niivue.decimateHierarchicalMesh(niivue.meshes[0].id, 4)
2346
+ * @returns boolean false if mesh is not hierarchical or of lower order
2347
+ * @see {@link https://niivue.github.io/niivue/features/meshes.html | live demo usage}
2348
+ */
2349
+ decimateHierarchicalMesh(mesh: number, order?: number): boolean;
2267
2350
  /**
2268
2351
  * reverse triangle winding of mesh (swap front and back faces)
2269
2352
  * @param id - identity of mesh to change
@@ -2643,9 +2726,17 @@ declare class Niivue {
2643
2726
  drawGrowCut(): void;
2644
2727
  drawPt(x: number, y: number, z: number, penValue: number): void;
2645
2728
  drawPenLine(ptA: number[], ptB: number[], penValue: number): void;
2729
+ /**
2730
+ * Performs a 1-voxel binary dilation on a connected cluster within the drawing mask using the drawFloodFillCore function.
2731
+ *
2732
+ * @param seedXYZ - voxel index of the seed voxel in the mask array.
2733
+ * @param neighbors - Number of neighbors to consider for connectivity and dilation (6, 18, or 26).
2734
+ */
2735
+ drawingBinaryDilationWithSeed(seedXYZ: number[], // seed voxel x,y,z
2736
+ neighbors?: 6 | 18 | 26): void;
2646
2737
  drawFloodFillCore(img: Uint8Array, seedVx: number, neighbors?: number): void;
2647
2738
  drawFloodFill(seedXYZ: number[], newColor?: number, growSelectedCluster?: number, // if non-zero, growth based on background intensity POSITIVE_INFINITY for selected or bright, NEGATIVE_INFINITY for selected or darker
2648
- forceMin?: number, forceMax?: number, neighbors?: number): void;
2739
+ forceMin?: number, forceMax?: number, neighbors?: number, maxDistanceMM?: number): void;
2649
2740
  drawPenFilled(): void;
2650
2741
  /**
2651
2742
  * close drawing: make sure you have saved any changes before calling this!
@@ -2774,13 +2865,33 @@ declare class Niivue {
2774
2865
  updateGLVolume(): void;
2775
2866
  /**
2776
2867
  * basic statistics for selected voxel-based image
2777
- * @param layer - selects image to describe
2778
- * @param masks - are optional binary images to filter voxles
2779
- * @returns numeric values to describe image
2780
- * @example niivue.getDescriptives(0);
2868
+ * @param options - an object containing the following properties:
2869
+ * - layer: selects image to describe
2870
+ * - masks: optional binary images to filter voxels
2871
+ * - drawingIsMask: a boolean indicating if the drawing is used as a mask
2872
+ * - roiIsMask: a boolean indicating if the ROI is used as a mask
2873
+ * - startVox: the starting voxel coordinates
2874
+ * - endVox: the ending voxel coordinates
2875
+ * @returns numeric values to describe image or regions of images
2876
+ * @example
2877
+ * niivue.getDescriptives({
2878
+ * layer: 0,
2879
+ * masks: [],
2880
+ * drawingIsMask: true, // drawingIsMask and roiIsMask are mutually exclusive
2881
+ * roiIsMask: false,
2882
+ * startVox: [10, 20, 30], // ignored if roiIsMask is false
2883
+ * endVox: [40, 50, 60] // ignored if roiIsMask is false
2884
+ * });
2781
2885
  * @see {@link https://niivue.github.io/niivue/features/draw2.html | live demo usage}
2782
2886
  */
2783
- getDescriptives(layer?: number, masks?: any[], drawingIsMask?: boolean): Descriptive;
2887
+ getDescriptives(options: {
2888
+ layer?: number;
2889
+ masks?: number[];
2890
+ drawingIsMask?: boolean;
2891
+ roiIsMask?: boolean;
2892
+ startVox?: number[];
2893
+ endVox?: number[];
2894
+ }): Descriptive;
2784
2895
  refreshLayers(overlayItem: NVImage, layer: number): void;
2785
2896
  /**
2786
2897
  * query all available color maps that can be applied to volumes
@@ -2912,6 +3023,7 @@ declare class Niivue {
2912
3023
  effectiveCanvasHeight(): number;
2913
3024
  effectiveCanvasWidth(): number;
2914
3025
  getAllLabels(): NVLabel3D[];
3026
+ getConnectomeLabels(): NVLabel3D[];
2915
3027
  getBulletMarginWidth(): number;
2916
3028
  getLegendPanelWidth(): number;
2917
3029
  getLegendPanelHeight(): number;
@@ -2943,9 +3055,10 @@ declare class Niivue {
2943
3055
  screenFieldOfViewMM(axCorSag?: number, forceSliceMM?: boolean): vec3;
2944
3056
  screenFieldOfViewExtendedVox(axCorSag?: number): MM;
2945
3057
  screenFieldOfViewExtendedMM(axCorSag?: number): MM;
2946
- drawSliceOrientationText(leftTopWidthHeight: number[], axCorSag: SLICE_TYPE): void;
3058
+ drawSliceOrientationText(leftTopWidthHeight: number[], axCorSag: SLICE_TYPE, padLeftTop?: number[]): void;
2947
3059
  xyMM2xyzMM(axCorSag: SLICE_TYPE, sliceFrac: number): number[];
2948
- draw2D(leftTopWidthHeight: number[], axCorSag: SLICE_TYPE, customMM?: number): void;
3060
+ draw2DMain(leftTopWidthHeight: number[], axCorSag: SLICE_TYPE, customMM?: number): void;
3061
+ draw2D(leftTopWidthHeight: number[], axCorSag: SLICE_TYPE, customMM?: number, imageWidthHeight?: number[]): void;
2949
3062
  calculateMvpMatrix(_unused: unknown, leftTopWidthHeight: number[], azimuth: number, elevation: number): mat4[];
2950
3063
  calculateModelMatrix(azimuth: number, elevation: number): mat4;
2951
3064
  calculateRayDirection(azimuth: number, elevation: number): vec3;
@@ -2964,12 +3077,13 @@ declare class Niivue {
2964
3077
  * @param style - label style
2965
3078
  * @param point - 3D point on the model
2966
3079
  */
2967
- addLabel(text: string, style: NVLabel3DStyle, points?: number[] | number[][]): NVLabel3D;
3080
+ addLabel(text: string, style: NVLabel3DStyle, points?: number[] | number[][], anchor?: LabelAnchorPoint, onClick?: (label: NVLabel3D) => void): NVLabel3D;
2968
3081
  calculateScreenPoint(point: [number, number, number], mvpMatrix: mat4, leftTopWidthHeight: number[]): vec4;
2969
3082
  getLabelAtPoint(screenPoint: [number, number]): NVLabel3D | null;
2970
3083
  drawLabelLine(label: NVLabel3D, pos: vec2, mvpMatrix: mat4, leftTopWidthHeight: number[], secondPass?: boolean): void;
2971
- draw3DLabel(label: NVLabel3D, pos: vec2, mvpMatrix: mat4, leftTopWidthHeight: number[], bulletMargin: number, legendWidth: number, secondPass?: boolean): void;
3084
+ draw3DLabel(label: NVLabel3D, pos: vec2, mvpMatrix?: mat4, leftTopWidthHeight?: number[], bulletMargin?: number, legendWidth?: number, secondPass?: boolean): void;
2972
3085
  draw3DLabels(mvpMatrix: mat4, leftTopWidthHeight: number[], secondPass?: boolean): void;
3086
+ drawAnchoredLabels(): void;
2973
3087
  draw3D(leftTopWidthHeight?: number[], mvpMatrix?: mat4 | null, modelMatrix?: mat4 | null, normalMatrix?: mat4 | null, azimuth?: number | null, elevation?: number): string | undefined;
2974
3088
  drawMesh3D(isDepthTest?: boolean, alpha?: number, m?: mat4, modelMtx?: mat4, normMtx?: mat4): void;
2975
3089
  drawCrosshairs3D(isDepthTest?: boolean, alpha?: number, mvpMtx?: mat4 | null, is2DView?: boolean, isSliceMM?: boolean): void;
@@ -3009,4 +3123,4 @@ declare class Niivue {
3009
3123
  set gl(gl: WebGL2RenderingContext | null);
3010
3124
  }
3011
3125
 
3012
- export { type Connectome, type ConnectomeOptions, DEFAULT_OPTIONS, DRAG_MODE, type DocumentData, type DragReleaseParams, type ExportDocumentData, INITIAL_SCENE_DATA, LabelLineTerminator, LabelTextAlignment, type LegacyConnectome, type LegacyNodes, MULTIPLANAR_TYPE, type NVConfigOptions, type NVConnectomeEdge, type NVConnectomeNode, NVController, NVDocument, NVImage, NVImageFromUrlOptions, NVLabel3D, NVLabel3DStyle, NVMesh, NVMeshFromUrlOptions, NVMeshLayerDefaults, NVMeshLoaders, NVUtilities, type NiftiHeader, type NiiVueLocation, type NiiVueLocationValue, Niivue, type Point, SHOW_RENDER, SLICE_TYPE, type Scene, type Volume, cmapper, ColorTables as colortables };
3126
+ export { type Connectome, type ConnectomeOptions, DEFAULT_OPTIONS, DRAG_MODE, type DocumentData, type DragReleaseParams, type ExportDocumentData, INITIAL_SCENE_DATA, LabelAnchorPoint, LabelLineTerminator, LabelTextAlignment, type LegacyConnectome, type LegacyNodes, MULTIPLANAR_TYPE, type NVConfigOptions, type NVConnectomeEdge, type NVConnectomeNode, NVController, NVDocument, NVImage, NVImageFromUrlOptions, NVLabel3D, NVLabel3DStyle, NVMesh, NVMeshFromUrlOptions, NVMeshLayerDefaults, NVMeshLoaders, NVMeshUtilities, NVUtilities, type NiftiHeader, type NiiVueLocation, type NiiVueLocationValue, Niivue, type Point, SHOW_RENDER, SLICE_TYPE, type Scene, type SyncOpts, type Volume, cmapper, ColorTables as colortables };