@ohif/extension-cornerstone-dicom-sr 3.13.0-beta.7 → 3.13.0-beta.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  /*! For license information please see ohif-extension-cornerstone-dicom-sr.umd.js.LICENSE.txt */
2
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("@ohif/i18n"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/adapters"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("gl-matrix"),require("dcmjs"),require("@ohif/ui-next"),require("@ohif/core/src/contextProviders/SystemProvider")):"function"==typeof define&&define.amd?define(["@ohif/core","@ohif/i18n","@ohif/extension-cornerstone","@cornerstonejs/adapters","@cornerstonejs/tools","@cornerstonejs/core","gl-matrix","dcmjs","@ohif/ui-next","@ohif/core/src/contextProviders/SystemProvider"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-sr"]=t(require("@ohif/core"),require("@ohif/i18n"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/adapters"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("gl-matrix"),require("dcmjs"),require("@ohif/ui-next"),require("@ohif/core/src/contextProviders/SystemProvider")):e["ohif-extension-cornerstone-dicom-sr"]=t(e["@ohif/core"],e["@ohif/i18n"],e["@ohif/extension-cornerstone"],e["@cornerstonejs/adapters"],e["@cornerstonejs/tools"],e["@cornerstonejs/core"],e["gl-matrix"],e.dcmjs,e["@ohif/ui-next"],e["@ohif/core/src/contextProviders/SystemProvider"])}(globalThis,(e,t,n,r,o,a,s,i,c,l)=>(()=>{var u,d,f={525:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>O});var r=n(598),o=n.n(r),a=n(326),s=n(2),i=n(942),c=n(291),l=n(669),u=n(55),d=n(492);function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f.apply(null,arguments)}function p(e){const{servicesManager:t}=(0,d.useSystem)(),{children:n,dataSource:r,displaySets:o,viewportOptions:s}=e,{displaySetService:p}=t.services,m=s.viewportId;if(o.length>1)throw new Error("SR viewport should only have a single display set");const S=o[0],{setPositionPresentation:g}=(0,l.usePositionPresentationStore)(),[h,I]=(0,u.useViewportGrid)(),[y,C]=(0,a.useState)(0),[R,D]=(0,a.useState)(null),[O,T]=(0,a.useState)(null),[v,E]=(0,a.useState)(null),{viewports:b,activeViewportId:w}=h,N=(0,a.useCallback)(e=>{const{measurements:t}=S;(0,i.m1)(v,t.map(e=>e.TrackingUniqueIdentifier),e)},[v,y,S]),U=(0,a.useCallback)(e=>{const{StudyInstanceUID:t,displaySetInstanceUID:n}=S;t&&n&&async function(e,t,n){const{measurements:r}=e,o=r[t],{displaySetInstanceUID:a}=o;e.keyImageDisplaySet||(e.keyImageDisplaySet=(0,c.A)(n,e));if(!a)return{referencedDisplaySetMetadata:null,referencedDisplaySet:null};const s=n.getDisplaySetByUID(a);if(!s?.images)return{referencedDisplaySetMetadata:null,referencedDisplaySet:null};const i=s.images[0],l={PatientID:i.PatientID,PatientName:i.PatientName,PatientSex:i.PatientSex,PatientAge:i.PatientAge,SliceThickness:i.SliceThickness,StudyDate:i.StudyDate,SeriesDescription:i.SeriesDescription,SeriesInstanceUID:i.SeriesInstanceUID,SeriesNumber:i.SeriesNumber,ManufacturerModelName:i.ManufacturerModelName,SpacingBetweenSlices:i.SpacingBetweenSlices};return{referencedDisplaySetMetadata:l,referencedDisplaySet:s}}(S,e,p).then(({referencedDisplaySet:t,referencedDisplaySetMetadata:n})=>{if(!t||!n)return;C(e),D(t),T(n);const{presentationIds:r}=s,o=S.measurements[e];g(r.positionPresentationId,{viewReference:o.viewReference||{referencedImageId:o.imageId}})})},[r,S,R,m]),M=(0,a.useCallback)(()=>{if(!R)return null;const{measurements:t}=S;return t[y]?a.createElement(l.OHIFCornerstoneViewport,f({},e,{displaySets:[R],viewportOptions:{...s,toolGroupId:"SRToolGroup",viewportType:"stack",positionIds:null},onElementEnabled:t=>{e.onElementEnabled?.(t),(e=>{E(e.detail.element)})(t)},isJumpToMeasurementDisabled:!0})):null},[R,m,y]);(0,a.useEffect)(()=>{const e=p.subscribe(p.EVENTS.DISPLAY_SETS_REMOVED,({displaySetInstanceUIDs:e})=>{const t=b.get(w);e.includes(t.displaySetInstanceUID)&&I.setDisplaySetsForViewport({viewportId:w,displaySetInstanceUIDs:[]})});return()=>{e.unsubscribe()}},[]),(0,a.useEffect)(()=>{(async()=>{S.isLoaded||await S.load(),U(y)})()},[S]),(0,a.useEffect)(()=>{(async()=>{S.isLoaded||await S.load(),v&&S.isLoaded&&N(y)})()},[y,v,N,S]);let P=null;return R&&O?(n&&n.length&&(P=n.map((e,t)=>e&&a.cloneElement(e,{viewportId:m,key:t}))),a.createElement(a.Fragment,null,a.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},M(),P))):null}p.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object};const m=p;var S=n(193);const g={TEXT:e=>e.TextValue,CODE:e=>e.ConceptCodeSequence?.[0]?.CodeMeaning,UIDREF:e=>e.UID,NUM:e=>{const t=e.MeasuredValueSequence?.[0];if(!t)return;const{NumericValue:n,MeasurementUnitsCodeSequence:r}=t,{CodeValue:o}=r;return`${n} ${o}`},PNAME:e=>{const t=e.PersonName?.[0];return t?s.utils.formatPN(t):void 0},DATE:e=>{const{Date:t}=e;return t?s.utils.formatDate(t):void 0},TIME:e=>{const{Time:t}=e;return t?s.utils.formatTime(t):void 0},DATETIME:e=>{const{DateTime:t}=e;if("string"!=typeof t)return;if(t.length<14)return t;const n=t.substring(0,8),r=t.substring(8,14);return`${s.utils.formatDate(n)} ${s.utils.formatTime(r)}`}};function h(e){const{contentItem:t,nodeIndexesTree:n,continuityOfContent:r}=e,{ConceptNameCodeSequence:o}=t,{CodeValue:s,CodeMeaning:i}=o,c=0===n[n.length-1],l=function(e){const{ValueType:t}=e,n=g[t];return n?n(e):`[${t} is not supported]`}(t)??"[empty]",u="CONTINUOUS"===r,d=s===S.n7.Finding,f=u&&!c&&/^[a-zA-Z0-9]/.test(l?.[0]);let p="whitespace-pre-line";return s===S.n7.Finding&&(p="whitespace-pre-wrap"),u?a.createElement(a.Fragment,null,a.createElement("span",{className:p,title:i},f?" ":"",l)):a.createElement(a.Fragment,null,a.createElement("div",{className:"mb-2"},a.createElement("span",{className:"font-bold"},i,": "),d?a.createElement("pre",null,l):a.createElement("span",{className:p},l)))}function I(){return I=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},I.apply(null,arguments)}function y(e){const{container:t,nodeIndexesTree:n=[0],containerNumberedTree:r=[1]}=e,{ContinuityOfContent:o,ConceptNameCodeSequence:s}=t,{CodeMeaning:i}=s??{};let c=1;const l=t.ContentSequence?.map((e,t)=>{const{ValueType:s}=e,i=[...n,t],l=i.join(".");let u,d;if("CONTAINER"===s){u=y,d={container:e,nodeIndexesTree:i,containerNumberedTree:[...r,c++]}}else u=h,d={contentItem:e,nodeIndexesTree:i,continuityOfContent:o};return a.createElement(u,I({key:l},d))});return a.createElement("div",null,a.createElement("div",{className:"font-bold"},r.join("."),". ",i),a.createElement("div",{className:"ml-4 mb-2"},l))}function C(e){const{displaySets:t}=e,n=t[0].instances[0];return a.createElement("div",{className:"relative flex h-full w-full flex-col overflow-auto p-4 text-white"},a.createElement("div",null,a.createElement(y,{container:n})))}h.propTypes={contentItem:o().object,nodeIndexesTree:o().arrayOf(o().number),continuityOfContent:o().string},y.propTypes={container:o().object,nodeIndexesTree:o().arrayOf(o().number),containerNumberedTree:o().arrayOf(o().number)},C.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object,servicesManager:o().object.isRequired,extensionManager:o().instanceOf(s.ExtensionManager).isRequired};const R=C;function D(e){const{displaySets:t}=e,{isImagingMeasurementReport:n}=t[0];return n?a.createElement(m,e):a.createElement(R,e)}D.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object,servicesManager:o().object.isRequired,extensionManager:o().instanceOf(s.ExtensionManager).isRequired};const O=D},193:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>c,bY:()=>i,n7:()=>s,sh:()=>a});var r=n(142);const{CodeScheme:o}=r.adaptersSR.Cornerstone3D,a={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"},s={ImagingMeasurementReport:"126000",ImageLibrary:"111028",ImagingMeasurements:"126010",MeasurementGroup:"125007",ImageLibraryGroup:"126200",TrackingUniqueIdentifier:"112040",TrackingIdentifier:"112039",Finding:"121071",FindingSite:"G-C0E3",FindingSiteSCT:"363698007"},i={SRT:"SRT",SCT:"SCT",CornerstoneCodeSchemes:[o.CodingSchemeDesignator,"CST4"]},c={CodeNameCodeSequenceValues:s,CodingSchemeDesignators:i,RelationshipType:{INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},SCOORDTypes:a}},942:(e,t,n)=>{"use strict";n.d(t,{eF:()=>s,m1:()=>a});var r=n(557);const o={TrackingUniqueIdentifier:null,trackingIdentifiersByViewportId:{}};function a(e,t,n=0){const a=(0,r.getEnabledElement)(e),{viewport:s}=a;o.trackingIdentifiersByViewportId[s.id]={trackingUniqueIdentifiers:t,activeIndex:n}}function s(e){const t=(0,r.getEnabledElement)(e),{viewport:n}=t;return o.trackingIdentifiersByViewportId[n.id]?o.trackingIdentifiersByViewportId[n.id]:{trackingUniqueIdentifiers:[]}}},291:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2);const o=r.classes.ImageSet,a=(e,t)=>{const{displaySetInstanceUID:n,ReferencedSOPInstanceUID:r}=e,o=t.getDisplaySetByUID(n);if(o.images)return o.images.find(e=>e.SOPInstanceUID===r)},s=(e,t)=>{const n=[],r={};for(const o of t.measurements){const{imageId:t}=o;if(!t)continue;if(r[t])continue;const s=a(o,e);s?(r[t]=s,n.push(s)):console.log("Measurement",o,"had no instances found")}return n},i=(e,t)=>{const n=s(e,t),r=new o(n),a=n[0];if(a)return r.setAttributes({displaySetInstanceUID:r.uid,SeriesDate:a.SeriesDate,SeriesTime:a.SeriesTime,SeriesInstanceUID:r.uid,StudyInstanceUID:a.StudyInstanceUID,SeriesNumber:a.SeriesNumber||0,SOPClassUID:a.SOPClassUID,SeriesDescription:`${t.SeriesDescription} KO ${t.instance.SeriesNumber}`,Modality:"KO",isMultiFrame:!1,numImageFrames:n.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,t)),this.numImageFrames=this.images.length}}),e.addDisplaySets(r),r}},856:(e,t,n)=>{"use strict";var r=n(183);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,s){if(s!==r){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},598:(e,t,n)=>{e.exports=n(856)()},183:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},249:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),i=Symbol.for("react.provider"),c=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},S=Object.assign,g={};function h(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function I(){}function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}h.prototype.isReactComponent={},h.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},I.prototype=h.prototype;var C=y.prototype=new I;C.constructor=y,S(C,h.prototype),C.isPureReactComponent=!0;var R=Array.isArray,D=Object.prototype.hasOwnProperty,O={current:null},T={key:!0,ref:!0,__self:!0,__source:!0};function v(e,t,r){var o,a={},s=null,i=null;if(null!=t)for(o in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(s=""+t.key),t)D.call(t,o)&&!T.hasOwnProperty(o)&&(a[o]=t[o]);var c=arguments.length-2;if(1===c)a.children=r;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];a.children=l}if(e&&e.defaultProps)for(o in c=e.defaultProps)void 0===a[o]&&(a[o]=c[o]);return{$$typeof:n,type:e,key:s,ref:i,props:a,_owner:O.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var b=/\/+/g;function w(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(e){return t[e]})}(""+e.key):t.toString(36)}function N(e,t,o,a,s){var i=typeof e;"undefined"!==i&&"boolean"!==i||(e=null);var c=!1;if(null===e)c=!0;else switch(i){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case n:case r:c=!0}}if(c)return s=s(c=e),e=""===a?"."+w(c,0):a,R(s)?(o="",null!=e&&(o=e.replace(b,"$&/")+"/"),N(s,t,o,"",function(e){return e})):null!=s&&(E(s)&&(s=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(s,o+(!s.key||c&&c.key===s.key?"":(""+s.key).replace(b,"$&/")+"/")+e)),t.push(s)),1;if(c=0,a=""===a?".":a+":",R(e))for(var l=0;l<e.length;l++){var u=a+w(i=e[l],l);c+=N(i,t,o,u,s)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),l=0;!(i=e.next()).done;)c+=N(i=i.value,t,o,u=a+w(i,l++),s);else if("object"===i)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return c}function U(e,t,n){if(null==e)return e;var r=[],o=0;return N(e,r,"","",function(e){return t.call(n,e,o++)}),r}function M(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)},function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var P={current:null},x={transition:null},q={ReactCurrentDispatcher:P,ReactCurrentBatchConfig:x,ReactCurrentOwner:O};function V(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:U,forEach:function(e,t,n){U(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return U(e,function(){t++}),t},toArray:function(e){return U(e,function(e){return e})||[]},only:function(e){if(!E(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=h,t.Fragment=o,t.Profiler=s,t.PureComponent=y,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=q,t.act=V,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=S({},e.props),a=e.key,s=e.ref,i=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,i=O.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)D.call(t,l)&&!T.hasOwnProperty(l)&&(o[l]=void 0===t[l]&&void 0!==c?c[l]:t[l])}var l=arguments.length-2;if(1===l)o.children=r;else if(1<l){c=Array(l);for(var u=0;u<l;u++)c[u]=arguments[u+2];o.children=c}return{$$typeof:n,type:e.type,key:a,ref:s,props:o,_owner:i}},t.createContext=function(e){return(e={$$typeof:c,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=v,t.createFactory=function(e){var t=v.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=E,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:M}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=x.transition;x.transition={};try{e()}finally{x.transition=t}},t.unstable_act=V,t.useCallback=function(e,t){return P.current.useCallback(e,t)},t.useContext=function(e){return P.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return P.current.useDeferredValue(e)},t.useEffect=function(e,t){return P.current.useEffect(e,t)},t.useId=function(){return P.current.useId()},t.useImperativeHandle=function(e,t,n){return P.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return P.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return P.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return P.current.useMemo(e,t)},t.useReducer=function(e,t,n){return P.current.useReducer(e,t,n)},t.useRef=function(e){return P.current.useRef(e)},t.useState=function(e){return P.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return P.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return P.current.useTransition()},t.version="18.3.1"},326:(e,t,n)=>{"use strict";e.exports=n(249)},142:e=>{"use strict";e.exports=r},557:e=>{"use strict";e.exports=a},713:e=>{"use strict";e.exports=o},2:t=>{"use strict";t.exports=e},492:e=>{"use strict";e.exports=l},669:e=>{"use strict";e.exports=n},545:e=>{"use strict";e.exports=t},55:e=>{"use strict";e.exports=c},111:e=>{"use strict";e.exports=i},155:e=>{"use strict";e.exports=s}},p={};function m(e){var t=p[e];if(void 0!==t)return t.exports;var n=p[e]={exports:{}};return f[e](n,n.exports,m),n.exports}m.m=f,u=[],m.O=(e,t,n,r)=>{if(!t){var o=1/0;for(c=0;c<u.length;c++){for(var[t,n,r]=u[c],a=!0,s=0;s<t.length;s++)(!1&r||o>=r)&&Object.keys(m.O).every(e=>m.O[e](t[s]))?t.splice(s--,1):(a=!1,r<o&&(o=r));if(a){u.splice(c--,1);var i=n();void 0!==i&&(e=i)}}return e}r=r||0;for(var c=u.length;c>0&&u[c-1][2]>r;c--)u[c]=u[c-1];u[c]=[t,n,r]},m.F={},m.E=e=>{Object.keys(m.F).map(t=>{m.F[t](e)})},m.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return m.d(t,{a:t}),t},m.d=(e,t)=>{for(var n in t)m.o(t,n)&&!m.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},m.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),m.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d={524:0},m.F.j=e=>{if(!m.o(d,e)||void 0===d[e]){d[e]=null;var t=document.createElement("link");m.nc&&t.setAttribute("nonce",m.nc),t.rel="prefetch",t.as="script",t.href=m.p+m.u(e),document.head.appendChild(t)}},m.O.j=e=>0===d[e],m.O(0,[524],()=>{m.E(524)},5);var S={};return(()=>{"use strict";m.r(S),m.d(S,{Enums:()=>u.Ay,createReferencedImageDisplaySet:()=>fe.A,default:()=>ge,hydrateStructuredReport:()=>ee,srProtocol:()=>$,toolNames:()=>g});var e=m(326),t=m(2),n=m.n(t),r=m(545),o=m.n(r),a=m(669),s=m(142),i=m(713),c=m(557),l=m(155),u=m(193);const d=1e-4,f=({GraphicData:e,ValueType:t,imageId:n})=>{const r=[];if("SCOORD3D"===t)for(let t=0;t<e.length;t+=3)r.push([e[t],e[t+1],e[t+2]]);else for(let t=0;t<e.length;t+=2){const o=c.utilities.imageToWorldCoords(n,[e[t],e[t+1]]);r.push(o)}return r};const p=function({GraphicType:e,GraphicData:t,ValueType:n,imageId:r}){let o=[];switch(e){case u.sh.POINT:case u.sh.MULTIPOINT:case u.sh.POLYLINE:o=f({GraphicData:t,ValueType:n,imageId:r});break;case u.sh.CIRCLE:{const e=f({GraphicData:t,ValueType:n,imageId:r});if(!r)return e;const a=e[0],s=e[1],i=l.vec3.distance(a,s),u=c.metaData.get("imagePlaneModule",r);if(!u)throw new Error("No imagePlaneModule found");const{columnCosines:d,rowCosines:p}=u,m=l.vec3.create();l.vec3.scaleAndAdd(m,a,d,i);const S=l.vec3.create();l.vec3.scaleAndAdd(S,a,d,-i);const g=l.vec3.create();l.vec3.scaleAndAdd(g,a,p,i);const h=l.vec3.create();l.vec3.scaleAndAdd(h,a,p,-i),o=[m,S,g,h];break}case u.sh.ELLIPSE:{const e=f({GraphicData:t,ValueType:n,imageId:r});if(!r)return e;const a=l.vec3.fromValues(...e[0]),s=l.vec3.fromValues(...e[1]),i=l.vec3.fromValues(...e[2]),u=l.vec3.fromValues(...e[3]),p=l.vec3.create();l.vec3.sub(p,s,a),l.vec3.normalize(p,p);const m=l.vec3.create();l.vec3.sub(m,u,i),l.vec3.normalize(m,m);const S=c.metaData.get("imagePlaneModule",r);if(!S)throw new Error("imageId does not have imagePlaneModule metadata");const{columnCosines:g}=S,h=l.vec3.fromValues(...g),I=Math.abs(l.vec3.dot(h,p)),y=Math.abs(l.vec3.dot(h,m)),C=Math.abs(I),R=Math.abs(y);o=[],Math.abs(C-1)<d?o=[e[0],e[1],e[2],e[3]]:Math.abs(R-1)<d?o=[e[2],e[3],e[0],e[1]]:console.warn("OBLIQUE ELLIPSE NOT YET SUPPORTED");break}default:console.warn("Unsupported GraphicType:",e)}return o},g={DICOMSRDisplay:"DICOMSRDisplay",SRLength:"SRLength",SRBidirectional:"SRBidirectional",SREllipticalROI:"SREllipticalROI",SRCircleROI:"SRCircleROI",SRArrowAnnotate:"SRArrowAnnotate",SRAngle:"SRAngle",SRCobbAngle:"SRCobbAngle",SRRectangleROI:"SRRectangleROI",SRPlanarFreehandROI:"SRPlanarFreehandROI"},{MeasurementReport:h}=s.adaptersSR.Cornerstone3D;function I({measurement:e,imageId:t=null,frameNumber:n=null,displaySet:r}){let o=g.DICOMSRDisplay;const a=e.coords.reduce((e,n)=>(e[n.GraphicType]=e[n.GraphicType]||[],e[n.GraphicType].push(p({...n,imageId:t})),e),{}),{TrackingUniqueIdentifier:s}=e,{ValueType:l,GraphicType:u}=e.coords[0],d=a[u];let f=null,m=null;if(t){const e=c.metaData.get("imagePlaneModule",t);f=e?.frameOfReferenceUID}"SCOORD3D"===l&&(f=e.coords[0].ReferencedFrameOfReferenceSequence,m={FrameOfReferenceUID:f,point:d[0][0]}),e.viewReference={planeRestriction:m,FrameOfReferenceUID:f,referencedImageId:t};const S={annotationUID:s,highlighted:!1,isLocked:!1,isPreview:o===g.DICOMSRDisplay,invalidated:!1,metadata:{toolName:o,planeRestriction:m,valueType:l,graphicType:u,FrameOfReferenceUID:f,referencedImageId:t,displaySetInstanceUID:r.displaySetInstanceUID},data:{label:e.labels?.[0]?.value||void 0,displayText:e.displayText||void 0,handles:{textBox:e.textBox??{},points:d[0]},cachedStats:{},frameNumber:n,renderableData:a,TrackingUniqueIdentifier:s,labels:e.labels}};i.annotation.state.addAnnotation(S)}const{MeasurementReport:y}=s.adaptersSR.Cornerstone3D;const C=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-sr"}').UU,R="dicom-sr",D=`${C}.sopClassHandlerModule.${R}`,O="dicom-sr-3d",T=`${C}.sopClassHandlerModule.${O}`,{sopClassDictionary:v}=t.utils,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:E,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:b}=a.Enums,{MetadataProvider:w}=t.classes,{TEXT_ANNOTATION_POSITION:N,COMMENT_CODE:U,CodeScheme:M}=s.adaptersSR.Cornerstone3D,P=[v.BasicTextSR,v.EnhancedSR,v.ComprehensiveSR,v.Comprehensive3DSR];function x(e,n){return this.instances.push(...e),t.utils.sortStudyInstances(this.instances),this.instance=this.instances[this.instances.length-1],this.isLoaded=!1,this}function q(e,n,r){if(!e||!e.length)throw new Error("No instances were provided");t.utils.sortStudyInstances(e);const a=e[e.length-1],{StudyInstanceUID:s,SeriesInstanceUID:i,SOPInstanceUID:c,SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,ConceptNameCodeSequence:m,SOPClassUID:S,imageId:g}=a;((e,t)=>{t.forEach(t=>{if(t.StudyInstanceUID!==e)throw console.warn("Not all instances have the same UID",e,t),new Error(`Instances ${t.SOPInstanceUID} does not belong to ${e}`)})})(a.StudyInstanceUID,e);const h=S===v.Comprehensive3DSR,I=m?.CodeValue===u.n7.ImagingMeasurementReport,C={Modality:"SR",displaySetInstanceUID:t.utils.guid(),SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,SOPInstanceUID:c,SeriesInstanceUID:i,StudyInstanceUID:s,SOPClassHandlerId:h?T:D,SOPClassUID:S,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,isImagingMeasurementReport:I,sopClassUids:P,instance:a,predecessorImageId:g,addInstances:x,label:l||`${o().t("Series")} ${d} - ${o().t("SR")}`};return C.load=()=>async function(e,t,n){const{displaySetService:r,measurementService:o}=t.services,a=n.getDataSources(),s=a[0],{ContentSequence:i}=e.instance;async function c(t,n=null,r=null){for(const o in t)if("object"==typeof t[o]&&null!==t[o])await c(t[o],t,o);else if(Array.isArray(t[o]))await Promise.all(t[o].map(e=>c(e,t,o)));else if("BulkDataURI"===o){const a=await s.retrieve.bulkDataURI({BulkDataURI:t[o],StudyInstanceUID:e.instance.StudyInstanceUID,SeriesInstanceUID:e.instance.SeriesInstanceUID,SOPInstanceUID:e.instance.SOPInstanceUID});n&&r&&(n[r]=new Float32Array(a))}}!0!==e.isLoaded&&await c(i);e.isImagingMeasurementReport?(e.referencedImages=function(e){const t=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImageLibrary);if(!t)return[];const n=L(t.ContentSequence).find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImageLibraryGroup);if(!n)return[];const r=[];return L(n.ContentSequence).forEach(e=>{const{ReferencedSOPSequence:t}=e;if(t)for(const e of L(t))if(e.ReferencedSOPClassUID){const{ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n}=e;r.push({ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n})}}),r}(i),e.measurements=function(e){const t=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImagingMeasurements);if(!t)return[];const n=function(e){const t={};return e.forEach(e=>{const n=L(e.ContentSequence),r=n.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingUniqueIdentifier);r||console.warn("No Tracking Unique Identifier, skipping ambiguous measurement.");const o=r.UID;void 0===t[o]?t[o]=[...n]:n.forEach(e=>{e.ConceptNameCodeSequence.CodeValue!==u.n7.TrackingUniqueIdentifier&&t[o].push(e)})}),t}(L(t.ContentSequence).filter(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.MeasurementGroup)),r=[];return Object.keys(n).forEach(e=>{const t=function(e){if(e.some(e=>function(e){return"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType}(e)&&!function(e){const t=e.ConceptNameCodeSequence[0];return t&&t.CodeValue===N.value&&t.CodingSchemeDesignator===N.schemeDesignator}(e)))return function(e){const t=e.find(e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType),n=e.find(e=>"UIDREF"===e.ValueType),r=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingIdentifier);if(!t)return void console.warn(`graphic ValueType ${t.ValueType} not currently supported, skipping annotation.`);const o=e.filter(e=>"NUM"===e.ValueType),{ConceptNameCodeSequence:a}=t,{CodeValue:s,CodingSchemeDesignator:i}=a,c=`${i}:${s}`,l=A(t),d="SCOORD3D"===l.ValueType,f=d?3:2,p=l.GraphicData.length/f,m={loaded:!1,labels:[],coords:[l],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue,graphicCode:c,is3DMeasurement:d,pointsLength:p,graphicType:l.GraphicType};o.forEach(e=>{const{ConceptNameCodeSequence:t,MeasuredValueSequence:n}=e;n&&m.labels.push(F(t,n))});const S=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===u.bY.SCT&&e.ConceptNameCodeSequence.CodeValue===u.n7.FindingSiteSCT);S.length&&m.labels.push({label:u.n7.FindingSiteSCT,value:S[0].ConceptCodeSequence.CodeMeaning});return m}(e);return function(e){const t=e.filter(e=>"NUM"===e.ValueType),n=e.find(e=>"UIDREF"===e.ValueType),r=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingIdentifier),o=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.Finding),a=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===u.bY.SRT&&e.ConceptNameCodeSequence.CodeValue===u.n7.FindingSite),s=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===U.schemeDesignator&&e.ConceptNameCodeSequence.CodeValue===U.value),i={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};if(s)for(const e of s)e.TextValue&&i.labels.push({label:e.TextValue,value:""});o&&u.bY.CornerstoneCodeSchemes.includes(o.ConceptCodeSequence.CodingSchemeDesignator)&&o.ConceptCodeSequence.CodeValue===M.codeValues.CORNERSTONEFREETEXT&&i.labels.push({label:M.codeValues.CORNERSTONEFREETEXT,value:o.ConceptCodeSequence.CodeMeaning});if(a.length){const e=a.find(e=>u.bY.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===M.codeValues.CORNERSTONEFREETEXT);e&&i.labels.push({label:M.codeValues.CORNERSTONEFREETEXT,value:e.ConceptCodeSequence.CodeMeaning})}return t.forEach(e=>{const{ConceptNameCodeSequence:t,ContentSequence:n,MeasuredValueSequence:r}=e;if(n){const{ValueType:e}=n;if("SCOORD"!==e&&"SCOORD3D"!==e)return void console.warn(`Graphic ${e} not currently supported, skipping annotation.`);const t=A(n);t&&i.coords.push(t)}r&&i.labels.push(F(t,r))}),i}(e)}(n[e]);t&&r.push(t)}),r}(i)):(e.referencedImages=[],e.measurements=[]);const{predecessorImageId:l}=e;for(const t of e.measurements)t.predecessorImageId=l;const d=o.getSourceMappings(E,b);e.isHydrated=!1,e.isRehydratable=function(e,t){if(!t||!t.length)return!1;const n=new Set;for(const e of t)n.add(e.annotationType);const{measurements:r}=e;for(let e=0;e<r.length;e++){const t=r[e];if(!t)continue;const{TrackingIdentifier:o="",graphicType:a,graphicCode:s,pointsLength:i}=t;if(!o&&!a){console.warn("No tracking identifier or graphicType for measurement ",t);continue}const c=y.getAdapterForTrackingIdentifier(o),l=y.getAdaptersForTypes(s,a,i),u=c&&n.has(c.toolType)||l&&l.some(e=>n.has(e.toolType));if(u)return!0;console.log("Measurement is not rehydratable",o,r[e])}return console.log("No measurements found which were rehydratable"),!1}(e,d),e.isLoaded=!0,r.activeDisplaySets.forEach(n=>{k(e,n,s,t)}),r.subscribe(r.EVENTS.DISPLAY_SETS_ADDED,n=>{const{displaySetsAdded:r}=n;r.forEach(n=>{k(e,n,s,t)})})}(C,n,r),[C]}function V({measurement:e,displaySet:t}){return e.coords[0].ReferencedFrameOfReferenceSequence===t.FrameOfReferenceUID}function k(e,t,n,r){const{customizationService:o}=r.services,a=e.measurements.filter(e=>!1===e.loaded);if(!a.length||t.unsupported)return;const s=new Map,i=n.getImageIdsForDisplaySet(t);for(const e of i){const{SOPInstanceUID:t,frameNumber:n}=w.getUIDsFromImageID(e),r=`${t}:${n||1}`;s.set(r,e)}if(!a?.length)return;const c=e.SOPClassUID===v.Comprehensive3DSR;for(let n=a.length-1;n>=0;n--){let r=a[n];const i="SCOORD3D"===r.coords?.[0]?.ValueType,l=o.getCustomization("onBeforeSRAddMeasurement");if("function"==typeof l&&(r=l({measurement:r,StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID})),c&&i&&V({measurement:r,displaySet:t})){I({measurement:r,displaySet:t}),r.loaded=!0,r.displaySetInstanceUID=t.displaySetInstanceUID,a.splice(n,1);continue}const u=r.coords[0].ReferencedSOPSequence;if(!u)continue;const{ReferencedSOPInstanceUID:d}=u,f=u.ReferencedFrameNumber||1,p=`${d}:${f}`,m=s.get(p);m&&_(r,d,f)&&(I({measurement:r,imageId:m,frameNumber:f,displaySet:t}),r.loaded=!0,r.imageId=m,r.displaySetInstanceUID=t.displaySetInstanceUID,r.ReferencedSOPInstanceUID=d,r.frameNumber=f,a.splice(n,1))}}function _(e,t,n){const{coords:r}=e,o=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence?.ReferencedFrameNumber||1;if(n&&Number(n)!==Number(o))return!1;for(let e=0;e<r.length;e++){const n=r[e],{ReferencedSOPInstanceUID:o}=n.ReferencedSOPSequence;if(o===t)return!0}return!1}const A=e=>{const{ValueType:t,GraphicType:n,GraphicData:r}=e,o={ValueType:t,GraphicType:n,GraphicData:r};return o.ReferencedSOPSequence=e.ContentSequence?.ReferencedSOPSequence,o.ReferencedFrameOfReferenceSequence=e.ReferencedFrameOfReferenceUID||e.ContentSequence?.ReferencedFrameOfReferenceSequence,o};function F(e,t){const{CodeMeaning:n}=e,{NumericValue:r,MeasurementUnitsCodeSequence:o}=t,{CodeValue:a}=o;return{label:n,value:`${r?Number(r).toFixed(2):""} ${a}`}}function L(e){return e?Array.isArray(e)?e:[e]:[]}const j=function(e){const{servicesManager:t,extensionManager:n}=e,r=e=>q(e,t,n);return[{name:R,sopClassUids:P,getDisplaySetsFromSeries:r},{name:O,sopClassUids:[v.Comprehensive3DSR],getDisplaySetsFromSeries:r}]},$={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 B=m(111),G=m.n(B);const H=function(e,t){const n={};function r(r,o){const a=r.metadata?.referencedImageId??s.NO_IMAGE_ID;n[a]||(n[a]={});const i=n[a];i[o]||(i[o]={data:[]});const c=e.find(e=>e.uid===r.annotationUID),l=i[o].data;let{finding:u}=c;const d=[];c.label&&(t.includes(o)?u={CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:c.label}:d.push({CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:c.label})),c.findingSites&&d.push(...c.findingSites);const f=Object.assign({},r,{finding:u,findingSites:d});l.push(f)}const o=e.map(e=>e.uid).slice(),a=i.annotation.state.getAnnotationManager(),c=a.getFramesOfReference();for(let e=0;e<c.length;e++){const t=c[e],s=a.getAnnotations(t),i=Object.keys(s);for(let e=0;e<i.length;e++){const t=i[e],a=s[t];if(a)for(let e=0;e<a.length;e++){const s=a[e],i=o.findIndex(e=>e===s.annotationUID);if(-1!==i&&(r(s,t),o.splice(i,1),!o.length))return n}}}return n},{CodeScheme:z}=s.adaptersSR.Cornerstone3D;const{locking:W}=i.annotation,{guid:Y}=n().utils,{MeasurementReport:X}=s.adaptersSR.Cornerstone3D,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:J,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:K}=a.Enums,Q=(e,t)=>{if(!t||"CORNERSTONEJS"===t.CodingSchemeDesignator)return;const n=`${t.CodingSchemeDesignator}:${t.CodeValue}`;return{...e[n],ref:n,...t,text:t.CodeMeaning}},Z=(e,t)=>{if(!t||!t.length)return;const n=[];for(let r=0;r<t.length;r++){const o=Q(e,t[r][0]||t[r]);o&&n.push(o)}return n.length&&n||void 0};function ee({servicesManager:e,extensionManager:n,commandsManager:r},o){const a=n.getActiveDataSource()[0],{measurementService:s,displaySetService:i,customizationService:l}=e.services,u=l.getCustomization("codingValues"),d=l.getCustomization("panelMeasurement.disableEditing"),f=i.getDisplaySetByUID(o),{StudyInstanceUID:p,SeriesInstanceUID:m,instance:{SOPInstanceUID:S}}=f,g=s.getSourceMappings(J,K);if(!g||!g.length)throw new Error("Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.");const h=t.DicomMetadataStore.getInstance(p,m,S),I={};f.measurements.forEach(e=>{const{ReferencedSOPInstanceUID:t,imageId:n,frameNumber:r=1}=e,o=`${t}:${r}`;I[o]||(I[o]=n)});const y=h;let C=X.generateToolState(y,I,c.metaData);const R=l.getCustomization("onBeforeSRHydration")?.value;"function"==typeof R&&(C=R({storedMeasurementByAnnotationType:C,displaySet:f}));const D=g.map(e=>e.annotationType),O={};Object.keys(C).forEach(e=>{D.includes(e)&&(O[e]=C[e])});const T=[];let v;Object.keys(O).forEach(e=>{O[e].forEach(e=>{const t=e.annotation.data?.frameNumber||1,n=I[`${e.sopInstanceUid}:${t}`];T.includes(n)||T.push(n)})});const E=[];for(let e=0;e<T.length;e++){const t=T[e];if(!t)continue;const{SeriesInstanceUID:n,StudyInstanceUID:r}=c.metaData.get("instance",t);E.includes(n)||E.push(n),v?v!==r&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):v=r}function b(t){const n=t.annotation.data&&t.annotation.data.frameNumber||1,r=I[`${t.sopInstanceUid}:${n}`];if(!r)return function(e,t){const{FrameOfReferenceUID:n}=e.annotation.metadata,{points:r}=e.annotation.data.handles,{displaySetService:o}=t.services,a=o.getDisplaySetsBy(e=>e.FrameOfReferenceUID===n);if(!a.length||!r?.length)return{FrameOfReferenceUID:n};const s=function(e,t){if(!e?.length)return void console.warn("No display set found for",t);if(1===e.length)return e[0];const n=e.find(e=>e.isReconstructable);if(n)return n;return e[0]}(a,e.annotation),i={...te(s,r),volumeId:s.displaySetInstanceUID,FrameOfReferenceUID:n};return c.utilities.updatePlaneRestriction(r,i),i}(t,e);const o=c.metaData.get("instance",r),{FrameOfReferenceUID:a}=o;return{referencedImageId:r,FrameOfReferenceUID:a}}return Object.keys(O).forEach(e=>{O[e].forEach(t=>{t.uid=Y();const n=b(t),{imageId:o}=n,i={annotationUID:t.annotation.annotationUID,data:t.annotation.data,predecessorImageId:t.predecessorImageId,metadata:{...n,toolName:e}};c.utilities.updatePlaneRestriction(i.data.handles.points,i.metadata);const l=s.getSource(J,K);i.data.label=function(e){const{findingSites:t=[],finding:n,annotation:r}=e;if(r.data.label)return r.data.label;let o=t.find(e=>e.CodeValue===z.codeValues.CORNERSTONEFREETEXT);return o?o.CodeMeaning:n&&n.CodeValue===z.codeValues.CORNERSTONEFREETEXT?n.CodeMeaning:void 0}(t),i.data.finding=Q(u,t.finding?.[0]),i.data.findingSites=Z(u,t.findingSites),i.data.findingSites?.forEach(e=>{e.type&&(i.data[e.type]=e)});const f=g.find(t=>t.annotationType===e),p=s.addRawMeasurement(l,e,{annotation:i},f.toMeasurementSchema,a);r.runCommand("updateMeasurement",{uid:p,code:i.data.finding}),d&&W.setAnnotationLocked(p,!0),o&&!T.includes(o)&&T.push(o)})}),f.isHydrated=!0,{StudyInstanceUID:v,SeriesInstanceUIDs:E}}function te(e,t){const n=function(e){if(1===e.length||2===e.length)return e;const t=0,n=Math.ceil(e.length/4),r=Math.ceil(e.length/2),o=[e[t],e[n],e[r]];return o}(t),r=function(e){const t=1/e.length,n=l.vec3.create();for(const r of e)l.vec3.scaleAndAdd(n,n,r,t);return n}(n);return{cameraFocalPoint:r,viewPlaneNormal:null,viewUp:null}}const{downloadBlob:ne}=t.utils,{MeasurementReport:re}=s.adaptersSR.Cornerstone3D,{log:oe}=n(),ae=(e,t,n={})=>{const r=H(e,t),o=re.generateReport(r,c.metaData,n),{dataset:a}=o;return void 0===a.SpecificCharacterSet&&(a.SpecificCharacterSet="ISO_IR 192"),a},se=e=>{const{servicesManager:n,extensionManager:r,commandsManager:o}=e,{customizationService:a}=n.services,s={changeColorMeasurement:({uid:e})=>{throw new Error("Unsupported operation: changeColorMeasurement")},downloadReport:({measurementData:e,additionalFindingTypes:t,options:n={}})=>{const r=ae(e,t,n),o=G().data.datasetToBlob(r);ne(o,{filename:"dicom-sr.dcm"})},storeMeasurements:async({measurementData:e,dataSource:n,additionalFindingTypes:r,options:o={}})=>{if(oe.info("[DICOMSR] storeMeasurements"),!n||!n.store||!n.store.dicom)return oe.error("[DICOMSR] datasource has no dataSource.store.dicom endpoint!"),Promise.reject({});try{const s=ae(e,r,o),{StudyInstanceUID:i,ContentSequence:c}=s;if(!c?.[4].ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",s),new Error("Invalid report, no content");if(!s.SOPClassUID)throw new Error("No sop class uid");const l=a.getCustomization("onBeforeDicomStore");let u;return"function"==typeof l&&(u=l({dicomDict:u,measurementData:e,naturalizedReport:s})),await n.store.dicom(s,null,u),i&&n.deleteStudyMetadataPromise(i),t.DicomMetadataStore.addInstances([s],!0),s}catch(e){throw console.warn(e),oe.error(`[DICOMSR] Error while saving the measurements: ${e.message}`),new Error(e.message||"Error while saving the measurements.")}},hydrateStructuredReport:({displaySetInstanceUID:e})=>ee({servicesManager:n,extensionManager:r,commandsManager:o},e)};return{actions:s,definitions:{downloadReport:s.downloadReport,storeMeasurements:s.storeMeasurements,hydrateStructuredReport:s.hydrateStructuredReport},defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};var ie=m(942);class ce extends i.AnnotationTool{constructor(e={},t={configuration:{}}){super(e,t),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{const{viewport:n}=e,{element:r}=n;let o=i.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;if(o=this.filterInteractableAnnotationsForElement(r,o),!o?.length)return;const a=(0,ie.eF)(r),{activeIndex:s,trackingUniqueIdentifiers:c}=a,l=c[s],d=o.filter(e=>c.includes(e.data?.TrackingUniqueIdentifier));if(!n._actors?.size)return;const f={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},{style:p}=i.annotation.config;for(let e=0;e<d.length;e++){const r=d[e],o=r.annotationUID,{renderableData:a,TrackingUniqueIdentifier:s}=r.data,{referencedImageId:c}=r.metadata;f.annotationUID=o;const m=p.getToolGroupToolStyles(this.toolGroupId)[this.getToolName()],S=this.getStyle("lineWidth",f,r),g=this.getStyle("lineDash",f,r),h={color:s===l?"rgb(0, 255, 0)":this.getStyle("color",f,r),lineDash:g,lineWidth:S,...m};Object.keys(a).forEach(e=>{const s=a[e];let l,d;switch(e){case u.sh.POINT:l=this.renderPoint;break;case u.sh.MULTIPOINT:l=this.renderMultipoint;break;case u.sh.POLYLINE:l=this.renderPolyLine;break;case u.sh.CIRCLE:l=this.renderEllipse;break;case u.sh.ELLIPSE:l=this.renderEllipse,d=i.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const p=l(t,n,s,o,c,h);this.renderTextBox(t,n,p,d,r,f,h)})}}}_getTextBoxLinesFromLabels(e){const t=Math.min(e.length,5),n=[];for(let r=0;r<t;r++){const t=e[r];n.push(`${ue(t.label)}: ${t.value}`)}return n}renderPolyLine(e,t,n,r,o,a){const s={color:a.color,width:a.lineWidth,lineDash:a.lineDash};let c=[];return n.map((n,o)=>{const a=n.map(e=>t.worldToCanvas(e)),l=`${o}`;2===a.length?i.drawing.drawLine(e,r,l,a[0],a[1],s):i.drawing.drawPolyline(e,r,l,a,s),c=c.concat(a)}),c}renderMultipoint(e,t,n,r,o,a){let s;n.map((n,o)=>{s=n.map(e=>t.worldToCanvas(e));i.drawing.drawHandles(e,r,"0",s,{color:a.color})})}renderPoint(e,t,n,r,o,a){const s=[];return n.map((n,l)=>{const u=n[0];if(s.push(t.worldToCanvas(u)),void 0!==n[1])s.push(t.worldToCanvas(n[1]));else{const e=c.metaData.get("imagePixelModule",o);let n=10,r=10;if(e){const{columns:t,rows:o}=e;n=t/10,r=o/10}const a=c.utilities.worldToImageCoords(o,u),i=c.utilities.imageToWorldCoords(o,[a[0]+n,a[1]+r]);s.push(t.worldToCanvas(i))}const d=`${l}`;i.drawing.drawArrow(e,r,d,s[1],s[0],{color:a.color,width:a.lineWidth})}),s}renderEllipse(e,t,n,r,o,a){let s;return n.map((n,o)=>{if(0===n.length)return;const c=n,l=t.getRotation();let u;s=c.map(e=>t.worldToCanvas(e)),u=90==l||270==l?i.utilities.math.ellipse.getCanvasEllipseCorners([s[2],s[3],s[0],s[1]]):i.utilities.math.ellipse.getCanvasEllipseCorners(s);const d=`${o}`;i.drawing.drawEllipse(e,r,d,u[0],u[1],{color:a.color,width:a.lineWidth,lineDash:a.lineDash})}),s}renderTextBox(e,t,n,r,o,a,s={}){if(!n||!o)return;const{annotationUID:c,data:l={}}=o,{labels:u}=l,{color:d}=s;let f=n;"function"==typeof r&&(f=r(n));const p=this._getTextBoxLinesFromLabels(u),m=i.utilities.drawing.getTextBoxCoordsCanvas(f);o.data?.handles?.textBox?.worldPosition||(o.data.handles.textBox.worldPosition=t.canvasToWorld(m));const S=t.worldToCanvas(o.data.handles.textBox.worldPosition),g=this.getLinkedTextBoxStyle(a,o),h=i.drawing.drawLinkedTextBox(e,c,"1",p,S,n,{},{...g,color:d}),{x:I,y,width:C,height:R}=h;o.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([I,y]),topRight:t.canvasToWorld([I+C,y]),bottomLeft:t.canvasToWorld([I,y+R]),bottomRight:t.canvasToWorld([I+C,y+R])}}}ce.toolName=g.DICOMSRDisplay;const le={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function ue(e){const t=le[e];return void 0!==t?t:e}function de(e,t,n={}){class r extends t{constructor(e,t){e.configuration=e.configuration?{...e.configuration,...n}:n,super(e,t)}}r.toolName=e,(0,i.addTool)(r)}var fe=m(291);function pe(){return pe=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},pe.apply(null,arguments)}const me=e.lazy(()=>Promise.resolve().then(m.bind(m,525))),Se=t=>e.createElement(e.Suspense,{fallback:e.createElement("div",null,"Loading...")},e.createElement(me,t)),ge={id:C,onModeEnter:function({servicesManager:e}){const{displaySetService:t}=e.services;[...t.getDisplaySetCache().values()].filter(e=>e.SOPClassHandlerId===D||e.SOPClassHandlerId===T).forEach(e=>{e.isHydrated=!1})},preRegistration:function({configuration:e={},servicesManager:t}){de(g.DICOMSRDisplay,ce),de(g.SRLength,i.LengthTool),de(g.SRBidirectional,i.BidirectionalTool),de(g.SREllipticalROI,i.EllipticalROITool),de(g.SRCircleROI,i.CircleROITool),de(g.SRArrowAnnotate,i.ArrowAnnotateTool),de(g.SRAngle,i.AngleTool),de(g.SRPlanarFreehandROI,i.PlanarFreehandROITool),de(g.SRRectangleROI,i.RectangleROITool),de(g.SRCobbAngle,i.CobbAngleTool);const n={lineDash:"4,4"};i.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{[g.DICOMSRDisplay]:n,SRLength:n,SRBidirectional:n,SREllipticalROI:n,SRCircleROI:n,SRArrowAnnotate:n,SRCobbAngle:n,SRAngle:n,SRPlanarFreehandROI:n,SRRectangleROI:n,global:{}})},getViewportModule:({servicesManager:t,extensionManager:n})=>[{name:"dicom-sr",component:r=>e.createElement(Se,pe({servicesManager:t,extensionManager:n},r))}],getCommandsModule:se,getSopClassHandlerModule:j,getUtilityModule:({servicesManager:e})=>[{name:"tools",exports:{toolNames:g}}]}})(),S=m.O(S)})());
2
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("@ohif/i18n"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/adapters"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("gl-matrix"),require("@ohif/ui-next"),require("@ohif/core/src/contextProviders/SystemProvider")):"function"==typeof define&&define.amd?define(["@ohif/core","@ohif/i18n","@ohif/extension-cornerstone","@cornerstonejs/adapters","@cornerstonejs/tools","@cornerstonejs/core","gl-matrix","@ohif/ui-next","@ohif/core/src/contextProviders/SystemProvider"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-sr"]=t(require("@ohif/core"),require("@ohif/i18n"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/adapters"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("gl-matrix"),require("@ohif/ui-next"),require("@ohif/core/src/contextProviders/SystemProvider")):e["ohif-extension-cornerstone-dicom-sr"]=t(e["@ohif/core"],e["@ohif/i18n"],e["@ohif/extension-cornerstone"],e["@cornerstonejs/adapters"],e["@cornerstonejs/tools"],e["@cornerstonejs/core"],e["gl-matrix"],e["@ohif/ui-next"],e["@ohif/core/src/contextProviders/SystemProvider"])}(globalThis,(e,t,n,r,o,a,s,i,c)=>(()=>{var l,u,d={525(e,t,n){"use strict";n.r(t),n.d(t,{default:()=>O});var r=n(598),o=n.n(r),a=n(326),s=n(2),i=n(942),c=n(291),l=n(669),u=n(55),d=n(492);function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f.apply(null,arguments)}function p(e){const{servicesManager:t}=(0,d.useSystem)(),{children:n,dataSource:r,displaySets:o,viewportOptions:s}=e,{displaySetService:p}=t.services,m=s.viewportId;if(o.length>1)throw new Error("SR viewport should only have a single display set");const S=o[0],{setPositionPresentation:g}=(0,l.usePositionPresentationStore)(),[I,h]=(0,u.useViewportGrid)(),[y,C]=(0,a.useState)(0),[R,D]=(0,a.useState)(null),[O,T]=(0,a.useState)(null),[v,E]=(0,a.useState)(null),{viewports:b,activeViewportId:w}=I,U=(0,a.useCallback)(e=>{const{measurements:t}=S;(0,i.m1)(v,t.map(e=>e.TrackingUniqueIdentifier),e)},[v,y,S]),N=(0,a.useCallback)(e=>{const{StudyInstanceUID:t,displaySetInstanceUID:n}=S;t&&n&&async function(e,t,n){const{measurements:r}=e,o=r[t],{displaySetInstanceUID:a}=o;e.keyImageDisplaySet||(e.keyImageDisplaySet=(0,c.A)(n,e));if(!a)return{referencedDisplaySetMetadata:null,referencedDisplaySet:null};const s=n.getDisplaySetByUID(a);if(!s?.images)return{referencedDisplaySetMetadata:null,referencedDisplaySet:null};const i=s.images[0],l={PatientID:i.PatientID,PatientName:i.PatientName,PatientSex:i.PatientSex,PatientAge:i.PatientAge,SliceThickness:i.SliceThickness,StudyDate:i.StudyDate,SeriesDescription:i.SeriesDescription,SeriesInstanceUID:i.SeriesInstanceUID,SeriesNumber:i.SeriesNumber,ManufacturerModelName:i.ManufacturerModelName,SpacingBetweenSlices:i.SpacingBetweenSlices};return{referencedDisplaySetMetadata:l,referencedDisplaySet:s}}(S,e,p).then(({referencedDisplaySet:t,referencedDisplaySetMetadata:n})=>{if(!t||!n)return;C(e),D(t),T(n);const{presentationIds:r}=s,o=S.measurements[e];g(r.positionPresentationId,{viewReference:o.viewReference||{referencedImageId:o.imageId}})})},[r,S,R,m]),M=(0,a.useCallback)(()=>{if(!R)return null;const{measurements:t}=S;return t[y]?a.createElement(l.OHIFCornerstoneViewport,f({},e,{displaySets:[R],viewportOptions:{...s,toolGroupId:"SRToolGroup",viewportType:"stack",positionIds:null},onElementEnabled:t=>{e.onElementEnabled?.(t),(e=>{E(e.detail.element)})(t)},isJumpToMeasurementDisabled:!0})):null},[R,m,y]);(0,a.useEffect)(()=>{const e=p.subscribe(p.EVENTS.DISPLAY_SETS_REMOVED,({displaySetInstanceUIDs:e})=>{const t=b.get(w);e.includes(t.displaySetInstanceUID)&&h.setDisplaySetsForViewport({viewportId:w,displaySetInstanceUIDs:[]})});return()=>{e.unsubscribe()}},[]),(0,a.useEffect)(()=>{(async()=>{S.isLoaded||await S.load(),N(y)})()},[S]),(0,a.useEffect)(()=>{(async()=>{S.isLoaded||await S.load(),v&&S.isLoaded&&U(y)})()},[y,v,U,S]);let P=null;return R&&O?(n&&n.length&&(P=n.map((e,t)=>e&&a.cloneElement(e,{viewportId:m,key:t}))),a.createElement(a.Fragment,null,a.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},M(),P))):null}p.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object};const m=p;var S=n(193);const g={TEXT:e=>e.TextValue,CODE:e=>e.ConceptCodeSequence?.[0]?.CodeMeaning,UIDREF:e=>e.UID,NUM:e=>{const t=e.MeasuredValueSequence?.[0];if(!t)return;const{NumericValue:n,MeasurementUnitsCodeSequence:r}=t,{CodeValue:o}=r;return`${n} ${o}`},PNAME:e=>{const t=e.PersonName?.[0];return t?s.utils.formatPN(t):void 0},DATE:e=>{const{Date:t}=e;return t?s.utils.formatDate(t):void 0},TIME:e=>{const{Time:t}=e;return t?s.utils.formatTime(t):void 0},DATETIME:e=>{const{DateTime:t}=e;if("string"!=typeof t)return;if(t.length<14)return t;const n=t.substring(0,8),r=t.substring(8,14);return`${s.utils.formatDate(n)} ${s.utils.formatTime(r)}`}};function I(e){const{contentItem:t,nodeIndexesTree:n,continuityOfContent:r}=e,{ConceptNameCodeSequence:o}=t,{CodeValue:s,CodeMeaning:i}=o,c=0===n[n.length-1],l=function(e){const{ValueType:t}=e,n=g[t];return n?n(e):`[${t} is not supported]`}(t)??"[empty]",u="CONTINUOUS"===r,d=s===S.n7.Finding,f=u&&!c&&/^[a-zA-Z0-9]/.test(l?.[0]);let p="whitespace-pre-line";return s===S.n7.Finding&&(p="whitespace-pre-wrap"),u?a.createElement(a.Fragment,null,a.createElement("span",{className:p,title:i},f?" ":"",l)):a.createElement(a.Fragment,null,a.createElement("div",{className:"mb-2"},a.createElement("span",{className:"font-bold"},i,": "),d?a.createElement("pre",null,l):a.createElement("span",{className:p},l)))}function h(){return h=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},h.apply(null,arguments)}function y(e){const{container:t,nodeIndexesTree:n=[0],containerNumberedTree:r=[1]}=e,{ContinuityOfContent:o,ConceptNameCodeSequence:s}=t,{CodeMeaning:i}=s??{};let c=1;const l=t.ContentSequence?.map((e,t)=>{const{ValueType:s}=e,i=[...n,t],l=i.join(".");let u,d;if("CONTAINER"===s){u=y,d={container:e,nodeIndexesTree:i,containerNumberedTree:[...r,c++]}}else u=I,d={contentItem:e,nodeIndexesTree:i,continuityOfContent:o};return a.createElement(u,h({key:l},d))});return a.createElement("div",null,a.createElement("div",{className:"font-bold"},r.join("."),". ",i),a.createElement("div",{className:"ml-4 mb-2"},l))}function C(e){const{displaySets:t}=e,n=t[0].instances[0];return a.createElement("div",{className:"text-foreground relative flex h-full w-full flex-col overflow-auto p-4"},a.createElement("div",null,a.createElement(y,{container:n})))}I.propTypes={contentItem:o().object,nodeIndexesTree:o().arrayOf(o().number),continuityOfContent:o().string},y.propTypes={container:o().object,nodeIndexesTree:o().arrayOf(o().number),containerNumberedTree:o().arrayOf(o().number)},C.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object,servicesManager:o().object.isRequired,extensionManager:o().instanceOf(s.ExtensionManager).isRequired};const R=C;function D(e){const{displaySets:t}=e,{isImagingMeasurementReport:n}=t[0];return n?a.createElement(m,e):a.createElement(R,e)}D.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object,servicesManager:o().object.isRequired,extensionManager:o().instanceOf(s.ExtensionManager).isRequired};const O=D},193(e,t,n){"use strict";n.d(t,{Ay:()=>c,bY:()=>i,n7:()=>s,sh:()=>a});var r=n(142);const{CodeScheme:o}=r.adaptersSR.Cornerstone3D,a={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"},s={ImagingMeasurementReport:"126000",ImageLibrary:"111028",ImagingMeasurements:"126010",MeasurementGroup:"125007",ImageLibraryGroup:"126200",TrackingUniqueIdentifier:"112040",TrackingIdentifier:"112039",Finding:"121071",FindingSite:"G-C0E3",FindingSiteSCT:"363698007"},i={SRT:"SRT",SCT:"SCT",CornerstoneCodeSchemes:[o.CodingSchemeDesignator,"CST4"]},c={CodeNameCodeSequenceValues:s,CodingSchemeDesignators:i,RelationshipType:{INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},SCOORDTypes:a}},942(e,t,n){"use strict";n.d(t,{eF:()=>s,m1:()=>a});var r=n(557);const o={TrackingUniqueIdentifier:null,trackingIdentifiersByViewportId:{}};function a(e,t,n=0){const a=(0,r.getEnabledElement)(e),{viewport:s}=a;o.trackingIdentifiersByViewportId[s.id]={trackingUniqueIdentifiers:t,activeIndex:n}}function s(e){const t=(0,r.getEnabledElement)(e),{viewport:n}=t;return o.trackingIdentifiersByViewportId[n.id]?o.trackingIdentifiersByViewportId[n.id]:{trackingUniqueIdentifiers:[]}}},291(e,t,n){"use strict";n.d(t,{A:()=>i});var r=n(2);const o=r.classes.ImageSet,a=(e,t)=>{const{displaySetInstanceUID:n,ReferencedSOPInstanceUID:r}=e,o=t.getDisplaySetByUID(n);if(o.images)return o.images.find(e=>e.SOPInstanceUID===r)},s=(e,t)=>{const n=[],r={};for(const o of t.measurements){const{imageId:t}=o;if(!t)continue;if(r[t])continue;const s=a(o,e);s?(r[t]=s,n.push(s)):console.log("Measurement",o,"had no instances found")}return n},i=(e,t)=>{const n=s(e,t),r=new o(n),a=n[0];if(a)return r.setAttributes({displaySetInstanceUID:r.uid,SeriesDate:a.SeriesDate,SeriesTime:a.SeriesTime,SeriesInstanceUID:r.uid,StudyInstanceUID:a.StudyInstanceUID,SeriesNumber:a.SeriesNumber||0,SOPClassUID:a.SOPClassUID,SeriesDescription:`${t.SeriesDescription} KO ${t.instance.SeriesNumber}`,Modality:"KO",isMultiFrame:!1,numImageFrames:n.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,t)),this.numImageFrames=this.images.length}}),e.addDisplaySets(r),r}},856(e,t,n){"use strict";var r=n(183);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,s){if(s!==r){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},598(e,t,n){e.exports=n(856)()},183(e){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},249(e,t){"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),i=Symbol.for("react.provider"),c=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},S=Object.assign,g={};function I(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function h(){}function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}I.prototype.isReactComponent={},I.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},I.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},h.prototype=I.prototype;var C=y.prototype=new h;C.constructor=y,S(C,I.prototype),C.isPureReactComponent=!0;var R=Array.isArray,D=Object.prototype.hasOwnProperty,O={current:null},T={key:!0,ref:!0,__self:!0,__source:!0};function v(e,t,r){var o,a={},s=null,i=null;if(null!=t)for(o in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(s=""+t.key),t)D.call(t,o)&&!T.hasOwnProperty(o)&&(a[o]=t[o]);var c=arguments.length-2;if(1===c)a.children=r;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];a.children=l}if(e&&e.defaultProps)for(o in c=e.defaultProps)void 0===a[o]&&(a[o]=c[o]);return{$$typeof:n,type:e,key:s,ref:i,props:a,_owner:O.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var b=/\/+/g;function w(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(e){return t[e]})}(""+e.key):t.toString(36)}function U(e,t,o,a,s){var i=typeof e;"undefined"!==i&&"boolean"!==i||(e=null);var c=!1;if(null===e)c=!0;else switch(i){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case n:case r:c=!0}}if(c)return s=s(c=e),e=""===a?"."+w(c,0):a,R(s)?(o="",null!=e&&(o=e.replace(b,"$&/")+"/"),U(s,t,o,"",function(e){return e})):null!=s&&(E(s)&&(s=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(s,o+(!s.key||c&&c.key===s.key?"":(""+s.key).replace(b,"$&/")+"/")+e)),t.push(s)),1;if(c=0,a=""===a?".":a+":",R(e))for(var l=0;l<e.length;l++){var u=a+w(i=e[l],l);c+=U(i,t,o,u,s)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),l=0;!(i=e.next()).done;)c+=U(i=i.value,t,o,u=a+w(i,l++),s);else if("object"===i)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return c}function N(e,t,n){if(null==e)return e;var r=[],o=0;return U(e,r,"","",function(e){return t.call(n,e,o++)}),r}function M(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)},function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var P={current:null},x={transition:null},q={ReactCurrentDispatcher:P,ReactCurrentBatchConfig:x,ReactCurrentOwner:O};function V(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:N,forEach:function(e,t,n){N(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return N(e,function(){t++}),t},toArray:function(e){return N(e,function(e){return e})||[]},only:function(e){if(!E(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=I,t.Fragment=o,t.Profiler=s,t.PureComponent=y,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=q,t.act=V,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=S({},e.props),a=e.key,s=e.ref,i=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,i=O.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)D.call(t,l)&&!T.hasOwnProperty(l)&&(o[l]=void 0===t[l]&&void 0!==c?c[l]:t[l])}var l=arguments.length-2;if(1===l)o.children=r;else if(1<l){c=Array(l);for(var u=0;u<l;u++)c[u]=arguments[u+2];o.children=c}return{$$typeof:n,type:e.type,key:a,ref:s,props:o,_owner:i}},t.createContext=function(e){return(e={$$typeof:c,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=v,t.createFactory=function(e){var t=v.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=E,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:M}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=x.transition;x.transition={};try{e()}finally{x.transition=t}},t.unstable_act=V,t.useCallback=function(e,t){return P.current.useCallback(e,t)},t.useContext=function(e){return P.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return P.current.useDeferredValue(e)},t.useEffect=function(e,t){return P.current.useEffect(e,t)},t.useId=function(){return P.current.useId()},t.useImperativeHandle=function(e,t,n){return P.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return P.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return P.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return P.current.useMemo(e,t)},t.useReducer=function(e,t,n){return P.current.useReducer(e,t,n)},t.useRef=function(e){return P.current.useRef(e)},t.useState=function(e){return P.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return P.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return P.current.useTransition()},t.version="18.3.1"},326(e,t,n){"use strict";e.exports=n(249)},142(e){"use strict";e.exports=r},557(e){"use strict";e.exports=a},713(e){"use strict";e.exports=o},2(t){"use strict";t.exports=e},492(e){"use strict";e.exports=c},669(e){"use strict";e.exports=n},545(e){"use strict";e.exports=t},55(e){"use strict";e.exports=i},155(e){"use strict";e.exports=s}},f={};function p(e){var t=f[e];if(void 0!==t)return t.exports;var n=f[e]={exports:{}};return d[e](n,n.exports,p),n.exports}p.m=d,l=[],p.O=(e,t,n,r)=>{if(!t){var o=1/0;for(c=0;c<l.length;c++){for(var[t,n,r]=l[c],a=!0,s=0;s<t.length;s++)(!1&r||o>=r)&&Object.keys(p.O).every(e=>p.O[e](t[s]))?t.splice(s--,1):(a=!1,r<o&&(o=r));if(a){l.splice(c--,1);var i=n();void 0!==i&&(e=i)}}return e}r=r||0;for(var c=l.length;c>0&&l[c-1][2]>r;c--)l[c]=l[c-1];l[c]=[t,n,r]},p.F={},p.E=e=>{Object.keys(p.F).map(t=>{p.F[t](e)})},p.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return p.d(t,{a:t}),t},p.d=(e,t)=>{for(var n in t)p.o(t,n)&&!p.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},p.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),p.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u={524:0},p.F.j=e=>{if(!p.o(u,e)||void 0===u[e]){u[e]=null;var t=document.createElement("link");t.charset="utf-8",p.nc&&t.setAttribute("nonce",p.nc),t.rel="prefetch",t.as="script",t.href=p.p+p.u(e),document.head.appendChild(t)}},p.O.j=e=>0===u[e],p.O(0,[524],()=>{p.E(524)},5);var m={};return(()=>{"use strict";p.r(m),p.d(m,{Enums:()=>u.Ay,createReferencedImageDisplaySet:()=>le.A,default:()=>pe,hydrateStructuredReport:()=>Q,srProtocol:()=>$,toolNames:()=>g});var e=p(326),t=p(2),n=p.n(t),r=p(545),o=p.n(r),a=p(669),s=p(142),i=p(713),c=p(557),l=p(155),u=p(193);const d=1e-4,f=({GraphicData:e,ValueType:t,imageId:n})=>{const r=[];if("SCOORD3D"===t)for(let t=0;t<e.length;t+=3)r.push([e[t],e[t+1],e[t+2]]);else for(let t=0;t<e.length;t+=2){const o=c.utilities.imageToWorldCoords(n,[e[t],e[t+1]]);r.push(o)}return r};const S=function({GraphicType:e,GraphicData:t,ValueType:n,imageId:r}){let o=[];switch(e){case u.sh.POINT:case u.sh.MULTIPOINT:case u.sh.POLYLINE:o=f({GraphicData:t,ValueType:n,imageId:r});break;case u.sh.CIRCLE:{const e=f({GraphicData:t,ValueType:n,imageId:r});if(!r)return e;const a=e[0],s=e[1],i=l.vec3.distance(a,s),u=c.metaData.get("imagePlaneModule",r);if(!u)throw new Error("No imagePlaneModule found");const{columnCosines:d,rowCosines:p}=u,m=l.vec3.create();l.vec3.scaleAndAdd(m,a,d,i);const S=l.vec3.create();l.vec3.scaleAndAdd(S,a,d,-i);const g=l.vec3.create();l.vec3.scaleAndAdd(g,a,p,i);const I=l.vec3.create();l.vec3.scaleAndAdd(I,a,p,-i),o=[m,S,g,I];break}case u.sh.ELLIPSE:{const e=f({GraphicData:t,ValueType:n,imageId:r});if(!r)return e;const a=l.vec3.fromValues(...e[0]),s=l.vec3.fromValues(...e[1]),i=l.vec3.fromValues(...e[2]),u=l.vec3.fromValues(...e[3]),p=l.vec3.create();l.vec3.sub(p,s,a),l.vec3.normalize(p,p);const m=l.vec3.create();l.vec3.sub(m,u,i),l.vec3.normalize(m,m);const S=c.metaData.get("imagePlaneModule",r);if(!S)throw new Error("imageId does not have imagePlaneModule metadata");const{columnCosines:g}=S,I=l.vec3.fromValues(...g),h=Math.abs(l.vec3.dot(I,p)),y=Math.abs(l.vec3.dot(I,m)),C=Math.abs(h),R=Math.abs(y);o=[],Math.abs(C-1)<d?o=[e[0],e[1],e[2],e[3]]:Math.abs(R-1)<d?o=[e[2],e[3],e[0],e[1]]:console.warn("OBLIQUE ELLIPSE NOT YET SUPPORTED");break}default:console.warn("Unsupported GraphicType:",e)}return o},g={DICOMSRDisplay:"DICOMSRDisplay",SRLength:"SRLength",SRBidirectional:"SRBidirectional",SREllipticalROI:"SREllipticalROI",SRCircleROI:"SRCircleROI",SRArrowAnnotate:"SRArrowAnnotate",SRAngle:"SRAngle",SRCobbAngle:"SRCobbAngle",SRRectangleROI:"SRRectangleROI",SRPlanarFreehandROI:"SRPlanarFreehandROI"},{MeasurementReport:I}=s.adaptersSR.Cornerstone3D;function h({measurement:e,imageId:t=null,frameNumber:n=null,displaySet:r}){let o=g.DICOMSRDisplay;const a=e.coords.reduce((e,n)=>(e[n.GraphicType]=e[n.GraphicType]||[],e[n.GraphicType].push(S({...n,imageId:t})),e),{}),{TrackingUniqueIdentifier:s}=e,{ValueType:l,GraphicType:u}=e.coords[0],d=a[u];let f=null,p=null;if(t){const e=c.metaData.get("imagePlaneModule",t);f=e?.frameOfReferenceUID}"SCOORD3D"===l&&(f=e.coords[0].ReferencedFrameOfReferenceSequence,p={FrameOfReferenceUID:f,point:d[0][0]}),e.viewReference={planeRestriction:p,FrameOfReferenceUID:f,referencedImageId:t};const m={annotationUID:s,highlighted:!1,isLocked:!1,isPreview:o===g.DICOMSRDisplay,invalidated:!1,metadata:{toolName:o,planeRestriction:p,valueType:l,graphicType:u,FrameOfReferenceUID:f,referencedImageId:t,displaySetInstanceUID:r.displaySetInstanceUID},data:{label:e.labels?.[0]?.value||void 0,displayText:e.displayText||void 0,handles:{textBox:e.textBox??{},points:d[0]},cachedStats:{},frameNumber:n,renderableData:a,TrackingUniqueIdentifier:s,labels:e.labels}};i.annotation.state.addAnnotation(m)}const{MeasurementReport:y}=s.adaptersSR.Cornerstone3D;const C=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-sr"}').UU,R="dicom-sr",D=`${C}.sopClassHandlerModule.${R}`,O="dicom-sr-3d",T=`${C}.sopClassHandlerModule.${O}`,{sopClassDictionary:v}=t.utils,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:E,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:b}=a.Enums,{MetadataProvider:w}=t.classes,{TEXT_ANNOTATION_POSITION:U,COMMENT_CODE:N,CodeScheme:M}=s.adaptersSR.Cornerstone3D,P=[v.BasicTextSR,v.EnhancedSR,v.ComprehensiveSR,v.Comprehensive3DSR];function x(e,n){return this.instances.push(...e),t.utils.sortStudyInstances(this.instances),this.instance=this.instances[this.instances.length-1],this.isLoaded=!1,this}function q(e,n,r){if(!e||!e.length)throw new Error("No instances were provided");t.utils.sortStudyInstances(e);const a=e[e.length-1],{StudyInstanceUID:s,SeriesInstanceUID:i,SOPInstanceUID:c,SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,ConceptNameCodeSequence:m,SOPClassUID:S,imageId:g}=a;((e,t)=>{t.forEach(t=>{if(t.StudyInstanceUID!==e)throw console.warn("Not all instances have the same UID",e,t),new Error(`Instances ${t.SOPInstanceUID} does not belong to ${e}`)})})(a.StudyInstanceUID,e);const I=S===v.Comprehensive3DSR,h=m?.CodeValue===u.n7.ImagingMeasurementReport,C={Modality:"SR",displaySetInstanceUID:t.utils.guid(),SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,SOPInstanceUID:c,SeriesInstanceUID:i,StudyInstanceUID:s,SOPClassHandlerId:I?T:D,SOPClassUID:S,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,isImagingMeasurementReport:h,sopClassUids:P,instance:a,predecessorImageId:g,addInstances:x,label:l||`${o().t("Series")} ${d} - ${o().t("SR")}`};return C.load=()=>async function(e,n,r){const{displaySetService:o,measurementService:a}=n.services,s=r.getDataSources(),i=s[0],{ContentSequence:c}=e.instance;async function l(t,n=null,r=null){for(const o in t)if("object"==typeof t[o]&&null!==t[o])await l(t[o],t,o);else if(Array.isArray(t[o]))await Promise.all(t[o].map(e=>l(e,t,o)));else if("BulkDataURI"===o){const a=await i.retrieve.bulkDataURI({BulkDataURI:t[o],StudyInstanceUID:e.instance.StudyInstanceUID,SeriesInstanceUID:e.instance.SeriesInstanceUID,SOPInstanceUID:e.instance.SOPInstanceUID});n&&r&&(n[r]=new Float32Array(a))}}!0!==e.isLoaded&&await l(c);e.isImagingMeasurementReport?(e.referencedImages=function(e){const t=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImageLibrary);if(!t)return[];const n=L(t.ContentSequence).find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImageLibraryGroup);if(!n)return[];const r=[];return L(n.ContentSequence).forEach(e=>{const{ReferencedSOPSequence:t}=e;if(t)for(const e of L(t))if(e.ReferencedSOPClassUID){const{ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n}=e;r.push({ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n})}}),r}(c),e.measurements=function(e){const t=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImagingMeasurements);if(!t)return[];const n=function(e){const t={};return e.forEach(e=>{const n=L(e.ContentSequence),r=n.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingUniqueIdentifier);r||console.warn("No Tracking Unique Identifier, skipping ambiguous measurement.");const o=r.UID;void 0===t[o]?t[o]=[...n]:n.forEach(e=>{e.ConceptNameCodeSequence.CodeValue!==u.n7.TrackingUniqueIdentifier&&t[o].push(e)})}),t}(L(t.ContentSequence).filter(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.MeasurementGroup)),r=[];return Object.keys(n).forEach(e=>{const t=function(e){if(e.some(e=>function(e){return"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType}(e)&&!function(e){const t=e.ConceptNameCodeSequence[0];return t&&t.CodeValue===U.value&&t.CodingSchemeDesignator===U.schemeDesignator}(e)))return function(e){const t=e.find(e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType),n=e.find(e=>"UIDREF"===e.ValueType),r=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingIdentifier);if(!t)return void console.warn(`graphic ValueType ${t.ValueType} not currently supported, skipping annotation.`);const o=e.filter(e=>"NUM"===e.ValueType),{ConceptNameCodeSequence:a}=t,{CodeValue:s,CodingSchemeDesignator:i}=a,c=`${i}:${s}`,l=_(t),d="SCOORD3D"===l.ValueType,f=d?3:2,p=l.GraphicData.length/f,m={loaded:!1,labels:[],coords:[l],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue,graphicCode:c,is3DMeasurement:d,pointsLength:p,graphicType:l.GraphicType};o.forEach(e=>{const{ConceptNameCodeSequence:t,MeasuredValueSequence:n}=e;n&&m.labels.push(F(t,n))});const S=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===u.bY.SCT&&e.ConceptNameCodeSequence.CodeValue===u.n7.FindingSiteSCT);S.length&&m.labels.push({label:u.n7.FindingSiteSCT,value:S[0].ConceptCodeSequence.CodeMeaning});return m}(e);return function(e){const t=e.filter(e=>"NUM"===e.ValueType),n=e.find(e=>"UIDREF"===e.ValueType),r=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingIdentifier),o=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.Finding),a=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===u.bY.SRT&&e.ConceptNameCodeSequence.CodeValue===u.n7.FindingSite),s=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===N.schemeDesignator&&e.ConceptNameCodeSequence.CodeValue===N.value),i={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};if(s)for(const e of s)e.TextValue&&i.labels.push({label:e.TextValue,value:""});o&&u.bY.CornerstoneCodeSchemes.includes(o.ConceptCodeSequence.CodingSchemeDesignator)&&o.ConceptCodeSequence.CodeValue===M.codeValues.CORNERSTONEFREETEXT&&i.labels.push({label:M.codeValues.CORNERSTONEFREETEXT,value:o.ConceptCodeSequence.CodeMeaning});if(a.length){const e=a.find(e=>u.bY.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===M.codeValues.CORNERSTONEFREETEXT);e&&i.labels.push({label:M.codeValues.CORNERSTONEFREETEXT,value:e.ConceptCodeSequence.CodeMeaning})}return t.forEach(e=>{const{ConceptNameCodeSequence:t,ContentSequence:n,MeasuredValueSequence:r}=e;if(n){const e=Array.isArray(n)?n.find(e=>("SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType)&&!e.ConceptNameCodeSequence)??n.find(e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType):n;if(!e)return void console.warn("ContentSequence array contains no SCOORD or SCOORD3D entry, skipping annotation.");const{ValueType:t}=e;if("SCOORD"!==t&&"SCOORD3D"!==t)return void console.warn(`Graphic ${t} not currently supported, skipping annotation.`);const r=_(e);r&&i.coords.push(r)}r&&i.labels.push(F(t,r))}),i}(e)}(n[e]);t&&r.push(t)}),r}(c)):(e.referencedImages=[],e.measurements=[]);const{predecessorImageId:d}=e;for(const t of e.measurements)t.predecessorImageId=d;const f=a.getSourceMappings(E,b);e.isHydrated=!1,e.isRehydratable=function(e,t){if(!t||!t.length)return!1;const n=new Set;for(const e of t)n.add(e.annotationType);const{measurements:r}=e;for(let e=0;e<r.length;e++){const t=r[e];if(!t)continue;const{TrackingIdentifier:o="",graphicType:a,graphicCode:s,pointsLength:i}=t;if(!o&&!a){console.warn("No tracking identifier or graphicType for measurement ",t);continue}const c=y.getAdapterForTrackingIdentifier(o),l=y.getAdaptersForTypes(s,a,i),u=c&&n.has(c.toolType)||l&&l.some(e=>n.has(e.toolType));if(u)return!0;console.log("Measurement is not rehydratable",o,r[e])}return console.log("No measurements found which were rehydratable"),!1}(e,f),e.isLoaded=!0;t.utils.sortDisplaySetsCopy(o.activeDisplaySets,{studyInstanceUIDFirst:e.StudyInstanceUID}).forEach(t=>{k(e,t,i,n)}),o.subscribe(o.EVENTS.DISPLAY_SETS_ADDED,t=>{const{displaySetsAdded:r}=t;r.forEach(t=>{k(e,t,i,n)})})}(C,n,r),[C]}function V({measurement:e,displaySet:t}){return e.coords[0].ReferencedFrameOfReferenceSequence===t.FrameOfReferenceUID}function k(e,t,n,r){const{customizationService:o}=r.services,a=e.measurements.filter(e=>!1===e.loaded);if(!a.length||t.unsupported)return;const s=new Map,i=n.getImageIdsForDisplaySet(t);for(const e of i){const{SOPInstanceUID:t,frameNumber:n}=w.getUIDsFromImageID(e),r=`${t}:${n||1}`;s.set(r,e)}if(!a?.length)return;const c=e.SOPClassUID===v.Comprehensive3DSR;for(let n=a.length-1;n>=0;n--){let r=a[n];const i="SCOORD3D"===r.coords?.[0]?.ValueType,l=o.getCustomization("onBeforeSRAddMeasurement");if("function"==typeof l&&(r=l({measurement:r,StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID})),c&&i&&V({measurement:r,displaySet:t})){h({measurement:r,displaySet:t}),r.loaded=!0,r.displaySetInstanceUID=t.displaySetInstanceUID,a.splice(n,1);continue}const u=r.coords[0].ReferencedSOPSequence;if(!u)continue;const{ReferencedSOPInstanceUID:d}=u,f=u.ReferencedFrameNumber||1,p=`${d}:${f}`,m=s.get(p);m&&A(r,d,f)&&(h({measurement:r,imageId:m,frameNumber:f,displaySet:t}),r.loaded=!0,r.imageId=m,r.displaySetInstanceUID=t.displaySetInstanceUID,r.ReferencedSOPInstanceUID=d,r.frameNumber=f,a.splice(n,1))}}function A(e,t,n){const{coords:r}=e,o=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence?.ReferencedFrameNumber||1;if(n&&Number(n)!==Number(o))return!1;for(let e=0;e<r.length;e++){const n=r[e],{ReferencedSOPInstanceUID:o}=n.ReferencedSOPSequence;if(o===t)return!0}return!1}const _=e=>{const{ValueType:t,GraphicType:n,GraphicData:r}=e,o={ValueType:t,GraphicType:n,GraphicData:r};return o.ReferencedSOPSequence=e.ContentSequence?.ReferencedSOPSequence,o.ReferencedFrameOfReferenceSequence=e.ReferencedFrameOfReferenceUID||e.ContentSequence?.ReferencedFrameOfReferenceSequence,o};function F(e,t){const{CodeMeaning:n}=e,{NumericValue:r,MeasurementUnitsCodeSequence:o}=t,{CodeValue:a}=o;return{label:n,value:`${r?Number(r).toFixed(2):""} ${a}`}}function L(e){return e?Array.isArray(e)?e:[e]:[]}const j=function(e){const{servicesManager:t,extensionManager:n}=e,r=e=>q(e,t,n);return[{name:R,sopClassUids:P,getDisplaySetsFromSeries:r},{name:O,sopClassUids:[v.Comprehensive3DSR],getDisplaySetsFromSeries:r}]},$={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"}]}]}]};const B=function(e,t){const n={};function r(r,o){const a=r.metadata?.referencedImageId??s.NO_IMAGE_ID;n[a]||(n[a]={});const i=n[a];i[o]||(i[o]={data:[]});const c=e.find(e=>e.uid===r.annotationUID),l=i[o].data;let{finding:u}=c;const d=[];c.label&&(t.includes(o)?u={CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:c.label}:d.push({CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:c.label})),c.findingSites&&d.push(...c.findingSites);const f=Object.assign({},r,{finding:u,findingSites:d});l.push(f)}const o=e.map(e=>e.uid).slice(),a=i.annotation.state.getAnnotationManager(),c=a.getFramesOfReference();for(let e=0;e<c.length;e++){const t=c[e],s=a.getAnnotations(t),i=Object.keys(s);for(let e=0;e<i.length;e++){const t=i[e],a=s[t];if(a)for(let e=0;e<a.length;e++){const s=a[e],i=o.findIndex(e=>e===s.annotationUID);if(-1!==i&&(r(s,t),o.splice(i,1),!o.length))return n}}}return n},{CodeScheme:G}=s.adaptersSR.Cornerstone3D;const{locking:H}=i.annotation,{guid:z}=n().utils,{MeasurementReport:W}=s.adaptersSR.Cornerstone3D,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:Y,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:X}=a.Enums,J=(e,t)=>{if(!t||"CORNERSTONEJS"===t.CodingSchemeDesignator)return;const n=`${t.CodingSchemeDesignator}:${t.CodeValue}`;return{...e[n],ref:n,...t,text:t.CodeMeaning}},K=(e,t)=>{if(!t||!t.length)return;const n=[];for(let r=0;r<t.length;r++){const o=J(e,t[r][0]||t[r]);o&&n.push(o)}return n.length&&n||void 0};function Q({servicesManager:e,extensionManager:n,commandsManager:r},o){const a=n.getActiveDataSource()[0],{measurementService:s,displaySetService:i,customizationService:l}=e.services,u=l.getCustomization("codingValues"),d=l.getCustomization("panelMeasurement.disableEditing"),f=i.getDisplaySetByUID(o),{StudyInstanceUID:p,SeriesInstanceUID:m,instance:{SOPInstanceUID:S}}=f,g=s.getSourceMappings(Y,X);if(!g||!g.length)throw new Error("Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.");const I=t.DicomMetadataStore.getInstance(p,m,S),h={};f.measurements.forEach(e=>{const{ReferencedSOPInstanceUID:t,imageId:n,frameNumber:r=1}=e,o=`${t}:${r}`;n&&!h[o]&&(h[o]=n)});const y=I;let C=W.generateToolState(y,h,c.metaData);const R=l.getCustomization("onBeforeSRHydration")?.value;"function"==typeof R&&(C=R({storedMeasurementByAnnotationType:C,displaySet:f}));const D=g.map(e=>e.annotationType),O={};let T;Object.keys(C).forEach(e=>{D.includes(e)&&(O[e]=C[e])});const v=[],E=function(e,t){const n=[];return Object.keys(e).forEach(r=>{e[r].forEach(e=>{const r=e.annotation.data?.frameNumber||1,o=t[`${e.sopInstanceUid}:${r}`];o&&!n.includes(o)&&n.push(o)})}),n}(O,h);for(const e of E){const{SeriesInstanceUID:t,StudyInstanceUID:n}=c.metaData.get("instance",e);v.includes(t)||v.push(t),T?T!==n&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):T=n}const b=function(e,t){const n=[];return Object.keys(e).forEach(r=>{e[r].forEach(e=>{const r=e.annotation.data?.frameNumber||1;if(!t[`${e.sopInstanceUid}:${r}`]){const{FrameOfReferenceUID:t}=e.annotation.metadata;t&&!n.includes(t)&&n.push(t)}})}),n}(O,h);for(const e of b){const t=i.getDisplaySetsBy(t=>t.FrameOfReferenceUID===e&&!t.isDerivedDisplaySet),n=Z(t,e);n&&(v.includes(n.SeriesInstanceUID)||v.push(n.SeriesInstanceUID),T?T!==n.StudyInstanceUID&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):T=n.StudyInstanceUID)}function w(t){const n=t.annotation.data&&t.annotation.data.frameNumber||1,r=h[`${t.sopInstanceUid}:${n}`];if(!r)return function(e,t){const{FrameOfReferenceUID:n}=e.annotation.metadata,{points:r}=e.annotation.data.handles,{displaySetService:o}=t.services,a=o.getDisplaySetsBy(e=>e.FrameOfReferenceUID===n);if(!a.length||!r?.length)return{FrameOfReferenceUID:n};const s=Z(a,e.annotation),i={...ee(s,r),volumeId:s.displaySetInstanceUID,FrameOfReferenceUID:n};return c.utilities.updatePlaneRestriction(r,i),i}(t,e);const o=c.metaData.get("instance",r),{FrameOfReferenceUID:a}=o;return{referencedImageId:r,FrameOfReferenceUID:a}}return Object.keys(O).forEach(e=>{O[e].forEach(t=>{t.uid=z();const n=w(t),{referencedImageId:o}=n,i={annotationUID:t.annotation.annotationUID,data:t.annotation.data,predecessorImageId:t.predecessorImageId,metadata:{...n,toolName:e}};c.utilities.updatePlaneRestriction(i.data.handles.points,i.metadata);const l=s.getSource(Y,X);i.data.label=function(e){const{findingSites:t=[],finding:n,annotation:r}=e;if(r.data.label)return r.data.label;let o=t.find(e=>e.CodeValue===G.codeValues.CORNERSTONEFREETEXT);return o?o.CodeMeaning:n&&n.CodeValue===G.codeValues.CORNERSTONEFREETEXT?n.CodeMeaning:void 0}(t),i.data.finding=J(u,t.finding?.[0]),i.data.findingSites=K(u,t.findingSites),i.data.findingSites?.forEach(e=>{e.type&&(i.data[e.type]=e)});const f=g.find(t=>t.annotationType===e),p=s.addRawMeasurement(l,e,{annotation:i},f.toMeasurementSchema,a);r.runCommand("updateMeasurement",{uid:p,code:i.data.finding}),d&&H.setAnnotationLocked(p,!0),o&&!E.includes(o)&&E.push(o)})}),f.isHydrated=!0,{StudyInstanceUID:T,SeriesInstanceUIDs:v}}function Z(e,t){if(!e?.length)return void console.warn("No display set found for",t);if(1===e.length)return e[0];const n=e.find(e=>e.isReconstructable);return n||e[0]}function ee(e,t){const n=function(e){if(1===e.length||2===e.length)return e;const t=0,n=Math.ceil(e.length/4),r=Math.ceil(e.length/2),o=[e[t],e[n],e[r]];return o}(t),r=function(e){const t=1/e.length,n=l.vec3.create();for(const r of e)l.vec3.scaleAndAdd(n,n,r,t);return n}(n);return{cameraFocalPoint:r,viewPlaneNormal:null,viewUp:null}}const{MeasurementReport:te}=s.adaptersSR.Cornerstone3D,{log:ne}=n(),re=e=>{const{servicesManager:t,extensionManager:n,commandsManager:r}=e,{customizationService:o}=t.services,a={changeColorMeasurement:({uid:e})=>{throw new Error("Unsupported operation: changeColorMeasurement")},storeMeasurements:async({measurementData:e,dataSource:t,additionalFindingTypes:n,options:a={}})=>{ne.info("[DICOMSR] storeMeasurements");const s=r.runCommand("createStoreFunction",{dataSource:t,defaultFileName:"dicom-sr.dcm"});if(!s)return ne.error("[DICOMSR] No valid store for dataSource:",t),Promise.reject({});try{const t=((e,t,n={})=>{const r=B(e,t),o=te.generateReport(r,c.metaData,n),{dataset:a}=o;return void 0===a.SpecificCharacterSet&&(a.SpecificCharacterSet="ISO_IR 192"),a})(e,n,a),{ContentSequence:r}=t;if(!r?.[4]?.ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",t),new Error("Invalid report, no content");if(!t.SOPClassUID)throw new Error("No sop class uid");const i=o.getCustomization("onBeforeDicomStore");let l;return"function"==typeof i&&(l=i({dicomDict:l,measurementData:e,naturalizedReport:t})),await s(t,{measurementData:e,dicomDict:l}),t}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.")}},hydrateStructuredReport:({displaySetInstanceUID:e})=>Q({servicesManager:t,extensionManager:n,commandsManager:r},e)};return{actions:a,definitions:{storeMeasurements:a.storeMeasurements,hydrateStructuredReport:a.hydrateStructuredReport},defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};var oe=p(942);class ae extends i.AnnotationTool{constructor(e={},t={configuration:{}}){super(e,t),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{const{viewport:n}=e,{element:r}=n;let o=i.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;if(o=this.filterInteractableAnnotationsForElement(r,o),!o?.length)return;const a=(0,oe.eF)(r),{activeIndex:s,trackingUniqueIdentifiers:c}=a,l=c[s],d=o.filter(e=>c.includes(e.data?.TrackingUniqueIdentifier));if(!n._actors?.size)return;const f={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},{style:p}=i.annotation.config;for(let e=0;e<d.length;e++){const r=d[e],o=r.annotationUID,{renderableData:a,TrackingUniqueIdentifier:s}=r.data,{referencedImageId:c}=r.metadata;f.annotationUID=o;const m=p.getToolGroupToolStyles(this.toolGroupId)[this.getToolName()],S=this.getStyle("lineWidth",f,r),g=this.getStyle("lineDash",f,r),I={color:s===l?"rgb(0, 255, 0)":this.getStyle("color",f,r),lineDash:g,lineWidth:S,...m};Object.keys(a).forEach(e=>{const s=a[e];let l,d;switch(e){case u.sh.POINT:l=this.renderPoint;break;case u.sh.MULTIPOINT:l=this.renderMultipoint;break;case u.sh.POLYLINE:l=this.renderPolyLine;break;case u.sh.CIRCLE:l=this.renderEllipse;break;case u.sh.ELLIPSE:l=this.renderEllipse,d=i.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const p=l(t,n,s,o,c,I);this.renderTextBox(t,n,p,d,r,f,I)})}}}_getTextBoxLinesFromLabels(e){const t=Math.min(e.length,5),n=[];for(let r=0;r<t;r++){const t=e[r];n.push(`${ie(t.label)}: ${t.value}`)}return n}renderPolyLine(e,t,n,r,o,a){const s={color:a.color,width:a.lineWidth,lineDash:a.lineDash};let c=[];return n.map((n,o)=>{const a=n.map(e=>t.worldToCanvas(e)),l=`${o}`;2===a.length?i.drawing.drawLine(e,r,l,a[0],a[1],s):i.drawing.drawPolyline(e,r,l,a,s),c=c.concat(a)}),c}renderMultipoint(e,t,n,r,o,a){let s;n.map((n,o)=>{s=n.map(e=>t.worldToCanvas(e));i.drawing.drawHandles(e,r,"0",s,{color:a.color})})}renderPoint(e,t,n,r,o,a){const s=[];return n.map((n,l)=>{const u=n[0];if(s.push(t.worldToCanvas(u)),void 0!==n[1])s.push(t.worldToCanvas(n[1]));else{const e=c.metaData.get("imagePixelModule",o);let n=10,r=10;if(e){const{columns:t,rows:o}=e;n=t/10,r=o/10}const a=c.utilities.worldToImageCoords(o,u),i=c.utilities.imageToWorldCoords(o,[a[0]+n,a[1]+r]);s.push(t.worldToCanvas(i))}const d=`${l}`;i.drawing.drawArrow(e,r,d,s[1],s[0],{color:a.color,width:a.lineWidth})}),s}renderEllipse(e,t,n,r,o,a){let s;return n.map((n,o)=>{if(0===n.length)return;const c=n,l=t.getRotation();let u;s=c.map(e=>t.worldToCanvas(e)),u=90==l||270==l?i.utilities.math.ellipse.getCanvasEllipseCorners([s[2],s[3],s[0],s[1]]):i.utilities.math.ellipse.getCanvasEllipseCorners(s);const d=`${o}`;i.drawing.drawEllipse(e,r,d,u[0],u[1],{color:a.color,width:a.lineWidth,lineDash:a.lineDash})}),s}renderTextBox(e,t,n,r,o,a,s={}){if(!n||!o)return;const{annotationUID:c,data:l={}}=o,{labels:u}=l,{color:d}=s;let f=n;"function"==typeof r&&(f=r(n));const p=this._getTextBoxLinesFromLabels(u),m=i.utilities.drawing.getTextBoxCoordsCanvas(f);o.data?.handles?.textBox?.worldPosition||(o.data.handles.textBox.worldPosition=t.canvasToWorld(m));const S=t.worldToCanvas(o.data.handles.textBox.worldPosition),g=this.getLinkedTextBoxStyle(a,o),I=i.drawing.drawLinkedTextBox(e,c,"1",p,S,n,{},{...g,color:d}),{x:h,y,width:C,height:R}=I;o.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([h,y]),topRight:t.canvasToWorld([h+C,y]),bottomLeft:t.canvasToWorld([h,y+R]),bottomRight:t.canvasToWorld([h+C,y+R])}}}ae.toolName=g.DICOMSRDisplay;const se={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function ie(e){const t=se[e];return void 0!==t?t:e}function ce(e,t,n={}){class r extends t{constructor(e,t){e.configuration=e.configuration?{...e.configuration,...n}:n,super(e,t)}}r.toolName=e,(0,i.addTool)(r)}var le=p(291);function ue(){return ue=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},ue.apply(null,arguments)}const de=e.lazy(()=>Promise.resolve().then(p.bind(p,525))),fe=t=>e.createElement(e.Suspense,{fallback:e.createElement("div",null,"Loading...")},e.createElement(de,t)),pe={id:C,onModeEnter:function({servicesManager:e}){const{displaySetService:t}=e.services;[...t.getDisplaySetCache().values()].filter(e=>e.SOPClassHandlerId===D||e.SOPClassHandlerId===T).forEach(e=>{e.isHydrated=!1})},preRegistration:function({configuration:e={},servicesManager:t}){ce(g.DICOMSRDisplay,ae),ce(g.SRLength,i.LengthTool),ce(g.SRBidirectional,i.BidirectionalTool),ce(g.SREllipticalROI,i.EllipticalROITool),ce(g.SRCircleROI,i.CircleROITool),ce(g.SRArrowAnnotate,i.ArrowAnnotateTool),ce(g.SRAngle,i.AngleTool),ce(g.SRPlanarFreehandROI,i.PlanarFreehandROITool),ce(g.SRRectangleROI,i.RectangleROITool),ce(g.SRCobbAngle,i.CobbAngleTool);const n={lineDash:"4,4"};i.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{[g.DICOMSRDisplay]:n,SRLength:n,SRBidirectional:n,SREllipticalROI:n,SRCircleROI:n,SRArrowAnnotate:n,SRCobbAngle:n,SRAngle:n,SRPlanarFreehandROI:n,SRRectangleROI:n,global:{}})},getViewportModule:({servicesManager:t,extensionManager:n})=>[{name:"dicom-sr",component:r=>e.createElement(fe,ue({servicesManager:t,extensionManager:n},r))}],getCommandsModule:re,getSopClassHandlerModule:j,getUtilityModule:({servicesManager:e})=>[{name:"tools",exports:{toolNames:g}}]}})(),m=p.O(m)})());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ohif/extension-cornerstone-dicom-sr",
3
- "version": "3.13.0-beta.7",
3
+ "version": "3.13.0-beta.70",
4
4
  "description": "OHIF extension for an SR Cornerstone Viewport",
5
5
  "author": "OHIF",
6
6
  "license": "MIT",
@@ -34,10 +34,10 @@
34
34
  "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
35
35
  },
36
36
  "peerDependencies": {
37
- "@ohif/core": "3.13.0-beta.7",
38
- "@ohif/extension-cornerstone": "3.13.0-beta.7",
39
- "@ohif/extension-measurement-tracking": "3.13.0-beta.7",
40
- "@ohif/ui": "3.13.0-beta.7",
37
+ "@ohif/core": "3.13.0-beta.70",
38
+ "@ohif/extension-cornerstone": "3.13.0-beta.70",
39
+ "@ohif/extension-measurement-tracking": "3.13.0-beta.70",
40
+ "@ohif/ui": "3.13.0-beta.70",
41
41
  "dcmjs": "0.49.4",
42
42
  "dicom-parser": "1.8.21",
43
43
  "hammerjs": "2.0.8",
@@ -46,9 +46,9 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@babel/runtime": "7.28.2",
49
- "@cornerstonejs/adapters": "4.15.29",
50
- "@cornerstonejs/core": "4.15.29",
51
- "@cornerstonejs/tools": "4.15.29",
49
+ "@cornerstonejs/adapters": "4.22.3",
50
+ "@cornerstonejs/core": "4.22.3",
51
+ "@cornerstonejs/tools": "4.22.3",
52
52
  "classnames": "2.5.1"
53
53
  }
54
54
  }