@ohif/extension-cornerstone-dynamic-volume 3.11.0-beta.99 → 3.11.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/tools"),require("@ohif/core"),require("@ohif/extension-cornerstone"),require("@ohif/extension-default"),require("@ohif/ui-next")):"function"==typeof define&&define.amd?define(["@cornerstonejs/core","@cornerstonejs/tools","@ohif/core","@ohif/extension-cornerstone","@ohif/extension-default","@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/extension-default"),require("@ohif/ui-next")):e["ohif-extension-cornerstone"]=t(e["@cornerstonejs/core"],e["@cornerstonejs/tools"],e["@ohif/core"],e["@ohif/extension-cornerstone"],e["@ohif/extension-default"],e["@ohif/ui-next"])}(globalThis,(e,t,n,o,r,i)=>(()=>{"use strict";var a={2:e=>{e.exports=n},55:e=>{e.exports=i},249:(e,t)=>{var n=Symbol.for("react.element"),o=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),i=Symbol.for("react.strict_mode"),a=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 D=h.prototype=new v;D.constructor=h,f(D,S.prototype),D.isPureReactComponent=!0;var I=Array.isArray,b=Object.prototype.hasOwnProperty,w={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function C(e,t,o){var r,i={},a=null,s=null;if(null!=t)for(r in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(a=""+t.key),t)b.call(t,r)&&!E.hasOwnProperty(r)&&(i[r]=t[r]);var c=arguments.length-2;if(1===c)i.children=o;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];i.children=l}if(e&&e.defaultProps)for(r in c=e.defaultProps)void 0===i[r]&&(i[r]=c[r]);return{$$typeof:n,type:e,key:a,ref:s,props:i,_owner:w.current}}function x(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,r,i,a){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 a=a(c=e),e=""===i?"."+M(c,0):i,I(a)?(r="",null!=e&&(r=e.replace(T,"$&/")+"/"),O(a,t,r,"",function(e){return e})):null!=a&&(x(a)&&(a=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(a,r+(!a.key||c&&c.key===a.key?"":(""+a.key).replace(T,"$&/")+"/")+e)),t.push(a)),1;if(c=0,i=""===i?".":i+":",I(e))for(var l=0;l<e.length;l++){var u=i+M(s=e[l],l);c+=O(s,t,r,u,a)}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,r,u=i+M(s,l++),a);else if("object"===s)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return c}function N(e,t,n){if(null==e)return e;var o=[],r=0;return O(e,o,"","",function(e){return t.call(n,e,r++)}),o}function P(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},U={transition:null},_={ReactCurrentDispatcher:R,ReactCurrentBatchConfig:U,ReactCurrentOwner:w};function V(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:N,forEach:function(e,t,n){N(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return N(e,function(){t++}),t},toArray:function(e){return N(e,function(e){return e})||[]},only:function(e){if(!x(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=S,t.Fragment=r,t.Profiler=a,t.PureComponent=h,t.StrictMode=i,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=_,t.act=V,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 r=f({},e.props),i=e.key,a=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(a=t.ref,s=w.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)b.call(t,l)&&!E.hasOwnProperty(l)&&(r[l]=void 0===t[l]&&void 0!==c?c[l]:t[l])}var l=arguments.length-2;if(1===l)r.children=o;else if(1<l){c=Array(l);for(var u=0;u<l;u++)c[u]=arguments[u+2];r.children=c}return{$$typeof:n,type:e.type,key:i,ref:a,props:r,_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=C,t.createFactory=function(e){var t=C.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=x,t.lazy=function(e){return{$$typeof:m,_payload:{_status:-1,_result:e},_init:P}},t.memo=function(e,t){return{$$typeof:p,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=U.transition;U.transition={};try{e()}finally{U.transition=t}},t.unstable_act=V,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"},326:(e,t,n)=>{e.exports=n(249)},438:e=>{e.exports=r},557:t=>{t.exports=e},669:e=>{e.exports=o},713:e=>{e.exports=t}},s={};function c(e){var t=s[e];if(void 0!==t)return t.exports;var n=s[e]={exports:{}};return a[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:()=>W});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 D(e,t,{servicesManager:n}){const{displaySetService:o,segmentationService:r,viewportGridService:i}=n.services;let a;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)){a=e;break}let c;a&&(c=d.cache.getVolume(a));const{StudyInstanceUID:l,StudyDescription:u}=m.DicomMetadataStore.getInstanceByImageId(c.imageIds[0]),p=r.getLabelmapVolume(e.segmentationId),y=p?.volumeId,[f,g]=v.dynamicVolume.getDataInTime(c,{maskVolumeId:y}),S=f.length;if(0===S)return[];const D=i.getActiveViewportId(),I=r.getSegmentColor(D,e.segmentationId,1),b=d.utilities.color.rgbToHex(I[0],I[1],I[2]);let w=t.get(c);w||(w=function(e){const t={FrameReferenceTime:{unit:"ms"}},n=Object.keys(t);let o,r;for(let i=0;i<n.length;i++){const a=n[i],s=h(e,a);if(s.length){o=s,r=t[a].unit;break}}if(!o.length){const e=n.join(", ");throw new Error(`Could not extract time points data for the following tags: ${e}`)}const i=function(e,t){const n=["ms","s","m","h"],o=[1e3,60,60],r=n.indexOf(t);let i=1;if(-1!==r){for(let a=r;a<n.length-1;a++){const r=i*o[a];if(e.filter(e=>e>r).length<=e.length/2)break;i=r,t=n[a+1]}i>1&&(e=e.map(e=>e/i))}return{timePoints:e,timePointsUnit:t}}(o,r);return o=i.timePoints,r=i.timePointsUnit,{timePoints:o,timePointsUnit:r}}(c),t.set(c,w));const{timePoints:E,timePointsUnit:C}=w;if(E.length!==f[0].length)throw new Error("Invalid number of time points returned");const x=E.length,T=new Array(x);for(let e=0;e<x;e++){const t=f.reduce((t,n)=>t+n[e]/S,0);T[e]=[E[e],t]}return{StudyInstanceUID:l,StudyDescription:u,chartData:{series:{label:e.label,points:T,color:b},axis:{x:{label:`Time (${C})`},y:{label:"Vl (Bq/ml)"}}}}}function I(e,{servicesManager:t}){if(!e.length)return;const n=new WeakMap,o=e.map(e=>D(e,n,{servicesManager:t})),{date:r,time:i}=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)}}(),a=o.reduce((e,t)=>[...e,t.chartData.series],[]),s={SOPClassUID:S,Modality:f,SOPInstanceUID:m.utils.guid(),SeriesDate:r,SeriesTime:i,SeriesInstanceUID:g,StudyInstanceUID:o[0].StudyInstanceUID,StudyDescription:o[0].StudyDescription,SeriesNumber:100,SeriesDescription:"Segmentation chart series data",chartData:{series:a,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:r}=I(n,{servicesManager:e})??{};o&&r&&(m.DicomMetadataStore.addSeriesMetadata([o],!0),m.DicomMetadataStore.addInstances([r],!0))}y.Enums.SegmentationRepresentations.Labelmap;const w=({commandsManager:e,servicesManager:t})=>{const n=t.services,{displaySetService:o,viewportGridService:r,segmentationService:i}=n,a={...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 r=a.getDynamic4DDisplaySet(),s=r?.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=r.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=i.getLabelmapVolume(e.segmentationId),[n,r]=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 i=[],a=[],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 r=0;r<y;r++){const i=n[r][e];t.push(i),o+=i,i<l&&(l=i,f=r),i>p&&(p=i,g=r)}i.push(o/y),a.push(l),s.push(r[f]),c.push(p),u.push(r[g]),d.push(m(t))}let f=`Mean,${e.label}`;for(let e=0;e<o;e++)f+=`,${i[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+=`,${a[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=`${`${r[t][0]}_${r[t][1]}_${r[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:t})=>{const n=t,i=o.getDisplaySetCache(),s=[i.keys()],{displaySetInstanceUID:c}=n;s.includes(c)||i.set(c,n);const{viewports:l}=r.getState(),u=a.getDynamic4DDisplaySet(),p=[];for(const[e,t]of l){const e=t,n=e.viewportOptions,{displaySetInstanceUIDs:o}=e,r=o.indexOf(u.displaySetInstanceUID);if(-1!==r){const t={viewportId:e.viewportId,displaySetInstanceUIDs:[...o.slice(0,r),c,...o.slice(r+1)],viewportOptions:{initialImageOptions:n.initialImageOptions,viewportType:"volume",orientation:n.orientation,background:n.background}};p.push(t)}}e.run("setDisplaySetsForViewports",{viewportsToUpdate:p})},swapComputedWithDynamicDisplaySet:()=>{const t=a.getDynamic4DDisplaySet(),n=o.getDisplaySetCache(),i=[...n.keys()],{displaySetInstanceUID:s}=t;i.includes(s)||n.set(s,t);const{viewports:c}=r.getState(),l=a.getComputedDisplaySets()[0],u=[];for(const[e,t]of c){const e=t,n=e.viewportOptions,{displaySetInstanceUIDs:o}=e,r=o.indexOf(l.displaySetInstanceUID);if(-1!==r){const t={viewportId:e.viewportId,displaySetInstanceUIDs:[...o.slice(0,r),s,...o.slice(r+1)],viewportOptions:{initialImageOptions:n.initialImageOptions,viewportType:"volume",orientation:n.orientation,background:n.background}};u.push(t)}}e.run("setDisplaySetsForViewports",{viewportsToUpdate:u})},createNewLabelMapForDynamicVolume:async({label:e})=>{const{viewports:t,activeViewportId:n}=r.getState(),s=a.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 i.createLabelmapForDisplaySet(u,{label:e}),m=t.values().next().value;return await i.addSegmentationRepresentation(m.viewportId,{segmentationId:p}),p}},s={updateSegmentationsChartDisplaySet:{commandFn:a.updateSegmentationsChartDisplaySet,storeContexts:[],options:{}},exportTimeReportCSV:{commandFn:a.exportTimeReportCSV,storeContexts:[],options:{}},swapDynamicWithComputedDisplaySet:{commandFn:a.swapDynamicWithComputedDisplaySet,storeContexts:[],options:{}},createNewLabelMapForDynamicVolume:{commandFn:a.createNewLabelMapForDynamicVolume,storeContexts:[],options:{}},swapComputedWithDynamicDisplaySet:{commandFn:a.swapComputedWithDynamicDisplaySet,storeContexts:[],options:{}}};return{actions:a,definitions:s,defaultContext:"DYNAMIC-VOLUME:CORNERSTONE"}};var E=c(326),C=c(55);const x=e=>null==e?"":String(e).toUpperCase(),T=({title:e,tooltip:t})=>E.createElement("div",{className:"flex items-center space-x-1"},E.createElement(C.Tooltip,null,E.createElement(C.TooltipTrigger,{asChild:!0},E.createElement("span",null,E.createElement(C.Icons.ByName,{name:"info-link",className:"text-primary h-3 w-3"}))),E.createElement(C.TooltipContent,{sideOffset:4,className:"max-w-xs"},E.createElement("div",null,t))),E.createElement("span",{className:"text-muted-foreground text-xs uppercase tracking-wide"},e)),M=({isPlaying:e,onPlayPauseChange:t,fps:n,onFpsChange:o,minFps:r,maxFps:i,currentDimensionGroupNumber:a,onDimensionGroupChange:s,numDimensionGroups:c,onGenerate:l,onDoubleRangeChange:u,rangeValues:p,onDynamicClick:m})=>{const[y,f]=(0,E.useState)(!1),[g,S]=(0,E.useState)(d.Enums.DynamicOperatorType.SUM);return E.createElement("div",{className:"flex select-none flex-col"},E.createElement(C.PanelSection,{defaultOpen:!0},E.createElement(C.PanelSection.Header,null,"Controls"),E.createElement(C.PanelSection.Content,{className:"bg-muted space-y-4 px-5 pt-2 pb-4"},E.createElement("div",{className:"mb-4"},E.createElement(T,{title:"View",tooltip:"Select the view mode, 4D to view the dynamic volume or Computed to view the computed volume"}),E.createElement(C.Tabs,{value:y?"computed":"4d",onValueChange:e=>{const t="computed"===e;f(t),t||"function"!=typeof m||m()},className:"my-2 w-full"},E.createElement(C.TabsList,{className:"w-full"},E.createElement(C.TabsTrigger,{value:"4d",className:"w-1/2"},"4D"),E.createElement(C.TabsTrigger,{value:"computed",className:"w-1/2"},"Computed")))),E.createElement("div",null,E.createElement(O,{onPlayPauseChange:t,isPlaying:e,computedView:y,fps:n,onFpsChange:o,minFps:r,maxFps:i,numDimensionGroups:c,onDimensionGroupChange:s,currentDimensionGroupNumber:a})),E.createElement("div",{className:"mt-3 flex flex-col "+(y?"":"ohif-disabled")},E.createElement(T,{title:"Computed Operation",tooltip:E.createElement("div",null,"Operation Buttons (SUM, AVERAGE, SUBTRACT): Select the mathematical operation to be applied to the data set.",E.createElement("br",null)," Range Slider: Choose the numeric range of dimension groups within which the operation will be performed.",E.createElement("br",null),"Generate Button: Execute the chosen operation on the specified range of data.")}),E.createElement(C.Tabs,{value:String(g),onValueChange:e=>{S(e)},className:"mt-2 w-full"},E.createElement(C.TabsList,{className:"w-full gap-1"}," ",E.createElement(C.TabsTrigger,{value:String(d.Enums.DynamicOperatorType.SUM),className:"w-1/3"},x(d.Enums.DynamicOperatorType.SUM)),E.createElement(C.TabsTrigger,{value:String(d.Enums.DynamicOperatorType.AVERAGE),className:"w-1/3"},x(d.Enums.DynamicOperatorType.AVERAGE)),E.createElement(C.TabsTrigger,{value:String(d.Enums.DynamicOperatorType.SUBTRACT),className:"w-1/3"},x(d.Enums.DynamicOperatorType.SUBTRACT)))),E.createElement("div",{className:"mt-2 w-full"},E.createElement(C.Numeric.Container,{mode:"doubleRange",min:1,max:c||1,values:p||[1,c||1],onChange:u||(()=>{})},E.createElement(C.Numeric.DoubleRange,{showNumberInputs:!0}))),E.createElement(C.Button,{variant:"default",size:"sm",className:"mt-2 h-[26px] w-[115px] self-start p-0",onClick:()=>{try{"function"==typeof l?l(g):console.error("onGenerate is not a function",l)}catch(e){console.error("Error in onGenerate:",e)}}},"Generate")))))};function O({isPlaying:e,onPlayPauseChange:t,fps:n,minFps:o,maxFps:r,onFpsChange:i,numDimensionGroups:a,onDimensionGroupChange:s,currentDimensionGroupNumber:c,computedView:l}){return E.createElement("div",{className:l?"ohif-disabled":""},E.createElement(T,{title:"4D Controls",tooltip:E.createElement("div",null,"Play/Pause Button: Begin or pause the animation of the 4D visualization. ",E.createElement("br",null),"Dimension Group Selector: Navigate through individual dimension groups of the 4D data."," ",E.createElement("br",null),"FPS (Frames Per Second) Selector: Adjust the playback speed of the animation.")}),E.createElement("div",{className:"mt-3 flex justify-between"},E.createElement(C.Button,{id:"play-pause-button",variant:"secondary",size:"default",className:"w-[58px]",onClick:()=>{"function"==typeof t&&t(!e)}},E.createElement(C.Icons.ByName,{name:e?"icon-pause":"icon-play",className:"text-foreground h-[24px] w-[24px]"})),E.createElement(C.Numeric.Container,{mode:"stepper",value:c||1,onChange:s||(()=>{}),min:1,max:a||1,step:1},E.createElement("div",{className:"flex flex-col items-center"},E.createElement(C.Numeric.NumberStepper,{className:"h-[28px] w-[58px]",direction:"horizontal"}),E.createElement(C.Numeric.Label,{className:"text-muted-foreground mt-1 text-sm"},"Frame"))),E.createElement(C.Numeric.Container,{mode:"stepper",value:n||1,onChange:i||(()=>{}),min:o||1,max:r||30,step:1},E.createElement("div",{className:"flex flex-col items-center"},E.createElement(C.Numeric.NumberStepper,{className:"h-[28px] w-[58px]",direction:"horizontal"}),E.createElement(C.Numeric.Label,{className:"text-muted-foreground mt-1 text-sm"},"FPS")))))}function N({servicesManager:e,commandsManager:t}){const{cornerstoneViewportService:n,viewportGridService:o,displaySetService:r}=e.services,[{isCineEnabled:i},a]=(0,C.useCine)(),[{activeViewportId:s}]=(0,C.useViewportGrid)(),[c,l]=(0,E.useState)([1,1]),[u,p]=(0,E.useState)(null),[m,f]=(0,E.useState)(null),[g,S]=(0,E.useState)(20),[v,h]=(0,E.useState)(i),[D,I]=(0,E.useState)(null),[b,w]=(0,E.useState)(!1),x=(0,E.useRef)(d.utilities.uuidv4()),T=(0,E.useRef)(null),O=`cornerstoneStreamingImageVolume:${x.current}`;function N(e){t.runCommand("swapDynamicWithComputedDisplaySet",{displaySet:e}),w(!0)}(0,E.useEffect)(()=>{const t=n.EVENTS.VIEWPORT_DATA_CHANGED,o=e.services.cineService.EVENTS.CINE_STATE_CHANGED,{unsubscribe:r}=n.subscribe(t,e=>{e.viewportData.data.forEach(e=>{if(e.volume?.isDynamicVolume()){f(e.volume),T.current=e.displaySetInstanceUID;const t=[1,e.volume.numDimensionGroups];l(t)}})}),{unsubscribe:i}=e.services.cineService.subscribe(o,e=>{h(e.isPlaying)});return()=>{r(),i()}},[n,a,e.services.cineService]),(0,E.useEffect)(()=>{const e=d.Enums.Events.DYNAMIC_VOLUME_DIMENSION_GROUP_CHANGED,t=e=>{I(e.detail.dimensionGroupNumber)};return d.eventTarget.addEventListener(e,t),()=>{d.eventTarget.removeEventListener(e,t)}},[]),(0,E.useEffect)(()=>{const e=o.getDisplaySetsUIDsForViewport(s);if(!e?.length)return;const t=e.map(r.getDisplaySetByUID).find(e=>e.isDynamicVolume);if(!t)return;const n=d.cache.getVolumes().find(e=>e.volumeId.includes(t.displaySetInstanceUID));n&&(f(n),T.current=t.displaySetInstanceUID,l([1,n.numDimensionGroups]))},[s,o,r,n,a]);const P=()=>{h(!0);const e=n.getViewportInfo(s);if(!e)return;const{element:t}=e;a.playClip(t,{framesPerSecond:g,viewportId:s})},R=()=>{h(!1);const{element:e}=n.getViewportInfo(s);a.stopClip(e)};return E.createElement(M,{fps:g,isPlaying:v,onPlayPauseChange:e=>{e?P():R()},minFps:1,maxFps:50,onFpsChange:e=>{S(e),R(),P()},currentDimensionGroupNumber:D,numDimensionGroups:m?.numDimensionGroups||1,onDimensionGroupChange:e=>{m.dimensionGroupNumber=e},onGenerate:async function(e){const o=m.volumeId;if(!o)return;let r=d.cache.getVolume(O);r||(r=await d.volumeLoader.createAndCacheDerivedVolume(o,{volumeId:O}));const[i,a]=c,s=Array.from({length:a-i+1},(e,t)=>i+t),l={dimensionGroupNumbers:"SUBTRACT"===e?[i,a]:s,targetVolume:r};if(y.utilities.dynamicVolume.updateVolumeFromTimeData(m,e,l),u)t.runCommand("updateVolumeData",{volume:r}),n.getRenderingEngine().render(),N(u);else{const e={volumeLoaderSchema:r.volumeId.split(":")[0],displaySetInstanceUID:x.current,SOPClassHandlerId:"@ohif/extension-default.sopClassHandlerModule.stack",Modality:m.metadata.Modality,isMultiFrame:!1,numImageFrames:1,uid:x.current,referenceDisplaySetUID:m.volumeId.split(":")[1],madeInClient:!0,FrameOfReferenceUID:m.metadata.FrameOfReferenceUID,isDerived:!0,imageIds:r.imageIds};p(e),N(e)}},onDynamicClick:b?()=>{t.runCommand("swapComputedWithDynamicDisplaySet")}:null,onDoubleRangeChange:l,rangeValues:c})}const P=function({servicesManager:e,commandsManager:t,tab:n}){return E.createElement(E.Fragment,null,E.createElement("div",{className:"flex flex-col text-white","data-cy":"dynamic-volume-panel"},E.createElement(N,{commandsManager:t,servicesManager:e})))};var R=c(438),U=c(669);const _=function({commandsManager:e,servicesManager:t}){const n=(0,U.useSegmentations)({servicesManager:t});return n?.length?E.createElement("div",{className:"flex gap-2"},E.createElement("div",{className:"flex h-8 w-full items-center rounded pr-0.5"},E.createElement(C.Button,{size:"sm",variant:"ghost",className:"pl-1.5",onClick:()=>{e.runCommand("exportTimeReportCSV",{segmentations:n,options:{filename:"TimeData.csv"}})}},E.createElement(C.Icons.Export,null),E.createElement("span",{className:"pl-1"},"Time Data"))),E.createElement("div",{className:"flex h-8 w-full items-center rounded pr-0.5"},E.createElement(C.Button,{size:"sm",variant:"ghost",className:"pl-1.5",onClick:()=>{e.runCommand("exportTimeReportCSV",{segmentations:n,summaryStats:!0,options:{filename:"ROIStats.csv"}})}},E.createElement(C.Icons.Export,null),E.createElement("span",{className:"pl-1"},"ROI Stats")))):null};const V=function({commandsManager:e,extensionManager:t,servicesManager:n,configuration:o}){const{toolbarService:r}=n.services;return[{name:"dynamic-volume",iconName:"tab-4d",iconLabel:"4D Workflow",label:"4D Workflow",component:()=>E.createElement(P,{commandsManager:e,servicesManager:n,extensionManager:t})},{name:"dynamic-segmentation",iconName:"tab-segmentation",iconLabel:"Segmentation",label:"Segmentation",component:()=>E.createElement(E.Fragment,null,E.createElement(R.Toolbox,{buttonSectionId:r.sections.dynamicToolbox,title:"Threshold Tools"}),E.createElement(U.PanelSegmentation,{servicesManager:n,commandsManager:e,extensionManager:t,configuration:o},E.createElement(_,{servicesManager:n,commandsManager:e})))}]},F="2hot",G="dynamic4D-pt",k="dynamic4D-fusion",$="dynamic4D-ct";function L({colormap:e,voiInverted:t}={}){return{blendMode:"MIP",colormap:e,voi:{windowWidth:5,windowCenter:2.5},voiInverted:t}}function A(){const e={colormap:{name:F,opacity:[{value:0,opacity:0},{value:.1,opacity:1},{value:1,opacity:1}]},voiInverted:!1};return[{viewportOptions:{viewportId:"ptAxial",viewportType:"volume",orientation:"axial",toolGroupId:G,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"axialSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...L(e)}}]},{viewportOptions:{viewportId:"ptSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:G,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"sagittalSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...L(e)}}]},{viewportOptions:{viewportId:"ptCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:G,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...L(e)}}]}]}function j(){const e={colormap:{name:F,opacity:[{value:0,opacity:0},{value:.1,opacity:.8},{value:1,opacity:.8}]}};return[{viewportOptions:{viewportId:"fusionAxial",viewportType:"volume",orientation:"axial",toolGroupId:k,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:{...L(e)},id:"ptDisplaySet"}]},{viewportOptions:{viewportId:"fusionSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:k,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:{...L(e)},id:"ptDisplaySet"}]},{viewportOptions:{viewportId:"fusionCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:k,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:{...L(e)},id:"ptDisplaySet"}]}]}const q={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:[...A()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"registration",name:"Registration",viewportStructure:{layoutType:"grid",properties:{rows:3,columns:3}},viewports:[...j(),{viewportOptions:{viewportId:"ctAxial",viewportType:"volume",orientation:"axial",toolGroupId:$,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:$,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:$,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!0,target:!0}]},displaySets:[{id:"ctDisplaySet"}]},...A()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"roiQuantification",name:"ROI Quantification",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:3}},viewports:[...j()],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:[...j(),{viewportOptions:{viewportId:"seriesChart"},displaySets:[{id:"chartDisplaySet",options:{skipLoading:!0}}]}],createdDate:"2023-01-01T00:00:00.000Z"}]};const W={id:p,preRegistration:({servicesManager:e,commandsManager:t,configuration:n={}})=>{d.cache.setMaxCacheSize(5368709120)},getPanelModule:V,getHangingProtocolModule:function(){return[{name:q.id,protocol:q}]},getCommandsModule:({servicesManager:e,commandsManager:t,extensionManager:n})=>w({servicesManager:e,commandsManager:t,extensionManager:n})};return l})());
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/extension-default"),require("@ohif/ui-next")):"function"==typeof define&&define.amd?define(["@cornerstonejs/core","@cornerstonejs/tools","@ohif/core","@ohif/extension-cornerstone","@ohif/extension-default","@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/extension-default"),require("@ohif/ui-next")):e["ohif-extension-cornerstone"]=t(e["@cornerstonejs/core"],e["@cornerstonejs/tools"],e["@ohif/core"],e["@ohif/extension-cornerstone"],e["@ohif/extension-default"],e["@ohif/ui-next"])}(globalThis,(e,t,n,o,r,i)=>(()=>{"use strict";var a={249:(e,t)=>{var n=Symbol.for("react.element"),o=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),i=Symbol.for("react.strict_mode"),a=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 D=h.prototype=new v;D.constructor=h,f(D,S.prototype),D.isPureReactComponent=!0;var I=Array.isArray,b=Object.prototype.hasOwnProperty,w={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function C(e,t,o){var r,i={},a=null,s=null;if(null!=t)for(r in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(a=""+t.key),t)b.call(t,r)&&!E.hasOwnProperty(r)&&(i[r]=t[r]);var c=arguments.length-2;if(1===c)i.children=o;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];i.children=l}if(e&&e.defaultProps)for(r in c=e.defaultProps)void 0===i[r]&&(i[r]=c[r]);return{$$typeof:n,type:e,key:a,ref:s,props:i,_owner:w.current}}function x(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,r,i,a){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 a=a(c=e),e=""===i?"."+M(c,0):i,I(a)?(r="",null!=e&&(r=e.replace(T,"$&/")+"/"),O(a,t,r,"",function(e){return e})):null!=a&&(x(a)&&(a=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(a,r+(!a.key||c&&c.key===a.key?"":(""+a.key).replace(T,"$&/")+"/")+e)),t.push(a)),1;if(c=0,i=""===i?".":i+":",I(e))for(var l=0;l<e.length;l++){var u=i+M(s=e[l],l);c+=O(s,t,r,u,a)}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,r,u=i+M(s,l++),a);else if("object"===s)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return c}function N(e,t,n){if(null==e)return e;var o=[],r=0;return O(e,o,"","",function(e){return t.call(n,e,r++)}),o}function P(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},U={transition:null},_={ReactCurrentDispatcher:R,ReactCurrentBatchConfig:U,ReactCurrentOwner:w};function V(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:N,forEach:function(e,t,n){N(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return N(e,function(){t++}),t},toArray:function(e){return N(e,function(e){return e})||[]},only:function(e){if(!x(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=S,t.Fragment=r,t.Profiler=a,t.PureComponent=h,t.StrictMode=i,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=_,t.act=V,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 r=f({},e.props),i=e.key,a=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(a=t.ref,s=w.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)b.call(t,l)&&!E.hasOwnProperty(l)&&(r[l]=void 0===t[l]&&void 0!==c?c[l]:t[l])}var l=arguments.length-2;if(1===l)r.children=o;else if(1<l){c=Array(l);for(var u=0;u<l;u++)c[u]=arguments[u+2];r.children=c}return{$$typeof:n,type:e.type,key:i,ref:a,props:r,_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=C,t.createFactory=function(e){var t=C.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=x,t.lazy=function(e){return{$$typeof:m,_payload:{_status:-1,_result:e},_init:P}},t.memo=function(e,t){return{$$typeof:p,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=U.transition;U.transition={};try{e()}finally{U.transition=t}},t.unstable_act=V,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"},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},438:e=>{e.exports=r},55:e=>{e.exports=i}},s={};function c(e){var t=s[e];if(void 0!==t)return t.exports;var n=s[e]={exports:{}};return a[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:()=>W});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 D(e,t,{servicesManager:n}){const{displaySetService:o,segmentationService:r,viewportGridService:i}=n.services;let a;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)){a=e;break}let c;a&&(c=d.cache.getVolume(a));const{StudyInstanceUID:l,StudyDescription:u}=m.DicomMetadataStore.getInstanceByImageId(c.imageIds[0]),p=r.getLabelmapVolume(e.segmentationId),y=p?.volumeId,[f,g]=v.dynamicVolume.getDataInTime(c,{maskVolumeId:y}),S=f.length;if(0===S)return[];const D=i.getActiveViewportId(),I=r.getSegmentColor(D,e.segmentationId,1),b=d.utilities.color.rgbToHex(I[0],I[1],I[2]);let w=t.get(c);w||(w=function(e){const t={FrameReferenceTime:{unit:"ms"}},n=Object.keys(t);let o,r;for(let i=0;i<n.length;i++){const a=n[i],s=h(e,a);if(s.length){o=s,r=t[a].unit;break}}if(!o.length){const e=n.join(", ");throw new Error(`Could not extract time points data for the following tags: ${e}`)}const i=function(e,t){const n=["ms","s","m","h"],o=[1e3,60,60],r=n.indexOf(t);let i=1;if(-1!==r){for(let a=r;a<n.length-1;a++){const r=i*o[a];if(e.filter(e=>e>r).length<=e.length/2)break;i=r,t=n[a+1]}i>1&&(e=e.map(e=>e/i))}return{timePoints:e,timePointsUnit:t}}(o,r);return o=i.timePoints,r=i.timePointsUnit,{timePoints:o,timePointsUnit:r}}(c),t.set(c,w));const{timePoints:E,timePointsUnit:C}=w;if(E.length!==f[0].length)throw new Error("Invalid number of time points returned");const x=E.length,T=new Array(x);for(let e=0;e<x;e++){const t=f.reduce((t,n)=>t+n[e]/S,0);T[e]=[E[e],t]}return{StudyInstanceUID:l,StudyDescription:u,chartData:{series:{label:e.label,points:T,color:b},axis:{x:{label:`Time (${C})`},y:{label:"Vl (Bq/ml)"}}}}}function I(e,{servicesManager:t}){if(!e.length)return;const n=new WeakMap,o=e.map(e=>D(e,n,{servicesManager:t})),{date:r,time:i}=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)}}(),a=o.reduce((e,t)=>[...e,t.chartData.series],[]),s={SOPClassUID:S,Modality:f,SOPInstanceUID:m.utils.guid(),SeriesDate:r,SeriesTime:i,SeriesInstanceUID:g,StudyInstanceUID:o[0].StudyInstanceUID,StudyDescription:o[0].StudyDescription,SeriesNumber:100,SeriesDescription:"Segmentation chart series data",chartData:{series:a,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:r}=I(n,{servicesManager:e})??{};o&&r&&(m.DicomMetadataStore.addSeriesMetadata([o],!0),m.DicomMetadataStore.addInstances([r],!0))}y.Enums.SegmentationRepresentations.Labelmap;const w=({commandsManager:e,servicesManager:t})=>{const n=t.services,{displaySetService:o,viewportGridService:r,segmentationService:i}=n,a={...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 r=a.getDynamic4DDisplaySet(),s=r?.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=r.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=i.getLabelmapVolume(e.segmentationId),[n,r]=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 i=[],a=[],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 r=0;r<y;r++){const i=n[r][e];t.push(i),o+=i,i<l&&(l=i,f=r),i>p&&(p=i,g=r)}i.push(o/y),a.push(l),s.push(r[f]),c.push(p),u.push(r[g]),d.push(m(t))}let f=`Mean,${e.label}`;for(let e=0;e<o;e++)f+=`,${i[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+=`,${a[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=`${`${r[t][0]}_${r[t][1]}_${r[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:t})=>{const n=t,i=o.getDisplaySetCache(),s=[i.keys()],{displaySetInstanceUID:c}=n;s.includes(c)||i.set(c,n);const{viewports:l}=r.getState(),u=a.getDynamic4DDisplaySet(),p=[];for(const[e,t]of l){const e=t,n=e.viewportOptions,{displaySetInstanceUIDs:o}=e,r=o.indexOf(u.displaySetInstanceUID);if(-1!==r){const t={viewportId:e.viewportId,displaySetInstanceUIDs:[...o.slice(0,r),c,...o.slice(r+1)],viewportOptions:{initialImageOptions:n.initialImageOptions,viewportType:"volume",orientation:n.orientation,background:n.background}};p.push(t)}}e.run("setDisplaySetsForViewports",{viewportsToUpdate:p})},swapComputedWithDynamicDisplaySet:()=>{const t=a.getDynamic4DDisplaySet(),n=o.getDisplaySetCache(),i=[...n.keys()],{displaySetInstanceUID:s}=t;i.includes(s)||n.set(s,t);const{viewports:c}=r.getState(),l=a.getComputedDisplaySets()[0],u=[];for(const[e,t]of c){const e=t,n=e.viewportOptions,{displaySetInstanceUIDs:o}=e,r=o.indexOf(l.displaySetInstanceUID);if(-1!==r){const t={viewportId:e.viewportId,displaySetInstanceUIDs:[...o.slice(0,r),s,...o.slice(r+1)],viewportOptions:{initialImageOptions:n.initialImageOptions,viewportType:"volume",orientation:n.orientation,background:n.background}};u.push(t)}}e.run("setDisplaySetsForViewports",{viewportsToUpdate:u})},createNewLabelMapForDynamicVolume:async({label:e})=>{const{viewports:t,activeViewportId:n}=r.getState(),s=a.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 i.createLabelmapForDisplaySet(u,{label:e}),m=t.values().next().value;return await i.addSegmentationRepresentation(m.viewportId,{segmentationId:p}),p}},s={updateSegmentationsChartDisplaySet:{commandFn:a.updateSegmentationsChartDisplaySet,storeContexts:[],options:{}},exportTimeReportCSV:{commandFn:a.exportTimeReportCSV,storeContexts:[],options:{}},swapDynamicWithComputedDisplaySet:{commandFn:a.swapDynamicWithComputedDisplaySet,storeContexts:[],options:{}},createNewLabelMapForDynamicVolume:{commandFn:a.createNewLabelMapForDynamicVolume,storeContexts:[],options:{}},swapComputedWithDynamicDisplaySet:{commandFn:a.swapComputedWithDynamicDisplaySet,storeContexts:[],options:{}}};return{actions:a,definitions:s,defaultContext:"DYNAMIC-VOLUME:CORNERSTONE"}};var E=c(326),C=c(55);const x=e=>null==e?"":String(e).toUpperCase(),T=({title:e,tooltip:t})=>E.createElement("div",{className:"flex items-center space-x-1"},E.createElement(C.Tooltip,null,E.createElement(C.TooltipTrigger,{asChild:!0},E.createElement("span",null,E.createElement(C.Icons.ByName,{name:"info-link",className:"text-primary h-3 w-3"}))),E.createElement(C.TooltipContent,{sideOffset:4,className:"max-w-xs"},E.createElement("div",null,t))),E.createElement("span",{className:"text-muted-foreground text-xs uppercase tracking-wide"},e)),M=({isPlaying:e,onPlayPauseChange:t,fps:n,onFpsChange:o,minFps:r,maxFps:i,currentDimensionGroupNumber:a,onDimensionGroupChange:s,numDimensionGroups:c,onGenerate:l,onDoubleRangeChange:u,rangeValues:p,onDynamicClick:m})=>{const[y,f]=(0,E.useState)(!1),[g,S]=(0,E.useState)(d.Enums.DynamicOperatorType.SUM);return E.createElement("div",{className:"flex select-none flex-col"},E.createElement(C.PanelSection,{defaultOpen:!0},E.createElement(C.PanelSection.Header,null,"Controls"),E.createElement(C.PanelSection.Content,{className:"bg-muted space-y-4 px-5 pt-2 pb-4"},E.createElement("div",{className:"mb-4"},E.createElement(T,{title:"View",tooltip:"Select the view mode, 4D to view the dynamic volume or Computed to view the computed volume"}),E.createElement(C.Tabs,{value:y?"computed":"4d",onValueChange:e=>{const t="computed"===e;f(t),t||"function"!=typeof m||m()},className:"my-2 w-full"},E.createElement(C.TabsList,{className:"w-full"},E.createElement(C.TabsTrigger,{value:"4d",className:"w-1/2"},"4D"),E.createElement(C.TabsTrigger,{value:"computed",className:"w-1/2"},"Computed")))),E.createElement("div",null,E.createElement(O,{onPlayPauseChange:t,isPlaying:e,computedView:y,fps:n,onFpsChange:o,minFps:r,maxFps:i,numDimensionGroups:c,onDimensionGroupChange:s,currentDimensionGroupNumber:a})),E.createElement("div",{className:"mt-3 flex flex-col "+(y?"":"ohif-disabled")},E.createElement(T,{title:"Computed Operation",tooltip:E.createElement("div",null,"Operation Buttons (SUM, AVERAGE, SUBTRACT): Select the mathematical operation to be applied to the data set.",E.createElement("br",null)," Range Slider: Choose the numeric range of dimension groups within which the operation will be performed.",E.createElement("br",null),"Generate Button: Execute the chosen operation on the specified range of data.")}),E.createElement(C.Tabs,{value:String(g),onValueChange:e=>{S(e)},className:"mt-2 w-full"},E.createElement(C.TabsList,{className:"w-full gap-1"}," ",E.createElement(C.TabsTrigger,{value:String(d.Enums.DynamicOperatorType.SUM),className:"w-1/3"},x(d.Enums.DynamicOperatorType.SUM)),E.createElement(C.TabsTrigger,{value:String(d.Enums.DynamicOperatorType.AVERAGE),className:"w-1/3"},x(d.Enums.DynamicOperatorType.AVERAGE)),E.createElement(C.TabsTrigger,{value:String(d.Enums.DynamicOperatorType.SUBTRACT),className:"w-1/3"},x(d.Enums.DynamicOperatorType.SUBTRACT)))),E.createElement("div",{className:"mt-2 w-full"},E.createElement(C.Numeric.Container,{mode:"doubleRange",min:1,max:c||1,values:p||[1,c||1],onChange:u||(()=>{})},E.createElement(C.Numeric.DoubleRange,{showNumberInputs:!0}))),E.createElement(C.Button,{variant:"default",size:"sm",className:"mt-2 h-[26px] w-[115px] self-start p-0",onClick:()=>{try{"function"==typeof l?l(g):console.error("onGenerate is not a function",l)}catch(e){console.error("Error in onGenerate:",e)}}},"Generate")))))};function O({isPlaying:e,onPlayPauseChange:t,fps:n,minFps:o,maxFps:r,onFpsChange:i,numDimensionGroups:a,onDimensionGroupChange:s,currentDimensionGroupNumber:c,computedView:l}){return E.createElement("div",{className:l?"ohif-disabled":""},E.createElement(T,{title:"4D Controls",tooltip:E.createElement("div",null,"Play/Pause Button: Begin or pause the animation of the 4D visualization. ",E.createElement("br",null),"Dimension Group Selector: Navigate through individual dimension groups of the 4D data."," ",E.createElement("br",null),"FPS (Frames Per Second) Selector: Adjust the playback speed of the animation.")}),E.createElement("div",{className:"mt-3 flex justify-between"},E.createElement(C.Button,{id:"play-pause-button",variant:"secondary",size:"default",className:"w-[58px]",onClick:()=>{"function"==typeof t&&t(!e)}},E.createElement(C.Icons.ByName,{name:e?"icon-pause":"icon-play",className:"text-foreground h-[24px] w-[24px]"})),E.createElement(C.Numeric.Container,{mode:"stepper",value:c||1,onChange:s||(()=>{}),min:1,max:a||1,step:1},E.createElement("div",{className:"flex flex-col items-center"},E.createElement(C.Numeric.NumberStepper,{className:"h-[28px] w-[58px]",direction:"horizontal"}),E.createElement(C.Numeric.Label,{className:"text-muted-foreground mt-1 text-sm"},"Frame"))),E.createElement(C.Numeric.Container,{mode:"stepper",value:n||1,onChange:i||(()=>{}),min:o||1,max:r||30,step:1},E.createElement("div",{className:"flex flex-col items-center"},E.createElement(C.Numeric.NumberStepper,{className:"h-[28px] w-[58px]",direction:"horizontal"}),E.createElement(C.Numeric.Label,{className:"text-muted-foreground mt-1 text-sm"},"FPS")))))}function N({servicesManager:e,commandsManager:t}){const{cornerstoneViewportService:n,viewportGridService:o,displaySetService:r}=e.services,[{isCineEnabled:i},a]=(0,C.useCine)(),[{activeViewportId:s}]=(0,C.useViewportGrid)(),[c,l]=(0,E.useState)([1,1]),[u,p]=(0,E.useState)(null),[m,f]=(0,E.useState)(null),[g,S]=(0,E.useState)(20),[v,h]=(0,E.useState)(i),[D,I]=(0,E.useState)(null),[b,w]=(0,E.useState)(!1),x=(0,E.useRef)(d.utilities.uuidv4()),T=(0,E.useRef)(null),O=`cornerstoneStreamingImageVolume:${x.current}`;function N(e){t.runCommand("swapDynamicWithComputedDisplaySet",{displaySet:e}),w(!0)}(0,E.useEffect)(()=>{const t=n.EVENTS.VIEWPORT_DATA_CHANGED,o=e.services.cineService.EVENTS.CINE_STATE_CHANGED,{unsubscribe:r}=n.subscribe(t,e=>{e.viewportData.data.forEach(e=>{if(e.volume?.isDynamicVolume()){f(e.volume),T.current=e.displaySetInstanceUID;const t=[1,e.volume.numDimensionGroups];l(t)}})}),{unsubscribe:i}=e.services.cineService.subscribe(o,e=>{h(e.isPlaying)});return()=>{r(),i()}},[n,a,e.services.cineService]),(0,E.useEffect)(()=>{const e=d.Enums.Events.DYNAMIC_VOLUME_DIMENSION_GROUP_CHANGED,t=e=>{I(e.detail.dimensionGroupNumber)};return d.eventTarget.addEventListener(e,t),()=>{d.eventTarget.removeEventListener(e,t)}},[]),(0,E.useEffect)(()=>{const e=o.getDisplaySetsUIDsForViewport(s);if(!e?.length)return;const t=e.map(r.getDisplaySetByUID).find(e=>e.isDynamicVolume);if(!t)return;const n=d.cache.getVolumes().find(e=>e.volumeId.includes(t.displaySetInstanceUID));n&&(f(n),T.current=t.displaySetInstanceUID,l([1,n.numDimensionGroups]))},[s,o,r,n,a]);const P=()=>{h(!0);const e=n.getViewportInfo(s);if(!e)return;const{element:t}=e;a.playClip(t,{framesPerSecond:g,viewportId:s})},R=()=>{h(!1);const{element:e}=n.getViewportInfo(s);a.stopClip(e)};return E.createElement(M,{fps:g,isPlaying:v,onPlayPauseChange:e=>{e?P():R()},minFps:1,maxFps:50,onFpsChange:e=>{S(e),R(),P()},currentDimensionGroupNumber:D,numDimensionGroups:m?.numDimensionGroups||1,onDimensionGroupChange:e=>{m.dimensionGroupNumber=e},onGenerate:async function(e){const o=m.volumeId;if(!o)return;let r=d.cache.getVolume(O);r||(r=await d.volumeLoader.createAndCacheDerivedVolume(o,{volumeId:O}));const[i,a]=c,s=Array.from({length:a-i+1},(e,t)=>i+t),l={dimensionGroupNumbers:"SUBTRACT"===e?[i,a]:s,targetVolume:r};if(y.utilities.dynamicVolume.updateVolumeFromTimeData(m,e,l),u)t.runCommand("updateVolumeData",{volume:r}),n.getRenderingEngine().render(),N(u);else{const e={volumeLoaderSchema:r.volumeId.split(":")[0],displaySetInstanceUID:x.current,SOPClassHandlerId:"@ohif/extension-default.sopClassHandlerModule.stack",Modality:m.metadata.Modality,isMultiFrame:!1,numImageFrames:1,uid:x.current,referenceDisplaySetUID:m.volumeId.split(":")[1],madeInClient:!0,FrameOfReferenceUID:m.metadata.FrameOfReferenceUID,isDerived:!0,imageIds:r.imageIds};p(e),N(e)}},onDynamicClick:b?()=>{t.runCommand("swapComputedWithDynamicDisplaySet")}:null,onDoubleRangeChange:l,rangeValues:c})}const P=function({servicesManager:e,commandsManager:t,tab:n}){return E.createElement(E.Fragment,null,E.createElement("div",{className:"flex flex-col text-white","data-cy":"dynamic-volume-panel"},E.createElement(N,{commandsManager:t,servicesManager:e})))};var R=c(438),U=c(669);const _=function({commandsManager:e,servicesManager:t}){const n=(0,U.useSegmentations)({servicesManager:t});return n?.length?E.createElement("div",{className:"flex gap-2"},E.createElement("div",{className:"flex h-8 w-full items-center rounded pr-0.5"},E.createElement(C.Button,{size:"sm",variant:"ghost",className:"pl-1.5",onClick:()=>{e.runCommand("exportTimeReportCSV",{segmentations:n,options:{filename:"TimeData.csv"}})}},E.createElement(C.Icons.Export,null),E.createElement("span",{className:"pl-1"},"Time Data"))),E.createElement("div",{className:"flex h-8 w-full items-center rounded pr-0.5"},E.createElement(C.Button,{size:"sm",variant:"ghost",className:"pl-1.5",onClick:()=>{e.runCommand("exportTimeReportCSV",{segmentations:n,summaryStats:!0,options:{filename:"ROIStats.csv"}})}},E.createElement(C.Icons.Export,null),E.createElement("span",{className:"pl-1"},"ROI Stats")))):null};const V=function({commandsManager:e,extensionManager:t,servicesManager:n,configuration:o}){const{toolbarService:r}=n.services;return[{name:"dynamic-volume",iconName:"tab-4d",iconLabel:"4D Workflow",label:"4D Workflow",component:()=>E.createElement(P,{commandsManager:e,servicesManager:n,extensionManager:t})},{name:"dynamic-segmentation",iconName:"tab-segmentation",iconLabel:"Segmentation",label:"Segmentation",component:()=>E.createElement(E.Fragment,null,E.createElement(R.Toolbox,{buttonSectionId:r.sections.dynamicToolbox,title:"Threshold Tools"}),E.createElement(U.PanelSegmentation,{servicesManager:n,commandsManager:e,extensionManager:t,configuration:o},E.createElement(_,{servicesManager:n,commandsManager:e})))}]},F="2hot",G="dynamic4D-pt",k="dynamic4D-fusion",$="dynamic4D-ct";function L({colormap:e,voiInverted:t}={}){return{blendMode:"MIP",colormap:e,voi:{windowWidth:5,windowCenter:2.5},voiInverted:t}}function A(){const e={colormap:{name:F,opacity:[{value:0,opacity:0},{value:.1,opacity:1},{value:1,opacity:1}]},voiInverted:!1};return[{viewportOptions:{viewportId:"ptAxial",viewportType:"volume",orientation:"axial",toolGroupId:G,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"axialSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...L(e)}}]},{viewportOptions:{viewportId:"ptSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:G,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"sagittalSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...L(e)}}]},{viewportOptions:{viewportId:"ptCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:G,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...L(e)}}]}]}function j(){const e={colormap:{name:F,opacity:[{value:0,opacity:0},{value:.1,opacity:.8},{value:1,opacity:.8}]}};return[{viewportOptions:{viewportId:"fusionAxial",viewportType:"volume",orientation:"axial",toolGroupId:k,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:{...L(e)},id:"ptDisplaySet"}]},{viewportOptions:{viewportId:"fusionSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:k,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:{...L(e)},id:"ptDisplaySet"}]},{viewportOptions:{viewportId:"fusionCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:k,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:{...L(e)},id:"ptDisplaySet"}]}]}const q={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:[...A()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"registration",name:"Registration",viewportStructure:{layoutType:"grid",properties:{rows:3,columns:3}},viewports:[...j(),{viewportOptions:{viewportId:"ctAxial",viewportType:"volume",orientation:"axial",toolGroupId:$,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:$,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:$,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!0,target:!0}]},displaySets:[{id:"ctDisplaySet"}]},...A()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"roiQuantification",name:"ROI Quantification",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:3}},viewports:[...j()],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:[...j(),{viewportOptions:{viewportId:"seriesChart"},displaySets:[{id:"chartDisplaySet",options:{skipLoading:!0}}]}],createdDate:"2023-01-01T00:00:00.000Z"}]};const W={id:p,preRegistration:({servicesManager:e,commandsManager:t,configuration:n={}})=>{d.cache.setMaxCacheSize(5368709120)},getPanelModule:V,getHangingProtocolModule:function(){return[{name:q.id,protocol:q}]},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.11.0-beta.99",
3
+ "version": "3.11.1",
4
4
  "description": "OHIF extension for 4D volumes data",
5
5
  "author": "OHIF",
6
6
  "license": "MIT",
@@ -29,21 +29,21 @@
29
29
  "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
30
30
  },
31
31
  "peerDependencies": {
32
- "@ohif/core": "3.11.0-beta.99",
33
- "@ohif/extension-cornerstone": "3.11.0-beta.99",
34
- "@ohif/extension-default": "3.11.0-beta.99",
35
- "@ohif/i18n": "3.11.0-beta.99",
36
- "@ohif/ui": "3.11.0-beta.99",
37
- "dcmjs": "^0.42.0",
38
- "dicom-parser": "^1.8.21",
39
- "hammerjs": "^2.0.8",
40
- "prop-types": "^15.6.2",
41
- "react": "^18.3.1"
32
+ "@ohif/core": "3.11.1",
33
+ "@ohif/extension-cornerstone": "3.11.1",
34
+ "@ohif/extension-default": "3.11.1",
35
+ "@ohif/i18n": "3.11.1",
36
+ "@ohif/ui": "3.11.1",
37
+ "dcmjs": "0.43.1",
38
+ "dicom-parser": "1.8.21",
39
+ "hammerjs": "2.0.8",
40
+ "prop-types": "15.8.1",
41
+ "react": "18.3.1"
42
42
  },
43
43
  "dependencies": {
44
- "@babel/runtime": "^7.20.13",
45
- "@cornerstonejs/core": "^3.30.3",
46
- "@cornerstonejs/tools": "^3.30.3",
47
- "classnames": "^2.3.2"
44
+ "@babel/runtime": "7.28.2",
45
+ "@cornerstonejs/core": "4.5.13",
46
+ "@cornerstonejs/tools": "4.5.13",
47
+ "classnames": "2.5.1"
48
48
  }
49
49
  }