@ohif/extension-cornerstone-dicom-sr 3.13.0-beta.9 → 3.13.0-beta.93

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 @@
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)})());
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("@cornerstonejs/adapters"),require("gl-matrix"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/core"),require("@ohif/i18n"),require("@cornerstonejs/tools"),require("@ohif/ui-next"),require("@ohif/core/src/contextProviders/SystemProvider")):"function"==typeof define&&define.amd?define(["@ohif/core","@cornerstonejs/adapters","gl-matrix","@ohif/extension-cornerstone","@cornerstonejs/core","@ohif/i18n","@cornerstonejs/tools","@ohif/ui-next","@ohif/core/src/contextProviders/SystemProvider"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-sr"]=t(require("@ohif/core"),require("@cornerstonejs/adapters"),require("gl-matrix"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/core"),require("@ohif/i18n"),require("@cornerstonejs/tools"),require("@ohif/ui-next"),require("@ohif/core/src/contextProviders/SystemProvider")):e["ohif-extension-cornerstone-dicom-sr"]=t(e["@ohif/core"],e["@cornerstonejs/adapters"],e["gl-matrix"],e["@ohif/extension-cornerstone"],e["@cornerstonejs/core"],e["@ohif/i18n"],e["@cornerstonejs/tools"],e["@ohif/ui-next"],e["@ohif/core/src/contextProviders/SystemProvider"])}(globalThis,(e,t,n,r,a,o,i,s,l)=>(()=>{var c,u,d={954(e,t,n){"use strict";n.r(t),n.d(t,{default:()=>O});var r=n(598),a=n.n(r),o=n(326),i=n(2),s=n(963),l=n(154),c=n(669),u=n(55),d=n(492);function p(){return(p=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}).apply(null,arguments)}function f(e){let{servicesManager:t}=(0,d.useSystem)(),{children:n,dataSource:r,displaySets:a,viewportOptions:i}=e,{displaySetService:l}=t.services,f=i.viewportId;if(a.length>1)throw Error("SR viewport should only have a single display set");let S=a[0],{setPositionPresentation:g}=(0,c.usePositionPresentationStore)(),[h,I]=(0,u.useViewportGrid)(),[y,R]=(0,o.useState)(0),[C,O]=(0,o.useState)(null),[E,D]=(0,o.useState)(null),[T,v]=(0,o.useState)(null),{viewports:b,activeViewportId:w}=h,N=(0,o.useCallback)(e=>{let{measurements:t}=S;(0,s.m1)(T,t.map(e=>e.TrackingUniqueIdentifier),e)},[T,y,S]),U=(0,o.useCallback)(e=>{let{StudyInstanceUID:t,displaySetInstanceUID:n}=S;t&&n&&m(S,e,l).then(({referencedDisplaySet:t,referencedDisplaySetMetadata:n})=>{if(!t||!n)return;R(e),O(t),D(n);let{presentationIds:r}=i,a=S.measurements[e];g(r.positionPresentationId,{viewReference:a.viewReference||{referencedImageId:a.imageId}})})},[r,S,C,f]),P=(0,o.useCallback)(()=>{if(!C)return null;let{measurements:t}=S;return t[y]?o.createElement(c.OHIFCornerstoneViewport,p({},e,{displaySets:[C],viewportOptions:{...i,toolGroupId:"SRToolGroup",viewportType:"stack",positionIds:null},onElementEnabled:t=>{e.onElementEnabled?.(t),v(t.detail.element)},isJumpToMeasurementDisabled:!0})):null},[C,f,y]);(0,o.useEffect)(()=>{let e=l.subscribe(l.EVENTS.DISPLAY_SETS_REMOVED,({displaySetInstanceUIDs:e})=>{let t=b.get(w);e.includes(t.displaySetInstanceUID)&&I.setDisplaySetsForViewport({viewportId:w,displaySetInstanceUIDs:[]})});return()=>{e.unsubscribe()}},[]),(0,o.useEffect)(()=>{(async()=>{S.isLoaded||await S.load(),U(y)})()},[S]),(0,o.useEffect)(()=>{(async()=>{S.isLoaded||await S.load(),T&&S.isLoaded&&N(y)})()},[y,T,N,S]);let M=null;return C&&E?(n&&n.length&&(M=n.map((e,t)=>e&&o.cloneElement(e,{viewportId:f,key:t}))),o.createElement(o.Fragment,null,o.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},P(),M))):null}async function m(e,t,n){let{measurements:r}=e,{displaySetInstanceUID:a}=r[t];if(e.keyImageDisplaySet||(e.keyImageDisplaySet=(0,l.A)(n,e)),!a)return{referencedDisplaySetMetadata:null,referencedDisplaySet:null};let o=n.getDisplaySetByUID(a);if(!o?.images)return{referencedDisplaySetMetadata:null,referencedDisplaySet:null};let i=o.images[0];return{referencedDisplaySetMetadata:{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},referencedDisplaySet:o}}f.propTypes={displaySets:a().arrayOf(a().object),viewportId:a().string.isRequired,dataSource:a().object,children:a().node,viewportLabel:a().string,viewportOptions:a().object};var S=n(548);let g={TEXT:e=>e.TextValue,CODE:e=>e.ConceptCodeSequence?.[0]?.CodeMeaning,UIDREF:e=>e.UID,NUM:e=>{let t=e.MeasuredValueSequence?.[0];if(!t)return;let{NumericValue:n,MeasurementUnitsCodeSequence:r}=t,{CodeValue:a}=r;return`${n} ${a}`},PNAME:e=>{let t=e.PersonName?.[0];return t?i.utils.formatPN(t):void 0},DATE:e=>{let{Date:t}=e;return t?i.utils.formatDate(t):void 0},TIME:e=>{let{Time:t}=e;return t?i.utils.formatTime(t):void 0},DATETIME:e=>{let{DateTime:t}=e;if("string"!=typeof t)return;if(t.length<14)return t;let n=t.substring(0,8),r=t.substring(8,14),a=i.utils.formatDate(n),o=i.utils.formatTime(r);return`${a} ${o}`}};function h(e){let{contentItem:t,nodeIndexesTree:n,continuityOfContent:r}=e,{ConceptNameCodeSequence:a}=t,{CodeValue:i,CodeMeaning:s}=a,l=0===n[n.length-1],c=function(e){let{ValueType:t}=e,n=g[t];return n?n(e):`[${t} is not supported]`}(t)??"[empty]",u="CONTINUOUS"===r,d=i===S.n7.Finding,p=u&&!l&&/^[a-zA-Z0-9]/.test(c?.[0]),f="whitespace-pre-line";return(i===S.n7.Finding&&(f="whitespace-pre-wrap"),u)?o.createElement(o.Fragment,null,o.createElement("span",{className:f,title:s},p?" ":"",c)):o.createElement(o.Fragment,null,o.createElement("div",{className:"mb-2"},o.createElement("span",{className:"font-bold"},s,": "),d?o.createElement("pre",null,c):o.createElement("span",{className:f},c)))}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}).apply(null,arguments)}function y(e){let{container:t,nodeIndexesTree:n=[0],containerNumberedTree:r=[1]}=e,{ContinuityOfContent:a,ConceptNameCodeSequence:i}=t,{CodeMeaning:s}=i??{},l=1,c=t.ContentSequence?.map((e,t)=>{let i,s,{ValueType:c}=e,u=[...n,t],d=u.join(".");if("CONTAINER"===c){let t=[...r,l++];i=y,s={container:e,nodeIndexesTree:u,containerNumberedTree:t}}else i=h,s={contentItem:e,nodeIndexesTree:u,continuityOfContent:a};return o.createElement(i,I({key:d},s))});return o.createElement("div",null,o.createElement("div",{className:"font-bold"},r.join("."),". ",s),o.createElement("div",{className:"ml-4 mb-2"},c))}function R(e){let{displaySets:t}=e,n=t[0].instances[0];return o.createElement("div",{className:"text-foreground relative flex h-full w-full flex-col overflow-auto p-4"},o.createElement("div",null,o.createElement(y,{container:n})))}function C(e){let{displaySets:t}=e,{isImagingMeasurementReport:n}=t[0];return n?o.createElement(f,e):o.createElement(R,e)}h.propTypes={contentItem:a().object,nodeIndexesTree:a().arrayOf(a().number),continuityOfContent:a().string},y.propTypes={container:a().object,nodeIndexesTree:a().arrayOf(a().number),containerNumberedTree:a().arrayOf(a().number)},R.propTypes={displaySets:a().arrayOf(a().object),viewportId:a().string.isRequired,dataSource:a().object,children:a().node,viewportLabel:a().string,viewportOptions:a().object,servicesManager:a().object.isRequired,extensionManager:a().instanceOf(i.ExtensionManager).isRequired},C.propTypes={displaySets:a().arrayOf(a().object),viewportId:a().string.isRequired,dataSource:a().object,children:a().node,viewportLabel:a().string,viewportOptions:a().object,servicesManager:a().object.isRequired,extensionManager:a().instanceOf(i.ExtensionManager).isRequired};let O=C},548(e,t,n){"use strict";n.d(t,{Ay:()=>s,bY:()=>i,n7:()=>o,sh:()=>a});let{CodeScheme:r}=n(142).adaptersSR.Cornerstone3D,a={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"},o={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:[r.CodingSchemeDesignator,"CST4"]},s={CodeNameCodeSequenceValues:o,CodingSchemeDesignators:i,RelationshipType:{INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},SCOORDTypes:a}},963(e,t,n){"use strict";n.d(t,{eF:()=>i,m1:()=>o});var r=n(557);let a={};function o(e,t,n=0){let{viewport:i}=(0,r.getEnabledElement)(e);a[i.id]={trackingUniqueIdentifiers:t,activeIndex:n}}function i(e){let{viewport:t}=(0,r.getEnabledElement)(e);return a[t.id]?a[t.id]:{trackingUniqueIdentifiers:[]}}},154(e,t,n){"use strict";n.d(t,{A:()=>i});let r=n(2).classes.ImageSet,a=(e,t)=>{let{displaySetInstanceUID:n,ReferencedSOPInstanceUID:r}=e,a=t.getDisplaySetByUID(n);if(a.images)return a.images.find(e=>e.SOPInstanceUID===r)},o=(e,t)=>{let n=[],r={};for(let o of t.measurements){let{imageId:t}=o;if(!t||r[t])continue;let i=a(o,e);if(!i){console.log("Measurement",o,"had no instances found");continue}r[t]=i,n.push(i)}return n},i=(e,t)=>{let n=o(e,t),a=new r(n),i=n[0];if(i)return a.setAttributes({displaySetInstanceUID:a.uid,SeriesDate:i.SeriesDate,SeriesTime:i.SeriesTime,SeriesInstanceUID:a.uid,StudyInstanceUID:i.StudyInstanceUID,SeriesNumber:i.SeriesNumber||0,SOPClassUID:i.SOPClassUID,SeriesDescription:`${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,...o(e,t)),this.numImageFrames=this.images.length}}),e.addDisplaySets(a),a}},856(e,t,n){"use strict";var r=n(183);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var s=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 s.name="Invariant Violation",s}}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:o,resetWarningCache:a};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"),a=Symbol.for("react.fragment"),o=(Symbol.for("react.strict_mode"),Symbol.for("react.profiler"),Symbol.for("react.provider"),Symbol.for("react.context"),Symbol.for("react.forward_ref"),Symbol.for("react.suspense")),i=(Symbol.for("react.memo"),Symbol.for("react.lazy")),s=Symbol.iterator,l={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},c=Object.assign,u={};function d(e,t,n){this.props=e,this.context=t,this.refs=u,this.updater=n||l}function p(){}function f(e,t,n){this.props=e,this.context=t,this.refs=u,this.updater=n||l}d.prototype.isReactComponent={},d.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")},d.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},p.prototype=d.prototype;var m=f.prototype=new p;m.constructor=f,c(m,d.prototype),m.isPureReactComponent=!0;var S=Array.isArray,g=Object.prototype.hasOwnProperty,h=null,I={key:!0,ref:!0,__self:!0,__source:!0};function y(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 R=null;t.Fragment=a,t.Suspense=o,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 a=c({},e.props),o=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=h),void 0!==t.key&&(o=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(u in t)g.call(t,u)&&!I.hasOwnProperty(u)&&(a[u]=void 0===t[u]&&void 0!==l?l[u]:t[u])}var u=arguments.length-2;if(1===u)a.children=r;else if(1<u){l=Array(u);for(var d=0;d<u;d++)l[d]=arguments[d+2];a.children=l}return{$$typeof:n,type:e.type,key:o,ref:i,props:a,_owner:s}},t.createElement=function(e,t,r){var a,o={},i=null,s=null;if(null!=t)for(a in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)g.call(t,a)&&!I.hasOwnProperty(a)&&(o[a]=t[a]);var l=arguments.length-2;if(1===l)o.children=r;else if(1<l){for(var c=Array(l),u=0;u<l;u++)c[u]=arguments[u+2];o.children=c}if(e&&e.defaultProps)for(a in l=e.defaultProps)void 0===o[a]&&(o[a]=l[a]);return{$$typeof:n,type:e,key:i,ref:s,props:o,_owner:h}},t.lazy=function(e){return{$$typeof:i,_payload:{_status:-1,_result:e},_init:y}},t.useCallback=function(e,t){return R.useCallback(e,t)},t.useEffect=function(e,t){return R.useEffect(e,t)},t.useState=function(e){return R.useState(e)}},326(e,t,n){"use strict";e.exports=n(249)},142(e){"use strict";e.exports=t},557(e){"use strict";e.exports=a},713(e){"use strict";e.exports=i},2(t){"use strict";t.exports=e},492(e){"use strict";e.exports=l},669(e){"use strict";e.exports=r},545(e){"use strict";e.exports=o},55(e){"use strict";e.exports=s},155(e){"use strict";e.exports=n}},p={};function f(e){var t=p[e];if(void 0!==t)return t.exports;var n=p[e]={exports:{}};return d[e](n,n.exports,f),n.exports}f.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return f.d(t,{a:t}),t},f.d=(e,t)=>{for(var n in t)f.o(t,n)&&!f.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},f.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),f.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c=[],f.O=(e,t,n,r)=>{if(t){r=r||0;for(var a=c.length;a>0&&c[a-1][2]>r;a--)c[a]=c[a-1];c[a]=[t,n,r];return}for(var o=1/0,a=0;a<c.length;a++){for(var[t,n,r]=c[a],i=!0,s=0;s<t.length;s++)(!1&r||o>=r)&&Object.keys(f.O).every(e=>f.O[e](t[s]))?t.splice(s--,1):(i=!1,r<o&&(o=r));if(i){c.splice(a--,1);var l=n();void 0!==l&&(e=l)}}return e},f.F={},f.E=e=>{Object.keys(f.F).map(t=>{f.F[t](e)})},u={509:0},f.F.j=e=>{if(!f.o(u,e)||void 0===u[e]){u[e]=null;var t=document.createElement("link");f.nc&&t.setAttribute("nonce",f.nc),t.rel="prefetch",t.as="script",t.href=f.p+f.u(e),document.head.appendChild(t)}},f.O.j=e=>0===u[e],f.O(0,[509],()=>{[509].map(f.E)},5);var m={};return(()=>{"use strict";f.r(m),f.d(m,{Enums:()=>u.Ay,createReferencedImageDisplaySet:()=>et.A,default:()=>eo,hydrateStructuredReport:()=>z,srProtocol:()=>L,toolNames:()=>S});var e=f(326),t=f(2),n=f.n(t),r=f(545),a=f.n(r),o=f(669),i=f(142),s=f(713),l=f(557),c=f(155),u=f(548);let d=({GraphicData:e,ValueType:t,imageId:n})=>{let 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){let a=l.utilities.imageToWorldCoords(n,[e[t],e[t+1]]);r.push(a)}return r},p=function({GraphicType:e,GraphicData:t,ValueType:n,imageId:r}){let a=[];switch(e){case u.sh.POINT:case u.sh.MULTIPOINT:case u.sh.POLYLINE:a=d({GraphicData:t,ValueType:n,imageId:r});break;case u.sh.CIRCLE:{let e=d({GraphicData:t,ValueType:n,imageId:r});if(!r)return e;let o=e[0],i=e[1],s=c.vec3.distance(o,i),u=l.metaData.get("imagePlaneModule",r);if(!u)throw Error("No imagePlaneModule found");let{columnCosines:p,rowCosines:f}=u,m=c.vec3.create();c.vec3.scaleAndAdd(m,o,p,s);let S=c.vec3.create();c.vec3.scaleAndAdd(S,o,p,-s);let g=c.vec3.create();c.vec3.scaleAndAdd(g,o,f,s);let h=c.vec3.create();c.vec3.scaleAndAdd(h,o,f,-s),a=[m,S,g,h];break}case u.sh.ELLIPSE:{let e=d({GraphicData:t,ValueType:n,imageId:r});if(!r)return e;let o=c.vec3.fromValues(...e[0]),i=c.vec3.fromValues(...e[1]),s=c.vec3.fromValues(...e[2]),u=c.vec3.fromValues(...e[3]),p=c.vec3.create();c.vec3.sub(p,i,o),c.vec3.normalize(p,p);let f=c.vec3.create();c.vec3.sub(f,u,s),c.vec3.normalize(f,f);let m=l.metaData.get("imagePlaneModule",r);if(!m)throw Error("imageId does not have imagePlaneModule metadata");let{columnCosines:S}=m,g=c.vec3.fromValues(...S),h=Math.abs(c.vec3.dot(g,p)),I=Math.abs(Math.abs(c.vec3.dot(g,f)));a=[],1e-4>Math.abs(Math.abs(h)-1)?a=[e[0],e[1],e[2],e[3]]:1e-4>Math.abs(I-1)?a=[e[2],e[3],e[0],e[1]]:console.warn("OBLIQUE ELLIPSE NOT YET SUPPORTED");break}default:console.warn("Unsupported GraphicType:",e)}return a},S={DICOMSRDisplay:"DICOMSRDisplay",SRLength:"SRLength",SRBidirectional:"SRBidirectional",SREllipticalROI:"SREllipticalROI",SRCircleROI:"SRCircleROI",SRArrowAnnotate:"SRArrowAnnotate",SRAngle:"SRAngle",SRCobbAngle:"SRCobbAngle",SRRectangleROI:"SRRectangleROI",SRPlanarFreehandROI:"SRPlanarFreehandROI"},{MeasurementReport:g}=i.adaptersSR.Cornerstone3D;function h({measurement:e,imageId:t=null,frameNumber:n=null,displaySet:r}){let a=S.DICOMSRDisplay,o=e.coords.reduce((e,n)=>(e[n.GraphicType]=e[n.GraphicType]||[],e[n.GraphicType].push(p({...n,imageId:t})),e),{}),{TrackingUniqueIdentifier:i}=e,{ValueType:c,GraphicType:u}=e.coords[0],d=o[u],f=null,m=null;if(t){let e=l.metaData.get("imagePlaneModule",t);f=e?.frameOfReferenceUID}"SCOORD3D"===c&&(m={FrameOfReferenceUID:f=e.coords[0].ReferencedFrameOfReferenceSequence,point:d[0][0]}),e.viewReference={planeRestriction:m,FrameOfReferenceUID:f,referencedImageId:t};let g={annotationUID:i,highlighted:!1,isLocked:!1,isPreview:a===S.DICOMSRDisplay,invalidated:!1,metadata:{toolName:a,planeRestriction:m,valueType:c,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:o,TrackingUniqueIdentifier:i,labels:e.labels}};s.annotation.state.addAnnotation(g)}let{MeasurementReport:I}=i.adaptersSR.Cornerstone3D,y=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-sr"}').UU,R="dicom-sr",C=`${y}.sopClassHandlerModule.${R}`,O="dicom-sr-3d",E=`${y}.sopClassHandlerModule.${O}`,{sopClassDictionary:D}=t.utils,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:T,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:v}=o.Enums,{MetadataProvider:b}=t.classes,{TEXT_ANNOTATION_POSITION:w,COMMENT_CODE:N,CodeScheme:U}=i.adaptersSR.Cornerstone3D,P=[D.BasicTextSR,D.EnhancedSR,D.ComprehensiveSR,D.Comprehensive3DSR];function M(e,n){return this.instances.push(...e),t.utils.sortStudyInstances(this.instances),this.instance=this.instances[this.instances.length-1],this.isLoaded=!1,this}async function x(e,n,r){let{displaySetService:a,measurementService:o}=n.services,i=r.getDataSources()[0],{ContentSequence:s}=e.instance;async function l(t,n=null,r=null){for(let a in t)if("object"==typeof t[a]&&null!==t[a])await l(t[a],t,a);else if(Array.isArray(t[a]))await Promise.all(t[a].map(e=>l(e,t,a)));else if("BulkDataURI"===a){let o=await i.retrieve.bulkDataURI({BulkDataURI:t[a],StudyInstanceUID:e.instance.StudyInstanceUID,SeriesInstanceUID:e.instance.SeriesInstanceUID,SOPInstanceUID:e.instance.SOPInstanceUID});n&&r&&(n[r]=new Float32Array(o))}}!0!==e.isLoaded&&await l(s),e.isImagingMeasurementReport?(e.referencedImages=function(e){let t=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImageLibrary);if(!t)return[];let n=k(t.ContentSequence).find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImageLibraryGroup);if(!n)return[];let r=[];return k(n.ContentSequence).forEach(e=>{let{ReferencedSOPSequence:t}=e;if(t){for(let e of k(t))if(e.ReferencedSOPClassUID){let{ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n}=e;r.push({ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n})}}}),r}(s),e.measurements=function(e){var t;let n,r=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImagingMeasurements);if(!r)return[];let a=(t=k(r.ContentSequence).filter(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.MeasurementGroup),n={},t.forEach(e=>{let t=k(e.ContentSequence),r=t.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingUniqueIdentifier);r||console.warn("No Tracking Unique Identifier, skipping ambiguous measurement.");let a=r.UID;void 0===n[a]?n[a]=[...t]:t.forEach(e=>{e.ConceptNameCodeSequence.CodeValue!==u.n7.TrackingUniqueIdentifier&&n[a].push(e)})}),n),o=[];return Object.keys(a).forEach(e=>{var t;let n=(t=a[e]).some(e=>{var t;let n;return("SCOORD"===(t=e).ValueType||"SCOORD3D"===t.ValueType)&&!((n=e.ConceptNameCodeSequence[0])&&n.CodeValue===w.value&&n.CodingSchemeDesignator===w.schemeDesignator)})?function(e){let 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.`);let a=e.filter(e=>"NUM"===e.ValueType),{ConceptNameCodeSequence:o}=t,{CodeValue:i,CodingSchemeDesignator:s}=o,l=`${s}:${i}`,c=q(t),d="SCOORD3D"===c.ValueType,p=c.GraphicData.length/(d?3:2),f={loaded:!1,labels:[],coords:[c],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue,graphicCode:l,is3DMeasurement:d,pointsLength:p,graphicType:c.GraphicType};a.forEach(e=>{let{ConceptNameCodeSequence:t,MeasuredValueSequence:n}=e;n&&f.labels.push(F(t,n))});let m=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===u.bY.SCT&&e.ConceptNameCodeSequence.CodeValue===u.n7.FindingSiteSCT);return m.length&&f.labels.push({label:u.n7.FindingSiteSCT,value:m[0].ConceptCodeSequence.CodeMeaning}),f}(t):function(e){let t=e.filter(e=>"NUM"===e.ValueType),n=e.find(e=>"UIDREF"===e.ValueType),r=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingIdentifier),a=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.Finding),o=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===u.bY.SRT&&e.ConceptNameCodeSequence.CodeValue===u.n7.FindingSite),i=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===N.schemeDesignator&&e.ConceptNameCodeSequence.CodeValue===N.value),s={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};if(i)for(let e of i)e.TextValue&&s.labels.push({label:e.TextValue,value:""});if(a&&u.bY.CornerstoneCodeSchemes.includes(a.ConceptCodeSequence.CodingSchemeDesignator)&&a.ConceptCodeSequence.CodeValue===U.codeValues.CORNERSTONEFREETEXT&&s.labels.push({label:U.codeValues.CORNERSTONEFREETEXT,value:a.ConceptCodeSequence.CodeMeaning}),o.length){let e=o.find(e=>u.bY.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===U.codeValues.CORNERSTONEFREETEXT);e&&s.labels.push({label:U.codeValues.CORNERSTONEFREETEXT,value:e.ConceptCodeSequence.CodeMeaning})}return t.forEach(e=>{let{ConceptNameCodeSequence:t,ContentSequence:n,MeasuredValueSequence:r}=e;if(n){let 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.");let{ValueType:t}=e;if("SCOORD"!==t&&"SCOORD3D"!==t)return void console.warn(`Graphic ${t} not currently supported, skipping annotation.`);let r=q(e);r&&s.coords.push(r)}r&&s.labels.push(F(t,r))}),s}(t);n&&o.push(n)}),o}(s)):(e.referencedImages=[],e.measurements=[]);let{predecessorImageId:c}=e;for(let t of e.measurements)t.predecessorImageId=c;let d=o.getSourceMappings(T,v);e.isHydrated=!1,e.isRehydratable=function(e,t){if(!t||!t.length)return!1;let n=new Set;for(let e of t)n.add(e.annotationType);let{measurements:r}=e;for(let e=0;e<r.length;e++){let t=r[e];if(!t)continue;let{TrackingIdentifier:a="",graphicType:o,graphicCode:i,pointsLength:s}=t;if(!a&&!o){console.warn("No tracking identifier or graphicType for measurement ",t);continue}let l=I.getAdapterForTrackingIdentifier(a),c=I.getAdaptersForTypes(i,o,s);if(l&&n.has(l.toolType)||c&&c.some(e=>n.has(e.toolType)))return!0;console.log("Measurement is not rehydratable",a,r[e])}return console.log("No measurements found which were rehydratable"),!1}(e,d),e.isLoaded=!0,t.utils.sortDisplaySetsCopy(a.activeDisplaySets,{studyInstanceUIDFirst:e.StudyInstanceUID}).forEach(t=>{A(e,t,i,n)}),a.subscribe(a.EVENTS.DISPLAY_SETS_ADDED,t=>{let{displaySetsAdded:r}=t;r.forEach(t=>{A(e,t,i,n)})})}function A(e,t,n,r){let{customizationService:a}=r.services,o=e.measurements.filter(e=>!1===e.loaded);if(!o.length||t.unsupported)return;let i=new Map;for(let e of n.getImageIdsForDisplaySet(t)){let{SOPInstanceUID:t,frameNumber:n}=b.getUIDsFromImageID(e),r=`${t}:${n||1}`;i.set(r,e)}if(!o?.length)return;let s=e.SOPClassUID===D.Comprehensive3DSR;for(let n=o.length-1;n>=0;n--){let r=o[n],l=r.coords?.[0]?.ValueType==="SCOORD3D",c=a.getCustomization("onBeforeSRAddMeasurement");if("function"==typeof c&&(r=c({measurement:r,StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID})),s&&l&&function({measurement:e,displaySet:t}){return e.coords[0].ReferencedFrameOfReferenceSequence===t.FrameOfReferenceUID}({measurement:r,displaySet:t})){h({measurement:r,displaySet:t}),r.loaded=!0,r.displaySetInstanceUID=t.displaySetInstanceUID,o.splice(n,1);continue}let u=r.coords[0].ReferencedSOPSequence;if(!u)continue;let{ReferencedSOPInstanceUID:d}=u,p=u.ReferencedFrameNumber||1,f=`${d}:${p}`,m=i.get(f);m&&function(e,t,n){let{coords:r}=e,a=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence?.ReferencedFrameNumber||1;if(n&&Number(n)!==Number(a))return!1;for(let e=0;e<r.length;e++){let{ReferencedSOPInstanceUID:n}=r[e].ReferencedSOPSequence;if(n===t)return!0}return!1}(r,d,p)&&(h({measurement:r,imageId:m,frameNumber:p,displaySet:t}),r.loaded=!0,r.imageId=m,r.displaySetInstanceUID=t.displaySetInstanceUID,r.ReferencedSOPInstanceUID=d,r.frameNumber=p,o.splice(n,1))}}let q=e=>{let{ValueType:t,GraphicType:n,GraphicData:r}=e,a={ValueType:t,GraphicType:n,GraphicData:r};return a.ReferencedSOPSequence=e.ContentSequence?.ReferencedSOPSequence,a.ReferencedFrameOfReferenceSequence=e.ReferencedFrameOfReferenceUID||e.ContentSequence?.ReferencedFrameOfReferenceSequence,a};function F(e,t){let{CodeMeaning:n}=e,{NumericValue:r,MeasurementUnitsCodeSequence:a}=t,{CodeValue:o}=a,i=r?Number(r).toFixed(2):"";return{label:n,value:`${i} ${o}`}}function k(e){return e?Array.isArray(e)?e:[e]:[]}let L={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"}]}]}]},V=function(e,t){let n={},r=e.map(e=>e.uid).slice(),a=s.annotation.state.getAnnotationManager(),o=a.getFramesOfReference();for(let s=0;s<o.length;s++){let l=o[s],c=a.getAnnotations(l),u=Object.keys(c);for(let a=0;a<u.length;a++){let o=u[a],s=c[o];if(s)for(let a=0;a<s.length;a++){let l=s[a],c=r.findIndex(e=>e===l.annotationUID);if(-1!==c&&(!function(r,a){let o=r.metadata?.referencedImageId??i.NO_IMAGE_ID;n[o]||(n[o]={});let s=n[o];s[a]||(s[a]={data:[]});let l=e.find(e=>e.uid===r.annotationUID),c=s[a].data,{finding:u}=l,d=[];l.label&&(t.includes(a)?u={CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:l.label}:d.push({CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:l.label})),l.findingSites&&d.push(...l.findingSites);let p=Object.assign({},r,{finding:u,findingSites:d});c.push(p)}(l,o),r.splice(c,1),!r.length))return n}}}return n},{CodeScheme:_}=i.adaptersSR.Cornerstone3D,{locking:j}=s.annotation,{guid:$}=n().utils,{MeasurementReport:B}=i.adaptersSR.Cornerstone3D,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:G,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:H}=o.Enums,W=(e,t)=>{if(!t||"CORNERSTONEJS"===t.CodingSchemeDesignator)return;let n=`${t.CodingSchemeDesignator}:${t.CodeValue}`;return{...e[n],ref:n,...t,text:t.CodeMeaning}};function z({servicesManager:e,extensionManager:n,commandsManager:r},a){var o,i,s,u;let d,p,f,m=n.getActiveDataSource()[0],{measurementService:S,displaySetService:g,customizationService:h}=e.services,I=h.getCustomization("codingValues"),y=h.getCustomization("panelMeasurement.disableEditing"),R=g.getDisplaySetByUID(a),{StudyInstanceUID:C,SeriesInstanceUID:O,instance:{SOPInstanceUID:E}}=R,D=S.getSourceMappings(G,H);if(!D||!D.length)throw Error("Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.");let T=t.DicomMetadataStore.getInstance(C,O,E),v={};R.measurements.forEach(e=>{let{ReferencedSOPInstanceUID:t,imageId:n,frameNumber:r=1}=e,a=`${t}:${r}`;n&&!v[a]&&(v[a]=n)});let b=B.generateToolState(T,v,l.metaData),w=h.getCustomization("onBeforeSRHydration")?.value;"function"==typeof w&&(b=w({storedMeasurementByAnnotationType:b,displaySet:R}));let N=D.map(e=>e.annotationType),U={};Object.keys(b).forEach(e=>{N.includes(e)&&(U[e]=b[e])});let P=[],M=(o=U,i=v,d=[],Object.keys(o).forEach(e=>{o[e].forEach(e=>{let t=e.annotation.data?.frameNumber||1,n=i[`${e.sopInstanceUid}:${t}`];n&&!d.includes(n)&&d.push(n)})}),d);for(let e of M){let{SeriesInstanceUID:t,StudyInstanceUID:n}=l.metaData.get("instance",e);P.includes(t)||P.push(t),f?f!==n&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):f=n}for(let e of(s=U,u=v,p=[],Object.keys(s).forEach(e=>{s[e].forEach(e=>{let t=e.annotation.data?.frameNumber||1;if(!u[`${e.sopInstanceUid}:${t}`]){let{FrameOfReferenceUID:t}=e.annotation.metadata;t&&!p.includes(t)&&p.push(t)}})}),p)){let t=Y(g.getDisplaySetsBy(t=>t.FrameOfReferenceUID===e&&!t.isDerivedDisplaySet),e);t&&(P.includes(t.SeriesInstanceUID)||P.push(t.SeriesInstanceUID),f?f!==t.StudyInstanceUID&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):f=t.StudyInstanceUID)}return Object.keys(U).forEach(t=>{U[t].forEach(n=>{n.uid=$();let a=function(t){let n=t.annotation.data&&t.annotation.data.frameNumber||1,r=v[`${t.sopInstanceUid}:${n}`];if(!r)return function(e,t){let{FrameOfReferenceUID:n}=e.annotation.metadata,{points:r}=e.annotation.data.handles,{displaySetService:a}=t.services,o=a.getDisplaySetsBy(e=>e.FrameOfReferenceUID===n);if(!o.length||!r?.length)return{FrameOfReferenceUID:n};let i=Y(o,e.annotation),s={...{cameraFocalPoint:function(e){let t=1/e.length,n=c.vec3.create();for(let r of e)c.vec3.scaleAndAdd(n,n,r,t);return n}(function(e){if(1===e.length||2===e.length)return e;let t=Math.ceil(e.length/4),n=Math.ceil(e.length/2);return[e[0],e[t],e[n]]}(r)),viewPlaneNormal:null,viewUp:null},volumeId:i.displaySetInstanceUID,FrameOfReferenceUID:n};return l.utilities.updatePlaneRestriction(r,s),s}(t,e);let{FrameOfReferenceUID:a}=l.metaData.get("instance",r);return{referencedImageId:r,FrameOfReferenceUID:a}}(n),{referencedImageId:o}=a,i={annotationUID:n.annotation.annotationUID,data:n.annotation.data,predecessorImageId:n.predecessorImageId,metadata:{...a,toolName:t}};l.utilities.updatePlaneRestriction(i.data.handles.points,i.metadata);let s=S.getSource(G,H);i.data.label=function(e){let{findingSites:t=[],finding:n,annotation:r}=e;if(r.data.label)return r.data.label;let a=t.find(e=>e.CodeValue===_.codeValues.CORNERSTONEFREETEXT);return a?a.CodeMeaning:n&&n.CodeValue===_.codeValues.CORNERSTONEFREETEXT?n.CodeMeaning:void 0}(n),i.data.finding=W(I,n.finding?.[0]),i.data.findingSites=((e,t)=>{if(!t||!t.length)return;let n=[];for(let r=0;r<t.length;r++){let a=W(e,t[r][0]||t[r]);a&&n.push(a)}return n.length&&n||void 0})(I,n.findingSites),i.data.findingSites?.forEach(e=>{e.type&&(i.data[e.type]=e)});let u=D.find(e=>e.annotationType===t),d=S.addRawMeasurement(s,t,{annotation:i},u.toMeasurementSchema,m);r.runCommand("updateMeasurement",{uid:d,code:i.data.finding}),y&&j.setAnnotationLocked(d,!0),o&&!M.includes(o)&&M.push(o)})}),R.isHydrated=!0,{StudyInstanceUID:f,SeriesInstanceUIDs:P}}function Y(e,t){if(!e?.length)return void console.warn("No display set found for",t);if(1===e.length)return e[0];let n=e.find(e=>e.isReconstructable);return n||e[0]}let{MeasurementReport:X}=i.adaptersSR.Cornerstone3D,{log:J}=n();var K=f(963);class Q extends s.AnnotationTool{constructor(e={},t={configuration:{}}){super(e,t),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{let{viewport:n}=e,{element:r}=n,a=s.annotation.state.getAnnotations(this.getToolName(),r);if(!a?.length||(a=this.filterInteractableAnnotationsForElement(r,a),!a?.length))return;let{activeIndex:o,trackingUniqueIdentifiers:i}=(0,K.eF)(r),l=i[o],c=a.filter(e=>i.includes(e.data?.TrackingUniqueIdentifier));if(!("function"==typeof n.getActors?n.getActors().length>0:!!n._actors?.size))return;let d={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},{style:p}=s.annotation.config;for(let e=0;e<c.length;e++){let r=c[e],a=r.annotationUID,{renderableData:o,TrackingUniqueIdentifier:i}=r.data,{referencedImageId:f}=r.metadata;d.annotationUID=a;let m=p.getToolGroupToolStyles(this.toolGroupId)[this.getToolName()],S=this.getStyle("lineWidth",d,r),g=this.getStyle("lineDash",d,r),h={color:i===l?"rgb(0, 255, 0)":this.getStyle("color",d,r),lineDash:g,lineWidth:S,...m};Object.keys(o).forEach(e=>{let i,l,c=o[e];switch(e){case u.sh.POINT:i=this.renderPoint;break;case u.sh.MULTIPOINT:i=this.renderMultipoint;break;case u.sh.POLYLINE:i=this.renderPolyLine;break;case u.sh.CIRCLE:i=this.renderEllipse;break;case u.sh.ELLIPSE:i=this.renderEllipse,l=s.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw Error(`Unsupported GraphicType: ${e}`)}let p=i(t,n,c,a,f,h);this.renderTextBox(t,n,p,l,r,d,h)})}}}_getTextBoxLinesFromLabels(e){let t=Math.min(e.length,5),n=[];for(let r=0;r<t;r++){let t=e[r];n.push(`${function(e){let t=Z[e];return void 0!==t?t:e}(t.label)}: ${t.value}`)}return n}renderPolyLine(e,t,n,r,a,o){let i={color:o.color,width:o.lineWidth,lineDash:o.lineDash},l=[];return n.map((n,a)=>{let o=n.map(e=>t.worldToCanvas(e)),c=`${a}`;2===o.length?s.drawing.drawLine(e,r,c,o[0],o[1],i):s.drawing.drawPolyline(e,r,c,o,i),l=l.concat(o)}),l}renderMultipoint(e,t,n,r,a,o){let i;n.map((n,a)=>{i=n.map(e=>t.worldToCanvas(e)),s.drawing.drawHandles(e,r,"0",i,{color:o.color})})}renderPoint(e,t,n,r,a,o){let i=[];return n.map((n,c)=>{let u=n[0];if(i.push(t.worldToCanvas(u)),void 0!==n[1])i.push(t.worldToCanvas(n[1]));else{let e=l.metaData.get("imagePixelModule",a),n=10,r=10;if(e){let{columns:t,rows:a}=e;n=t/10,r=a/10}let o=l.utilities.worldToImageCoords(a,u),s=l.utilities.imageToWorldCoords(a,[o[0]+n,o[1]+r]);i.push(t.worldToCanvas(s))}let d=`${c}`;s.drawing.drawArrow(e,r,d,i[1],i[0],{color:o.color,width:o.lineWidth})}),i}renderEllipse(e,t,n,r,a,o){let i;return n.map((n,a)=>{let l;if(0===n.length)return;let c=t.getRotation();i=n.map(e=>t.worldToCanvas(e)),l=90==c||270==c?s.utilities.math.ellipse.getCanvasEllipseCorners([i[2],i[3],i[0],i[1]]):s.utilities.math.ellipse.getCanvasEllipseCorners(i);let u=`${a}`;s.drawing.drawEllipse(e,r,u,l[0],l[1],{color:o.color,width:o.lineWidth,lineDash:o.lineDash})}),i}renderTextBox(e,t,n,r,a,o,i={}){if(!n||!a)return;let{annotationUID:l,data:c={}}=a,{labels:u}=c,{color:d}=i,p=n;"function"==typeof r&&(p=r(n));let f=this._getTextBoxLinesFromLabels(u),m=s.utilities.drawing.getTextBoxCoordsCanvas(p);a.data?.handles?.textBox?.worldPosition||(a.data.handles.textBox.worldPosition=t.canvasToWorld(m));let S=t.worldToCanvas(a.data.handles.textBox.worldPosition),g=this.getLinkedTextBoxStyle(o,a),{x:h,y:I,width:y,height:R}=s.drawing.drawLinkedTextBox(e,l,"1",f,S,n,{},{...g,color:d});a.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([h,I]),topRight:t.canvasToWorld([h+y,I]),bottomLeft:t.canvasToWorld([h,I+R]),bottomRight:t.canvasToWorld([h+y,I+R])}}}Q.toolName=S.DICOMSRDisplay;let Z={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function ee(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,s.addTool)(r)}var et=f(154);function en(){return(en=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}).apply(null,arguments)}let er=e.lazy(()=>Promise.resolve().then(f.bind(f,954))),ea=t=>e.createElement(e.Suspense,{fallback:e.createElement("div",null,"Loading...")},e.createElement(er,t)),eo={id:y,onModeEnter:function({servicesManager:e}){let{displaySetService:t}=e.services;[...t.getDisplaySetCache().values()].filter(e=>e.SOPClassHandlerId===C||e.SOPClassHandlerId===E).forEach(e=>{e.isHydrated=!1})},preRegistration:function({configuration:e={},servicesManager:t}){ee(S.DICOMSRDisplay,Q),ee(S.SRLength,s.LengthTool),ee(S.SRBidirectional,s.BidirectionalTool),ee(S.SREllipticalROI,s.EllipticalROITool),ee(S.SRCircleROI,s.CircleROITool),ee(S.SRArrowAnnotate,s.ArrowAnnotateTool),ee(S.SRAngle,s.AngleTool),ee(S.SRPlanarFreehandROI,s.PlanarFreehandROITool),ee(S.SRRectangleROI,s.RectangleROITool),ee(S.SRCobbAngle,s.CobbAngleTool);let n={lineDash:"4,4"};s.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{[S.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(ea,en({servicesManager:t,extensionManager:n},r))}],getCommandsModule:e=>{let{servicesManager:t,extensionManager:n,commandsManager:r}=e,{customizationService:a}=t.services,o={changeColorMeasurement:({uid:e})=>{throw Error("Unsupported operation: changeColorMeasurement")},storeMeasurements:async({measurementData:e,dataSource:t,additionalFindingTypes:n,options:o={}})=>{J.info("[DICOMSR] storeMeasurements");let i=r.runCommand("createStoreFunction",{dataSource:t,defaultFileName:"dicom-sr.dcm"});if(!i)return J.error("[DICOMSR] No valid store for dataSource:",t),Promise.reject({});try{let t,r=((e,t,n={})=>{let r=V(e,t),{dataset:a}=X.generateReport(r,l.metaData,n);return void 0===a.SpecificCharacterSet&&(a.SpecificCharacterSet="ISO_IR 192"),a})(e,n,o),{ContentSequence:s}=r;if(!s?.[4]?.ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",r),Error("Invalid report, no content");if(!r.SOPClassUID)throw Error("No sop class uid");let c=a.getCustomization("onBeforeDicomStore");return"function"==typeof c&&(t=c({dicomDict:t,measurementData:e,naturalizedReport:r})),await i(r,{measurementData:e,dicomDict:t}),r}catch(e){throw console.warn(e),J.error(`[DICOMSR] Error while saving the measurements: ${e.message}`),Error(e.message||"Error while saving the measurements.")}},hydrateStructuredReport:({displaySetInstanceUID:e})=>z({servicesManager:t,extensionManager:n,commandsManager:r},e)},i={storeMeasurements:o.storeMeasurements,hydrateStructuredReport:o.hydrateStructuredReport};return{actions:o,definitions:i,defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}},getSopClassHandlerModule:function(e){let{servicesManager:n,extensionManager:r}=e,o=e=>(function(e,n,r){var o;if(!e||!e.length)throw Error("No instances were provided");t.utils.sortStudyInstances(e);let i=e[e.length-1],{StudyInstanceUID:s,SeriesInstanceUID:l,SOPInstanceUID:c,SeriesDescription:d,SeriesNumber:p,SeriesDate:f,SeriesTime:m,ConceptNameCodeSequence:S,SOPClassUID:g,imageId:h}=i;o=i.StudyInstanceUID,e.forEach(e=>{if(e.StudyInstanceUID!==o)throw console.warn("Not all instances have the same UID",o,e),Error(`Instances ${e.SOPInstanceUID} does not belong to ${o}`)});let I=g===D.Comprehensive3DSR,y=S?.CodeValue===u.n7.ImagingMeasurementReport,R={Modality:"SR",displaySetInstanceUID:t.utils.guid(),SeriesDescription:d,SeriesNumber:p,SeriesDate:f,SeriesTime:m,SOPInstanceUID:c,SeriesInstanceUID:l,StudyInstanceUID:s,SOPClassHandlerId:I?E:C,SOPClassUID:g,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,isImagingMeasurementReport:y,sopClassUids:P,instance:i,predecessorImageId:h,addInstances:M,label:d||`${a().t("Series")} ${p} - ${a().t("SR")}`};return R.load=()=>x(R,n,r),[R]})(e,n,r);return[{name:R,sopClassUids:P,getDisplaySetsFromSeries:o},{name:O,sopClassUids:[D.Comprehensive3DSR],getDisplaySetsFromSeries:o}]},getUtilityModule:({servicesManager:e})=>[{name:"tools",exports:{toolNames:S}}]}})(),m=f.O(m)})());
package/package.json CHANGED
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "@ohif/extension-cornerstone-dicom-sr",
3
- "version": "3.13.0-beta.9",
3
+ "version": "3.13.0-beta.93",
4
4
  "description": "OHIF extension for an SR Cornerstone Viewport",
5
5
  "author": "OHIF",
6
6
  "license": "MIT",
7
- "repository": "OHIF/Viewers",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "OHIF/Viewers"
10
+ },
8
11
  "main": "dist/ohif-extension-cornerstone-dicom-sr.umd.js",
9
12
  "module": "src/index.tsx",
10
13
  "engines": {
11
- "node": ">=14",
12
- "npm": ">=6",
13
- "yarn": ">=1.16.0"
14
+ "node": ">=24"
14
15
  },
15
16
  "files": [
16
17
  "dist",
@@ -19,36 +20,38 @@
19
20
  "publishConfig": {
20
21
  "access": "public"
21
22
  },
22
- "keywords": [
23
- "ohif-extension"
24
- ],
25
- "scripts": {
26
- "clean": "shx rm -rf dist",
27
- "clean:deep": "yarn run clean && shx rm -rf node_modules",
28
- "dev": "cross-env NODE_ENV=development webpack --config .webpack/webpack.dev.js --watch --output-pathinfo",
29
- "dev:cornerstone": "yarn run dev",
30
- "build": "cross-env NODE_ENV=production webpack --config .webpack/webpack.prod.js",
31
- "build:package-1": "yarn run build",
32
- "start": "yarn run dev",
33
- "test:unit": "jest --watchAll",
34
- "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
35
- },
36
23
  "peerDependencies": {
37
- "@ohif/core": "3.13.0-beta.9",
38
- "@ohif/extension-cornerstone": "3.13.0-beta.9",
39
- "@ohif/extension-measurement-tracking": "3.13.0-beta.9",
40
- "@ohif/ui": "3.13.0-beta.9",
41
24
  "dcmjs": "0.49.4",
42
25
  "dicom-parser": "1.8.21",
43
26
  "hammerjs": "2.0.8",
44
27
  "prop-types": "15.8.1",
45
- "react": "18.3.1"
28
+ "react": "18.3.1",
29
+ "@ohif/extension-cornerstone": "3.13.0-beta.93",
30
+ "@ohif/ui": "3.13.0-beta.93",
31
+ "@ohif/core": "3.13.0-beta.93"
46
32
  },
47
33
  "dependencies": {
48
- "@babel/runtime": "7.28.2",
49
- "@cornerstonejs/adapters": "4.15.29",
50
- "@cornerstonejs/core": "4.15.29",
51
- "@cornerstonejs/tools": "4.15.29",
34
+ "@babel/runtime": "7.29.7",
35
+ "@cornerstonejs/adapters": "5.0.2",
36
+ "@cornerstonejs/core": "5.0.2",
37
+ "@cornerstonejs/tools": "5.0.2",
52
38
  "classnames": "2.5.1"
39
+ },
40
+ "devDependencies": {
41
+ "cross-env": "7.0.3"
42
+ },
43
+ "keywords": [
44
+ "ohif-extension"
45
+ ],
46
+ "scripts": {
47
+ "clean": "shx rm -rf dist",
48
+ "clean:deep": "pnpm run clean && shx rm -rf node_modules",
49
+ "dev": "cross-env NODE_ENV=development rspack build --config .webpack/webpack.dev.js --watch",
50
+ "dev:cornerstone": "pnpm run dev",
51
+ "build": "cross-env NODE_ENV=production rspack build --config .webpack/webpack.prod.js",
52
+ "build:package-1": "pnpm run build",
53
+ "start": "pnpm run dev",
54
+ "test:unit": "jest --watchAll",
55
+ "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
53
56
  }
54
- }
57
+ }
@@ -1,9 +0,0 @@
1
- /**
2
- * @license React
3
- * react.production.min.js
4
- *
5
- * Copyright (c) Facebook, Inc. and its affiliates.
6
- *
7
- * This source code is licensed under the MIT license found in the
8
- * LICENSE file in the root directory of this source tree.
9
- */