@ohif/extension-cornerstone-dicom-sr 3.11.0-beta.9 → 3.11.0-beta.91
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/extension-cornerstone"),require("@cornerstonejs/adapters"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("gl-matrix"),require("@ohif/ui-next"),require("@ohif/i18n"),require("dcmjs")):"function"==typeof define&&define.amd?define(["@ohif/core","@ohif/extension-cornerstone","@cornerstonejs/adapters","@cornerstonejs/tools","@cornerstonejs/core","gl-matrix","@ohif/ui-next","@ohif/i18n","dcmjs"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-sr"]=t(require("@ohif/core"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/adapters"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("gl-matrix"),require("@ohif/ui-next"),require("@ohif/i18n"),require("dcmjs")):e["ohif-extension-cornerstone-dicom-sr"]=t(e["@ohif/core"],e["@ohif/extension-cornerstone"],e["@cornerstonejs/adapters"],e["@cornerstonejs/tools"],e["@cornerstonejs/core"],e["gl-matrix"],e["@ohif/ui-next"],e["@ohif/i18n"],e.dcmjs)}(globalThis,((e,t,n,r,o,a,i,s,c)=>(()=>{var l,u,d={48:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>W});var r=n(598),o=n.n(r),a=n(326),i=n(2);n(741);Object.create(null);function s(){if(console&&console.warn){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];"string"==typeof n[0]&&(n[0]="react-i18next:: ".concat(n[0])),(e=console).warn.apply(e,n)}}var c={};function l(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];"string"==typeof t[0]&&c[t[0]]||("string"==typeof t[0]&&(c[t[0]]=new Date),s.apply(void 0,t))}var u=function(e,t){return function(){if(e.isInitialized)t();else{e.on("initialized",(function n(){setTimeout((function(){e.off("initialized",n)}),0),t()}))}}};function d(e,t,n){e.loadNamespaces(t,u(e,n))}function f(e,t,n,r){"string"==typeof n&&(n=[n]),n.forEach((function(t){e.options.ns.indexOf(t)<0&&e.options.ns.push(t)})),e.loadLanguages(t,u(e,r))}function p(e){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p(e)}function m(e){var t=function(e,t){if("object"!=p(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=p(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==p(t)?t:t+""}function g(e,t,n){return(t=m(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var S=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,h={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},y=function(e){return h[e]};var I={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:function(e){return e.replace(S,y)}};var C;function v(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,m(r.key),r)}}var b=(0,a.createContext)(),R=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.usedNamespaces={}}return function(e,t,n){t&&v(e.prototype,t),n&&v(e,n),Object.defineProperty(e,"prototype",{writable:!1})}(e,[{key:"addUsedNamespaces",value:function(e){var t=this;e.forEach((function(e){t.usedNamespaces[e]||(t.usedNamespaces[e]=!0)}))}},{key:"getUsedNamespaces",value:function(){return Object.keys(this.usedNamespaces)}}]),e}();function O(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function E(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw o}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return O(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?O(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function T(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function D(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?T(Object(n),!0).forEach((function(t){g(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):T(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function w(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.i18n,r=(0,a.useContext)(b)||{},o=r.i18n,i=r.defaultNS,s=n||o||C;if(s&&!s.reportNamespaces&&(s.reportNamespaces=new R),!s){l("You will need to pass in an i18next instance by using initReactI18next");var c=function(e,t){return"string"==typeof t?t:t&&"object"===p(t)&&"string"==typeof t.defaultValue?t.defaultValue:Array.isArray(e)?e[e.length-1]:e},u=[c,{},!1];return u.t=c,u.i18n={},u.ready=!1,u}s.options.react&&void 0!==s.options.react.wait&&l("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");var m=D(D(D({},I),s.options.react),t),g=m.useSuspense,S=m.keyPrefix,h=e||i||s.options&&s.options.defaultNS;h="string"==typeof h?[h]:h||["translation"],s.reportNamespaces.addUsedNamespaces&&s.reportNamespaces.addUsedNamespaces(h);var y=(s.isInitialized||s.initializedStoreOnce)&&h.every((function(e){return function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return t.languages&&t.languages.length?void 0!==t.options.ignoreJSONStructure?t.hasLoadedNamespace(e,{lng:n.lng,precheck:function(t,r){if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!r(t.isLanguageChangingTo,e))return!1}}):function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=t.languages[0],o=!!t.options&&t.options.fallbackLng,a=t.languages[t.languages.length-1];if("cimode"===r.toLowerCase())return!0;var i=function(e,n){var r=t.services.backendConnector.state["".concat(e,"|").concat(n)];return-1===r||2===r};return!(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!i(t.isLanguageChangingTo,e)||!t.hasResourceBundle(r,e)&&t.services.backendConnector.backend&&(!t.options.resources||t.options.partialBundledLanguages)&&(!i(r,e)||o&&!i(a,e)))}(e,t,n):(l("i18n.languages were undefined or empty",t.languages),!0)}(e,s,m)}));function v(){return s.getFixedT(t.lng||null,"fallback"===m.nsMode?h:h[0],S)}var O=E((0,a.useState)(v),2),T=O[0],w=O[1],N=h.join();t.lng&&(N="".concat(t.lng).concat(N));var x,M,U,P=(x=N,U=(0,a.useRef)(),(0,a.useEffect)((function(){U.current=M?U.current:x}),[x,M]),U.current),k=(0,a.useRef)(!0);(0,a.useEffect)((function(){var e=m.bindI18n,n=m.bindI18nStore;function r(){k.current&&w(v)}return k.current=!0,y||g||(t.lng?f(s,t.lng,h,(function(){k.current&&w(v)})):d(s,h,(function(){k.current&&w(v)}))),y&&P&&P!==N&&k.current&&w(v),e&&s&&s.on(e,r),n&&s&&s.store.on(n,r),function(){k.current=!1,e&&s&&e.split(" ").forEach((function(e){return s.off(e,r)})),n&&s&&n.split(" ").forEach((function(e){return s.store.off(e,r)}))}}),[s,N]);var A=(0,a.useRef)(!0);(0,a.useEffect)((function(){k.current&&!A.current&&w(v),A.current=!1}),[s,S]);var L=[T,s,y];if(L.t=T,L.i18n=s,L.ready=y,y)return L;if(!y&&!g)return L;throw new Promise((function(e){t.lng?f(s,t.lng,h,(function(){return e()})):d(s,h,(function(){return e()}))}))}var N=n(942),x=n(55),M=n(291),U=n(669);function P(){return P=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},P.apply(null,arguments)}function k(e){const{children:t,dataSource:n,displaySets:r,viewportOptions:o,servicesManager:i,extensionManager:s}=e,{displaySetService:c,viewportActionCornersService:l}=i.services,u=o.viewportId;if(r.length>1)throw new Error("SR viewport should only have a single display set");const d=r[0],{setPositionPresentation:f}=(0,U.usePositionPresentationStore)(),[p,m]=(0,x.useViewportGrid)(),[g,S]=(0,a.useState)(0),[h,y]=(0,a.useState)(1),[I,C]=(0,a.useState)(null),[v,b]=(0,a.useState)(null),[R,O]=(0,a.useState)(null),{viewports:E,activeViewportId:T}=p,{t:D}=w("Common");let k;if(s.registeredExtensionIds.includes("@ohif/extension-measurement-tracking")){const e=s.getModuleEntry("@ohif/extension-measurement-tracking.contextModule.TrackedMeasurementsContext"),t=(0,a.useContext)(e.context);k=t?.[0]}const[L,q]=(0,a.useState)(k?.context?.trackedSeries?.length>0),j=(0,a.useCallback)((e=>{const{measurements:t}=d;(0,N.m1)(R,t.map((e=>e.TrackingUniqueIdentifier)),e)}),[R,g,d]),_=(0,a.useCallback)((e=>{const{StudyInstanceUID:t,displaySetInstanceUID:n,sopClassUids:r}=d;t&&n&&(r&&r.length>1&&console.warn("More than one SOPClassUID in the same series is not yet supported."),async function(e,t,n){const{measurements:r}=e,o=r[t],{displaySetInstanceUID:a}=o;e.keyImageDisplaySet||(e.keyImageDisplaySet=(0,M.A)(n,e));if(!a)return{referencedDisplaySetMetadata:null,referencedDisplaySet:null};const i=n.getDisplaySetByUID(a),s=i.images[0],c={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:c,referencedDisplaySet:i}}(d,e,c).then((({referencedDisplaySet:t,referencedDisplaySetMetadata:n})=>{if(!t||!n)return;S(e),C(t),b(n);const{presentationIds:r}=o,a=d.measurements[e];f(r.positionPresentationId,{viewReference:{referencedImageId:a.imageId}})})))}),[n,d,I,u]),V=(0,a.useCallback)((()=>{if(!I)return null;const{component:t}=s.getModuleEntry("@ohif/extension-cornerstone.viewportModule.cornerstone"),{measurements:n}=d;return n[g]?a.createElement(t,P({},e,{displaySets:[I],viewportOptions:{...o,toolGroupId:"SRToolGroup",viewportType:"stack",positionIds:null},onElementEnabled:t=>{e.onElementEnabled?.(t),(e=>{O(e.detail.element)})(t)},isJumpToMeasurementDisabled:!0})):null}),[I,u,g]),F=(0,a.useCallback)((e=>{let t=g;t+=e,t>=h?t=0:t<0&&(t=h-1),j(t),_(t)}),[g,h,_,j]);(0,a.useEffect)((()=>{const e=c.subscribe(c.EVENTS.DISPLAY_SETS_REMOVED,(({displaySetInstanceUIDs:e})=>{const t=E.get(T);e.includes(t.displaySetInstanceUID)&&m.setDisplaySetsForViewport({viewportId:T,displaySetInstanceUIDs:[]})}));return()=>{e.unsubscribe()}}),[]),(0,a.useEffect)((()=>{(async()=>{d.isLoaded||await d.load();const e=d.measurements.length;y(e),_(g)})()}),[d]),(0,a.useEffect)((()=>{(async()=>{d.isLoaded||await d.load(),R&&d.isLoaded&&j(g)})()}),[g,R,j,d]),(0,a.useEffect)((()=>{q(k?.context?.trackedSeries?.length>0)}),[k]),(0,a.useEffect)((()=>{l.addComponents([{viewportId:u,id:"viewportStatusComponent",component:A({srDisplaySet:d,viewportId:u,isRehydratable:d.isRehydratable,isLocked:L,t:D,servicesManager:i}),indexPriority:-100,location:l.LOCATIONS.topLeft},{viewportId:u,id:"viewportActionArrowsComponent",index:0,component:a.createElement(x.ViewportActionArrows,{key:"actionArrows",onArrowsClick:F}),indexPriority:0,location:l.LOCATIONS.topRight}])}),[L,F,d,D,l,u]);let B=null;return I&&v?(t&&t.length&&(B=t.map(((e,t)=>e&&a.cloneElement(e,{viewportId:u,key:t})))),a.createElement(a.Fragment,null,a.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},V(),B))):null}function A({srDisplaySet:e,viewportId:t,isRehydratable:n,isLocked:r,t:o,servicesManager:s}){const c=o("LOAD"),l=n&&!r?3:n&&r?2:1;let u=null,d=null;switch(l){case 1:d=()=>a.createElement(x.Icons.ByName,{name:"status-alert",className:"h-4 w-4"}),u=()=>a.createElement("div",null,"This structured report is not compatible",a.createElement("br",null),"with this application.");break;case 2:d=()=>a.createElement(x.Icons.ByName,{name:"status-locked",className:"h-4 w-4"}),u=()=>a.createElement("div",null,"This structured report is currently read-only",a.createElement("br",null),"because you are tracking measurements in",a.createElement("br",null),"another viewport.");break;case 3:d=()=>a.createElement(x.Icons.ByName,{className:"text-muted-foreground h-4 w-4",name:"status-untracked"}),u=()=>a.createElement("div",null,`Click ${c} to restore measurements.`)}const f=()=>{const{toolbarButtons:n,onInteraction:r}=(0,i.useToolbar)({servicesManager:s,buttonSection:"loadSRMeasurements"}),o={displaySetInstanceUID:e.displaySetInstanceUID,viewportId:t};return a.createElement("div",{className:"flex h-6 cursor-default text-sm leading-6 text-white"},a.createElement("div",{className:"bg-customgray-100 flex min-w-[45px] items-center rounded-l-xl rounded-r p-1"},a.createElement(d,{className:"h-4 w-4"}),a.createElement("span",{className:"ml-1"},"SR")),3===l&&a.createElement(a.Fragment,null,n.map((e=>{if(!e)return null;const{id:t,Component:n,componentProps:i}=e,s=a.createElement(n,P({key:t,id:t,onInteraction:e=>r({...e,...o})},i));return a.createElement("div",{key:t},s)}))))};return a.createElement(a.Fragment,null,u&&a.createElement(x.Tooltip,null,a.createElement(x.TooltipTrigger,{asChild:!0},a.createElement("span",null,a.createElement(f,null))),a.createElement(x.TooltipContent,{side:"bottom",align:"start"},a.createElement(u,null))),!u&&a.createElement(f,null))}k.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 L=k;var q=n(193);const j={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 _(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=j[t];return n?n(e):`[${t} is not supported]`}(t)??"[empty]",u="CONTINUOUS"===r,d=i===q.n7.Finding,f=u&&!c&&/^[a-zA-Z0-9]/.test(l?.[0]);let p="whitespace-pre-line";return i===q.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 V(){return V=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},V.apply(null,arguments)}function F(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=F,d={container:e,nodeIndexesTree:s,containerNumberedTree:[...r,c++]}}else u=_,d={contentItem:e,nodeIndexesTree:s,continuityOfContent:o};return a.createElement(u,V({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 B(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(F,{container:n})))}_.propTypes={contentItem:o().object,nodeIndexesTree:o().arrayOf(o().number),continuityOfContent:o().string},F.propTypes={container:o().object,nodeIndexesTree:o().arrayOf(o().number),containerNumberedTree:o().arrayOf(o().number)},B.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 $=B;function G(e){const{displaySets:t}=e,{isImagingMeasurementReport:n}=t[0];return n?a.createElement(L,e):a.createElement($,e)}G.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 W=G},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(){}},g=Object.assign,S={};function h(e,t,n){this.props=e,this.context=t,this.refs=S,this.updater=n||m}function y(){}function I(e,t,n){this.props=e,this.context=t,this.refs=S,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")},y.prototype=h.prototype;var C=I.prototype=new y;C.constructor=I,g(C,h.prototype),C.isPureReactComponent=!0;var v=Array.isArray,b=Object.prototype.hasOwnProperty,R={current:null},O={key:!0,ref:!0,__self:!0,__source:!0};function E(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)b.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:R.current}}function T(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var D=/\/+/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,v(i)?(o="",null!=e&&(o=e.replace(D,"$&/")+"/"),N(i,t,o,"",(function(e){return e}))):null!=i&&(T(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(D,"$&/")+"/")+e)),t.push(i)),1;if(c=0,a=""===a?".":a+":",v(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 x(e,t,n){if(null==e)return e;var r=[],o=0;return N(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function M(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var U={current:null},P={transition:null},k={ReactCurrentDispatcher:U,ReactCurrentBatchConfig:P,ReactCurrentOwner:R};function A(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:x,forEach:function(e,t,n){x(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return x(e,(function(){t++})),t},toArray:function(e){return x(e,(function(e){return e}))||[]},only:function(e){if(!T(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=I,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=k,t.act=A,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=g({},e.props),a=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=R.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)b.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=E,t.createFactory=function(e){var t=E.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=T,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:M}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=P.transition;P.transition={};try{e()}finally{P.transition=t}},t.unstable_act=A,t.useCallback=function(e,t){return U.current.useCallback(e,t)},t.useContext=function(e){return U.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return U.current.useDeferredValue(e)},t.useEffect=function(e,t){return U.current.useEffect(e,t)},t.useId=function(){return U.current.useId()},t.useImperativeHandle=function(e,t,n){return U.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return U.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return U.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return U.current.useMemo(e,t)},t.useReducer=function(e,t,n){return U.current.useReducer(e,t,n)},t.useRef=function(e){return U.current.useRef(e)},t.useState=function(e){return U.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return U.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return U.current.useTransition()},t.version="18.3.1"},326:(e,t,n)=>{"use strict";e.exports=n(249)},741:e=>{e.exports={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}},142:e=>{"use strict";e.exports=n},557:e=>{"use strict";e.exports=o},713:e=>{"use strict";e.exports=r},2:t=>{"use strict";t.exports=e},669:e=>{"use strict";e.exports=t},545:e=>{"use strict";e.exports=s},55:e=>{"use strict";e.exports=i},111:e=>{"use strict";e.exports=c},155:e=>{"use strict";e.exports=a}},f={};function p(e){var t=f[e];if(void 0!==t)return t.exports;var n=f[e]={exports:{}};return d[e](n,n.exports,p),n.exports}p.m=d,l=[],p.O=(e,t,n,r)=>{if(!t){var o=1/0;for(c=0;c<l.length;c++){for(var[t,n,r]=l[c],a=!0,i=0;i<t.length;i++)(!1&r||o>=r)&&Object.keys(p.O).every((e=>p.O[e](t[i])))?t.splice(i--,1):(a=!1,r<o&&(o=r));if(a){l.splice(c--,1);var s=n();void 0!==s&&(e=s)}}return e}r=r||0;for(var c=l.length;c>0&&l[c-1][2]>r;c--)l[c]=l[c-1];l[c]=[t,n,r]},p.F={},p.E=e=>{Object.keys(p.F).map((t=>{p.F[t](e)}))},p.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return p.d(t,{a:t}),t},p.d=(e,t)=>{for(var n in t)p.o(t,n)&&!p.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},p.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),p.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u={524:0},p.F.j=e=>{if(!p.o(u,e)||void 0===u[e]){u[e]=null;var t=document.createElement("link");p.nc&&t.setAttribute("nonce",p.nc),t.rel="prefetch",t.as="script",t.href=p.p+p.u(e),document.head.appendChild(t)}},p.O.j=e=>0===u[e],p.O(0,[524],(()=>{p.E(524)}),5);var m={};return(()=>{"use strict";p.r(m),p.d(m,{Enums:()=>c.Ay,createReferencedImageDisplaySet:()=>me.A,default:()=>ye,hydrateStructuredReport:()=>ee,srProtocol:()=>q,toolNames:()=>f});var e=p(326),t=p(2),n=p.n(t),r=p(669),o=p(142),a=p(713),i=p(557),s=p(155),c=p(193);const l=1e-4,u=({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=i.utilities.imageToWorldCoords(n,[e[t],e[t+1]]);r.push(o)}return r};const d=function({GraphicType:e,GraphicData:t,ValueType:n,imageId:r}){let o=[];switch(e){case c.sh.POINT:case c.sh.MULTIPOINT:case c.sh.POLYLINE:o=u({GraphicData:t,ValueType:n,imageId:r});break;case c.sh.CIRCLE:{const e=u({GraphicData:t,ValueType:n,imageId:r}),a=e[0],c=e[1],l=s.vec3.distance(a,c),d=i.metaData.get("imagePlaneModule",r);if(!d)throw new Error("No imagePlaneModule found");const{columnCosines:f,rowCosines:p}=d,m=s.vec3.create();s.vec3.scaleAndAdd(m,a,f,l);const g=s.vec3.create();s.vec3.scaleAndAdd(g,a,f,-l);const S=s.vec3.create();s.vec3.scaleAndAdd(S,a,p,l);const h=s.vec3.create();s.vec3.scaleAndAdd(h,a,p,-l),o=[m,g,S,h];break}case c.sh.ELLIPSE:{const e=u({GraphicData:t,ValueType:n,imageId:r}),a=s.vec3.fromValues(...e[0]),c=s.vec3.fromValues(...e[1]),d=s.vec3.fromValues(...e[2]),f=s.vec3.fromValues(...e[3]),p=s.vec3.create();s.vec3.sub(p,c,a),s.vec3.normalize(p,p);const m=s.vec3.create();s.vec3.sub(m,f,d),s.vec3.normalize(m,m);const g=i.metaData.get("imagePlaneModule",r);if(!g)throw new Error("imageId does not have imagePlaneModule metadata");const{columnCosines:S}=g,h=s.vec3.fromValues(...S),y=Math.abs(s.vec3.dot(h,p)),I=Math.abs(s.vec3.dot(h,m)),C=Math.abs(y),v=Math.abs(I);o=[],Math.abs(C-1)<l?o=[e[0],e[1],e[2],e[3]]:Math.abs(v-1)<l?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},f={DICOMSRDisplay:"DICOMSRDisplay",SRLength:"SRLength",SRBidirectional:"SRBidirectional",SREllipticalROI:"SREllipticalROI",SRCircleROI:"SRCircleROI",SRArrowAnnotate:"SRArrowAnnotate",SRAngle:"SRAngle",SRCobbAngle:"SRCobbAngle",SRRectangleROI:"SRRectangleROI",SRPlanarFreehandROI:"SRPlanarFreehandROI",SRSCOORD3DPoint:"SRSCOORD3DPoint"};function g(e,t,n){let r=f.DICOMSRDisplay;const o=e.coords.reduce(((e,n)=>(e[n.GraphicType]=e[n.GraphicType]||[],e[n.GraphicType].push(d({...n,imageId:t})),e)),{}),{TrackingUniqueIdentifier:s}=e,{ValueType:c,GraphicType:l}=e.coords[0],u=o[l];let p=null;if(t){const e=i.metaData.get("imagePlaneModule",t);p=e?.frameOfReferenceUID}"SCOORD3D"===c&&(r=f.SRSCOORD3DPoint,p=e.coords[0].ReferencedFrameOfReferenceSequence);const m={annotationUID:s,highlighted:!1,isLocked:!1,invalidated:!1,metadata:{toolName:r,valueType:c,graphicType:l,FrameOfReferenceUID:p,referencedImageId:t},data:{label:e.labels?.[0]?.value||void 0,displayText:e.displayText||void 0,handles:{textBox:e.textBox??{},points:u[0]},cachedStats:{},frameNumber:n,renderableData:o,TrackingUniqueIdentifier:s,labels:e.labels}};a.annotation.state.addAnnotation(m),console.debug("Adding SR annotation:",m)}const{MeasurementReport:S}=o.adaptersSR.Cornerstone3D;const h=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-sr"}').UU,y="dicom-sr",I=`${h}.sopClassHandlerModule.${y}`,C="dicom-sr-3d",v=`${h}.sopClassHandlerModule.${C}`,{sopClassDictionary:b}=t.utils,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:R,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:O}=r.Enums,{ImageSet:E,MetadataProvider:T}=t.classes,{CodeScheme:D}=o.adaptersSR.Cornerstone3D,w=[b.BasicTextSR,b.EnhancedSR,b.ComprehensiveSR];function N(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 x(e,n,r){if(!e||!e.length)throw new Error("No instances were provided");t.utils.sortStudyInstances(e);const o=e[e.length-1],{StudyInstanceUID:a,SeriesInstanceUID:i,SOPInstanceUID:s,SeriesDescription:l,SeriesNumber:u,SeriesDate:d,SeriesTime:f,ConceptNameCodeSequence:p,SOPClassUID:m}=o;((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}`)}))})(o.StudyInstanceUID,e);const g=m===b.Comprehensive3DSR,h=p?.CodeValue===c.n7.ImagingMeasurementReport,y={Modality:"SR",displaySetInstanceUID:t.utils.guid(),SeriesDescription:l,SeriesNumber:u,SeriesDate:d,SeriesTime:f,SOPInstanceUID:s,SeriesInstanceUID:i,StudyInstanceUID:a,SOPClassHandlerId:g?v:I,SOPClassUID:m,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,isImagingMeasurementReport:h,sopClassUids:w,instance:o,addInstances:N};return y.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 l(t,n=null,r=null){for(const o in t)if("object"==typeof t[o]&&null!==t[o])await l(t[o],t,o);else if(Array.isArray(t[o]))await Promise.all(t[o].map((e=>l(e,t,o))));else if("BulkDataURI"===o){const a=await i.retrieve.bulkDataURI({BulkDataURI:t[o],StudyInstanceUID:e.instance.StudyInstanceUID,SeriesInstanceUID:e.instance.SeriesInstanceUID,SOPInstanceUID:e.instance.SOPInstanceUID});n&&r&&(n[r]=new Float32Array(a))}}!0!==e.isLoaded&&await l(s);e.isImagingMeasurementReport?(e.referencedImages=function(e){const t=e.find((e=>e.ConceptNameCodeSequence.CodeValue===c.n7.ImageLibrary));if(!t)return[];const n=A(t.ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeValue===c.n7.ImageLibraryGroup));if(!n)return[];const r=[];return A(n.ContentSequence).forEach((e=>{const{ReferencedSOPSequence:t}=e;if(t)for(const e of A(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===c.n7.ImagingMeasurements));if(!t)return[];const n=function(e){const t={};return e.forEach((e=>{const n=A(e.ContentSequence),r=n.find((e=>e.ConceptNameCodeSequence.CodeValue===c.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!==c.n7.TrackingUniqueIdentifier&&t[o].push(e)}))})),t}(A(t.ContentSequence).filter((e=>e.ConceptNameCodeSequence.CodeValue===c.n7.MeasurementGroup))),r=[];return Object.keys(n).forEach((e=>{const t=function(e){if(e.some((e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType)))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===c.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)),a={loaded:!1,labels:[],coords:[P(t)],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};o.forEach((e=>{const{ConceptNameCodeSequence:t,MeasuredValueSequence:n}=e;n&&a.labels.push(k(t,n))}));const i=e.filter((e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===c.bY.SCT&&e.ConceptNameCodeSequence.CodeValue===c.n7.FindingSiteSCT));i.length&&a.labels.push({label:c.n7.FindingSiteSCT,value:i[0].ConceptCodeSequence.CodeMeaning});return a}(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===c.n7.TrackingIdentifier)),o=e.find((e=>e.ConceptNameCodeSequence.CodeValue===c.n7.Finding)),a=e.filter((e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===c.bY.SRT&&e.ConceptNameCodeSequence.CodeValue===c.n7.FindingSite)),i={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};o&&c.bY.CornerstoneCodeSchemes.includes(o.ConceptCodeSequence.CodingSchemeDesignator)&&o.ConceptCodeSequence.CodeValue===D.codeValues.CORNERSTONEFREETEXT&&i.labels.push({label:D.codeValues.CORNERSTONEFREETEXT,value:o.ConceptCodeSequence.CodeMeaning});if(a.length){const e=a.find((e=>c.bY.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===D.codeValues.CORNERSTONEFREETEXT));e&&i.labels.push({label:D.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=P(n);a&&i.coords.push(a),r&&i.labels.push(k(t,r))})),i}(e)}(n[e]);t&&r.push(t)})),r}(s)):(e.referencedImages=[],e.measurements=[]);const u=o.getSourceMappings(R,O);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{TrackingIdentifier:t}=r[e]||{};if(!t){console.warn("No tracking identifier for measurement ",r[e]);continue}const o=S.getAdapterForTrackingIdentifier(t);if(o&&n.has(o.toolType))return!0;console.log("Measurement is not rehydratable",t,r[e])}return console.log("No measurements found which were rehydratable"),!1}(e,u),e.isLoaded=!0,r.activeDisplaySets.forEach((n=>{M(e,n,i,t)})),r.subscribe(r.EVENTS.DISPLAY_SETS_ADDED,(n=>{const{displaySetsAdded:r}=n;r.forEach((n=>{M(e,n,i,t)}))}))}(y,n,r),[y]}function M(e,t,n,r){const{customizationService:o}=r.services,a=e.measurements.filter((e=>!1===e.loaded));if(0===a.length||!(t instanceof E)||t.unsupported)return;const i=new Map,s=n.getImageIdsForDisplaySet(t);for(const e of s){const{SOPInstanceUID:t,frameNumber:n}=T.getUIDsFromImageID(e),r=`${t}:${n||1}`;i.set(r,e)}if(!a?.length)return;const c=e.SOPClassUID===b.Comprehensive3DSR;for(let n=a.length-1;n>=0;n--){let r=a[n];const s=o.getCustomization("onBeforeSRAddMeasurement");if("function"==typeof s&&(r=s({measurement:r,StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID})),c){g(r,null,null),r.loaded=!0;continue}const l=r.coords[0].ReferencedSOPSequence;if(!l)continue;const{ReferencedSOPInstanceUID:u}=l,d=l.ReferencedFrameNumber||1,f=`${u}:${d}`,p=i.get(f);p&&U(r,u,d)&&(g(r,p,d),r.loaded=!0,r.imageId=p,r.displaySetInstanceUID=t.displaySetInstanceUID,r.ReferencedSOPInstanceUID=u,r.frameNumber=d,a.splice(n,1))}}function U(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 P=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 k(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 A(e){return e?Array.isArray(e)?e:[e]:[]}const L=function({servicesManager:e,extensionManager:t}){const n=n=>x(n,e,t);return[{name:y,sopClassUids:w,getDisplaySetsFromSeries:n},{name:C,sopClassUids:[b.Comprehensive3DSR],getDisplaySetsFromSeries:n}]},q={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 j=p(55),_=p(545),V=p.n(_);var F=p(111),B=p.n(F);const{log:$}=n();const G=function(e,t){const n={};function r(r,o){if(!r.metadata?.referencedImageId)return void $.warn(`[DICOMSR] No referencedImageId found for ${o} ${r.id}`);const a=r.metadata.referencedImageId;n[a]||(n[a]={});const i=n[a];i[o]||(i[o]={data:[]});const s=e.find((e=>e.uid===r.annotationUID)),c=i[o].data;let{finding:l}=s;const u=[];s.label&&(t.includes(o)?l={CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:s.label}:u.push({CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:s.label})),s.findingSites&&u.push(...s.findingSites);const d=Object.assign({},r,{finding:l,findingSites:u});c.push(d)}const o=e.map((e=>e.uid)).slice(),i=a.annotation.state.getAnnotationManager(),s=i.getFramesOfReference();for(let e=0;e<s.length;e++){const t=s[e],a=i.getAnnotations(t),c=Object.keys(a);for(let e=0;e<c.length;e++){const t=c[e],i=a[t];if(i)for(let e=0;e<i.length;e++){const a=i[e],s=o.findIndex((e=>e===a.annotationUID));if(-1!==s&&(r(a,t),o.splice(s,1),!o.length))return n}}}return n},{CodeScheme:W}=o.adaptersSR.Cornerstone3D;const{locking:z}=a.annotation,{guid:H}=n().utils,{MeasurementReport:Y,CORNERSTONE_3D_TAG:X}=o.adaptersSR.Cornerstone3D,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:J,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:K}=r.Enums,Q=(e,t)=>{if(!t||"CORNERSTONEJS"===t.CodingSchemeDesignator)return;const n=`${t.CodingSchemeDesignator}:${t.CodeValue}`;return{...e[n],ref:n,...t,text:t.CodeMeaning}},Z=(e,t)=>{if(!t||!t.length)return;const n=[];for(let r=0;r<t.length;r++){const o=Q(e,t[r][0]||t[r]);o&&n.push(o)}return n.length&&n||void 0};function ee({servicesManager:e,extensionManager:n,commandsManager:r},o){const a=n.getActiveDataSource()[0],{measurementService:s,displaySetService:c,customizationService:l}=e.services,u=l.getCustomization("codingValues"),d=l.getCustomization("panelMeasurement.disableEditing"),f=c.getDisplaySetByUID(o),p=s.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),g={},S={};f.measurements.forEach((e=>{const{ReferencedSOPInstanceUID:t,imageId:n,frameNumber:r}=e;g[t]||(g[t]=n,S[t]=[]),S[t][r]||(S[t][r]=n)}));const h=m;let y=Y.generateToolState(h,g,i.utilities.imageToWorldCoords,i.metaData);const I=l.getCustomization("onBeforeSRHydration")?.value;"function"==typeof I&&(y=I({storedMeasurementByAnnotationType:y,displaySet:f}));const C=p.map((e=>e.annotationType)),v={};Object.keys(y).forEach((e=>{C.includes(e)&&(v[e]=y[e])}));const b=[];let R;Object.keys(v).forEach((e=>{v[e].forEach((e=>{const t=e.annotation.data&&e.annotation.data.frameNumber||1,n=S[e.sopInstanceUid][t]||g[e.sopInstanceUid];b.includes(n)||b.push(n)}))}));const O=[];for(let e=0;e<b.length;e++){const t=b[e],{SeriesInstanceUID:n,StudyInstanceUID:r}=i.metaData.get("instance",t);O.includes(n)||O.push(n),R?R!==r&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):R=r}return Object.keys(v).forEach((e=>{v[e].forEach((t=>{const n=t.annotation.data&&t.annotation.data.frameNumber||1,o=S[t.sopInstanceUid][n]||g[t.sopInstanceUid];t.uid=H();const c=i.metaData.get("instance",o),{FrameOfReferenceUID:l}=c,f={annotationUID:t.annotation.annotationUID,data:t.annotation.data,metadata:{toolName:e,referencedImageId:o,FrameOfReferenceUID:l}},m=s.getSource(J,K);f.data.label=function(e){const{findingSites:t=[],finding:n}=e;let r=t.find((e=>e.CodeValue===W.codeValues.CORNERSTONEFREETEXT));return r?r.CodeMeaning:n&&n.CodeValue===W.codeValues.CORNERSTONEFREETEXT?n.CodeMeaning:void 0}(t),f.data.finding=Q(u,t.finding?.[0]),f.data.findingSites=Z(u,t.findingSites),f.data.findingSites?.forEach((e=>{e.type&&(f.data[e.type]=e)}));const h=p.find((t=>t.annotationType===e)),y=s.addRawMeasurement(m,e,{annotation:f},h.toMeasurementSchema,a);r.runCommand("updateMeasurement",{uid:y,code:f.data.finding}),d&&z.setAnnotationLocked(y,!0),b.includes(o)||b.push(o)}))})),f.isHydrated=!0,{StudyInstanceUID:R,SeriesInstanceUIDs:O}}const{MeasurementReport:te}=o.adaptersSR.Cornerstone3D,{log:ne}=n(),re=(e,t,n={})=>{const r=G(e,t),o=te.generateReport(r,i.metaData,i.utilities.worldToImageCoords,n),{dataset:a}=o;return void 0===a.SpecificCharacterSet&&(a.SpecificCharacterSet="ISO_IR 192"),a.InstanceNumber=n.InstanceNumber??1,a},oe=e=>{const{servicesManager:n,extensionManager:r,commandsManager:o}=e,{customizationService:a,viewportGridService:i,displaySetService:s}=n.services,c={changeColorMeasurement:({uid:e})=>{throw new Error("Unsupported operation: changeColorMeasurement")},downloadReport:({measurementData:e,additionalFindingTypes:t,options:n={}})=>{const r=re(e,t,n),o=B().data.datasetToBlob(r),a=URL.createObjectURL(o);window.location.assign(a)},storeMeasurements:async({measurementData:e,dataSource:n,additionalFindingTypes:r,options:o={}})=>{if(ne.info("[DICOMSR] storeMeasurements"),!n||!n.store||!n.store.dicom)return ne.error("[DICOMSR] datasource has no dataSource.store.dicom endpoint!"),Promise.reject({});try{const i=re(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");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),ne.error(`[DICOMSR] Error while saving the measurements: ${e.message}`),new Error(e.message||"Error while saving the measurements.")}},loadSRMeasurements:({displaySetInstanceUID:e})=>{const{SeriesInstanceUIDs:t}=ee({servicesManager:n,extensionManager:r,commandsManager:o},e),a=s.getDisplaySetsForSeries(t[0]);a.length&&o.run("setDisplaySetsForViewports",{viewportsToUpdate:[{viewportId:i.getActiveViewportId(),displaySetInstanceUIDs:[a[0].displaySetInstanceUID]}]})}};return{actions:c,definitions:{downloadReport:{commandFn:c.downloadReport},storeMeasurements:{commandFn:c.storeMeasurements},loadSRMeasurements:{commandFn:c.loadSRMeasurements}},defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};var ae=p(942);class ie extends a.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=a.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;if(o=this.filterInteractableAnnotationsForElement(r,o),!o?.length)return;const i=(0,ae.eF)(r),{activeIndex:s,trackingUniqueIdentifiers:l}=i,u=l[s],d=o.filter((e=>l.includes(e.data?.TrackingUniqueIdentifier)));if(!n._actors?.size)return;const f={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},{style:p}=a.annotation.config;for(let e=0;e<d.length;e++){const r=d[e],o=r.annotationUID,{renderableData:i,TrackingUniqueIdentifier:s}=r.data,{referencedImageId:l}=r.metadata;f.annotationUID=o;const m=p.getToolGroupToolStyles(this.toolGroupId)[this.getToolName()],g=this.getStyle("lineWidth",f,r),S=this.getStyle("lineDash",f,r),h={color:s===u?"rgb(0, 255, 0)":this.getStyle("color",f,r),lineDash:S,lineWidth:g,...m};Object.keys(i).forEach((e=>{const s=i[e];let u,d;switch(e){case c.sh.POINT:u=this.renderPoint;break;case c.sh.MULTIPOINT:u=this.renderMultipoint;break;case c.sh.POLYLINE:u=this.renderPolyLine;break;case c.sh.CIRCLE:u=this.renderEllipse;break;case c.sh.ELLIPSE:u=this.renderEllipse,d=a.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const p=u(t,n,s,o,l,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(`${ce(t.label)}: ${t.value}`)}return n}renderPolyLine(e,t,n,r,o,i){const s={color:i.color,width:i.lineWidth,lineDash:i.lineDash};let c=[];return n.map(((n,o)=>{const i=n.map((e=>t.worldToCanvas(e))),l=`${o}`;2===i.length?a.drawing.drawLine(e,r,l,i[0],i[1],s):a.drawing.drawPolyline(e,r,l,i,s),c=c.concat(i)})),c}renderMultipoint(e,t,n,r,o,i){let s;n.map(((n,o)=>{s=n.map((e=>t.worldToCanvas(e)));a.drawing.drawHandles(e,r,"0",s,{color:i.color})}))}renderPoint(e,t,n,r,o,s){const c=[];return n.map(((n,l)=>{const u=n[0];if(c.push(t.worldToCanvas(u)),void 0!==n[1])c.push(t.worldToCanvas(n[1]));else{const e=i.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=i.utilities.worldToImageCoords(o,u),s=i.utilities.imageToWorldCoords(o,[a[0]+n,a[1]+r]);c.push(t.worldToCanvas(s))}const d=`${l}`;a.drawing.drawArrow(e,r,d,c[1],c[0],{color:s.color,width:s.lineWidth})})),c}renderEllipse(e,t,n,r,o,i){let s;return n.map(((n,o)=>{if(0===n.length)return;const c=n,l=t.getRotation();let u;s=c.map((e=>t.worldToCanvas(e))),u=90==l||270==l?a.utilities.math.ellipse.getCanvasEllipseCorners([s[2],s[3],s[0],s[1]]):a.utilities.math.ellipse.getCanvasEllipseCorners(s);const d=`${o}`;a.drawing.drawEllipse(e,r,d,u[0],u[1],{color:i.color,width:i.lineWidth,lineDash:i.lineDash})})),s}renderTextBox(e,t,n,r,o,i,s={}){if(!n||!o)return;const{annotationUID:c,data:l={}}=o,{labels:u}=l,{color:d}=s;let f=n;"function"==typeof r&&(f=r(n));const p=this._getTextBoxLinesFromLabels(u),m=a.utilities.drawing.getTextBoxCoordsCanvas(f);o.data?.handles?.textBox?.worldPosition||(o.data.handles.textBox.worldPosition=t.canvasToWorld(m));const g=t.worldToCanvas(o.data.handles.textBox.worldPosition),S=this.getLinkedTextBoxStyle(i,o),h=a.drawing.drawLinkedTextBox(e,c,"1",p,g,n,{},{...S,color:d}),{x:y,y:I,width:C,height:v}=h;o.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([y,I]),topRight:t.canvasToWorld([y+C,I]),bottomLeft:t.canvasToWorld([y,I+v]),bottomRight:t.canvasToWorld([y+C,I+v])}}}ie.toolName=f.DICOMSRDisplay;const se={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function ce(e){const t=se[e];return void 0!==t?t:e}class le extends a.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=a.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;const i=o;if(!n._actors?.size)return;const s={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<i.length;e++){const r=i[e],o=r.annotationUID,{renderableData:c}=r.data,{POINT:l}=c;s.annotationUID=o;const u=this.getStyle("lineWidth",s,r),d=this.getStyle("lineDash",s,r),f={color:this.getStyle("color",s,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),g=[m,[m[0]+20,m[1]+20]];a.drawing.drawArrow(t,o,"1",g[1],g[0],{color:f.color,width:f.lineWidth}),this.renderTextBox(t,n,g,r,s,f)}}}_getTextBoxLinesFromLabels(e){Math.min(e.length,5);return[]}renderTextBox(e,t,n,r,o,i={}){if(!n||!r)return;const{annotationUID:s,data:c={}}=r,{labels:l}=c,u=[];for(const e of l)"363698007"===e.label&&u.push(`Finding Site: ${e.value}`);const{color:d}=i,f=n,p=a.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),g=this.getLinkedTextBoxStyle(o,r),S=a.drawing.drawLinkedTextBox(e,s,"1",u,m,n,{},{...g,color:d}),{x:h,y,width:I,height:C}=S;r.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([h,y]),topRight:t.canvasToWorld([h+I,y]),bottomLeft:t.canvasToWorld([h,y+C]),bottomRight:t.canvasToWorld([h+I,y+C])}}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)}}}le.toolName=f.SRSCOORD3DPoint;const ue={toAnnotation:e=>{},toMeasurement:(e,t,n,r,o)=>{const{annotation:a}=e,{metadata:i,data:s,annotationUID:c}=a;if(!i||!s)return console.warn("Probe tool: Missing metadata or data"),null;const{toolName:l}=i,{points:u}=s.handles,d=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 r}(a);return{uid:c,points:u,metadata:i,toolName:i.toolName,label:s.label,displayText:d,data:s.cachedStats,type:r?.(l)??null}}};function de(e,t,n={}){class r extends t{constructor(e,t){e.configuration=e.configuration?{...e.configuration,...n}:n,super(e,t)}}r.toolName=e,(0,a.addTool)(r)}const{CORNERSTONE_3D_TOOLS_SOURCE_NAME:fe,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:pe}=r.Enums;var me=p(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 Se=e.lazy((()=>Promise.resolve().then(p.bind(p,48)))),he=t=>e.createElement(e.Suspense,{fallback:e.createElement("div",null,"Loading...")},e.createElement(Se,t)),ye={id:h,onModeEnter:function({servicesManager:t}){const{displaySetService:n,toolbarService:r}=t.services;[...n.getDisplaySetCache().values()].filter((e=>e.SOPClassHandlerId===I||e.SOPClassHandlerId===v)).forEach((e=>{e.isHydrated=!1})),r.addButtons([{id:"loadSRMeasurements",component:t=>e.createElement(j.ViewportActionButton,t,V().t("Common:LOAD")),props:{commands:["clearMeasurements","loadSRMeasurements"]}}]),r.createButtonSection("loadSRMeasurements",["loadSRMeasurements"])},preRegistration:function({configuration:e={},servicesManager:t}){const{measurementService:n,cornerstoneViewportService:r}=t.services;de(f.DICOMSRDisplay,ie),de(f.SRLength,a.LengthTool),de(f.SRBidirectional,a.BidirectionalTool),de(f.SREllipticalROI,a.EllipticalROITool),de(f.SRCircleROI,a.CircleROITool),de(f.SRArrowAnnotate,a.ArrowAnnotateTool),de(f.SRAngle,a.AngleTool),de(f.SRPlanarFreehandROI,a.PlanarFreehandROITool),de(f.SRRectangleROI,a.RectangleROITool),de(f.SRSCOORD3DPoint,le),de(f.SRCobbAngle,a.CobbAngleTool);const o=n.getSource(fe,pe),{POINT:i}=n.VALUE_TYPES;n.addMapping(o,"SRSCOORD3DPoint",i,ue.toAnnotation,ue.toMeasurement);const s={lineDash:"4,4"};a.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{[f.DICOMSRDisplay]:s,SRLength:s,SRBidirectional:s,SREllipticalROI:s,SRCircleROI:s,SRArrowAnnotate:s,SRCobbAngle:s,SRAngle:s,SRPlanarFreehandROI:s,SRRectangleROI:s,global:{}})},getViewportModule:({servicesManager:t,extensionManager:n})=>[{name:"dicom-sr",component:r=>e.createElement(he,ge({servicesManager:t,extensionManager:n},r))}],getCommandsModule:oe,getSopClassHandlerModule:L,getUtilityModule:({servicesManager:e})=>[{name:"tools",exports:{toolNames:f}}]}})(),m=p.O(m)})()));
|
|
2
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("@ohif/i18n"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/adapters"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("gl-matrix"),require("dcmjs"),require("@ohif/ui-next"),require("@ohif/core/src/contextProviders/SystemProvider")):"function"==typeof define&&define.amd?define(["@ohif/core","@ohif/i18n","@ohif/extension-cornerstone","@cornerstonejs/adapters","@cornerstonejs/tools","@cornerstonejs/core","gl-matrix","dcmjs","@ohif/ui-next","@ohif/core/src/contextProviders/SystemProvider"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-sr"]=t(require("@ohif/core"),require("@ohif/i18n"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/adapters"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("gl-matrix"),require("dcmjs"),require("@ohif/ui-next"),require("@ohif/core/src/contextProviders/SystemProvider")):e["ohif-extension-cornerstone-dicom-sr"]=t(e["@ohif/core"],e["@ohif/i18n"],e["@ohif/extension-cornerstone"],e["@cornerstonejs/adapters"],e["@cornerstonejs/tools"],e["@cornerstonejs/core"],e["gl-matrix"],e.dcmjs,e["@ohif/ui-next"],e["@ohif/core/src/contextProviders/SystemProvider"])}(globalThis,(e,t,n,r,o,a,s,i,c,l)=>(()=>{var u,d,f={2:t=>{"use strict";t.exports=e},55:e=>{"use strict";e.exports=c},111:e=>{"use strict";e.exports=i},142:e=>{"use strict";e.exports=r},155:e=>{"use strict";e.exports=s},183:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},193:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>c,bY:()=>i,n7:()=>s,sh:()=>a});var r=n(142);const{CodeScheme:o}=r.adaptersSR.Cornerstone3D,a={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"},s={ImagingMeasurementReport:"126000",ImageLibrary:"111028",ImagingMeasurements:"126010",MeasurementGroup:"125007",ImageLibraryGroup:"126200",TrackingUniqueIdentifier:"112040",TrackingIdentifier:"112039",Finding:"121071",FindingSite:"G-C0E3",FindingSiteSCT:"363698007"},i={SRT:"SRT",SCT:"SCT",CornerstoneCodeSchemes:[o.CodingSchemeDesignator,"CST4"]},c={CodeNameCodeSequenceValues:s,CodingSchemeDesignators:i,RelationshipType:{INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},SCOORDTypes:a}},249:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),i=Symbol.for("react.provider"),c=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},S=Object.assign,g={};function h(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function I(){}function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}h.prototype.isReactComponent={},h.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},I.prototype=h.prototype;var C=y.prototype=new I;C.constructor=y,S(C,h.prototype),C.isPureReactComponent=!0;var R=Array.isArray,T=Object.prototype.hasOwnProperty,O={current:null},D={key:!0,ref:!0,__self:!0,__source:!0};function v(e,t,r){var o,a={},s=null,i=null;if(null!=t)for(o in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(s=""+t.key),t)T.call(t,o)&&!D.hasOwnProperty(o)&&(a[o]=t[o]);var c=arguments.length-2;if(1===c)a.children=r;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];a.children=l}if(e&&e.defaultProps)for(o in c=e.defaultProps)void 0===a[o]&&(a[o]=c[o]);return{$$typeof:n,type:e,key:s,ref:i,props:a,_owner:O.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var b=/\/+/g;function w(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(e){return t[e]})}(""+e.key):t.toString(36)}function N(e,t,o,a,s){var i=typeof e;"undefined"!==i&&"boolean"!==i||(e=null);var c=!1;if(null===e)c=!0;else switch(i){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case n:case r:c=!0}}if(c)return s=s(c=e),e=""===a?"."+w(c,0):a,R(s)?(o="",null!=e&&(o=e.replace(b,"$&/")+"/"),N(s,t,o,"",function(e){return e})):null!=s&&(E(s)&&(s=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(s,o+(!s.key||c&&c.key===s.key?"":(""+s.key).replace(b,"$&/")+"/")+e)),t.push(s)),1;if(c=0,a=""===a?".":a+":",R(e))for(var l=0;l<e.length;l++){var u=a+w(i=e[l],l);c+=N(i,t,o,u,s)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),l=0;!(i=e.next()).done;)c+=N(i=i.value,t,o,u=a+w(i,l++),s);else if("object"===i)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return c}function x(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 U(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:O};function _(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:x,forEach:function(e,t,n){x(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return x(e,function(){t++}),t},toArray:function(e){return x(e,function(e){return e})||[]},only:function(e){if(!E(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=h,t.Fragment=o,t.Profiler=s,t.PureComponent=y,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=q,t.act=_,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=S({},e.props),a=e.key,s=e.ref,i=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,i=O.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)T.call(t,l)&&!D.hasOwnProperty(l)&&(o[l]=void 0===t[l]&&void 0!==c?c[l]:t[l])}var l=arguments.length-2;if(1===l)o.children=r;else if(1<l){c=Array(l);for(var u=0;u<l;u++)c[u]=arguments[u+2];o.children=c}return{$$typeof:n,type:e.type,key:a,ref:s,props:o,_owner:i}},t.createContext=function(e){return(e={$$typeof:c,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=v,t.createFactory=function(e){var t=v.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=E,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:U}},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"},291:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(2);const o=r.classes.ImageSet,a=(e,t)=>{const{displaySetInstanceUID:n,ReferencedSOPInstanceUID:r}=e,o=t.getDisplaySetByUID(n);if(o.images)return o.images.find(e=>e.SOPInstanceUID===r)},s=(e,t)=>{const n=[],r={};for(const o of t.measurements){const{imageId:t}=o;if(!t)continue;if(r[t])continue;const s=a(o,e);s?(r[t]=s,n.push(s)):console.log("Measurement",o,"had no instances found")}return n},i=(e,t)=>{const n=s(e,t),r=new o(n),a=n[0];if(a)return r.setAttributes({displaySetInstanceUID:r.uid,SeriesDate:a.SeriesDate,SeriesTime:a.SeriesTime,SeriesInstanceUID:r.uid,StudyInstanceUID:a.StudyInstanceUID,SeriesNumber:a.SeriesNumber||0,SOPClassUID:a.SOPClassUID,SeriesDescription:`${t.SeriesDescription} KO ${t.instance.SeriesNumber}`,Modality:"KO",isMultiFrame:!1,numImageFrames:n.length,SOPClassHandlerId:"@ohif/extension-default.sopClassHandlerModule.stack",isReconstructable:!1,isCompositeStack:!0,madeInClient:!0,excludeFromThumbnailBrowser:!0,updateInstances:function(){this.images.splice(0,this.images.length,...s(e,t)),this.numImageFrames=this.images.length}}),e.addDisplaySets(r),r}},326:(e,t,n)=>{"use strict";e.exports=n(249)},492:e=>{"use strict";e.exports=l},525:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>O});var r=n(598),o=n.n(r),a=n(326),s=n(2),i=n(942),c=n(291),l=n(669),u=n(55),d=n(492);function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f.apply(null,arguments)}function p(e){const{servicesManager:t}=(0,d.useSystem)(),{children:n,dataSource:r,displaySets:o,viewportOptions:s}=e,{displaySetService:p}=t.services,m=s.viewportId;if(o.length>1)throw new Error("SR viewport should only have a single display set");const S=o[0],{setPositionPresentation:g}=(0,l.usePositionPresentationStore)(),[h,I]=(0,u.useViewportGrid)(),[y,C]=(0,a.useState)(0),[R,T]=(0,a.useState)(null),[O,D]=(0,a.useState)(null),[v,E]=(0,a.useState)(null),{viewports:b,activeViewportId:w}=h,N=(0,a.useCallback)(e=>{const{measurements:t}=S;(0,i.m1)(v,t.map(e=>e.TrackingUniqueIdentifier),e)},[v,y,S]),x=(0,a.useCallback)(e=>{const{StudyInstanceUID:t,displaySetInstanceUID:n,sopClassUids:r}=S;t&&n&&(r&&r.length>1&&console.warn("More than one SOPClassUID in the same series is not yet supported."),async function(e,t,n){const{measurements:r}=e,o=r[t],{displaySetInstanceUID:a}=o;e.keyImageDisplaySet||(e.keyImageDisplaySet=(0,c.A)(n,e));if(!a)return{referencedDisplaySetMetadata:null,referencedDisplaySet:null};const s=n.getDisplaySetByUID(a),i=s.images[0],l={PatientID:i.PatientID,PatientName:i.PatientName,PatientSex:i.PatientSex,PatientAge:i.PatientAge,SliceThickness:i.SliceThickness,StudyDate:i.StudyDate,SeriesDescription:i.SeriesDescription,SeriesInstanceUID:i.SeriesInstanceUID,SeriesNumber:i.SeriesNumber,ManufacturerModelName:i.ManufacturerModelName,SpacingBetweenSlices:i.SpacingBetweenSlices};return{referencedDisplaySetMetadata:l,referencedDisplaySet:s}}(S,e,p).then(({referencedDisplaySet:t,referencedDisplaySetMetadata:n})=>{if(!t||!n)return;C(e),T(t),D(n);const{presentationIds:r}=s,o=S.measurements[e];g(r.positionPresentationId,{viewReference:{referencedImageId:o.imageId}})}))},[r,S,R,m]),U=(0,a.useCallback)(()=>{if(!R)return null;const{measurements:t}=S;return t[y]?a.createElement(l.OHIFCornerstoneViewport,f({},e,{displaySets:[R],viewportOptions:{...s,toolGroupId:"SRToolGroup",viewportType:"stack",positionIds:null},onElementEnabled:t=>{e.onElementEnabled?.(t),(e=>{E(e.detail.element)})(t)},isJumpToMeasurementDisabled:!0})):null},[R,m,y]);(0,a.useEffect)(()=>{const e=p.subscribe(p.EVENTS.DISPLAY_SETS_REMOVED,({displaySetInstanceUIDs:e})=>{const t=b.get(w);e.includes(t.displaySetInstanceUID)&&I.setDisplaySetsForViewport({viewportId:w,displaySetInstanceUIDs:[]})});return()=>{e.unsubscribe()}},[]),(0,a.useEffect)(()=>{(async()=>{S.isLoaded||await S.load(),x(y)})()},[S]),(0,a.useEffect)(()=>{(async()=>{S.isLoaded||await S.load(),v&&S.isLoaded&&N(y)})()},[y,v,N,S]);let M=null;return R&&O?(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"},U(),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?s.utils.formatPN(t):void 0},DATE:e=>{const{Date:t}=e;return t?s.utils.formatDate(t):void 0},TIME:e=>{const{Time:t}=e;return t?s.utils.formatTime(t):void 0},DATETIME:e=>{const{DateTime:t}=e;if("string"!=typeof t)return;if(t.length<14)return t;const n=t.substring(0,8),r=t.substring(8,14);return`${s.utils.formatDate(n)} ${s.utils.formatTime(r)}`}};function h(e){const{contentItem:t,nodeIndexesTree:n,continuityOfContent:r}=e,{ConceptNameCodeSequence:o}=t,{CodeValue:s,CodeMeaning:i}=o,c=0===n[n.length-1],l=function(e){const{ValueType:t}=e,n=g[t];return n?n(e):`[${t} is not supported]`}(t)??"[empty]",u="CONTINUOUS"===r,d=s===S.n7.Finding,f=u&&!c&&/^[a-zA-Z0-9]/.test(l?.[0]);let p="whitespace-pre-line";return s===S.n7.Finding&&(p="whitespace-pre-wrap"),u?a.createElement(a.Fragment,null,a.createElement("span",{className:p,title:i},f?" ":"",l)):a.createElement(a.Fragment,null,a.createElement("div",{className:"mb-2"},a.createElement("span",{className:"font-bold"},i,": "),d?a.createElement("pre",null,l):a.createElement("span",{className:p},l)))}function I(){return I=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},I.apply(null,arguments)}function y(e){const{container:t,nodeIndexesTree:n=[0],containerNumberedTree:r=[1]}=e,{ContinuityOfContent:o,ConceptNameCodeSequence:s}=t,{CodeMeaning:i}=s??{};let c=1;const l=t.ContentSequence?.map((e,t)=>{const{ValueType:s}=e,i=[...n,t],l=i.join(".");let u,d;if("CONTAINER"===s){u=y,d={container:e,nodeIndexesTree:i,containerNumberedTree:[...r,c++]}}else u=h,d={contentItem:e,nodeIndexesTree:i,continuityOfContent:o};return a.createElement(u,I({key:l},d))});return a.createElement("div",null,a.createElement("div",{className:"font-bold"},r.join("."),". ",i),a.createElement("div",{className:"ml-4 mb-2"},l))}function C(e){const{displaySets:t}=e,n=t[0].instances[0];return a.createElement("div",{className:"relative flex h-full w-full flex-col overflow-auto p-4 text-white"},a.createElement("div",null,a.createElement(y,{container:n})))}h.propTypes={contentItem:o().object,nodeIndexesTree:o().arrayOf(o().number),continuityOfContent:o().string},y.propTypes={container:o().object,nodeIndexesTree:o().arrayOf(o().number),containerNumberedTree:o().arrayOf(o().number)},C.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object,servicesManager:o().object.isRequired,extensionManager:o().instanceOf(s.ExtensionManager).isRequired};const R=C;function T(e){const{displaySets:t}=e,{isImagingMeasurementReport:n}=t[0];return n?a.createElement(m,e):a.createElement(R,e)}T.propTypes={displaySets:o().arrayOf(o().object),viewportId:o().string.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,viewportOptions:o().object,servicesManager:o().object.isRequired,extensionManager:o().instanceOf(s.ExtensionManager).isRequired};const O=T},545:e=>{"use strict";e.exports=t},557:e=>{"use strict";e.exports=a},598:(e,t,n)=>{e.exports=n(856)()},669:e=>{"use strict";e.exports=n},713:e=>{"use strict";e.exports=o},856:(e,t,n)=>{"use strict";var r=n(183);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,s){if(s!==r){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},942:(e,t,n)=>{"use strict";n.d(t,{eF:()=>s,m1:()=>a});var r=n(557);const o={TrackingUniqueIdentifier:null,trackingIdentifiersByViewportId:{}};function a(e,t,n=0){const a=(0,r.getEnabledElement)(e),{viewport:s}=a;o.trackingIdentifiersByViewportId[s.id]={trackingUniqueIdentifiers:t,activeIndex:n}}function s(e){const t=(0,r.getEnabledElement)(e),{viewport:n}=t;return o.trackingIdentifiersByViewportId[n.id]?o.trackingIdentifiersByViewportId[n.id]:{trackingUniqueIdentifiers:[]}}}},p={};function m(e){var t=p[e];if(void 0!==t)return t.exports;var n=p[e]={exports:{}};return f[e](n,n.exports,m),n.exports}m.m=f,u=[],m.O=(e,t,n,r)=>{if(!t){var o=1/0;for(c=0;c<u.length;c++){for(var[t,n,r]=u[c],a=!0,s=0;s<t.length;s++)(!1&r||o>=r)&&Object.keys(m.O).every(e=>m.O[e](t[s]))?t.splice(s--,1):(a=!1,r<o&&(o=r));if(a){u.splice(c--,1);var i=n();void 0!==i&&(e=i)}}return e}r=r||0;for(var c=u.length;c>0&&u[c-1][2]>r;c--)u[c]=u[c-1];u[c]=[t,n,r]},m.F={},m.E=e=>{Object.keys(m.F).map(t=>{m.F[t](e)})},m.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return m.d(t,{a:t}),t},m.d=(e,t)=>{for(var n in t)m.o(t,n)&&!m.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},m.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),m.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d={524:0},m.F.j=e=>{if(!m.o(d,e)||void 0===d[e]){d[e]=null;var t=document.createElement("link");t.charset="utf-8",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:()=>pe.A,default:()=>he,hydrateStructuredReport:()=>Z,srProtocol:()=>A,toolNames:()=>g});var e=m(326),t=m(2),n=m.n(t),r=m(545),o=m.n(r),a=m(669),s=m(142),i=m(713),c=m(557),l=m(155),u=m(193);const d=1e-4,f=({GraphicData:e,ValueType:t,imageId:n})=>{const r=[];if("SCOORD3D"===t)for(let t=0;t<e.length;t+=3)r.push([e[t],e[t+1],e[t+2]]);else for(let t=0;t<e.length;t+=2){const o=c.utilities.imageToWorldCoords(n,[e[t],e[t+1]]);r.push(o)}return r};const p=function({GraphicType:e,GraphicData:t,ValueType:n,imageId:r}){let o=[];switch(e){case u.sh.POINT:case u.sh.MULTIPOINT:case u.sh.POLYLINE:o=f({GraphicData:t,ValueType:n,imageId:r});break;case u.sh.CIRCLE:{const e=f({GraphicData:t,ValueType:n,imageId:r}),a=e[0],s=e[1],i=l.vec3.distance(a,s),u=c.metaData.get("imagePlaneModule",r);if(!u)throw new Error("No imagePlaneModule found");const{columnCosines:d,rowCosines:p}=u,m=l.vec3.create();l.vec3.scaleAndAdd(m,a,d,i);const S=l.vec3.create();l.vec3.scaleAndAdd(S,a,d,-i);const g=l.vec3.create();l.vec3.scaleAndAdd(g,a,p,i);const h=l.vec3.create();l.vec3.scaleAndAdd(h,a,p,-i),o=[m,S,g,h];break}case u.sh.ELLIPSE:{const e=f({GraphicData:t,ValueType:n,imageId:r}),a=l.vec3.fromValues(...e[0]),s=l.vec3.fromValues(...e[1]),i=l.vec3.fromValues(...e[2]),u=l.vec3.fromValues(...e[3]),p=l.vec3.create();l.vec3.sub(p,s,a),l.vec3.normalize(p,p);const m=l.vec3.create();l.vec3.sub(m,u,i),l.vec3.normalize(m,m);const S=c.metaData.get("imagePlaneModule",r);if(!S)throw new Error("imageId does not have imagePlaneModule metadata");const{columnCosines:g}=S,h=l.vec3.fromValues(...g),I=Math.abs(l.vec3.dot(h,p)),y=Math.abs(l.vec3.dot(h,m)),C=Math.abs(I),R=Math.abs(y);o=[],Math.abs(C-1)<d?o=[e[0],e[1],e[2],e[3]]:Math.abs(R-1)<d?o=[e[2],e[3],e[0],e[1]]:console.warn("OBLIQUE ELLIPSE NOT YET SUPPORTED");break}default:console.warn("Unsupported GraphicType:",e)}return o},g={DICOMSRDisplay:"DICOMSRDisplay",SRLength:"SRLength",SRBidirectional:"SRBidirectional",SREllipticalROI:"SREllipticalROI",SRCircleROI:"SRCircleROI",SRArrowAnnotate:"SRArrowAnnotate",SRAngle:"SRAngle",SRCobbAngle:"SRCobbAngle",SRRectangleROI:"SRRectangleROI",SRPlanarFreehandROI:"SRPlanarFreehandROI",SRSCOORD3DPoint:"SRSCOORD3DPoint"};function h(e,t,n){let r=g.DICOMSRDisplay;const o=e.coords.reduce((e,n)=>(e[n.GraphicType]=e[n.GraphicType]||[],e[n.GraphicType].push(p({...n,imageId:t})),e),{}),{TrackingUniqueIdentifier:a}=e,{ValueType:s,GraphicType:l}=e.coords[0],u=o[l];let d=null;if(t){const e=c.metaData.get("imagePlaneModule",t);d=e?.frameOfReferenceUID}"SCOORD3D"===s&&(r=g.SRSCOORD3DPoint,d=e.coords[0].ReferencedFrameOfReferenceSequence);const f={annotationUID:a,highlighted:!1,isLocked:!1,invalidated:!1,metadata:{toolName:r,valueType:s,graphicType:l,FrameOfReferenceUID:d,referencedImageId:t},data:{label:e.labels?.[0]?.value||void 0,displayText:e.displayText||void 0,handles:{textBox:e.textBox??{},points:u[0]},cachedStats:{},frameNumber:n,renderableData:o,TrackingUniqueIdentifier:a,labels:e.labels}};i.annotation.state.addAnnotation(f)}const{MeasurementReport:I}=s.adaptersSR.Cornerstone3D;const y=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-sr"}').UU,C="dicom-sr",R=`${y}.sopClassHandlerModule.${C}`,T="dicom-sr-3d",O=`${y}.sopClassHandlerModule.${T}`,{sopClassDictionary:D}=t.utils,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:v,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:E}=a.Enums,{ImageSet:b,MetadataProvider:w}=t.classes,{CodeScheme:N}=s.adaptersSR.Cornerstone3D,x=[D.BasicTextSR,D.EnhancedSR,D.ComprehensiveSR];function U(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 M(e,n,r){if(!e||!e.length)throw new Error("No instances were provided");t.utils.sortStudyInstances(e);const a=e[e.length-1],{StudyInstanceUID:s,SeriesInstanceUID:i,SOPInstanceUID:c,SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,ConceptNameCodeSequence:m,SOPClassUID:S}=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===D.Comprehensive3DSR,h=m?.CodeValue===u.n7.ImagingMeasurementReport,y={Modality:"SR",displaySetInstanceUID:t.utils.guid(),SeriesDescription:l,SeriesNumber:d,SeriesDate:f,SeriesTime:p,SOPInstanceUID:c,SeriesInstanceUID:i,StudyInstanceUID:s,SOPClassHandlerId:g?O:R,SOPClassUID:S,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,isImagingMeasurementReport:h,sopClassUids:x,instance:a,addInstances:U,label:l||`${o().t("Series")} ${d} - ${o().t("SR")}`};return y.load=()=>async function(e,t,n){const{displaySetService:r,measurementService:o}=t.services,a=n.getDataSources(),s=a[0],{ContentSequence:i}=e.instance;async function c(t,n=null,r=null){for(const o in t)if("object"==typeof t[o]&&null!==t[o])await c(t[o],t,o);else if(Array.isArray(t[o]))await Promise.all(t[o].map(e=>c(e,t,o)));else if("BulkDataURI"===o){const a=await s.retrieve.bulkDataURI({BulkDataURI:t[o],StudyInstanceUID:e.instance.StudyInstanceUID,SeriesInstanceUID:e.instance.SeriesInstanceUID,SOPInstanceUID:e.instance.SOPInstanceUID});n&&r&&(n[r]=new Float32Array(a))}}!0!==e.isLoaded&&await c(i);e.isImagingMeasurementReport?(e.referencedImages=function(e){const t=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImageLibrary);if(!t)return[];const n=V(t.ContentSequence).find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImageLibraryGroup);if(!n)return[];const r=[];return V(n.ContentSequence).forEach(e=>{const{ReferencedSOPSequence:t}=e;if(t)for(const e of V(t))if(e.ReferencedSOPClassUID){const{ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n}=e;r.push({ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:n})}}),r}(i),e.measurements=function(e){const t=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.ImagingMeasurements);if(!t)return[];const n=function(e){const t={};return e.forEach(e=>{const n=V(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}(V(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=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType))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),a={loaded:!1,labels:[],coords:[_(t)],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};o.forEach(e=>{const{ConceptNameCodeSequence:t,MeasuredValueSequence:n}=e;n&&a.labels.push(k(t,n))});const s=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===u.bY.SCT&&e.ConceptNameCodeSequence.CodeValue===u.n7.FindingSiteSCT);s.length&&a.labels.push({label:u.n7.FindingSiteSCT,value:s[0].ConceptCodeSequence.CodeMeaning});return a}(e);return function(e){const t=e.filter(e=>"NUM"===e.ValueType),n=e.find(e=>"UIDREF"===e.ValueType),r=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.TrackingIdentifier),o=e.find(e=>e.ConceptNameCodeSequence.CodeValue===u.n7.Finding),a=e.filter(e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===u.bY.SRT&&e.ConceptNameCodeSequence.CodeValue===u.n7.FindingSite),s={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};o&&u.bY.CornerstoneCodeSchemes.includes(o.ConceptCodeSequence.CodingSchemeDesignator)&&o.ConceptCodeSequence.CodeValue===N.codeValues.CORNERSTONEFREETEXT&&s.labels.push({label:N.codeValues.CORNERSTONEFREETEXT,value:o.ConceptCodeSequence.CodeMeaning});if(a.length){const e=a.find(e=>u.bY.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===N.codeValues.CORNERSTONEFREETEXT);e&&s.labels.push({label:N.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=_(n);a&&s.coords.push(a),r&&s.labels.push(k(t,r))}),s}(e)}(n[e]);t&&r.push(t)}),r}(i)):(e.referencedImages=[],e.measurements=[]);const l=o.getSourceMappings(v,E);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{TrackingIdentifier:t}=r[e]||{};if(!t){console.warn("No tracking identifier for measurement ",r[e]);continue}const o=I.getAdapterForTrackingIdentifier(t);if(o&&n.has(o.toolType))return!0;console.log("Measurement is not rehydratable",t,r[e])}return console.log("No measurements found which were rehydratable"),!1}(e,l),e.isLoaded=!0,r.activeDisplaySets.forEach(n=>{P(e,n,s,t)}),r.subscribe(r.EVENTS.DISPLAY_SETS_ADDED,n=>{const{displaySetsAdded:r}=n;r.forEach(n=>{P(e,n,s,t)})})}(y,n,r),[y]}function P(e,t,n,r){const{customizationService:o}=r.services,a=e.measurements.filter(e=>!1===e.loaded);if(0===a.length||!(t instanceof b)||t.unsupported)return;const s=new Map,i=n.getImageIdsForDisplaySet(t);for(const e of i){const{SOPInstanceUID:t,frameNumber:n}=w.getUIDsFromImageID(e),r=`${t}:${n||1}`;s.set(r,e)}if(!a?.length)return;const c=e.SOPClassUID===D.Comprehensive3DSR;for(let n=a.length-1;n>=0;n--){let r=a[n];const i=o.getCustomization("onBeforeSRAddMeasurement");if("function"==typeof i&&(r=i({measurement:r,StudyInstanceUID:e.StudyInstanceUID,SeriesInstanceUID:e.SeriesInstanceUID})),c){h(r,null,null),r.loaded=!0;continue}const l=r.coords[0].ReferencedSOPSequence;if(!l)continue;const{ReferencedSOPInstanceUID:u}=l,d=l.ReferencedFrameNumber||1,f=`${u}:${d}`,p=s.get(f);p&&q(r,u,d)&&(h(r,p,d),r.loaded=!0,r.imageId=p,r.displaySetInstanceUID=t.displaySetInstanceUID,r.ReferencedSOPInstanceUID=u,r.frameNumber=d,a.splice(n,1))}}function q(e,t,n){const{coords:r}=e,o=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence?.ReferencedFrameNumber||1;if(n&&Number(n)!==Number(o))return!1;for(let e=0;e<r.length;e++){const n=r[e],{ReferencedSOPInstanceUID:o}=n.ReferencedSOPSequence;if(o===t)return!0}return!1}const _=e=>{const{ValueType:t,GraphicType:n,GraphicData:r}=e,o={ValueType:t,GraphicType:n,GraphicData:r};return o.ReferencedSOPSequence=e.ContentSequence?.ReferencedSOPSequence,o.ReferencedFrameOfReferenceSequence=e.ReferencedFrameOfReferenceUID||e.ContentSequence?.ReferencedFrameOfReferenceSequence,o};function k(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 V(e){return e?Array.isArray(e)?e:[e]:[]}const L=function(e){const{servicesManager:t,extensionManager:n}=e,r=e=>M(e,t,n);return[{name:C,sopClassUids:x,getDisplaySetsFromSeries:r},{name:T,sopClassUids:[D.Comprehensive3DSR],getDisplaySetsFromSeries:r}]},A={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 F=m(111),j=m.n(F);const{log:B}=n();const $=function(e,t){const n={};function r(r,o){if(!r.metadata?.referencedImageId)return void B.warn(`[DICOMSR] No referencedImageId found for ${o} ${r.id}`);const a=r.metadata.referencedImageId;n[a]||(n[a]={});const s=n[a];s[o]||(s[o]={data:[]});const i=e.find(e=>e.uid===r.annotationUID),c=s[o].data;let{finding:l}=i;const u=[];i.label&&(t.includes(o)?l={CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:i.label}:u.push({CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:i.label})),i.findingSites&&u.push(...i.findingSites);const d=Object.assign({},r,{finding:l,findingSites:u});c.push(d)}const o=e.map(e=>e.uid).slice(),a=i.annotation.state.getAnnotationManager(),s=a.getFramesOfReference();for(let e=0;e<s.length;e++){const t=s[e],i=a.getAnnotations(t),c=Object.keys(i);for(let e=0;e<c.length;e++){const t=c[e],a=i[t];if(a)for(let e=0;e<a.length;e++){const s=a[e],i=o.findIndex(e=>e===s.annotationUID);if(-1!==i&&(r(s,t),o.splice(i,1),!o.length))return n}}}return n},{CodeScheme:G}=s.adaptersSR.Cornerstone3D;const{locking:W}=i.annotation,{guid:H}=n().utils,{MeasurementReport:z,CORNERSTONE_3D_TAG:Y}=s.adaptersSR.Cornerstone3D,{CORNERSTONE_3D_TOOLS_SOURCE_NAME:X,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:J}=a.Enums,K=(e,t)=>{if(!t||"CORNERSTONEJS"===t.CodingSchemeDesignator)return;const n=`${t.CodingSchemeDesignator}:${t.CodeValue}`;return{...e[n],ref:n,...t,text:t.CodeMeaning}},Q=(e,t)=>{if(!t||!t.length)return;const n=[];for(let r=0;r<t.length;r++){const o=K(e,t[r][0]||t[r]);o&&n.push(o)}return n.length&&n||void 0};function Z({servicesManager:e,extensionManager:n,commandsManager:r},o){const a=n.getActiveDataSource()[0],{measurementService:s,displaySetService:i,customizationService:l}=e.services,u=l.getCustomization("codingValues"),d=l.getCustomization("panelMeasurement.disableEditing"),f=i.getDisplaySetByUID(o),p=s.getSourceMappings(X,J);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=z.generateToolState(h,S,c.utilities.imageToWorldCoords,c.metaData);const y=l.getCustomization("onBeforeSRHydration")?.value;"function"==typeof y&&(I=y({storedMeasurementByAnnotationType:I,displaySet:f}));const C=p.map(e=>e.annotationType),R={};Object.keys(I).forEach(e=>{C.includes(e)&&(R[e]=I[e])});const T=[];let O;Object.keys(R).forEach(e=>{R[e].forEach(e=>{const t=e.annotation.data&&e.annotation.data.frameNumber||1,n=g[e.sopInstanceUid][t]||S[e.sopInstanceUid];T.includes(n)||T.push(n)})});const D=[];for(let e=0;e<T.length;e++){const t=T[e],{SeriesInstanceUID:n,StudyInstanceUID:r}=c.metaData.get("instance",t);D.includes(n)||D.push(n),O?O!==r&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):O=r}return Object.keys(R).forEach(e=>{R[e].forEach(t=>{const n=t.annotation.data&&t.annotation.data.frameNumber||1,o=g[t.sopInstanceUid][n]||S[t.sopInstanceUid];t.uid=H();const i=c.metaData.get("instance",o),{FrameOfReferenceUID:l}=i,f={annotationUID:t.annotation.annotationUID,data:t.annotation.data,metadata:{toolName:e,referencedImageId:o,FrameOfReferenceUID:l}},m=s.getSource(X,J);f.data.label=function(e){const{findingSites:t=[],finding:n}=e;let r=t.find(e=>e.CodeValue===G.codeValues.CORNERSTONEFREETEXT);return r?r.CodeMeaning:n&&n.CodeValue===G.codeValues.CORNERSTONEFREETEXT?n.CodeMeaning:void 0}(t),f.data.finding=K(u,t.finding?.[0]),f.data.findingSites=Q(u,t.findingSites),f.data.findingSites?.forEach(e=>{e.type&&(f.data[e.type]=e)});const h=p.find(t=>t.annotationType===e),I=s.addRawMeasurement(m,e,{annotation:f},h.toMeasurementSchema,a);r.runCommand("updateMeasurement",{uid:I,code:f.data.finding}),d&&W.setAnnotationLocked(I,!0),T.includes(o)||T.push(o)})}),f.isHydrated=!0,{StudyInstanceUID:O,SeriesInstanceUIDs:D}}const{MeasurementReport:ee}=s.adaptersSR.Cornerstone3D,{log:te}=n(),ne=(e,t,n={})=>{const r=$(e,t),o=ee.generateReport(r,c.metaData,c.utilities.worldToImageCoords,n),{dataset:a}=o;return void 0===a.SpecificCharacterSet&&(a.SpecificCharacterSet="ISO_IR 192"),a.InstanceNumber=n.InstanceNumber??1,a},re=e=>{const{servicesManager:n,extensionManager:r,commandsManager:o}=e,{customizationService:a,viewportGridService:s,displaySetService:i}=n.services,c={changeColorMeasurement:({uid:e})=>{throw new Error("Unsupported operation: changeColorMeasurement")},downloadReport:({measurementData:e,additionalFindingTypes:t,options:n={}})=>{const r=ne(e,t,n),o=j().data.datasetToBlob(r),a=URL.createObjectURL(o);window.location.assign(a)},storeMeasurements:async({measurementData:e,dataSource:n,additionalFindingTypes:r,options:o={}})=>{if(te.info("[DICOMSR] storeMeasurements"),!n||!n.store||!n.store.dicom)return te.error("[DICOMSR] datasource has no dataSource.store.dicom endpoint!"),Promise.reject({});try{const s=ne(e,r,o),{StudyInstanceUID:i,ContentSequence:c}=s;if(!c?.[4].ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",s),new Error("Invalid report, no content");const l=a.getCustomization("onBeforeDicomStore");let u;return"function"==typeof l&&(u=l({dicomDict:u,measurementData:e,naturalizedReport:s})),await n.store.dicom(s,null,u),i&&n.deleteStudyMetadataPromise(i),t.DicomMetadataStore.addInstances([s],!0),s}catch(e){throw console.warn(e),te.error(`[DICOMSR] Error while saving the measurements: ${e.message}`),new Error(e.message||"Error while saving the measurements.")}},hydrateStructuredReport:({displaySetInstanceUID:e})=>Z({servicesManager:n,extensionManager:r,commandsManager:o},e)};return{actions:c,definitions:{downloadReport:c.downloadReport,storeMeasurements:c.storeMeasurements,hydrateStructuredReport:c.hydrateStructuredReport},defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};var oe=m(942);class ae extends i.AnnotationTool{constructor(e={},t={configuration:{}}){super(e,t),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{const{viewport:n}=e,{element:r}=n;let o=i.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;if(o=this.filterInteractableAnnotationsForElement(r,o),!o?.length)return;const a=(0,oe.eF)(r),{activeIndex:s,trackingUniqueIdentifiers:c}=a,l=c[s],d=o.filter(e=>c.includes(e.data?.TrackingUniqueIdentifier));if(!n._actors?.size)return;const f={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id},{style:p}=i.annotation.config;for(let e=0;e<d.length;e++){const r=d[e],o=r.annotationUID,{renderableData:a,TrackingUniqueIdentifier:s}=r.data,{referencedImageId:c}=r.metadata;f.annotationUID=o;const m=p.getToolGroupToolStyles(this.toolGroupId)[this.getToolName()],S=this.getStyle("lineWidth",f,r),g=this.getStyle("lineDash",f,r),h={color:s===l?"rgb(0, 255, 0)":this.getStyle("color",f,r),lineDash:g,lineWidth:S,...m};Object.keys(a).forEach(e=>{const s=a[e];let l,d;switch(e){case u.sh.POINT:l=this.renderPoint;break;case u.sh.MULTIPOINT:l=this.renderMultipoint;break;case u.sh.POLYLINE:l=this.renderPolyLine;break;case u.sh.CIRCLE:l=this.renderEllipse;break;case u.sh.ELLIPSE:l=this.renderEllipse,d=i.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const p=l(t,n,s,o,c,h);this.renderTextBox(t,n,p,d,r,f,h)})}}}_getTextBoxLinesFromLabels(e){const t=Math.min(e.length,5),n=[];for(let r=0;r<t;r++){const t=e[r];n.push(`${ie(t.label)}: ${t.value}`)}return n}renderPolyLine(e,t,n,r,o,a){const s={color:a.color,width:a.lineWidth,lineDash:a.lineDash};let c=[];return n.map((n,o)=>{const a=n.map(e=>t.worldToCanvas(e)),l=`${o}`;2===a.length?i.drawing.drawLine(e,r,l,a[0],a[1],s):i.drawing.drawPolyline(e,r,l,a,s),c=c.concat(a)}),c}renderMultipoint(e,t,n,r,o,a){let s;n.map((n,o)=>{s=n.map(e=>t.worldToCanvas(e));i.drawing.drawHandles(e,r,"0",s,{color:a.color})})}renderPoint(e,t,n,r,o,a){const s=[];return n.map((n,l)=>{const u=n[0];if(s.push(t.worldToCanvas(u)),void 0!==n[1])s.push(t.worldToCanvas(n[1]));else{const e=c.metaData.get("imagePixelModule",o);let n=10,r=10;if(e){const{columns:t,rows:o}=e;n=t/10,r=o/10}const a=c.utilities.worldToImageCoords(o,u),i=c.utilities.imageToWorldCoords(o,[a[0]+n,a[1]+r]);s.push(t.worldToCanvas(i))}const d=`${l}`;i.drawing.drawArrow(e,r,d,s[1],s[0],{color:a.color,width:a.lineWidth})}),s}renderEllipse(e,t,n,r,o,a){let s;return n.map((n,o)=>{if(0===n.length)return;const c=n,l=t.getRotation();let u;s=c.map(e=>t.worldToCanvas(e)),u=90==l||270==l?i.utilities.math.ellipse.getCanvasEllipseCorners([s[2],s[3],s[0],s[1]]):i.utilities.math.ellipse.getCanvasEllipseCorners(s);const d=`${o}`;i.drawing.drawEllipse(e,r,d,u[0],u[1],{color:a.color,width:a.lineWidth,lineDash:a.lineDash})}),s}renderTextBox(e,t,n,r,o,a,s={}){if(!n||!o)return;const{annotationUID:c,data:l={}}=o,{labels:u}=l,{color:d}=s;let f=n;"function"==typeof r&&(f=r(n));const p=this._getTextBoxLinesFromLabels(u),m=i.utilities.drawing.getTextBoxCoordsCanvas(f);o.data?.handles?.textBox?.worldPosition||(o.data.handles.textBox.worldPosition=t.canvasToWorld(m));const S=t.worldToCanvas(o.data.handles.textBox.worldPosition),g=this.getLinkedTextBoxStyle(a,o),h=i.drawing.drawLinkedTextBox(e,c,"1",p,S,n,{},{...g,color:d}),{x:I,y,width:C,height:R}=h;o.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([I,y]),topRight:t.canvasToWorld([I+C,y]),bottomLeft:t.canvasToWorld([I,y+R]),bottomRight:t.canvasToWorld([I+C,y+R])}}}ae.toolName=g.DICOMSRDisplay;const se={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function ie(e){const t=se[e];return void 0!==t?t:e}class ce extends i.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=i.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;const a=o;if(!n._actors?.size)return;const s={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;s.annotationUID=o;const u=this.getStyle("lineWidth",s,r),d=this.getStyle("lineDash",s,r),f={color:this.getStyle("color",s,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]];i.drawing.drawArrow(t,o,"1",S[1],S[0],{color:f.color,width:f.lineWidth}),this.renderTextBox(t,n,S,r,s,f)}}}_getTextBoxLinesFromLabels(e){Math.min(e.length,5);return[]}renderTextBox(e,t,n,r,o,a={}){if(!n||!r)return;const{annotationUID:s,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=i.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=i.drawing.drawLinkedTextBox(e,s,"1",u,m,n,{},{...S,color:d}),{x:h,y:I,width:y,height:C}=g;r.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([h,I]),topRight:t.canvasToWorld([h+y,I]),bottomLeft:t.canvasToWorld([h,I+C]),bottomRight:t.canvasToWorld([h+y,I+C])}}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)}}}ce.toolName=g.SRSCOORD3DPoint;const le={toAnnotation:e=>{},toMeasurement:(e,t,n,r,o)=>{const{annotation:a}=e,{metadata:s,data:i,annotationUID:c}=a;if(!s||!i)return console.warn("Probe tool: Missing metadata or data"),null;const{toolName:l}=s,{points:u}=i.handles,d=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 r}(a);return{uid:c,points:u,metadata:s,toolName:s.toolName,label:i.label,displayText:d,data:i.cachedStats,type:r?.(l)??null}}};function ue(e,t,n={}){class r extends t{constructor(e,t){e.configuration=e.configuration?{...e.configuration,...n}:n,super(e,t)}}r.toolName=e,(0,i.addTool)(r)}const{CORNERSTONE_3D_TOOLS_SOURCE_NAME:de,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:fe}=a.Enums;var pe=m(291);function me(){return me=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},me.apply(null,arguments)}const Se=e.lazy(()=>Promise.resolve().then(m.bind(m,525))),ge=t=>e.createElement(e.Suspense,{fallback:e.createElement("div",null,"Loading...")},e.createElement(Se,t)),he={id:y,onModeEnter:function({servicesManager:e}){const{displaySetService:t}=e.services;[...t.getDisplaySetCache().values()].filter(e=>e.SOPClassHandlerId===R||e.SOPClassHandlerId===O).forEach(e=>{e.isHydrated=!1})},preRegistration:function({configuration:e={},servicesManager:t}){const{measurementService:n,cornerstoneViewportService:r}=t.services;ue(g.DICOMSRDisplay,ae),ue(g.SRLength,i.LengthTool),ue(g.SRBidirectional,i.BidirectionalTool),ue(g.SREllipticalROI,i.EllipticalROITool),ue(g.SRCircleROI,i.CircleROITool),ue(g.SRArrowAnnotate,i.ArrowAnnotateTool),ue(g.SRAngle,i.AngleTool),ue(g.SRPlanarFreehandROI,i.PlanarFreehandROITool),ue(g.SRRectangleROI,i.RectangleROITool),ue(g.SRSCOORD3DPoint,ce),ue(g.SRCobbAngle,i.CobbAngleTool);const o=n.getSource(de,fe),{POINT:a}=n.VALUE_TYPES;n.addMapping(o,"SRSCOORD3DPoint",a,le.toAnnotation,le.toMeasurement);const s={lineDash:"4,4"};i.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{[g.DICOMSRDisplay]:s,SRLength:s,SRBidirectional:s,SREllipticalROI:s,SRCircleROI:s,SRArrowAnnotate:s,SRCobbAngle:s,SRAngle:s,SRPlanarFreehandROI:s,SRRectangleROI:s,global:{}})},getViewportModule:({servicesManager:t,extensionManager:n})=>[{name:"dicom-sr",component:r=>e.createElement(ge,me({servicesManager:t,extensionManager:n},r))}],getCommandsModule:re,getSopClassHandlerModule:L,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.11.0-beta.
|
|
3
|
+
"version": "3.11.0-beta.91",
|
|
4
4
|
"description": "OHIF extension for an SR Cornerstone Viewport",
|
|
5
5
|
"author": "OHIF",
|
|
6
6
|
"license": "MIT",
|
|
@@ -34,11 +34,11 @@
|
|
|
34
34
|
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
|
-
"@ohif/core": "3.11.0-beta.
|
|
38
|
-
"@ohif/extension-cornerstone": "3.11.0-beta.
|
|
39
|
-
"@ohif/extension-measurement-tracking": "3.11.0-beta.
|
|
40
|
-
"@ohif/ui": "3.11.0-beta.
|
|
41
|
-
"dcmjs": "
|
|
37
|
+
"@ohif/core": "3.11.0-beta.91",
|
|
38
|
+
"@ohif/extension-cornerstone": "3.11.0-beta.91",
|
|
39
|
+
"@ohif/extension-measurement-tracking": "3.11.0-beta.91",
|
|
40
|
+
"@ohif/ui": "3.11.0-beta.91",
|
|
41
|
+
"dcmjs": "^0.42.0",
|
|
42
42
|
"dicom-parser": "^1.8.9",
|
|
43
43
|
"hammerjs": "^2.0.8",
|
|
44
44
|
"prop-types": "^15.6.2",
|
|
@@ -46,9 +46,9 @@
|
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@babel/runtime": "^7.20.13",
|
|
49
|
-
"@cornerstonejs/adapters": "^3.
|
|
50
|
-
"@cornerstonejs/core": "^3.
|
|
51
|
-
"@cornerstonejs/tools": "^3.
|
|
49
|
+
"@cornerstonejs/adapters": "^3.30.3",
|
|
50
|
+
"@cornerstonejs/core": "^3.30.3",
|
|
51
|
+
"@cornerstonejs/tools": "^3.30.3",
|
|
52
52
|
"classnames": "^2.3.2"
|
|
53
53
|
}
|
|
54
54
|
}
|