dicomweb-proxy
Version:
A proxy to translate between dicomweb and dimse
2 lines • 29.5 kB
JavaScript
;(self.webpackChunk=self.webpackChunk||[]).push([[4113],{74137:(e,n,t)=>{t.d(n,{Ay:()=>c,bY:()=>r,n7:()=>i,sh:()=>s});var o=t(59874);const{CodeScheme:a}=o.QX.Cornerstone3D,s={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"},i={ImagingMeasurementReport:"126000",ImageLibrary:"111028",ImagingMeasurements:"126010",MeasurementGroup:"125007",ImageLibraryGroup:"126200",TrackingUniqueIdentifier:"112040",TrackingIdentifier:"112039",Finding:"121071",FindingSite:"G-C0E3",FindingSiteSCT:"363698007"},r={SRT:"SRT",SCT:"SCT",CornerstoneCodeSchemes:[a.CodingSchemeDesignator,"CST4"]},c={CodeNameCodeSequenceValues:i,CodingSchemeDesignators:r,RelationshipType:{INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},SCOORDTypes:s}},34113:(e,n,t)=>{t.r(n),t.d(n,{Enums:()=>d.Ay,createReferencedImageDisplaySet:()=>ge.A,default:()=>fe,hydrateStructuredReport:()=>Z,srProtocol:()=>k,toolNames:()=>m});var o=t(86326),a=t(62037),s=t(7241),i=t(59874),r=t(4667),c=t(15327),l=t(3823),d=t(74137);const u=1e-4,S=({GraphicData:e,ValueType:n,imageId:t})=>{const o=[];if("SCOORD3D"===n)for(let n=0;n<e.length;n+=3)o.push([e[n],e[n+1],e[n+2]]);else for(let n=0;n<e.length;n+=2){const a=c.utilities.imageToWorldCoords(t,[e[n],e[n+1]]);o.push(a)}return o};const g=function({GraphicType:e,GraphicData:n,ValueType:t,imageId:o}){let a=[];switch(e){case d.sh.POINT:case d.sh.MULTIPOINT:case d.sh.POLYLINE:a=S({GraphicData:n,ValueType:t,imageId:o});break;case d.sh.CIRCLE:{const e=S({GraphicData:n,ValueType:t,imageId:o}),s=e[0],i=e[1],r=l.eR.distance(s,i),d=c.metaData.get("imagePlaneModule",o);if(!d)throw new Error("No imagePlaneModule found");const{columnCosines:u,rowCosines:g}=d,m=l.eR.create();l.eR.scaleAndAdd(m,s,u,r);const p=l.eR.create();l.eR.scaleAndAdd(p,s,u,-r);const I=l.eR.create();l.eR.scaleAndAdd(I,s,g,r);const f=l.eR.create();l.eR.scaleAndAdd(f,s,g,-r),a=[m,p,I,f];break}case d.sh.ELLIPSE:{const e=S({GraphicData:n,ValueType:t,imageId:o}),s=l.eR.fromValues(...e[0]),i=l.eR.fromValues(...e[1]),r=l.eR.fromValues(...e[2]),d=l.eR.fromValues(...e[3]),g=l.eR.create();l.eR.sub(g,i,s),l.eR.normalize(g,g);const m=l.eR.create();l.eR.sub(m,d,r),l.eR.normalize(m,m);const p=c.metaData.get("imagePlaneModule",o);if(!p)throw new Error("imageId does not have imagePlaneModule metadata");const{columnCosines:I}=p,f=l.eR.fromValues(...I),h=Math.abs(l.eR.dot(f,g)),R=Math.abs(l.eR.dot(f,m)),C=Math.abs(h),D=Math.abs(R);a=[],Math.abs(C-1)<u?a=[e[0],e[1],e[2],e[3]]:Math.abs(D-1)<u?a=[e[2],e[3],e[0],e[1]]:console.warn("OBLIQUE ELLIPSE NOT YET SUPPORTED");break}default:console.warn("Unsupported GraphicType:",e)}return a},m={DICOMSRDisplay:"DICOMSRDisplay",SRLength:"SRLength",SRBidirectional:"SRBidirectional",SREllipticalROI:"SREllipticalROI",SRCircleROI:"SRCircleROI",SRArrowAnnotate:"SRArrowAnnotate",SRAngle:"SRAngle",SRCobbAngle:"SRCobbAngle",SRRectangleROI:"SRRectangleROI",SRPlanarFreehandROI:"SRPlanarFreehandROI",SRSCOORD3DPoint:"SRSCOORD3DPoint"};function p(e,n,t){let o=m.DICOMSRDisplay;const a=e.coords.reduce(((e,t)=>(e[t.GraphicType]=e[t.GraphicType]||[],e[t.GraphicType].push(g({...t,imageId:n})),e)),{}),{TrackingUniqueIdentifier:s}=e,{ValueType:i,GraphicType:l}=e.coords[0],d=a[l];let u=null;if(n){const e=c.metaData.get("imagePlaneModule",n);u=e?.frameOfReferenceUID}"SCOORD3D"===i&&(o=m.SRSCOORD3DPoint,u=e.coords[0].ReferencedFrameOfReferenceSequence);const S={annotationUID:s,highlighted:!1,isLocked:!1,invalidated:!1,metadata:{toolName:o,valueType:i,graphicType:l,FrameOfReferenceUID:u,referencedImageId:n},data:{label:e.labels?.[0]?.value||void 0,displayText:e.displayText||void 0,handles:{textBox:e.textBox??{},points:d[0]},cachedStats:{},frameNumber:t,renderableData:a,TrackingUniqueIdentifier:s,labels:e.labels}};r.annotation.state.addAnnotation(S),console.debug("Adding SR annotation:",S)}const{MeasurementReport:I}=i.QX.Cornerstone3D;const f=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-sr"}').UU,h="dicom-sr",R=`${f}.sopClassHandlerModule.${h}`,C="dicom-sr-3d",D=`${f}.sopClassHandlerModule.${C}`,{sopClassDictionary:T}=a.Wp,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:O,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:y}=s.Enums,{ImageSet:E,MetadataProvider:U}=a.Ly,{CodeScheme:w}=i.QX.Cornerstone3D,N=[T.BasicTextSR,T.EnhancedSR,T.ComprehensiveSR],b=(e,n)=>{n.forEach((n=>{if(n.StudyInstanceUID!==e)throw console.warn("Not all instances have the same UID",e,n),new Error(`Instances ${n.SOPInstanceUID} does not belong to ${e}`)}))};function M(e,n){return this.instances.push(...e),a.Wp.sortStudyInstances(this.instances),this.instance=this.instances[this.instances.length-1],this.isLoaded=!1,this}function v(e,n,t){if(!e||!e.length)throw new Error("No instances were provided");a.Wp.sortStudyInstances(e);const o=e[e.length-1],{StudyInstanceUID:s,SeriesInstanceUID:i,SOPInstanceUID:r,SeriesDescription:c,SeriesNumber:l,SeriesDate:u,SeriesTime:S,ConceptNameCodeSequence:g,SOPClassUID:m}=o;b(o.StudyInstanceUID,e);const p=m===T.Comprehensive3DSR,f=g?.CodeValue===d.n7.ImagingMeasurementReport,h={Modality:"SR",displaySetInstanceUID:a.Wp.guid(),SeriesDescription:c,SeriesNumber:l,SeriesDate:u,SeriesTime:S,SOPInstanceUID:r,SeriesInstanceUID:i,StudyInstanceUID:s,SOPClassHandlerId:p?D:R,SOPClassUID:m,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,isImagingMeasurementReport:f,sopClassUids:N,instance:o,addInstances:M};return h.load=()=>async function(e,n,t){const{displaySetService:o,measurementService:a}=n.services,s=t.getDataSources(),i=s[0],{ContentSequence:r}=e.instance;async function c(n,t=null,o=null){for(const a in n)if("object"==typeof n[a]&&null!==n[a])await c(n[a],n,a);else if(Array.isArray(n[a]))await Promise.all(n[a].map((e=>c(e,n,a))));else if("BulkDataURI"===a){const s=await i.retrieve.bulkDataURI({BulkDataURI:n[a],StudyInstanceUID:e.instance.StudyInstanceUID,SeriesInstanceUID:e.instance.SeriesInstanceUID,SOPInstanceUID:e.instance.SOPInstanceUID});t&&o&&(t[o]=new Float32Array(s))}}!0!==e.isLoaded&&await c(r);e.isImagingMeasurementReport?(e.referencedImages=function(e){const n=e.find((e=>e.ConceptNameCodeSequence.CodeValue===d.n7.ImageLibrary));if(!n)return[];const t=V(n.ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeValue===d.n7.ImageLibraryGroup));if(!t)return[];const o=[];return V(t.ContentSequence).forEach((e=>{const{ReferencedSOPSequence:n}=e;if(n)for(const e of V(n))if(e.ReferencedSOPClassUID){const{ReferencedSOPClassUID:n,ReferencedSOPInstanceUID:t}=e;o.push({ReferencedSOPClassUID:n,ReferencedSOPInstanceUID:t})}})),o}(r),e.measurements=function(e){const n=e.find((e=>e.ConceptNameCodeSequence.CodeValue===d.n7.ImagingMeasurements));if(!n)return[];const t=function(e){const n={};return e.forEach((e=>{const t=V(e.ContentSequence),o=t.find((e=>e.ConceptNameCodeSequence.CodeValue===d.n7.TrackingUniqueIdentifier));o||console.warn("No Tracking Unique Identifier, skipping ambiguous measurement.");const a=o.UID;void 0===n[a]?n[a]=[...t]:t.forEach((e=>{e.ConceptNameCodeSequence.CodeValue!==d.n7.TrackingUniqueIdentifier&&n[a].push(e)}))})),n}(V(n.ContentSequence).filter((e=>e.ConceptNameCodeSequence.CodeValue===d.n7.MeasurementGroup))),o=[];return Object.keys(t).forEach((e=>{const n=function(e){if(e.some((e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType)))return function(e){const n=e.find((e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType)),t=e.find((e=>"UIDREF"===e.ValueType)),o=e.find((e=>e.ConceptNameCodeSequence.CodeValue===d.n7.TrackingIdentifier));if(!n)return void console.warn(`graphic ValueType ${n.ValueType} not currently supported, skipping annotation.`);const a=e.filter((e=>"NUM"===e.ValueType)),s={loaded:!1,labels:[],coords:[A(n)],TrackingUniqueIdentifier:t.UID,TrackingIdentifier:o.TextValue};a.forEach((e=>{const{ConceptNameCodeSequence:n,MeasuredValueSequence:t}=e;t&&s.labels.push(L(n,t))}));const i=e.filter((e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===d.bY.SCT&&e.ConceptNameCodeSequence.CodeValue===d.n7.FindingSiteSCT));i.length&&s.labels.push({label:d.n7.FindingSiteSCT,value:i[0].ConceptCodeSequence.CodeMeaning});return s}(e);return function(e){const n=e.filter((e=>"NUM"===e.ValueType)),t=e.find((e=>"UIDREF"===e.ValueType)),o=e.find((e=>e.ConceptNameCodeSequence.CodeValue===d.n7.TrackingIdentifier)),a=e.find((e=>e.ConceptNameCodeSequence.CodeValue===d.n7.Finding)),s=e.filter((e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===d.bY.SRT&&e.ConceptNameCodeSequence.CodeValue===d.n7.FindingSite)),i={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:t.UID,TrackingIdentifier:o.TextValue};a&&d.bY.CornerstoneCodeSchemes.includes(a.ConceptCodeSequence.CodingSchemeDesignator)&&a.ConceptCodeSequence.CodeValue===w.codeValues.CORNERSTONEFREETEXT&&i.labels.push({label:w.codeValues.CORNERSTONEFREETEXT,value:a.ConceptCodeSequence.CodeMeaning});if(s.length){const e=s.find((e=>d.bY.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===w.codeValues.CORNERSTONEFREETEXT));e&&i.labels.push({label:w.codeValues.CORNERSTONEFREETEXT,value:e.ConceptCodeSequence.CodeMeaning})}return n.forEach((e=>{const{ConceptNameCodeSequence:n,ContentSequence:t,MeasuredValueSequence:o}=e,{ValueType:a}=t;if("SCOORD"===!a)return void console.warn(`Graphic ${a} not currently supported, skipping annotation.`);const s=A(t);s&&i.coords.push(s),o&&i.labels.push(L(n,o))})),i}(e)}(t[e]);n&&o.push(n)})),o}(r)):(e.referencedImages=[],e.measurements=[]);const l=a.getSourceMappings(O,y);e.isHydrated=!1,e.isRehydratable=function(e,n){if(!n||!n.length)return!1;const t=new Set;for(const e of n)t.add(e.annotationType);const{measurements:o}=e;for(let e=0;e<o.length;e++){const{TrackingIdentifier:n}=o[e]||{};if(!n){console.warn("No tracking identifier for measurement ",o[e]);continue}const a=I.getAdapterForTrackingIdentifier(n);if(a&&t.has(a.toolType))return!0;console.log("Measurement is not rehydratable",n,o[e])}return console.log("No measurements found which were rehydratable"),!1}(e,l),e.isLoaded=!0,o.activeDisplaySets.forEach((t=>{P(e,t,i,n)})),o.subscribe(o.EVENTS.DISPLAY_SETS_ADDED,(t=>{const{displaySetsAdded:o}=t;o.forEach((t=>{P(e,t,i,n)}))}))}(h,n,t),[h]}function P(e,n,t,o){const{customizationService:a}=o.services,s=e.measurements.filter((e=>!1===e.loaded));if(0===s.length||!(n instanceof E)||n.unsupported)return;const i=new Map,r=t.getImageIdsForDisplaySet(n);for(const e of r){const{SOPInstanceUID:n,frameNumber:t}=U.getUIDsFromImageID(e),o=`${n}:${t||1}`;i.set(o,e)}if(!s?.length)return;const c=e.SOPClassUID===T.Comprehensive3DSR;for(let t=s.length-1;t>=0;t--){let o=s[t];const r=a.getCustomization("onBeforeSRAddMeasurement");if("function"==typeof r&&(o=r({measurement:o,StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID})),c){p(o,null,null),o.loaded=!0;continue}const l=o.coords[0].ReferencedSOPSequence;if(!l)continue;const{ReferencedSOPInstanceUID:d}=l,u=l.ReferencedFrameNumber||1,S=`${d}:${u}`,g=i.get(S);g&&x(o,d,u)&&(p(o,g,u),o.loaded=!0,o.imageId=g,o.displaySetInstanceUID=n.displaySetInstanceUID,o.ReferencedSOPInstanceUID=d,o.frameNumber=u,s.splice(t,1))}}function x(e,n,t){const{coords:o}=e,a=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence?.ReferencedFrameNumber||1;if(t&&Number(t)!==Number(a))return!1;for(let e=0;e<o.length;e++){const t=o[e],{ReferencedSOPInstanceUID:a}=t.ReferencedSOPSequence;if(a===n)return!0}return!1}const A=e=>{const{ValueType:n,GraphicType:t,GraphicData:o}=e,a={ValueType:n,GraphicType:t,GraphicData:o};return a.ReferencedSOPSequence=e.ContentSequence?.ReferencedSOPSequence,a.ReferencedFrameOfReferenceSequence=e.ReferencedFrameOfReferenceUID||e.ContentSequence?.ReferencedFrameOfReferenceSequence,a};function L(e,n){const{CodeMeaning:t}=e,{NumericValue:o,MeasurementUnitsCodeSequence:a}=n,{CodeValue:s}=a;return{label:t,value:`${o?Number(o).toFixed(2):""} ${s}`}}function V(e){return e?Array.isArray(e)?e:[e]:[]}const F=function({servicesManager:e,extensionManager:n}){const t=t=>v(t,e,n);return[{name:h,sopClassUids:N,getDisplaySetsFromSeries:t},{name:C,sopClassUids:[T.Comprehensive3DSR],getDisplaySetsFromSeries:t}]},k={id:"@ohif/sr",name:"SR Key Images",protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{srDisplaySetId:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"SR"}}]}},stages:[{name:"SR Key Images",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId"}]}]}]};var q=t(2836),B=t(16076);var _=t(5842);const{log:G}=a.Ay;const $=function(e,n){const t={};function o(o,a){if(!o.metadata?.referencedImageId)return void G.warn(`[DICOMSR] No referencedImageId found for ${a} ${o.id}`);const s=o.metadata.referencedImageId;t[s]||(t[s]={});const i=t[s];i[a]||(i[a]={data:[]});const r=e.find((e=>e.uid===o.annotationUID)),c=i[a].data;let{finding:l}=r;const d=[];r.label&&(n.includes(a)?l={CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:r.label}:d.push({CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:r.label})),r.findingSites&&d.push(...r.findingSites);const u=Object.assign({},o,{finding:l,findingSites:d});c.push(u)}const a=e.map((e=>e.uid)).slice(),s=r.annotation.state.getAnnotationManager(),i=s.getFramesOfReference();for(let e=0;e<i.length;e++){const n=i[e],r=s.getAnnotations(n),c=Object.keys(r);for(let e=0;e<c.length;e++){const n=c[e],s=r[n];if(s)for(let e=0;e<s.length;e++){const i=s[e],r=a.findIndex((e=>e===i.annotationUID));if(-1!==r&&(o(i,n),a.splice(r,1),!a.length))return t}}}return t},{CodeScheme:W}=i.QX.Cornerstone3D;const{locking:H}=r.annotation,{guid:z}=a.Ay.utils,{MeasurementReport:X,CORNERSTONE_3D_TAG:j}=i.QX.Cornerstone3D,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:Y,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:Q}=s.Enums,J=(e,n)=>{if(!n||"CORNERSTONEJS"===n.CodingSchemeDesignator)return;const t=`${n.CodingSchemeDesignator}:${n.CodeValue}`;return{...e[t],ref:t,...n,text:n.CodeMeaning}},K=(e,n)=>{if(!n||!n.length)return;const t=[];for(let o=0;o<n.length;o++){const a=J(e,n[o][0]||n[o]);a&&t.push(a)}return t.length&&t||void 0};function Z({servicesManager:e,extensionManager:n,commandsManager:t},o){const s=n.getActiveDataSource()[0],{measurementService:i,displaySetService:r,customizationService:l}=e.services,d=l.getCustomization("codingValues"),u=l.getCustomization("panelMeasurement.disableEditing"),S=r.getDisplaySetByUID(o),g=i.getSourceMappings(Y,Q);if(!g||!g.length)throw new Error("Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.");const m=a.H8.getInstance(S.StudyInstanceUID,S.SeriesInstanceUID,S.SOPInstanceUID),p={},I={};S.measurements.forEach((e=>{const{ReferencedSOPInstanceUID:n,imageId:t,frameNumber:o}=e;p[n]||(p[n]=t,I[n]=[]),I[n][o]||(I[n][o]=t)}));const f=m;let h=X.generateToolState(f,p,c.utilities.imageToWorldCoords,c.metaData);const R=l.getCustomization("onBeforeSRHydration")?.value;"function"==typeof R&&(h=R({storedMeasurementByAnnotationType:h,displaySet:S}));const C=g.map((e=>e.annotationType)),D={};Object.keys(h).forEach((e=>{C.includes(e)&&(D[e]=h[e])}));const T=[];let O;Object.keys(D).forEach((e=>{D[e].forEach((e=>{const n=e.annotation.data&&e.annotation.data.frameNumber||1,t=I[e.sopInstanceUid][n]||p[e.sopInstanceUid];T.includes(t)||T.push(t)}))}));const y=[];for(let e=0;e<T.length;e++){const n=T[e],{SeriesInstanceUID:t,StudyInstanceUID:o}=c.metaData.get("instance",n);y.includes(t)||y.push(t),O?O!==o&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):O=o}return Object.keys(D).forEach((e=>{D[e].forEach((n=>{const o=n.annotation.data&&n.annotation.data.frameNumber||1,a=I[n.sopInstanceUid][o]||p[n.sopInstanceUid];n.uid=z();const r=c.metaData.get("instance",a),{FrameOfReferenceUID:l}=r,S={annotationUID:n.annotation.annotationUID,data:n.annotation.data,metadata:{toolName:e,referencedImageId:a,FrameOfReferenceUID:l}},m=i.getSource(Y,Q);S.data.label=function(e){const{findingSites:n=[],finding:t}=e;let o=n.find((e=>e.CodeValue===W.codeValues.CORNERSTONEFREETEXT));return o?o.CodeMeaning:t&&t.CodeValue===W.codeValues.CORNERSTONEFREETEXT?t.CodeMeaning:void 0}(n),S.data.finding=J(d,n.finding?.[0]),S.data.findingSites=K(d,n.findingSites),S.data.findingSites?.forEach((e=>{e.type&&(S.data[e.type]=e)}));const f=g.find((n=>n.annotationType===e)),h=i.addRawMeasurement(m,e,{annotation:S},f.toMeasurementSchema,s);t.runCommand("updateMeasurement",{uid:h,code:S.data.finding}),u&&H.setAnnotationLocked(h,!0),T.includes(a)||T.push(a)}))})),S.isHydrated=!0,{StudyInstanceUID:O,SeriesInstanceUIDs:y}}const{MeasurementReport:ee}=i.QX.Cornerstone3D,{log:ne}=a.Ay,te=(e,n,t={})=>{const o=$(e,n),a=ee.generateReport(o,c.metaData,c.utilities.worldToImageCoords,t),{dataset:s}=a;return void 0===s.SpecificCharacterSet&&(s.SpecificCharacterSet="ISO_IR 192"),s.InstanceNumber=t.InstanceNumber??1,s},oe=e=>{const{servicesManager:n,extensionManager:t,commandsManager:o}=e,{customizationService:s,viewportGridService:i,displaySetService:r}=n.services,c={changeColorMeasurement:({uid:e})=>{throw new Error("Unsupported operation: changeColorMeasurement")},downloadReport:({measurementData:e,additionalFindingTypes:n,options:t={}})=>{const o=te(e,n,t),a=_.Ay.data.datasetToBlob(o),s=URL.createObjectURL(a);window.location.assign(s)},storeMeasurements:async({measurementData:e,dataSource:n,additionalFindingTypes:t,options:o={}})=>{if(ne.info("[DICOMSR] storeMeasurements"),!n||!n.store||!n.store.dicom)return ne.error("[DICOMSR] datasource has no dataSource.store.dicom endpoint!"),Promise.reject({});try{const i=te(e,t,o),{StudyInstanceUID:r,ContentSequence:c}=i;if(!c?.[4].ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",i),new Error("Invalid report, no content");const l=s.getCustomization("onBeforeDicomStore");let d;return"function"==typeof l&&(d=l({dicomDict:d,measurementData:e,naturalizedReport:i})),await n.store.dicom(i,null,d),r&&n.deleteStudyMetadataPromise(r),a.H8.addInstances([i],!0),i}catch(e){throw console.warn(e),ne.error(`[DICOMSR] Error while saving the measurements: ${e.message}`),new Error(e.message||"Error while saving the measurements.")}},loadSRMeasurements:({displaySetInstanceUID:e})=>{const{SeriesInstanceUIDs:a}=Z({servicesManager:n,extensionManager:t,commandsManager:o},e),s=r.getDisplaySetsForSeries(a[0]);s.length&&o.run("setDisplaySetsForViewports",{viewportsToUpdate:[{viewportId:i.getActiveViewportId(),displaySetInstanceUIDs:[s[0].displaySetInstanceUID]}]})}};return{actions:c,definitions:{downloadReport:{commandFn:c.downloadReport},storeMeasurements:{commandFn:c.storeMeasurements},loadSRMeasurements:{commandFn:c.loadSRMeasurements}},defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};var ae=t(76654);class se extends r.AnnotationTool{constructor(e={},n={configuration:{}}){super(e,n),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,n)=>{const{viewport:t}=e,{element:o}=t;let a=r.annotation.state.getAnnotations(this.getToolName(),o);if(!a?.length)return;if(a=this.filterInteractableAnnotationsForElement(o,a),!a?.length)return;const s=(0,ae.eF)(o),{activeIndex:i,trackingUniqueIdentifiers:c}=s,l=c[i],u=a.filter((e=>c.includes(e.data?.TrackingUniqueIdentifier)));if(!t._actors?.size)return;const S={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},{style:g}=r.annotation.config;for(let e=0;e<u.length;e++){const o=u[e],a=o.annotationUID,{renderableData:s,TrackingUniqueIdentifier:i}=o.data,{referencedImageId:c}=o.metadata;S.annotationUID=a;const m=g.getToolGroupToolStyles(this.toolGroupId)[this.getToolName()],p=this.getStyle("lineWidth",S,o),I=this.getStyle("lineDash",S,o),f={color:i===l?"rgb(0, 255, 0)":this.getStyle("color",S,o),lineDash:I,lineWidth:p,...m};Object.keys(s).forEach((e=>{const i=s[e];let l,u;switch(e){case d.sh.POINT:l=this.renderPoint;break;case d.sh.MULTIPOINT:l=this.renderMultipoint;break;case d.sh.POLYLINE:l=this.renderPolyLine;break;case d.sh.CIRCLE:l=this.renderEllipse;break;case d.sh.ELLIPSE:l=this.renderEllipse,u=r.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const g=l(n,t,i,a,c,f);this.renderTextBox(n,t,g,u,o,S,f)}))}}}_getTextBoxLinesFromLabels(e){const n=Math.min(e.length,5),t=[];for(let o=0;o<n;o++){const n=e[o];t.push(`${re(n.label)}: ${n.value}`)}return t}renderPolyLine(e,n,t,o,a,s){const i={color:s.color,width:s.lineWidth,lineDash:s.lineDash};let c=[];return t.map(((t,a)=>{const s=t.map((e=>n.worldToCanvas(e))),l=`${a}`;2===s.length?r.drawing.drawLine(e,o,l,s[0],s[1],i):r.drawing.drawPolyline(e,o,l,s,i),c=c.concat(s)})),c}renderMultipoint(e,n,t,o,a,s){let i;t.map(((t,a)=>{i=t.map((e=>n.worldToCanvas(e)));r.drawing.drawHandles(e,o,"0",i,{color:s.color})}))}renderPoint(e,n,t,o,a,s){const i=[];return t.map(((t,l)=>{const d=t[0];if(i.push(n.worldToCanvas(d)),void 0!==t[1])i.push(n.worldToCanvas(t[1]));else{const e=c.metaData.get("imagePixelModule",a);let t=10,o=10;if(e){const{columns:n,rows:a}=e;t=n/10,o=a/10}const s=c.utilities.worldToImageCoords(a,d),r=c.utilities.imageToWorldCoords(a,[s[0]+t,s[1]+o]);i.push(n.worldToCanvas(r))}const u=`${l}`;r.drawing.drawArrow(e,o,u,i[1],i[0],{color:s.color,width:s.lineWidth})})),i}renderEllipse(e,n,t,o,a,s){let i;return t.map(((t,a)=>{if(0===t.length)return;const c=t,l=n.getRotation();let d;i=c.map((e=>n.worldToCanvas(e))),d=90==l||270==l?r.utilities.math.ellipse.getCanvasEllipseCorners([i[2],i[3],i[0],i[1]]):r.utilities.math.ellipse.getCanvasEllipseCorners(i);const u=`${a}`;r.drawing.drawEllipse(e,o,u,d[0],d[1],{color:s.color,width:s.lineWidth,lineDash:s.lineDash})})),i}renderTextBox(e,n,t,o,a,s,i={}){if(!t||!a)return;const{annotationUID:c,data:l={}}=a,{labels:d}=l,{color:u}=i;let S=t;"function"==typeof o&&(S=o(t));const g=this._getTextBoxLinesFromLabels(d),m=r.utilities.drawing.getTextBoxCoordsCanvas(S);a.data?.handles?.textBox?.worldPosition||(a.data.handles.textBox.worldPosition=n.canvasToWorld(m));const p=n.worldToCanvas(a.data.handles.textBox.worldPosition),I=this.getLinkedTextBoxStyle(s,a),f=r.drawing.drawLinkedTextBox(e,c,"1",g,p,t,{},{...I,color:u}),{x:h,y:R,width:C,height:D}=f;a.data.handles.textBox.worldBoundingBox={topLeft:n.canvasToWorld([h,R]),topRight:n.canvasToWorld([h+C,R]),bottomLeft:n.canvasToWorld([h,R+D]),bottomRight:n.canvasToWorld([h+C,R+D])}}}se.toolName=m.DICOMSRDisplay;const ie={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function re(e){const n=ie[e];return void 0!==n?n:e}class ce extends r.AnnotationDisplayTool{constructor(e={},n={configuration:{}}){super(e,n),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,n)=>{const{viewport:t}=e,{element:o}=t,a=r.annotation.state.getAnnotations(this.getToolName(),o);if(!a?.length)return;const s=a;if(!t._actors?.size)return;const i={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<s.length;e++){const o=s[e],a=o.annotationUID,{renderableData:c}=o.data,{POINT:l}=c;i.annotationUID=a;const d=this.getStyle("lineWidth",i,o),u=this.getStyle("lineDash",i,o),S={color:this.getStyle("color",i,o),lineDash:u,lineWidth:d},g=l[0][0];if(!t.isReferenceViewable({FrameOfReferenceUID:o.metadata.FrameOfReferenceUID,cameraFocalPoint:g},{asNearbyProjection:!0}))continue;const m=t.worldToCanvas(g),p=[m,[m[0]+20,m[1]+20]];r.drawing.drawArrow(n,a,"1",p[1],p[0],{color:S.color,width:S.lineWidth}),this.renderTextBox(n,t,p,o,i,S)}}}_getTextBoxLinesFromLabels(e){Math.min(e.length,5);return[]}renderTextBox(e,n,t,o,a,s={}){if(!t||!o)return;const{annotationUID:i,data:c={}}=o,{labels:l}=c,d=[];for(const e of l)"363698007"===e.label&&d.push(`Finding Site: ${e.value}`);const{color:u}=s,S=t,g=r.utilities.drawing.getTextBoxCoordsCanvas(S);o.data?.handles?.textBox?.worldPosition||(o.data.handles.textBox.worldPosition=n.canvasToWorld(g));const m=n.worldToCanvas(o.data.handles.textBox.worldPosition),p=this.getLinkedTextBoxStyle(a,o),I=r.drawing.drawLinkedTextBox(e,i,"1",d,m,t,{},{...p,color:u}),{x:f,y:h,width:R,height:C}=I;o.data.handles.textBox.worldBoundingBox={topLeft:n.canvasToWorld([f,h]),topRight:n.canvasToWorld([f+R,h]),bottomLeft:n.canvasToWorld([f,h+C]),bottomRight:n.canvasToWorld([f+R,h+C])}}getLinkedTextBoxStyle(e,n){return{visibility:this.getStyle("textBoxVisibility",e,n),fontFamily:this.getStyle("textBoxFontFamily",e,n),fontSize:this.getStyle("textBoxFontSize",e,n),color:this.getStyle("textBoxColor",e,n),shadow:this.getStyle("textBoxShadow",e,n),background:this.getStyle("textBoxBackground",e,n),lineWidth:this.getStyle("textBoxLinkLineWidth",e,n),lineDash:this.getStyle("textBoxLinkLineDash",e,n)}}}ce.toolName=m.SRSCOORD3DPoint;const le={toAnnotation:e=>{},toMeasurement:(e,n,t,o,a)=>{const{annotation:s}=e,{metadata:i,data:r,annotationUID:c}=s;if(!i||!r)return console.warn("Probe tool: Missing metadata or data"),null;const{toolName:l}=i,{points:d}=r.handles,u=function(e){const{data:n}=e;if(!n)return[""];const{labels:t}=n,o=[];for(const e of t)"33636980076"===e.label&&o.push(`Finding Site: ${e.value}`);return o}(s);return{uid:c,points:d,metadata:i,toolName:i.toolName,label:r.label,displayText:u,data:r.cachedStats,type:o?.(l)??null}}};function de(e,n,t={}){class o extends n{constructor(e,n){e.configuration=e.configuration?{...e.configuration,...t}:t,super(e,n)}}o.toolName=e,(0,r.addTool)(o)}const{CORNERSTONE_3D_TOOLS_SOURCE_NAME:ue,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:Se}=s.Enums;var ge=t(92643);function me(){return me=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var o in t)({}).hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e},me.apply(null,arguments)}const pe=o.lazy((()=>t.e(2701).then(t.bind(t,62701)))),Ie=e=>o.createElement(o.Suspense,{fallback:o.createElement("div",null,"Loading...")},o.createElement(pe,e)),fe={id:f,onModeEnter:function({servicesManager:e}){const{displaySetService:n,toolbarService:t}=e.services;[...n.getDisplaySetCache().values()].filter((e=>e.SOPClassHandlerId===R||e.SOPClassHandlerId===D)).forEach((e=>{e.isHydrated=!1})),t.addButtons([{id:"loadSRMeasurements",component:e=>o.createElement(q.N8H,e,B.A.t("Common:LOAD")),props:{commands:["clearMeasurements","loadSRMeasurements"]}}]),t.createButtonSection("loadSRMeasurements",["loadSRMeasurements"])},preRegistration:function({configuration:e={},servicesManager:n}){const{measurementService:t,cornerstoneViewportService:o}=n.services;de(m.DICOMSRDisplay,se),de(m.SRLength,r.LengthTool),de(m.SRBidirectional,r.BidirectionalTool),de(m.SREllipticalROI,r.EllipticalROITool),de(m.SRCircleROI,r.CircleROITool),de(m.SRArrowAnnotate,r.ArrowAnnotateTool),de(m.SRAngle,r.AngleTool),de(m.SRPlanarFreehandROI,r.PlanarFreehandROITool),de(m.SRRectangleROI,r.RectangleROITool),de(m.SRSCOORD3DPoint,ce),de(m.SRCobbAngle,r.CobbAngleTool);const a=t.getSource(ue,Se),{POINT:s}=t.VALUE_TYPES;t.addMapping(a,"SRSCOORD3DPoint",s,le.toAnnotation,le.toMeasurement);const i={lineDash:"4,4"};r.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{[m.DICOMSRDisplay]:i,SRLength:i,SRBidirectional:i,SREllipticalROI:i,SRCircleROI:i,SRArrowAnnotate:i,SRCobbAngle:i,SRAngle:i,SRPlanarFreehandROI:i,SRRectangleROI:i,global:{}})},getViewportModule:({servicesManager:e,extensionManager:n})=>[{name:"dicom-sr",component:t=>o.createElement(Ie,me({servicesManager:e,extensionManager:n},t))}],getCommandsModule:oe,getSopClassHandlerModule:F,getUtilityModule:({servicesManager:e})=>[{name:"tools",exports:{toolNames:m}}]}},76654:(e,n,t)=>{t.d(n,{eF:()=>i,m1:()=>s});var o=t(15327);const a={TrackingUniqueIdentifier:null,trackingIdentifiersByViewportId:{}};function s(e,n,t=0){const s=(0,o.getEnabledElement)(e),{viewport:i}=s;a.trackingIdentifiersByViewportId[i.id]={trackingUniqueIdentifiers:n,activeIndex:t}}function i(e){const n=(0,o.getEnabledElement)(e),{viewport:t}=n;return a.trackingIdentifiersByViewportId[t.id]?a.trackingIdentifiersByViewportId[t.id]:{trackingUniqueIdentifiers:[]}}},92643:(e,n,t)=>{t.d(n,{A:()=>i});const o=t(62037).Ly.ImageSet,a=(e,n)=>{const{displaySetInstanceUID:t,ReferencedSOPInstanceUID:o}=e,a=n.getDisplaySetByUID(t);if(a.images)return a.images.find((e=>e.SOPInstanceUID===o))},s=(e,n)=>{const t=[],o={};for(const s of n.measurements){const{imageId:n}=s;if(!n)continue;if(o[n])continue;const i=a(s,e);i?(o[n]=i,t.push(i)):console.log("Measurement",s,"had no instances found")}return t},i=(e,n)=>{const t=s(e,n),a=new o(t),i=t[0];if(i)return a.setAttributes({displaySetInstanceUID:a.uid,SeriesDate:i.SeriesDate,SeriesTime:i.SeriesTime,SeriesInstanceUID:a.uid,StudyInstanceUID:i.StudyInstanceUID,SeriesNumber:i.SeriesNumber||0,SOPClassUID:i.SOPClassUID,SeriesDescription:`${n.SeriesDescription} KO ${n.instance.SeriesNumber}`,Modality:"KO",isMultiFrame:!1,numImageFrames:t.length,SOPClassHandlerId:"@ohif/extension-default.sopClassHandlerModule.stack",isReconstructable:!1,isCompositeStack:!0,madeInClient:!0,excludeFromThumbnailBrowser:!0,updateInstances:function(){this.images.splice(0,this.images.length,...s(e,n)),this.numImageFrames=this.images.length}}),e.addDisplaySets(a),a}}}]);
//# sourceMappingURL=4113.bundle.f43ed66e4c44c72f31a3.js.map