ami.js
Version:
<p align="center"> <img src="https://cloud.githubusercontent.com/assets/214063/23213764/78ade038-f90c-11e6-8208-4fcade5f3832.png" width="60%"> </p>
163 lines (142 loc) • 4.37 kB
JavaScript
/* globals dat, AMI*/
// Setup renderer
var container = document.getElementById('container');
var renderer = new THREE.WebGLRenderer({
antialias: true
});
renderer.setSize(container.offsetWidth, container.offsetHeight);
renderer.setClearColor(0x353535, 1);
renderer.setPixelRatio(window.devicePixelRatio);
container.appendChild(renderer.domElement);
// Setup scene
var scene = new THREE.Scene();
// Setup camera
var camera = new THREE.PerspectiveCamera(45, container.offsetWidth / container.offsetHeight, 0.01, 10000000);
camera.position.x = 150;
camera.position.y = 150;
camera.position.z = 100;
// Setup controls
var controls = new AMI.TrackballControl(camera, container);
/**
* Handle window resize
*/
function onWindowResize() {
camera.aspect = container.offsetWidth / container.offsetHeight;
camera.updateProjectionMatrix();
renderer.setSize(container.offsetWidth, container.offsetHeight);
}
window.addEventListener('resize', onWindowResize, false);
/**
* Build GUI
*/
function gui(stackHelper) {
var stack = stackHelper.stack;
var gui = new dat.GUI({
autoPlace: false,
});
var customContainer = document.getElementById('my-gui-container');
customContainer.appendChild(gui.domElement);
// stack
var stackFolder = gui.addFolder('Stack');
// index range depends on stackHelper orientation.
var index = stackFolder
.add(stackHelper, 'index', 0, stack.dimensionsIJK.z - 1)
.step(1)
.listen();
var orientation = stackFolder
.add(stackHelper, 'orientation', 0, 2)
.step(1)
.listen();
orientation.onChange(function(value) {
index.__max = stackHelper.orientationMaxIndex;
// center index
stackHelper.index = Math.floor(index.__max / 2);
});
stackFolder.open();
// slice
var sliceFolder = gui.addFolder('Slice');
sliceFolder
.add(stackHelper.slice, 'windowWidth', 1, stack.minMax[1] - stack.minMax[0])
.step(1)
.listen();
sliceFolder
.add(stackHelper.slice, 'windowCenter', stack.minMax[0], stack.minMax[1])
.step(1)
.listen();
sliceFolder.add(stackHelper.slice, 'intensityAuto').listen();
sliceFolder.add(stackHelper.slice, 'invert');
sliceFolder.open();
// bbox
var bboxFolder = gui.addFolder('Bounding Box');
bboxFolder.add(stackHelper.bbox, 'visible');
bboxFolder.addColor(stackHelper.bbox, 'color');
bboxFolder.open();
// border
var borderFolder = gui.addFolder('Border');
borderFolder.add(stackHelper.border, 'visible');
borderFolder.addColor(stackHelper.border, 'color');
borderFolder.open();
}
/**
* Start animation loop
*/
function animate() {
controls.update();
renderer.render(scene, camera);
// request new frame
requestAnimationFrame(function() {
animate();
});
}
animate();
// Setup loader
var loader = new AMI.VolumeLoader(container);
var t2 = [
'36444280',
'36444294',
'36444308',
'36444322',
'36444336',
'36444350',
'36444364',
'36444378',
'36444392',
'36444406',
'36444434',
'36444448',
'36444462',
'36444476',
'36444490',
'36444504',
'36444518',
'36444532',
'36746856'
];
var files = t2.map(function(v) {
return 'https://cdn.rawgit.com/FNNDSC/data/master/dicom/adi_brain/' + v;
});
loader
.load(files)
.then(function() {
// merge files into clean series/stack/frame structure
var series = loader.data[0].mergeSeries(loader.data);
var stack = series[0].stack[0];
loader.free();
loader = null;
// be carefull that series and target stack exist!
var stackHelper = new AMI.StackHelper(stack);
stackHelper.bbox.color = 0x8bc34a;
stackHelper.border.color = 0xf44336;
scene.add(stackHelper);
// build the gui
gui(stackHelper);
// center camera and interactor to center of bouding box
var centerLPS = stackHelper.stack.worldCenter();
camera.lookAt(centerLPS.x, centerLPS.y, centerLPS.z);
camera.updateProjectionMatrix();
controls.target.set(centerLPS.x, centerLPS.y, centerLPS.z);
})
.catch(function(error) {
window.console.log('oops... something went wrong...');
window.console.log(error);
});