You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2 lines
12 KiB
2 lines
12 KiB
document.addEventListener("DOMContentLoaded",onDOMContentLoaded);let _app=null,_tools=null;const _mode=0,_dicomWeb=!1;function viewerSetup(){let e;dwv.logger.level=dwv.logger.levels.WARN,dwv.decoderScripts.jpeg2000="./decoders/pdfjs/decode-jpeg2000.js",dwv.decoderScripts["jpeg-lossless"]="./decoders/rii-mango/decode-jpegloss.js",dwv.decoderScripts["jpeg-baseline"]="./decoders/pdfjs/decode-jpegbaseline.js",dwv.decoderScripts.rle="./decoders/dwv/decode-rle.js";let t=!0;0===_mode?e=prepareAndGetSimpleDataViewConfig():1===_mode?(t=!1,e=prepareAndGetMPRDataViewConfig()):2===_mode?(addLayerGroup("layerGroupA"),addLayerGroup("layerGroupB"),e={0:[{divId:"layerGroupA"}],1:[{divId:"layerGroupB"}]}):3===_mode&&(addLayerGroup("layerGroupA"),addLayerGroup("layerGroupB"),e={0:[{divId:"layerGroupA"},{divId:"layerGroupB"}],1:[{divId:"layerGroupA"}],2:[{divId:"layerGroupB"}],3:[{divId:"layerGroupB"}]}),_tools={Scroll:{},WindowLevel:{},ZoomAndPan:{},Opacity:{},Draw:{options:["Rectangle"]}};const n=new dwv.AppOptions(e);n.tools=_tools,n.viewOnFirstLoadItem=t,_app=new dwv.App,_app.init(n),_app.addEventListener("loaderror",(function(e){console.error("load error",e)})),_app.addEventListener("loadstart",(function(e){console.time("load-data-"+e.loadid)}));const o=new Array(1),a=function(e,t){return e+t};_app.addEventListener("loadprogress",(function(e){void 0!==e.lengthComputable&&e.lengthComputable&&(o[e.loadid]=Math.ceil(e.loaded/e.total*100),document.getElementById("loadprogress").value=o.reduce(a)/1)})),_app.addEventListener("load",(function(e){t||_app.render(e.loadid)})),_app.addEventListener("loaditem",(function(e){void 0!==e.warn&&console.warn("load-warn",e.warn)})),_app.addEventListener("loadend",(function(e){console.timeEnd("load-data-"+e.loadid)}));let d=0;const l=[];_app.addEventListener("loadend",(function(e){if(!l.includes(e.loadid)&&(l.push(e.dataid),"image"===e.loadtype&&(console.log("metadata",getMetaDataWithNames(_app.getMetaData(e.loadid))),addDataRow(e.loadid),++d,1===d))){_app.setTool(getSelectedTool());document.getElementById("changelayout").disabled=!1;document.getElementById("resetlayout").disabled=!1}if("image"===e.loadtype&&void 0!==_app.getMetaData(e.loadid)["00080060"]&&"SEG"===_app.getMetaData(e.loadid)["00080060"].value[0]){logFramePosPats(_app.getMetaData(e.loadid));if(!1){const t=0,n=_app.getViewLayersByDataIndex(t)[0].getViewController(),o=_app.getImage(t).getGeometry(),a=o.getSize().getDimSize(2),d=_app.getImage(e.loadid),l=d.getGeometry().getOrigins()[0],i=new dwv.Point([l.getX(),l.getY(),l.getZ()]),r=o.worldToIndex(i).get(2)*a;n.setViewAlphaFunction((function(e,t){const n=3*(t-r);return n>=0&&0===d.getValueAtOffset(n)&&0===d.getValueAtOffset(n+1)&&0===d.getValueAtOffset(n+2)?0:255}))}}})),_app.addEventListener("positionchange",(function(e){const t=document.getElementById("position"),n=e.value[1];let o="(index: "+e.value[0]+")";e.value.length>2&&(o+=" value: "+e.value[2]),t.value=n.map(getPrecisionRound(2));document.getElementById("positionspan").innerHTML=o})),window.addEventListener("keydown",(function(e){if(_app.defaultOnKeydown(e),!isNaN(parseInt(e.key,10))){const t=_app.getActiveLayerGroup().getActiveViewLayer().getViewController();if(!t.isMask())return;const n=parseInt(e.key,10),o=t.getMaskSegmentHelper();if(o.hasSegment(n)){const a=o.getSegment(n);e.ctrlKey&&(e.altKey?(console.log("Delete segment: "+a.label),t.deleteSegment(n,_app.addToUndoStack)):(console.log("Show/hide segment: "+a.label),o.isHidden(n)?o.removeFromHidden(n):o.addToHidden(n),t.applyHiddenSegments()))}}})),window.addEventListener("resize",(function(){_app.onResize()}));const i={};_dicomWeb&&(i.requestHeaders=[{name:"Accept",value:'multipart/related; type="application/dicom"; transfer-syntax=*'}]),_app.loadFromUri(window.location.href,i)}function onDOMContentLoaded(){viewerSetup();document.getElementById("position").addEventListener("change",(function(){const e=_app.getViewLayersByDataIndex(0)[0].getViewController(),t=this.value.split(",");e.setCurrentPosition(new dwv.Point([parseFloat(t[0]),parseFloat(t[1]),parseFloat(t[2])]))}));document.getElementById("resetlayout").addEventListener("click",(function(){_app.resetLayout()}));document.getElementById("changelayout").addEventListener("change",(function(e){let t;t="mpr"===e.target.value?prepareAndGetMPRDataViewConfig():prepareAndGetSimpleDataViewConfig(),unbindAppToControls(),_app.setDataViewConfigs(t),clearDataTable();for(let e=0;e<_app.getNumberOfLoadedData();++e)_app.render(e),addDataRow(e);_app.setTool(getSelectedTool())})),setupBindersCheckboxes(),setupToolsCheckboxes();document.getElementById("fileinput").addEventListener("change",(function(e){console.log("%c ----------------","color: teal;"),console.log(e.target.files),_app.loadFiles(e.target.files)}))}function addLayerGroup(e){const t=document.createElement("div");t.id=e,t.className="layerGroup";document.getElementById("dwv").appendChild(t)}function prepareAndGetSimpleDataViewConfig(){return document.getElementById("dwv").innerHTML="",addLayerGroup("layerGroupA"),{"*":[{divId:"layerGroupA"}]}}function prepareAndGetMPRDataViewConfig(){return document.getElementById("dwv").innerHTML="",addLayerGroup("layerGroupA"),addLayerGroup("layerGroupC"),addLayerGroup("layerGroupS"),{"*":[{divId:"layerGroupA",orientation:"axial"},{divId:"layerGroupC",orientation:"coronal"},{divId:"layerGroupS",orientation:"sagittal"}]}}function getLayerGroupDivIds(e){const t=[],n=Object.keys(e);for(let o=0;o<n.length;++o){const a=e[n[o]];for(let e=0;e<a.length;++e){const n=a[e].divId;t.includes(n)||t.push(n)}}return t}function getDataLayerGroupIds(e){const t=[];for(let n=0;n<e.length;++n)t.push(e[n].divId);return t}function setupBindersCheckboxes(){const e=document.getElementById("binders"),t=["WindowLevel","Position","Zoom","Offset","Opacity"],n=[];for(let e=0;e<t.length;++e)n.push(t[e]+"Binder");function o(e){return function(t){t.target.checked?function(e){n.push(e+"Binder"),_app.setLayerGroupsBinders(n)}(e):function(e){const t=n.indexOf(e+"Binder");-1!==t&&n.splice(t,1),_app.setLayerGroupsBinders(n)}(e)}}_app.setLayerGroupsBinders(n);for(let n=0;n<t.length;++n){const a=t[n],d=document.createElement("input");d.id="binder-"+n,d.type="checkbox",d.checked=!0,d.onchange=o(a);const l=document.createElement("label");l.htmlFor=d.id,l.appendChild(document.createTextNode(a)),e.appendChild(d),e.appendChild(l)}const a=document.createElement("input");a.id="binder-all",a.type="checkbox",a.checked=!0,a.onchange=function(){for(let e=0;e<t.length;++e)document.getElementById("binder-"+e).click()};const d=document.createElement("label");d.htmlFor=a.id,d.appendChild(document.createTextNode("all")),e.appendChild(a),e.appendChild(d)}function setupToolsCheckboxes(){const e=document.getElementById("tools"),t=Object.keys(_tools),n=function(e){return function(){_app.setTool(e),"Draw"===e&&_app.setToolFeatures({shapeName:"Rectangle"})}},o=function(e,t){return function(n){n.ctrlKey||n.altKey||n.shiftKey||n.key!==e||t.click()}};for(let a=0;a<t.length;++a){const d=t[a],l=document.createElement("input");l.id="tool-"+a,l.name="tools",l.type="radio",l.onchange=n(d),"Scroll"===d&&(l.checked=!0);const i=document.createElement("label");i.htmlFor=l.id,i.appendChild(document.createTextNode(d)),e.appendChild(l),e.appendChild(i),window.addEventListener("keydown",o(d[0].toLowerCase(),l))}}function getSelectedTool(){const e=document.getElementsByName("tools");let t=null;for(let n=0;n<e.length;++n)if(e[n].checked){t=n;break}return Object.keys(_tools)[t]}function bindAppToControls(){_app.addEventListener("wlchange",onWLChange),_app.addEventListener("opacitychange",onOpacityChange)}function unbindAppToControls(){_app.removeEventListener("wlchange",onWLChange),_app.removeEventListener("opacitychange",onOpacityChange)}function onWLChange(e){let t="width-"+e.dataid+"-number",n=document.getElementById(t);n?n.value=e.value[1]:console.warn("wl change: HTML not ready?"),t="width-"+e.dataid+"-range",n=document.getElementById(t),n&&(n.value=e.value[1]),t="center-"+e.dataid+"-number",n=document.getElementById(t),n&&(n.value=e.value[0]),t="center-"+e.dataid+"-range",n=document.getElementById(t),n&&(n.value=e.value[0])}function onOpacityChange(e){const t=parseFloat(e.value[0]).toPrecision(3);let n="opacity-"+e.dataid+"-number",o=document.getElementById(n);o?o.value=t:console.warn("opacity change: HTML not ready?"),n="opacity-"+e.dataid+"-range",o=document.getElementById(n),o&&(o.value=t)}function clearDataTable(){document.getElementById("layersdetails").innerHTML=""}function getControlDiv(e,t,n,o,a,d,l){const i=document.createElement("input");i.id=e+"-range",i.className="ctrl-range",i.type="range",i.min=n.toPrecision(l),i.max=o.toPrecision(l),i.step=(.01*(o-n)).toPrecision(l),i.value=a;const r=document.createElement("label");r.id=e+"-label",r.className="ctrl-label",r.htmlFor=i.id,r.appendChild(document.createTextNode(t));const c=document.createElement("input");c.id=e+"-number",c.className="ctrl-number",c.type="number",c.min=i.min,c.max=i.max,c.step=i.step,c.value=parseFloat(a).toPrecision(l),c.oninput=function(){i.value=this.value,d(this.value)},i.oninput=function(){c.value=parseFloat(this.value).toPrecision(l),d(this.value)};const p=document.createElement("div");return p.id=e+"-ctrl",p.className="ctrl",p.appendChild(r),p.appendChild(i),p.appendChild(c),p}function addDataRow(e){0===e&&bindAppToControls();const t=_app.getDataViewConfigs(),n=getLayerGroupDivIds(t),o=_app.getViewLayersByDataIndex(e),a=o[0],d=a.getViewController(),l=d.getWindowLevel();let i,r=document.getElementById("layerstable");if(r)i=r.getElementsByTagName("tbody")[0];else{r=document.createElement("table"),r.id="layerstable";const e=r.createTHead().insertRow(0),t=function(t){const n=document.createElement("th");n.innerHTML=t,e.appendChild(n)};t("Id");for(let e=0;e<n.length;++e)t("LG"+e);t("Alpha Range"),t("Contrast"),t("Alpha"),i=r.createTBody();document.getElementById("layersdetails").appendChild(r)}const c=i.insertRow();let p;p=c.insertCell(),p.appendChild(document.createTextNode(e));let s=t[e];void 0===s&&(s=t["*"]);const u=getDataLayerGroupIds(s);for(let t=0;t<n.length;++t){const o=n[t];if(p=c.insertCell(),!u.includes(o))continue;const a=document.createElement("input");a.type="radio",a.name="layerselect-"+t,a.id="layerselect-"+o+"-"+e,a.checked=!0,a.onchange=function(e){const t=e.target.id.split("-"),n=t[1],o=t[2];_app.getLayerGroupByDivId(n).setActiveViewLayerByDataIndex(parseInt(o,10))},p.appendChild(a)}const m=_app.getImage(a.getDataIndex()),g=m.getDataRange(),y=m.getRescaledDataRange();p=c.insertCell();const v="value-min-"+e,h="value-max-"+e,f=function(){const e=parseFloat(document.getElementById(v+"-number").value),t=parseFloat(document.getElementById(h+"-number").value),n=function(n){return n>=e&&n<=t?255:0};for(let e=0;e<o.length;++e)o[e].getViewController().setViewAlphaFunction(n)};p.appendChild(getControlDiv(v,"min",g.min,g.max,g.min,f,4)),p.appendChild(getControlDiv(h,"max",g.min,g.max,g.max,f,4)),p=c.insertCell();const w="width-"+e,C="center-"+e,E=function(){const e=parseFloat(document.getElementById(w+"-number").value),t=parseFloat(document.getElementById(C+"-number").value);d.setWindowLevel(t,e)};p.appendChild(getControlDiv(w,"width",0,y.max-y.min,l.width,E,4)),p.appendChild(getControlDiv(C,"center",y.min,y.max,l.center,E,4)),p=c.insertCell();const L="opacity-"+e;p.appendChild(getControlDiv(L,"opacity",0,1,a.getOpacity(),(function(e){a.setOpacity(e),a.draw()}),4))}function comparePosPat(e,t){return parseFloat(e.split("\\").at(-1))-parseFloat(t.split("\\").at(-1))}function sortByPosPatKey(e){const t=Object.keys(e);t.sort(comparePosPat);const n=new Map;for(let o=0;o<t.length;o++){const a=t[o];n.set(a,e[a])}return n}function getPrecisionRound(e){return function(t){return dwv.precisionRound(t,e)}}function logFramePosPats(e){const t=e[52009230].value,n={};for(let e=0;e<t.length;++e){const o=t[e]["00209113"].value[0]["00200032"].value;void 0===n[o]&&(n[o]=[]);const a=t[e]["00209111"].value[0]["00209157"].value;n[o].push(a)}console.log("DICOM SEG Segments",sortByPosPatKey(n))}function getMetaDataWithNames(e){let t=e;return void 0!==t["00020010"]&&(t=Object.keys(t).reduce(((e,n)=>{const o=dwv.getTagFromKey(n);let a=o.getNameFromDictionary();return void 0===a&&(a="x"+o.getKey()),e[a]=t[n],e}),{})),t}
|