@ohif/extension-cornerstone-dicom-seg 3.12.0-beta.76 → 3.12.0-beta.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  /*! For license information please see ohif-extension-cornerstone-dicom-seg.umd.js.LICENSE.txt */
2
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@cornerstonejs/adapters"),require("@cornerstonejs/core"),require("@cornerstonejs/tools"),require("@cornerstonejs/tools/enums"),require("@ohif/core"),require("@ohif/core/src/contextProviders/SystemProvider"),require("@ohif/extension-cornerstone"),require("@ohif/extension-default"),require("@ohif/i18n"),require("@ohif/ui-next"),require("dcmjs")):"function"==typeof define&&define.amd?define(["@cornerstonejs/adapters","@cornerstonejs/core","@cornerstonejs/tools","@cornerstonejs/tools/enums","@ohif/core","@ohif/core/src/contextProviders/SystemProvider","@ohif/extension-cornerstone","@ohif/extension-default","@ohif/i18n","@ohif/ui-next","dcmjs"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-seg"]=t(require("@cornerstonejs/adapters"),require("@cornerstonejs/core"),require("@cornerstonejs/tools"),require("@cornerstonejs/tools/enums"),require("@ohif/core"),require("@ohif/core/src/contextProviders/SystemProvider"),require("@ohif/extension-cornerstone"),require("@ohif/extension-default"),require("@ohif/i18n"),require("@ohif/ui-next"),require("dcmjs")):e["ohif-extension-cornerstone-dicom-seg"]=t(e["@cornerstonejs/adapters"],e["@cornerstonejs/core"],e["@cornerstonejs/tools"],e["@cornerstonejs/tools/enums"],e["@ohif/core"],e["@ohif/core/src/contextProviders/SystemProvider"],e["@ohif/extension-cornerstone"],e["@ohif/extension-default"],e["@ohif/i18n"],e["@ohif/ui-next"],e.dcmjs)}(globalThis,(e,t,n,r,o,a,s,i,c,l,u)=>(()=>{"use strict";var d,p,f={275:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});var r=n(326),o=n(55);const a=function({commandsManager:e,toolGroupService:t,customizationService:n,toolGroupId:r}){const o=n.getCustomization("cornerstone.overlayViewportTools"),a=e.run("initializeSegmentLabelTool",{tools:o});return t.createToolGroupAndAddTools(r,a)};var s=n(669);const i=function({servicesManager:e,segDisplaySet:t,viewportId:n,preHydrateCallbacks:r,hydrateCallback:o}){return s.utils.promptHydrationDialog({servicesManager:e,viewportId:n,displaySet:t,preHydrateCallbacks:r,hydrateCallback:o,type:"SEG"})};var c=n(404),l=n(492);function u(){return u=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u.apply(null,arguments)}const d=function(e){const{servicesManager:t,commandsManager:n}=(0,l.useSystem)(),{children:d,displaySets:p,viewportOptions:f}=e,m=f.viewportId,{displaySetService:S,toolGroupService:g,segmentationService:y,customizationService:v}=t.services,I=v.getCustomization("ui.loadingIndicatorTotalPercent"),h=`SEGToolGroup-${m}`;if(p.length>1)throw new Error("SEG viewport should only have a single display set");const b=p[0],[w,D]=(0,o.useViewportGrid)(),{setPositionPresentation:E}=(0,s.usePositionPresentationStore)(),[O,R]=(0,r.useState)(!b.isLoaded),[T,C]=(0,r.useState)({percentComplete:null,totalSegments:null}),_=(0,r.useRef)(null),{viewports:x,activeViewportId:M}=w,P=b.referencedDisplaySetInstanceUID;if(!P){const e=v.getCustomization("missingReferenceDisplaySetHandler"),{handled:t}=e();if(t)return}const U=S.getDisplaySetByUID(P),j=function(e,t){const{SharedFunctionalGroupsSequence:n}=t.instance,r=Array.isArray(n)?n[0]:n,{PixelMeasuresSequence:o}=r,a=Array.isArray(o)?o[0]:o,{SpacingBetweenSlices:s,SliceThickness:i}=a,c=e.images[0],l={PatientID:c.PatientID,PatientName:c.PatientName,PatientSex:c.PatientSex,PatientAge:c.PatientAge,SliceThickness:c.SliceThickness||i,StudyDate:c.StudyDate,SeriesDescription:c.SeriesDescription,SeriesInstanceUID:c.SeriesInstanceUID,SeriesNumber:c.SeriesNumber,ManufacturerModelName:c.ManufacturerModelName,SpacingBetweenSlices:c.SpacingBetweenSlices||s};return l}(U,b);_.current={displaySet:U,metadata:j};const N=(0,r.useCallback)(()=>r.createElement(s.OHIFCornerstoneViewport,u({},e,{displaySets:[b],viewportOptions:{viewportType:f.viewportType,toolGroupId:h,orientation:f.orientation,viewportId:f.viewportId,presentationIds:f.presentationIds},onElementEnabled:t=>{e.onElementEnabled?.(t)}})),[m,b,h,e,f]);(0,r.useEffect)(()=>{O||m===M&&i({servicesManager:t,viewportId:m,segDisplaySet:b,hydrateCallback:async()=>(await n.runCommand("hydrateSecondaryDisplaySet",{displaySet:b,viewportId:m}),!0)})},[t,m,b,O,n,M]),(0,r.useEffect)(()=>{y.clearSegmentationRepresentations(m);const{unsubscribe:e}=y.subscribe(y.EVENTS.SEGMENTATION_LOADING_COMPLETE,e=>{if(e.segDisplaySet.displaySetInstanceUID===b.displaySetInstanceUID&&R(!1),b?.firstSegmentedSliceImageId&&f?.presentationIds){const{firstSegmentedSliceImageId:e}=b,{presentationIds:t}=f;E(t.positionPresentationId,{viewReference:{referencedImageId:e}})}});return()=>{e()}},[b]),(0,r.useEffect)(()=>{const{unsubscribe:e}=y.subscribe(y.EVENTS.SEGMENT_LOADING_COMPLETE,({percentComplete:e,numSegments:t})=>{C({percentComplete:e,totalSegments:t})});return()=>{e()}},[b]),(0,r.useEffect)(()=>{const e=S.subscribe(S.EVENTS.DISPLAY_SETS_REMOVED,({displaySetInstanceUIDs:e})=>{const t=x.get(M);e.includes(t.displaySetInstanceUID)&&D.setDisplaySetsForViewport({viewportId:M,displaySetInstanceUIDs:[]})});return()=>{e.unsubscribe()}},[]),(0,r.useEffect)(()=>{let e=g.getToolGroup(h);if(!e)return n.runCommand("updateStoredSegmentationPresentation",{displaySet:b,type:c.SegmentationRepresentations.Labelmap}),y.clearSegmentationRepresentations(m),e=a({commandsManager:n,toolGroupService:g,customizationService:v,toolGroupId:h}),()=>{y.clearSegmentationRepresentations(m),g.destroyToolGroup(h)}},[]);let A=null;return _.current&&U.displaySetInstanceUID===_.current.displaySet.displaySetInstanceUID?(d&&d.length&&(A=d.map((e,t)=>e&&r.cloneElement(e,{viewportId:m,key:t}))),r.createElement(r.Fragment,null,r.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},O&&r.createElement(I,{className:"h-full w-full",totalNumbers:T.totalSegments,percentComplete:T.percentComplete,loadingText:"Loading SEG..."}),N(),A))):null}},249:(e,t)=>{var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),i=Symbol.for("react.provider"),c=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),f=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},S=Object.assign,g={};function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function v(){}function I(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}y.prototype.isReactComponent={},y.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")},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=y.prototype;var h=I.prototype=new v;h.constructor=I,S(h,y.prototype),h.isPureReactComponent=!0;var b=Array.isArray,w=Object.prototype.hasOwnProperty,D={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function O(e,t,r){var o,a={},s=null,i=null;if(null!=t)for(o in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(s=""+t.key),t)w.call(t,o)&&!E.hasOwnProperty(o)&&(a[o]=t[o]);var c=arguments.length-2;if(1===c)a.children=r;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];a.children=l}if(e&&e.defaultProps)for(o in c=e.defaultProps)void 0===a[o]&&(a[o]=c[o]);return{$$typeof:n,type:e,key:s,ref:i,props:a,_owner:D.current}}function R(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var T=/\/+/g;function C(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(e){return t[e]})}(""+e.key):t.toString(36)}function _(e,t,o,a,s){var i=typeof e;"undefined"!==i&&"boolean"!==i||(e=null);var c=!1;if(null===e)c=!0;else switch(i){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case n:case r:c=!0}}if(c)return s=s(c=e),e=""===a?"."+C(c,0):a,b(s)?(o="",null!=e&&(o=e.replace(T,"$&/")+"/"),_(s,t,o,"",function(e){return e})):null!=s&&(R(s)&&(s=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(s,o+(!s.key||c&&c.key===s.key?"":(""+s.key).replace(T,"$&/")+"/")+e)),t.push(s)),1;if(c=0,a=""===a?".":a+":",b(e))for(var l=0;l<e.length;l++){var u=a+C(i=e[l],l);c+=_(i,t,o,u,s)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),l=0;!(i=e.next()).done;)c+=_(i=i.value,t,o,u=a+C(i,l++),s);else if("object"===i)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return c}function x(e,t,n){if(null==e)return e;var r=[],o=0;return _(e,r,"","",function(e){return t.call(n,e,o++)}),r}function M(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)},function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var P={current:null},U={transition:null},j={ReactCurrentDispatcher:P,ReactCurrentBatchConfig:U,ReactCurrentOwner:D};function N(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:x,forEach:function(e,t,n){x(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return x(e,function(){t++}),t},toArray:function(e){return x(e,function(e){return e})||[]},only:function(e){if(!R(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=y,t.Fragment=o,t.Profiler=s,t.PureComponent=I,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=j,t.act=N,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=S({},e.props),a=e.key,s=e.ref,i=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,i=D.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)w.call(t,l)&&!E.hasOwnProperty(l)&&(o[l]=void 0===t[l]&&void 0!==c?c[l]:t[l])}var l=arguments.length-2;if(1===l)o.children=r;else if(1<l){c=Array(l);for(var u=0;u<l;u++)c[u]=arguments[u+2];o.children=c}return{$$typeof:n,type:e.type,key:a,ref:s,props:o,_owner:i}},t.createContext=function(e){return(e={$$typeof:c,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=O,t.createFactory=function(e){var t=O.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=R,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:M}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=U.transition;U.transition={};try{e()}finally{U.transition=t}},t.unstable_act=N,t.useCallback=function(e,t){return P.current.useCallback(e,t)},t.useContext=function(e){return P.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return P.current.useDeferredValue(e)},t.useEffect=function(e,t){return P.current.useEffect(e,t)},t.useId=function(){return P.current.useId()},t.useImperativeHandle=function(e,t,n){return P.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return P.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return P.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return P.current.useMemo(e,t)},t.useReducer=function(e,t,n){return P.current.useReducer(e,t,n)},t.useRef=function(e){return P.current.useRef(e)},t.useState=function(e){return P.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return P.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return P.current.useTransition()},t.version="18.3.1"},326:(e,t,n)=>{e.exports=n(249)},142:t=>{t.exports=e},557:e=>{e.exports=t},713:e=>{e.exports=n},404:e=>{e.exports=r},2:e=>{e.exports=o},492:e=>{e.exports=a},669:e=>{e.exports=s},438:e=>{e.exports=i},545:e=>{e.exports=c},55:e=>{e.exports=l},111:e=>{e.exports=u}},m={};function S(e){var t=m[e];if(void 0!==t)return t.exports;var n=m[e]={exports:{}};return f[e](n,n.exports,S),n.exports}S.m=f,d=[],S.O=(e,t,n,r)=>{if(!t){var o=1/0;for(c=0;c<d.length;c++){for(var[t,n,r]=d[c],a=!0,s=0;s<t.length;s++)(!1&r||o>=r)&&Object.keys(S.O).every(e=>S.O[e](t[s]))?t.splice(s--,1):(a=!1,r<o&&(o=r));if(a){d.splice(c--,1);var i=n();void 0!==i&&(e=i)}}return e}r=r||0;for(var c=d.length;c>0&&d[c-1][2]>r;c--)d[c]=d[c-1];d[c]=[t,n,r]},S.F={},S.E=e=>{Object.keys(S.F).map(t=>{S.F[t](e)})},S.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return S.d(t,{a:t}),t},S.d=(e,t)=>{for(var n in t)S.o(t,n)&&!S.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},S.miniCssF=e=>{},S.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),S.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},S.p="/",p={524:0},S.F.j=e=>{if(!S.o(p,e)||void 0===p[e]){p[e]=null;var t=document.createElement("link");S.nc&&t.setAttribute("nonce",S.nc),t.rel="prefetch",t.as="script",t.href=S.p+S.u(e),document.head.appendChild(t)}},S.O.j=e=>0===p[e],S.O(0,[524],()=>{S.E(524)},5);var g={};S.r(g),S.d(g,{default:()=>B});const y=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-seg"}').UU,v=`${y}.sopClassHandlerModule.dicom-seg`;var I=S(326),h=S(2),b=S(545),w=S.n(b),D=S(557),E=S(713),O=S(142),R=S(111),T=S.n(R);const C=["1.2.840.10008.5.1.4.1.1.66.4","1.2.840.10008.5.1.4.1.1.66.7"],_={};function x(e,t,n){const r=e[0],{StudyInstanceUID:o,SeriesInstanceUID:a,SOPInstanceUID:s,SeriesDescription:i,SeriesNumber:c,SeriesDate:l,SOPClassUID:u,wadoRoot:d,wadoUri:p,wadoUriRoot:f}=r,m={Modality:"SEG",loading:!1,isReconstructable:!1,displaySetInstanceUID:h.utils.guid(),SeriesDescription:i,SeriesNumber:c,SeriesDate:l,SOPInstanceUID:s,SeriesInstanceUID:a,StudyInstanceUID:o,SOPClassHandlerId:v,SOPClassUID:u,referencedImages:null,referencedSeriesInstanceUID:null,referencedDisplaySetInstanceUID:null,isDerivedDisplaySet:!0,isLoaded:!1,isHydrated:!1,segments:{},sopClassUids:C,instance:r,instances:[r],wadoRoot:d,wadoUriRoot:f,wadoUri:p,isOverlayDisplaySet:!0,label:i||`${w().t("Series")} ${c} - ${w().t("SEG")}`},S=r.ReferencedSeriesSequence;if(!S)return void console.error("ReferencedSeriesSequence is missing for the SEG");const g=S[0]||S;m.referencedImages=r.ReferencedSeriesSequence.ReferencedInstanceSequence,m.referencedSeriesInstanceUID=g.SeriesInstanceUID;const{displaySetService:y}=t.services,I=y.getDisplaySetsForSeries(m.referencedSeriesInstanceUID)[0];if(I)m.referencedDisplaySetInstanceUID=I.displaySetInstanceUID,m.isReconstructable=I.isReconstructable;else{const{unsubscribe:e}=y.subscribe(y.EVENTS.DISPLAY_SETS_ADDED,({displaySetsAdded:t})=>{const n=t[0];n.SeriesInstanceUID===m.referencedSeriesInstanceUID&&(m.referencedDisplaySetInstanceUID=n.displaySetInstanceUID,m.isReconstructable=n.isReconstructable,e())})}return m.load=async({headers:e})=>await function(e,t,n,r){const{SOPInstanceUID:o}=e,{segmentationService:a}=t.services;if((e.loading||e.isLoaded)&&_[o]&&function(e){return E.segmentation.state.getSegmentation(e.displaySetInstanceUID)}(e))return _[o];return e.loading=!0,_[o]=new Promise(async(o,s)=>{if(!e.segments||0===Object.keys(e.segments).length)try{await async function({extensionManager:e,servicesManager:t,segDisplaySet:n,headers:r}){const o=e.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common"),{segmentationService:a,uiNotificationService:s}=t.services,{dicomLoaderService:i}=o.exports,c=await i.findDicomDataPromise(n,null,r),l=t.services.displaySetService.getDisplaySetByUID(n.referencedDisplaySetInstanceUID);if(!l)throw new Error("referencedDisplaySet is missing for SEG");let{imageIds:u}=l;if(!u){const{images:e}=l;u=e.map(e=>e.imageId)}const d=.001;D.eventTarget.addEventListener(O.Enums.Events.SEGMENTATION_LOAD_PROGRESS,e=>{const{percentComplete:t}=e.detail;a._broadcastEvent(a.EVENTS.SEGMENT_LOADING_COMPLETE,{percentComplete:t})});const p=await O.adaptersSEG.Cornerstone3D.Segmentation.createFromDICOMSegBuffer(u,c,{metadataProvider:D.metaData,tolerance:d});let f=!0;p.segMetadata.data.forEach((e,t)=>{var n;t>0&&(e.rgba=e.RecommendedDisplayCIELabValue,e.rgba?e.rgba=(n=e.rgba,T().data.Colors.dicomlab2RGB(n).map(e=>Math.round(255*e))):(f=!1,e.rgba=E.CONSTANTS.COLOR_LUT[t%E.CONSTANTS.COLOR_LUT.length]))}),f||s.show({title:"DICOM SEG import",message:"RecommendedDisplayCIELabValue not found for one or more segments. The default color was used instead.",type:"warning",duration:5e3});Object.assign(n,p)}({extensionManager:n,servicesManager:t,segDisplaySet:e,headers:r})}catch(t){return e.loading=!1,s(t)}a.createSegmentationForSEGDisplaySet(e).then(()=>{e.loading=!1,o()}).catch(t=>{e.loading=!1,s(t)})}),_[o]}(m,t,n,e),[m]}const M=function(e){const{servicesManager:t,extensionManager:n}=e;return[{name:"dicom-seg",sopClassUids:C,getDisplaySetsFromSeries:e=>x(e,t,n)}]},P={id:"@ohif/seg",name:"Segmentations",protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0,syncGroups:[{type:"hydrateseg",id:"sameFORId",source:!0,target:!0}]},displaySets:[{id:"segDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{segDisplaySetId:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"SEG"}}]}},stages:[{name:"Segmentations",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{allowUnmatchedView:!0,syncGroups:[{type:"hydrateseg",id:"sameFORId",source:!0,target:!0}]},displaySets:[{id:"segDisplaySetId"}]}]}]};const U=function(){return[{name:P.id,protocol:P}]};var j=S(438);const N={NO_NEVER:-1,CANCEL:0,CREATE_REPORT:1,ADD_SERIES:2,SET_STUDY_AND_SERIES:3,NO_NOT_FOR_SERIES:4},{datasetToBlob:A}=T().data,{Cornerstone3D:{Segmentation:{generateSegmentation:G}}}=O.adaptersSEG,{Cornerstone3D:{RTSS:{generateRTSSFromSegmentations:L}}}=O.adaptersRT,{downloadDICOMData:k}=O.helpers,q=({servicesManager:e,extensionManager:t})=>{const{segmentationService:n,displaySetService:r,viewportGridService:o,toolGroupService:a}=e.services,s={loadSegmentationsForViewport:async({segmentations:e,viewportId:t})=>{const a=(({viewportId:e,viewportGridService:t})=>{const{viewports:n,activeViewportId:r}=t.getState(),o=e||r;return n.get(o)})({viewportId:t,viewportGridService:o}),s=a.displaySetInstanceUIDs[0],i=e[0],c=i.segmentationId,l=i.config.label,u=i.config.segments,d=r.getDisplaySetByUID(s);return await n.createLabelmapForDisplaySet(d,{segmentationId:c,segments:u,label:l}),n.addOrUpdateSegmentation(i),await n.addSegmentationRepresentation(a.viewportId,{segmentationId:c}),c},generateSegmentation:({segmentationId:e,options:t={}})=>{const r=E.segmentation.state.getSegmentation(e),{imageIds:o}=r.representationData.Labelmap,a=o.map(e=>D.cache.getImage(e)),s=a.map(e=>D.cache.getImage(e.referencedImageId)),i=[];let c=0;for(const e of a){const t=new Set,n=e.getPixelData(),{rows:r,columns:o}=e;for(let e=0;e<n.length;e++){const r=n[e];0!==r&&t.add(r)}i[c++]={segmentsOnLabelmap:Array.from(t),pixelData:n,rows:r,columns:o}}const l=i.map(e=>e.segmentsOnLabelmap),u={segmentsOnLabelmap:Array.from(new Set(l.flat())),metadata:[],labelmaps2D:i},d=n.getSegmentation(e),p=n.getRepresentationsForSegmentation(e);Object.entries(d.segments).forEach(([t,r])=>{if(!r)return;const{label:o}=r,a=p[0],s=n.getSegmentColor(a.viewportId,e,r.segmentIndex),i=T().data.Colors.rgb2DICOMLAB(s.slice(0,3).map(e=>e/255)).map(e=>Math.round(e)),c={SegmentNumber:t.toString(),SegmentLabel:o,SegmentAlgorithmType:r?.algorithmType||"MANUAL",SegmentAlgorithmName:r?.algorithmName||"OHIF Brush",RecommendedDisplayCIELabValue:i,SegmentedPropertyCategoryCodeSequence:{CodeValue:"T-D0050",CodingSchemeDesignator:"SRT",CodeMeaning:"Tissue"},SegmentedPropertyTypeCodeSequence:{CodeValue:"T-D0050",CodingSchemeDesignator:"SRT",CodeMeaning:"Tissue"}};u.metadata[t]=c});return G(s,u,D.metaData,t)},downloadSegmentation:({segmentationId:e})=>{const t=n.getSegmentation(e),r=s.generateSegmentation({segmentationId:e});k(r.dataset,`${t.label}`)},storeSegmentation:async({segmentationId:r,dataSource:o})=>{const a=n.getSegmentation(r);if(!a)throw new Error("No segmentation found");const{label:i}=a,c=o??t.getActiveDataSource()[0],{value:l,dataSourceName:u,action:d}=await(0,j.createReportDialogPrompt)({servicesManager:e,extensionManager:t,title:"Store Segmentation"});if(d===N.CREATE_REPORT)try{const e=u?t.getDataSources(u)[0]:c,n=s.generateSegmentation({segmentationId:r,options:{SeriesDescription:l||i||"Research Derived Series"}});if(!n||!n.dataset)throw new Error("Error during segmentation generation");const{dataset:o}=n;return"No Study ID"===o.StudyID&&(o.StudyID=""),await e.store.dicom(o),o.wadoRoot=e.getConfig().wadoRoot,h.DicomMetadataStore.addInstances([o],!0),o}catch(e){throw console.debug("Error storing segmentation:",e),e}},downloadRTSS:async({segmentationId:e})=>{const t=n.getSegmentation(e),r=n.getRepresentationsForSegmentation(e)[0];Object.entries(t.segments).forEach(([t,o])=>{o.color=n.getSegmentColor(r.viewportId,e,t)});const o=await L(t,h.classes.MetadataProvider,h.DicomMetadataStore);try{const e=A(o),t=URL.createObjectURL(e);window.location.assign(t)}catch(e){console.warn(e)}}},i={loadSegmentationsForViewport:{commandFn:s.loadSegmentationsForViewport},generateSegmentation:{commandFn:s.generateSegmentation},downloadSegmentation:{commandFn:s.downloadSegmentation},storeSegmentation:{commandFn:s.storeSegmentation},downloadRTSS:{commandFn:s.downloadRTSS}};return{actions:s,definitions:i,defaultContext:"SEGMENTATION"}};function F(){return F=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},F.apply(null,arguments)}const V=I.lazy(()=>Promise.resolve().then(S.bind(S,275))),$=e=>I.createElement(I.Suspense,{fallback:I.createElement("div",null,"Loading...")},I.createElement(V,e)),B={id:y,getCommandsModule:q,getToolbarModule:function({servicesManager:e}){const{segmentationService:t,toolbarService:n,toolGroupService:r}=e.services;return[{name:"evaluate.cornerstone.hasSegmentation",evaluate:({viewportId:e})=>{const n=t.getSegmentationRepresentations(e);return{disabled:!n?.length}}},{name:"evaluate.cornerstone.segmentation",evaluate:({viewportId:e,button:o,toolNames:a,disabledText:s})=>{const i=t.getSegmentationRepresentations(e);if(!i?.length)return{disabled:!0,disabledText:s??"No segmentations available"};const c=t.getActiveSegmentation(e);if(!Object.keys(c.segments).length)return{disabled:!0,disabledText:"Add segment to enable this tool"};const l=r.getToolGroupForViewport(e);if(!l)return{disabled:!0,disabledText:s??"Not available on the current viewport"};if(!a)return{disabled:!1};const u=n.getToolNameForButton(o);if(!l.hasTool(u)&&!a)return{disabled:!0,disabledText:s??"Not available on the current viewport"};return{disabled:!1,isActive:a?a.includes(l.getActivePrimaryMouseButtonTool()):l.getActivePrimaryMouseButtonTool()===u}}}]},getViewportModule:({servicesManager:e,extensionManager:t,commandsManager:n})=>[{name:"dicom-seg",component:r=>I.createElement($,F({servicesManager:e,extensionManager:t,commandsManager:n},r))}],getSopClassHandlerModule:M,getHangingProtocolModule:U};return g=S.O(g)})());
2
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@cornerstonejs/adapters"),require("@cornerstonejs/core"),require("@cornerstonejs/tools"),require("@cornerstonejs/tools/enums"),require("@cornerstonejs/tools/utilities"),require("@ohif/core"),require("@ohif/core/src/contextProviders/SystemProvider"),require("@ohif/extension-cornerstone"),require("@ohif/extension-default"),require("@ohif/i18n"),require("@ohif/ui-next"),require("dcmjs")):"function"==typeof define&&define.amd?define(["@cornerstonejs/adapters","@cornerstonejs/core","@cornerstonejs/tools","@cornerstonejs/tools/enums","@cornerstonejs/tools/utilities","@ohif/core","@ohif/core/src/contextProviders/SystemProvider","@ohif/extension-cornerstone","@ohif/extension-default","@ohif/i18n","@ohif/ui-next","dcmjs"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-seg"]=t(require("@cornerstonejs/adapters"),require("@cornerstonejs/core"),require("@cornerstonejs/tools"),require("@cornerstonejs/tools/enums"),require("@cornerstonejs/tools/utilities"),require("@ohif/core"),require("@ohif/core/src/contextProviders/SystemProvider"),require("@ohif/extension-cornerstone"),require("@ohif/extension-default"),require("@ohif/i18n"),require("@ohif/ui-next"),require("dcmjs")):e["ohif-extension-cornerstone-dicom-seg"]=t(e["@cornerstonejs/adapters"],e["@cornerstonejs/core"],e["@cornerstonejs/tools"],e["@cornerstonejs/tools/enums"],e["@cornerstonejs/tools/utilities"],e["@ohif/core"],e["@ohif/core/src/contextProviders/SystemProvider"],e["@ohif/extension-cornerstone"],e["@ohif/extension-default"],e["@ohif/i18n"],e["@ohif/ui-next"],e.dcmjs)}(globalThis,(e,t,n,r,o,a,s,i,l,c,u,d)=>(()=>{"use strict";var m,p,g={275:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});var r=n(326),o=n(55);const a=function({commandsManager:e,toolGroupService:t,customizationService:n,toolGroupId:r}){const o=n.getCustomization("cornerstone.overlayViewportTools"),a=e.run("initializeSegmentLabelTool",{tools:o});return t.createToolGroupAndAddTools(r,a)};var s=n(669);const i=function({servicesManager:e,segDisplaySet:t,viewportId:n,preHydrateCallbacks:r,hydrateCallback:o}){return s.utils.promptHydrationDialog({servicesManager:e,viewportId:n,displaySet:t,preHydrateCallbacks:r,hydrateCallback:o,type:"SEG"})};var l=n(404),c=n(492);function u(){return u=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u.apply(null,arguments)}const d=function(e){const{servicesManager:t,commandsManager:n}=(0,c.useSystem)(),{children:d,displaySets:m,viewportOptions:p}=e,g=p.viewportId,{displaySetService:f,toolGroupService:S,segmentationService:y,customizationService:v}=t.services,b=v.getCustomization("ui.loadingIndicatorTotalPercent"),I=`SEGToolGroup-${g}`;if(m.length>1)throw new Error("SEG viewport should only have a single display set");const h=m[0],[E,w]=(0,o.useViewportGrid)(),{setPositionPresentation:x}=(0,s.usePositionPresentationStore)(),[D,C]=(0,r.useState)(!h.isLoaded),[O,R]=(0,r.useState)({percentComplete:null,totalSegments:null}),T=(0,r.useRef)(null),{viewports:N,activeViewportId:_}=E,M=h.referencedDisplaySetInstanceUID;if(!M){const e=v.getCustomization("missingReferenceDisplaySetHandler"),{handled:t}=e();if(t)return}const U=f.getDisplaySetByUID(M),P=function(e,t){const{SharedFunctionalGroupsSequence:n}=t.instance,r=Array.isArray(n)?n[0]:n,{PixelMeasuresSequence:o}=r,a=Array.isArray(o)?o[0]:o,{SpacingBetweenSlices:s,SliceThickness:i}=a,l=e.images[0],c={PatientID:l.PatientID,PatientName:l.PatientName,PatientSex:l.PatientSex,PatientAge:l.PatientAge,SliceThickness:l.SliceThickness||i,StudyDate:l.StudyDate,SeriesDescription:l.SeriesDescription,SeriesInstanceUID:l.SeriesInstanceUID,SeriesNumber:l.SeriesNumber,ManufacturerModelName:l.ManufacturerModelName,SpacingBetweenSlices:l.SpacingBetweenSlices||s};return c}(U,h);T.current={displaySet:U,metadata:P};const j=(0,r.useCallback)(()=>r.createElement(s.OHIFCornerstoneViewport,u({},e,{displaySets:[h],viewportOptions:{viewportType:p.viewportType,toolGroupId:I,orientation:p.orientation,viewportId:p.viewportId,presentationIds:p.presentationIds},onElementEnabled:t=>{e.onElementEnabled?.(t)}})),[g,h,I,e,p]);(0,r.useEffect)(()=>{D||g===_&&i({servicesManager:t,viewportId:g,segDisplaySet:h,hydrateCallback:async()=>(await n.runCommand("hydrateSecondaryDisplaySet",{displaySet:h,viewportId:g}),!0)})},[t,g,h,D,n,_]),(0,r.useEffect)(()=>{y.clearSegmentationRepresentations(g);const{unsubscribe:e}=y.subscribe(y.EVENTS.SEGMENTATION_LOADING_COMPLETE,e=>{if(e.segDisplaySet.displaySetInstanceUID===h.displaySetInstanceUID&&C(!1),h?.firstSegmentedSliceImageId&&p?.presentationIds){const{firstSegmentedSliceImageId:e}=h,{presentationIds:t}=p;x(t.positionPresentationId,{viewReference:{referencedImageId:e}})}});return()=>{e()}},[h]),(0,r.useEffect)(()=>{const{unsubscribe:e}=y.subscribe(y.EVENTS.SEGMENT_LOADING_COMPLETE,({percentComplete:e,numSegments:t})=>{R({percentComplete:e,totalSegments:t})});return()=>{e()}},[h]),(0,r.useEffect)(()=>{const e=f.subscribe(f.EVENTS.DISPLAY_SETS_REMOVED,({displaySetInstanceUIDs:e})=>{const t=N.get(_);e.includes(t.displaySetInstanceUID)&&w.setDisplaySetsForViewport({viewportId:_,displaySetInstanceUIDs:[]})});return()=>{e.unsubscribe()}},[]),(0,r.useEffect)(()=>{let e=S.getToolGroup(I);if(!e)return n.runCommand("updateStoredSegmentationPresentation",{displaySet:h,type:l.SegmentationRepresentations.Labelmap}),y.clearSegmentationRepresentations(g),e=a({commandsManager:n,toolGroupService:S,customizationService:v,toolGroupId:I}),()=>{y.clearSegmentationRepresentations(g),S.destroyToolGroup(I)}},[]);let A=null;return T.current&&U.displaySetInstanceUID===T.current.displaySet.displaySetInstanceUID?(d&&d.length&&(A=d.map((e,t)=>e&&r.cloneElement(e,{viewportId:g,key:t}))),r.createElement(r.Fragment,null,r.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},D&&r.createElement(b,{className:"h-full w-full",totalNumbers:O.totalSegments,percentComplete:O.percentComplete,loadingText:"Loading SEG..."}),j(),A))):null}},249:(e,t)=>{var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),i=Symbol.for("react.provider"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),p=Symbol.iterator;var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},f=Object.assign,S={};function y(e,t,n){this.props=e,this.context=t,this.refs=S,this.updater=n||g}function v(){}function b(e,t,n){this.props=e,this.context=t,this.refs=S,this.updater=n||g}y.prototype.isReactComponent={},y.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")},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=y.prototype;var I=b.prototype=new v;I.constructor=b,f(I,y.prototype),I.isPureReactComponent=!0;var h=Array.isArray,E=Object.prototype.hasOwnProperty,w={current:null},x={key:!0,ref:!0,__self:!0,__source:!0};function D(e,t,r){var o,a={},s=null,i=null;if(null!=t)for(o in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(s=""+t.key),t)E.call(t,o)&&!x.hasOwnProperty(o)&&(a[o]=t[o]);var l=arguments.length-2;if(1===l)a.children=r;else if(1<l){for(var c=Array(l),u=0;u<l;u++)c[u]=arguments[u+2];a.children=c}if(e&&e.defaultProps)for(o in l=e.defaultProps)void 0===a[o]&&(a[o]=l[o]);return{$$typeof:n,type:e,key:s,ref:i,props:a,_owner:w.current}}function C(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var O=/\/+/g;function R(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(e){return t[e]})}(""+e.key):t.toString(36)}function T(e,t,o,a,s){var i=typeof e;"undefined"!==i&&"boolean"!==i||(e=null);var l=!1;if(null===e)l=!0;else switch(i){case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case n:case r:l=!0}}if(l)return s=s(l=e),e=""===a?"."+R(l,0):a,h(s)?(o="",null!=e&&(o=e.replace(O,"$&/")+"/"),T(s,t,o,"",function(e){return e})):null!=s&&(C(s)&&(s=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(s,o+(!s.key||l&&l.key===s.key?"":(""+s.key).replace(O,"$&/")+"/")+e)),t.push(s)),1;if(l=0,a=""===a?".":a+":",h(e))for(var c=0;c<e.length;c++){var u=a+R(i=e[c],c);l+=T(i,t,o,u,s)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=p&&e[p]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),c=0;!(i=e.next()).done;)l+=T(i=i.value,t,o,u=a+R(i,c++),s);else if("object"===i)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return l}function N(e,t,n){if(null==e)return e;var r=[],o=0;return T(e,r,"","",function(e){return t.call(n,e,o++)}),r}function _(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)},function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var M={current:null},U={transition:null},P={ReactCurrentDispatcher:M,ReactCurrentBatchConfig:U,ReactCurrentOwner:w};function j(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:N,forEach:function(e,t,n){N(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return N(e,function(){t++}),t},toArray:function(e){return N(e,function(e){return e})||[]},only:function(e){if(!C(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=y,t.Fragment=o,t.Profiler=s,t.PureComponent=b,t.StrictMode=a,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=P,t.act=j,t.cloneElement=function(e,t,r){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=f({},e.props),a=e.key,s=e.ref,i=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,i=w.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(c in t)E.call(t,c)&&!x.hasOwnProperty(c)&&(o[c]=void 0===t[c]&&void 0!==l?l[c]:t[c])}var c=arguments.length-2;if(1===c)o.children=r;else if(1<c){l=Array(c);for(var u=0;u<c;u++)l[u]=arguments[u+2];o.children=l}return{$$typeof:n,type:e.type,key:a,ref:s,props:o,_owner:i}},t.createContext=function(e){return(e={$$typeof:l,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=D,t.createFactory=function(e){var t=D.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=C,t.lazy=function(e){return{$$typeof:m,_payload:{_status:-1,_result:e},_init:_}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=U.transition;U.transition={};try{e()}finally{U.transition=t}},t.unstable_act=j,t.useCallback=function(e,t){return M.current.useCallback(e,t)},t.useContext=function(e){return M.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return M.current.useDeferredValue(e)},t.useEffect=function(e,t){return M.current.useEffect(e,t)},t.useId=function(){return M.current.useId()},t.useImperativeHandle=function(e,t,n){return M.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return M.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return M.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return M.current.useMemo(e,t)},t.useReducer=function(e,t,n){return M.current.useReducer(e,t,n)},t.useRef=function(e){return M.current.useRef(e)},t.useState=function(e){return M.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return M.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return M.current.useTransition()},t.version="18.3.1"},326:(e,t,n)=>{e.exports=n(249)},142:t=>{t.exports=e},557:e=>{e.exports=t},713:e=>{e.exports=n},404:e=>{e.exports=r},154:e=>{e.exports=o},2:e=>{e.exports=a},492:e=>{e.exports=s},669:e=>{e.exports=i},438:e=>{e.exports=l},545:e=>{e.exports=c},55:e=>{e.exports=u},111:e=>{e.exports=d}},f={};function S(e){var t=f[e];if(void 0!==t)return t.exports;var n=f[e]={exports:{}};return g[e](n,n.exports,S),n.exports}S.m=g,m=[],S.O=(e,t,n,r)=>{if(!t){var o=1/0;for(l=0;l<m.length;l++){for(var[t,n,r]=m[l],a=!0,s=0;s<t.length;s++)(!1&r||o>=r)&&Object.keys(S.O).every(e=>S.O[e](t[s]))?t.splice(s--,1):(a=!1,r<o&&(o=r));if(a){m.splice(l--,1);var i=n();void 0!==i&&(e=i)}}return e}r=r||0;for(var l=m.length;l>0&&m[l-1][2]>r;l--)m[l]=m[l-1];m[l]=[t,n,r]},S.F={},S.E=e=>{Object.keys(S.F).map(t=>{S.F[t](e)})},S.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return S.d(t,{a:t}),t},S.d=(e,t)=>{for(var n in t)S.o(t,n)&&!S.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},S.miniCssF=e=>{},S.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),S.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},S.p="/",p={524:0},S.F.j=e=>{if(!S.o(p,e)||void 0===p[e]){p[e]=null;var t=document.createElement("link");S.nc&&t.setAttribute("nonce",S.nc),t.rel="prefetch",t.as="script",t.href=S.p+S.u(e),document.head.appendChild(t)}},S.O.j=e=>0===p[e],S.O(0,[524],()=>{S.E(524)},5);var y={};S.r(y),S.d(y,{default:()=>ee});const v=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-seg"}').UU,b=`${v}.sopClassHandlerModule.dicom-seg`;var I=S(326),h=S(2),E=S(545),w=S.n(E),x=S(557),D=S(713),C=S(142),O=S(111),R=S.n(O);const T=["1.2.840.10008.5.1.4.1.1.66.4","1.2.840.10008.5.1.4.1.1.66.7"],N={};function _(e,t,n){const r=e[0],{StudyInstanceUID:o,SeriesInstanceUID:a,SOPInstanceUID:s,SeriesDescription:i,SeriesNumber:l,SeriesDate:c,SOPClassUID:u,wadoRoot:d,wadoUri:m,wadoUriRoot:p}=r,g={Modality:"SEG",loading:!1,isReconstructable:!1,displaySetInstanceUID:h.utils.guid(),SeriesDescription:i,SeriesNumber:l,SeriesDate:c,SOPInstanceUID:s,SeriesInstanceUID:a,StudyInstanceUID:o,SOPClassHandlerId:b,SOPClassUID:u,referencedImages:null,referencedSeriesInstanceUID:null,referencedDisplaySetInstanceUID:null,isDerivedDisplaySet:!0,isLoaded:!1,isHydrated:!1,segments:{},sopClassUids:T,instance:r,instances:[r],wadoRoot:d,wadoUriRoot:p,wadoUri:m,isOverlayDisplaySet:!0,label:i||`${w().t("Series")} ${l} - ${w().t("SEG")}`},f=r.ReferencedSeriesSequence;if(!f)return void console.error("ReferencedSeriesSequence is missing for the SEG");const S=f[0]||f;g.referencedImages=r.ReferencedSeriesSequence.ReferencedInstanceSequence,g.referencedSeriesInstanceUID=S.SeriesInstanceUID;const{displaySetService:y}=t.services,v=y.getDisplaySetsForSeries(g.referencedSeriesInstanceUID)[0];if(v)g.referencedDisplaySetInstanceUID=v.displaySetInstanceUID,g.isReconstructable=v.isReconstructable;else{const{unsubscribe:e}=y.subscribe(y.EVENTS.DISPLAY_SETS_ADDED,({displaySetsAdded:t})=>{const n=t[0];n.SeriesInstanceUID===g.referencedSeriesInstanceUID&&(g.referencedDisplaySetInstanceUID=n.displaySetInstanceUID,g.isReconstructable=n.isReconstructable,e())})}return g.load=async({headers:e})=>await function(e,t,n,r){const{SOPInstanceUID:o}=e,{segmentationService:a}=t.services;if((e.loading||e.isLoaded)&&N[o]&&function(e){return D.segmentation.state.getSegmentation(e.displaySetInstanceUID)}(e))return N[o];return e.loading=!0,N[o]=new Promise(async(o,s)=>{if(!e.segments||0===Object.keys(e.segments).length)try{await async function({extensionManager:e,servicesManager:t,segDisplaySet:n,headers:r}){const o=e.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common"),{segmentationService:a,uiNotificationService:s}=t.services,{dicomLoaderService:i}=o.exports,l=await i.findDicomDataPromise(n,null,r),c=t.services.displaySetService.getDisplaySetByUID(n.referencedDisplaySetInstanceUID);if(!c)throw new Error("referencedDisplaySet is missing for SEG");let{imageIds:u}=c;if(!u){const{images:e}=c;u=e.map(e=>e.imageId)}const d=.001;x.eventTarget.addEventListener(C.Enums.Events.SEGMENTATION_LOAD_PROGRESS,e=>{const{percentComplete:t}=e.detail;a._broadcastEvent(a.EVENTS.SEGMENT_LOADING_COMPLETE,{percentComplete:t})});const m=await C.adaptersSEG.Cornerstone3D.Segmentation.createFromDICOMSegBuffer(u,l,{metadataProvider:x.metaData,tolerance:d});let p=!0;m.segMetadata.data.forEach((e,t)=>{var n;t>0&&(e.rgba=e.RecommendedDisplayCIELabValue,e.rgba?e.rgba=(n=e.rgba,R().data.Colors.dicomlab2RGB(n).map(e=>Math.round(255*e))):(p=!1,e.rgba=D.CONSTANTS.COLOR_LUT[t%D.CONSTANTS.COLOR_LUT.length]))}),p||s.show({title:"DICOM SEG import",message:"RecommendedDisplayCIELabValue not found for one or more segments. The default color was used instead.",type:"warning",duration:5e3});Object.assign(n,m)}({extensionManager:n,servicesManager:t,segDisplaySet:e,headers:r})}catch(t){return e.loading=!1,s(t)}a.createSegmentationForSEGDisplaySet(e).then(()=>{e.loading=!1,o()}).catch(t=>{e.loading=!1,s(t)})}),N[o]}(g,t,n,e),[g]}const M=function(e){const{servicesManager:t,extensionManager:n}=e;return[{name:"dicom-seg",sopClassUids:T,getDisplaySetsFromSeries:e=>_(e,t,n)}]},U={id:"@ohif/seg",name:"Segmentations",protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0,syncGroups:[{type:"hydrateseg",id:"sameFORId",source:!0,target:!0}]},displaySets:[{id:"segDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{segDisplaySetId:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"SEG"}}]}},stages:[{name:"Segmentations",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{allowUnmatchedView:!0,syncGroups:[{type:"hydrateseg",id:"sameFORId",source:!0,target:!0}]},displaySets:[{id:"segDisplaySetId"}]}]}]};const P=function(){return[{name:U.id,protocol:U}]};var j=S(438);const A={NO_NEVER:-1,CANCEL:0,CREATE_REPORT:1,ADD_SERIES:2,SET_STUDY_AND_SERIES:3,NO_NOT_FOR_SERIES:4},{datasetToBlob:k}=R().data,{Cornerstone3D:{Segmentation:{generateSegmentation:L}}}=C.adaptersSEG,{Cornerstone3D:{RTSS:{generateRTSSFromSegmentations:G}}}=C.adaptersRT,{downloadDICOMData:F}=C.helpers,V=({servicesManager:e,extensionManager:t})=>{const{segmentationService:n,displaySetService:r,viewportGridService:o}=e.services,a={loadSegmentationsForViewport:async({segmentations:e,viewportId:t})=>{const a=(({viewportId:e,viewportGridService:t})=>{const{viewports:n,activeViewportId:r}=t.getState(),o=e||r;return n.get(o)})({viewportId:t,viewportGridService:o}),s=a.displaySetInstanceUIDs[0],i=e[0],l=i.segmentationId,c=i.config.label,u=i.config.segments,d=r.getDisplaySetByUID(s);return await n.createLabelmapForDisplaySet(d,{segmentationId:l,segments:u,label:c}),n.addOrUpdateSegmentation(i),await n.addSegmentationRepresentation(a.viewportId,{segmentationId:l}),l},generateSegmentation:({segmentationId:e,options:t={}})=>{const r=D.segmentation.state.getSegmentation(e),{imageIds:o}=r.representationData.Labelmap,a=o.map(e=>x.cache.getImage(e)),s=a.map(e=>x.cache.getImage(e.referencedImageId)),i=[];let l=0;for(const e of a){const t=new Set,n=e.getPixelData(),{rows:r,columns:o}=e;for(let e=0;e<n.length;e++){const r=n[e];0!==r&&t.add(r)}i[l++]={segmentsOnLabelmap:Array.from(t),pixelData:n,rows:r,columns:o}}const c=i.map(e=>e.segmentsOnLabelmap),u={segmentsOnLabelmap:Array.from(new Set(c.flat())),metadata:[],labelmaps2D:i},d=n.getSegmentation(e),m=n.getRepresentationsForSegmentation(e);Object.entries(d.segments).forEach(([t,r])=>{if(!r)return;const{label:o}=r,a=m[0],s=n.getSegmentColor(a.viewportId,e,r.segmentIndex),i=R().data.Colors.rgb2DICOMLAB(s.slice(0,3).map(e=>e/255)).map(e=>Math.round(e)),l={SegmentNumber:t.toString(),SegmentLabel:o,SegmentAlgorithmType:r?.algorithmType||"MANUAL",SegmentAlgorithmName:r?.algorithmName||"OHIF Brush",RecommendedDisplayCIELabValue:i,SegmentedPropertyCategoryCodeSequence:{CodeValue:"T-D0050",CodingSchemeDesignator:"SRT",CodeMeaning:"Tissue"},SegmentedPropertyTypeCodeSequence:{CodeValue:"T-D0050",CodingSchemeDesignator:"SRT",CodeMeaning:"Tissue"}};u.metadata[t]=l});return L(s,u,x.metaData,t)},downloadSegmentation:({segmentationId:e})=>{const t=n.getSegmentation(e),r=a.generateSegmentation({segmentationId:e});F(r.dataset,`${t.label}`)},storeSegmentation:async({segmentationId:r,dataSource:o})=>{const s=n.getSegmentation(r);if(!s)throw new Error("No segmentation found");const{label:i}=s,l=o??t.getActiveDataSource()[0],{value:c,dataSourceName:u,action:d}=await(0,j.createReportDialogPrompt)({servicesManager:e,extensionManager:t,title:"Store Segmentation"});if(d===A.CREATE_REPORT)try{const e=u?t.getDataSources(u)[0]:l,n=a.generateSegmentation({segmentationId:r,options:{SeriesDescription:c||i||"Research Derived Series"}});if(!n||!n.dataset)throw new Error("Error during segmentation generation");const{dataset:o}=n;return"No Study ID"===o.StudyID&&(o.StudyID=""),await e.store.dicom(o),o.wadoRoot=e.getConfig().wadoRoot,h.DicomMetadataStore.addInstances([o],!0),o}catch(e){throw console.debug("Error storing segmentation:",e),e}},downloadRTSS:async({segmentationId:e})=>{const t=n.getSegmentation(e),r=n.getRepresentationsForSegmentation(e)[0];Object.entries(t.segments).forEach(([t,o])=>{o.color=n.getSegmentColor(r.viewportId,e,t)});const o=await G(t,h.classes.MetadataProvider,h.DicomMetadataStore);try{const e=k(o),t=URL.createObjectURL(e);window.location.assign(t)}catch(e){console.warn(e)}},toggleActiveSegmentationUtility:({itemId:e})=>{const{uiState:t,setUIState:n}=j.useUIStateStore.getState(),r=t.activeSegmentationUtility===e;console.log("toggleActiveSegmentationUtility",r,e),n("activeSegmentationUtility",r?null:e)}},s={loadSegmentationsForViewport:{commandFn:a.loadSegmentationsForViewport},generateSegmentation:{commandFn:a.generateSegmentation},downloadSegmentation:{commandFn:a.downloadSegmentation},storeSegmentation:{commandFn:a.storeSegmentation},downloadRTSS:{commandFn:a.downloadRTSS},toggleActiveSegmentationUtility:{commandFn:a.toggleActiveSegmentationUtility}};return{actions:a,definitions:s,defaultContext:"SEGMENTATION"}};var q=S(669),$=S(55),B=S(154);const{LogicalOperation:H}=B.contourSegmentation,z=[{value:"merge",logicalOperation:H.Union,label:"Merge",icon:"actions-combine-merge",helperIcon:"helper-combine-merge"},{value:"intersect",logicalOperation:H.Intersect,label:"Intersect",icon:"actions-combine-intersect",helperIcon:"helper-combine-intersect"},{value:"subtract",logicalOperation:H.Subtract,label:"Subtract",icon:"actions-combine-subtract",helperIcon:"helper-combine-subtract"}];function Y({label:e,value:t,onValueChange:n,segments:r,placeholder:o="Select a segment"}){return I.createElement("div",{className:"flex justify-between gap-6"},I.createElement("div",null,e),I.createElement($.Select,{key:`select-segment-${e}`,onValueChange:n,value:t},I.createElement($.SelectTrigger,{className:"overflow-hidden"},I.createElement($.SelectValue,{placeholder:o})),I.createElement($.SelectContent,null,r.map(e=>I.createElement($.SelectItem,{key:e.segmentIndex,value:e.segmentIndex.toString()},e.label)))))}const W=function(){const{servicesManager:e}=(0,h.useSystem)(),{segmentationService:t}=e.services,{segmentationsWithRepresentations:n}=(0,q.useActiveViewportSegmentationRepresentations)(),r=n?.find(({representation:e})=>e?.active),o=r?Object.values(r.segmentation.segments):[],a=r?t.getNextAvailableSegmentIndex(r.segmentation.segmentationId):1,s=o.find(e=>e.active),i=s?.segmentIndex||0,[l,c]=(0,I.useState)(z[0]),[u,d]=(0,I.useState)(i?.toString()||""),[m,p]=(0,I.useState)(""),[g,f]=(0,I.useState)(!1),[S,y]=(0,I.useState)("");(0,I.useEffect)(()=>{d(i?.toString()||null)},[i]),(0,I.useEffect)(()=>{y(`Segment ${a}`)},[a]);const v=(0,h.useRunCommand)(),b=(0,I.useCallback)(()=>{let e=u;g&&(e=a.toString(),v("addSegment",{segmentationId:r.segmentation.segmentationId,config:{label:S,segmentIndex:a}})),v("applyLogicalContourOperation",{segmentAInfo:{segmentationId:r.segmentation.segmentationId,segmentIndex:parseInt(u)},segmentBInfo:{segmentationId:r.segmentation.segmentationId,segmentIndex:parseInt(m)},resultSegmentInfo:{segmentationId:r.segmentation.segmentationId,segmentIndex:parseInt(e)},logicalOperation:l.logicalOperation})},[r?.segmentation?.segmentationId,g,S,a,l.logicalOperation,v,u,m]);return I.createElement("div",{className:"flex w-[245px] flex-col gap-4"},I.createElement("div",{className:"flex items-start justify-between"},I.createElement("div",{className:"flex w-auto flex-col items-center gap-2 text-base font-normal leading-none"},I.createElement($.Tabs,{value:l.value},I.createElement($.TabsList,{className:"inline-flex space-x-1"},z.map(e=>{const{value:t,icon:n}=e;return I.createElement($.TabsTrigger,{value:t,key:`logical-contour-operation-${t}`,onClick:()=>c(e)},I.createElement($.Icons.ByName,{name:n}))}))),I.createElement("div",null,l.label)),I.createElement("div",{className:"bg-primary-dark flex h-[62px] w-[88px] items-center justify-center rounded-lg"},I.createElement($.Icons.ByName,{name:l.helperIcon}))),I.createElement(Y,{label:"A",value:u,onValueChange:d,segments:o}),I.createElement(Y,{label:"B",value:m,onValueChange:p,segments:o}),I.createElement("div",{className:"flex justify-end pl-[34px]"},I.createElement($.Button,{className:"border-primary/60 grow border",variant:"ghost",onClick:()=>{b()}},l.label)),I.createElement($.Separator,{className:"bg-input mt-2 h-[1px]"}),I.createElement("div",{className:"flex flex-col gap-2"},I.createElement("div",{className:"flex items-center justify-start gap-2"},I.createElement($.Switch,{id:"logical-contour-operations-create-new-segment-switch",onCheckedChange:f}),I.createElement($.Label,{htmlFor:"logical-contour-operations-create-new-segment-switch"},"Create a new segment")),I.createElement("div",{className:"pl-9"},I.createElement($.Input,{className:(0,$.cn)(g?"visible":"hidden"),disabled:!g,id:"logical-contour-operations-create-new-segment-input",type:"text",placeholder:"New segment name",value:S,onChange:e=>y(e.target.value)}))))};const J=function(){const[e,t]=(0,I.useState)(10),n=(0,h.useRunCommand)();return I.createElement("div",{className:"flex w-auto w-[252px] flex-col gap-[8px] text-base font-normal leading-none"},I.createElement("div",{className:"flex w-auto flex-col gap-[10px] text-base font-normal leading-none"},I.createElement("div",null,"Fill contour holes"),I.createElement($.Button,{className:"border-primary/60 border",variant:"ghost",onClick:()=>{n("removeContourHoles")}},"Fill Holes"),I.createElement($.Separator,{className:"bg-input mt-[20px] h-[1px]"})),I.createElement("div",{className:"flex w-auto flex-col gap-[10px] text-base font-normal leading-none"},I.createElement("div",null,"Remove Small Contours"),I.createElement("div",{className:"flex items-center gap-2 self-end"},I.createElement($.Label,{htmlFor:"simplify-contour-options",className:"text-muted-foreground"},"Area Threshold"),I.createElement($.Input,{id:"simplify-contour-options",className:"w-20",type:"number",value:e,onChange:e=>t(Number(e.target.value))})),I.createElement($.Button,{className:"border-primary/60 border",variant:"ghost",onClick:()=>{n("removeSmallContours",{areaThreshold:e})}},"Remove Small Contours"),I.createElement($.Separator,{className:"bg-input mt-[20px] h-[1px]"})),I.createElement("div",{className:"flex w-auto flex-col gap-[10px] text-base font-normal leading-none"},I.createElement("div",null,"Create New Segment from Holes"),I.createElement($.Button,{className:"border-primary/60 border",variant:"ghost",onClick:()=>{n("convertContourHoles")}},"Create New Segment")))};const K=function(){const e=(0,h.useRunCommand)();return I.createElement("div",{className:"flex w-auto w-[245px] flex-col gap-[8px] text-base font-normal leading-none"},I.createElement("div",{className:"flex w-auto flex-col gap-[10px] text-base font-normal leading-none"},I.createElement("div",null,"Smooth all edges"),I.createElement($.Button,{className:"border-primary/60 border",variant:"ghost",onClick:()=>{e("smoothContours")}},"Smooth Edges"),I.createElement($.Separator,{className:"bg-input mt-[20px] h-[1px]"})),I.createElement("div",{className:"flex w-auto flex-col gap-[10px] text-base font-normal leading-none"},I.createElement("div",null,"Remove extra points"),I.createElement($.Button,{className:"border-primary/60 border",variant:"ghost",onClick:()=>{e("decimateContours")}},"Remove Points")))};function Q(){return Q=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Q.apply(null,arguments)}const X=I.lazy(()=>Promise.resolve().then(S.bind(S,275))),Z=e=>I.createElement(I.Suspense,{fallback:I.createElement("div",null,"Loading...")},I.createElement(X,e)),ee={id:v,getCommandsModule:V,getToolbarModule:function({servicesManager:e}){const{segmentationService:t,toolbarService:n,toolGroupService:r}=e.services;return[{name:"cornerstone.SimplifyContourOptions",defaultComponent:J},{name:"cornerstone.LogicalContourOperationsOptions",defaultComponent:W},{name:"cornerstone.SmoothContoursOptions",defaultComponent:K},{name:"cornerstone.isActiveSegmentationUtility",evaluate:({button:e})=>{const{uiState:t}=j.useUIStateStore.getState();return{isActive:t.activeSegmentationUtility===e.id}}},{name:"evaluate.cornerstone.hasSegmentation",evaluate:({viewportId:e})=>{const n=t.getSegmentationRepresentations(e);return{disabled:!n?.length}}},{name:"evaluate.cornerstone.hasSegmentationOfType",evaluate:({viewportId:e,segmentationRepresentationType:n})=>{const r=t.getSegmentationRepresentations(e);return r?.length?r.some(e=>Boolean(e.type===n))?void 0:{disabled:!0,disabledText:`No ${n} segmentations available`}:{disabled:!0,disabledText:"No segmentations available"}}},{name:"evaluate.cornerstone.segmentation",evaluate:({viewportId:e,button:o,toolNames:a,disabledText:s})=>{const i=t.getSegmentationRepresentations(e);if(!i?.length)return{disabled:!0,disabledText:s??"No segmentations available"};const l=t.getActiveSegmentation(e);if(!Object.keys(l.segments).length)return{disabled:!0,disabledText:"Add segment to enable this tool"};const c=r.getToolGroupForViewport(e);if(!c)return{disabled:!0,disabledText:s??"Not available on the current viewport"};if(!a)return{disabled:!1};const u=n.getToolNameForButton(o);if(!c.hasTool(u)&&!a)return{disabled:!0,disabledText:s??"Not available on the current viewport"};return{disabled:!1,isActive:a?a.includes(c.getActivePrimaryMouseButtonTool()):c.getActivePrimaryMouseButtonTool()===u}}}]},getViewportModule:({servicesManager:e,extensionManager:t,commandsManager:n})=>[{name:"dicom-seg",component:r=>I.createElement(Z,Q({servicesManager:e,extensionManager:t,commandsManager:n},r))}],getSopClassHandlerModule:M,getHangingProtocolModule:P};return y=S.O(y)})());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ohif/extension-cornerstone-dicom-seg",
3
- "version": "3.12.0-beta.76",
3
+ "version": "3.12.0-beta.78",
4
4
  "description": "DICOM SEG read workflow",
5
5
  "author": "OHIF",
6
6
  "license": "MIT",
@@ -33,10 +33,10 @@
33
33
  "start": "yarn run dev"
34
34
  },
35
35
  "peerDependencies": {
36
- "@ohif/core": "3.12.0-beta.76",
37
- "@ohif/extension-cornerstone": "3.12.0-beta.76",
38
- "@ohif/extension-default": "3.12.0-beta.76",
39
- "@ohif/i18n": "3.12.0-beta.76",
36
+ "@ohif/core": "3.12.0-beta.78",
37
+ "@ohif/extension-cornerstone": "3.12.0-beta.78",
38
+ "@ohif/extension-default": "3.12.0-beta.78",
39
+ "@ohif/i18n": "3.12.0-beta.78",
40
40
  "prop-types": "15.8.1",
41
41
  "react": "18.3.1",
42
42
  "react-dom": "18.3.1",
@@ -46,8 +46,8 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@babel/runtime": "7.28.2",
49
- "@cornerstonejs/adapters": "4.5.19",
50
- "@cornerstonejs/core": "4.5.19",
49
+ "@cornerstonejs/adapters": "4.5.20",
50
+ "@cornerstonejs/core": "4.5.20",
51
51
  "@kitware/vtk.js": "32.12.0",
52
52
  "react-color": "2.19.3"
53
53
  }