@niivue/niivue 0.45.1 → 0.47.0

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/build/index.d.ts CHANGED
@@ -417,7 +417,13 @@ declare class NVImage {
417
417
  set colorMap(cm: string);
418
418
  get opacity(): number;
419
419
  set opacity(opacity: number);
420
- calMinMax(): number[];
420
+ /**
421
+ * set contrast/brightness to robust range (2%..98%)
422
+ * @param vol - volume for estimate (use -1 to use estimate on all loaded volumes; use INFINITY for current volume)
423
+ * @sets volume brightness and returns array [pct2, pct98, mnScale, mxScale]
424
+ * @see {@link https://niivue.github.io/niivue/features/timeseries2.html | live demo usage}
425
+ */
426
+ calMinMax(vol?: number): number[];
421
427
  intensityRaw2Scaled(raw: number): number;
422
428
  intensityScaled2Raw(scaled: number): number;
423
429
  saveToUint8Array(fnm: string, drawing8?: Uint8Array | null): Uint8Array;
@@ -598,7 +604,8 @@ declare enum DRAG_MODE {
598
604
  measurement = 2,
599
605
  pan = 3,
600
606
  slicer3D = 4,
601
- callbackOnly = 5
607
+ callbackOnly = 5,
608
+ roiSelection = 6
602
609
  }
603
610
  /**
604
611
  * NVConfigOptions
@@ -607,6 +614,7 @@ type NVConfigOptions = {
607
614
  textHeight: number;
608
615
  colorbarHeight: number;
609
616
  crosshairWidth: number;
617
+ crosshairWidthUnit: 'voxels' | 'mm' | 'percent';
610
618
  crosshairGap: number;
611
619
  rulerWidth: number;
612
620
  show3Dcrosshair: boolean;
@@ -631,6 +639,7 @@ type NVConfigOptions = {
631
639
  isRuler: boolean;
632
640
  isColorbar: boolean;
633
641
  isOrientCube: boolean;
642
+ tileMargin: number;
634
643
  multiplanarPadPixels: number;
635
644
  multiplanarForceRender: boolean;
636
645
  multiplanarEqualSize: boolean;
@@ -641,6 +650,8 @@ type NVConfigOptions = {
641
650
  yoke3Dto2DZoom: boolean;
642
651
  isDepthPickMesh: boolean;
643
652
  isCornerOrientationText: boolean;
653
+ heroImageFraction: number;
654
+ heroSliceType: SLICE_TYPE;
644
655
  sagittalNoseLeft: boolean;
645
656
  isSliceMM: boolean;
646
657
  isV1SliceShader: boolean;
@@ -668,10 +679,24 @@ type NVConfigOptions = {
668
679
  renderOverlayBlend: number;
669
680
  sliceMosaicString: string;
670
681
  centerMosaic: boolean;
682
+ penSize: number;
671
683
  clickToSegment: boolean;
672
684
  clickToSegmentRadius: number;
673
- clickToSegmentSteps: number;
674
685
  clickToSegmentBright: boolean;
686
+ clickToSegmentAutoIntensity: boolean;
687
+ clickToSegmentIntensityMax: number;
688
+ clickToSegmentIntensityMin: number;
689
+ clickToSegmentPercent: number;
690
+ clickToSegmentMaxDistanceMM: number;
691
+ clickToSegmentIs2D: boolean;
692
+ selectionBoxLineThickness: number;
693
+ selectionBoxIsOutline: boolean;
694
+ scrollRequiresFocus: boolean;
695
+ showMeasureUnits: boolean;
696
+ measureTextJustify: 'start' | 'center' | 'end';
697
+ measureTextColor: number[];
698
+ measureLineColor: number[];
699
+ measureTextHeight: number;
675
700
  };
676
701
  declare const DEFAULT_OPTIONS: NVConfigOptions;
677
702
  type SceneData = {
@@ -976,6 +1001,18 @@ type NiiVueLocation = {
976
1001
  vox: vec3;
977
1002
  xy: [number, number];
978
1003
  };
1004
+ type SyncOpts = {
1005
+ '3d'?: boolean;
1006
+ '2d'?: boolean;
1007
+ zoomPan?: boolean;
1008
+ cal_min?: boolean;
1009
+ cal_max?: boolean;
1010
+ gamma?: boolean;
1011
+ useSliceOffset?: boolean;
1012
+ sliceType?: boolean;
1013
+ crosshair?: boolean;
1014
+ clipPlane?: boolean;
1015
+ };
979
1016
 
980
1017
  type ValuesArray = Array<{
981
1018
  id: string;
@@ -1586,6 +1623,7 @@ type Graph = {
1586
1623
  vols: number[];
1587
1624
  autoSizeMultiplanar: boolean;
1588
1625
  normalizeValues: boolean;
1626
+ isRangeCalMinMax: boolean;
1589
1627
  backColor?: number[];
1590
1628
  lineColor?: number[];
1591
1629
  textColor?: number[];
@@ -1612,6 +1650,7 @@ type Descriptive = {
1612
1650
  cal_max: number;
1613
1651
  robust_min: number;
1614
1652
  robust_max: number;
1653
+ area: number | null;
1615
1654
  };
1616
1655
  type SliceScale = {
1617
1656
  volScale: number[];
@@ -1684,6 +1723,9 @@ declare class Niivue {
1684
1723
  drawUndoBitmaps: Uint8Array[];
1685
1724
  drawLut: LUT;
1686
1725
  drawOpacity: number;
1726
+ clickToSegmentIsGrowing: boolean;
1727
+ clickToSegmentGrowingBitmap: Uint8Array | null;
1728
+ clickToSegmentXY: number[];
1687
1729
  renderDrawAmbientOcclusion: number;
1688
1730
  colorbarHeight: number;
1689
1731
  drawPenLocation: number[];
@@ -1697,6 +1739,7 @@ declare class Niivue {
1697
1739
  orientCubeShader?: Shader;
1698
1740
  orientCubeShaderVAO: WebGLVertexArrayObject | null;
1699
1741
  rectShader?: Shader;
1742
+ rectOutlineShader?: Shader;
1700
1743
  renderShader?: Shader;
1701
1744
  lineShader?: Shader;
1702
1745
  line3DShader?: Shader;
@@ -1741,7 +1784,7 @@ declare class Niivue {
1741
1784
  extentsMin?: vec3;
1742
1785
  extentsMax?: vec3;
1743
1786
  private resizeObserver;
1744
- syncOpts: Record<string, unknown>;
1787
+ syncOpts: SyncOpts;
1745
1788
  readyForSync: boolean;
1746
1789
  uiData: UIData;
1747
1790
  back: NVImage | null;
@@ -1762,7 +1805,7 @@ declare class Niivue {
1762
1805
  screen2frac?: number[];
1763
1806
  }>;
1764
1807
  cuboidVertexBuffer?: WebGLBuffer;
1765
- otherNV: Niivue | Niivue[] | null;
1808
+ otherNV: Niivue[] | null;
1766
1809
  volumeObject3D: NiivueObject3D | null;
1767
1810
  pivot3D: number[];
1768
1811
  furthestFromPivot: number;
@@ -2017,7 +2060,7 @@ declare class Niivue {
2017
2060
  * @deprecated use broadcastTo instead
2018
2061
  * @see {@link https://niivue.github.io/niivue/features/sync.mesh.html | live demo usage}
2019
2062
  */
2020
- syncWith(otherNV: Niivue, syncOpts?: {
2063
+ syncWith(otherNV: Niivue | Niivue[], syncOpts?: {
2021
2064
  '2d': boolean;
2022
2065
  '3d': boolean;
2023
2066
  }): void;
@@ -2036,6 +2079,15 @@ declare class Niivue {
2036
2079
  '2d': boolean;
2037
2080
  '3d': boolean;
2038
2081
  }): void;
2082
+ doSync3d(otherNV: Niivue): void;
2083
+ doSync2d(otherNV: Niivue): void;
2084
+ doSyncGamma(otherNV: Niivue): void;
2085
+ doSyncZoomPan(otherNV: Niivue): void;
2086
+ doSyncCrosshair(otherNV: Niivue): void;
2087
+ doSyncCalMin(otherNV: Niivue): void;
2088
+ doSyncCalMax(otherNV: Niivue): void;
2089
+ doSyncSliceType(otherNV: Niivue): void;
2090
+ doSyncClipPlane(otherNV: Niivue): void;
2039
2091
  /**
2040
2092
  * Sync the scene controls (orientation, crosshair location, etc.) from one Niivue instance to another. useful for using one canvas to drive another.
2041
2093
  * @internal
@@ -2162,6 +2214,13 @@ declare class Niivue {
2162
2214
  * @see {@link https://niivue.github.io/niivue/features/worldspace2.html | live demo usage}
2163
2215
  */
2164
2216
  setCornerOrientationText(isCornerOrientationText: boolean): void;
2217
+ /**
2218
+ * determine proportion of screen real estate devoted to rendering in multiplanar view.
2219
+ * @param fraction - proportion of screen devoted to primary (hero) image (0 to disable)
2220
+ * @example niivue.setHeroImage(0.5)
2221
+ * @see {@link https://niivue.github.io/niivue/features/layout.html | live demo usage}
2222
+ */
2223
+ setHeroImage(fraction: number): void;
2165
2224
  /**
2166
2225
  * control whether 2D slices use radiological or neurological convention.
2167
2226
  * @param isRadiologicalConvention - new display convention
@@ -2698,9 +2757,17 @@ declare class Niivue {
2698
2757
  drawGrowCut(): void;
2699
2758
  drawPt(x: number, y: number, z: number, penValue: number): void;
2700
2759
  drawPenLine(ptA: number[], ptB: number[], penValue: number): void;
2760
+ /**
2761
+ * Performs a 1-voxel binary dilation on a connected cluster within the drawing mask using the drawFloodFillCore function.
2762
+ *
2763
+ * @param seedXYZ - voxel index of the seed voxel in the mask array.
2764
+ * @param neighbors - Number of neighbors to consider for connectivity and dilation (6, 18, or 26).
2765
+ */
2766
+ drawingBinaryDilationWithSeed(seedXYZ: number[], // seed voxel x,y,z
2767
+ neighbors?: 6 | 18 | 26): void;
2701
2768
  drawFloodFillCore(img: Uint8Array, seedVx: number, neighbors?: number): void;
2702
2769
  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
2703
- forceMin?: number, forceMax?: number, neighbors?: number): void;
2770
+ forceMin?: number, forceMax?: number, neighbors?: number, maxDistanceMM?: number, is2D?: boolean): void;
2704
2771
  drawPenFilled(): void;
2705
2772
  /**
2706
2773
  * close drawing: make sure you have saved any changes before calling this!
@@ -2714,7 +2781,7 @@ declare class Niivue {
2714
2781
  * @example niivue.refreshDrawing();
2715
2782
  * @see {@link https://niivue.github.io/niivue/features/cactus.html | live demo usage}
2716
2783
  */
2717
- refreshDrawing(isForceRedraw?: boolean): void;
2784
+ refreshDrawing(isForceRedraw?: boolean, useClickToSegmentBitmap?: boolean): void;
2718
2785
  r8Tex(texID: WebGLTexture | null, activeID: number, dims: number[], isInit?: boolean): WebGLTexture | null;
2719
2786
  rgbaTex(texID: WebGLTexture | null, activeID: number, dims: number[], isInit?: boolean): WebGLTexture | null;
2720
2787
  requestCORSIfNotSameOrigin(img: HTMLImageElement, url: string): void;
@@ -2829,13 +2896,33 @@ declare class Niivue {
2829
2896
  updateGLVolume(): void;
2830
2897
  /**
2831
2898
  * basic statistics for selected voxel-based image
2832
- * @param layer - selects image to describe
2833
- * @param masks - are optional binary images to filter voxles
2834
- * @returns numeric values to describe image
2835
- * @example niivue.getDescriptives(0);
2899
+ * @param options - an object containing the following properties:
2900
+ * - layer: selects image to describe
2901
+ * - masks: optional binary images to filter voxels
2902
+ * - drawingIsMask: a boolean indicating if the drawing is used as a mask
2903
+ * - roiIsMask: a boolean indicating if the ROI is used as a mask
2904
+ * - startVox: the starting voxel coordinates
2905
+ * - endVox: the ending voxel coordinates
2906
+ * @returns numeric values to describe image or regions of images
2907
+ * @example
2908
+ * niivue.getDescriptives({
2909
+ * layer: 0,
2910
+ * masks: [],
2911
+ * drawingIsMask: true, // drawingIsMask and roiIsMask are mutually exclusive
2912
+ * roiIsMask: false,
2913
+ * startVox: [10, 20, 30], // ignored if roiIsMask is false
2914
+ * endVox: [40, 50, 60] // ignored if roiIsMask is false
2915
+ * });
2836
2916
  * @see {@link https://niivue.github.io/niivue/features/draw2.html | live demo usage}
2837
2917
  */
2838
- getDescriptives(layer?: number, masks?: any[], drawingIsMask?: boolean): Descriptive;
2918
+ getDescriptives(options: {
2919
+ layer?: number;
2920
+ masks?: number[];
2921
+ drawingIsMask?: boolean;
2922
+ roiIsMask?: boolean;
2923
+ startVox?: number[];
2924
+ endVox?: number[];
2925
+ }): Descriptive;
2839
2926
  refreshLayers(overlayItem: NVImage, layer: number): void;
2840
2927
  /**
2841
2928
  * query all available color maps that can be applied to volumes
@@ -2953,9 +3040,11 @@ declare class Niivue {
2953
3040
  sliceScroll3D(posChange?: number): void;
2954
3041
  deleteThumbnail(): void;
2955
3042
  inGraphTile(x: number, y: number): boolean;
3043
+ updateBitmapFromClickToSegment(): void;
3044
+ sumBitmap(img: Uint8Array): number;
2956
3045
  mouseClick(x: number, y: number, posChange?: number, isDelta?: boolean): void;
2957
3046
  drawRuler(): void;
2958
- drawRuler10cm(startXYendXY: number[]): void;
3047
+ drawRuler10cm(startXYendXY: number[], rulerColor: number[], rulerWidth?: number): void;
2959
3048
  screenXY2mm(x: number, y: number, forceSlice?: number): vec4;
2960
3049
  dragForPanZoom(startXYendXY: number[]): void;
2961
3050
  dragForCenterButton(startXYendXY: number[]): void;
@@ -3046,7 +3135,7 @@ declare class Niivue {
3046
3135
  frac2mm(frac: vec3, volIdx?: number, isForceSliceMM?: boolean): vec4;
3047
3136
  screenXY2TextureFrac(x: number, y: number, i: number, restrict0to1?: boolean): vec3;
3048
3137
  canvasPos2frac(canvasPos: number[]): vec3;
3049
- scaleSlice(w: number, h: number, widthPadPixels?: number, heightPadPixels?: number): number[];
3138
+ scaleSlice(w: number, h: number, padPixelsWH?: [number, number], canvasWH?: [number, number]): number[];
3050
3139
  drawThumbnail(): void;
3051
3140
  drawLine(startXYendXY: number[], thickness?: number, lineColor?: number[]): void;
3052
3141
  draw3DLine(startXY: vec2, endXYZ: vec3, thickness?: number, lineColor?: number[]): void;
@@ -3067,4 +3156,4 @@ declare class Niivue {
3067
3156
  set gl(gl: WebGL2RenderingContext | null);
3068
3157
  }
3069
3158
 
3070
- 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 Volume, cmapper, ColorTables as colortables };
3159
+ 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 };