@ohif/extension-cornerstone-dynamic-volume 3.14.0-beta.5 → 3.14.0-beta.50
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 +1 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("@cornerstonejs/core"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/tools"),require("@ohif/ui-next"),require("@ohif/extension-default")):"function"==typeof define&&define.amd?define(["@ohif/core","@cornerstonejs/core","@ohif/extension-cornerstone","@cornerstonejs/tools","@ohif/ui-next","@ohif/extension-default"],t):"object"==typeof exports?exports["ohif-extension-cornerstone"]=t(require("@ohif/core"),require("@cornerstonejs/core"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/tools"),require("@ohif/ui-next"),require("@ohif/extension-default")):e["ohif-extension-cornerstone"]=t(e["@ohif/core"],e["@cornerstonejs/core"],e["@ohif/extension-cornerstone"],e["@cornerstonejs/tools"],e["@ohif/ui-next"],e["@ohif/extension-default"])}(globalThis,(e,t,i,a,n,o)=>(()=>{"use strict";var r={249(e,t){var i=Symbol.for("react.element"),a=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),o=(Symbol.for("react.strict_mode"),Symbol.for("react.profiler"),Symbol.for("react.provider"),Symbol.for("react.context"),Symbol.for("react.forward_ref"),Symbol.for("react.suspense"),Symbol.for("react.memo"),Symbol.for("react.lazy"),Symbol.iterator),r={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},s=Object.assign,l={};function c(e,t,i){this.props=e,this.context=t,this.refs=l,this.updater=i||r}function u(){}function p(e,t,i){this.props=e,this.context=t,this.refs=l,this.updater=i||r}c.prototype.isReactComponent={},c.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")},c.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},u.prototype=c.prototype;var m=p.prototype=new u;m.constructor=p,s(m,c.prototype),m.isPureReactComponent=!0;var d=Array.isArray,y=Object.prototype.hasOwnProperty,f=null,g={key:!0,ref:!0,__self:!0,__source:!0},S=null;t.Fragment=n,t.createElement=function(e,t,a){var n,o={},r=null,s=null;if(null!=t)for(n in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(r=""+t.key),t)y.call(t,n)&&!g.hasOwnProperty(n)&&(o[n]=t[n]);var l=arguments.length-2;if(1===l)o.children=a;else if(1<l){for(var c=Array(l),u=0;u<l;u++)c[u]=arguments[u+2];o.children=c}if(e&&e.defaultProps)for(n in l=e.defaultProps)void 0===o[n]&&(o[n]=l[n]);return{$$typeof:i,type:e,key:r,ref:s,props:o,_owner:f}},t.useEffect=function(e,t){return S.useEffect(e,t)},t.useRef=function(e){return S.useRef(e)},t.useState=function(e){return S.useState(e)}},326(e,t,i){e.exports=i(249)},557(e){e.exports=t},713(e){e.exports=a},2(t){t.exports=e},669(e){e.exports=i},438(e){e.exports=o},55(e){e.exports=n}},s={};function l(e){var t=s[e];if(void 0!==t)return t.exports;var i=s[e]={exports:{}};return r[e](i,i.exports,l),i.exports}l.d=(e,t)=>{for(var i in t)l.o(t,i)&&!l.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),l.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var c={};return(()=>{l.r(c),l.d(c,{default:()=>U});var e={};l.r(e),l.d(e,{updateSegmentationsChartDisplaySet:()=>s});let t=JSON.parse('{"UU":"@ohif/extension-cornerstone-dynamic-volume"}').UU;var i=l(713),a=l(557),n=l(2);let o=n.utils.guid(),{utilities:r}=i;function s({servicesManager:e}){let{segmentationService:t,displaySetService:i,hangingProtocolService:l}=e.services,{seriesMetadata:c,instance:u}=function(e,{servicesManager:t}){let i;if(!e.length)return;let s=new WeakMap,l=e.map(e=>(function(e,t,{servicesManager:i}){let o,s,{displaySetService:l,segmentationService:c,viewportGridService:u}=i.services,p=l.getActiveDisplaySets().find(e=>{let t=e.instances?.[0];return!!t&&(void 0!==t.FrameReferenceTime||void 0!==t.NumberOfTimeSlices)}).displaySetInstanceUID;for(let[e]of a.cache._volumeCache)if(e.includes(p)){o=e;break}o&&(s=a.cache.getVolume(o));let{StudyInstanceUID:m,StudyDescription:d}=n.DicomMetadataStore.getInstanceByImageId(s.imageIds[0]),y=r.segmentation.getOrCreateSegmentationVolume(e.segmentationId),f=y?.volumeId,[g,S]=r.dynamicVolume.getDataInTime(s,{maskVolumeId:f}),v=g.length;if(0===v)return[];let h=u.getActiveViewportId(),D=c.getSegmentColor(h,e.segmentationId,1),I=a.utilities.color.rgbToHex(D[0],D[1],D[2]),b=t.get(s);b||(b=function(e){let t,i,a={FrameReferenceTime:{unit:"ms"}},o=Object.keys(a);for(let r=0;r<o.length;r++){let s=o[r],l=function(e,t){return Array.from(e.imageIds.reduce((e,i)=>{let a=n.DicomMetadataStore.getInstanceByImageId(i)[t];return void 0!==a&&e.add(a),e},new Set)).sort((e,t)=>e-t)}(e,s);if(l.length){t=l,i=a[s].unit;break}}if(!t.length){let e=o.join(", ");throw Error(`Could not extract time points data for the following tags: ${e}`)}let r=function(e,t){let i=["ms","s","m","h"],a=[1e3,60,60],n=i.indexOf(t),o=1;if(-1!==n){for(let r=n;r<i.length-1;r++){let n=o*a[r];if(e.filter(e=>e>n).length<=e.length/2)break;o=n,t=i[r+1]}o>1&&(e=e.map(e=>e/o))}return{timePoints:e,timePointsUnit:t}}(t,i);return{timePoints:t=r.timePoints,timePointsUnit:i=r.timePointsUnit}}(s),t.set(s,b));let{timePoints:w,timePointsUnit:x}=b;if(w.length!==g[0].length)throw Error("Invalid number of time points returned");let E=w.length,C=Array(E);for(let e=0;e<E;e++){let t=g.reduce((t,i)=>t+i[e]/v,0);C[e]=[w[e],t]}return{StudyInstanceUID:m,StudyDescription:d,chartData:{series:{label:e.label,points:C,color:I},axis:{x:{label:`Time (${x})`},y:{label:"Vl (Bq/ml)"}}}}})(e,s,{servicesManager:t})),{date:c,time:u}={date:(i=new Date).getFullYear()+("0"+i.getUTCMonth()).slice(-2)+("0"+i.getUTCDate()).slice(-2),time:("0"+i.getUTCHours()).slice(-2)+("0"+i.getUTCMinutes()).slice(-2)+("0"+i.getUTCSeconds()).slice(-2)},p=l.reduce((e,t)=>[...e,t.chartData.series],[]),m={SOPClassUID:"1.9.451.13215.7.3.2.7.6.1",Modality:"CHT",SOPInstanceUID:n.utils.guid(),SeriesDate:c,SeriesTime:u,SeriesInstanceUID:o,StudyInstanceUID:l[0].StudyInstanceUID,StudyDescription:l[0].StudyDescription,SeriesNumber:100,SeriesDescription:"Segmentation chart series data",chartData:{series:p,axis:{...l[0].chartData.axis}}};return{seriesMetadata:{StudyInstanceUID:m.StudyInstanceUID,StudyDescription:m.StudyDescription,SeriesInstanceUID:m.SeriesInstanceUID,SeriesDescription:m.SeriesDescription,SeriesNumber:m.SeriesNumber,SeriesTime:m.SeriesTime,SOPClassUID:m.SOPClassUID,Modality:m.Modality},instance:m}}(t.getSegmentations(),{servicesManager:e})??{};c&&u&&(n.DicomMetadataStore.addSeriesMetadata([c],!0),n.DicomMetadataStore.addInstances([u],!0),i.getActiveDisplaySets().filter(e=>"CHT"===e.Modality).forEach(e=>{l.displaySets.some(t=>t.displaySetInstanceUID===e.displaySetInstanceUID)||l.displaySets.push(e)}))}let{downloadCsv:u}=n.utils;var p=l(326),m=l(55);let d=e=>null==e?"":String(e).toUpperCase(),y=({title:e,tooltip:t})=>p.createElement("div",{className:"flex items-center space-x-1"},p.createElement(m.Tooltip,null,p.createElement(m.TooltipTrigger,{asChild:!0},p.createElement("span",null,p.createElement(m.Icons.ByName,{name:"info-link",className:"text-primary h-3 w-3"}))),p.createElement(m.TooltipContent,{sideOffset:4,className:"max-w-xs"},p.createElement("div",null,t))),p.createElement("span",{className:"text-muted-foreground text-xs uppercase tracking-wide"},e)),f=({isPlaying:e,onPlayPauseChange:t,fps:i,onFpsChange:n,minFps:o,maxFps:r,currentDimensionGroupNumber:s,onDimensionGroupChange:l,numDimensionGroups:c,onGenerate:u,onDoubleRangeChange:f,rangeValues:S,onDynamicClick:v})=>{let[h,D]=(0,p.useState)(!1),[I,b]=(0,p.useState)(a.Enums.DynamicOperatorType.SUM);return p.createElement("div",{className:"flex select-none flex-col"},p.createElement(m.PanelSection,{defaultOpen:!0},p.createElement(m.PanelSection.Header,null,"Controls"),p.createElement(m.PanelSection.Content,{className:"bg-muted space-y-4 px-5 pt-2 pb-4"},p.createElement("div",{className:"mb-4"},p.createElement(y,{title:"View",tooltip:"Select the view mode, 4D to view the dynamic volume or Computed to view the computed volume"}),p.createElement(m.Tabs,{value:h?"computed":"4d",onValueChange:e=>{let t="computed"===e;D(t),t||"function"!=typeof v||v()},className:"my-2 w-full"},p.createElement(m.TabsList,{className:"w-full"},p.createElement(m.TabsTrigger,{value:"4d",className:"w-1/2"},"4D"),p.createElement(m.TabsTrigger,{value:"computed",className:"w-1/2"},"Computed")))),p.createElement("div",null,p.createElement(g,{onPlayPauseChange:t,isPlaying:e,computedView:h,fps:i,onFpsChange:n,minFps:o,maxFps:r,numDimensionGroups:c,onDimensionGroupChange:l,currentDimensionGroupNumber:s})),p.createElement("div",{className:`mt-3 flex flex-col ${h?"":"ohif-disabled"}`},p.createElement(y,{title:"Computed Operation",tooltip:p.createElement("div",null,"Operation Buttons (SUM, AVERAGE, SUBTRACT): Select the mathematical operation to be applied to the data set.",p.createElement("br",null)," Range Slider: Choose the numeric range of dimension groups within which the operation will be performed.",p.createElement("br",null),"Generate Button: Execute the chosen operation on the specified range of data.")}),p.createElement(m.Tabs,{value:String(I),onValueChange:e=>{b(e)},className:"mt-2 w-full"},p.createElement(m.TabsList,{className:"w-full gap-1"}," ",p.createElement(m.TabsTrigger,{value:String(a.Enums.DynamicOperatorType.SUM),className:"w-1/3"},d(a.Enums.DynamicOperatorType.SUM)),p.createElement(m.TabsTrigger,{value:String(a.Enums.DynamicOperatorType.AVERAGE),className:"w-1/3"},d(a.Enums.DynamicOperatorType.AVERAGE)),p.createElement(m.TabsTrigger,{value:String(a.Enums.DynamicOperatorType.SUBTRACT),className:"w-1/3"},d(a.Enums.DynamicOperatorType.SUBTRACT)))),p.createElement("div",{className:"mt-2 w-full"},p.createElement(m.Numeric.Container,{mode:"doubleRange",min:1,max:c||1,values:S||[1,c||1],onChange:f||(()=>{})},p.createElement(m.Numeric.DoubleRange,{showNumberInputs:!0}))),p.createElement(m.Button,{variant:"default",size:"sm",className:"mt-2 h-[26px] w-[115px] self-start p-0",onClick:()=>{try{"function"==typeof u?u(I):console.error("onGenerate is not a function",u)}catch(e){console.error("Error in onGenerate:",e)}}},"Generate")))))};function g({isPlaying:e,onPlayPauseChange:t,fps:i,minFps:a,maxFps:n,onFpsChange:o,numDimensionGroups:r,onDimensionGroupChange:s,currentDimensionGroupNumber:l,computedView:c}){return p.createElement("div",{className:c?"ohif-disabled":""},p.createElement(y,{title:"4D Controls",tooltip:p.createElement("div",null,"Play/Pause Button: Begin or pause the animation of the 4D visualization. ",p.createElement("br",null),"Dimension Group Selector: Navigate through individual dimension groups of the 4D data."," ",p.createElement("br",null),"FPS (Frames Per Second) Selector: Adjust the playback speed of the animation.")}),p.createElement("div",{className:"mt-3 flex justify-between"},p.createElement(m.Button,{id:"play-pause-button",variant:"secondary",size:"default",className:"w-[58px]",onClick:()=>{"function"==typeof t&&t(!e)}},p.createElement(m.Icons.ByName,{name:e?"icon-pause":"icon-play",className:"text-foreground h-[24px] w-[24px]"})),p.createElement(m.Numeric.Container,{mode:"stepper",value:l||1,onChange:s||(()=>{}),min:1,max:r||1,step:1},p.createElement("div",{className:"flex flex-col items-center"},p.createElement(m.Numeric.NumberStepper,{className:"h-[28px] w-[58px]",direction:"horizontal"}),p.createElement(m.Numeric.Label,{className:"text-muted-foreground mt-1 text-sm"},"Frame"))),p.createElement(m.Numeric.Container,{mode:"stepper",value:i||1,onChange:o||(()=>{}),min:a||1,max:n||30,step:1},p.createElement("div",{className:"flex flex-col items-center"},p.createElement(m.Numeric.NumberStepper,{className:"h-[28px] w-[58px]",direction:"horizontal"}),p.createElement(m.Numeric.Label,{className:"text-muted-foreground mt-1 text-sm"},"FPS")))))}function S({servicesManager:e,commandsManager:t}){let{cornerstoneViewportService:n,viewportGridService:o,displaySetService:r}=e.services,[{isCineEnabled:s},l]=(0,m.useCine)(),[{activeViewportId:c}]=(0,m.useViewportGrid)(),[u,d]=(0,p.useState)([1,1]),[y,g]=(0,p.useState)(null),[v,h]=(0,p.useState)(null),[D,I]=(0,p.useState)(20),[b,w]=(0,p.useState)(s),[x,E]=(0,p.useState)(null),[C,T]=(0,p.useState)(!1),N=(0,p.useRef)(a.utilities.uuidv4()),O=(0,p.useRef)(null),U=`cornerstoneStreamingImageVolume:${N.current}`;function M(e){t.runCommand("swapDynamicWithComputedDisplaySet",{displaySet:e}),T(!0)}async function P(e){let o=v.volumeId;if(!o)return;let r=a.cache.getVolume(U);r||(r=await a.volumeLoader.createAndCacheDerivedVolume(o,{volumeId:U}));let[s,l]=u,c=Array.from({length:l-s+1},(e,t)=>s+t),p={dimensionGroupNumbers:"SUBTRACT"===e?[s,l]:c,targetVolume:r};if(i.utilities.dynamicVolume.updateVolumeFromTimeData(v,e,p),y)t.runCommand("updateVolumeData",{volume:r}),n.getRenderingEngine().render(),M(y);else{let e={volumeLoaderSchema:r.volumeId.split(":")[0],displaySetInstanceUID:N.current,SOPClassHandlerId:"@ohif/extension-default.sopClassHandlerModule.stack",Modality:v.metadata.Modality,isMultiFrame:!1,numImageFrames:1,uid:N.current,referenceDisplaySetUID:v.volumeId.split(":")[1],madeInClient:!0,FrameOfReferenceUID:v.metadata.FrameOfReferenceUID,isDerived:!0,imageIds:r.imageIds};g(e),M(e)}}(0,p.useEffect)(()=>{let t=n.EVENTS.VIEWPORT_DATA_CHANGED,i=e.services.cineService.EVENTS.CINE_STATE_CHANGED,{unsubscribe:a}=n.subscribe(t,e=>{e.viewportData.data.forEach(e=>{e.volume?.isDynamicVolume()&&(h(e.volume),O.current=e.displaySetInstanceUID,d([1,e.volume.numDimensionGroups]))})}),{unsubscribe:o}=e.services.cineService.subscribe(i,e=>{w(e.isPlaying)});return()=>{a(),o()}},[n,l,e.services.cineService]),(0,p.useEffect)(()=>{let e=a.Enums.Events.DYNAMIC_VOLUME_DIMENSION_GROUP_CHANGED,t=e=>{E(e.detail.dimensionGroupNumber)};return a.eventTarget.addEventListener(e,t),()=>{a.eventTarget.removeEventListener(e,t)}},[]),(0,p.useEffect)(()=>{let e=o.getDisplaySetsUIDsForViewport(c);if(!e?.length)return;let t=e.map(r.getDisplaySetByUID).find(e=>e.isDynamicVolume);if(!t)return;let i=a.cache.getVolumes().find(e=>e.volumeId.includes(t.displaySetInstanceUID));i&&(h(i),O.current=t.displaySetInstanceUID,d([1,i.numDimensionGroups]))},[c,o,r,n,l]);let R=()=>{w(!0);let e=n.getViewportInfo(c);if(!e)return;let{element:t}=e;l.playClip(t,{framesPerSecond:D,viewportId:c})},F=()=>{w(!1);let{element:e}=n.getViewportInfo(c);l.stopClip(e)};return p.createElement(f,{fps:D,isPlaying:b,onPlayPauseChange:e=>{e?R():F()},minFps:1,maxFps:50,onFpsChange:e=>{I(e),F(),R()},currentDimensionGroupNumber:x,numDimensionGroups:v?.numDimensionGroups||1,onDimensionGroupChange:e=>{v.dimensionGroupNumber=e},onGenerate:P,onDynamicClick:C?()=>void t.runCommand("swapComputedWithDynamicDisplaySet"):null,onDoubleRangeChange:d,rangeValues:u})}let v=function({servicesManager:e,commandsManager:t,tab:i}){return p.createElement(p.Fragment,null,p.createElement("div",{className:"text-foreground flex flex-col","data-cy":"dynamic-volume-panel"},p.createElement(S,{commandsManager:t,servicesManager:e})))};var h=l(438),D=l(669);let I=function({commandsManager:e,servicesManager:t}){let i=(0,D.useSegmentations)({servicesManager:t});return i?.length?p.createElement("div",{className:"flex gap-2"},p.createElement("div",{className:"flex h-8 w-full items-center rounded pr-0.5"},p.createElement(m.Button,{size:"sm",variant:"ghost",className:"pl-1.5",onClick:()=>{e.runCommand("exportTimeReportCSV",{segmentations:i,options:{filename:"TimeData.csv"}})}},p.createElement(m.Icons.Export,null),p.createElement("span",{className:"pl-1"},"Time Data"))),p.createElement("div",{className:"flex h-8 w-full items-center rounded pr-0.5"},p.createElement(m.Button,{size:"sm",variant:"ghost",className:"pl-1.5",onClick:()=>{e.runCommand("exportTimeReportCSV",{segmentations:i,summaryStats:!0,options:{filename:"ROIStats.csv"}})}},p.createElement(m.Icons.Export,null),p.createElement("span",{className:"pl-1"},"ROI Stats")))):null},b="2hot",w="dynamic4D-pt",x="dynamic4D-fusion",E="dynamic4D-ct";function C({colormap:e,voiInverted:t}={}){return{blendMode:"MIP",colormap:e,voi:{windowWidth:5,windowCenter:2.5},voiInverted:t}}function T(){let e={colormap:{name:b,opacity:[{value:0,opacity:0},{value:.1,opacity:1},{value:1,opacity:1}]},voiInverted:!1};return[{viewportOptions:{viewportId:"ptAxial",viewportType:"volume",orientation:"axial",toolGroupId:w,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"axialSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...C(e)}}]},{viewportOptions:{viewportId:"ptSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:w,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"sagittalSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...C(e)}}]},{viewportOptions:{viewportId:"ptCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:w,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...C(e)}}]}]}function N(){let e={colormap:{name:b,opacity:[{value:0,opacity:0},{value:.1,opacity:.8},{value:1,opacity:.8}]}};return[{viewportOptions:{viewportId:"fusionAxial",viewportType:"volume",orientation:"axial",toolGroupId:x,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:{...C(e)},id:"ptDisplaySet"}]},{viewportOptions:{viewportId:"fusionSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:x,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:{...C(e)},id:"ptDisplaySet"}]},{viewportOptions:{viewportId:"fusionCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:x,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:{...C(e)},id:"ptDisplaySet"}]}]}let O={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:[...T()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"registration",name:"Registration",viewportStructure:{layoutType:"grid",properties:{rows:3,columns:3}},viewports:[...N(),{viewportOptions:{viewportId:"ctAxial",viewportType:"volume",orientation:"axial",toolGroupId:E,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:E,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:E,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!0,target:!0}]},displaySets:[{id:"ctDisplaySet"}]},...T()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"roiQuantification",name:"ROI Quantification",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:3}},viewports:[...N()],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:[...N(),{viewportOptions:{viewportId:"seriesChart"},displaySets:[{id:"chartDisplaySet",options:{skipLoading:!0}}]}],createdDate:"2023-01-01T00:00:00.000Z"}]},U={id:t,preRegistration:({servicesManager:e,commandsManager:t,configuration:i={}})=>{a.cache.setMaxCacheSize(0x140000000)},getPanelModule:function({commandsManager:e,extensionManager:t,servicesManager:i,configuration:a}){let{toolbarService:n}=i.services;return[{name:"dynamic-volume",iconName:"tab-4d",iconLabel:"4D Workflow",label:"4D Workflow",component:()=>p.createElement(v,{commandsManager:e,servicesManager:i,extensionManager:t})},{name:"dynamic-segmentation",iconName:"tab-segmentation",iconLabel:"Segmentation",label:"Segmentation",component:()=>p.createElement(p.Fragment,null,p.createElement(h.Toolbox,{buttonSectionId:n.sections.dynamicToolbox,title:"Buttons:Threshold Tools"}),p.createElement(D.PanelSegmentation,{servicesManager:i,commandsManager:e,extensionManager:t,configuration:a},p.createElement(I,{servicesManager:i,commandsManager:e})))}]},getHangingProtocolModule:function(){return[{name:O.id,protocol:O}]},getCommandsModule:({servicesManager:t,commandsManager:n,extensionManager:o})=>(({commandsManager:t,servicesManager:n})=>{let{displaySetService:o,viewportGridService:r,segmentationService:s}=n.services,l={...e,getDynamic4DDisplaySet:()=>o.getActiveDisplaySets().find(e=>{let 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,summaryStats:t})=>{let n,o,r=l.getDynamic4DDisplaySet(),c=r?.displaySetInstanceUID;for(let[e]of a.cache._volumeCache)if(e.includes(c)){n=e;break}n&&(o=a.cache.getVolume(n));let p=r.instances[0],m=[];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=>{let a=s.getLabelmapVolume(e.segmentationId),[n,r]=i.utilities.dynamicVolume.getDataInTime(o,{maskVolumeId:a.volumeId});if(t){let t="Operation,Segmentation Label ID",i=o.numTimePoints;for(let e=0;e<i;e++)t+=`,Time Point ${e}`;m.push(t);let a=[],s=[],l=[],c=[],u=[],p=[],d=n.length;for(let e=0;e<i;e++){let t=[],i=0,o=1/0,m=-1/0,y=0,f=0;for(let a=0;a<d;a++){let r=n[a][e];t.push(r),i+=r,r<o&&(o=r,y=a),r>m&&(m=r,f=a)}a.push(i/d),s.push(o),l.push(r[y]),c.push(m),u.push(r[f]),p.push(function(e){let t=e.length,i=e.reduce((e,t)=>e+t,0)/t;return Math.sqrt(e.map(e=>(e-i)**2).reduce((e,t)=>e+t,0)/t)}(t))}let y=`Mean,${e.label}`;for(let e=0;e<i;e++)y+=`,${a[e]}`;m.push(y),y=`Standard Deviation,${e.label}`;for(let e=0;e<i;e++)y+=`,${p[e]}`;m.push(y),y=`Min,${e.label}`;for(let e=0;e<i;e++)y+=`,${s[e]}`;m.push(y),y=`Max,${e.label}`;for(let e=0;e<i;e++)y+=`,${c[e]}`;m.push(y)}else{let t="Pixel Identifier (IJK),Segmentation Label ID",i=o.numTimePoints;for(let e=0;e<i;e++)t+=`,Time Point ${e}`;m.push(t);for(let t=0;t<n.length;t++){let i=`${r[t][0]}_${r[t][1]}_${r[t][2]}`,a=`${i},${e.label}`;for(let e=0;e<n[t].length;e++)a+=`,${n[t][e]}`;m.push(a)}}}),u(m.join("\n"),{filename:`${p.PatientID}.csv`})},swapDynamicWithComputedDisplaySet:({displaySet:e})=>{let i=o.getDisplaySetCache(),a=[i.keys()],{displaySetInstanceUID:n}=e;a.includes(n)||i.set(n,e);let{viewports:s}=r.getState(),c=l.getDynamic4DDisplaySet(),u=[];for(let[e,t]of s){let e=t.viewportOptions,{displaySetInstanceUIDs:i}=t,a=i.indexOf(c.displaySetInstanceUID);if(-1!==a){let o={viewportId:t.viewportId,displaySetInstanceUIDs:[...i.slice(0,a),n,...i.slice(a+1)],viewportOptions:{initialImageOptions:e.initialImageOptions,viewportType:"volume",orientation:e.orientation,background:e.background}};u.push(o)}}t.run("setDisplaySetsForViewports",{viewportsToUpdate:u})},swapComputedWithDynamicDisplaySet:()=>{let e=l.getDynamic4DDisplaySet(),i=o.getDisplaySetCache(),a=[...i.keys()],{displaySetInstanceUID:n}=e;a.includes(n)||i.set(n,e);let{viewports:s}=r.getState(),c=l.getComputedDisplaySets()[0],u=[];for(let[e,t]of s){let e=t.viewportOptions,{displaySetInstanceUIDs:i}=t,a=i.indexOf(c.displaySetInstanceUID);if(-1!==a){let o={viewportId:t.viewportId,displaySetInstanceUIDs:[...i.slice(0,a),n,...i.slice(a+1)],viewportOptions:{initialImageOptions:e.initialImageOptions,viewportType:"volume",orientation:e.orientation,background:e.background}};u.push(o)}}t.run("setDisplaySetsForViewports",{viewportsToUpdate:u})},createNewLabelMapForDynamicVolume:async({label:e})=>{let t,{viewports:i,activeViewportId:a}=r.getState(),n=l.getDynamic4DDisplaySet(),c=n.displaySetInstanceUID;if(i.get(a).displaySetInstanceUIDs.includes(c)&&(t=n),!t){for(let[e,i]of o.getDisplaySetCache())if(i.referenceDisplaySetUID===c){t=i;break}}if(!t)throw Error("No reference display set found based on the dynamic data");let u=o.getDisplaySetByUID(t.displaySetInstanceUID),p=await s.createLabelmapForDisplaySet(u,{label:e}),m=i.values().next().value;return await s.addSegmentationRepresentation(m.viewportId,{segmentationId:p}),p}},c={updateSegmentationsChartDisplaySet:{commandFn:l.updateSegmentationsChartDisplaySet,storeContexts:[],options:{}},exportTimeReportCSV:{commandFn:l.exportTimeReportCSV,storeContexts:[],options:{}},swapDynamicWithComputedDisplaySet:{commandFn:l.swapDynamicWithComputedDisplaySet,storeContexts:[],options:{}},createNewLabelMapForDynamicVolume:{commandFn:l.createNewLabelMapForDynamicVolume,storeContexts:[],options:{}},swapComputedWithDynamicDisplaySet:{commandFn:l.swapComputedWithDynamicDisplaySet,storeContexts:[],options:{}}};return{actions:l,definitions:c,defaultContext:"DYNAMIC-VOLUME:CORNERSTONE"}})({servicesManager:t,commandsManager:n,extensionManager:o})}})(),c})());
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("@cornerstonejs/core"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/tools"),require("@ohif/ui-next"),require("@ohif/extension-default")):"function"==typeof define&&define.amd?define(["@ohif/core","@cornerstonejs/core","@ohif/extension-cornerstone","@cornerstonejs/tools","@ohif/ui-next","@ohif/extension-default"],t):"object"==typeof exports?exports["ohif-extension-cornerstone"]=t(require("@ohif/core"),require("@cornerstonejs/core"),require("@ohif/extension-cornerstone"),require("@cornerstonejs/tools"),require("@ohif/ui-next"),require("@ohif/extension-default")):e["ohif-extension-cornerstone"]=t(e["@ohif/core"],e["@cornerstonejs/core"],e["@ohif/extension-cornerstone"],e["@cornerstonejs/tools"],e["@ohif/ui-next"],e["@ohif/extension-default"])}(globalThis,(e,t,i,o,n,a)=>(()=>{"use strict";var r={76(e,t,i){var o=i(326).__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;t.c=function(e){return o.H.useMemoCache(e)}},60(e,t){var i=Symbol.for("react.transitional.element");function o(e,t,o){var n=null;if(void 0!==o&&(n=""+o),void 0!==t.key&&(n=""+t.key),"key"in t)for(var a in o={},t)"key"!==a&&(o[a]=t[a]);else o=t;return{$$typeof:i,type:e,key:n,ref:void 0!==(t=o.ref)?t:null,props:o}}t.Fragment=Symbol.for("react.fragment"),t.jsx=o,t.jsxs=o},391(e,t){var i=Symbol.for("react.transitional.element"),o=Symbol.for("react.portal"),n=(Symbol.for("react.fragment"),Symbol.for("react.strict_mode"),Symbol.for("react.profiler"),Symbol.for("react.consumer"),Symbol.for("react.context"),Symbol.for("react.forward_ref"),Symbol.for("react.suspense"),Symbol.for("react.memo"),Symbol.for("react.lazy")),a=(Symbol.for("react.activity"),Symbol.iterator),r={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},s=Object.assign,l={};function c(e,t,i){this.props=e,this.context=t,this.refs=l,this.updater=i||r}function u(){}function p(e,t,i){this.props=e,this.context=t,this.refs=l,this.updater=i||r}c.prototype.isReactComponent={},c.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("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")},c.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},u.prototype=c.prototype;var m=p.prototype=new u;m.constructor=p,s(m,c.prototype),m.isPureReactComponent=!0;var d={H:null,A:null,T:null,S:null};Object.prototype.hasOwnProperty;"function"==typeof reportError&&reportError,t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=d,t.useEffect=function(e,t){return d.H.useEffect(e,t)},t.useRef=function(e){return d.H.useRef(e)},t.useState=function(e){return d.H.useState(e)}},184(e,t,i){e.exports=i(76)},326(e,t,i){e.exports=i(391)},870(e,t,i){e.exports=i(60)},557(e){e.exports=t},713(e){e.exports=o},2(t){t.exports=e},669(e){e.exports=i},438(e){e.exports=a},55(e){e.exports=n}},s={};function l(e){var t=s[e];if(void 0!==t)return t.exports;var i=s[e]={exports:{}};return r[e](i,i.exports,l),i.exports}l.d=(e,t)=>{for(var i in t)l.o(t,i)&&!l.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),l.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var c={};return(()=>{l.r(c),l.d(c,{default:()=>G});var e={};l.r(e),l.d(e,{updateSegmentationsChartDisplaySet:()=>s});let t=JSON.parse('{"UU":"@ohif/extension-cornerstone-dynamic-volume"}').UU;var i=l(713),o=l(557),n=l(2);let a=n.utils.guid(),{utilities:r}=i;function s({servicesManager:e}){let{segmentationService:t,displaySetService:i,hangingProtocolService:l}=e.services,{seriesMetadata:c,instance:u}=function(e,{servicesManager:t}){let i;if(!e.length)return;let s=new WeakMap,l=e.map(e=>(function(e,t,{servicesManager:i}){let a,s,{displaySetService:l,segmentationService:c,viewportGridService:u}=i.services,p=l.getActiveDisplaySets().find(e=>{let t=e.instances?.[0];return!!t&&(void 0!==t.FrameReferenceTime||void 0!==t.NumberOfTimeSlices)}).displaySetInstanceUID;for(let[e]of o.cache._volumeCache)if(e.includes(p)){a=e;break}a&&(s=o.cache.getVolume(a));let{StudyInstanceUID:m,StudyDescription:d}=n.DicomMetadataStore.getInstanceByImageId(s.imageIds[0]),y=r.segmentation.getOrCreateSegmentationVolume(e.segmentationId),f=y?.volumeId,[S,h]=r.dynamicVolume.getDataInTime(s,{maskVolumeId:f}),g=S.length;if(0===g)return[];let v=u.getActiveViewportId(),D=c.getSegmentColor(v,e.segmentationId,1),x=o.utilities.color.rgbToHex(D[0],D[1],D[2]),I=t.get(s);I||(I=function(e){let t,i,o={FrameReferenceTime:{unit:"ms"}},a=Object.keys(o);for(let r=0;r<a.length;r++){let s=a[r],l=function(e,t){return Array.from(e.imageIds.reduce((e,i)=>{let o=n.DicomMetadataStore.getInstanceByImageId(i)[t];return void 0!==o&&e.add(o),e},new Set)).sort((e,t)=>e-t)}(e,s);if(l.length){t=l,i=o[s].unit;break}}if(!t.length){let e=a.join(", ");throw Error(`Could not extract time points data for the following tags: ${e}`)}let r=function(e,t){let i=["ms","s","m","h"],o=[1e3,60,60],n=i.indexOf(t),a=1;if(-1!==n){for(let r=n;r<i.length-1;r++){let n=a*o[r];if(e.filter(e=>e>n).length<=e.length/2)break;a=n,t=i[r+1]}a>1&&(e=e.map(e=>e/a))}return{timePoints:e,timePointsUnit:t}}(t,i);return{timePoints:t=r.timePoints,timePointsUnit:i=r.timePointsUnit}}(s),t.set(s,I));let{timePoints:b,timePointsUnit:w}=I;if(b.length!==S[0].length)throw Error("Invalid number of time points returned");let T=b.length,C=Array(T);for(let e=0;e<T;e++){let t=S.reduce((t,i)=>t+i[e]/g,0);C[e]=[b[e],t]}return{StudyInstanceUID:m,StudyDescription:d,chartData:{series:{label:e.label,points:C,color:x},axis:{x:{label:`Time (${w})`},y:{label:"Vl (Bq/ml)"}}}}})(e,s,{servicesManager:t})),{date:c,time:u}={date:(i=new Date).getFullYear()+("0"+i.getUTCMonth()).slice(-2)+("0"+i.getUTCDate()).slice(-2),time:("0"+i.getUTCHours()).slice(-2)+("0"+i.getUTCMinutes()).slice(-2)+("0"+i.getUTCSeconds()).slice(-2)},p=l.reduce((e,t)=>[...e,t.chartData.series],[]),m={SOPClassUID:"1.9.451.13215.7.3.2.7.6.1",Modality:"CHT",SOPInstanceUID:n.utils.guid(),SeriesDate:c,SeriesTime:u,SeriesInstanceUID:a,StudyInstanceUID:l[0].StudyInstanceUID,StudyDescription:l[0].StudyDescription,SeriesNumber:100,SeriesDescription:"Segmentation chart series data",chartData:{series:p,axis:{...l[0].chartData.axis}}};return{seriesMetadata:{StudyInstanceUID:m.StudyInstanceUID,StudyDescription:m.StudyDescription,SeriesInstanceUID:m.SeriesInstanceUID,SeriesDescription:m.SeriesDescription,SeriesNumber:m.SeriesNumber,SeriesTime:m.SeriesTime,SOPClassUID:m.SOPClassUID,Modality:m.Modality},instance:m}}(t.getSegmentations(),{servicesManager:e})??{};c&&u&&(n.DicomMetadataStore.addSeriesMetadata([c],!0),n.DicomMetadataStore.addInstances([u],!0),i.getActiveDisplaySets().filter(e=>"CHT"===e.Modality).forEach(e=>{l.displaySets.some(t=>t.displaySetInstanceUID===e.displaySetInstanceUID)||l.displaySets.push(e)}))}let{downloadCsv:u}=n.utils;var p=l(326),m=l(184),d=l(55),y=l(870);let f=e=>null==e?"":String(e).toUpperCase(),S=e=>{let t,i,o,n,a=(0,m.c)(8),{title:r,tooltip:s}=e;return a[0]===Symbol.for("react.memo_cache_sentinel")?(t=(0,y.jsx)(d.TooltipTrigger,{asChild:!0,children:(0,y.jsx)("span",{children:(0,y.jsx)(d.Icons.ByName,{name:"info-link",className:"text-primary h-3 w-3"})})}),a[0]=t):t=a[0],a[1]!==s?(i=(0,y.jsxs)(d.Tooltip,{children:[t,(0,y.jsx)(d.TooltipContent,{sideOffset:4,className:"max-w-xs",children:(0,y.jsx)("div",{children:s})})]}),a[1]=s,a[2]=i):i=a[2],a[3]!==r?(o=(0,y.jsx)("span",{className:"text-muted-foreground text-xs uppercase tracking-wide",children:r}),a[3]=r,a[4]=o):o=a[4],a[5]!==i||a[6]!==o?(n=(0,y.jsxs)("div",{className:"flex items-center space-x-1",children:[i,o]}),a[5]=i,a[6]=o,a[7]=n):n=a[7],n},h=e=>{let t,i,n,a,r,s,l,c,u,h,v,D,I,b,w,T,C,j,N,O,_=(0,m.c)(49),{isPlaying:U,onPlayPauseChange:R,fps:M,onFpsChange:E,minFps:P,maxFps:F,currentDimensionGroupNumber:G,onDimensionGroupChange:V,numDimensionGroups:A,onGenerate:L,onDoubleRangeChange:k,rangeValues:W,onDynamicClick:q}=e,[$,B]=(0,p.useState)(!1),[H,z]=(0,p.useState)(o.Enums.DynamicOperatorType.SUM);_[0]!==H||_[1]!==L?(t=()=>{try{"function"==typeof L?L(H):console.error("onGenerate is not a function",L)}catch(e){console.error("Error in onGenerate:",e)}},_[0]=H,_[1]=L,_[2]=t):t=_[2];let Z=t;_[3]===Symbol.for("react.memo_cache_sentinel")?(i=(0,y.jsx)(d.PanelSection.Header,{children:"Controls"}),_[3]=i):i=_[3],_[4]===Symbol.for("react.memo_cache_sentinel")?(n=(0,y.jsx)(S,{title:"View",tooltip:"Select the view mode, 4D to view the dynamic volume or Computed to view the computed volume"}),_[4]=n):n=_[4];let Y=$?"computed":"4d";_[5]!==q?(a=e=>{let t="computed"===e;B(t),t||"function"!=typeof q||q()},_[5]=q,_[6]=a):a=_[6],_[7]===Symbol.for("react.memo_cache_sentinel")?(r=(0,y.jsxs)(d.TabsList,{className:"w-full",children:[(0,y.jsx)(d.TabsTrigger,{value:"4d",className:"w-1/2",children:"4D"}),(0,y.jsx)(d.TabsTrigger,{value:"computed",className:"w-1/2",children:"Computed"})]}),_[7]=r):r=_[7],_[8]!==Y||_[9]!==a?(s=(0,y.jsxs)("div",{className:"mb-4",children:[n,(0,y.jsx)(d.Tabs,{value:Y,onValueChange:a,className:"my-2 w-full",children:r})]}),_[8]=Y,_[9]=a,_[10]=s):s=_[10],_[11]!==$||_[12]!==G||_[13]!==M||_[14]!==U||_[15]!==F||_[16]!==P||_[17]!==A||_[18]!==V||_[19]!==E||_[20]!==R?(l=(0,y.jsx)("div",{children:(0,y.jsx)(g,{onPlayPauseChange:R,isPlaying:U,computedView:$,fps:M,onFpsChange:E,minFps:P,maxFps:F,numDimensionGroups:A,onDimensionGroupChange:V,currentDimensionGroupNumber:G})}),_[11]=$,_[12]=G,_[13]=M,_[14]=U,_[15]=F,_[16]=P,_[17]=A,_[18]=V,_[19]=E,_[20]=R,_[21]=l):l=_[21];let J=`mt-3 flex flex-col ${$?"":"ohif-disabled"}`;_[22]===Symbol.for("react.memo_cache_sentinel")?(c=(0,y.jsx)("br",{}),_[22]=c):c=_[22],_[23]===Symbol.for("react.memo_cache_sentinel")?(u=(0,y.jsx)(S,{title:"Computed Operation",tooltip:(0,y.jsxs)("div",{children:["Operation Buttons (SUM, AVERAGE, SUBTRACT): Select the mathematical operation to be applied to the data set.",c," Range Slider: Choose the numeric range of dimension groups within which the operation will be performed.",(0,y.jsx)("br",{}),"Generate Button: Execute the chosen operation on the specified range of data."]})}),_[23]=u):u=_[23];let K=String(H);_[24]===Symbol.for("react.memo_cache_sentinel")?(h=e=>{z(e)},_[24]=h):h=_[24],_[25]===Symbol.for("react.memo_cache_sentinel")?(v=(0,y.jsx)(d.TabsTrigger,{value:String(o.Enums.DynamicOperatorType.SUM),className:"w-1/3",children:f(o.Enums.DynamicOperatorType.SUM)}),_[25]=v):v=_[25],_[26]===Symbol.for("react.memo_cache_sentinel")?(D=(0,y.jsx)(d.TabsTrigger,{value:String(o.Enums.DynamicOperatorType.AVERAGE),className:"w-1/3",children:f(o.Enums.DynamicOperatorType.AVERAGE)}),_[26]=D):D=_[26],_[27]===Symbol.for("react.memo_cache_sentinel")?(I=(0,y.jsxs)(d.TabsList,{className:"w-full gap-1",children:[" ",v,D,(0,y.jsx)(d.TabsTrigger,{value:String(o.Enums.DynamicOperatorType.SUBTRACT),className:"w-1/3",children:f(o.Enums.DynamicOperatorType.SUBTRACT)})]}),_[27]=I):I=_[27],_[28]!==K?(b=(0,y.jsx)(d.Tabs,{value:K,onValueChange:h,className:"mt-2 w-full",children:I}),_[28]=K,_[29]=b):b=_[29];let Q=A||1;_[30]!==A||_[31]!==W?(w=W||[1,A||1],_[30]=A,_[31]=W,_[32]=w):w=_[32];let X=k||x;return _[33]===Symbol.for("react.memo_cache_sentinel")?(T=(0,y.jsx)(d.Numeric.DoubleRange,{showNumberInputs:!0}),_[33]=T):T=_[33],_[34]!==Q||_[35]!==w||_[36]!==X?(C=(0,y.jsx)("div",{className:"mt-2 w-full",children:(0,y.jsx)(d.Numeric.Container,{mode:"doubleRange",min:1,max:Q,values:w,onChange:X,children:T})}),_[34]=Q,_[35]=w,_[36]=X,_[37]=C):C=_[37],_[38]!==Z?(j=(0,y.jsx)(d.Button,{variant:"default",size:"sm",className:"mt-2 h-[26px] w-[115px] self-start p-0",onClick:Z,children:"Generate"}),_[38]=Z,_[39]=j):j=_[39],_[40]!==b||_[41]!==C||_[42]!==j||_[43]!==J?(N=(0,y.jsxs)("div",{className:J,children:[u,b,C,j]}),_[40]=b,_[41]=C,_[42]=j,_[43]=J,_[44]=N):N=_[44],_[45]!==N||_[46]!==s||_[47]!==l?(O=(0,y.jsx)("div",{className:"flex select-none flex-col",children:(0,y.jsxs)(d.PanelSection,{defaultOpen:!0,children:[i,(0,y.jsxs)(d.PanelSection.Content,{className:"bg-muted space-y-4 px-5 pt-2 pb-4",children:[s,l,N]})]})}),_[45]=N,_[46]=s,_[47]=l,_[48]=O):O=_[48],O};function g(e){let t,i,o,n,a,r,s,l,c,u,p,f,h=(0,m.c)(30),{isPlaying:g,onPlayPauseChange:x,fps:I,minFps:b,maxFps:w,onFpsChange:T,numDimensionGroups:C,onDimensionGroupChange:j,currentDimensionGroupNumber:N,computedView:O}=e;h[0]!==g?(t=()=>g?"icon-pause":"icon-play",h[0]=g,h[1]=t):t=h[1];let _=t,U=O?"ohif-disabled":"";h[2]===Symbol.for("react.memo_cache_sentinel")?(i=(0,y.jsx)("br",{}),h[2]=i):i=h[2],h[3]===Symbol.for("react.memo_cache_sentinel")?(o=(0,y.jsx)(S,{title:"4D Controls",tooltip:(0,y.jsxs)("div",{children:["Play/Pause Button: Begin or pause the animation of the 4D visualization. ",i,"Dimension Group Selector: Navigate through individual dimension groups of the 4D data."," ",(0,y.jsx)("br",{}),"FPS (Frames Per Second) Selector: Adjust the playback speed of the animation."]})}),h[3]=o):o=h[3],h[4]!==g||h[5]!==x?(n=()=>{"function"==typeof x&&x(!g)},h[4]=g,h[5]=x,h[6]=n):n=h[6];let R=_();h[7]!==R?(a=(0,y.jsx)(d.Icons.ByName,{name:R,className:"text-foreground h-[24px] w-[24px]"}),h[7]=R,h[8]=a):a=h[8],h[9]!==n||h[10]!==a?(r=(0,y.jsx)(d.Button,{id:"play-pause-button",variant:"secondary",size:"default",className:"w-[58px]",onClick:n,children:a}),h[9]=n,h[10]=a,h[11]=r):r=h[11];let M=N||1,E=j||D,P=C||1;h[12]===Symbol.for("react.memo_cache_sentinel")?(s=(0,y.jsxs)("div",{className:"flex flex-col items-center",children:[(0,y.jsx)(d.Numeric.NumberStepper,{className:"h-[28px] w-[58px]",direction:"horizontal"}),(0,y.jsx)(d.Numeric.Label,{className:"text-muted-foreground mt-1 text-sm",children:"Frame"})]}),h[12]=s):s=h[12],h[13]!==E||h[14]!==P||h[15]!==M?(l=(0,y.jsx)(d.Numeric.Container,{mode:"stepper",value:M,onChange:E,min:1,max:P,step:1,children:s}),h[13]=E,h[14]=P,h[15]=M,h[16]=l):l=h[16];let F=I||1,G=T||v,V=b||1,A=w||30;return h[17]===Symbol.for("react.memo_cache_sentinel")?(c=(0,y.jsxs)("div",{className:"flex flex-col items-center",children:[(0,y.jsx)(d.Numeric.NumberStepper,{className:"h-[28px] w-[58px]",direction:"horizontal"}),(0,y.jsx)(d.Numeric.Label,{className:"text-muted-foreground mt-1 text-sm",children:"FPS"})]}),h[17]=c):c=h[17],h[18]!==F||h[19]!==G||h[20]!==V||h[21]!==A?(u=(0,y.jsx)(d.Numeric.Container,{mode:"stepper",value:F,onChange:G,min:V,max:A,step:1,children:c}),h[18]=F,h[19]=G,h[20]=V,h[21]=A,h[22]=u):u=h[22],h[23]!==l||h[24]!==u||h[25]!==r?(p=(0,y.jsxs)("div",{className:"mt-3 flex justify-between",children:[r,l,u]}),h[23]=l,h[24]=u,h[25]=r,h[26]=p):p=h[26],h[27]!==U||h[28]!==p?(f=(0,y.jsxs)("div",{className:U,children:[o,p]}),h[27]=U,h[28]=p,h[29]=f):f=h[29],f}function v(){}function D(){}function x(){}function I(e){let t,n,a,r,s,l,c,u,f,S,g,v,D,x,I,T=(0,m.c)(56),{servicesManager:C,commandsManager:j}=e,{cornerstoneViewportService:N,viewportGridService:O,displaySetService:_}=C.services,[U,R]=(0,d.useCine)(),{isCineEnabled:M}=U,[E]=(0,d.useViewportGrid)(),{activeViewportId:P}=E;T[0]===Symbol.for("react.memo_cache_sentinel")?(t=[1,1],T[0]=t):t=T[0];let[F,G]=(0,p.useState)(t),[V,A]=(0,p.useState)(null),[L,k]=(0,p.useState)(null),[W,q]=(0,p.useState)(20),[$,B]=(0,p.useState)(M),[H,z]=(0,p.useState)(null),[Z,Y]=(0,p.useState)(!1),[J]=(0,p.useState)(w),K=(0,p.useRef)(null),Q=`cornerstoneStreamingImageVolume:${J}`;T[1]!==N||T[2]!==C.services.cineService?(n=()=>{let e=N.EVENTS.VIEWPORT_DATA_CHANGED,t=C.services.cineService.EVENTS.CINE_STATE_CHANGED,{unsubscribe:i}=N.subscribe(e,e=>{e.viewportData.data.forEach(e=>{e.volume?.isDynamicVolume()&&(k(e.volume),K.current=e.displaySetInstanceUID,G([1,e.volume.numDimensionGroups]))})}),{unsubscribe:o}=C.services.cineService.subscribe(t,e=>{B(e.isPlaying)});return()=>{i(),o()}},T[1]=N,T[2]=C.services.cineService,T[3]=n):n=T[3],T[4]!==R||T[5]!==N||T[6]!==C.services.cineService?(a=[N,R,C.services.cineService],T[4]=R,T[5]=N,T[6]=C.services.cineService,T[7]=a):a=T[7],(0,p.useEffect)(n,a),T[8]===Symbol.for("react.memo_cache_sentinel")?(r=()=>{let e=o.Enums.Events.DYNAMIC_VOLUME_DIMENSION_GROUP_CHANGED,t=e=>{z(e.detail.dimensionGroupNumber)};return o.eventTarget.addEventListener(e,t),()=>{o.eventTarget.removeEventListener(e,t)}},s=[],T[8]=r,T[9]=s):(r=T[8],s=T[9]),(0,p.useEffect)(r,s),T[10]!==P||T[11]!==_||T[12]!==O?(l=()=>{let e=O.getDisplaySetsUIDsForViewport(P);if(!e?.length)return;let t=e.map(_.getDisplaySetByUID).find(b);if(!t)return;let i=o.cache.getVolumes().find(e=>e.volumeId.includes(t.displaySetInstanceUID));i&&(k(i),K.current=t.displaySetInstanceUID,G([1,i.numDimensionGroups]))},T[10]=P,T[11]=_,T[12]=O,T[13]=l):l=T[13],T[14]!==P||T[15]!==R||T[16]!==N||T[17]!==_||T[18]!==O?(c=[P,O,_,N,R],T[14]=P,T[15]=R,T[16]=N,T[17]=_,T[18]=O,T[19]=c):c=T[19],(0,p.useEffect)(l,c),T[20]!==j?(u=function(e){j.runCommand("swapDynamicWithComputedDisplaySet",{displaySet:e}),Y(!0)},T[20]=j,T[21]=u):u=T[21];let X=u;T[22]!==j?(f=function(e){j.runCommand("swapComputedWithDynamicDisplaySet")},T[22]=j,T[23]=f):f=T[23];let ee=f;T[24]!==j||T[25]!==V||T[26]!==Q||T[27]!==N||T[28]!==F||T[29]!==L||T[30]!==X||T[31]!==J?(S=async function(e){let t=L.volumeId;if(!t)return;let n=o.cache.getVolume(Q);n||(n=await o.volumeLoader.createAndCacheDerivedVolume(t,{volumeId:Q}));let[a,r]=F,s=Array.from({length:r-a+1},(e,t)=>a+t),l={dimensionGroupNumbers:"SUBTRACT"===e?[a,r]:s,targetVolume:n};if(i.utilities.dynamicVolume.updateVolumeFromTimeData(L,e,l),V)j.runCommand("updateVolumeData",{volume:n}),N.getRenderingEngine().render(),X(V);else{let e={volumeLoaderSchema:n.volumeId.split(":")[0],displaySetInstanceUID:J,SOPClassHandlerId:"@ohif/extension-default.sopClassHandlerModule.stack",Modality:L.metadata.Modality,isMultiFrame:!1,numImageFrames:1,uid:J,referenceDisplaySetUID:L.volumeId.split(":")[1],madeInClient:!0,FrameOfReferenceUID:L.metadata.FrameOfReferenceUID,isDerived:!0,imageIds:n.imageIds};A(e),X(e)}},T[24]=j,T[25]=V,T[26]=Q,T[27]=N,T[28]=F,T[29]=L,T[30]=X,T[31]=J,T[32]=S):S=T[32];let et=S;if(T[33]!==P||T[34]!==R||T[35]!==N||T[36]!==W){g=i=>{i?e():t()};let e=()=>{B(!0);let e=N.getViewportInfo(P);if(!e)return;let{element:t}=e;R.playClip(t,{framesPerSecond:W,viewportId:P})},t=()=>{B(!1);let{element:e}=N.getViewportInfo(P);R.stopClip(e)};v=i=>{q(i),t(),e()},T[33]=P,T[34]=R,T[35]=N,T[36]=W,T[37]=g,T[38]=v}else g=T[37],v=T[38];let ei=v,eo=L?.numDimensionGroups||1;return T[39]!==L?(D=e=>{L&&(L.dimensionGroupNumber=e)},T[39]=L,T[40]=D):D=T[40],T[41]!==V||T[42]!==Z||T[43]!==ee?(x=Z?()=>ee(V):null,T[41]=V,T[42]=Z,T[43]=ee,T[44]=x):x=T[44],T[45]!==H||T[46]!==F||T[47]!==W||T[48]!==ei||T[49]!==$||T[50]!==et||T[51]!==g||T[52]!==eo||T[53]!==D||T[54]!==x?(I=(0,y.jsx)(h,{fps:W,isPlaying:$,onPlayPauseChange:g,minFps:1,maxFps:50,onFpsChange:ei,currentDimensionGroupNumber:H,numDimensionGroups:eo,onDimensionGroupChange:D,onGenerate:et,onDynamicClick:x,onDoubleRangeChange:G,rangeValues:F}),T[45]=H,T[46]=F,T[47]=W,T[48]=ei,T[49]=$,T[50]=et,T[51]=g,T[52]=eo,T[53]=D,T[54]=x,T[55]=I):I=T[55],I}function b(e){return e.isDynamicVolume}function w(){return o.utilities.uuidv4()}let T=function(e){let t,i=(0,m.c)(3),{servicesManager:o,commandsManager:n}=e;return i[0]!==n||i[1]!==o?(t=(0,y.jsx)(y.Fragment,{children:(0,y.jsx)("div",{className:"text-foreground flex flex-col","data-cy":"dynamic-volume-panel",children:(0,y.jsx)(I,{commandsManager:n,servicesManager:o})})}),i[0]=n,i[1]=o,i[2]=t):t=i[2],t};var C=l(438),j=l(669);let N=function(e){let t,i,o,n,a,r,s,l,c,u,p=(0,m.c)(19),{commandsManager:f,servicesManager:S}=e;p[0]!==S?(t={servicesManager:S},p[0]=S,p[1]=t):t=p[1];let h=(0,j.useSegmentations)(t);return h?.length?(p[2]!==f||p[3]!==h?(i=()=>{f.runCommand("exportTimeReportCSV",{segmentations:h,options:{filename:"TimeData.csv"}})},p[2]=f,p[3]=h,p[4]=i):i=p[4],p[5]===Symbol.for("react.memo_cache_sentinel")?(o=(0,y.jsx)(d.Icons.Export,{}),n=(0,y.jsx)("span",{className:"pl-1",children:"Time Data"}),p[5]=o,p[6]=n):(o=p[5],n=p[6]),p[7]!==i?(a=(0,y.jsx)("div",{className:"flex h-8 w-full items-center rounded pr-0.5",children:(0,y.jsxs)(d.Button,{size:"sm",variant:"ghost",className:"pl-1.5",onClick:i,children:[o,n]})}),p[7]=i,p[8]=a):a=p[8],p[9]!==f||p[10]!==h?(r=()=>{f.runCommand("exportTimeReportCSV",{segmentations:h,summaryStats:!0,options:{filename:"ROIStats.csv"}})},p[9]=f,p[10]=h,p[11]=r):r=p[11],p[12]===Symbol.for("react.memo_cache_sentinel")?(s=(0,y.jsx)(d.Icons.Export,{}),l=(0,y.jsx)("span",{className:"pl-1",children:"ROI Stats"}),p[12]=s,p[13]=l):(s=p[12],l=p[13]),p[14]!==r?(c=(0,y.jsx)("div",{className:"flex h-8 w-full items-center rounded pr-0.5",children:(0,y.jsxs)(d.Button,{size:"sm",variant:"ghost",className:"pl-1.5",onClick:r,children:[s,l]})}),p[14]=r,p[15]=c):c=p[15],p[16]!==a||p[17]!==c?(u=(0,y.jsxs)("div",{className:"flex gap-2",children:[a,c]}),p[16]=a,p[17]=c,p[18]=u):u=p[18],u):null},O="2hot",_="dynamic4D-pt",U="dynamic4D-fusion",R="dynamic4D-ct";function M({colormap:e,voiInverted:t}={}){return{blendMode:"MIP",colormap:e,voi:{windowWidth:5,windowCenter:2.5},voiInverted:t}}function E(){let e={colormap:{name:O,opacity:[{value:0,opacity:0},{value:.1,opacity:1},{value:1,opacity:1}]},voiInverted:!1};return[{viewportOptions:{viewportId:"ptAxial",viewportType:"volume",orientation:"axial",toolGroupId:_,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"axialSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...M(e)}}]},{viewportOptions:{viewportId:"ptSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:_,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"sagittalSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...M(e)}}]},{viewportOptions:{viewportId:"ptCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:_,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ptWLSync",source:!0,target:!0}]},displaySets:[{id:"ptDisplaySet",options:{...M(e)}}]}]}function P(){let e={colormap:{name:O,opacity:[{value:0,opacity:0},{value:.1,opacity:.8},{value:1,opacity:.8}]}};return[{viewportOptions:{viewportId:"fusionAxial",viewportType:"volume",orientation:"axial",toolGroupId:U,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:{...M(e)},id:"ptDisplaySet"}]},{viewportOptions:{viewportId:"fusionSagittal",viewportType:"volume",orientation:"sagittal",toolGroupId:U,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:{...M(e)},id:"ptDisplaySet"}]},{viewportOptions:{viewportId:"fusionCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:U,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:{...M(e)},id:"ptDisplaySet"}]}]}let F={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:[...E()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"registration",name:"Registration",viewportStructure:{layoutType:"grid",properties:{rows:3,columns:3}},viewports:[...P(),{viewportOptions:{viewportId:"ctAxial",viewportType:"volume",orientation:"axial",toolGroupId:R,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:R,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:R,initialImageOptions:{preset:"middle"},syncGroups:[{type:"cameraPosition",id:"coronalSync",source:!0,target:!0},{type:"voi",id:"ctWLSync",source:!0,target:!0}]},displaySets:[{id:"ctDisplaySet"}]},...E()],createdDate:"2023-01-01T00:00:00.000Z"},{id:"roiQuantification",name:"ROI Quantification",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:3}},viewports:[...P()],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:[...P(),{viewportOptions:{viewportId:"seriesChart"},displaySets:[{id:"chartDisplaySet",options:{skipLoading:!0}}]}],createdDate:"2023-01-01T00:00:00.000Z"}]},G={id:t,preRegistration:({servicesManager:e,commandsManager:t,configuration:i={}})=>{o.cache.setMaxCacheSize(0x140000000)},getPanelModule:function({commandsManager:e,extensionManager:t,servicesManager:i,configuration:o}){let{toolbarService:n}=i.services;return[{name:"dynamic-volume",iconName:"tab-4d",iconLabel:"4D Workflow",label:"4D Workflow",component:()=>(0,y.jsx)(T,{commandsManager:e,servicesManager:i,extensionManager:t})},{name:"dynamic-segmentation",iconName:"tab-segmentation",iconLabel:"Segmentation",label:"Segmentation",component:()=>(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(C.Toolbox,{buttonSectionId:n.sections.dynamicToolbox,title:"Buttons:Threshold Tools"}),(0,y.jsx)(j.PanelSegmentation,{servicesManager:i,commandsManager:e,extensionManager:t,configuration:o,children:(0,y.jsx)(N,{servicesManager:i,commandsManager:e})})]})}]},getHangingProtocolModule:function(){return[{name:F.id,protocol:F}]},getCommandsModule:({servicesManager:t,commandsManager:n,extensionManager:a})=>(({commandsManager:t,servicesManager:n})=>{let{displaySetService:a,viewportGridService:r,segmentationService:s}=n.services,l={...e,getDynamic4DDisplaySet:()=>a.getActiveDisplaySets().find(e=>{let t=e.instances?.[0];return!!t&&(void 0!==t.FrameReferenceTime||void 0!==t.NumberOfTimeSlices||void 0!==t.TemporalPositionIdentifier)}),getComputedDisplaySets:()=>[...a.getDisplaySetCache().values()].filter(e=>e.isDerived),exportTimeReportCSV:({segmentations:e,summaryStats:t})=>{let n,a,r=l.getDynamic4DDisplaySet(),c=r?.displaySetInstanceUID;for(let[e]of o.cache._volumeCache)if(e.includes(c)){n=e;break}n&&(a=o.cache.getVolume(n));let p=r.instances[0],m=[];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=>{let o=s.getLabelmapVolume(e.segmentationId),[n,r]=i.utilities.dynamicVolume.getDataInTime(a,{maskVolumeId:o.volumeId});if(t){let t="Operation,Segmentation Label ID",i=a.numTimePoints;for(let e=0;e<i;e++)t+=`,Time Point ${e}`;m.push(t);let o=[],s=[],l=[],c=[],u=[],p=[],d=n.length;for(let e=0;e<i;e++){let t=[],i=0,a=1/0,m=-1/0,y=0,f=0;for(let o=0;o<d;o++){let r=n[o][e];t.push(r),i+=r,r<a&&(a=r,y=o),r>m&&(m=r,f=o)}o.push(i/d),s.push(a),l.push(r[y]),c.push(m),u.push(r[f]),p.push(function(e){let t=e.length,i=e.reduce((e,t)=>e+t,0)/t;return Math.sqrt(e.map(e=>(e-i)**2).reduce((e,t)=>e+t,0)/t)}(t))}let y=`Mean,${e.label}`;for(let e=0;e<i;e++)y+=`,${o[e]}`;m.push(y),y=`Standard Deviation,${e.label}`;for(let e=0;e<i;e++)y+=`,${p[e]}`;m.push(y),y=`Min,${e.label}`;for(let e=0;e<i;e++)y+=`,${s[e]}`;m.push(y),y=`Max,${e.label}`;for(let e=0;e<i;e++)y+=`,${c[e]}`;m.push(y)}else{let t="Pixel Identifier (IJK),Segmentation Label ID",i=a.numTimePoints;for(let e=0;e<i;e++)t+=`,Time Point ${e}`;m.push(t);for(let t=0;t<n.length;t++){let i=`${r[t][0]}_${r[t][1]}_${r[t][2]}`,o=`${i},${e.label}`;for(let e=0;e<n[t].length;e++)o+=`,${n[t][e]}`;m.push(o)}}}),u(m.join("\n"),{filename:`${p.PatientID}.csv`})},swapDynamicWithComputedDisplaySet:({displaySet:e})=>{let i=a.getDisplaySetCache(),o=[i.keys()],{displaySetInstanceUID:n}=e;o.includes(n)||i.set(n,e);let{viewports:s}=r.getState(),c=l.getDynamic4DDisplaySet(),u=[];for(let[e,t]of s){let e=t.viewportOptions,{displaySetInstanceUIDs:i}=t,o=i.indexOf(c.displaySetInstanceUID);if(-1!==o){let a={viewportId:t.viewportId,displaySetInstanceUIDs:[...i.slice(0,o),n,...i.slice(o+1)],viewportOptions:{initialImageOptions:e.initialImageOptions,viewportType:"volume",orientation:e.orientation,background:e.background}};u.push(a)}}t.run("setDisplaySetsForViewports",{viewportsToUpdate:u})},swapComputedWithDynamicDisplaySet:()=>{let e=l.getDynamic4DDisplaySet(),i=a.getDisplaySetCache(),o=[...i.keys()],{displaySetInstanceUID:n}=e;o.includes(n)||i.set(n,e);let{viewports:s}=r.getState(),c=l.getComputedDisplaySets()[0],u=[];for(let[e,t]of s){let e=t.viewportOptions,{displaySetInstanceUIDs:i}=t,o=i.indexOf(c.displaySetInstanceUID);if(-1!==o){let a={viewportId:t.viewportId,displaySetInstanceUIDs:[...i.slice(0,o),n,...i.slice(o+1)],viewportOptions:{initialImageOptions:e.initialImageOptions,viewportType:"volume",orientation:e.orientation,background:e.background}};u.push(a)}}t.run("setDisplaySetsForViewports",{viewportsToUpdate:u})},createNewLabelMapForDynamicVolume:async({label:e})=>{let t,{viewports:i,activeViewportId:o}=r.getState(),n=l.getDynamic4DDisplaySet(),c=n.displaySetInstanceUID;if(i.get(o).displaySetInstanceUIDs.includes(c)&&(t=n),!t){for(let[e,i]of a.getDisplaySetCache())if(i.referenceDisplaySetUID===c){t=i;break}}if(!t)throw Error("No reference display set found based on the dynamic data");let u=a.getDisplaySetByUID(t.displaySetInstanceUID),p=await s.createLabelmapForDisplaySet(u,{label:e}),m=i.values().next().value;return await s.addSegmentationRepresentation(m.viewportId,{segmentationId:p}),p}},c={updateSegmentationsChartDisplaySet:{commandFn:l.updateSegmentationsChartDisplaySet,storeContexts:[],options:{}},exportTimeReportCSV:{commandFn:l.exportTimeReportCSV,storeContexts:[],options:{}},swapDynamicWithComputedDisplaySet:{commandFn:l.swapDynamicWithComputedDisplaySet,storeContexts:[],options:{}},createNewLabelMapForDynamicVolume:{commandFn:l.createNewLabelMapForDynamicVolume,storeContexts:[],options:{}},swapComputedWithDynamicDisplaySet:{commandFn:l.swapComputedWithDynamicDisplaySet,storeContexts:[],options:{}}};return{actions:l,definitions:c,defaultContext:"DYNAMIC-VOLUME:CORNERSTONE"}})({servicesManager:t,commandsManager:n,extensionManager:a})}})(),c})());
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ohif/extension-cornerstone-dynamic-volume",
|
|
3
|
-
"version": "3.14.0-beta.
|
|
3
|
+
"version": "3.14.0-beta.50",
|
|
4
4
|
"description": "OHIF extension for 4D volumes data",
|
|
5
5
|
"author": "OHIF",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,21 +25,19 @@
|
|
|
25
25
|
"access": "public"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
+
"@ohif/core": "3.14.0-beta.50",
|
|
29
|
+
"@ohif/extension-cornerstone": "3.14.0-beta.50",
|
|
30
|
+
"@ohif/extension-default": "3.14.0-beta.50",
|
|
31
|
+
"@ohif/i18n": "3.14.0-beta.50",
|
|
28
32
|
"dcmjs": "0.52.0",
|
|
29
33
|
"dicom-parser": "1.8.21",
|
|
30
34
|
"hammerjs": "2.0.8",
|
|
31
|
-
"
|
|
32
|
-
"react": "18.3.1",
|
|
33
|
-
"@ohif/core": "3.14.0-beta.5",
|
|
34
|
-
"@ohif/extension-default": "3.14.0-beta.5",
|
|
35
|
-
"@ohif/ui": "3.14.0-beta.5",
|
|
36
|
-
"@ohif/i18n": "3.14.0-beta.5",
|
|
37
|
-
"@ohif/extension-cornerstone": "3.14.0-beta.5"
|
|
35
|
+
"react": "19.2.7"
|
|
38
36
|
},
|
|
39
37
|
"dependencies": {
|
|
40
38
|
"@babel/runtime": "7.29.7",
|
|
41
|
-
"@cornerstonejs/core": "5.
|
|
42
|
-
"@cornerstonejs/tools": "5.
|
|
39
|
+
"@cornerstonejs/core": "5.10.3",
|
|
40
|
+
"@cornerstonejs/tools": "5.10.3",
|
|
43
41
|
"classnames": "2.5.1"
|
|
44
42
|
},
|
|
45
43
|
"devDependencies": {
|