@ohif/extension-cornerstone-dicom-sr 3.12.0-beta.67 → 3.12.0-beta.69
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,i,s,c,l)=>(()=>{var u,d,f={525:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>T});var r=n(598),o=n.n(r),a=n(326),i=n(2),s=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:i}=e,{displaySetService:p}=t.services,m=i.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,R]=(0,a.useState)(0),[C,D]=(0,a.useState)(null),[T,O]=(0,a.useState)(null),[v,E]=(0,a.useState)(null),{viewports:b,activeViewportId:w}=h,U=(0,a.useCallback)(e=>{const{measurements:t}=S;(0,s.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 i=n.getDisplaySetByUID(a);if(!i?.images)return{referencedDisplaySetMetadata:null,referencedDisplaySet:null};const s=i.images[0],l={PatientID:s.PatientID,PatientName:s.PatientName,PatientSex:s.PatientSex,PatientAge:s.PatientAge,SliceThickness:s.SliceThickness,StudyDate:s.StudyDate,SeriesDescription:s.SeriesDescription,SeriesInstanceUID:s.SeriesInstanceUID,SeriesNumber:s.SeriesNumber,ManufacturerModelName:s.ManufacturerModelName,SpacingBetweenSlices:s.SpacingBetweenSlices};return{referencedDisplaySetMetadata:l,referencedDisplaySet:i}}(S,e,p).then(({referencedDisplaySet:t,referencedDisplaySetMetadata:n})=>{if(!t||!n)return;R(e),D(t),O(n);const{presentationIds:r}=i,o=S.measurements[e];g(r.positionPresentationId,{viewReference:o.viewReference||{referencedImageId:o.imageId}})})},[r,S,C,m]),x=(0,a.useCallback)(()=>{if(!C)return null;const{measurements:t}=S;return t[y]?a.createElement(l.OHIFCornerstoneViewport,f({},e,{displaySets:[C],viewportOptions:{...i,toolGroupId:"SRToolGroup",viewportType:"stack",positionIds:null},onElementEnabled:t=>{e.onElementEnabled?.(t),(e=>{E(e.detail.element)})(t)},isJumpToMeasurementDisabled:!0})):null},[C,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(),N(y)})()},[S]),(0,a.useEffect)(()=>{(async()=>{S.isLoaded||await S.load(),v&&S.isLoaded&&U(y)})()},[y,v,U,S]);let M=null;return C&&T?(n&&n.length&&(M=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"},x(),M))):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?i.utils.formatPN(t):void 0},DATE:e=>{const{Date:t}=e;return t?i.utils.formatDate(t):void 0},TIME:e=>{const{Time:t}=e;return t?i.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`${i.utils.formatDate(n)} ${i.utils.formatTime(r)}`}};function h(e){const{contentItem:t,nodeIndexesTree:n,continuityOfContent:r}=e,{ConceptNameCodeSequence:o}=t,{CodeValue:i,CodeMeaning:s}=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=i===S.n7.Finding,f=u&&!c&&/^[a-zA-Z0-9]/.test(l?.[0]);let p="whitespace-pre-line";return i===S.n7.Finding&&(p="whitespace-pre-wrap"),u?a.createElement(a.Fragment,null,a.createElement("span",{className:p,title:s},f?" ":"",l)):a.createElement(a.Fragment,null,a.createElement("div",{className:"mb-2"},a.createElement("span",{className:"font-bold"},s,": "),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:i}=t,{CodeMeaning:s}=i??{};let c=1;const l=t.ContentSequence?.map((e,t)=>{const{ValueType:i}=e,s=[...n,t],l=s.join(".");let u,d;if("CONTAINER"===i){u=y,d={container:e,nodeIndexesTree:s,containerNumberedTree:[...r,c++]}}else u=h,d={contentItem:e,nodeIndexesTree:s,continuityOfContent:o};return a.createElement(u,I({key:l},d))});return a.createElement("div",null,a.createElement("div",{className:"font-bold"},r.join("."),". ",s),a.createElement("div",{className:"ml-4 mb-2"},l))}function R(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)},R.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(i.ExtensionManager).isRequired};const C=R;function D(e){const{displaySets:t}=e,{isImagingMeasurementReport:n}=t[0];return n?a.createElement(m,e):a.createElement(C,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(i.ExtensionManager).isRequired};const T=D},193:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>c,bY:()=>s,n7:()=>i,sh:()=>a});var r=n(142);const{CodeScheme:o}=r.adaptersSR.Cornerstone3D,a={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"},i={ImagingMeasurementReport:"126000",ImageLibrary:"111028",ImagingMeasurements:"126010",MeasurementGroup:"125007",ImageLibraryGroup:"126200",TrackingUniqueIdentifier:"112040",TrackingIdentifier:"112039",Finding:"121071",FindingSite:"G-C0E3",FindingSiteSCT:"363698007"},s={SRT:"SRT",SCT:"SCT",CornerstoneCodeSchemes:[o.CodingSchemeDesignator,"CST4"]},c={CodeNameCodeSequenceValues:i,CodingSchemeDesignators:s,RelationshipType:{INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},SCOORDTypes:a}},942:(e,t,n)=>{"use strict";n.d(t,{eF:()=>i,m1:()=>a});var r=n(557);const o={TrackingUniqueIdentifier:null,trackingIdentifiersByViewportId:{}};function a(e,t,n=0){const a=(0,r.getEnabledElement)(e),{viewport:i}=a;o.trackingIdentifiersByViewportId[i.id]={trackingUniqueIdentifiers:t,activeIndex:n}}function i(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:()=>s});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)},i=(e,t)=>{const n=[],r={};for(const o of t.measurements){const{imageId:t}=o;if(!t)continue;if(r[t])continue;const i=a(o,e);i?(r[t]=i,n.push(i)):console.log("Measurement",o,"had no instances found")}return n},s=(e,t)=>{const n=i(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,...i(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,i){if(i!==r){var s=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 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: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"),i=Symbol.for("react.profiler"),s=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 R=y.prototype=new I;R.constructor=y,S(R,h.prototype),R.isPureReactComponent=!0;var C=Array.isArray,D=Object.prototype.hasOwnProperty,T={current:null},O={key:!0,ref:!0,__self:!0,__source:!0};function v(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)D.call(t,o)&&!O.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:i,ref:s,props:a,_owner:T.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,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var c=!1;if(null===e)c=!0;else switch(s){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case n:case r:c=!0}}if(c)return i=i(c=e),e=""===a?"."+w(c,0):a,C(i)?(o="",null!=e&&(o=e.replace(b,"$&/")+"/"),U(i,t,o,"",function(e){return e})):null!=i&&(E(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,o+(!i.key||c&&c.key===i.key?"":(""+i.key).replace(b,"$&/")+"/")+e)),t.push(i)),1;if(c=0,a=""===a?".":a+":",C(e))for(var l=0;l<e.length;l++){var u=a+w(s=e[l],l);c+=U(s,t,o,u,i)}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;!(s=e.next()).done;)c+=U(s=s.value,t,o,u=a+w(s,l++),i);else if("object"===s)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 x(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 M={current:null},P={transition:null},q={ReactCurrentDispatcher:M,ReactCurrentBatchConfig:P,ReactCurrentOwner:T};function _(){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=h,t.Fragment=o,t.Profiler=i,t.PureComponent=y,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=q,t.act=_,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,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=T.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)&&!O.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:i,props:o,_owner:s}},t.createContext=function(e){return(e={$$typeof:c,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:s,_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:x}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=P.transition;P.transition={};try{e()}finally{P.transition=t}},t.unstable_act=_,t.useCallback=function(e,t){return M.current.useCallback(e,t)},t.useContext=function(e){return M.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return M.current.useDeferredValue(e)},t.useEffect=function(e,t){return M.current.useEffect(e,t)},t.useId=function(){return M.current.useId()},t.useImperativeHandle=function(e,t,n){return M.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return M.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return M.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return M.current.useMemo(e,t)},t.useReducer=function(e,t,n){return M.current.useReducer(e,t,n)},t.useRef=function(e){return M.current.useRef(e)},t.useState=function(e){return M.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return M.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return M.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=s},155:e=>{"use strict";e.exports=i}},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,i=0;i<t.length;i++)(!1&r||o>=r)&&Object.keys(m.O).every(e=>m.O[e](t[i]))?t.splice(i--,1):(a=!1,r<o&&(o=r));if(a){u.splice(c--,1);var s=n();void 0!==s&&(e=s)}}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:()=>Se.A,default:()=>ye,hydrateStructuredReport:()=>ee,srProtocol:()=>B,toolNames:()=>g});var e=m(326),t=m(2),n=m.n(t),r=m(545),o=m.n(r),a=m(669),i=m(142),s=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],i=e[1],s=l.vec3.distance(a,i),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,s);const S=l.vec3.create();l.vec3.scaleAndAdd(S,a,d,-s);const g=l.vec3.create();l.vec3.scaleAndAdd(g,a,p,s);const h=l.vec3.create();l.vec3.scaleAndAdd(h,a,p,-s),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]),i=l.vec3.fromValues(...e[1]),s=l.vec3.fromValues(...e[2]),u=l.vec3.fromValues(...e[3]),p=l.vec3.create();l.vec3.sub(p,i,a),l.vec3.normalize(p,p);const m=l.vec3.create();l.vec3.sub(m,u,s),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)),R=Math.abs(I),C=Math.abs(y);o=[],Math.abs(R-1)<d?o=[e[0],e[1],e[2],e[3]]:Math.abs(C-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",SRSCOORD3DPoint:"SRSCOORD3DPoint"},{MeasurementReport:h}=i.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:i}=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}if("SCOORD3D"===l){h.getAdapterForTrackingIdentifier(e.TrackingIdentifier)||(o=g.SRSCOORD3DPoint),f=e.coords[0].ReferencedFrameOfReferenceSequence,m={FrameOfReferenceUID:f,point:d[0][0]}}e.viewReference={planeRestriction:m,FrameOfReferenceUID:f,referencedImageId:t};const S={annotationUID:i,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:i,labels:e.labels}};s.annotation.state.addAnnotation(S)}const{MeasurementReport:y}=i.adaptersSR.Cornerstone3D;const R=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-sr"}').UU,C="dicom-sr",D=`${R}.sopClassHandlerModule.${C}`,T="dicom-sr-3d",O=`${R}.sopClassHandlerModule.${T}`,{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:x}=i.adaptersSR.Cornerstone3D,M=[v.BasicTextSR,v.EnhancedSR,v.ComprehensiveSR,v.Comprehensive3DSR];function P(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:i,SeriesInstanceUID:s,SOPInstanceUID:c,SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,ConceptNameCodeSequence:m,SOPClassUID:S}=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 g=S===v.Comprehensive3DSR,h=m?.CodeValue===u.n7.ImagingMeasurementReport,I={Modality:"SR",displaySetInstanceUID:t.utils.guid(),SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,SOPInstanceUID:c,SeriesInstanceUID:s,StudyInstanceUID:i,SOPClassHandlerId:g?O:D,SOPClassUID:S,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,isImagingMeasurementReport:h,sopClassUids:M,instance:a,addInstances:P,label:l||`${o().t("Series")} ${d} - ${o().t("SR")}`};return I.load=()=>async function(e,t,n){const{displaySetService:r,measurementService:o}=t.services,a=n.getDataSources(),i=a[0],{ContentSequence:s}=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 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 c(s);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}(s),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:i,CodingSchemeDesignator:s}=a,c=`${s}:${i}`,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),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(const e of i)e.TextValue&&s.labels.push({label:e.TextValue,value:""});o&&u.bY.CornerstoneCodeSchemes.includes(o.ConceptCodeSequence.CodingSchemeDesignator)&&o.ConceptCodeSequence.CodeValue===x.codeValues.CORNERSTONEFREETEXT&&s.labels.push({label:x.codeValues.CORNERSTONEFREETEXT,value:o.ConceptCodeSequence.CodeMeaning});if(a.length){const e=a.find(e=>u.bY.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===x.codeValues.CORNERSTONEFREETEXT);e&&s.labels.push({label:x.codeValues.CORNERSTONEFREETEXT,value:e.ConceptCodeSequence.CodeMeaning})}return t.forEach(e=>{const{ConceptNameCodeSequence:t,ContentSequence:n,MeasuredValueSequence:r}=e,{ValueType:o}=n;if("SCOORD"===!o)return void console.warn(`Graphic ${o} not currently supported, skipping annotation.`);const a=A(n);a&&s.coords.push(a),r&&s.labels.push(F(t,r))}),s}(e)}(n[e]);t&&r.push(t)}),r}(s)):(e.referencedImages=[],e.measurements=[]);const l=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:i,pointsLength:s}=t;if(!o&&!a){console.warn("No tracking identifier or graphicType for measurement ",t);continue}const c=y.getAdapterForTrackingIdentifier(o),l=y.getAdaptersForTypes(i,a,s),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,l),e.isLoaded=!0,r.activeDisplaySets.forEach(n=>{k(e,n,i,t)}),r.subscribe(r.EVENTS.DISPLAY_SETS_ADDED,n=>{const{displaySetsAdded:r}=n;r.forEach(n=>{k(e,n,i,t)})})}(I,n,r),[I]}function _({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 i=new Map,s=n.getImageIdsForDisplaySet(t);for(const e of s){const{SOPInstanceUID:t,frameNumber:n}=w.getUIDsFromImageID(e),r=`${t}:${n||1}`;i.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 s="SCOORD3D"===r.coords?.[0]?.ValueType,l=o.getCustomization("onBeforeSRAddMeasurement");if("function"==typeof l&&(r=l({measurement:r,StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID})),c&&s&&_({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=i.get(p);m&&V(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 V(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:C,sopClassUids:M,getDisplaySetsFromSeries:r},{name:T,sopClassUids:[v.Comprehensive3DSR],getDisplaySetsFromSeries:r}]},B={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 $=m(111),G=m.n($);const W=function(e,t){const n={};function r(r,o){const a=r.metadata?.referencedImageId??i.NO_IMAGE_ID;n[a]||(n[a]={});const s=n[a];s[o]||(s[o]={data:[]});const c=e.find(e=>e.uid===r.annotationUID),l=s[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=s.annotation.state.getAnnotationManager(),c=a.getFramesOfReference();for(let e=0;e<c.length;e++){const t=c[e],i=a.getAnnotations(t),s=Object.keys(i);for(let e=0;e<s.length;e++){const t=s[e],a=i[t];if(a)for(let e=0;e<a.length;e++){const i=a[e],s=o.findIndex(e=>e===i.annotationUID);if(-1!==s&&(r(i,t),o.splice(s,1),!o.length))return n}}}return n},{CodeScheme:H}=i.adaptersSR.Cornerstone3D;const{locking:z}=s.annotation,{guid:Y}=n().utils,{MeasurementReport:X}=i.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:i,displaySetService:s,customizationService:l}=e.services,u=l.getCustomization("codingValues"),d=l.getCustomization("panelMeasurement.disableEditing"),f=s.getDisplaySetByUID(o),p=i.getSourceMappings(J,K);if(!p||!p.length)throw new Error("Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.");const m=t.DicomMetadataStore.getInstance(f.StudyInstanceUID,f.SeriesInstanceUID,f.SOPInstanceUID),S={},g={};f.measurements.forEach(e=>{const{ReferencedSOPInstanceUID:t,imageId:n,frameNumber:r}=e;S[t]||(S[t]=n,g[t]=[]),g[t][r]||(g[t][r]=n)});const h=m;let I=X.generateToolState(h,S,c.metaData);const y=l.getCustomization("onBeforeSRHydration")?.value;"function"==typeof y&&(I=y({storedMeasurementByAnnotationType:I,displaySet:f}));const R=p.map(e=>e.annotationType),C={};Object.keys(I).forEach(e=>{R.includes(e)&&(C[e]=I[e])});const D=[];let T;Object.keys(C).forEach(e=>{C[e].forEach(e=>{const t=e.annotation.data&&e.annotation.data.frameNumber||1,n=g[e.sopInstanceUid][t]||S[e.sopInstanceUid];D.includes(n)||D.push(n)})});const O=[];for(let e=0;e<D.length;e++){const t=D[e];if(!t)continue;const{SeriesInstanceUID:n,StudyInstanceUID:r}=c.metaData.get("instance",t);O.includes(n)||O.push(n),T?T!==r&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):T=r}function v(t){const n=t.annotation.data&&t.annotation.data.frameNumber||1,r=g[t.sopInstanceUid][n]||S[t.sopInstanceUid];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 i=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),s={...te(i,r),volumeId:i.displaySetInstanceUID,FrameOfReferenceUID:n};return c.utilities.updatePlaneRestriction(r,s),s}(t,e);const o=c.metaData.get("instance",r),{FrameOfReferenceUID:a}=o;return{referencedImageId:r,FrameOfReferenceUID:a}}return Object.keys(C).forEach(e=>{C[e].forEach(t=>{t.uid=Y();const n=v(t),{imageId:o}=n,s={annotationUID:t.annotation.annotationUID,data:t.annotation.data,metadata:{...n,toolName:e}};c.utilities.updatePlaneRestriction(s.data.handles.points,s.metadata);const l=i.getSource(J,K);s.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===H.codeValues.CORNERSTONEFREETEXT);return o?o.CodeMeaning:n&&n.CodeValue===H.codeValues.CORNERSTONEFREETEXT?n.CodeMeaning:void 0}(t),s.data.finding=Q(u,t.finding?.[0]),s.data.findingSites=Z(u,t.findingSites),s.data.findingSites?.forEach(e=>{e.type&&(s.data[e.type]=e)});const f=p.find(t=>t.annotationType===e),m=i.addRawMeasurement(l,e,{annotation:s},f.toMeasurementSchema,a);r.runCommand("updateMeasurement",{uid:m,code:s.data.finding}),d&&z.setAnnotationLocked(m,!0),o&&!D.includes(o)&&D.push(o)})}),f.isHydrated=!0,{StudyInstanceUID:T,SeriesInstanceUIDs:O}}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{MeasurementReport:ne}=i.adaptersSR.Cornerstone3D,{log:re}=n(),oe=(e,t,n={})=>{const r=W(e,t),o=ne.generateReport(r,c.metaData,n),{dataset:a}=o;return void 0===a.SpecificCharacterSet&&(a.SpecificCharacterSet="ISO_IR 192"),a.InstanceNumber=n.InstanceNumber??1,a},ae=e=>{const{servicesManager:n,extensionManager:r,commandsManager:o}=e,{customizationService:a}=n.services,i={changeColorMeasurement:({uid:e})=>{throw new Error("Unsupported operation: changeColorMeasurement")},downloadReport:({measurementData:e,additionalFindingTypes:t,options:n={}})=>{const r=oe(e,t,n),o=G().data.datasetToBlob(r),a=URL.createObjectURL(o);window.location.assign(a)},storeMeasurements:async({measurementData:e,dataSource:n,additionalFindingTypes:r,options:o={}})=>{if(re.info("[DICOMSR] storeMeasurements"),!n||!n.store||!n.store.dicom)return re.error("[DICOMSR] datasource has no dataSource.store.dicom endpoint!"),Promise.reject({});try{const i=oe(e,r,o),{StudyInstanceUID:s,ContentSequence:c}=i;if(!c?.[4].ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",i),new Error("Invalid report, no content");if(!i.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:i})),await n.store.dicom(i,null,u),s&&n.deleteStudyMetadataPromise(s),t.DicomMetadataStore.addInstances([i],!0),i}catch(e){throw console.warn(e),re.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:i,definitions:{downloadReport:i.downloadReport,storeMeasurements:i.storeMeasurements,hydrateStructuredReport:i.hydrateStructuredReport},defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};var ie=m(942);class se extends s.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=s.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:i,trackingUniqueIdentifiers:c}=a,l=c[i],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}=s.annotation.config;for(let e=0;e<d.length;e++){const r=d[e],o=r.annotationUID,{renderableData:a,TrackingUniqueIdentifier:i}=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:i===l?"rgb(0, 255, 0)":this.getStyle("color",f,r),lineDash:g,lineWidth:S,...m};Object.keys(a).forEach(e=>{const i=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=s.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const p=l(t,n,i,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(`${le(t.label)}: ${t.value}`)}return n}renderPolyLine(e,t,n,r,o,a){const i={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?s.drawing.drawLine(e,r,l,a[0],a[1],i):s.drawing.drawPolyline(e,r,l,a,i),c=c.concat(a)}),c}renderMultipoint(e,t,n,r,o,a){let i;n.map((n,o)=>{i=n.map(e=>t.worldToCanvas(e));s.drawing.drawHandles(e,r,"0",i,{color:a.color})})}renderPoint(e,t,n,r,o,a){const i=[];return n.map((n,l)=>{const u=n[0];if(i.push(t.worldToCanvas(u)),void 0!==n[1])i.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),s=c.utilities.imageToWorldCoords(o,[a[0]+n,a[1]+r]);i.push(t.worldToCanvas(s))}const d=`${l}`;s.drawing.drawArrow(e,r,d,i[1],i[0],{color:a.color,width:a.lineWidth})}),i}renderEllipse(e,t,n,r,o,a){let i;return n.map((n,o)=>{if(0===n.length)return;const c=n,l=t.getRotation();let u;i=c.map(e=>t.worldToCanvas(e)),u=90==l||270==l?s.utilities.math.ellipse.getCanvasEllipseCorners([i[2],i[3],i[0],i[1]]):s.utilities.math.ellipse.getCanvasEllipseCorners(i);const d=`${o}`;s.drawing.drawEllipse(e,r,d,u[0],u[1],{color:a.color,width:a.lineWidth,lineDash:a.lineDash})}),i}renderTextBox(e,t,n,r,o,a,i={}){if(!n||!o)return;const{annotationUID:c,data:l={}}=o,{labels:u}=l,{color:d}=i;let f=n;"function"==typeof r&&(f=r(n));const p=this._getTextBoxLinesFromLabels(u),m=s.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=s.drawing.drawLinkedTextBox(e,c,"1",p,S,n,{},{...g,color:d}),{x:I,y,width:R,height:C}=h;o.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([I,y]),topRight:t.canvasToWorld([I+R,y]),bottomLeft:t.canvasToWorld([I,y+C]),bottomRight:t.canvasToWorld([I+R,y+C])}}}se.toolName=g.DICOMSRDisplay;const ce={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function le(e){const t=ce[e];return void 0!==t?t:e}class ue extends s.AnnotationDisplayTool{constructor(e={},t={configuration:{}}){super(e,t),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{const{viewport:n}=e,{element:r}=n,o=s.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;const a=o;if(!n._actors?.size)return;const i={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<a.length;e++){const r=a[e],o=r.annotationUID,{renderableData:c}=r.data,{POINT:l}=c;i.annotationUID=o;const u=this.getStyle("lineWidth",i,r),d=this.getStyle("lineDash",i,r),f={color:this.getStyle("color",i,r),lineDash:d,lineWidth:u},p=l[0][0];if(!n.isReferenceViewable({FrameOfReferenceUID:r.metadata.FrameOfReferenceUID,cameraFocalPoint:p},{asNearbyProjection:!0}))continue;const m=n.worldToCanvas(p),S=[m,[m[0]+20,m[1]+20]];s.drawing.drawArrow(t,o,"1",S[1],S[0],{color:f.color,width:f.lineWidth}),this.renderTextBox(t,n,S,r,i,f)}}}_getTextBoxLinesFromLabels(e){Math.min(e.length,5);return[]}renderTextBox(e,t,n,r,o,a={}){if(!n||!r)return;const{annotationUID:i,data:c={}}=r,{labels:l}=c,u=[];for(const e of l)"363698007"===e.label&&u.push(`Finding Site: ${e.value}`);const{color:d}=a,f=n,p=s.utilities.drawing.getTextBoxCoordsCanvas(f);r.data?.handles?.textBox?.worldPosition||(r.data.handles.textBox.worldPosition=t.canvasToWorld(p));const m=t.worldToCanvas(r.data.handles.textBox.worldPosition),S=this.getLinkedTextBoxStyle(o,r),g=s.drawing.drawLinkedTextBox(e,i,"1",u,m,n,{},{...S,color:d}),{x:h,y:I,width:y,height:R}=g;r.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])}}getLinkedTextBoxStyle(e,t){return{visibility:this.getStyle("textBoxVisibility",e,t),fontFamily:this.getStyle("textBoxFontFamily",e,t),fontSize:this.getStyle("textBoxFontSize",e,t),color:this.getStyle("textBoxColor",e,t),shadow:this.getStyle("textBoxShadow",e,t),background:this.getStyle("textBoxBackground",e,t),lineWidth:this.getStyle("textBoxLinkLineWidth",e,t),lineDash:this.getStyle("textBoxLinkLineDash",e,t)}}}ue.toolName=g.SRSCOORD3DPoint;const de={toAnnotation:e=>{},toMeasurement:({servicesManager:e,getValueTypeFromToolType:t},n)=>{const{displaySetService:r}=e.services,{annotation:o}=n,{metadata:a,data:i,annotationUID:s}=o;if(!a||!i)return console.warn("Probe tool: Missing metadata or data"),null;const{toolName:c,FrameOfReferenceUID:l}=a,{points:u}=i.handles,d=r.getActiveDisplaySets().filter(e=>e.FrameOfReferenceUID===l),f=d.filter(e=>e.isReconstructable)[0]||d[0],{StudyInstanceUID:p,SeriesInstanceUID:m}=d[0]||{},S=function(e){const{data:t}=e;if(!t)return[""];const{labels:n}=t,r=[];for(const e of n)"33636980076"===e.label&&r.push(`Finding Site: ${e.value}`);return{primary:r,secondary:[]}}(o);return{uid:s,points:u,metadata:a,referenceStudyUID:p,referenceSeriesUID:m,displaySetInstanceUID:f?.displaySetInstanceUID,toolName:a.toolName,label:i.label,displayText:S,data:i.cachedStats,type:t?.(c)??null}}};function fe(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)}const{CORNERSTONE_3D_TOOLS_SOURCE_NAME:pe,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:me}=a.Enums;var Se=m(291);function ge(){return ge=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},ge.apply(null,arguments)}const he=e.lazy(()=>Promise.resolve().then(m.bind(m,525))),Ie=t=>e.createElement(e.Suspense,{fallback:e.createElement("div",null,"Loading...")},e.createElement(he,t)),ye={id:R,onModeEnter:function({servicesManager:e}){const{displaySetService:t}=e.services;[...t.getDisplaySetCache().values()].filter(e=>e.SOPClassHandlerId===D||e.SOPClassHandlerId===O).forEach(e=>{e.isHydrated=!1})},preRegistration:function({configuration:e={},servicesManager:t}){const{measurementService:n}=t.services;fe(g.DICOMSRDisplay,se),fe(g.SRLength,s.LengthTool),fe(g.SRBidirectional,s.BidirectionalTool),fe(g.SREllipticalROI,s.EllipticalROITool),fe(g.SRCircleROI,s.CircleROITool),fe(g.SRArrowAnnotate,s.ArrowAnnotateTool),fe(g.SRAngle,s.AngleTool),fe(g.SRPlanarFreehandROI,s.PlanarFreehandROITool),fe(g.SRRectangleROI,s.RectangleROITool),fe(g.SRSCOORD3DPoint,ue),fe(g.SRCobbAngle,s.CobbAngleTool);const r=n.getSource(pe,me),{POINT:o}=n.VALUE_TYPES;n.addMapping(r,"SRSCOORD3DPoint",o,de.toAnnotation,de.toMeasurement.bind(null,{servicesManager:t}));const a={lineDash:"4,4"};s.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{[g.DICOMSRDisplay]:a,SRLength:a,SRBidirectional:a,SREllipticalROI:a,SRCircleROI:a,SRArrowAnnotate:a,SRCobbAngle:a,SRAngle:a,SRPlanarFreehandROI:a,SRRectangleROI:a,global:{}})},getViewportModule:({servicesManager:t,extensionManager:n})=>[{name:"dicom-sr",component:r=>e.createElement(Ie,ge({servicesManager:t,extensionManager:n},r))}],getCommandsModule:ae,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("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,i,s,c,l)=>(()=>{var u,d,f={525:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>T});var r=n(598),o=n.n(r),a=n(326),i=n(2),s=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:i}=e,{displaySetService:p}=t.services,m=i.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,R]=(0,a.useState)(0),[C,D]=(0,a.useState)(null),[T,O]=(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,s.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 i=n.getDisplaySetByUID(a);if(!i?.images)return{referencedDisplaySetMetadata:null,referencedDisplaySet:null};const s=i.images[0],l={PatientID:s.PatientID,PatientName:s.PatientName,PatientSex:s.PatientSex,PatientAge:s.PatientAge,SliceThickness:s.SliceThickness,StudyDate:s.StudyDate,SeriesDescription:s.SeriesDescription,SeriesInstanceUID:s.SeriesInstanceUID,SeriesNumber:s.SeriesNumber,ManufacturerModelName:s.ManufacturerModelName,SpacingBetweenSlices:s.SpacingBetweenSlices};return{referencedDisplaySetMetadata:l,referencedDisplaySet:i}}(S,e,p).then(({referencedDisplaySet:t,referencedDisplaySetMetadata:n})=>{if(!t||!n)return;R(e),D(t),O(n);const{presentationIds:r}=i,o=S.measurements[e];g(r.positionPresentationId,{viewReference:o.viewReference||{referencedImageId:o.imageId}})})},[r,S,C,m]),x=(0,a.useCallback)(()=>{if(!C)return null;const{measurements:t}=S;return t[y]?a.createElement(l.OHIFCornerstoneViewport,f({},e,{displaySets:[C],viewportOptions:{...i,toolGroupId:"SRToolGroup",viewportType:"stack",positionIds:null},onElementEnabled:t=>{e.onElementEnabled?.(t),(e=>{E(e.detail.element)})(t)},isJumpToMeasurementDisabled:!0})):null},[C,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 M=null;return C&&T?(n&&n.length&&(M=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"},x(),M))):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?i.utils.formatPN(t):void 0},DATE:e=>{const{Date:t}=e;return t?i.utils.formatDate(t):void 0},TIME:e=>{const{Time:t}=e;return t?i.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`${i.utils.formatDate(n)} ${i.utils.formatTime(r)}`}};function h(e){const{contentItem:t,nodeIndexesTree:n,continuityOfContent:r}=e,{ConceptNameCodeSequence:o}=t,{CodeValue:i,CodeMeaning:s}=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=i===S.n7.Finding,f=u&&!c&&/^[a-zA-Z0-9]/.test(l?.[0]);let p="whitespace-pre-line";return i===S.n7.Finding&&(p="whitespace-pre-wrap"),u?a.createElement(a.Fragment,null,a.createElement("span",{className:p,title:s},f?" ":"",l)):a.createElement(a.Fragment,null,a.createElement("div",{className:"mb-2"},a.createElement("span",{className:"font-bold"},s,": "),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:i}=t,{CodeMeaning:s}=i??{};let c=1;const l=t.ContentSequence?.map((e,t)=>{const{ValueType:i}=e,s=[...n,t],l=s.join(".");let u,d;if("CONTAINER"===i){u=y,d={container:e,nodeIndexesTree:s,containerNumberedTree:[...r,c++]}}else u=h,d={contentItem:e,nodeIndexesTree:s,continuityOfContent:o};return a.createElement(u,I({key:l},d))});return a.createElement("div",null,a.createElement("div",{className:"font-bold"},r.join("."),". ",s),a.createElement("div",{className:"ml-4 mb-2"},l))}function R(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)},R.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(i.ExtensionManager).isRequired};const C=R;function D(e){const{displaySets:t}=e,{isImagingMeasurementReport:n}=t[0];return n?a.createElement(m,e):a.createElement(C,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(i.ExtensionManager).isRequired};const T=D},193:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>c,bY:()=>s,n7:()=>i,sh:()=>a});var r=n(142);const{CodeScheme:o}=r.adaptersSR.Cornerstone3D,a={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"},i={ImagingMeasurementReport:"126000",ImageLibrary:"111028",ImagingMeasurements:"126010",MeasurementGroup:"125007",ImageLibraryGroup:"126200",TrackingUniqueIdentifier:"112040",TrackingIdentifier:"112039",Finding:"121071",FindingSite:"G-C0E3",FindingSiteSCT:"363698007"},s={SRT:"SRT",SCT:"SCT",CornerstoneCodeSchemes:[o.CodingSchemeDesignator,"CST4"]},c={CodeNameCodeSequenceValues:i,CodingSchemeDesignators:s,RelationshipType:{INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},SCOORDTypes:a}},942:(e,t,n)=>{"use strict";n.d(t,{eF:()=>i,m1:()=>a});var r=n(557);const o={TrackingUniqueIdentifier:null,trackingIdentifiersByViewportId:{}};function a(e,t,n=0){const a=(0,r.getEnabledElement)(e),{viewport:i}=a;o.trackingIdentifiersByViewportId[i.id]={trackingUniqueIdentifiers:t,activeIndex:n}}function i(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:()=>s});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)},i=(e,t)=>{const n=[],r={};for(const o of t.measurements){const{imageId:t}=o;if(!t)continue;if(r[t])continue;const i=a(o,e);i?(r[t]=i,n.push(i)):console.log("Measurement",o,"had no instances found")}return n},s=(e,t)=>{const n=i(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,...i(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,i){if(i!==r){var s=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 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: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"),i=Symbol.for("react.profiler"),s=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 R=y.prototype=new I;R.constructor=y,S(R,h.prototype),R.isPureReactComponent=!0;var C=Array.isArray,D=Object.prototype.hasOwnProperty,T={current:null},O={key:!0,ref:!0,__self:!0,__source:!0};function v(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)D.call(t,o)&&!O.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:i,ref:s,props:a,_owner:T.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,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var c=!1;if(null===e)c=!0;else switch(s){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case n:case r:c=!0}}if(c)return i=i(c=e),e=""===a?"."+w(c,0):a,C(i)?(o="",null!=e&&(o=e.replace(b,"$&/")+"/"),N(i,t,o,"",function(e){return e})):null!=i&&(E(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,o+(!i.key||c&&c.key===i.key?"":(""+i.key).replace(b,"$&/")+"/")+e)),t.push(i)),1;if(c=0,a=""===a?".":a+":",C(e))for(var l=0;l<e.length;l++){var u=a+w(s=e[l],l);c+=N(s,t,o,u,i)}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;!(s=e.next()).done;)c+=N(s=s.value,t,o,u=a+w(s,l++),i);else if("object"===s)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 x(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 M={current:null},P={transition:null},q={ReactCurrentDispatcher:M,ReactCurrentBatchConfig:P,ReactCurrentOwner:T};function _(){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=i,t.PureComponent=y,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=q,t.act=_,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,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=T.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)&&!O.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:i,props:o,_owner:s}},t.createContext=function(e){return(e={$$typeof:c,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:s,_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:x}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=P.transition;P.transition={};try{e()}finally{P.transition=t}},t.unstable_act=_,t.useCallback=function(e,t){return M.current.useCallback(e,t)},t.useContext=function(e){return M.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return M.current.useDeferredValue(e)},t.useEffect=function(e,t){return M.current.useEffect(e,t)},t.useId=function(){return M.current.useId()},t.useImperativeHandle=function(e,t,n){return M.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return M.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return M.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return M.current.useMemo(e,t)},t.useReducer=function(e,t,n){return M.current.useReducer(e,t,n)},t.useRef=function(e){return M.current.useRef(e)},t.useState=function(e){return M.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return M.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return M.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=s},155:e=>{"use strict";e.exports=i}},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,i=0;i<t.length;i++)(!1&r||o>=r)&&Object.keys(m.O).every(e=>m.O[e](t[i]))?t.splice(i--,1):(a=!1,r<o&&(o=r));if(a){u.splice(c--,1);var s=n();void 0!==s&&(e=s)}}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:()=>Se.A,default:()=>ye,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),i=m(142),s=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],i=e[1],s=l.vec3.distance(a,i),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,s);const S=l.vec3.create();l.vec3.scaleAndAdd(S,a,d,-s);const g=l.vec3.create();l.vec3.scaleAndAdd(g,a,p,s);const h=l.vec3.create();l.vec3.scaleAndAdd(h,a,p,-s),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]),i=l.vec3.fromValues(...e[1]),s=l.vec3.fromValues(...e[2]),u=l.vec3.fromValues(...e[3]),p=l.vec3.create();l.vec3.sub(p,i,a),l.vec3.normalize(p,p);const m=l.vec3.create();l.vec3.sub(m,u,s),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)),R=Math.abs(I),C=Math.abs(y);o=[],Math.abs(R-1)<d?o=[e[0],e[1],e[2],e[3]]:Math.abs(C-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",SRSCOORD3DPoint:"SRSCOORD3DPoint"},{MeasurementReport:h}=i.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:i}=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}if("SCOORD3D"===l){h.getAdapterForTrackingIdentifier(e.TrackingIdentifier)||(o=g.SRSCOORD3DPoint),f=e.coords[0].ReferencedFrameOfReferenceSequence,m={FrameOfReferenceUID:f,point:d[0][0]}}e.viewReference={planeRestriction:m,FrameOfReferenceUID:f,referencedImageId:t};const S={annotationUID:i,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:i,labels:e.labels}};s.annotation.state.addAnnotation(S)}const{MeasurementReport:y}=i.adaptersSR.Cornerstone3D;const R=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-sr"}').UU,C="dicom-sr",D=`${R}.sopClassHandlerModule.${C}`,T="dicom-sr-3d",O=`${R}.sopClassHandlerModule.${T}`,{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:x}=i.adaptersSR.Cornerstone3D,M=[v.BasicTextSR,v.EnhancedSR,v.ComprehensiveSR,v.Comprehensive3DSR];function P(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:i,SeriesInstanceUID:s,SOPInstanceUID:c,SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,ConceptNameCodeSequence:m,SOPClassUID:S}=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 g=S===v.Comprehensive3DSR,h=m?.CodeValue===u.n7.ImagingMeasurementReport,I={Modality:"SR",displaySetInstanceUID:t.utils.guid(),SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,SOPInstanceUID:c,SeriesInstanceUID:s,StudyInstanceUID:i,SOPClassHandlerId:g?O:D,SOPClassUID:S,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,isImagingMeasurementReport:h,sopClassUids:M,instance:a,addInstances:P,label:l||`${o().t("Series")} ${d} - ${o().t("SR")}`};return I.load=()=>async function(e,t,n){const{displaySetService:r,measurementService:o}=t.services,a=n.getDataSources(),i=a[0],{ContentSequence:s}=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 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 c(s);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}(s),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:i,CodingSchemeDesignator:s}=a,c=`${s}:${i}`,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),i=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===U.schemeDesignator&&e.ConceptNameCodeSequence.CodeValue===U.value),s={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};if(i)for(const e of i)e.TextValue&&s.labels.push({label:e.TextValue,value:""});o&&u.bY.CornerstoneCodeSchemes.includes(o.ConceptCodeSequence.CodingSchemeDesignator)&&o.ConceptCodeSequence.CodeValue===x.codeValues.CORNERSTONEFREETEXT&&s.labels.push({label:x.codeValues.CORNERSTONEFREETEXT,value:o.ConceptCodeSequence.CodeMeaning});if(a.length){const e=a.find(e=>u.bY.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===x.codeValues.CORNERSTONEFREETEXT);e&&s.labels.push({label:x.codeValues.CORNERSTONEFREETEXT,value:e.ConceptCodeSequence.CodeMeaning})}return t.forEach(e=>{const{ConceptNameCodeSequence:t,ContentSequence:n,MeasuredValueSequence:r}=e,{ValueType:o}=n;if("SCOORD"===!o)return void console.warn(`Graphic ${o} not currently supported, skipping annotation.`);const a=A(n);a&&s.coords.push(a),r&&s.labels.push(F(t,r))}),s}(e)}(n[e]);t&&r.push(t)}),r}(s)):(e.referencedImages=[],e.measurements=[]);const l=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:i,pointsLength:s}=t;if(!o&&!a){console.warn("No tracking identifier or graphicType for measurement ",t);continue}const c=y.getAdapterForTrackingIdentifier(o),l=y.getAdaptersForTypes(i,a,s),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,l),e.isLoaded=!0,r.activeDisplaySets.forEach(n=>{k(e,n,i,t)}),r.subscribe(r.EVENTS.DISPLAY_SETS_ADDED,n=>{const{displaySetsAdded:r}=n;r.forEach(n=>{k(e,n,i,t)})})}(I,n,r),[I]}function _({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 i=new Map,s=n.getImageIdsForDisplaySet(t);for(const e of s){const{SOPInstanceUID:t,frameNumber:n}=w.getUIDsFromImageID(e),r=`${t}:${n||1}`;i.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 s="SCOORD3D"===r.coords?.[0]?.ValueType,l=o.getCustomization("onBeforeSRAddMeasurement");if("function"==typeof l&&(r=l({measurement:r,StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID})),c&&s&&_({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=i.get(p);m&&V(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 V(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:C,sopClassUids:M,getDisplaySetsFromSeries:r},{name:T,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 W=function(e,t){const n={};function r(r,o){const a=r.metadata?.referencedImageId??i.NO_IMAGE_ID;n[a]||(n[a]={});const s=n[a];s[o]||(s[o]={data:[]});const c=e.find(e=>e.uid===r.annotationUID),l=s[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=s.annotation.state.getAnnotationManager(),c=a.getFramesOfReference();for(let e=0;e<c.length;e++){const t=c[e],i=a.getAnnotations(t),s=Object.keys(i);for(let e=0;e<s.length;e++){const t=s[e],a=i[t];if(a)for(let e=0;e<a.length;e++){const i=a[e],s=o.findIndex(e=>e===i.annotationUID);if(-1!==s&&(r(i,t),o.splice(s,1),!o.length))return n}}}return n},{CodeScheme:H}=i.adaptersSR.Cornerstone3D;const{locking:z}=s.annotation,{guid:Y}=n().utils,{MeasurementReport:X}=i.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:i,displaySetService:s,customizationService:l}=e.services,u=l.getCustomization("codingValues"),d=l.getCustomization("panelMeasurement.disableEditing"),f=s.getDisplaySetByUID(o),p=i.getSourceMappings(J,K);if(!p||!p.length)throw new Error("Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.");const m=t.DicomMetadataStore.getInstance(f.StudyInstanceUID,f.SeriesInstanceUID,f.SOPInstanceUID),S={};f.measurements.forEach(e=>{const{ReferencedSOPInstanceUID:t,imageId:n,frameNumber:r=1}=e,o=`${t}:${r}`;S[o]||(S[o]=n)});const g=m;let h=X.generateToolState(g,S,c.metaData);const I=l.getCustomization("onBeforeSRHydration")?.value;"function"==typeof I&&(h=I({storedMeasurementByAnnotationType:h,displaySet:f}));const y=p.map(e=>e.annotationType),R={};Object.keys(h).forEach(e=>{y.includes(e)&&(R[e]=h[e])});const C=[];let D;Object.keys(R).forEach(e=>{R[e].forEach(e=>{const t=e.annotation.data?.frameNumber||1,n=S[`${e.sopInstanceUid}:${t}`];C.includes(n)||C.push(n)})});const T=[];for(let e=0;e<C.length;e++){const t=C[e];if(!t)continue;const{SeriesInstanceUID:n,StudyInstanceUID:r}=c.metaData.get("instance",t);T.includes(n)||T.push(n),D?D!==r&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):D=r}function O(t){const n=t.annotation.data&&t.annotation.data.frameNumber||1,r=S[`${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 i=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),s={...te(i,r),volumeId:i.displaySetInstanceUID,FrameOfReferenceUID:n};return c.utilities.updatePlaneRestriction(r,s),s}(t,e);const o=c.metaData.get("instance",r),{FrameOfReferenceUID:a}=o;return{referencedImageId:r,FrameOfReferenceUID:a}}return Object.keys(R).forEach(e=>{R[e].forEach(t=>{t.uid=Y();const n=O(t),{imageId:o}=n,s={annotationUID:t.annotation.annotationUID,data:t.annotation.data,metadata:{...n,toolName:e}};c.utilities.updatePlaneRestriction(s.data.handles.points,s.metadata);const l=i.getSource(J,K);s.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===H.codeValues.CORNERSTONEFREETEXT);return o?o.CodeMeaning:n&&n.CodeValue===H.codeValues.CORNERSTONEFREETEXT?n.CodeMeaning:void 0}(t),s.data.finding=Q(u,t.finding?.[0]),s.data.findingSites=Z(u,t.findingSites),s.data.findingSites?.forEach(e=>{e.type&&(s.data[e.type]=e)});const f=p.find(t=>t.annotationType===e),m=i.addRawMeasurement(l,e,{annotation:s},f.toMeasurementSchema,a);r.runCommand("updateMeasurement",{uid:m,code:s.data.finding}),d&&z.setAnnotationLocked(m,!0),o&&!C.includes(o)&&C.push(o)})}),f.isHydrated=!0,{StudyInstanceUID:D,SeriesInstanceUIDs:T}}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{MeasurementReport:ne}=i.adaptersSR.Cornerstone3D,{log:re}=n(),oe=(e,t,n={})=>{const r=W(e,t),o=ne.generateReport(r,c.metaData,n),{dataset:a}=o;return void 0===a.SpecificCharacterSet&&(a.SpecificCharacterSet="ISO_IR 192"),a.InstanceNumber=n.InstanceNumber??1,a},ae=e=>{const{servicesManager:n,extensionManager:r,commandsManager:o}=e,{customizationService:a}=n.services,i={changeColorMeasurement:({uid:e})=>{throw new Error("Unsupported operation: changeColorMeasurement")},downloadReport:({measurementData:e,additionalFindingTypes:t,options:n={}})=>{const r=oe(e,t,n),o=G().data.datasetToBlob(r),a=URL.createObjectURL(o);window.location.assign(a)},storeMeasurements:async({measurementData:e,dataSource:n,additionalFindingTypes:r,options:o={}})=>{if(re.info("[DICOMSR] storeMeasurements"),!n||!n.store||!n.store.dicom)return re.error("[DICOMSR] datasource has no dataSource.store.dicom endpoint!"),Promise.reject({});try{const i=oe(e,r,o),{StudyInstanceUID:s,ContentSequence:c}=i;if(!c?.[4].ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",i),new Error("Invalid report, no content");if(!i.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:i})),await n.store.dicom(i,null,u),s&&n.deleteStudyMetadataPromise(s),t.DicomMetadataStore.addInstances([i],!0),i}catch(e){throw console.warn(e),re.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:i,definitions:{downloadReport:i.downloadReport,storeMeasurements:i.storeMeasurements,hydrateStructuredReport:i.hydrateStructuredReport},defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};var ie=m(942);class se extends s.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=s.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:i,trackingUniqueIdentifiers:c}=a,l=c[i],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}=s.annotation.config;for(let e=0;e<d.length;e++){const r=d[e],o=r.annotationUID,{renderableData:a,TrackingUniqueIdentifier:i}=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:i===l?"rgb(0, 255, 0)":this.getStyle("color",f,r),lineDash:g,lineWidth:S,...m};Object.keys(a).forEach(e=>{const i=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=s.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const p=l(t,n,i,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(`${le(t.label)}: ${t.value}`)}return n}renderPolyLine(e,t,n,r,o,a){const i={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?s.drawing.drawLine(e,r,l,a[0],a[1],i):s.drawing.drawPolyline(e,r,l,a,i),c=c.concat(a)}),c}renderMultipoint(e,t,n,r,o,a){let i;n.map((n,o)=>{i=n.map(e=>t.worldToCanvas(e));s.drawing.drawHandles(e,r,"0",i,{color:a.color})})}renderPoint(e,t,n,r,o,a){const i=[];return n.map((n,l)=>{const u=n[0];if(i.push(t.worldToCanvas(u)),void 0!==n[1])i.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),s=c.utilities.imageToWorldCoords(o,[a[0]+n,a[1]+r]);i.push(t.worldToCanvas(s))}const d=`${l}`;s.drawing.drawArrow(e,r,d,i[1],i[0],{color:a.color,width:a.lineWidth})}),i}renderEllipse(e,t,n,r,o,a){let i;return n.map((n,o)=>{if(0===n.length)return;const c=n,l=t.getRotation();let u;i=c.map(e=>t.worldToCanvas(e)),u=90==l||270==l?s.utilities.math.ellipse.getCanvasEllipseCorners([i[2],i[3],i[0],i[1]]):s.utilities.math.ellipse.getCanvasEllipseCorners(i);const d=`${o}`;s.drawing.drawEllipse(e,r,d,u[0],u[1],{color:a.color,width:a.lineWidth,lineDash:a.lineDash})}),i}renderTextBox(e,t,n,r,o,a,i={}){if(!n||!o)return;const{annotationUID:c,data:l={}}=o,{labels:u}=l,{color:d}=i;let f=n;"function"==typeof r&&(f=r(n));const p=this._getTextBoxLinesFromLabels(u),m=s.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=s.drawing.drawLinkedTextBox(e,c,"1",p,S,n,{},{...g,color:d}),{x:I,y,width:R,height:C}=h;o.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([I,y]),topRight:t.canvasToWorld([I+R,y]),bottomLeft:t.canvasToWorld([I,y+C]),bottomRight:t.canvasToWorld([I+R,y+C])}}}se.toolName=g.DICOMSRDisplay;const ce={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function le(e){const t=ce[e];return void 0!==t?t:e}class ue extends s.AnnotationDisplayTool{constructor(e={},t={configuration:{}}){super(e,t),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{const{viewport:n}=e,{element:r}=n,o=s.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;const a=o;if(!n._actors?.size)return;const i={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<a.length;e++){const r=a[e],o=r.annotationUID,{renderableData:c}=r.data,{POINT:l}=c;i.annotationUID=o;const u=this.getStyle("lineWidth",i,r),d=this.getStyle("lineDash",i,r),f={color:this.getStyle("color",i,r),lineDash:d,lineWidth:u},p=l[0][0];if(!n.isReferenceViewable({FrameOfReferenceUID:r.metadata.FrameOfReferenceUID,cameraFocalPoint:p},{asNearbyProjection:!0}))continue;const m=n.worldToCanvas(p),S=[m,[m[0]+20,m[1]+20]];s.drawing.drawArrow(t,o,"1",S[1],S[0],{color:f.color,width:f.lineWidth}),this.renderTextBox(t,n,S,r,i,f)}}}_getTextBoxLinesFromLabels(e){Math.min(e.length,5);return[]}renderTextBox(e,t,n,r,o,a={}){if(!n||!r)return;const{annotationUID:i,data:c={}}=r,{labels:l}=c,u=[];for(const e of l)"363698007"===e.label&&u.push(`Finding Site: ${e.value}`);const{color:d}=a,f=n,p=s.utilities.drawing.getTextBoxCoordsCanvas(f);r.data?.handles?.textBox?.worldPosition||(r.data.handles.textBox.worldPosition=t.canvasToWorld(p));const m=t.worldToCanvas(r.data.handles.textBox.worldPosition),S=this.getLinkedTextBoxStyle(o,r),g=s.drawing.drawLinkedTextBox(e,i,"1",u,m,n,{},{...S,color:d}),{x:h,y:I,width:y,height:R}=g;r.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])}}getLinkedTextBoxStyle(e,t){return{visibility:this.getStyle("textBoxVisibility",e,t),fontFamily:this.getStyle("textBoxFontFamily",e,t),fontSize:this.getStyle("textBoxFontSize",e,t),color:this.getStyle("textBoxColor",e,t),shadow:this.getStyle("textBoxShadow",e,t),background:this.getStyle("textBoxBackground",e,t),lineWidth:this.getStyle("textBoxLinkLineWidth",e,t),lineDash:this.getStyle("textBoxLinkLineDash",e,t)}}}ue.toolName=g.SRSCOORD3DPoint;const de={toAnnotation:e=>{},toMeasurement:({servicesManager:e,getValueTypeFromToolType:t},n)=>{const{displaySetService:r}=e.services,{annotation:o}=n,{metadata:a,data:i,annotationUID:s}=o;if(!a||!i)return console.warn("Probe tool: Missing metadata or data"),null;const{toolName:c,FrameOfReferenceUID:l}=a,{points:u}=i.handles,d=r.getActiveDisplaySets().filter(e=>e.FrameOfReferenceUID===l),f=d.filter(e=>e.isReconstructable)[0]||d[0],{StudyInstanceUID:p,SeriesInstanceUID:m}=d[0]||{},S=function(e){const{data:t}=e;if(!t)return[""];const{labels:n}=t,r=[];for(const e of n)"33636980076"===e.label&&r.push(`Finding Site: ${e.value}`);return{primary:r,secondary:[]}}(o);return{uid:s,points:u,metadata:a,referenceStudyUID:p,referenceSeriesUID:m,displaySetInstanceUID:f?.displaySetInstanceUID,toolName:a.toolName,label:i.label,displayText:S,data:i.cachedStats,type:t?.(c)??null}}};function fe(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)}const{CORNERSTONE_3D_TOOLS_SOURCE_NAME:pe,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:me}=a.Enums;var Se=m(291);function ge(){return ge=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},ge.apply(null,arguments)}const he=e.lazy(()=>Promise.resolve().then(m.bind(m,525))),Ie=t=>e.createElement(e.Suspense,{fallback:e.createElement("div",null,"Loading...")},e.createElement(he,t)),ye={id:R,onModeEnter:function({servicesManager:e}){const{displaySetService:t}=e.services;[...t.getDisplaySetCache().values()].filter(e=>e.SOPClassHandlerId===D||e.SOPClassHandlerId===O).forEach(e=>{e.isHydrated=!1})},preRegistration:function({configuration:e={},servicesManager:t}){const{measurementService:n}=t.services;fe(g.DICOMSRDisplay,se),fe(g.SRLength,s.LengthTool),fe(g.SRBidirectional,s.BidirectionalTool),fe(g.SREllipticalROI,s.EllipticalROITool),fe(g.SRCircleROI,s.CircleROITool),fe(g.SRArrowAnnotate,s.ArrowAnnotateTool),fe(g.SRAngle,s.AngleTool),fe(g.SRPlanarFreehandROI,s.PlanarFreehandROITool),fe(g.SRRectangleROI,s.RectangleROITool),fe(g.SRSCOORD3DPoint,ue),fe(g.SRCobbAngle,s.CobbAngleTool);const r=n.getSource(pe,me),{POINT:o}=n.VALUE_TYPES;n.addMapping(r,"SRSCOORD3DPoint",o,de.toAnnotation,de.toMeasurement.bind(null,{servicesManager:t}));const a={lineDash:"4,4"};s.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{[g.DICOMSRDisplay]:a,SRLength:a,SRBidirectional:a,SREllipticalROI:a,SRCircleROI:a,SRArrowAnnotate:a,SRCobbAngle:a,SRAngle:a,SRPlanarFreehandROI:a,SRRectangleROI:a,global:{}})},getViewportModule:({servicesManager:t,extensionManager:n})=>[{name:"dicom-sr",component:r=>e.createElement(Ie,ge({servicesManager:t,extensionManager:n},r))}],getCommandsModule:ae,getSopClassHandlerModule:j,getUtilityModule:({servicesManager:e})=>[{name:"tools",exports:{toolNames:g}}]}})(),S=m.O(S)})());
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ohif/extension-cornerstone-dicom-sr",
|
|
3
|
-
"version": "3.12.0-beta.
|
|
3
|
+
"version": "3.12.0-beta.69",
|
|
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.12.0-beta.
|
|
38
|
-
"@ohif/extension-cornerstone": "3.12.0-beta.
|
|
39
|
-
"@ohif/extension-measurement-tracking": "3.12.0-beta.
|
|
40
|
-
"@ohif/ui": "3.12.0-beta.
|
|
37
|
+
"@ohif/core": "3.12.0-beta.69",
|
|
38
|
+
"@ohif/extension-cornerstone": "3.12.0-beta.69",
|
|
39
|
+
"@ohif/extension-measurement-tracking": "3.12.0-beta.69",
|
|
40
|
+
"@ohif/ui": "3.12.0-beta.69",
|
|
41
41
|
"dcmjs": "0.43.1",
|
|
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.5.
|
|
50
|
-
"@cornerstonejs/core": "4.5.
|
|
51
|
-
"@cornerstonejs/tools": "4.5.
|
|
49
|
+
"@cornerstonejs/adapters": "4.5.19",
|
|
50
|
+
"@cornerstonejs/core": "4.5.19",
|
|
51
|
+
"@cornerstonejs/tools": "4.5.19",
|
|
52
52
|
"classnames": "2.5.1"
|
|
53
53
|
}
|
|
54
54
|
}
|