UNPKG

dicomweb-proxy

Version:

A proxy to translate between dicomweb and dimse

1 lines 370 kB
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[7241],{35392:(e,t,n)=>{n.d(t,{K:()=>w,i:()=>f});var o=n(86326),i=n(99993),a=n(55530),r=n.n(a),s=n(2836),l=n(15327);function c({colormaps:e,viewportId:t,displaySets:n,commandsManager:i,servicesManager:a}){const{cornerstoneViewportService:r}=a.services,[c,d]=(0,o.useState)(n[0]),[m,p]=(0,o.useState)(!1),[u,g]=(0,o.useState)(null),S=(0,o.useRef)(m);S.current=m;const I=(0,o.useRef)(u);I.current=u;const v=(0,o.useRef)(c);v.current=c;const y=(0,o.useCallback)((e=>{const t=n.length>1&&!["Grayscale","X Ray"].includes(e.colormap.name)?.5:1;i.run({commandName:"setViewportColormap",commandOptions:{...e,opacity:t,immediate:!0},context:"CORNERSTONE"})}),[i]),h=n.findIndex((e=>e.displaySetInstanceUID===v.current.displaySetInstanceUID));return(0,o.useEffect)((()=>{d(n[n.length-1])}),[n]),o.createElement(o.Fragment,null,n.length>1&&o.createElement("div",{className:"flex h-8 w-full flex-shrink-0 items-center justify-center px-2 text-base"},o.createElement(s.tUM,{value:String(h),onValueChange:e=>{const t=parseInt(e,10);d(n[t]),g(null)}},o.createElement(s.j7C,null,n.map(((e,t)=>o.createElement(s.Xib,{key:t,value:String(t)},e.Modality)))))),o.createElement("div",{className:"hover:bg-accent flex h-8 w-full flex-shrink-0 cursor-pointer items-center px-2 text-base hover:rounded",onClick:()=>p(!m)},o.createElement("span",{className:"flex-shrink-0"},"Preview in viewport"),o.createElement(s.dOG,{className:"ml-auto flex-shrink-0",checked:m,onCheckedChange:e=>{p(e)}})),o.createElement(s.se.DividerItem,null),o.createElement(s.se.ItemPanel,{maxHeight:"calc(100vh - 250px)",className:"min-h-[200px] flex-grow"},e.map(((n,i)=>o.createElement(s.se.Item,{key:i,label:n.description,useIconSpace:!1,onClick:()=>{y({viewportId:t,colormap:n,displaySetInstanceUID:v.current.displaySetInstanceUID}),g(null)},onMouseEnter:()=>{S.current&&(g(((t,n)=>{const{displaySetInstanceUID:o}=n,i=r.getCornerstoneViewport(t);if(i instanceof l.StackViewport){const{colormap:t}=i.getProperties();return t||e.find((e=>"Grayscale"===e.Name))||e[0]}const a=i.getActors(),s=a?.find((e=>e.referencedId.includes(o))),{colormap:c}=i.getProperties(s.referencedId);return c||e.find((e=>"Grayscale"===e.Name))||e[0]})(t,v.current)),y({viewportId:t,colormap:n,displaySetInstanceUID:v.current.displaySetInstanceUID}))},onMouseLeave:()=>{S.current&&I.current&&y({viewportId:t,colormap:I.current,displaySetInstanceUID:v.current.displaySetInstanceUID})}})))))}function d(e,t,n,o,i){const{cornerstoneViewportService:a}=o.services,r=a.getCornerstoneViewport(e),s=a.getViewportInfo(e).getViewportOptions().background;!!s&&l.utilities.isEqual(s,[1,1,1])&&(i.ticks={position:"left",style:{font:"13px Inter",color:"#000000",maxNumTicks:8,tickSize:5,tickWidth:1,labelMargin:3}});const c=[];r instanceof l.StackViewport&&c.push(e),r instanceof l.VolumeViewport&&t.forEach((e=>{c.push(e.displaySetInstanceUID)})),n.run({commandName:"toggleViewportColorbar",commandOptions:{viewportId:e,options:i,displaySetInstanceUIDs:c},context:"CORNERSTONE"})}function m({viewportId:e,displaySets:t,commandsManager:n,servicesManager:i,colorbarProperties:a}){const{colorbarService:r}=i.services,{width:l,colorbarTickPosition:c,colorbarContainerPosition:m,colormaps:p,colorbarInitialColormap:u}=a,[g,S]=(0,o.useState)(r.hasColorbar(e)),I=(0,o.useCallback)((()=>{d(e,t,n,i,{viewportId:e,colormaps:p,ticks:{position:c},width:l,position:m,activeColormapName:u})}),[n]);return(0,o.useEffect)((()=>{const{unsubscribe:t}=r.subscribe(r.EVENTS.STATE_CHANGED,(()=>{S(r.hasColorbar(e))}));return()=>{t()}}),[e]),o.createElement("div",{className:"hover:bg-accent flex h-8 w-full flex-shrink-0 cursor-pointer items-center px-2 text-base hover:rounded",onClick:e=>{e.stopPropagation(),I()}},o.createElement("div",{className:"flex w-7 flex-shrink-0 items-center justify-center"}),o.createElement("span",{className:"flex-grow"},"Display Color bar"),o.createElement(s.dOG,{className:"ml-2 flex-shrink-0",checked:g,onClick:e=>{e.stopPropagation(),I()}}))}function p({viewportId:e,commandsManager:t,presets:n}){const{t:a}=(0,i.Bd)("WindowLevelActionMenu"),r=(0,o.useCallback)((n=>{t.run({commandName:"setViewportWindowLevel",commandOptions:{...n,viewportId:e},context:"CORNERSTONE"})}),[t,e]);return o.createElement(s.se.ItemPanel,null,n.map(((e,t)=>o.createElement(o.Fragment,{key:t},Object.entries(e).map((([e,t])=>o.createElement(o.Fragment,{key:e},o.createElement(s.se.HeaderItem,null,a("Modality Presets",{modality:e})),t.map(((t,n)=>o.createElement(s.se.Item,{key:`${e}-${n}`,label:t.description,secondaryLabel:`${t.window} / ${t.level}`,useIconSpace:!1,onClick:()=>r(t)}))))))))))}function u({presets:e,viewportId:t,commandsManager:n,hide:i}){const[a,r]=(0,o.useState)(""),[l,c]=(0,o.useState)(null),d=(0,o.useCallback)((e=>{r(e.target.value)}),[]),m=(0,o.useCallback)((e=>{n.runCommand("setViewportPreset",{...e})}),[n]),p=a?e.filter((e=>e.name.toLowerCase().includes(a.toLowerCase()))):e;return o.createElement(s.MUF,{className:"h-[500px]"},o.createElement(s.MUF.PresetBody,null,o.createElement(s.MUF.PresetFilter,null,o.createElement(s.MUF.PresetSearch,{value:a,onChange:d,placeholder:"Search all"})),o.createElement(s.MUF.PresetGrid,null,p.map(((e,n)=>{return o.createElement("div",{key:n,className:"flex cursor-pointer flex-col items-start",onClick:()=>{c(e),m({preset:e.name,viewportId:t})}},o.createElement(s.FI1.ByName,{name:e.name,className:l?.name===e.name?"border-highlight h-[75px] w-[95px] max-w-none rounded border-2":"hover:border-highlight h-[75px] w-[95px] max-w-none rounded border-2 border-black"}),o.createElement("label",{className:"text-muted-foreground mt-1 text-left text-xs"},(i=e.name,a=11,i.length>a?`${i.slice(0,a)}...`:i)));var i,a})))),o.createElement(s.esu,{className:"mt-4 flex-shrink-0"},o.createElement(s.esu.Right,null,o.createElement(s.esu.Secondary,{onClick:i},"Cancel"))))}function g({viewportId:e,servicesManager:t,commandsManager:n,volumeRenderingPresets:i}){const{uiDialogService:a}=t.services;return o.createElement(s.se.Item,{label:"Rendering Presets",icon:o.createElement(s.FI1.VolumeRendering,null),rightIcon:o.createElement(s.FI1.ByName,{name:"action-new-dialog"}),onClick:()=>{a.show({id:"volume-rendering-presets",content:u,title:"Rendering Presets",isDraggable:!0,contentProps:{presets:i,viewportId:e,commandsManager:n}})}})}function S({volumeRenderingQualityRange:e,commandsManager:t,servicesManager:n,viewportId:i}){const{cornerstoneViewportService:a}=n.services,{min:r,max:l,step:c}=e,[d,m]=(0,o.useState)(null),p=(0,o.useCallback)((e=>{t.runCommand("setVolumeRenderingQulaity",{viewportId:i,volumeQuality:e}),m(e)}),[t,i]);return(0,o.useEffect)((()=>{const e=a.getCornerstoneViewport(i),{actor:t}=e.getActors()[0],n=t.getMapper(),o=n.getInputData().getSpacing(),r=n.getSampleDistance(),s=o.reduce(((e,t)=>e+t))/3;m(r===s?1:Math.sqrt(s/(.5*r)))}),[a,i]),o.createElement("div",{className:"my-1 mt-2 flex flex-col space-y-2"},null!==d&&o.createElement("div",{className:"w-full pl-2 pr-1"},o.createElement(s.ewR.Container,{mode:"singleRange",min:r,max:l,step:c,value:d,onChange:p},o.createElement("div",{className:"flex flex-row items-center"},o.createElement(s.ewR.Label,{className:"w-16"},"Quality"),o.createElement(s.ewR.SingleRange,{sliderClassName:"mx-2 flex-grow"})))))}function I({viewportId:e,commandsManager:t,servicesManager:n}){const{cornerstoneViewportService:i}=n.services,[a,r]=(0,o.useState)(null),[l,c]=(0,o.useState)(null),[d,m]=(0,o.useState)(i.getCornerstoneViewport(e)?.shiftedBy||0),[p,u]=(0,o.useState)(null),[g,S]=(0,o.useState)(!1),I=(0,o.useRef)(d),v=i.getCornerstoneViewport(e),{actor:y}=v.getActors()[0],h=y.getProperty().getScalarOpacity(0);(0,o.useEffect)((()=>{if(g)return;const e=h.getRange(),t=e[1]-e[0],n=t;r(-t),c(n),u(Math.pow(10,Math.floor(Math.log10(t/500))))}),[i,e,y,h,g]);const f=(0,o.useCallback)((n=>{const o=n-I.current;I.current=n,v.shiftedBy=n,t.runCommand("shiftVolumeOpacityPoints",{viewportId:e,shift:o}),m(n)}),[t,e,v]);return o.createElement("div",{className:"my-1 mt-2 flex flex-col space-y-2"},null!==p&&null!==a&&null!==l&&o.createElement("div",{className:"w-full pl-2 pr-1"},o.createElement(s.ewR.Container,{mode:"singleRange",min:a,max:l,step:p,value:d,onChange:f,onMouseDown:()=>S(!0),onMouseUp:()=>S(!1)},o.createElement("div",{className:"flex flex-row items-center"},o.createElement(s.ewR.Label,{className:"w-16"},"Shift"),o.createElement(s.ewR.SingleRange,{sliderClassName:"mx-2 flex-grow"})))))}function v({servicesManager:e,commandsManager:t,viewportId:n,hasShade:i}){const{cornerstoneViewportService:a}=e.services,[r,l]=(0,o.useState)({ambient:null,diffuse:null,specular:null}),c=(0,o.useCallback)(((e,o)=>{t.runCommand("setVolumeLighting",{viewportId:n,options:{[e]:o}}),l((t=>({...t,[e]:o})))}),[t,n]);(0,o.useEffect)((()=>{const e=a.getCornerstoneViewport(n),{actor:t}=e.getActors()[0],o=t.getProperty(),i={ambient:o.getAmbient(),diffuse:o.getDiffuse(),specular:o.getSpecular()};l(i)}),[n,a]);const d=i?"":"ohif-disabled !opacity-40";return o.createElement("div",{className:"my-1 mt-2 flex flex-col space-y-2"},[{key:"ambient",label:"Ambient"},{key:"diffuse",label:"Diffuse"},{key:"specular",label:"Specular"}].map((({key:e,label:t})=>null!==r[e]&&o.createElement("div",{key:e,className:`w-full pl-2 pr-1 ${d}`},o.createElement(s.ewR.Container,{mode:"singleRange",min:0,max:1,step:.1,value:r[e],onChange:t=>c(e,t)},o.createElement("div",{className:"flex flex-row items-center"},o.createElement(s.ewR.Label,{className:"w-16"},t),o.createElement(s.ewR.SingleRange,{sliderClassName:"mx-2 flex-grow"})))))))}function y({commandsManager:e,viewportId:t,servicesManager:n,onClickShade:i=(e=>{})}){const{cornerstoneViewportService:a}=n.services,[r,l]=(0,o.useState)(!0),[c,d]=(0,o.useState)(0),m=(0,o.useCallback)((n=>{e.runCommand("setVolumeLighting",{viewportId:t,options:{shade:n}})}),[e,t]);return(0,o.useEffect)((()=>{const e=a.getCornerstoneViewport(t),{actor:n}=e.getActors()[0],o=n.getProperty().getShade();l(o),i(o),d(c+1)}),[t,a]),o.createElement(o.Fragment,null,o.createElement("span",{className:"flex-grow"},"Shade"),o.createElement(s.dOG,{className:"ml-2 flex-shrink-0",key:c,checked:r,onCheckedChange:()=>{l(!r),i(!r),m(!r)}}))}function h({viewportId:e,commandsManager:t,volumeRenderingQualityRange:n,servicesManager:i}){const[a,r]=(0,o.useState)(!1);return o.createElement(s.se.ItemPanel,null,o.createElement(S,{viewportId:e,commandsManager:t,servicesManager:i,volumeRenderingQualityRange:n}),o.createElement(I,{viewportId:e,commandsManager:t,servicesManager:i}),o.createElement("div",{className:"mt-2 flex h-8 !h-[20px] w-full flex-shrink-0 items-center justify-start px-2 text-base"},o.createElement("div",{className:"text-muted-foreground text-sm"},"Lighting")),o.createElement("div",{className:"bg-background mt-1 mb-1 h-px w-full"}),o.createElement("div",{className:"hover:bg-accent flex h-8 w-full flex-shrink-0 items-center px-2 text-base hover:rounded"},o.createElement(y,{commandsManager:t,servicesManager:i,viewportId:e,onClickShade:r})),o.createElement(v,{viewportId:e,commandsManager:t,servicesManager:i,hasShade:a}))}const f=["SR","SEG","SM","RTSTRUCT","RTPLAN","RTDOSE"];function w({viewportId:e,element:t,presets:n,verticalDirection:a,horizontalDirection:u,commandsManager:S,servicesManager:I,colorbarProperties:v,displaySets:y,volumeRenderingPresets:w,volumeRenderingQualityRange:E}){const{colormaps:T,colorbarContainerPosition:b,colorbarInitialColormap:D,colorbarTickPosition:C,width:O}=v,{colorbarService:M,cornerstoneViewportService:N}=I.services,V=N.getViewportInfo(e),R=N.getCornerstoneViewport(e),A=V?.getViewportOptions().background,U=!!A&&l.utilities.isEqual(A,[1,1,1]),{t:P}=(0,i.Bd)("WindowLevelActionMenu"),[x]=(0,s.ihW)(),{activeViewportId:F}=x,[_,L]=(0,o.useState)(t?.clientHeight),[G,k]=(0,o.useState)(0),[z,B]=(0,o.useState)(!1),$=(0,o.useCallback)((()=>{d(e,y,S,I,{colormaps:T,ticks:{position:C},width:O,position:b,activeColormapName:D})}),[S]);return(0,o.useEffect)((()=>{const e=t?.clientHeight;_!==e&&L(e)}),[t,_]),(0,o.useEffect)((()=>{M.hasColorbar(e)&&window.setTimeout((()=>{M.removeColorbar(e),$()}),0)}),[e,y,R]),(0,o.useEffect)((()=>{k(G+1);N.getCornerstoneViewport(e)instanceof l.VolumeViewport3D?B(!0):B(!1)}),[y,e,n,E,w,v,F,x]),o.createElement(s.se.IconMenu,{icon:"viewport-window-level",verticalDirection:a,horizontalDirection:u,iconClassName:r()(F===e?"visible":"invisible group-hover/pane:visible","flex shrink-0 cursor-pointer rounded active:text-foreground text-highlight",U?" hover:bg-primary/30":"hover:bg-primary/30"),menuStyle:{maxHeight:_-32,minWidth:218},onVisibilityChange:()=>{L(t.clientHeight)},menuKey:G},o.createElement(s.se.ItemPanel,null,!z&&o.createElement(m,{viewportId:e,displaySets:y.filter((e=>!f.includes(e.Modality))),commandsManager:S,servicesManager:I,colorbarProperties:v}),T&&!z&&o.createElement(s.se.SubMenu,{key:"colorLUTPresets",itemLabel:"Color LUT",itemIcon:"icon-color-lut",className:"flex h-[calc(100%-32px)] flex-col"},o.createElement(c,{className:"flex h-full w-full flex-col",colormaps:T,viewportId:e,displaySets:y.filter((e=>!f.includes(e.Modality))),commandsManager:S,servicesManager:I})),n&&n.length>0&&!z&&o.createElement(s.se.SubMenu,{key:"windowLevelPresets",itemLabel:P("Modality Window Presets"),itemIcon:"viewport-window-level"},o.createElement(p,{viewportId:e,commandsManager:S,presets:n})),w&&z&&o.createElement(g,{servicesManager:I,viewportId:e,commandsManager:S,volumeRenderingPresets:w}),E&&z&&o.createElement(s.se.SubMenu,{itemLabel:"Rendering Options"},o.createElement(h,{viewportId:e,commandsManager:S,volumeRenderingQualityRange:E,servicesManager:I}))))}},76255:(e,t,n)=>{n.d(t,{It:()=>d,R4:()=>m});var o=n(86326),i=n(97598),a=n.n(i),r=n(2836),s=n(77954);const l={default:{[r.ldS.topLeft]:[],[r.ldS.topRight]:[],[r.ldS.bottomLeft]:[],[r.ldS.bottomRight]:[]}},c=(0,o.createContext)(l);function d({children:e,service:t}){const[n,i]=(0,o.useReducer)(((e,t)=>{switch(t.type){case"ADD_ACTION_COMPONENT":{const{viewportId:n,id:o,component:i,location:a,indexPriority:s}=t.payload;let l=e?.[n]?.[a]?[...e[n][a]]:[];const c=l.findIndex((e=>e.id===o));if(-1!==c&&(l=[...l.slice(0,c),...l.slice(c+1)]),i){let e;const t=a===r.ldS.topRight||a===r.ldS.bottomRight;void 0===s?e=t?0:l.length:(e=t?l.findIndex((e=>s>e.indexPriority)):l.findIndex((e=>s<=e.indexPriority)),-1===e&&(e=t?0:l.length));const n=t?Number.MIN_SAFE_INTEGER:Number.MAX_SAFE_INTEGER;l=[...l.slice(0,e),{id:o,component:i,indexPriority:s??n},...l.slice(e)]}return{...e,[n]:{...e[n],[a]:l}}}case"CLEAR_ACTION_COMPONENTS":{const n=t.payload,o={...e};return delete o[n],o}default:return{...e}}}),l),a=(0,o.useCallback)((()=>n),[n]),s=(0,o.useCallback)((e=>{i({type:"ADD_ACTION_COMPONENT",payload:e})}),[i]),d=(0,o.useCallback)((e=>{e.forEach((e=>i({type:"ADD_ACTION_COMPONENT",payload:e})))}),[i]),m=(0,o.useCallback)((e=>i({type:"CLEAR_ACTION_COMPONENTS",payload:e})),[i]);(0,o.useEffect)((()=>{t&&t.setServiceImplementation({getState:a,addComponent:s,addComponents:d,clear:m})}),[a,t,s,d,m]);const p={getState:a,addComponent:e=>t.addComponent(e),addComponents:e=>t.addComponents(e),clear:e=>t.clear(e)},u=(0,o.useMemo)((()=>[n,p]),[n,p]);return o.createElement(c.Provider,{value:u},e)}d.propTypes={children:a().node,service:a().instanceOf(s.A).isRequired};const m=()=>(0,o.useContext)(c)},73421:(e,t,n)=>{n.d(t,{j:()=>c});var o=n(86326),i=n(62051),a=n.n(i),r=n(80735),s=n(62037);function l(e,t){const{label:n,segments:o}=e,i=t.getCustomization("panelSegmentation.readableText");function a(e,t=0){const n=[],o=" ".repeat(t);for(const s in e)if(Object.prototype.hasOwnProperty.call(e,s)){const l=e[s],c=i?.[s];if(!c)continue;"object"!=typeof l||null===l||Array.isArray(l)?n.push(`${o}${c}: ${(0,r.Wf)(l,2)}`):(n.length>0&&n.push(""),n.push(`${o}${c}`),n.push(...a(l,t+1)))}return n}const s=e=>{const t={primary:[],secondary:[]};if(e.cachedStats){const n=a(e.cachedStats);t.primary=n}return t},l={};return Object.entries(o).forEach((([e,t])=>{l[e]={...t,displayText:s(t)}})),{...e,label:n,segments:l}}function c(e){const{subscribeToDataModified:t=!1,debounceTime:n=0}=e||{},{servicesManager:i}=(0,s.Jg)(),{segmentationService:r,customizationService:c}=i.services,[d,m]=(0,o.useState)([]);return(0,o.useEffect)((()=>{const e=()=>{const e=r.getSegmentations();if(!e?.length)return void m([]);const t=e.map((e=>l(e,c)));m(t)},o=n>0?a()(e,n,{leading:!0,trailing:!0}):e;e();const i=[r.subscribe(r.EVENTS.SEGMENTATION_MODIFIED,o),r.subscribe(r.EVENTS.SEGMENTATION_REMOVED,o)];return t&&i.push(r.subscribe(r.EVENTS.SEGMENTATION_DATA_MODIFIED,o)),()=>{i.forEach((e=>e.unsubscribe())),n>0&&o.cancel()}}),[r,c,n,t]),d}},7241:(e,t,n)=>{n.r(t),n.d(t,{AccordionGroup:()=>ai,CloneChildren:()=>oi,CornerstoneViewportDownloadForm:()=>Zt,DicomUpload:()=>At,Enums:()=>m,ImageOverlayViewerTool:()=>R,MeasumentsMenu:()=>Ui,MeasurementOrAdditionalFindingSets:()=>Si,MeasurementsOrAdditionalFindings:()=>vi,PanelMeasurement:()=>Mi,PanelSegmentation:()=>jo,PlanarFreehandROI:()=>Q,RectangleROI:()=>Z,SeriesMeasurementTrigger:()=>zi,SeriesMeasurements:()=>Bi,StudyMeasurements:()=>Ci,StudyMeasurementsActions:()=>wi,StudySummaryFromMetadata:()=>fi,Types:()=>a,default:()=>Ki,dicomLoaderService:()=>Eo,findNearbyToolData:()=>Re,getActiveViewportEnabledElement:()=>w,getEnabledElement:()=>f.kJ,getSOPInstanceAttributes:()=>_,groupByDisplaySet:()=>ki,groupByNamedSets:()=>Ii,groupByStudy:()=>Di,measurementMappingUtils:()=>i,setEnabledElement:()=>f.ye,toolNames:()=>A,useActiveViewportSegmentationRepresentations:()=>Bo,useLutPresentationStore:()=>ze.I,useMeasurements:()=>$o,usePositionPresentationStore:()=>Be.q,useSegmentationPresentationStore:()=>$e.v,useSegmentations:()=>Vi.j,useSynchronizersStore:()=>qt.U,utils:()=>Ai});var o={};n.r(o),n.d(o,{rM:()=>c,yK:()=>d,Ay:()=>m});var i={};n.r(i),n.d(i,{getDisplayUnit:()=>$,getFirstAnnotationSelected:()=>B,getHandlesFromPoints:()=>G,getSOPInstanceAttributes:()=>_,isAnnotationSelected:()=>k,setAnnotationSelected:()=>z});var a={};n.r(a);var r=n(86326),s=n(15327),l=n(4667);const c="Cornerstone3DTools",d="0.1",m={CORNERSTONE_3D_TOOLS_SOURCE_NAME:c,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:d};var p=n(62037),u=n(19742),g=n(43213),S=n(79453);const{registerVolumeLoader:I}=s.volumeLoader;var v=n(66123),y=n(56983),h=n(43984),f=n(71353);function w(e){const{activeViewportId:t}=e.getState(),{element:n}=(0,f.kJ)(t)||{};return(0,s.getEnabledElement)(n)}const{calibrateImageSpacing:E}=l.utilities;class T extends l.LengthTool{constructor(...e){super(...e),this._renderingViewport=void 0,this._lengthToolRenderAnnotation=this.renderAnnotation,this.renderAnnotation=(e,t)=>{const{viewport:n}=e;return this._renderingViewport=n,this._lengthToolRenderAnnotation(e,t)}}_getTextLines(e,t){const[n,o]=e.handles.points.map((e=>this._renderingViewport.worldToCanvas(e)));return[`${Math.round(100*function(e,t){const n=e[0]-t[0],o=e[1]-t[1];return Math.sqrt(n*n+o*o)}(n,o))/100}px`]}}T.toolName="CalibrationLine";const b=T;function D(e,t){const{uiDialogService:n,viewportGridService:o}=e.services,i=t.detail,{annotation:{metadata:a,data:r}}=i,{referencedImageId:s}=a,l=w(o),{viewport:c}=l,d=Math.round(100*function(e,t){const n=e[0]-t[0],o=e[1]-t[1],i=e[2]-t[2];return Math.sqrt(n*n+o*o+i*i)}(r.handles.points[0],r.handles.points[1]))/100;return new Promise(((e,t)=>{n?(0,h.callInputDialog)({uiDialogService:n,title:"Calibration",placeholder:"Actual Physical distance (mm)",defaultValue:`${d}`}).then((t=>{(e=>{const t=e/d;E(s,c.getRenderingEngine(),{type:"User",scale:1/t})})(Number.parseFloat(t)),e(!0)})):t("UIDialogService is not initiated")}))}var C=n(80735);const O=new Map,M={add:(e,t)=>{O.get(e)!==t&&O.set(e,t)},get:(e,t)=>{if(!Array.isArray(t)&&"overlayPlaneModule"===e)return O.get(t)}};s.metaData.addProvider(M.get,1e4);const N=M;class V extends l.AnnotationDisplayTool{constructor(e={},t={supportedInteractionTypes:[],configuration:{fillColor:[255,127,127,255]}}){super(e,t),this.onSetToolDisabled=()=>{},this.renderAnnotation=(e,t)=>{const{viewport:n}=e,o=this.getReferencedImageId(n);if(!o)return;const i=s.metaData.get("overlayPlaneModule",o),a=i?.overlays;return a?.length?(a.forEach((e=>{e.x||=0,e.y||=0})),V.addOverlayPlaneModule(o,i),this._getCachedStat(o,i,this.configuration.fillColor).then((n=>{n.overlays.forEach((n=>{this._renderOverlay(e,t,n)}))})),!0):void 0}}getReferencedImageId(e){if(e instanceof s.VolumeViewport)return;return this.getTargetId(e).split("imageId:")[1]}_renderOverlay(e,t,n){const{viewport:o}=e,i=this.getReferencedImageId(o);if(!i)return;const{_id:a,columns:r,rows:c,x:d,y:m}=n,p=s.utilities.imageToWorldCoords(i,[d-1,m-1]),u=o.worldToCanvas(p),g=s.utilities.imageToWorldCoords(i,[r,c]),S=o.worldToCanvas(g),I=`image-overlay-${a}`,v=t.getSvgNode(I),y={"data-id":I,width:S[0]-u[0],height:S[1]-u[1],x:u[0],y:u[1],href:n.dataUrl};if(isNaN(y.x)||isNaN(y.y)||isNaN(y.width)||isNaN(y.height))return console.warn("Invalid rendering attribute for image overlay",y["data-id"]),!1;if(v)l.drawing.setAttributesIfNecessary(y,v),t.setNodeTouched(I);else{const e=document.createElementNS("http://www.w3.org/2000/svg","image");l.drawing.setNewAttributesIfValid(y,e),t.appendNode(e,I)}return!0}async _getCachedStat(e,t,n){if(0===t.overlays.filter((e=>e.pixelData&&!e.dataUrl)).length)return t;const o=await Promise.all(t.overlays.filter((e=>e.pixelData)).map((async(e,t)=>{let o=null;if(e.pixelData.Value)o=e.pixelData.Value;else if(e.pixelData instanceof Array)o=e.pixelData[0];else if(e.pixelData.retrieveBulkData)o=await e.pixelData.retrieveBulkData();else if(e.pixelData.InlineBinary){const t=(0,C.Vk)(e.pixelData.InlineBinary);o=await t.arrayBuffer()}if(!o)return;const i=this._renderOverlayToDataUrl({width:e.columns,height:e.rows},e.color||n,o);return{...e,_id:(0,C.Os)(),dataUrl:i,color:n}})));return t.overlays=o,t}_isSameColor(e,t){return e&&t&&e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]}_renderOverlayToDataUrl({width:e,height:t},n,o){const i=new DataView(o),a=e*t,r=document.createElement("canvas");r.width=e,r.height=t;const s=r.getContext("2d");s.clearRect(0,0,e,t),s.globalCompositeOperation="copy";const l=s.getImageData(0,0,e,t),c=l.data;for(let e=0,t=0,o=0;e<a;e++)i.getUint8(o)&1<<t&&(c[4*e]=n[0],c[4*e+1]=n[1],c[4*e+2]=n[2],c[4*e+3]=n[3]),t>=7?(t=0,o++):t++;return s.putImageData(l,0,0),r.toDataURL()}}V.toolName="ImageOverlayViewer",V.addOverlayPlaneModule=N.add;const R=V;const A={Pan:l.PanTool.toolName,ArrowAnnotate:l.ArrowAnnotateTool.toolName,WindowLevel:l.WindowLevelTool.toolName,StackScroll:l.StackScrollTool.toolName,Zoom:l.ZoomTool.toolName,VolumeRotate:l.VolumeRotateTool.toolName,MipJumpToClick:l.MIPJumpToClickTool.toolName,Length:l.LengthTool.toolName,DragProbe:l.DragProbeTool.toolName,Probe:l.ProbeTool.toolName,RectangleROI:l.RectangleROITool.toolName,RectangleROIThreshold:l.RectangleROIThresholdTool.toolName,EllipticalROI:l.EllipticalROITool.toolName,CircleROI:l.CircleROITool.toolName,Bidirectional:l.BidirectionalTool.toolName,Angle:l.AngleTool.toolName,CobbAngle:l.CobbAngleTool.toolName,Magnify:l.MagnifyTool.toolName,Crosshairs:l.CrosshairsTool.toolName,Brush:l.BrushTool.toolName,PaintFill:l.PaintFillTool.toolName,ReferenceLines:l.ReferenceLinesTool.toolName,CalibrationLine:b.toolName,TrackballRotateTool:l.TrackballRotateTool.toolName,CircleScissors:l.CircleScissorsTool.toolName,RectangleScissors:l.RectangleScissorsTool.toolName,SphereScissors:l.SphereScissorsTool.toolName,ImageOverlayViewer:R.toolName,AdvancedMagnify:l.AdvancedMagnifyTool.toolName,UltrasoundDirectional:l.UltrasoundDirectionalTool.toolName,SplineROI:l.SplineROITool.toolName,LivewireContour:l.LivewireContourTool.toolName,PlanarFreehandROI:l.PlanarFreehandROITool.toolName,OrientationMarker:l.OrientationMarkerTool.toolName,WindowLevelRegion:l.WindowLevelRegionTool.toolName,PlanarFreehandContourSegmentation:l.PlanarFreehandContourSegmentationTool.toolName,SegmentBidirectional:l.SegmentBidirectionalTool.toolName,SegmentSelect:l.SegmentSelectTool.toolName,LabelmapSlicePropagation:v.Bj.toolName,MarkerLabelmap:v.pY.toolName,RegionSegmentPlus:l.RegionSegmentPlusTool.toolName},U=["Length","EllipticalROI","CircleROI","Bidirectional","ArrowAnnotate","Angle","CobbAngle","Probe","RectangleROI","PlanarFreehandROI","SplineROI","LivewireContour","UltrasoundDirectionalTool","SCOORD3DPoint","SegmentBidirectional"];var P=n(47807);const x=e=>P.locking.isAnnotationLocked(e),F=e=>P.visibility.isAnnotationVisible(e);function _(e,t,n){if(e)return function(e){const t=s.metaData.get("instance",e);return{SOPInstanceUID:t.SOPInstanceUID,SeriesInstanceUID:t.SeriesInstanceUID,StudyInstanceUID:t.StudyInstanceUID,frameNumber:t.frameNumber||1}}(e);const{metadata:o}=n,{volumeId:i}=o,a=t.getDisplaySetsBy((e=>i.includes(e.uid)))[0],{StudyInstanceUID:r,SeriesInstanceUID:l}=a;return{SOPInstanceUID:void 0,SeriesInstanceUID:l,StudyInstanceUID:r}}const L={toAnnotation:e=>{},toMeasurement:(e,t,n,o,i)=>{const{annotation:a}=e,{metadata:r,data:s,annotationUID:l}=a,c=x(l),d=F(l);P.config.style.getStyleProperty("color",{annotationUID:l});if(!r||!s)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:u,FrameOfReferenceUID:g}=r;if(!U.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:S,SeriesInstanceUID:I,StudyInstanceUID:v}=_(u,t,a);let y;y=S?t.getDisplaySetForSOPInstanceUID(S,I):t.getDisplaySetsForSeries(I)[0];const{points:h,textBox:f}=s.handles,w=function(e,t){const{metadata:n,data:o}=e,{cachedStats:i}=o,{referencedImageId:a}=n;if(!Object.keys(i).length)return[];const r=[];return Object.keys(i).forEach((n=>{const o=i[n],{SOPInstanceUID:s,SeriesInstanceUID:l,frameNumber:c}=_(a,t,e),d=t.getDisplaySetsForSeries(l)[0],{SeriesNumber:m}=d,{length:p,unit:u="mm"}=o;r.push({SeriesInstanceUID:l,SOPInstanceUID:s,SeriesNumber:m,frameNumber:c,unit:u,length:p})})),r}(a,t),E=function(e,t){const n={primary:[],secondary:[]};if(!e||!e.length)return n;const{length:o,SeriesNumber:i,SOPInstanceUID:a,frameNumber:r,unit:s}=e[0],l=t.instances.find((e=>e.SOPInstanceUID===a));let c;l&&(c=l.InstanceNumber);const d=c?` I: ${c}`:"",m=t.isMultiFrame?` F: ${r}`:"";if(null==o)return n;const u=p.Wp.roundNumber(o,2);return n.primary.push(`${u} ${s}`),n.secondary.push(`S: ${i}${d}${m}`),n}(w,y);return{uid:l,SOPInstanceUID:S,FrameOfReferenceUID:g,points:h,textBox:f,isLocked:c,isVisible:d,metadata:r,referenceSeriesUID:I,referenceStudyUID:v,referencedImageId:u,frameNumber:w[0]?.frameNumber||1,toolName:r.toolName,displaySetInstanceUID:y.displaySetInstanceUID,label:s.label,displayText:E,data:s.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const i=[],a=[];i.push("AnnotationType"),a.push("Cornerstone:Length"),e.forEach((e=>{const{length:t,unit:n}=e;i.push("Length"),a.push(t),i.push("Unit"),a.push(n)})),n&&(i.push("FrameOfReferenceUID"),a.push(n));t&&(i.push("points"),a.push(t.map((e=>e.join(" "))).join(";")));return{columns:i,values:a}}(w,h,g)}}};function G(e){if(e.longAxis&&e.shortAxis){const t={};return t.start=e.longAxis[0],t.end=e.longAxis[1],t.perpendicularStart=e.longAxis[0],t.perpendicularEnd=e.longAxis[1],t}return e.map(((e,t)=>t%10==0?{start:e}:{end:e})).reduce(((e,t)=>Object.assign(e,{...t})),{})}function k(e){return l.annotation.selection.isAnnotationSelected(e)}function z(e,t){k(e)!==t&&l.annotation.selection.setAnnotationSelected(e,t)}function B(e){const[t]=l.annotation.selection.getAnnotationsSelected()||[];if(t)return l.annotation.state.getAnnotation(t)}const $=e=>null==e?"":e;const j={toAnnotation:e=>{},toMeasurement:(e,t,n,o,i)=>{const{annotation:a}=e,{metadata:r,data:s,annotationUID:l}=a,c=x(l),d=F(l);if(!r||!s)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:u,FrameOfReferenceUID:g}=r;if(!U.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:S,SeriesInstanceUID:I,StudyInstanceUID:v}=_(u,t,a);let y;y=S?t.getDisplaySetForSOPInstanceUID(S,I):t.getDisplaySetsForSeries(I)[0];const{points:h,textBox:f}=s.handles,w=function(e,t){const{metadata:n,data:o}=e,{cachedStats:i}=o,{referencedImageId:a}=n;if(!Object.keys(i).length)return[];const r=[];return Object.keys(i).forEach((n=>{const o=i[n],{SOPInstanceUID:s,SeriesInstanceUID:l,frameNumber:c}=_(a,t,e),d=t.getDisplaySetsForSeries(l)[0],{SeriesNumber:m}=d,{length:p,width:u,unit:g}=o;r.push({SeriesInstanceUID:l,SOPInstanceUID:s,SeriesNumber:m,frameNumber:c,unit:g,length:p,width:u})})),r}(a,t),E=function(e,t){const n={primary:[],secondary:[]};if(!e||!e.length)return n;const{length:o,width:i,unit:a,SeriesNumber:r,SOPInstanceUID:s,frameNumber:l}=e[0],c=p.Wp.roundNumber(o,2),d=p.Wp.roundNumber(i,2),m=t.instances.find((e=>e.SOPInstanceUID===s));let u;m&&(u=m.InstanceNumber);const g=u?` I: ${u}`:"",S=t.isMultiFrame?` F: ${l}`:"";return n.primary.push(`L: ${c} ${$(a)}`),n.primary.push(`W: ${d} ${$(a)}`),n.secondary.push(`S: ${r}${g}${S}`),n}(w,y);return{uid:l,SOPInstanceUID:S,FrameOfReferenceUID:g,points:h,textBox:f,isLocked:c,isVisible:d,metadata:r,referenceSeriesUID:I,referenceStudyUID:v,referencedImageId:u,frameNumber:w[0]?.frameNumber||1,toolName:r.toolName,displaySetInstanceUID:y.displaySetInstanceUID,label:s.label,displayText:E,data:s.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const i=[],a=[];i.push("AnnotationType"),a.push("Cornerstone:Bidirectional"),e.forEach((e=>{const{length:t,width:n,unit:o}=e;i.push("Length","Width","Unit"),a.push(t,n,o)})),n&&(i.push("FrameOfReferenceUID"),a.push(n));t&&(i.push("points"),a.push(t.map((e=>e.join(" "))).join(";")));return{columns:i,values:a}}(w,h,g)}}},W=(e,t,n)=>{if(Array.isArray(e)&&e.length>0){const o=e.map((e=>p.Wp.roundNumber(e,2)));return`${n.charAt(0).toUpperCase()+n.slice(1)}: ${o.join(", ")} ${$(t)}`}const o=p.Wp.roundNumber(e,2);return`${n.charAt(0).toUpperCase()+n.slice(1)}: ${o} ${$(t)}`};const H={toAnnotation:e=>{},toMeasurement:(e,t,n,o,i)=>{const{annotation:a}=e,{metadata:r,data:s,annotationUID:l}=a,c=x(l),d=F(l);if(!r||!s)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:u,FrameOfReferenceUID:g}=r;if(!U.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:S,SeriesInstanceUID:I,StudyInstanceUID:v}=_(u,t,a);let y;y=S?t.getDisplaySetForSOPInstanceUID(S,I):t.getDisplaySetsForSeries(I)[0];const{points:h,textBox:f}=s.handles,w=function(e,t){const{metadata:n,data:o}=e,{cachedStats:i}=o,{referencedImageId:a}=n;if(!Object.keys(i).length)return[];const r=[],s=new Set;return Object.keys(i).forEach((n=>{const o=i[n],{SOPInstanceUID:l,SeriesInstanceUID:c,frameNumber:d}=_(a,t,e),m=t.getDisplaySetsForSeries(c)[0],{SeriesNumber:p}=m,{mean:u,stdDev:g,max:S,area:I,Modality:v,areaUnit:y,modalityUnit:h}=o;v&&s.has(v)||(v&&s.add(v),r.push({SeriesInstanceUID:c,SOPInstanceUID:l,SeriesNumber:p,frameNumber:d,Modality:v,unit:h,areaUnit:y,mean:u,stdDev:g,max:S,area:I}))})),r}(a,t),E=function(e,t,n){const o={primary:[],secondary:[]};if(!e||!e.length)return o;const{area:i,SOPInstanceUID:a,frameNumber:r,areaUnit:s}=e[0],l=t.instances.find((e=>e.SOPInstanceUID===a));let c;l&&(c=l.InstanceNumber);const d=c?` I: ${c}`:"",m=t.isMultiFrame?` F: ${r}`:"",u=p.Wp.roundNumber(i,2);return o.primary.push(`${u} ${$(s)}`),e.forEach((e=>{const{unit:t,max:n,SeriesNumber:i}=e,a=W(n,t,"max");o.primary.push(a),o.secondary.push(`S: ${i}${d}${m}`)})),o}(w,y);return{uid:l,SOPInstanceUID:S,FrameOfReferenceUID:g,points:h,textBox:f,metadata:r,isLocked:c,isVisible:d,referenceSeriesUID:I,referenceStudyUID:v,referencedImageId:u,frameNumber:w[0]?.frameNumber||1,toolName:r.toolName,displaySetInstanceUID:y.displaySetInstanceUID,label:s.label,displayText:E,data:s.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const i=[],a=[];i.push("AnnotationType"),a.push("Cornerstone:EllipticalROI"),e.forEach((e=>{const{mean:t,stdDev:n,max:o,area:r,unit:s,areaUnit:l}=e;t&&s&&o&&r&&(i.push(`max (${s})`,`mean (${s})`,`std (${s})`,"Area","Unit"),a.push(o,t,n,r,l))})),n&&(i.push("FrameOfReferenceUID"),a.push(n));t&&(i.push("points"),a.push(t.map((e=>e.join(" "))).join(";")));return{columns:i,values:a}}(w,h,g)}}};const q={toAnnotation:e=>{},toMeasurement:(e,t,n,o,i)=>{const{annotation:a}=e,{metadata:r,data:s,annotationUID:l}=a,c=x(l),d=F(l);if(!r||!s)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:u,FrameOfReferenceUID:g}=r;if(!U.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:S,SeriesInstanceUID:I,StudyInstanceUID:v}=_(u,t,a);let y;y=S?t.getDisplaySetForSOPInstanceUID(S,I):t.getDisplaySetsForSeries(I)[0];const{points:h,textBox:f}=s.handles,w=function(e,t){const{metadata:n,data:o}=e,{cachedStats:i}=o,{referencedImageId:a}=n;if(!Object.keys(i).length)return[];const r=[],s=new Set;return Object.keys(i).forEach((n=>{const o=i[n],{SOPInstanceUID:l,SeriesInstanceUID:c,frameNumber:d}=_(a,t,e),m=t.getDisplaySetsForSeries(c)[0],{SeriesNumber:p}=m,{mean:u,stdDev:g,max:S,area:I,Modality:v,areaUnit:y,modalityUnit:h,perimeter:f,radiusUnit:w}=o;v&&s.has(v)||(s.add(v),r.push({SeriesInstanceUID:c,SOPInstanceUID:l,SeriesNumber:p,frameNumber:d,Modality:v,unit:h,mean:u,stdDev:g,max:S,area:I,areaUnit:y,perimeter:f,radiusUnit:w}))})),r}(a,t),E=function(e,t){const n={primary:[],secondary:[]};if(!e||!e.length)return n;const{area:o,SOPInstanceUID:i,frameNumber:a,areaUnit:r}=e[0],s=t.instances.find((e=>e.SOPInstanceUID===i));let l;s&&(l=s.InstanceNumber);const c=l?` I: ${l}`:"",d=t.isMultiFrame?` F: ${a}`:"";if(!isNaN(o)){const e=p.Wp.roundNumber(o||0,2);n.primary.push(`${e} ${$(r)}`)}return e.forEach((e=>{const{unit:t,perimeter:o,radiusUnit:i,max:a,SeriesNumber:r}=e;if(isNaN(a)){if(o&&!isNaN(o)){const e=W(o,i,"perimeter");n.primary.push(e)}}else{const e=W(a,t,"max");n.primary.push(e)}n.secondary.push(`S: ${r}${c}${d}`)})),n}(w,y);return{uid:l,SOPInstanceUID:S,FrameOfReferenceUID:g,points:h,textBox:f,isLocked:c,isVisible:d,metadata:r,referenceSeriesUID:I,referenceStudyUID:v,referencedImageId:u,frameNumber:w[0]?.frameNumber||1,toolName:r.toolName,displaySetInstanceUID:y.displaySetInstanceUID,label:s.label,displayText:E,data:s.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const i=[],a=[];i.push("AnnotationType"),a.push("Cornerstone:CircleROI"),e.forEach((e=>{const{mean:t,stdDev:n,max:o,area:r,unit:s,areaUnit:l}=e;t&&s&&o&&r&&(i.push(`max (${s})`,`mean (${s})`,`std (${s})`,"Area","Unit"),a.push(o,t,n,r,l))})),n&&(i.push("FrameOfReferenceUID"),a.push(n));t&&(i.push("points"),a.push(t.map((e=>e.join(" "))).join(";")));return{columns:i,values:a}}(w,h,g)}}};const Y={toAnnotation:e=>{},toMeasurement:(e,t,n,o,i)=>{const{annotation:a}=e,{metadata:r,data:s,annotationUID:l}=a,c=x(l),d=F(l);if(!r||!s)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:p,FrameOfReferenceUID:u}=r;if(!U.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:S,StudyInstanceUID:I}=_(p,t,a);let v;v=g?t.getDisplaySetForSOPInstanceUID(g,S):t.getDisplaySetsForSeries(S)[0];const{points:y,textBox:h}=s.handles,f=function(e,t){const{metadata:n,data:o}=e,{text:i}=o,{referencedImageId:a}=n,r=[],{SOPInstanceUID:s,SeriesInstanceUID:l,frameNumber:c}=_(a,t,e),d=t.getDisplaySetsForSeries(l)[0],{SeriesNumber:m}=d;return r.push({SeriesInstanceUID:l,SOPInstanceUID:s,SeriesNumber:m,frameNumber:c,text:i}),r}(a,t),w=function(e,t){const n={primary:[],secondary:[]};if(!e||!e.length)return n;const{SeriesNumber:o,SOPInstanceUID:i,frameNumber:a,text:r}=e[0],s=t.instances.find((e=>e.SOPInstanceUID===i));let l;s&&(l=s.InstanceNumber);const c=l?` I: ${l}`:"",d=t.isMultiFrame?` F: ${a}`:"";r&&n.primary.push(r);return n.secondary.push(`S: ${o}${c}${d}`),n}(f,v);return{uid:l,SOPInstanceUID:g,FrameOfReferenceUID:u,points:y,textBox:h,isLocked:c,isVisible:d,metadata:r,referenceSeriesUID:S,referenceStudyUID:I,referencedImageId:p,frameNumber:f[0]?.frameNumber||1,toolName:r.toolName,displaySetInstanceUID:v.displaySetInstanceUID,label:s.text,displayText:w,data:s.cachedStats,type:o(m),getReport:()=>function(e,t,n){const o=[],i=[];o.push("AnnotationType"),i.push("Cornerstone:ArrowAnnote"),e.forEach((e=>{const{text:t}=e;o.push("Text"),i.push(t)})),n&&(o.push("FrameOfReferenceUID"),i.push(n));t&&(o.push("points"),i.push(t.map((e=>e.join(" "))).join(";")));return{columns:o,values:i}}(f,y,u)}}};const J={toAnnotation:e=>{},toMeasurement:(e,t,n,o,i)=>{const{annotation:a}=e,{metadata:r,data:s,annotationUID:l}=a,c=x(l),d=F(l);if(!r||!s)return console.warn("Cobb Angle tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:u,FrameOfReferenceUID:g}=r;if(!U.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:S,SeriesInstanceUID:I,StudyInstanceUID:v}=_(u,t,a);let y;y=S?t.getDisplaySetForSOPInstanceUID(S,I):t.getDisplaySetsForSeries(I)[0];const{points:h,textBox:f}=s.handles,w=function(e,t){const{metadata:n,data:o}=e,{cachedStats:i}=o,{referencedImageId:a}=n;if(!Object.keys(i).length)return;const r=[];return Object.keys(i).forEach((n=>{const o=i[n],{SOPInstanceUID:s,SeriesInstanceUID:l,frameNumber:c}=_(a,t,e),d=t.getDisplaySetsForSeries(l)[0],{SeriesNumber:m}=d,{angle:p}=o,u="°";r.push({SeriesInstanceUID:l,SOPInstanceUID:s,SeriesNumber:m,frameNumber:c,unit:u,angle:p})})),r}(a,t),E=function(e,t){const n={primary:[],secondary:[]};if(!e||!e.length)return n;const{angle:o,unit:i,SeriesNumber:a,SOPInstanceUID:r,frameNumber:s}=e[0],l=t.instances.find((e=>e.SOPInstanceUID===r));let c;l&&(c=l.InstanceNumber);const d=c?` I: ${c}`:"",m=t.isMultiFrame?` F: ${s}`:"";if(void 0===o)return n;const u=p.Wp.roundNumber(o,2);return n.primary.push(`${u} ${$(i)}`),n.secondary.push(`S: ${a}${d}${m}`),n}(w,y);return{uid:l,SOPInstanceUID:S,FrameOfReferenceUID:g,points:h,textBox:f,isLocked:c,isVisible:d,metadata:r,referenceSeriesUID:I,referenceStudyUID:v,referencedImageId:u,frameNumber:w?.[0]?.frameNumber||1,toolName:r.toolName,displaySetInstanceUID:y.displaySetInstanceUID,label:s.label,displayText:E,data:s.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const i=[],a=[];i.push("AnnotationType"),a.push("Cornerstone:CobbAngle"),e.forEach((e=>{const{angle:t,unit:n}=e;i.push(`Angle (${n})`),a.push(t)})),n&&(i.push("FrameOfReferenceUID"),a.push(n));t&&(i.push("points"),a.push(t.map((e=>e.join(" "))).join(";")));return{columns:i,values:a}}(w,h,g)}}};const K={toAnnotation:e=>{},toMeasurement:(e,t,n,o,i)=>{const{annotation:a}=e,{metadata:r,data:s,annotationUID:l}=a,c=x(l),d=F(l);if(!r||!s)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:u,FrameOfReferenceUID:g}=r;if(!U.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:S,SeriesInstanceUID:I,StudyInstanceUID:v}=_(u,t,a);let y;y=S?t.getDisplaySetForSOPInstanceUID(S,I):t.getDisplaySetsForSeries(I)[0];const{points:h,textBox:f}=s.handles,w=function(e,t){const{metadata:n,data:o}=e,{cachedStats:i}=o,{referencedImageId:a}=n;if(!Object.keys(i).length)return;const r=[];return Object.keys(i).forEach((n=>{const o=i[n],{SOPInstanceUID:s,SeriesInstanceUID:l,frameNumber:c}=_(a,t,e),d=t.getDisplaySetsForSeries(l)[0],{SeriesNumber:m}=d,{angle:p}=o,u="°";r.push({SeriesInstanceUID:l,SOPInstanceUID:s,SeriesNumber:m,frameNumber:c,unit:u,angle:p})})),r}(a,t),E=function(e,t){const n={primary:[],secondary:[]};if(!e||!e.length)return n;const{angle:o,unit:i,SeriesNumber:a,SOPInstanceUID:r,frameNumber:s}=e[0],l=t.instances.find((e=>e.SOPInstanceUID===r));let c;l&&(c=l.InstanceNumber);const d=c?` I: ${c}`:"",m=t.isMultiFrame?` F: ${s}`:"";if(void 0===o)return n;const u=p.Wp.roundNumber(o,2);return n.primary.push(`${u} ${$(i)}`),n.secondary.push(`S: ${a}${d}${m}`),n}(w,y);return{uid:l,SOPInstanceUID:S,FrameOfReferenceUID:g,points:h,textBox:f,isLocked:c,isVisible:d,metadata:r,referenceSeriesUID:I,referenceStudyUID:v,frameNumber:w?.[0]?.frameNumber||1,toolName:r.toolName,displaySetInstanceUID:y.displaySetInstanceUID,label:s.label,displayText:E,data:s.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const i=[],a=[];i.push("AnnotationType"),a.push("Cornerstone:Angle"),e.forEach((e=>{const{angle:t,unit:n}=e;i.push(`Angle (${n})`),a.push(t)})),n&&(i.push("FrameOfReferenceUID"),a.push(n));t&&(i.push("points"),a.push(t.map((e=>e.join(" "))).join(";")));return{columns:i,values:a}}(w,h,g),referencedImageId:u}}};const Q={toAnnotation:e=>{},toMeasurement:(e,t,n,o,i)=>{const{annotation:a}=e,{metadata:r,data:s,annotationUID:l}=a,c=x(l),d=F(l);if(!r||!s)return console.debug("PlanarFreehandROI tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:u,FrameOfReferenceUID:g}=r;if(!U.includes(m))throw new Error(`Tool ${m} not supported`);const{SOPInstanceUID:S,SeriesInstanceUID:I,frameNumber:v,StudyInstanceUID:y}=_(u,t,a);let h;h=S?t.getDisplaySetForSOPInstanceUID(S,I):t.getDisplaySetsForSeries(I)[0];const f=function(e,t){const{metadata:n,data:o}=e,{cachedStats:i}=o,{referencedImageId:a}=n;if(!Object.keys(i).length)return[];const r=[];return Object.keys(i).forEach((n=>{const o=i[n],{SOPInstanceUID:s,SeriesInstanceUID:l,frameNumber:c}=_(a,t,e),d=t.getDisplaySetsForSeries(l)[0],{SeriesNumber:m}=d,{mean:p,stdDev:u,max:g,area:S,Modality:I,areaUnit:v,modalityUnit:y}=o;r.push({SeriesInstanceUID:l,SOPInstanceUID:s,SeriesNumber:m,frameNumber:c,Modality:I,unit:y,mean:p,stdDev:u,max:g,area:S,areaUnit:v})})),r}(a,t),w=function(e,t){const n={primary:[],secondary:[]};if(!e||!e.length)return n;const{area:o,SOPInstanceUID:i,frameNumber:a,areaUnit:r}=e[0],s=t.instances.find((e=>e.SOPInstanceUID===i));let l;s&&(l=s.InstanceNumber);const c=l?` I: ${l}`:"",d=t.isMultiFrame?` F: ${a}`:"",m=p.Wp.roundNumber(o||0,2);return n.primary.push(`${m} ${$(r)}`),e.forEach((e=>{const{unit:t,max:o,SeriesNumber:i}=e,a=W(o,t,"max");n.primary.push(a),n.secondary.push(`S: ${i}${c}${d}`)})),n}(f,h);return{uid:l,SOPInstanceUID:S,FrameOfReferenceUID:g,points:s.contour.polyline,textBox:s.handles.textBox,metadata:r,frameNumber:v,referenceSeriesUID:I,referenceStudyUID:y,referencedImageId:u,toolName:r.toolName,displaySetInstanceUID:h.displaySetInstanceUID,label:s.label,displayText:w,data:s.cachedStats,type:o(m),getReport:()=>function(e,t){const{PlanarFreehandROI:n}=t.getCustomization("cornerstone.measurements"),{report:o}=n,i=[],a=[];i.push("AnnotationType"),a.push("Cornerstone:PlanarFreehandROI");const{metadata:r,data:s}=e,l=s.cachedStats[`imageId:${r.referencedImageId}`];o.forEach((({name:e,value:t})=>{i.push(e),l[t]?a.push(l[t]):a.push("not available")})),r.FrameOfReferenceUID&&(i.push("FrameOfReferenceUID"),a.push(r.FrameOfReferenceUID));s.contour.polyline&&(i.push("points"),a.push(s.contour.polyline.map((e=>e.join(" "))).join(";")));return{columns:i,values:a}}(a,i),isLocked:c,isVisible:d}}};const Z={toAnnotation:e=>{},toMeasurement:(e,t,n,o,i)=>{const{annotation:a}=e,{metadata:r,data:s,annotationUID:l}=a,c=x(l),d=F(l);if(!r||!s)return console.warn("Rectangle ROI tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:u,FrameOfReferenceUID:g}=r;if(!U.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:S,SeriesInstanceUID:I,StudyInstanceUID:v}=_(u,t,a);let y;y=S?t.getDisplaySetForSOPInstanceUID(S,I):t.getDisplaySetsForSeries(I)[0];const{points:h,textBox:f}=s.handles,w=function(e,t){const{metadata:n,data:o}=e,{cachedStats:i}=o,{referencedImageId:a}=n;if(!Object.keys(i).length)return[];const r=[],s=new Set;return Object.keys(i).forEach((o=>{const l=i[o],{SOPInstanceUID:c,SeriesInstanceUID:d,frameNumber:m}=_(a,t,e),p=t.getDisplaySetsForSeries(d)[0],{SeriesNumber:u}=p,{mean:g,stdDev:S,max:I,area:v,Modality:y,modalityUnit:h,areaUnit:f}=l;y&&s.has(y)||(y&&s.add(y),r.push({SeriesInstanceUID:d,SOPInstanceUID:c,SeriesNumber:u,frameNumber:m,Modality:y,unit:h,mean:g,stdDev:S,metadata:n,max:I,area:v,areaUnit:f}))})),r}(a,t),E=function(e,t,n){const o={primary:[],secondary:[]};if(!e||!e.length)return o;const{area:i,SOPInstanceUID:a,frameNumber:r,areaUnit:s}=e[0],l=t.instances.find((e=>e.SOPInstanceUID===a));let c;l&&(c=l.InstanceNumber);const d=c?` I: ${c}`:"",m=t.isMultiFrame?` F: ${r}`:"",u=p.Wp.roundNumber(i||0,2);return o.primary.push(`${u} ${$(s)}`),e.forEach((e=>{const{unit:t,max:n,SeriesNumber:i}=e,a=W(n,t,"max");o.primary.push(a),o.secondary.push(`S: ${i}${d}${m}`)})),o}(w,y);return{uid:l,SOPInstanceUID:S,FrameOfReferenceUID:g,points:h,textBox:f,metadata:r,referenceSeriesUID:I,referenceStudyUID:v,referencedImageId:u,frameNumber:w[0]?.frameNumber||1,toolName:r.toolName,displaySetInstanceUID:y.displaySetInstanceUID,label:s.label,displayText:E,data:s.cachedStats,type:o(m),getReport:()=>function(e,t,n,o){const i=[],a=[];i.push("AnnotationType"),a.push("Cornerstone:RectangleROI"),e.forEach((e=>{const{mean:t,stdDev:n,max:o,area:r,unit:s,areaUnit:l}=e;t&&s&&o&&r&&(i.push("Maximum","Mean","Std Dev","Pixel Unit","Area","Unit"),a.push(o,t,n,s,r,l))})),n&&(i.push("FrameOfReferenceUID"),a.push(n));t&&(i.push("points"),a.push(t.map((e=>e.join(" "))).join(";")));return{columns:i,values:a}}(w,h,g),isLocked:c,isVisible:d}}};const X={toAnnotation:e=>{},toMeasurement:(e,t,n,o,i)=>{const{annotation:a}=e,{metadata:r,data:s,annotationUID:l}=a,c=x(l),d=F(l);if(!r||!s)return console.warn("SplineROI tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:u,FrameOfReferenceUID:g}=r;if(!U.includes(m))throw new Error(`Tool ${m} not supported`);const{SOPInstanceUID:S,SeriesInstanceUID:I,frameNumber:v,StudyInstanceUID:y}=_(u,t,a);let h;h=S?t.getDisplaySetForSOPInstanceUID(S,I):t.getDisplaySetsForSeries(I)[0];const f=function(e,t){const{metadata:n,data:o}=e,{cachedStats:i}=o,{referencedImageId:a}=n;if(!Object.keys(i).length)return[];const r=[];return Object.keys(i).forEach((n=>{const o=i[n],{SOPInstanceUID:s,SeriesInstanceUID:l,frameNumber:c}=_(a,t,e),d=t.getDisplaySetsForSeries(l)[0],{SeriesNumber:m}=d,{mean:p,stdDev:u,max:g,area:S,Modality:I,areaUnit:v,modalityUnit:y}=o;r.push({SeriesInstanceUID:l,SOPInstanceUID:s,SeriesNumber:m,frameNumber:c,Modality:I,unit:y,mean:p,stdDev:u,max:g,area:S,areaUnit:v})})),r}(a,t),w=function(e,t){const n={primary:[],secondary:[]};if(!e||!e.length)return n;const{area:o,SOPInstanceUID:i,frameNumber:a,areaUnit:r}=e[0],s=t.instances.find((e=>e.SOPInstanceUID===i));let l;s&&(l=s.InstanceNumber);t.isMultiFrame;const c=p.Wp.roundNumber(o||0,2);return n.primary.push(`${c} ${$(r)}`),n}(f,h);return{uid:l,SOPInstanceUID:S,FrameOfReferenceUID:g,points:s.contour.polyline,textBox:s.handles.textBox,metadata:r,frameNumber:v,referenceSeriesUID:I,referenceStudyUID:y,referencedImageId:u,toolName:r.toolName,displaySetInstanceUID:h.displaySetInstanceUID,label:s.label,displayText:w,data:s.cachedStats,type:o(m),getReport:()=>function(e,t){const{SplineROI:n}=t.getCustomization("cornerstone.measurements"),{report:o}=n,i=[],a=[];i.push("AnnotationType"),a.push("Cornerstone:SplineROI");const{metadata:r,data:s}=e,l=s.cachedStats[`imageId:${r.referencedImageId}`];o.forEach((({name:e,value:t})=>{i.push(e),l[t]?a.push(l[t]):a.push("not available")})),r.FrameOfReferenceUID&&(i.push("FrameOfReferenceUID"),a.push(r.FrameOfReferenceUID));s.contour.polyline&&(i.push("points"),a.push(s.contour.polyline.map((e=>e.join(" "))).join(";")));return{columns:i,values:a}}(a,i),isLocked:c,isVisible:d}}};function ee(e,t){const{metadata:n,data:o}=e;if(!o.cachedStats||!o.cachedStats[`imageId:${n.referencedImageId}`])return[];const{area:i,areaUnit:a}=o.cachedStats[`imageId:${n.referencedImageId}`],{SOPInstanceUID:r,frameNumber:s}=_(n.referencedImageId),l=[],c=t.instances.find((e=>e.SOPInstanceUID===r));let d;c&&(d=c.InstanceNumber);const m=d?` I: ${d}`:"",u=t.isMultiFrame?` F: ${s}`:"",{SeriesNumber:g}=t;let S=null;void 0!==g&&(S=`S: ${g}${m}${u}`);const I=[];if(i){const e=p.Wp.roundNumber(i||0,2);I.push(`${e} ${$(a)}`)}return S&&I.push(S),l.push({text:I,series:S}),l}const te={toAnnotation:e=>{},toMeasurement:(e,t,n,o,i)=>{const{annotation:a}=e,{metadata:r,data:s,annotationUID:l}=a,c=x(l),d=F(l);if(!r||!s)return console.warn("Livewire tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:p,FrameOfReferenceUID:u}=r;if(!U.includes(m))throw new Error(`Tool ${m} not supported`);const{SOPInstanceUID:g,SeriesInstanceUID:S,frameNumber:I,StudyInstanceUID:v}=_(p);let y;return y=g?t.getDisplaySetForSOPInstanceUID(g,S):t.getDisplaySetsForSeries(S),{uid:l,SOPInstanceUID:g,FrameOfReferenceUID:u,points:s.contour.polyline,textBox:s.handles.textBox,metadata:r,frameNumber:I,referenceSeriesUID:S,referenceStudyUID:v,toolName:r.toolName,displaySetInstanceUID:y.displaySetInstanceUID,label:s.label,isLocked:c,isVisible:d,displayText:ee(a,y),data:s.cachedStats,type:o(m),getReport:()=>function(e,t){const n=[],o=[];n.push("AnnotationType"),o.push("Cornerstone:Livewire");const{metadata:i,data:a}=e;i.FrameOfReferenceUID&&(n.push("FrameOfReferenceUID"),o.push(i.FrameOfReferenceUID));a.contour.polyline&&(n.push("points"),o.push(a.contour.polyline.map((e=>e.join(" "))).join(";")));return{columns:n,values:o}}(a)}}};const ne={toAnnotation:e=>{},toMeasurement:(e,t,n,o,i)=>{const{annotation:a}=e,{metadata:r,data:s,annotationUID:l}=a,c=x(l),d=F(l);if(!r||!s)return console.warn("Probe tool: Missing metadata or data"),null;const{toolName:m,referencedImageId:u,FrameOfReferenceUID:g}=r;if(!U.includes(m))throw new Error("Tool not supported");const{SOPInstanceUID:S,SeriesInstanceUID:I,StudyInstanceUID:v}=_(u,t,a);let y;y=S?t.getDisplaySetForSOPInstanceUID(S,I):t.getDisplaySetsForSeries(I)[0];const{points:h}=s.handles,f=function(e,t){const{metadata:n,data:o}=e,{cachedStats:i}=o,{referencedImageId:a}=n;if(!Object.keys(i).length)return;const r=[];return Object.keys(i).forEach((n=>{const o=i[n],{SOPInstanceUID:s,SeriesInstanceUID:l,frameNumber:c}=_(a,t,e),d=t.getDisplaySetsForSeries(l)[0],{SeriesNumber:m}=d,{value:p}=o,u="HU";r.push({SeriesInstanceUID:l,SOPInstanceUID:s,SeriesNumber:m,frameNumber:c,unit:u,value:p})})),r}(a,t),w=function(e,t,n){const o={primary:[],secondary:[]};if(!e||!e.length)return o;const{value:i,unit:a,SeriesNumber:r,SOPInstanceUID:s,frameNumber:l}=e[0],c=t.instances.find((e=>e.SO