@ohif/extension-cornerstone-dynamic-volume 3.9.0-beta.99 → 3.9.1

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-dynamic-volume.umd.js.LICENSE.txt */
2
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@cornerstonejs/core"),require("@cornerstonejs/streaming-image-volume-loader"),require("@cornerstonejs/tools"),require("@ohif/core"),require("@ohif/ui"),require("@ohif/ui-next")):"function"==typeof define&&define.amd?define(["@cornerstonejs/core","@cornerstonejs/streaming-image-volume-loader","@cornerstonejs/tools","@ohif/core","@ohif/ui","@ohif/ui-next"],t):"object"==typeof exports?exports["ohif-extension-cornerstone"]=t(require("@cornerstonejs/core"),require("@cornerstonejs/streaming-image-volume-loader"),require("@cornerstonejs/tools"),require("@ohif/core"),require("@ohif/ui"),require("@ohif/ui-next")):e["ohif-extension-cornerstone"]=t(e["@cornerstonejs/core"],e["@cornerstonejs/streaming-image-volume-loader"],e["@cornerstonejs/tools"],e["@ohif/core"],e["@ohif/ui"],e["@ohif/ui-next"])}(globalThis,((e,t,n,r,o,a)=>(()=>{var i={337:(e,t,n)=>{"use strict";var r=n(287);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}},827:(e,t,n)=>{e.exports=n(337)()},287:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},977:(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"),u=Symbol.for("react.forward_ref"),l=Symbol.for("react.suspense"),p=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),d=Symbol.iterator;var f={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},y=Object.assign,g={};function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||f}function S(){}function h(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||f}v.prototype.isReactComponent={},v.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")},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},S.prototype=v.prototype;var b=h.prototype=new S;b.constructor=h,y(b,v.prototype),b.isPureReactComponent=!0;var I=Array.isArray,D=Object.prototype.hasOwnProperty,w={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function x(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)D.call(t,o)&&!E.hasOwnProperty(o)&&(a[o]=t[o]);var c=arguments.length-2;if(1===c)a.children=r;else if(1<c){for(var u=Array(c),l=0;l<c;l++)u[l]=arguments[l+2];a.children=u}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:w.current}}function C(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var T=/\/+/g;function O(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 P(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?"."+O(c,0):a,I(i)?(o="",null!=e&&(o=e.replace(T,"$&/")+"/"),P(i,t,o,"",(function(e){return e}))):null!=i&&(C(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(T,"$&/")+"/")+e)),t.push(i)),1;if(c=0,a=""===a?".":a+":",I(e))for(var u=0;u<e.length;u++){var l=a+O(s=e[u],u);c+=P(s,t,o,l,i)}else if(l=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=d&&e[d]||e["@@iterator"])?e:null}(e),"function"==typeof l)for(e=l.call(e),u=0;!(s=e.next()).done;)c+=P(s=s.value,t,o,l=a+O(s,u++),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 M(e,t,n){if(null==e)return e;var r=[],o=0;return P(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function N(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var R={current:null},k={transition:null},U={ReactCurrentDispatcher:R,ReactCurrentBatchConfig:k,ReactCurrentOwner:w};function _(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:M,forEach:function(e,t,n){M(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return M(e,(function(){t++})),t},toArray:function(e){return M(e,(function(e){return e}))||[]},only:function(e){if(!C(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=v,t.Fragment=o,t.Profiler=i,t.PureComponent=h,t.StrictMode=a,t.Suspense=l,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=U,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=y({},e.props),a=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=w.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(u in t)D.call(t,u)&&!E.hasOwnProperty(u)&&(o[u]=void 0===t[u]&&void 0!==c?c[u]:t[u])}var u=arguments.length-2;if(1===u)o.children=r;else if(1<u){c=Array(u);for(var l=0;l<u;l++)c[l]=arguments[l+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=x,t.createFactory=function(e){var t=x.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:u,render:e}},t.isValidElement=C,t.lazy=function(e){return{$$typeof:m,_payload:{_status:-1,_result:e},_init:N}},t.memo=function(e,t){return{$$typeof:p,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=k.transition;k.transition={};try{e()}finally{k.transition=t}},t.unstable_act=_,t.useCallback=function(e,t){return R.current.useCallback(e,t)},t.useContext=function(e){return R.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return R.current.useDeferredValue(e)},t.useEffect=function(e,t){return R.current.useEffect(e,t)},t.useId=function(){return R.current.useId()},t.useImperativeHandle=function(e,t,n){return R.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return R.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return R.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return R.current.useMemo(e,t)},t.useReducer=function(e,t,n){return R.current.useReducer(e,t,n)},t.useRef=function(e){return R.current.useRef(e)},t.useState=function(e){return R.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return R.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return R.current.useTransition()},t.version="18.3.1"},1:(e,t,n)=>{"use strict";e.exports=n(977)},165: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}},464:t=>{"use strict";t.exports=e},644:e=>{"use strict";e.exports=t},867:e=>{"use strict";e.exports=n},762:e=>{"use strict";e.exports=r},369:e=>{"use strict";e.exports=o},750:e=>{"use strict";e.exports=a}},s={};function c(e){var t=s[e];if(void 0!==t)return t.exports;var n=s[e]={exports:{}};return i[e](n,n.exports,c),n.exports}c.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return c.d(t,{a:t}),t},c.d=(e,t)=>{for(var n in t)c.o(t,n)&&!c.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},c.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var u={};return(()=>{"use strict";c.r(u),c.d(u,{default:()=>de});var e={};c.r(e),c.d(e,{updateSegmentationsChartDisplaySet:()=>f});const t=JSON.parse('{"u2":"@ohif/extension-cornerstone-dynamic-volume"}').u2;var n=c(762),r=c(464),o=c(867);const a="CHT",i=n.utils.guid(),s="1.9.451.13215.7.3.2.7.6.1",{utilities:l}=o;function p(e,t){const r=e.imageIds.reduce(((e,r)=>{const o=n.DicomMetadataStore.getInstanceByImageId(r)[t];return void 0!==o&&e.add(o),e}),new Set);return Array.from(r).sort(((e,t)=>e-t))}function m(e,t,a){let i;const s=a.getActiveDisplaySets().find((e=>{const t=e.instances?.[0];return!!t&&(void 0!==t.FrameReferenceTime||void 0!==t.NumberOfTimeSlices)})).displaySetInstanceUID;for(const[e]of r.cache._volumeCache)if(e.includes(s)){i=e;break}let c;i&&(c=r.cache.getVolume(i));const{StudyInstanceUID:u,StudyDescription:m}=n.DicomMetadataStore.getInstanceByImageId(c.imageIds[0]),[d,f]=l.dynamicVolume.getDataInTime(c,{maskVolumeId:e.id}),y=d.length;if(0===y)return[];const g=o.segmentation.state.getSegmentationIdRepresentations(e.id)[0].segmentationRepresentationUID,v=o.segmentation.state.getToolGroupIdFromSegmentationRepresentationUID(g),S=o.segmentation.config.color.getColorForSegmentIndex(v,g,1),h=r.utilities.color.rgbToHex(...S);let b=t.get(c);b||(b=function(e){const t={FrameReferenceTime:{unit:"ms"}},n=Object.keys(t);let r,o;for(let a=0;a<n.length;a++){const i=n[a],s=p(e,i);if(s.length){r=s,o=t[i].unit;break}}if(!r.length){const e=n.join(", ");throw new Error(`Could not extract time points data for the following tags: ${e}`)}const a=function(e,t){const n=["ms","s","m","h"],r=[1e3,60,60],o=n.indexOf(t);let a=1;if(-1!==o){for(let i=o;i<n.length-1;i++){const o=a*r[i];if(e.filter((e=>e>o)).length<=e.length/2)break;a=o,t=n[i+1]}a>1&&(e=e.map((e=>e/a)))}return{timePoints:e,timePointsUnit:t}}(r,o);return r=a.timePoints,o=a.timePointsUnit,{timePoints:r,timePointsUnit:o}}(c),t.set(c,b));const{timePoints:I,timePointsUnit:D}=b;if(I.length!==d[0].length)throw new Error("Invalid number of time points returned");const w=I.length,E=new Array(w);for(let e=0;e<w;e++){const t=d.reduce(((t,n)=>t+n[e]/y),0);E[e]=[I[e],t]}return{StudyInstanceUID:u,StudyDescription:m,chartData:{series:{label:e.label,points:E,color:h},axis:{x:{label:`Time (${D})`},y:{label:"Vl (Bq/ml)"}}}}}function d(e,t){if(!e.length)return;const r=new WeakMap,o=e.map((e=>m(e,r,t))),{date:c,time:u}=function(){const e=new Date;return{date:e.getFullYear()+("0"+e.getUTCMonth()).slice(-2)+("0"+e.getUTCDate()).slice(-2),time:("0"+e.getUTCHours()).slice(-2)+("0"+e.getUTCMinutes()).slice(-2)+("0"+e.getUTCSeconds()).slice(-2)}}(),l=o.reduce(((e,t)=>[...e,t.chartData.series]),[]),p={SOPClassUID:s,Modality:a,SOPInstanceUID:n.utils.guid(),SeriesDate:c,SeriesTime:u,SeriesInstanceUID:i,StudyInstanceUID:o[0].StudyInstanceUID,StudyDescription:o[0].StudyDescription,SeriesNumber:100,SeriesDescription:"Segmentation chart series data",chartData:{series:l,axis:{...o[0].chartData.axis}}};return{seriesMetadata:{StudyInstanceUID:p.StudyInstanceUID,StudyDescription:p.StudyDescription,SeriesInstanceUID:p.SeriesInstanceUID,SeriesDescription:p.SeriesDescription,SeriesNumber:p.SeriesNumber,SeriesTime:p.SeriesTime,SOPClassUID:p.SOPClassUID,Modality:p.Modality},instance:p}}function f({servicesManager:e}){const{segmentationService:t,displaySetService:r}=e.services,o=t.getSegmentations(),{seriesMetadata:a,instance:i}=d(o,r)??{};a&&i&&(n.DicomMetadataStore.addSeriesMetadata([a],!0),n.DicomMetadataStore.addInstances([i],!0))}const y=o.Enums.SegmentationRepresentations.Labelmap,g=({commandsManager:t,servicesManager:n})=>{const a=n.services,{displaySetService:i,viewportGridService:s,segmentationService:c}=a,u={...e,getDynamic4DDisplaySet:()=>i.getActiveDisplaySets().find((e=>{const t=e.instances?.[0];return!!t&&(void 0!==t.FrameReferenceTime||void 0!==t.NumberOfTimeSlices||void 0!==t.TemporalPositionIdentifier)})),getComputedDisplaySets:()=>[...i.getDisplaySetCache().values()].filter((e=>e.isDerived)),exportTimeReportCSV:({segmentations:e,config:t,options:n,summaryStats:a})=>{const i=u.getDynamic4DDisplaySet(),s=i?.displaySetInstanceUID;let c,l;for(const[e]of r.cache._volumeCache)if(e.includes(s)){c=e;break}c&&(l=r.cache.getVolume(c));const p=i.instances[0],m=[];function d(e){const t=e.length,n=e.reduce(((e,t)=>e+t),0)/t,r=e.map((e=>(e-n)**2)).reduce(((e,t)=>e+t),0)/t;return Math.sqrt(r)}m.push(`Patient ID,${p.PatientID},`),m.push(`Study Date,${p.StudyDate},`),m.push(`StudyInstanceUID,${p.StudyInstanceUID},`),m.push(`StudyDescription,${p.StudyDescription},`),m.push(`SeriesInstanceUID,${p.SeriesInstanceUID},`),m.push(""),m.push(""),e.forEach(((e,t)=>{const[n,r]=o.utilities.dynamicVolume.getDataInTime(l,{maskVolumeId:e.id});if(a){let t="Operation,Segmentation Label ID";const o=l.numTimePoints;for(let e=0;e<o;e++)t+=`,Time Point ${e}`;m.push(t);const a=[],i=[],s=[],c=[],u=[],p=[],f=n.length;for(let e=0;e<o;e++){const t=[];for(let r=0;r<f;r++)t.push(n[r][e]);a.push(t.reduce(((e,t)=>e+t),0)/f);const o=Math.min(...t);i.push(o),s.push(r[t.indexOf(o)]);const l=Math.max(...t);c.push(l),u.push(r[t.indexOf(l)]),p.push(d(t))}let y=`Mean,${e.label}`;for(let e=0;e<o;e++)y+=`,${a[e]}`;m.push(y),y=`Standard Deviation,${e.label}`;for(let e=0;e<o;e++)y+=`,${p[e]}`;m.push(y),y=`Min,${e.label}`;for(let e=0;e<o;e++)y+=`,${i[e]}`;m.push(y),y=`Max,${e.label}`;for(let e=0;e<o;e++)y+=`,${c[e]}`;m.push(y)}else{let t="Pixel Identifier (IJK),Segmentation Label ID";const o=l.numTimePoints;for(let e=0;e<o;e++)t+=`,Time Point ${e}`;m.push(t);for(let t=0;t<n.length;t++){let o=`${`${r[t][0]}_${r[t][1]}_${r[t][2]}`},${e.label}`;for(let e=0;e<n[t].length;e++)o+=`,${n[t][e]}`;m.push(o)}}}));const f=m.join("\n"),y=`${p.PatientID}.csv`,g=new Blob([f],{type:"text/csv;charset=utf-8;"}),v=document.createElement("a"),S=URL.createObjectURL(g);v.setAttribute("href",S),v.setAttribute("download",y),v.style.visibility="hidden",document.body.appendChild(v),v.click(),document.body.removeChild(v)},swapDynamicWithComputedDisplaySet:({displaySet:e})=>{const t=e,n=i.getDisplaySetCache(),r=[n.keys()],{displaySetInstanceUID:o}=t;r.includes(o)||n.set(o,t);const{viewports:a}=s.getState(),c=u.getDynamic4DDisplaySet(),l=[];for(const[e,t]of a){const e=t,n=e.viewportOptions,{displaySetInstanceUIDs:r}=e,a=r.indexOf(c.displaySetInstanceUID);if(-1!==a){const t={viewportId:e.viewportId,displaySetInstanceUIDs:[...r.slice(0,a),o,...r.slice(a+1)],viewportOptions:{initialImageOptions:n.initialImageOptions,viewportType:"volume",orientation:n.orientation,background:n.background}};l.push(t)}}s.setDisplaySetsForViewports(l)},swapComputedWithDynamicDisplaySet:()=>{const e=u.getDynamic4DDisplaySet(),t=i.getDisplaySetCache(),n=[...t.keys()],{displaySetInstanceUID:r}=e;n.includes(r)||t.set(r,e);const{viewports:o}=s.getState(),a=u.getComputedDisplaySets()[0],c=[];for(const[e,t]of o){const e=t,n=e.viewportOptions,{displaySetInstanceUIDs:o}=e,i=o.indexOf(a.displaySetInstanceUID);if(-1!==i){const t={viewportId:e.viewportId,displaySetInstanceUIDs:[...o.slice(0,i),r,...o.slice(i+1)],viewportOptions:{initialImageOptions:n.initialImageOptions,viewportType:"volume",orientation:n.orientation,background:n.background}};c.push(t)}}s.setDisplaySetsForViewports(c)},createNewLabelMapForDynamicVolume:async({label:e})=>{const{viewports:t,activeViewportId:n}=s.getState(),r=u.getDynamic4DDisplaySet(),o=r.displaySetInstanceUID;let a;if(t.get(n).displaySetInstanceUIDs.includes(o)&&(a=r),!a){const e=i.getDisplaySetCache();for(const[t,n]of e)if(n.referenceDisplaySetUID===o){a=n;break}}if(!a)throw new Error("No reference display set found based on the dynamic data");const l=await c.createSegmentationForDisplaySet(a.displaySetInstanceUID,{label:e}),p=Array.from(t.values(),(e=>e.viewportOptions.toolGroupId)),m=y;for(const e of p){const t=!0;await c.addSegmentationRepresentationToToolGroup(e,l,t,m),c.setActiveSegmentationForToolGroup(l,e)}return l}},l={updateSegmentationsChartDisplaySet:{commandFn:u.updateSegmentationsChartDisplaySet,storeContexts:[],options:{}},exportTimeReportCSV:{commandFn:u.exportTimeReportCSV,storeContexts:[],options:{}},swapDynamicWithComputedDisplaySet:{commandFn:u.swapDynamicWithComputedDisplaySet,storeContexts:[],options:{}},createNewLabelMapForDynamicVolume:{commandFn:u.createNewLabelMapForDynamicVolume,storeContexts:[],options:{}},swapComputedWithDynamicDisplaySet:{commandFn:u.swapComputedWithDynamicDisplaySet,storeContexts:[],options:{}}};return{actions:u,definitions:l,defaultContext:"DYNAMIC-VOLUME:CORNERSTONE"}};var v=c(1),S=c(827),h=c.n(S),b=c(369),I=c(644);function D(){return D=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},D.apply(null,arguments)}const w={sizeClassName:"w-[58px] h-[28px]",arrowsDirection:"horizontal",labelPosition:"bottom"},E=({title:e,tooltip:t})=>v.createElement("div",{className:"flex items-center space-x-1"},v.createElement(b.Tooltip,{content:v.createElement("div",{className:"text-white"},t),position:"bottom-left",tight:!0,tooltipBoxClassName:"max-w-xs p-2"},v.createElement(b.Icon,{name:"info-link",className:"text-primary-active h-[14px] w-[14px]"})),v.createElement("span",{className:"text-aqua-pale text-[11px] uppercase"},e)),x=({isPlaying:e,onPlayPauseChange:t,fps:n,onFpsChange:o,minFps:a,maxFps:i,currentFrameIndex:s,onFrameChange:c,framesLength:u,onGenerate:l,onDoubleRangeChange:p,onDynamicClick:m})=>{const[d,f]=(0,v.useState)(!1),[y,g]=(0,v.useState)(r.Enums.DynamicOperatorType.SUM),[S,h]=(0,v.useState)([u/4,u/2]);(0,v.useEffect)((()=>{h([u/4,u/2])}),[u]);return v.createElement("div",{className:"flex select-none flex-col"},v.createElement(b.PanelSection,{title:"Controls",childrenClassName:"space-y-4 pb-5 px-5"},v.createElement("div",{className:"mt-2"},v.createElement(E,{title:"View",tooltip:"Select the view mode, 4D to view the dynamic volume or Computed to view the computed volume"}),v.createElement(b.ButtonGroup,{className:"mt-2 w-full"},v.createElement("button",{className:"w-1/2",onClick:()=>{f(!1),m?.()}},"4D"),v.createElement("button",{className:"w-1/2",onClick:()=>{f(!0)}},"Computed"))),v.createElement("div",null,v.createElement(C,{onPlayPauseChange:t,isPlaying:e,computedView:d,fps:n,onFpsChange:o,minFps:a,maxFps:i,framesLength:u,onFrameChange:c,currentFrameIndex:s})),v.createElement("div",{className:"mt-6 flex flex-col "+(d?"":"ohif-disabled")},v.createElement(E,{title:"Computed Operation",tooltip:v.createElement("div",null,"Operation Buttons (SUM, AVERAGE, SUBTRACT): Select the mathematical operation to be applied to the data set.",v.createElement("br",null)," Range Slider: Choose the numeric range within which the operation will be performed.",v.createElement("br",null),"Generate Button: Execute the chosen operation on the specified range of data."," ")}),v.createElement(b.ButtonGroup,{className:"mt-2 w-full ",separated:!0},v.createElement("button",{className:"w-1/2",onClick:()=>g(r.Enums.DynamicOperatorType.SUM)},r.Enums.DynamicOperatorType.SUM.toString().toUpperCase()),v.createElement("button",{className:"w-1/2",onClick:()=>g(r.Enums.DynamicOperatorType.AVERAGE)},r.Enums.DynamicOperatorType.AVERAGE.toString().toUpperCase()),v.createElement("button",{className:"w-1/2",onClick:()=>g(r.Enums.DynamicOperatorType.SUBTRACT)},r.Enums.DynamicOperatorType.SUBTRACT.toString().toUpperCase())),v.createElement("div",{className:"w-ful mt-2"},v.createElement(b.InputDoubleRange,{values:S,onChange:e=>{p(e),e[0]===S[0]&&e[1]===S[1]||h(e)},minValue:0,showLabel:!0,allowNumberEdit:!0,maxValue:u,step:1})),v.createElement(b.Button,{className:"mt-2 !h-[26px] !w-[115px] self-start !p-0",onClick:()=>{l(y)}},"Generate"))))};function C({isPlaying:e,onPlayPauseChange:t,fps:n,minFps:r,maxFps:o,onFpsChange:a,framesLength:i,onFrameChange:s,currentFrameIndex:c,computedView:u}){return v.createElement("div",{className:u&&"ohif-disabled"},v.createElement(E,{title:"4D Controls",tooltip:v.createElement("div",null,"Play/Pause Button: Begin or pause the animation of the 4D visualization. ",v.createElement("br",null)," Frame Selector: Navigate through individual frames of the 4D data. ",v.createElement("br",null)," FPS (Frames Per Second) Selector: Adjust the playback speed of the animation.")}),v.createElement("div",{className:"mt-3 flex justify-between"},v.createElement(b.IconButton,{className:"bg-customblue-30 h-[26px] w-[58px] rounded-[4px]",onClick:()=>t(!e)},v.createElement(b.Icon,{name:e?"icon-pause":"icon-play",className:" active:text-primary-light hover:bg-customblue-300 h-[24px] w-[24px] cursor-pointer text-white"})),v.createElement(b.InputNumber,D({value:c,onChange:s,minValue:0,maxValue:i,label:"Frame"},w)),v.createElement(b.InputNumber,D({value:n,onChange:a,minValue:r,maxValue:o},w,{label:"FPS"}))))}const T="@ohif/extension-default.sopClassHandlerModule.stack";function O({servicesManager:e,commandsManager:t}){const{cornerstoneViewportService:n,viewportGridService:a,displaySetService:i}=e.services,[{isCineEnabled:s},c]=(0,b.useCine)(),[{activeViewportId:u}]=(0,b.useViewportGrid)(),[l,p]=(0,v.useState)([]),[m,d]=(0,v.useState)([]),[f,y]=(0,v.useState)(null),[g,S]=(0,v.useState)(null),[h,D]=(0,v.useState)(20),[w,E]=(0,v.useState)(s),[C,O]=(0,v.useState)(null),[P,M]=(0,v.useState)(!1),N=(0,v.useRef)(r.utilities.uuidv4()),R=(0,v.useRef)(null),k=`cornerstoneStreamingImageVolume:${N.current}`;function U(e){t.runCommand("swapDynamicWithComputedDisplaySet",{displaySet:e}),M(!0)}(0,v.useEffect)((()=>{const e=n.EVENTS.VIEWPORT_DATA_CHANGED,{unsubscribe:t}=n.subscribe(e,(e=>{e.viewportData.data.forEach((e=>{e.volume.isDynamicVolume()&&(S(e.volume),R.current=e.displaySetInstanceUID,p([1,e.volume.numTimePoints]))}))}));return()=>{t()}}),[n]),(0,v.useEffect)((()=>{const{unsubscribe:t}=e.services.cineService.subscribe(e.services.cineService.EVENTS.CINE_STATE_CHANGED,(e=>{E(e.isPlaying)}));return()=>{t()}}),[c]),(0,v.useEffect)((()=>{const e=a.getDisplaySetsUIDsForViewport(u);if(!e||0===e.length)return;const t=e.map((e=>i.getDisplaySetByUID(e))).find((e=>e.isDynamicVolume));if(!t)return;const n=r.cache.getVolumes().find((e=>e.volumeId.includes(t.displaySetInstanceUID)));n&&(S(n),R.current=t.displaySetInstanceUID,p([1,n.numTimePoints]))}),[u,n]),(0,v.useEffect)((()=>{const e=I.Enums.Events.DYNAMIC_VOLUME_TIME_POINT_INDEX_CHANGED,t=e=>{O(e.detail.timePointIndex)};return r.eventTarget.addEventListener(e,t),()=>{r.eventTarget.removeEventListener(e,t)}}),[n]);const _=()=>{E(!0);const e=n.getViewportInfo(u);if(!e)return;const{element:t}=e;c.playClip(t,{framesPerSecond:h,viewportId:u})},j=()=>{E(!1);const{element:e}=n.getViewportInfo(u);c.stopClip(e)};return g&&0!==l.length?v.createElement(x,{fps:h,isPlaying:w,onPlayPauseChange:e=>{e?_():j()},minFps:1,maxFps:50,currentFrameIndex:C,onFpsChange:e=>{D(e),j(),_()},framesLength:l[1],onFrameChange:e=>{g.timePointIndex=e},onGenerate:async function(e){const a=g.volumeId;if(!a)return;let i=r.cache.getVolume(k);i||(await async function(e,t){if(!r.cache.getVolume(t)){return await r.volumeLoader.createAndCacheDerivedVolume(e,{volumeId:t})}}(a,k),i=r.cache.getVolume(k));const s=m,c=Array.from({length:s[1]-s[0]+1},((e,t)=>t+s[0])),u=o.utilities.dynamicVolume.generateImageFromTimeData(g,e,"SUBTRACT"===e?s:c);if(i.loadStatus={},i.loadStatus.loaded=!0,i.getScalarData().set(u),f)t.runCommand("updateVolumeData",{volume:i}),n.getRenderingEngine().render(),U(f);else{const e={volumeLoaderSchema:i.volumeId.split(":")[0],displaySetInstanceUID:N.current,SOPClassHandlerId:T,Modality:g.metadata.Modality,isMultiFrame:!1,numImageFrames:1,uid:N.current,referenceDisplaySetUID:g.volumeId.split(":")[1],madeInClient:!0,FrameOfReferenceUID:g.metadata.FrameOfReferenceUID,isDerived:!0};y(e),U(e)}},onDynamicClick:P?()=>{t.runCommand("swapComputedWithDynamicDisplaySet")}:null,onDoubleRangeChange:function(e){e[0]===m[0]&&e[1]===m[1]||d(e)}}):null}O.propTypes={servicesManager:h().shape({services:h().shape({measurementService:h().shape({getMeasurements:h().func.isRequired,subscribe:h().func.isRequired,EVENTS:h().object.isRequired,VALUE_TYPES:h().object.isRequired}).isRequired}).isRequired}).isRequired};var P=c(750);const M=function({servicesManager:e,commandsManager:t,renderHeader:n,getCloseIcon:r,tab:o}){return v.createElement(v.Fragment,null,n&&v.createElement(v.Fragment,null,v.createElement("div",{className:"bg-primary-dark flex select-none rounded-t pt-1.5 pb-[2px]"},v.createElement("div",{className:"flex h-[24px] w-full cursor-pointer select-none justify-center self-center text-[14px]"},v.createElement("div",{className:"text-primary-active flex grow cursor-pointer select-none justify-center self-center text-[13px]"},v.createElement("span",null,o.label))),r()),v.createElement(P.Separator,{orientation:"horizontal",className:"bg-black",thickness:"2px"})),v.createElement("div",{className:"flex flex-col text-white","data-cy":"dynamic-volume-panel"},v.createElement(O,{commandsManager:t,servicesManager:e})))};const N=(0,v.createContext)(null),{Provider:R}=N;function k({children:e,value:t}){const[n,r]=(0,v.useState)(t);return v.createElement(R,{value:[n]},e)}k.propTypes={children:h().any,value:h().any};c(165);Object.create(null);function U(){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 _={};function j(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];"string"==typeof t[0]&&_[t[0]]||("string"==typeof t[0]&&(_[t[0]]=new Date),U.apply(void 0,t))}var V=function(e,t){return function(){if(e.isInitialized)t();else{e.on("initialized",(function n(){setTimeout((function(){e.off("initialized",n)}),0),t()}))}}};function F(e,t,n){e.loadNamespaces(t,V(e,n))}function A(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,V(e,r))}function L(e){return L="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},L(e)}function $(e){var t=function(e,t){if("object"!=L(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=L(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==L(t)?t:t+""}function q(e,t,n){return(t=$(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var G=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,W={"&amp;":"&","&#38;":"&","&lt;":"<","&#60;":"<","&gt;":">","&#62;":">","&apos;":"'","&#39;":"'","&quot;":'"',"&#34;":'"',"&nbsp;":" ","&#160;":" ","&copy;":"©","&#169;":"©","&reg;":"®","&#174;":"®","&hellip;":"…","&#8230;":"…","&#x2F;":"/","&#47;":"/"},B=function(e){return W[e]};var H={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:function(e){return e.replace(G,B)}};var z;function Y(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,$(r.key),r)}}var Z=(0,v.createContext)(),J=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&&Y(e.prototype,t),n&&Y(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 K(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 Q(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,u=!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){u=!0,o=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(u)throw o}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return K(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)?K(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 X(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 ee(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?X(Object(n),!0).forEach((function(t){q(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):X(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var te=function(e,t){var n=(0,v.useRef)();return(0,v.useEffect)((function(){n.current=t?n.current:e}),[e,t]),n.current};function ne(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.i18n,r=(0,v.useContext)(Z)||{},o=r.i18n,a=r.defaultNS,i=n||o||z;if(i&&!i.reportNamespaces&&(i.reportNamespaces=new J),!i){j("You will need to pass in an i18next instance by using initReactI18next");var s=function(e,t){return"string"==typeof t?t:t&&"object"===L(t)&&"string"==typeof t.defaultValue?t.defaultValue:Array.isArray(e)?e[e.length-1]:e},c=[s,{},!1];return c.t=s,c.i18n={},c.ready=!1,c}i.options.react&&void 0!==i.options.react.wait&&j("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");var u=ee(ee(ee({},H),i.options.react),t),l=u.useSuspense,p=u.keyPrefix,m=e||a||i.options&&i.options.defaultNS;m="string"==typeof m?[m]:m||["translation"],i.reportNamespaces.addUsedNamespaces&&i.reportNamespaces.addUsedNamespaces(m);var d=(i.isInitialized||i.initializedStoreOnce)&&m.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):(j("i18n.languages were undefined or empty",t.languages),!0)}(e,i,u)}));function f(){return i.getFixedT(t.lng||null,"fallback"===u.nsMode?m:m[0],p)}var y=Q((0,v.useState)(f),2),g=y[0],S=y[1],h=m.join();t.lng&&(h="".concat(t.lng).concat(h));var b=te(h),I=(0,v.useRef)(!0);(0,v.useEffect)((function(){var e=u.bindI18n,n=u.bindI18nStore;function r(){I.current&&S(f)}return I.current=!0,d||l||(t.lng?A(i,t.lng,m,(function(){I.current&&S(f)})):F(i,m,(function(){I.current&&S(f)}))),d&&b&&b!==h&&I.current&&S(f),e&&i&&i.on(e,r),n&&i&&i.store.on(n,r),function(){I.current=!1,e&&i&&e.split(" ").forEach((function(e){return i.off(e,r)})),n&&i&&n.split(" ").forEach((function(e){return i.store.off(e,r)}))}}),[i,h]);var D=(0,v.useRef)(!0);(0,v.useEffect)((function(){I.current&&!D.current&&S(f),D.current=!1}),[i,p]);var w=[g,i,d];if(w.t=g,w.i18n=i,w.ready=d,d)return w;if(!d&&!l)return w;throw new Promise((function(e){t.lng?A(i,t.lng,m,(function(){return e()})):F(i,m,(function(){return e()}))}))}const re=function({commandsManager:e,servicesManager:t,extensionManager:n}){const{segmentationService:r}=t.services,{t:o}=ne("dynamicExport"),[a,i]=(0,v.useState)((()=>r.getSegmentations())),s=[{label:"Export Time Data",onClick:()=>{e.runCommand("exportTimeReportCSV",{segmentations:a,options:{filename:"TimeData.csv"}})},disabled:!a?.length},{label:"Export ROI Stats",onClick:()=>{e.runCommand("exportTimeReportCSV",{segmentations:a,summaryStats:!0,options:{filename:"ROIStats.csv"}})},disabled:!a?.length}];return(0,v.useEffect)((()=>{const e=r.EVENTS.SEGMENTATION_ADDED,t=r.EVENTS.SEGMENTATION_UPDATED,n=r.EVENTS.SEGMENTATION_REMOVED,o=[];return[e,t,n].forEach((e=>{const{unsubscribe:t}=r.subscribe(e,(()=>{const e=r.getSegmentations();i(e)}));o.push(t)})),()=>{o.forEach((e=>{e()}))}}),[]),v.createElement("div",null,v.createElement("div",{className:"mt-3 flex justify-center px-2"},v.createElement(b.ActionButtons,{actions:s,t:o})))};const oe=function({commandsManager:e,extensionManager:t,servicesManager:n}){return[{name:"dynamic-volume",iconName:"tab-4d",iconLabel:"4D Workflow",label:"4D Workflow",component:({renderHeader:r,getCloseIcon:o,tab:a})=>v.createElement(M,{commandsManager:e,servicesManager:n,extensionManager:t,renderHeader:r,getCloseIcon:o,tab:a})},{name:"dynamic-toolbox",iconName:"tab-4d",iconLabel:"4D Workflow",label:"Dynamic Toolbox",component:({renderHeader:r,getCloseIcon:o,tab:a})=>{const[i]=(0,v.useContext)(N),s=i.useExperimentalUI?P.Toolbox:b.Toolbox;return v.createElement(v.Fragment,null,v.createElement(s,{commandsManager:e,servicesManager:n,extensionManager:t,buttonSectionId:"dynamic-toolbox",title:"Threshold Tools",renderHeader:r,getCloseIcon:o,tab:a}))}},{name:"dynamic-export",iconName:"tab-4d",iconLabel:"4D Workflow",label:"4D Workflow",component:()=>v.createElement(v.Fragment,null,v.createElement(re,{commandsManager:e,servicesManager:n,extensionManager:t}))}]},ae="2hot",ie="dynamic4D-pt",se="dynamic4D-fusion",ce="dynamic4D-ct";function ue({colormap:e,voiInverted:t}={}){return{blendMode:"MIP",colormap:e,voi:{windowWidth:5,windowCenter:2.5},voiInverted:t}}function le(){const e={colormap:{name:ae,opacity:[{value:0,opacity:0},{value:.1,opacity:1},{value:1,opacity:1}]},voiInverted:!1};return[{viewportOptions:{viewportId:"ptAxial",viewportType:"volume",orientation:"axial",toolGroupId:ie,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"axialSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...ue(e)}}]},{viewportOptions:{viewportId:"ptSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:ie,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"sagittalSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...ue(e)}}]},{viewportOptions:{viewportId:"ptCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:ie,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...ue(e)}}]}]}function pe(){const e={colormap:{name:ae,opacity:[{value:0,opacity:0},{value:.1,opacity:.3},{value:1,opacity:.3}]}};return[{viewportOptions:{viewportId:"fusionAxial",viewportType:"volume",orientation:"axial",toolGroupId:se,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"axialSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!1,target:!0},{type:"voi",id:"fusionWLSync",source:!0,target:!0},{type:"voi",id:"ptFusionWLSync",source:!1,target:!0,options:{syncInvertState:!1}}]},displaySets:[{id:"ctDisplaySet"},{options:{...ue(e)},id:"ptDisplaySet"}]},{viewportOptions:{viewportId:"fusionSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:se,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"sagittalSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!1,target:!0},{type:"voi",id:"fusionWLSync",source:!0,target:!0},{type:"voi",id:"ptFusionWLSync",source:!1,target:!0,options:{syncInvertState:!1}}]},displaySets:[{id:"ctDisplaySet"},{options:{...ue(e)},id:"ptDisplaySet"}]},{viewportOptions:{viewportId:"fusionCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:se,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!1,target:!0},{type:"voi",id:"fusionWLSync",source:!0,target:!0},{type:"voi",id:"ptFusionWLSync",source:!1,target:!0,options:{syncInvertState:!1}}]},displaySets:[{id:"ctDisplaySet"},{options:{...ue(e)},id:"ptDisplaySet"}]}]}const me={id:"default4D",locked:!0,hasUpdatedPriorsInformation:!1,name:"Default",createdDate:"2023-01-01T00:00:00.000Z",modifiedDate:"2023-01-01T00:00:00.000Z",availableTo:{},editableBy:{},imageLoadStrategy:"default",protocolMatchingRules:[{attribute:"ModalitiesInStudy",constraint:{contains:["CT","PT"]}}],numberOfPriorsReferenced:-1,displaySetSelectors:{defaultDisplaySetId:{imageMatchingRules:[],seriesMatchingRules:[{attribute:"numImageFrames",constraint:{greaterThan:{value:0}}}]},ctDisplaySet:{imageMatchingRules:[],seriesMatchingRules:[{attribute:"Modality",constraint:{equals:{value:"CT"}},required:!0},{attribute:"isReconstructable",constraint:{equals:{value:!0}},required:!0}]},ptDisplaySet:{imageMatchingRules:[],seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"PT"},required:!0},{attribute:"isReconstructable",constraint:{equals:{value:!0}},required:!0},{attribute:"SeriesDescription",constraint:{contains:"Corrected"}},{weight:2,attribute:"SeriesDescription",constraint:{doesNotContain:{value:"Uncorrected"}}}]},chartDisplaySet:{imageMatchingRules:[],seriesMatchingRules:[{attribute:"Modality",constraint:{equals:{value:"CHT"}},required:!0}]}},stages:[{id:"dataPreparation",name:"Data Preparation",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:3}},viewports:[...le()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"registration",name:"Registration",viewportStructure:{layoutType:"grid",properties:{rows:3,columns:3}},viewports:[...pe(),{viewportOptions:{viewportId:"ctAxial",viewportType:"volume",orientation:"axial",toolGroupId:ce,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"axialSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!0,target:!0}]},displaySets:[{id:"ctDisplaySet"}]},{viewportOptions:{viewportId:"ctSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:ce,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"sagittalSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!0,target:!0}]},displaySets:[{id:"ctDisplaySet"}]},{viewportOptions:{viewportId:"ctCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:ce,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!0,target:!0}]},displaySets:[{id:"ctDisplaySet"}]},...le()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"roiQuantification",name:"ROI Quantification",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:3}},viewports:[...pe()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"kineticAnalysis",name:"Kinetic Analysis",viewportStructure:{layoutType:"grid",properties:{rows:2,columns:3,layoutOptions:[{x:0,y:0,width:1/3,height:.5},{x:1/3,y:0,width:1/3,height:.5},{x:2/3,y:0,width:1/3,height:.5},{x:0,y:.5,width:1,height:.5}]}},viewports:[...pe(),{viewportOptions:{viewportId:"seriesChart"},displaySets:[{id:"chartDisplaySet",options:{skipLoading:!0}}]}],createdDate:"2023-01-01T00:00:00.000Z"}]};const de={id:t,preRegistration:({servicesManager:e,commandsManager:t,configuration:n={}})=>{r.cache.setMaxCacheSize(5368709120)},getPanelModule:oe,getHangingProtocolModule:function(){return[{name:me.id,protocol:me}]},getCommandsModule:({servicesManager:e,commandsManager:t,extensionManager:n})=>g({servicesManager:e,commandsManager:t,extensionManager:n})}})(),u})()));
2
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@cornerstonejs/core"),require("@cornerstonejs/tools"),require("@ohif/core"),require("@ohif/extension-cornerstone"),require("@ohif/ui"),require("@ohif/ui-next")):"function"==typeof define&&define.amd?define(["@cornerstonejs/core","@cornerstonejs/tools","@ohif/core","@ohif/extension-cornerstone","@ohif/ui","@ohif/ui-next"],t):"object"==typeof exports?exports["ohif-extension-cornerstone"]=t(require("@cornerstonejs/core"),require("@cornerstonejs/tools"),require("@ohif/core"),require("@ohif/extension-cornerstone"),require("@ohif/ui"),require("@ohif/ui-next")):e["ohif-extension-cornerstone"]=t(e["@cornerstonejs/core"],e["@cornerstonejs/tools"],e["@ohif/core"],e["@ohif/extension-cornerstone"],e["@ohif/ui"],e["@ohif/ui-next"])}(self,((e,t,n,o,a,r)=>(()=>{"use strict";var i={249:(e,t)=>{var n=Symbol.for("react.element"),o=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),r=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"),p=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),d=Symbol.iterator;var y={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},f=Object.assign,g={};function S(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||y}function v(){}function h(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||y}S.prototype.isReactComponent={},S.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")},S.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=S.prototype;var I=h.prototype=new v;I.constructor=h,f(I,S.prototype),I.isPureReactComponent=!0;var D=Array.isArray,b=Object.prototype.hasOwnProperty,w={current:null},C={key:!0,ref:!0,__self:!0,__source:!0};function x(e,t,o){var a,r={},i=null,s=null;if(null!=t)for(a in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)b.call(t,a)&&!C.hasOwnProperty(a)&&(r[a]=t[a]);var c=arguments.length-2;if(1===c)r.children=o;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];r.children=l}if(e&&e.defaultProps)for(a in c=e.defaultProps)void 0===r[a]&&(r[a]=c[a]);return{$$typeof:n,type:e,key:i,ref:s,props:r,_owner:w.current}}function E(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var T=/\/+/g;function M(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 O(e,t,a,r,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 o:c=!0}}if(c)return i=i(c=e),e=""===r?"."+M(c,0):r,D(i)?(a="",null!=e&&(a=e.replace(T,"$&/")+"/"),O(i,t,a,"",(function(e){return e}))):null!=i&&(E(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,a+(!i.key||c&&c.key===i.key?"":(""+i.key).replace(T,"$&/")+"/")+e)),t.push(i)),1;if(c=0,r=""===r?".":r+":",D(e))for(var l=0;l<e.length;l++){var u=r+M(s=e[l],l);c+=O(s,t,a,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=d&&e[d]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),l=0;!(s=e.next()).done;)c+=O(s=s.value,t,a,u=r+M(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 P(e,t,n){if(null==e)return e;var o=[],a=0;return O(e,o,"","",(function(e){return t.call(n,e,a++)})),o}function R(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},N={transition:null},_={ReactCurrentDispatcher:U,ReactCurrentBatchConfig:N,ReactCurrentOwner:w};function F(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:P,forEach:function(e,t,n){P(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return P(e,(function(){t++})),t},toArray:function(e){return P(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=S,t.Fragment=a,t.Profiler=i,t.PureComponent=h,t.StrictMode=r,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=_,t.act=F,t.cloneElement=function(e,t,o){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var a=f({},e.props),r=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=w.current),void 0!==t.key&&(r=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)b.call(t,l)&&!C.hasOwnProperty(l)&&(a[l]=void 0===t[l]&&void 0!==c?c[l]:t[l])}var l=arguments.length-2;if(1===l)a.children=o;else if(1<l){c=Array(l);for(var u=0;u<l;u++)c[u]=arguments[u+2];a.children=c}return{$$typeof:n,type:e.type,key:r,ref:i,props:a,_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=x,t.createFactory=function(e){var t=x.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:m,_payload:{_status:-1,_result:e},_init:R}},t.memo=function(e,t){return{$$typeof:p,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=N.transition;N.transition={};try{e()}finally{N.transition=t}},t.unstable_act=F,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)=>{e.exports=n(249)},557:t=>{t.exports=e},713:e=>{e.exports=t},2:e=>{e.exports=n},669:e=>{e.exports=o},307:e=>{e.exports=a},55:e=>{e.exports=r}},s={};function c(e){var t=s[e];if(void 0!==t)return t.exports;var n=s[e]={exports:{}};return i[e](n,n.exports,c),n.exports}c.d=(e,t)=>{for(var n in t)c.o(t,n)&&!c.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},c.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var l={};c.r(l),c.d(l,{default:()=>H});var u={};c.r(u),c.d(u,{updateSegmentationsChartDisplaySet:()=>b});const p=JSON.parse('{"UU":"@ohif/extension-cornerstone-dynamic-volume"}').UU;var m=c(2),d=c(557),y=c(713);const f="CHT",g=m.utils.guid(),S="1.9.451.13215.7.3.2.7.6.1",{utilities:v}=y;function h(e,t){const n=e.imageIds.reduce(((e,n)=>{const o=m.DicomMetadataStore.getInstanceByImageId(n)[t];return void 0!==o&&e.add(o),e}),new Set);return Array.from(n).sort(((e,t)=>e-t))}function I(e,t,{servicesManager:n}){const{displaySetService:o,segmentationService:a,viewportGridService:r}=n.services;let i;const s=o.getActiveDisplaySets().find((e=>{const t=e.instances?.[0];return!!t&&(void 0!==t.FrameReferenceTime||void 0!==t.NumberOfTimeSlices)})).displaySetInstanceUID;for(const[e]of d.cache._volumeCache)if(e.includes(s)){i=e;break}let c;i&&(c=d.cache.getVolume(i));const{StudyInstanceUID:l,StudyDescription:u}=m.DicomMetadataStore.getInstanceByImageId(c.imageIds[0]),p=a.getLabelmapVolume(e.segmentationId),y=p?.volumeId,[f,g]=v.dynamicVolume.getDataInTime(c,{maskVolumeId:y}),S=f.length;if(0===S)return[];const I=r.getActiveViewportId(),D=a.getSegmentColor(I,e.segmentationId,1),b=d.utilities.color.rgbToHex(D[0],D[1],D[2]);let w=t.get(c);w||(w=function(e){const t={FrameReferenceTime:{unit:"ms"}},n=Object.keys(t);let o,a;for(let r=0;r<n.length;r++){const i=n[r],s=h(e,i);if(s.length){o=s,a=t[i].unit;break}}if(!o.length){const e=n.join(", ");throw new Error(`Could not extract time points data for the following tags: ${e}`)}const r=function(e,t){const n=["ms","s","m","h"],o=[1e3,60,60],a=n.indexOf(t);let r=1;if(-1!==a){for(let i=a;i<n.length-1;i++){const a=r*o[i];if(e.filter((e=>e>a)).length<=e.length/2)break;r=a,t=n[i+1]}r>1&&(e=e.map((e=>e/r)))}return{timePoints:e,timePointsUnit:t}}(o,a);return o=r.timePoints,a=r.timePointsUnit,{timePoints:o,timePointsUnit:a}}(c),t.set(c,w));const{timePoints:C,timePointsUnit:x}=w;if(C.length!==f[0].length)throw new Error("Invalid number of time points returned");const E=C.length,T=new Array(E);for(let e=0;e<E;e++){const t=f.reduce(((t,n)=>t+n[e]/S),0);T[e]=[C[e],t]}return{StudyInstanceUID:l,StudyDescription:u,chartData:{series:{label:e.label,points:T,color:b},axis:{x:{label:`Time (${x})`},y:{label:"Vl (Bq/ml)"}}}}}function D(e,{servicesManager:t}){if(!e.length)return;const n=new WeakMap,o=e.map((e=>I(e,n,{servicesManager:t}))),{date:a,time:r}=function(){const e=new Date;return{date:e.getFullYear()+("0"+e.getUTCMonth()).slice(-2)+("0"+e.getUTCDate()).slice(-2),time:("0"+e.getUTCHours()).slice(-2)+("0"+e.getUTCMinutes()).slice(-2)+("0"+e.getUTCSeconds()).slice(-2)}}(),i=o.reduce(((e,t)=>[...e,t.chartData.series]),[]),s={SOPClassUID:S,Modality:f,SOPInstanceUID:m.utils.guid(),SeriesDate:a,SeriesTime:r,SeriesInstanceUID:g,StudyInstanceUID:o[0].StudyInstanceUID,StudyDescription:o[0].StudyDescription,SeriesNumber:100,SeriesDescription:"Segmentation chart series data",chartData:{series:i,axis:{...o[0].chartData.axis}}};return{seriesMetadata:{StudyInstanceUID:s.StudyInstanceUID,StudyDescription:s.StudyDescription,SeriesInstanceUID:s.SeriesInstanceUID,SeriesDescription:s.SeriesDescription,SeriesNumber:s.SeriesNumber,SeriesTime:s.SeriesTime,SOPClassUID:s.SOPClassUID,Modality:s.Modality},instance:s}}function b({servicesManager:e}){const{segmentationService:t}=e.services,n=t.getSegmentations(),{seriesMetadata:o,instance:a}=D(n,{servicesManager:e})??{};o&&a&&(m.DicomMetadataStore.addSeriesMetadata([o],!0),m.DicomMetadataStore.addInstances([a],!0))}y.Enums.SegmentationRepresentations.Labelmap;const w=({commandsManager:e,servicesManager:t})=>{const n=t.services,{displaySetService:o,viewportGridService:a,segmentationService:r}=n,i={...u,getDynamic4DDisplaySet:()=>o.getActiveDisplaySets().find((e=>{const t=e.instances?.[0];return!!t&&(void 0!==t.FrameReferenceTime||void 0!==t.NumberOfTimeSlices||void 0!==t.TemporalPositionIdentifier)})),getComputedDisplaySets:()=>[...o.getDisplaySetCache().values()].filter((e=>e.isDerived)),exportTimeReportCSV:({segmentations:e,config:t,options:n,summaryStats:o})=>{const a=i.getDynamic4DDisplaySet(),s=a?.displaySetInstanceUID;let c,l;for(const[e]of d.cache._volumeCache)if(e.includes(s)){c=e;break}c&&(l=d.cache.getVolume(c));const u=a.instances[0],p=[];function m(e){const t=e.length,n=e.reduce(((e,t)=>e+t),0)/t,o=e.map((e=>(e-n)**2)).reduce(((e,t)=>e+t),0)/t;return Math.sqrt(o)}p.push(`Patient ID,${u.PatientID},`),p.push(`Study Date,${u.StudyDate},`),p.push(`StudyInstanceUID,${u.StudyInstanceUID},`),p.push(`StudyDescription,${u.StudyDescription},`),p.push(`SeriesInstanceUID,${u.SeriesInstanceUID},`),p.push(""),p.push(""),e.forEach((e=>{const t=r.getLabelmapVolume(e.segmentationId),[n,a]=y.utilities.dynamicVolume.getDataInTime(l,{maskVolumeId:t.volumeId});if(o){let t="Operation,Segmentation Label ID";const o=l.numTimePoints;for(let e=0;e<o;e++)t+=`,Time Point ${e}`;p.push(t);const r=[],i=[],s=[],c=[],u=[],d=[],y=n.length;for(let e=0;e<o;e++){const t=[];let o=0,l=1/0,p=-1/0,f=0,g=0;for(let a=0;a<y;a++){const r=n[a][e];t.push(r),o+=r,r<l&&(l=r,f=a),r>p&&(p=r,g=a)}r.push(o/y),i.push(l),s.push(a[f]),c.push(p),u.push(a[g]),d.push(m(t))}let f=`Mean,${e.label}`;for(let e=0;e<o;e++)f+=`,${r[e]}`;p.push(f),f=`Standard Deviation,${e.label}`;for(let e=0;e<o;e++)f+=`,${d[e]}`;p.push(f),f=`Min,${e.label}`;for(let e=0;e<o;e++)f+=`,${i[e]}`;p.push(f),f=`Max,${e.label}`;for(let e=0;e<o;e++)f+=`,${c[e]}`;p.push(f)}else{let t="Pixel Identifier (IJK),Segmentation Label ID";const o=l.numTimePoints;for(let e=0;e<o;e++)t+=`,Time Point ${e}`;p.push(t);for(let t=0;t<n.length;t++){let o=`${`${a[t][0]}_${a[t][1]}_${a[t][2]}`},${e.label}`;for(let e=0;e<n[t].length;e++)o+=`,${n[t][e]}`;p.push(o)}}}));const f=p.join("\n"),g=`${u.PatientID}.csv`,S=new Blob([f],{type:"text/csv;charset=utf-8;"}),v=document.createElement("a"),h=URL.createObjectURL(S);v.setAttribute("href",h),v.setAttribute("download",g),v.style.visibility="hidden",document.body.appendChild(v),v.click(),document.body.removeChild(v)},swapDynamicWithComputedDisplaySet:({displaySet:e})=>{const t=e,n=o.getDisplaySetCache(),r=[n.keys()],{displaySetInstanceUID:s}=t;r.includes(s)||n.set(s,t);const{viewports:c}=a.getState(),l=i.getDynamic4DDisplaySet(),u=[];for(const[e,t]of c){const e=t,n=e.viewportOptions,{displaySetInstanceUIDs:o}=e,a=o.indexOf(l.displaySetInstanceUID);if(-1!==a){const t={viewportId:e.viewportId,displaySetInstanceUIDs:[...o.slice(0,a),s,...o.slice(a+1)],viewportOptions:{initialImageOptions:n.initialImageOptions,viewportType:"volume",orientation:n.orientation,background:n.background}};u.push(t)}}a.setDisplaySetsForViewports(u)},swapComputedWithDynamicDisplaySet:()=>{const e=i.getDynamic4DDisplaySet(),t=o.getDisplaySetCache(),n=[...t.keys()],{displaySetInstanceUID:r}=e;n.includes(r)||t.set(r,e);const{viewports:s}=a.getState(),c=i.getComputedDisplaySets()[0],l=[];for(const[e,t]of s){const e=t,n=e.viewportOptions,{displaySetInstanceUIDs:o}=e,a=o.indexOf(c.displaySetInstanceUID);if(-1!==a){const t={viewportId:e.viewportId,displaySetInstanceUIDs:[...o.slice(0,a),r,...o.slice(a+1)],viewportOptions:{initialImageOptions:n.initialImageOptions,viewportType:"volume",orientation:n.orientation,background:n.background}};l.push(t)}}a.setDisplaySetsForViewports(l)},createNewLabelMapForDynamicVolume:async({label:e})=>{const{viewports:t,activeViewportId:n}=a.getState(),s=i.getDynamic4DDisplaySet(),c=s.displaySetInstanceUID;let l;if(t.get(n).displaySetInstanceUIDs.includes(c)&&(l=s),!l){const e=o.getDisplaySetCache();for(const[t,n]of e)if(n.referenceDisplaySetUID===c){l=n;break}}if(!l)throw new Error("No reference display set found based on the dynamic data");const u=o.getDisplaySetByUID(l.displaySetInstanceUID),p=await r.createLabelmapForDisplaySet(u,{label:e}),m=t.values().next().value;return await r.addSegmentationRepresentation(m.viewportId,{segmentationId:p}),p}},s={updateSegmentationsChartDisplaySet:{commandFn:i.updateSegmentationsChartDisplaySet,storeContexts:[],options:{}},exportTimeReportCSV:{commandFn:i.exportTimeReportCSV,storeContexts:[],options:{}},swapDynamicWithComputedDisplaySet:{commandFn:i.swapDynamicWithComputedDisplaySet,storeContexts:[],options:{}},createNewLabelMapForDynamicVolume:{commandFn:i.createNewLabelMapForDynamicVolume,storeContexts:[],options:{}},swapComputedWithDynamicDisplaySet:{commandFn:i.swapComputedWithDynamicDisplaySet,storeContexts:[],options:{}}};return{actions:i,definitions:s,defaultContext:"DYNAMIC-VOLUME:CORNERSTONE"}};var C=c(326),x=c(307),E=c(55);function T(){return T=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)({}).hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},T.apply(null,arguments)}const M={sizeClassName:"w-[58px] h-[28px]",arrowsDirection:"horizontal",labelPosition:"bottom"},O=({title:e,tooltip:t})=>C.createElement("div",{className:"flex items-center space-x-1"},C.createElement(x.Tooltip,{content:C.createElement("div",{className:"text-white"},t),position:"bottom-left",tight:!0,tooltipBoxClassName:"max-w-xs p-2"},C.createElement(x.Icon,{name:"info-link",className:"text-primary-active h-[14px] w-[14px]"})),C.createElement("span",{className:"text-aqua-pale text-[11px] uppercase"},e)),P=({isPlaying:e,onPlayPauseChange:t,fps:n,onFpsChange:o,minFps:a,maxFps:r,currentFrameIndex:i,onFrameChange:s,framesLength:c,onGenerate:l,onDoubleRangeChange:u,onDynamicClick:p})=>{const[m,y]=(0,C.useState)(!1),[f,g]=(0,C.useState)(d.Enums.DynamicOperatorType.SUM),[S,v]=(0,C.useState)([0,c-1]);return C.createElement("div",{className:"flex select-none flex-col"},C.createElement(x.PanelSection,{title:"Controls",childrenClassName:"space-y-4 pb-5 px-5"},C.createElement("div",{className:"mt-2"},C.createElement(O,{title:"View",tooltip:"Select the view mode, 4D to view the dynamic volume or Computed to view the computed volume"}),C.createElement(x.ButtonGroup,{className:"mt-2 w-full"},C.createElement("button",{className:"w-1/2",onClick:()=>{y(!1),p?.()}},"4D"),C.createElement("button",{className:"w-1/2",onClick:()=>{y(!0)}},"Computed"))),C.createElement("div",null,C.createElement(R,{onPlayPauseChange:t,isPlaying:e,computedView:m,fps:n,onFpsChange:o,minFps:a,maxFps:r,framesLength:c,onFrameChange:s,currentFrameIndex:i})),C.createElement("div",{className:"mt-6 flex flex-col "+(m?"":"ohif-disabled")},C.createElement(O,{title:"Computed Operation",tooltip:C.createElement("div",null,"Operation Buttons (SUM, AVERAGE, SUBTRACT): Select the mathematical operation to be applied to the data set.",C.createElement("br",null)," Range Slider: Choose the numeric range within which the operation will be performed.",C.createElement("br",null),"Generate Button: Execute the chosen operation on the specified range of data."," ")}),C.createElement(x.ButtonGroup,{className:"mt-2 w-full",separated:!0},C.createElement("button",{className:"w-1/2",onClick:()=>g(d.Enums.DynamicOperatorType.SUM)},d.Enums.DynamicOperatorType.SUM.toString().toUpperCase()),C.createElement("button",{className:"w-1/2",onClick:()=>g(d.Enums.DynamicOperatorType.AVERAGE)},d.Enums.DynamicOperatorType.AVERAGE.toString().toUpperCase()),C.createElement("button",{className:"w-1/2",onClick:()=>g(d.Enums.DynamicOperatorType.SUBTRACT)},d.Enums.DynamicOperatorType.SUBTRACT.toString().toUpperCase())),C.createElement("div",{className:"mt-2 w-full"},C.createElement(E.DoubleSlider,{min:0,max:c-1,step:1,defaultValue:S,onValueChange:e=>{u(e),v(e)},formatLabel:e=>Math.round(e),className:"w-full"})),C.createElement(x.Button,{className:"mt-2 !h-[26px] !w-[115px] self-start !p-0",onClick:()=>{l(f)}},"Generate"))))};function R({isPlaying:e,onPlayPauseChange:t,fps:n,minFps:o,maxFps:a,onFpsChange:r,framesLength:i,onFrameChange:s,currentFrameIndex:c,computedView:l}){return C.createElement("div",{className:l&&"ohif-disabled"},C.createElement(O,{title:"4D Controls",tooltip:C.createElement("div",null,"Play/Pause Button: Begin or pause the animation of the 4D visualization. ",C.createElement("br",null)," Frame Selector: Navigate through individual frames of the 4D data. ",C.createElement("br",null)," FPS (Frames Per Second) Selector: Adjust the playback speed of the animation.")}),C.createElement("div",{className:"mt-3 flex justify-between"},C.createElement(x.IconButton,{className:"bg-customblue-30 h-[26px] w-[58px] rounded-[4px]",onClick:()=>t(!e)},C.createElement(x.Icon,{name:e?"icon-pause":"icon-play",className:"active:text-primary-light hover:bg-customblue-300 h-[24px] w-[24px] cursor-pointer text-white"})),C.createElement(x.InputNumber,T({value:c,onChange:s,minValue:0,maxValue:i-1,label:"Frame"},M)),C.createElement(x.InputNumber,T({value:n,onChange:r,minValue:o,maxValue:a},M,{label:"FPS"}))))}const U="@ohif/extension-default.sopClassHandlerModule.stack";function N({servicesManager:e,commandsManager:t}){const{cornerstoneViewportService:n,viewportGridService:o,displaySetService:a}=e.services,[{isCineEnabled:r},i]=(0,x.useCine)(),[{activeViewportId:s}]=(0,x.useViewportGrid)(),[c,l]=(0,C.useState)([0,0]),[u,p]=(0,C.useState)([0,0]),[m,f]=(0,C.useState)(null),[g,S]=(0,C.useState)(null),[v,h]=(0,C.useState)(20),[I,D]=(0,C.useState)(r),[b,w]=(0,C.useState)(null),[E,T]=(0,C.useState)(!1),M=(0,C.useRef)(d.utilities.uuidv4()),O=(0,C.useRef)(null),R=`cornerstoneStreamingImageVolume:${M.current}`;function N(e){t.runCommand("swapDynamicWithComputedDisplaySet",{displaySet:e}),T(!0)}(0,C.useEffect)((()=>{const t=n.EVENTS.VIEWPORT_DATA_CHANGED,o=e.services.cineService.EVENTS.CINE_STATE_CHANGED,{unsubscribe:a}=n.subscribe(t,(e=>{e.viewportData.data.forEach((e=>{if(e.volume?.isDynamicVolume()){S(e.volume),O.current=e.displaySetInstanceUID;const t=[1,e.volume.numTimePoints];l(t),p(t)}}))})),{unsubscribe:r}=e.services.cineService.subscribe(o,(e=>{D(e.isPlaying)}));return()=>{a(),r()}}),[n,i,e.services.cineService]),(0,C.useEffect)((()=>{const e=d.Enums.Events.DYNAMIC_VOLUME_TIME_POINT_INDEX_CHANGED,t=e=>{w(e.detail.timePointIndex)};return d.eventTarget.addEventListener(e,t),()=>{d.eventTarget.removeEventListener(e,t)}}),[n]),(0,C.useEffect)((()=>{const e=o.getDisplaySetsUIDsForViewport(s);if(!e?.length)return;const t=e.map(a.getDisplaySetByUID).find((e=>e.isDynamicVolume));if(!t)return;const n=d.cache.getVolumes().find((e=>e.volumeId.includes(t.displaySetInstanceUID)));if(!n)return;S(n),O.current=t.displaySetInstanceUID;const r=[1,n.numTimePoints];l(r),p(r)}),[s,o,a,n,i]);const _=()=>{D(!0);const e=n.getViewportInfo(s);if(!e)return;const{element:t}=e;i.playClip(t,{framesPerSecond:v,viewportId:s})},F=()=>{D(!1);const{element:e}=n.getViewportInfo(s);i.stopClip(e)};return g&&0!==c.length?C.createElement(P,{fps:v,isPlaying:I,onPlayPauseChange:e=>{e?_():F()},minFps:1,maxFps:50,currentFrameIndex:b,onFpsChange:e=>{h(e),F(),_()},framesLength:c[1],onFrameChange:e=>{g.timePointIndex=e},onGenerate:async function(e){const o=g.volumeId;if(!o)return;let a=d.cache.getVolume(R);a||(a=await d.volumeLoader.createAndCacheDerivedVolume(o,{volumeId:R}));const[r,i]=u,s=Array.from({length:i-r+1},((e,t)=>t+r-1)),c={frameNumbers:"SUBTRACT"===e?[r,i-1]:s,targetVolume:a};if(y.utilities.dynamicVolume.updateVolumeFromTimeData(g,e,c),m)t.runCommand("updateVolumeData",{volume:a}),n.getRenderingEngine().render(),N(m);else{const e={volumeLoaderSchema:a.volumeId.split(":")[0],displaySetInstanceUID:M.current,SOPClassHandlerId:U,Modality:g.metadata.Modality,isMultiFrame:!1,numImageFrames:1,uid:M.current,referenceDisplaySetUID:g.volumeId.split(":")[1],madeInClient:!0,FrameOfReferenceUID:g.metadata.FrameOfReferenceUID,isDerived:!0,imageIds:a.imageIds};f(e),N(e)}},onDynamicClick:E?()=>{t.runCommand("swapComputedWithDynamicDisplaySet")}:null,onDoubleRangeChange:function(e){e[0]===u[0]&&e[1]===u[1]||p(e)},initialRangeValues:u}):null}const _=function({servicesManager:e,commandsManager:t,tab:n}){return C.createElement(C.Fragment,null,C.createElement("div",{className:"flex flex-col text-white","data-cy":"dynamic-volume-panel"},C.createElement(N,{commandsManager:t,servicesManager:e})))};var F=c(669);const V=function({commandsManager:e,servicesManager:t}){const n=(0,F.useSegmentations)({servicesManager:t});return n?.length?C.createElement("div",{className:"flex gap-2"},C.createElement("div",{className:"flex h-8 w-full items-center rounded pr-0.5"},C.createElement(E.Button,{size:"sm",variant:"ghost",className:"pl-1.5",onClick:()=>{e.runCommand("exportTimeReportCSV",{segmentations:n,options:{filename:"TimeData.csv"}})}},C.createElement(E.Icons.Export,null),C.createElement("span",{className:"pl-1"},"Time Data"))),C.createElement("div",{className:"flex h-8 w-full items-center rounded pr-0.5"},C.createElement(E.Button,{size:"sm",variant:"ghost",className:"pl-1.5",onClick:()=>{e.runCommand("exportTimeReportCSV",{segmentations:n,summaryStats:!0,options:{filename:"ROIStats.csv"}})}},C.createElement(E.Icons.Export,null),C.createElement("span",{className:"pl-1"},"ROI Stats")))):null};const k=function({commandsManager:e,extensionManager:t,servicesManager:n,configuration:o}){return[{name:"dynamic-volume",iconName:"tab-4d",iconLabel:"4D Workflow",label:"4D Workflow",component:()=>C.createElement(_,{commandsManager:e,servicesManager:n,extensionManager:t})},{name:"dynamic-segmentation",iconName:"tab-segmentation",iconLabel:"Segmentation",label:"Segmentation",component:()=>C.createElement(C.Fragment,null,C.createElement(E.Toolbox,{commandsManager:e,servicesManager:n,extensionManager:t,buttonSectionId:"dynamic-toolbox",title:"Threshold Tools"}),C.createElement(F.PanelSegmentation,{servicesManager:n,commandsManager:e,extensionManager:t,configuration:o},C.createElement(V,{servicesManager:n,commandsManager:e})))}]},$="2hot",L="dynamic4D-pt",j="dynamic4D-fusion",A="dynamic4D-ct";function G({colormap:e,voiInverted:t}={}){return{blendMode:"MIP",colormap:e,voi:{windowWidth:5,windowCenter:2.5},voiInverted:t}}function q(){const e={colormap:{name:$,opacity:[{value:0,opacity:0},{value:.1,opacity:1},{value:1,opacity:1}]},voiInverted:!1};return[{viewportOptions:{viewportId:"ptAxial",viewportType:"volume",orientation:"axial",toolGroupId:L,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"axialSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...G(e)}}]},{viewportOptions:{viewportId:"ptSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:L,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"sagittalSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...G(e)}}]},{viewportOptions:{viewportId:"ptCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:L,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...G(e)}}]}]}function W(){const e={colormap:{name:$,opacity:[{value:0,opacity:0},{value:.1,opacity:.8},{value:1,opacity:.8}]}};return[{viewportOptions:{viewportId:"fusionAxial",viewportType:"volume",orientation:"axial",toolGroupId:j,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"axialSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!1,target:!0},{type:"voi",id:"fusionWLSync",source:!0,target:!0},{type:"voi",id:"ptFusionWLSync",source:!1,target:!0,options:{syncInvertState:!1}},{type:"hydrateseg",id:"sameFORId",source:!0,target:!0,options:{matchingRules:["sameFOR"]}}]},displaySets:[{id:"ctDisplaySet"},{options:{...G(e)},id:"ptDisplaySet"}]},{viewportOptions:{viewportId:"fusionSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:j,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"sagittalSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!1,target:!0},{type:"voi",id:"fusionWLSync",source:!0,target:!0},{type:"voi",id:"ptFusionWLSync",source:!1,target:!0,options:{syncInvertState:!1}},{type:"hydrateseg",id:"sameFORId",source:!0,target:!0,options:{matchingRules:["sameFOR"]}}]},displaySets:[{id:"ctDisplaySet"},{options:{...G(e)},id:"ptDisplaySet"}]},{viewportOptions:{viewportId:"fusionCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:j,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!1,target:!0},{type:"voi",id:"fusionWLSync",source:!0,target:!0},{type:"voi",id:"ptFusionWLSync",source:!1,target:!0,options:{syncInvertState:!1}},{type:"hydrateseg",id:"sameFORId",source:!0,target:!0,options:{matchingRules:["sameFOR"]}}]},displaySets:[{id:"ctDisplaySet"},{options:{...G(e)},id:"ptDisplaySet"}]}]}const B={id:"default4D",locked:!0,hasUpdatedPriorsInformation:!1,name:"Default",createdDate:"2023-01-01T00:00:00.000Z",modifiedDate:"2023-01-01T00:00:00.000Z",availableTo:{},editableBy:{},imageLoadStrategy:"default",protocolMatchingRules:[{attribute:"ModalitiesInStudy",constraint:{contains:["CT","PT"]}}],numberOfPriorsReferenced:-1,displaySetSelectors:{defaultDisplaySetId:{imageMatchingRules:[],seriesMatchingRules:[{attribute:"numImageFrames",constraint:{greaterThan:{value:0}}}]},ctDisplaySet:{imageMatchingRules:[],seriesMatchingRules:[{attribute:"Modality",constraint:{equals:{value:"CT"}},required:!0},{attribute:"isReconstructable",constraint:{equals:{value:!0}},required:!0}]},ptDisplaySet:{imageMatchingRules:[],seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"PT"},required:!0},{attribute:"isReconstructable",constraint:{equals:{value:!0}},required:!0},{attribute:"SeriesDescription",constraint:{contains:"Corrected"}},{weight:2,attribute:"SeriesDescription",constraint:{doesNotContain:{value:"Uncorrected"}}}]},chartDisplaySet:{imageMatchingRules:[],seriesMatchingRules:[{attribute:"Modality",constraint:{equals:{value:"CHT"}},required:!0}]}},stages:[{id:"dataPreparation",name:"Data Preparation",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:3}},viewports:[...q()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"registration",name:"Registration",viewportStructure:{layoutType:"grid",properties:{rows:3,columns:3}},viewports:[...W(),{viewportOptions:{viewportId:"ctAxial",viewportType:"volume",orientation:"axial",toolGroupId:A,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"axialSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!0,target:!0}]},displaySets:[{id:"ctDisplaySet"}]},{viewportOptions:{viewportId:"ctSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:A,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"sagittalSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!0,target:!0}]},displaySets:[{id:"ctDisplaySet"}]},{viewportOptions:{viewportId:"ctCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:A,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!0,target:!0}]},displaySets:[{id:"ctDisplaySet"}]},...q()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"roiQuantification",name:"ROI Quantification",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:3}},viewports:[...W()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"kineticAnalysis",name:"Kinetic Analysis",viewportStructure:{layoutType:"grid",properties:{rows:2,columns:3,layoutOptions:[{x:0,y:0,width:1/3,height:.5},{x:1/3,y:0,width:1/3,height:.5},{x:2/3,y:0,width:1/3,height:.5},{x:0,y:.5,width:1,height:.5}]}},viewports:[...W(),{viewportOptions:{viewportId:"seriesChart"},displaySets:[{id:"chartDisplaySet",options:{skipLoading:!0}}]}],createdDate:"2023-01-01T00:00:00.000Z"}]};const H={id:p,preRegistration:({servicesManager:e,commandsManager:t,configuration:n={}})=>{d.cache.setMaxCacheSize(5368709120)},getPanelModule:k,getHangingProtocolModule:function(){return[{name:B.id,protocol:B}]},getCommandsModule:({servicesManager:e,commandsManager:t,extensionManager:n})=>w({servicesManager:e,commandsManager:t,extensionManager:n})};return l})()));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ohif/extension-cornerstone-dynamic-volume",
3
- "version": "3.9.0-beta.99",
3
+ "version": "3.9.1",
4
4
  "description": "OHIF extension for 4D volumes data",
5
5
  "author": "OHIF",
6
6
  "license": "MIT",
@@ -29,11 +29,11 @@
29
29
  "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
30
30
  },
31
31
  "peerDependencies": {
32
- "@ohif/core": "3.9.0-beta.99",
33
- "@ohif/extension-cornerstone": "3.9.0-beta.99",
34
- "@ohif/extension-default": "3.9.0-beta.99",
35
- "@ohif/i18n": "3.9.0-beta.99",
36
- "@ohif/ui": "3.9.0-beta.99",
32
+ "@ohif/core": "3.9.1",
33
+ "@ohif/extension-cornerstone": "3.9.1",
34
+ "@ohif/extension-default": "3.9.1",
35
+ "@ohif/i18n": "3.9.1",
36
+ "@ohif/ui": "3.9.1",
37
37
  "dcmjs": "*",
38
38
  "dicom-parser": "^1.8.21",
39
39
  "hammerjs": "^2.0.8",
@@ -42,9 +42,8 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@babel/runtime": "^7.20.13",
45
- "@cornerstonejs/core": "^1.86.0",
46
- "@cornerstonejs/streaming-image-volume-loader": "^1.82.4",
47
- "@cornerstonejs/tools": "^1.86.0",
45
+ "@cornerstonejs/core": "^2.2.4",
46
+ "@cornerstonejs/tools": "^2.2.4",
48
47
  "classnames": "^2.3.2"
49
48
  }
50
49
  }