Improvements for dicom-html-extension
This commit is contained in:
parent
af20f5f3e3
commit
2868b08a4a
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ohif-dicom-html-extension",
|
"name": "ohif-dicom-html-extension",
|
||||||
"version": "0.0.1",
|
"version": "0.0.2",
|
||||||
"description": "OHIF extension for rendering structured reports to HTML",
|
"description": "OHIF extension for rendering structured reports to HTML",
|
||||||
"author": "OHIF",
|
"author": "OHIF",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
|||||||
@ -0,0 +1,11 @@
|
|||||||
|
:root {
|
||||||
|
--text-color-primary: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.DicomHtmlViewport {
|
||||||
|
padding: 20px;
|
||||||
|
overflow-y: scroll;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
color: var(--text-color-primary);
|
||||||
|
}
|
||||||
@ -1,33 +1,148 @@
|
|||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import * as dcmjs from 'dcmjs';
|
import * as dcmjs from 'dcmjs';
|
||||||
import TypedArrayProp from './TypedArrayProp';
|
import TypedArrayProp from './TypedArrayProp';
|
||||||
|
import './DicomHtmlViewport.css';
|
||||||
|
|
||||||
|
function getRelationshipString(data) {
|
||||||
|
switch (data.RelationshipType) {
|
||||||
|
case 'HAS CONCEPT MOD':
|
||||||
|
return 'Concept modifier: ';
|
||||||
|
case 'HAS OBS CONTEXT':
|
||||||
|
return 'Observation context: ';
|
||||||
|
default:
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const getMeaningString = data => {
|
||||||
|
if (data.ConceptNameCodeSequence) {
|
||||||
|
const { CodeMeaning } = data.ConceptNameCodeSequence;
|
||||||
|
|
||||||
|
return `${CodeMeaning} = `;
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
};
|
||||||
|
|
||||||
|
function getValueString(data) {
|
||||||
|
switch (data.ValueType) {
|
||||||
|
case 'CODE':
|
||||||
|
const {
|
||||||
|
CodeMeaning,
|
||||||
|
CodeValue,
|
||||||
|
CodingSchemeDesignator
|
||||||
|
} = data.ConceptNameCodeSequence;
|
||||||
|
|
||||||
|
return `${CodeMeaning} (${CodeValue}, ${CodingSchemeDesignator})`;
|
||||||
|
|
||||||
|
case 'PNAME':
|
||||||
|
return data.PersonName;
|
||||||
|
|
||||||
|
case 'TEXT':
|
||||||
|
return data.TextValue;
|
||||||
|
|
||||||
|
case 'UIDREF':
|
||||||
|
return data.UID;
|
||||||
|
|
||||||
|
case 'NUM':
|
||||||
|
const { MeasuredValueSequence } = data;
|
||||||
|
const numValue = MeasuredValueSequence.NumericValue;
|
||||||
|
const codeValue =
|
||||||
|
MeasuredValueSequence.MeasurementUnitsCodeSequence.CodeValue;
|
||||||
|
return `${numValue} ${codeValue}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function constructPlainValue(data) {
|
||||||
|
const value = getValueString(data);
|
||||||
|
|
||||||
|
if (value) {
|
||||||
|
return getRelationshipString(data) + getMeaningString(data) + value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function constructContentSequence(data, header) {
|
||||||
|
if (!data.ContentSequence) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const items = data.ContentSequence.map(item => parseContent(item)).filter(
|
||||||
|
item => item
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!items.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = {
|
||||||
|
items
|
||||||
|
};
|
||||||
|
|
||||||
|
if (header) {
|
||||||
|
result.header = header;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseContent(data) {
|
||||||
|
if (data.ValueType) {
|
||||||
|
if (data.ValueType === 'CONTAINER') {
|
||||||
|
const header = data.ConceptNameCodeSequence.CodeMeaning;
|
||||||
|
|
||||||
|
return constructContentSequence(data, header);
|
||||||
|
}
|
||||||
|
|
||||||
|
return constructPlainValue(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.ContentSequence) {
|
||||||
|
return constructContentSequence(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const { DicomMetaDictionary, DicomMessage } = dcmjs.data;
|
const { DicomMetaDictionary, DicomMessage } = dcmjs.data;
|
||||||
|
|
||||||
function getMainData(dataset) {
|
function getMainData(data) {
|
||||||
const root = [];
|
const root = [];
|
||||||
const {
|
|
||||||
CompletionFlag,
|
|
||||||
VerificationFlag,
|
|
||||||
Manufacturer,
|
|
||||||
ContentDateTime
|
|
||||||
} = dataset;
|
|
||||||
|
|
||||||
if (CompletionFlag) {
|
const patientValue = `${data.PatientName} (${data.PatientSex}, #${
|
||||||
root.push(getMainDataItem('Completion flag', CompletionFlag));
|
data.PatientID
|
||||||
|
})`;
|
||||||
|
root.push(getMainDataItem('Patient', patientValue));
|
||||||
|
|
||||||
|
const studyValue = data.StudyDescription;
|
||||||
|
root.push(getMainDataItem('Study', studyValue));
|
||||||
|
|
||||||
|
const seriesValue = `${data.SeriesDescription} (#${data.SeriesNumber})`;
|
||||||
|
root.push(getMainDataItem('Series', seriesValue));
|
||||||
|
|
||||||
|
const manufacturerValue = `${data.Manufacturer} (${
|
||||||
|
data.ManufacturerModelName
|
||||||
|
}, #${data.DeviceSerialNumber})`;
|
||||||
|
|
||||||
|
root.push(getMainDataItem('Manufacturer', manufacturerValue));
|
||||||
|
|
||||||
|
const mainDataObjects = {
|
||||||
|
CompletionFlag: 'Completion flag',
|
||||||
|
VerificationFlag: 'Verification flag'
|
||||||
|
};
|
||||||
|
|
||||||
|
Object.keys(mainDataObjects).forEach(key => {
|
||||||
|
if (!data[key]) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (VerificationFlag) {
|
const item = getMainDataItem(mainDataObjects[key], data[key]);
|
||||||
root.push(getMainDataItem('Verification flag', VerificationFlag));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Manufacturer) {
|
root.push(item);
|
||||||
root.push(getMainDataItem('Manufacturer', Manufacturer));
|
});
|
||||||
}
|
|
||||||
|
|
||||||
if (ContentDateTime) {
|
// TODO: Format these dates
|
||||||
root.push(getMainDataItem('Content Date/Time', ContentDateTime));
|
const contentDateTimeValue = `${data.ContentDate} ${data.ContentTime}`;
|
||||||
}
|
root.push(getMainDataItem('Content Date/Time', contentDateTimeValue));
|
||||||
|
|
||||||
|
root.push();
|
||||||
|
|
||||||
return <div>{root}</div>;
|
return <div>{root}</div>;
|
||||||
}
|
}
|
||||||
@ -100,11 +215,8 @@ class DicomHtmlViewport extends Component {
|
|||||||
const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);
|
const dataset = DicomMetaDictionary.naturalizeDataset(dicomData.dict);
|
||||||
dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);
|
dataset._meta = DicomMetaDictionary.namifyDataset(dicomData.meta);
|
||||||
|
|
||||||
// TODO: not sure why this stuff was separated from the rest...
|
|
||||||
const mainData = getMainData(dataset);
|
const mainData = getMainData(dataset);
|
||||||
const contentSequence = getContentSequence(dataset.ContentSequence);
|
const contentSequence = getContentSequence(dataset);
|
||||||
|
|
||||||
debugger;
|
|
||||||
const content = (
|
const content = (
|
||||||
<>
|
<>
|
||||||
{mainData}
|
{mainData}
|
||||||
@ -118,9 +230,8 @@ class DicomHtmlViewport extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const style = { width: '100%', height: '100%', 'overflow-y': 'scroll' };
|
|
||||||
return (
|
return (
|
||||||
<div className={'DicomHtmlViewport'} style={style}>
|
<div className={'DicomHtmlViewport'}>
|
||||||
{this.state.content}
|
{this.state.content}
|
||||||
{this.state.error && <h2>{JSON.stringify(this.state.error)}</h2>}
|
{this.state.error && <h2>{JSON.stringify(this.state.error)}</h2>}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -105,7 +105,7 @@
|
|||||||
"lodash.isequal": "^4.5.0",
|
"lodash.isequal": "^4.5.0",
|
||||||
"ohif-core": "^0.2.7",
|
"ohif-core": "^0.2.7",
|
||||||
"ohif-cornerstone-extension": "^0.0.6",
|
"ohif-cornerstone-extension": "^0.0.6",
|
||||||
"ohif-dicom-html-extension": "^0.0.1",
|
"ohif-dicom-html-extension": "^0.0.2",
|
||||||
"ohif-dicom-microscopy-extension": "^0.0.5",
|
"ohif-dicom-microscopy-extension": "^0.0.5",
|
||||||
"ohif-dicom-pdf-extension": "^0.0.5",
|
"ohif-dicom-pdf-extension": "^0.0.5",
|
||||||
"oidc-client": "^1.6.1",
|
"oidc-client": "^1.6.1",
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user