dicomweb-proxy
Version:
A proxy to translate between dicomweb and dimse
2 lines • 9.95 kB
JavaScript
;(self.webpackChunk=self.webpackChunk||[]).push([[7197],{96975:(e,t,n)=>{n.r(t),n.d(t,{default:()=>O});const a=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-seg"}').UU,o=`${a}.sopClassHandlerModule.dicom-seg`;var s=n(86326),r=n(62037),i=n(15327),c=n(4667),d=n(59874),l=n(5842);const g=["1.2.840.10008.5.1.4.1.1.66.4"],m={};function S(e,t,n){const a=e[0],{StudyInstanceUID:s,SeriesInstanceUID:S,SOPInstanceUID:p,SeriesDescription:u,SeriesNumber:I,SeriesDate:y,SOPClassUID:D,wadoRoot:f,wadoUri:v,wadoUriRoot:w}=a,b={Modality:"SEG",loading:!1,isReconstructable:!0,displaySetInstanceUID:r.Wp.guid(),SeriesDescription:u,SeriesNumber:I,SeriesDate:y,SOPInstanceUID:p,SeriesInstanceUID:S,StudyInstanceUID:s,SOPClassHandlerId:o,SOPClassUID:D,referencedImages:null,referencedSeriesInstanceUID:null,referencedDisplaySetInstanceUID:null,isDerivedDisplaySet:!0,isLoaded:!1,isHydrated:!1,segments:{},sopClassUids:g,instance:a,instances:[a],wadoRoot:f,wadoUriRoot:w,wadoUri:v,isOverlayDisplaySet:!0},h=a.ReferencedSeriesSequence;if(!h)return void console.error("ReferencedSeriesSequence is missing for the SEG");const T=h[0]||h;b.referencedImages=a.ReferencedSeriesSequence.ReferencedInstanceSequence,b.referencedSeriesInstanceUID=T.SeriesInstanceUID;const{displaySetService:M}=t.services,U=M.getDisplaySetsForSeries(b.referencedSeriesInstanceUID)[0];if(U)b.referencedDisplaySetInstanceUID=U.displaySetInstanceUID;else{const{unsubscribe:e}=M.subscribe(M.EVENTS.DISPLAY_SETS_ADDED,(({displaySetsAdded:t})=>{const n=t[0];n.SeriesInstanceUID===b.referencedSeriesInstanceUID&&(b.referencedDisplaySetInstanceUID=n.displaySetInstanceUID,e())}))}return b.load=async({headers:e})=>await function(e,t,n,a){const{SOPInstanceUID:o}=e,{segmentationService:s}=t.services;if((e.loading||e.isLoaded)&&m[o]&&function(e){return c.segmentation.state.getSegmentation(e.displaySetInstanceUID)}(e))return m[o];return e.loading=!0,m[o]=new Promise((async(o,r)=>{if(!e.segments||0===Object.keys(e.segments).length)try{await async function({extensionManager:e,servicesManager:t,segDisplaySet:n,headers:a}){const o=e.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common"),{segmentationService:s,uiNotificationService:r}=t.services,{dicomLoaderService:g}=o.exports,m=await g.findDicomDataPromise(n,null,a),S=t.services.displaySetService.getDisplaySetByUID(n.referencedDisplaySetInstanceUID);if(!S)throw new Error("referencedDisplaySet is missing for SEG");let{imageIds:p}=S;if(!p){const{images:e}=S;p=e.map((e=>e.imageId))}const u=.001;i.eventTarget.addEventListener(d.fX.s.SEGMENTATION_LOAD_PROGRESS,(e=>{const{percentComplete:t}=e.detail;s._broadcastEvent(s.EVENTS.SEGMENT_LOADING_COMPLETE,{percentComplete:t})}));const I=await d.ql.Cornerstone3D.Segmentation.createFromDICOMSegBuffer(p,m,{metadataProvider:i.metaData,tolerance:u});let y=!0;I.segMetadata.data.forEach(((e,t)=>{var n;t>0&&(e.rgba=e.RecommendedDisplayCIELabValue,e.rgba?e.rgba=(n=e.rgba,l.Ay.data.Colors.dicomlab2RGB(n).map((e=>Math.round(255*e)))):(y=!1,e.rgba=c.CONSTANTS.COLOR_LUT[t%c.CONSTANTS.COLOR_LUT.length]))})),y||r.show({title:"DICOM SEG import",message:"RecommendedDisplayCIELabValue not found for one or more segments. The default color was used instead.",type:"warning",duration:5e3});Object.assign(n,I)}({extensionManager:n,servicesManager:t,segDisplaySet:e,headers:a})}catch(t){return e.loading=!1,r(t)}s.createSegmentationForSEGDisplaySet(e).then((()=>{e.loading=!1,o()})).catch((t=>{e.loading=!1,r(t)}))})),m[o]}(b,t,n,e),[b]}const p=function({servicesManager:e,extensionManager:t}){return[{name:"dicom-seg",sopClassUids:g,getDisplaySetsFromSeries:n=>S(n,e,t)}]},u={id:"@ohif/seg",name:"Segmentations",protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0,syncGroups:[{type:"hydrateseg",id:"sameFORId",source:!0,target:!0}]},displaySets:[{id:"segDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{segDisplaySetId:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"SEG"}}]}},stages:[{name:"Segmentations",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{allowUnmatchedView:!0,syncGroups:[{type:"hydrateseg",id:"sameFORId",source:!0,target:!0}]},displaySets:[{id:"segDisplaySetId"}]}]}]};const I=function(){return[{name:u.id,protocol:u}]};var y=n(43984),D=n(96357);const{datasetToBlob:f}=l.Ay.data,{Cornerstone3D:{Segmentation:{generateSegmentation:v}}}=d.ql,{Cornerstone3D:{RTSS:{generateRTSSFromSegmentations:w}}}=d.f_,{vk:b}=d._$,h=({servicesManager:e,extensionManager:t})=>{const{segmentationService:n,displaySetService:a,viewportGridService:o,toolGroupService:s}=e.services,d={loadSegmentationsForViewport:async({segmentations:e,viewportId:t})=>{const s=(({viewportId:e,viewportGridService:t})=>{const{viewports:n,activeViewportId:a}=t.getState(),o=e||a;return n.get(o)})({viewportId:t,viewportGridService:o}),r=s.displaySetInstanceUIDs[0],i=e[0],c=i.segmentationId,d=i.config.label,l=i.config.segments,g=a.getDisplaySetByUID(r);return await n.createLabelmapForDisplaySet(g,{segmentationId:c,segments:l,label:d}),n.addOrUpdateSegmentation(i),await n.addSegmentationRepresentation(s.viewportId,{segmentationId:c}),c},generateSegmentation:({segmentationId:e,options:t={}})=>{const a=c.segmentation.state.getSegmentation(e),{imageIds:o}=a.representationData.Labelmap,s=o.map((e=>i.cache.getImage(e))),r=s.map((e=>i.cache.getImage(e.referencedImageId))),d=[];let g=0;for(const e of s){const t=new Set,n=e.getPixelData(),{rows:a,columns:o}=e;for(let e=0;e<n.length;e++){const a=n[e];0!==a&&t.add(a)}d[g++]={segmentsOnLabelmap:Array.from(t),pixelData:n,rows:a,columns:o}}const m=d.map((e=>e.segmentsOnLabelmap)),S={segmentsOnLabelmap:Array.from(new Set(m.flat())),metadata:[],labelmaps2D:d},p=n.getSegmentation(e),u=n.getRepresentationsForSegmentation(e);Object.entries(p.segments).forEach((([t,a])=>{if(!a)return;const{label:o}=a,s=u[0],r=n.getSegmentColor(s.viewportId,e,a.segmentIndex),i=l.Ay.data.Colors.rgb2DICOMLAB(r.slice(0,3).map((e=>e/255))).map((e=>Math.round(e))),c={SegmentNumber:t.toString(),SegmentLabel:o,SegmentAlgorithmType:a?.algorithmType||"MANUAL",SegmentAlgorithmName:a?.algorithmName||"OHIF Brush",RecommendedDisplayCIELabValue:i,SegmentedPropertyCategoryCodeSequence:{CodeValue:"T-D0050",CodingSchemeDesignator:"SRT",CodeMeaning:"Tissue"},SegmentedPropertyTypeCodeSequence:{CodeValue:"T-D0050",CodingSchemeDesignator:"SRT",CodeMeaning:"Tissue"}};S.metadata[t]=c}));return v(r,S,i.metaData,t)},downloadSegmentation:({segmentationId:e})=>{const t=n.getSegmentation(e),a=d.generateSegmentation({segmentationId:e});b(a.dataset,`${t.label}`)},storeSegmentation:async({segmentationId:a,dataSource:o})=>{const s=n.getSegmentation(a);if(!s)throw new Error("No segmentation found");const{label:i}=s,c=o??t.getActiveDataSource(),{value:l,dataSourceName:g,action:m}=await(0,y.createReportDialogPrompt)({servicesManager:e,extensionManager:t,title:"Store Segmentation"});if(m===D.A.CREATE_REPORT)try{const e=g?t.getDataSources(g)[0]:c,n=d.generateSegmentation({segmentationId:a,options:{SeriesDescription:l||i||"Research Derived Series"}});if(!n||!n.dataset)throw new Error("Error during segmentation generation");const{dataset:o}=n;return await e.store.dicom(o),o.wadoRoot=e.getConfig().wadoRoot,r.H8.addInstances([o],!0),o}catch(e){throw console.debug("Error storing segmentation:",e),e}},downloadRTSS:async({segmentationId:e})=>{const t=n.getSegmentation(e),a=n.getRepresentationsForSegmentation(e)[0];Object.entries(t.segments).forEach((([t,o])=>{o.color=n.getSegmentColor(a.viewportId,e,t)}));const o=await w(t,r.Ly.MetadataProvider,r.H8);try{const e=f(o),t=URL.createObjectURL(e);window.location.assign(t)}catch(e){console.warn(e)}}},g={loadSegmentationsForViewport:{commandFn:d.loadSegmentationsForViewport},generateSegmentation:{commandFn:d.generateSegmentation},downloadSegmentation:{commandFn:d.downloadSegmentation},storeSegmentation:{commandFn:d.storeSegmentation},downloadRTSS:{commandFn:d.downloadRTSS}};return{actions:d,definitions:g,defaultContext:"SEGMENTATION"}};function T(){return T=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)({}).hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},T.apply(null,arguments)}const M=s.lazy((()=>Promise.all([n.e(8185),n.e(7241),n.e(4526)]).then(n.bind(n,58295)))),U=e=>s.createElement(s.Suspense,{fallback:s.createElement("div",null,"Loading...")},s.createElement(M,e)),O={id:a,getCommandsModule:h,getToolbarModule:function({servicesManager:e}){const{segmentationService:t,toolbarService:n,toolGroupService:a}=e.services;return[{name:"evaluate.cornerstone.hasSegmentation",evaluate:({viewportId:e})=>{const n=t.getSegmentationRepresentations(e);return{disabled:!n?.length}}},{name:"evaluate.cornerstone.segmentation",evaluate:({viewportId:e,button:o,toolNames:s,disabledText:r})=>{const i=t.getSegmentationRepresentations(e);if(!i?.length)return{disabled:!0,disabledText:r??"No segmentations available"};const c=t.getActiveSegmentation(e);if(!Object.keys(c.segments).length)return{disabled:!0,disabledText:"Add segment to enable this tool"};const d=a.getToolGroupForViewport(e);if(!d)return{disabled:!0,disabledText:r??"Not available on the current viewport"};if(!s)return{disabled:!1};const l=n.getToolNameForButton(o);if(!d.hasTool(l)&&!s)return{disabled:!0,disabledText:r??"Not available on the current viewport"};return{disabled:!1,isActive:s?s.includes(d.getActivePrimaryMouseButtonTool()):d.getActivePrimaryMouseButtonTool()===l}}}]},getViewportModule:({servicesManager:e,extensionManager:t,commandsManager:n})=>[{name:"dicom-seg",component:a=>s.createElement(U,T({servicesManager:e,extensionManager:t,commandsManager:n},a))}],getSopClassHandlerModule:p,getHangingProtocolModule:I}}}]);
//# sourceMappingURL=7197.bundle.0c83e9e420f3f5ff7122.js.map