@niivue/niivue 0.26.2 → 0.28.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/dist/niivue.es.js +111 -26
- package/dist/niivue.umd.js +35 -35
- package/package.json +2 -2
- package/src/indexMM.html +1 -1
- package/src/indexOrient.html +215 -0
- package/src/niivue.js +410 -166
- package/src/orientCube.js +64 -0
- package/src/shader-srcs.js +52 -41
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@niivue/niivue",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.28.0",
|
|
4
4
|
"description": "minimal webgl2 nifti image viewer",
|
|
5
5
|
"main": "./src/niivue.js",
|
|
6
6
|
"unpkg": "./dist/niivue.umd.js",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"copy-test": "cp ./dist/niivue.umd.js ./tests/niivue.umd.js",
|
|
21
21
|
"copy-test-win": "copy .\\dist\\niivue.umd.js .\\tests\\niivue.umd.js",
|
|
22
22
|
"copy-demo": "cp -r ./dist/* ./demos/features/",
|
|
23
|
-
"copy-demo-win": "copy .\\dist\\niivue.umd.js .\\demos\\niivue.umd.js",
|
|
23
|
+
"copy-demo-win": "copy .\\dist\\niivue.umd.js .\\demos\\features\\niivue.umd.js",
|
|
24
24
|
"test": "npm run build && jest --maxWorkers=1",
|
|
25
25
|
"test-win": "npm run build-win && jest --maxWorkers=1",
|
|
26
26
|
"docs": "npx jsdoc --readme ./README.md -d devdocs -t ./node_modules/clean-jsdoc-theme/ src/",
|
package/src/indexMM.html
CHANGED
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
<label for="check5">Ruler</label>
|
|
54
54
|
<input type="checkbox" id="check6" name="check6" unchecked>
|
|
55
55
|
<label for="check6">Nose left</label>
|
|
56
|
-
<input type="checkbox" id="check7" name="check7"
|
|
56
|
+
<input type="checkbox" id="check7" name="check7" unchecked>
|
|
57
57
|
<label for="check7">Colorbar</label>
|
|
58
58
|
<input type="checkbox" id="check8" name="check8" checked>
|
|
59
59
|
<label for="check8">Negative colors</label>
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
7
|
+
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
|
8
|
+
<title>NiiVue</title>
|
|
9
|
+
</head>
|
|
10
|
+
|
|
11
|
+
<body style="font-family: sans-serif; margin:0;">
|
|
12
|
+
<div style="background-color:rgb(16, 0, 32);
|
|
13
|
+
padding:4px;">
|
|
14
|
+
<h1 style="color:rgb(255, 255, 255); margin:2px;">
|
|
15
|
+
hot reloadable development preview
|
|
16
|
+
</h1>
|
|
17
|
+
</div>
|
|
18
|
+
<div id="app" style="padding:10px;">
|
|
19
|
+
<noscript>
|
|
20
|
+
<strong>niivue doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
|
21
|
+
</noscript>
|
|
22
|
+
<section>
|
|
23
|
+
<div class="slidecontainer">
|
|
24
|
+
X Pan <input type="range" min="-30" max="30" value="0" class="slider" id="xSlider">
|
|
25
|
+
</div>
|
|
26
|
+
<div class="slidecontainer">
|
|
27
|
+
Y Pan <input type="range" min="-30" max="30" value="0" class="slider" id="ySlider">
|
|
28
|
+
</div>
|
|
29
|
+
<div class="slidecontainer">
|
|
30
|
+
Z Pan <input type="range" min="-30" max="30" value="0" class="slider" id="zSlider">
|
|
31
|
+
</div>
|
|
32
|
+
<div class="slidecontainer">
|
|
33
|
+
Zoom <input type="range" min="1" max="40" value="10" class="slider" id="zoomSlider">
|
|
34
|
+
</div>
|
|
35
|
+
<div class="slidecontainer">
|
|
36
|
+
Mesh Visibility <input type="range" min="0" max="11" value="11" class="slider" id="dxSlider">
|
|
37
|
+
</div>
|
|
38
|
+
<div class="slidecontainer">
|
|
39
|
+
gamma <input type="range" min="1" max="20" value="10" class="slider" id="gamma">
|
|
40
|
+
</div>
|
|
41
|
+
<input type="checkbox" id="check1" name="check1" unchecked>
|
|
42
|
+
<label for="check1">Radiological</label>
|
|
43
|
+
<input type="checkbox" id="check2" name="check2" unchecked>
|
|
44
|
+
<label for="check2">Corner text</label>
|
|
45
|
+
<input type="checkbox" id="check3" name="check3" checked>
|
|
46
|
+
<label for="check3">World space</label>
|
|
47
|
+
<input type="checkbox" id="check4" name="check4" unchecked>
|
|
48
|
+
<label for="check4">Drag measurement</label>
|
|
49
|
+
<input type="checkbox" id="check5" name="check5" unchecked>
|
|
50
|
+
<label for="check5">Ruler</label>
|
|
51
|
+
<input type="checkbox" id="check6" name="check6" unchecked>
|
|
52
|
+
<label for="check6">Nose left</label>
|
|
53
|
+
<input type="checkbox" id="check7" name="check7" unchecked>
|
|
54
|
+
<label for="check7">Colorbar</label>
|
|
55
|
+
<input type="checkbox" id="check8" name="check8" checked>
|
|
56
|
+
<label for="check8">Cube</label>
|
|
57
|
+
<input type="checkbox" id="check9" name="check9" unchecked>
|
|
58
|
+
<label for="check9">Pad</label>
|
|
59
|
+
<input type="checkbox" id="check10" name="check10" checked>
|
|
60
|
+
<label for="check10">HighDPI</label>
|
|
61
|
+
</section>
|
|
62
|
+
<!-- demo 1 -->
|
|
63
|
+
<section>
|
|
64
|
+
<div id="demo1" style="width:98%; height:640px;">
|
|
65
|
+
<canvas id="gl1" height=640 width=480>
|
|
66
|
+
</canvas>
|
|
67
|
+
</div>
|
|
68
|
+
</section>
|
|
69
|
+
|
|
70
|
+
<section>
|
|
71
|
+
<p id="location"></p>
|
|
72
|
+
</section>
|
|
73
|
+
|
|
74
|
+
<!-- <script type="module" src="./index.js">
|
|
75
|
+
</script> -->
|
|
76
|
+
<script type="module" async>
|
|
77
|
+
var slider = document.getElementById("gamma");
|
|
78
|
+
slider.oninput = function() {
|
|
79
|
+
nv1.setGamma(0.1 * this.value)
|
|
80
|
+
}
|
|
81
|
+
function doSlider() {
|
|
82
|
+
var sx = document.getElementById("xSlider");
|
|
83
|
+
var sy = document.getElementById("ySlider");
|
|
84
|
+
var sz =document.getElementById("zSlider");
|
|
85
|
+
var szoom =document.getElementById("zoomSlider");
|
|
86
|
+
|
|
87
|
+
nv1.setPan2Dxyzmm([parseInt(sx.value),parseInt(sy.value), parseInt(sz.value), 0.1 * parseInt(szoom.value)])
|
|
88
|
+
}
|
|
89
|
+
var xslider = document.getElementById("xSlider");
|
|
90
|
+
xslider.oninput = function() {
|
|
91
|
+
doSlider()
|
|
92
|
+
}
|
|
93
|
+
var yslider = document.getElementById("ySlider");
|
|
94
|
+
yslider.oninput = function() {
|
|
95
|
+
doSlider()
|
|
96
|
+
}
|
|
97
|
+
var zslider = document.getElementById("zSlider");
|
|
98
|
+
zslider.oninput = function() {
|
|
99
|
+
doSlider()
|
|
100
|
+
}
|
|
101
|
+
var zoomslider = document.getElementById("zoomSlider");
|
|
102
|
+
zoomslider.oninput = function() {
|
|
103
|
+
doSlider()
|
|
104
|
+
}
|
|
105
|
+
var dxslider = document.getElementById("dxSlider");
|
|
106
|
+
dxslider.oninput = function() {
|
|
107
|
+
let dx = parseFloat(this.value);
|
|
108
|
+
if (dx > 10)
|
|
109
|
+
dx = Infinity;
|
|
110
|
+
nv1.setMeshThicknessOn2D(dx);
|
|
111
|
+
}
|
|
112
|
+
document.getElementById("check1").addEventListener("change", doCheckClick);
|
|
113
|
+
function doCheckClick() {
|
|
114
|
+
nv1.setRadiologicalConvention(this.checked);
|
|
115
|
+
}
|
|
116
|
+
document.getElementById("check2").addEventListener("change", doCheck2Click);
|
|
117
|
+
function doCheck2Click() {
|
|
118
|
+
nv1.setCornerOrientationText(this.checked);
|
|
119
|
+
}
|
|
120
|
+
document.getElementById("check3").addEventListener("change", doCheck3Click);
|
|
121
|
+
function doCheck3Click() {
|
|
122
|
+
nv1.setSliceMM(this.checked);
|
|
123
|
+
}
|
|
124
|
+
document.getElementById("check4").addEventListener("change", doCheck4Click);
|
|
125
|
+
function doCheck4Click() {
|
|
126
|
+
nv1.opts.isDragShowsMeasurementTool = this.checked;
|
|
127
|
+
}
|
|
128
|
+
document.getElementById("check5").addEventListener("change", doCheck5Click);
|
|
129
|
+
function doCheck5Click() {
|
|
130
|
+
nv1.opts.isRuler = this.checked;
|
|
131
|
+
nv1.drawScene();
|
|
132
|
+
}
|
|
133
|
+
document.getElementById("check6").addEventListener("change", doCheck6Click);
|
|
134
|
+
function doCheck6Click() {
|
|
135
|
+
nv1.opts.sagittalNoseLeft = this.checked;
|
|
136
|
+
nv1.drawScene();
|
|
137
|
+
}
|
|
138
|
+
document.getElementById("check7").addEventListener("change", doCheck7Click);
|
|
139
|
+
function doCheck7Click() {
|
|
140
|
+
nv1.opts.isColorbar = this.checked;
|
|
141
|
+
nv1.drawScene();
|
|
142
|
+
}
|
|
143
|
+
document.getElementById("check8").addEventListener("change", doCheck8Click);
|
|
144
|
+
function doCheck8Click() {
|
|
145
|
+
nv1.opts.isOrientCube = this.checked;
|
|
146
|
+
nv1.drawScene();
|
|
147
|
+
}
|
|
148
|
+
document.getElementById("check9").addEventListener("change", doCheck9Click);
|
|
149
|
+
function doCheck9Click() {
|
|
150
|
+
let pad = 0;
|
|
151
|
+
if (this.checked) pad = 5;
|
|
152
|
+
nv1.opts.multiplanarPadPixels = pad;
|
|
153
|
+
nv1.drawScene();
|
|
154
|
+
}
|
|
155
|
+
document.getElementById("check10").addEventListener("change", doCheck10Click);
|
|
156
|
+
function doCheck10Click() {
|
|
157
|
+
nv1.setHighResolutionCapable(this.checked);
|
|
158
|
+
}
|
|
159
|
+
import { Niivue } from './niivue.js'
|
|
160
|
+
import {NVImage} from './nvimage.js'
|
|
161
|
+
import {NVMesh} from './nvmesh.js'
|
|
162
|
+
let query = window.location.search
|
|
163
|
+
const params = new URLSearchParams(query);
|
|
164
|
+
let url = params.get('url')
|
|
165
|
+
var volumeList1 = [
|
|
166
|
+
{
|
|
167
|
+
url: url ? url : "../demos/images/mni152.nii.gz",//"./AIL.nii.gz",//"./images/RAS.nii.gz", "./images/spm152.nii.gz",
|
|
168
|
+
colorMap: "gray",
|
|
169
|
+
opacity: 1,
|
|
170
|
+
visible: true,
|
|
171
|
+
},
|
|
172
|
+
]
|
|
173
|
+
var nv1 = new Niivue({
|
|
174
|
+
logging: false,
|
|
175
|
+
show3Dcrosshair: true,
|
|
176
|
+
loadingText: 'there are no images',
|
|
177
|
+
dragAndDropEnabled: true,
|
|
178
|
+
backColor: [1, 1, 1, 1],
|
|
179
|
+
//thumbnail: "../demos/images/DoG.png"
|
|
180
|
+
})
|
|
181
|
+
nv1.setRadiologicalConvention(false)
|
|
182
|
+
nv1.setSliceMM(true)
|
|
183
|
+
nv1.attachTo('gl1')
|
|
184
|
+
nv1.setHighResolutionCapable(true);
|
|
185
|
+
nv1.setSliceType(nv1.sliceTypeAxial)
|
|
186
|
+
//nv1.setSliceType(nv1.sliceTypeRender)
|
|
187
|
+
nv1.setMeshShader('Outline')
|
|
188
|
+
nv1.setClipPlane([-0.1, 270, 0])
|
|
189
|
+
nv1.setRenderAzimuthElevation(120,40)
|
|
190
|
+
nv1.opts.isOrientCube = true;
|
|
191
|
+
//nv1.opts.isOrientCube = true;
|
|
192
|
+
await nv1.loadVolumes(volumeList1)
|
|
193
|
+
await nv1.loadMeshes([{url: "../demos/images/BrainMesh_ICBM152.lh.mz3", rgba255 : [222, 200, 255, 255]}])
|
|
194
|
+
//nv1.setMeshShader("Depth")
|
|
195
|
+
// example of using the 'location' change event with a callback function
|
|
196
|
+
nv1.on('location', (data) => {
|
|
197
|
+
// data is an object with properties: {mm: [N N N], vox: [N N N], frac: [N N N]}
|
|
198
|
+
document.getElementById('location').innerHTML = 'voxel location: ' + data.vox + ' ' + data.values
|
|
199
|
+
})
|
|
200
|
+
nv1.on('imageLoaded', (image) => {
|
|
201
|
+
console.log('imageLoaded', image.name)
|
|
202
|
+
})
|
|
203
|
+
|
|
204
|
+
nv1.on('intensityRange', (image) => {
|
|
205
|
+
console.log(image.cal_min, image.cal_max)
|
|
206
|
+
})
|
|
207
|
+
|
|
208
|
+
setTimeout(() => {
|
|
209
|
+
//nv1.saveImage('test.nii.gz')
|
|
210
|
+
}, 2000)
|
|
211
|
+
</script>
|
|
212
|
+
</div>
|
|
213
|
+
</body>
|
|
214
|
+
|
|
215
|
+
</html>
|