ohif-viewer/extensions/dicom-microscopy/src/DicomMicroscopyViewport.js

104 lines
2.7 KiB
JavaScript
Raw Normal View History

2019-04-16 18:00:06 +02:00
import React, { Component } from 'react';
import ReactResizeDetector from 'react-resize-detector';
2019-04-16 18:00:06 +02:00
import { api } from 'dicom-microscopy-viewer';
import debounce from 'lodash.debounce';
2019-04-16 18:00:06 +02:00
const microscopyViewer = api.VLWholeSlideMicroscopyImageViewer;
class DicomMicroscopyViewport extends Component {
state = {
2019-06-21 05:22:52 +02:00
error: null,
2019-04-16 18:00:06 +02:00
};
viewer = null;
2019-04-16 18:00:06 +02:00
constructor(props) {
super(props);
this.container = React.createRef();
this.debouncedResize = debounce(() => {
if (this.viewer) this.viewer.resize();
}, 100);
2019-04-16 18:00:06 +02:00
}
// install the microscopy renderer into the web page.
// you should only do this once.
installOpenLayersRenderer(container, displaySet) {
const dicomWebClient = displaySet.dicomWebClient;
const searchInstanceOptions = {
studyInstanceUID: displaySet.studyInstanceUid,
2019-06-21 05:22:52 +02:00
seriesInstanceUID: displaySet.seriesInstanceUid,
2019-04-16 18:00:06 +02:00
};
dicomWebClient
.searchForInstances(searchInstanceOptions)
.then(instances => {
const promises = [];
for (let i = 0; i < instances.length; i++) {
const sopInstanceUID = instances[i]['00080018']['Value'][0];
const retrieveInstanceOptions = {
studyInstanceUID: displaySet.studyInstanceUid,
seriesInstanceUID: displaySet.seriesInstanceUid,
2019-06-21 05:22:52 +02:00
sopInstanceUID,
2019-04-16 18:00:06 +02:00
};
const promise = dicomWebClient
.retrieveInstanceMetadata(retrieveInstanceOptions)
.then(metadata => {
const imageType = metadata[0]['00080008']['Value'];
if (imageType[2] === 'VOLUME') {
return metadata[0];
}
});
promises.push(promise);
}
return Promise.all(promises);
})
.then(metadata => {
metadata = metadata.filter(m => m);
this.viewer = new microscopyViewer({
2019-04-16 18:00:06 +02:00
client: dicomWebClient,
2019-06-21 05:22:52 +02:00
metadata,
retrieveRendered: false
2019-04-16 18:00:06 +02:00
});
this.viewer.render({ container });
2019-04-16 18:00:06 +02:00
});
}
componentDidMount() {
const { displaySet } = this.props.viewportData;
2019-04-16 18:00:06 +02:00
this.installOpenLayersRenderer(this.container.current, displaySet);
}
render() {
const style = { width: '100%', height: '100%' };
return (
<div className={'DicomMicroscopyViewer'} style={style}>
{ReactResizeDetector && (
<ReactResizeDetector
handleWidth
handleHeight
onResize={this.onWindowResize}
/>
)}
2019-04-16 18:00:06 +02:00
{this.state.error ? (
<h2>{JSON.stringify(this.state.error)}</h2>
) : (
<div style={style} ref={this.container} />
)}
</div>
);
}
onWindowResize = () => {
this.debouncedResize();
};
2019-04-16 18:00:06 +02:00
}
export default DicomMicroscopyViewport;