@ohif/extension-cornerstone-dicom-rt 3.13.0-beta.7 → 3.13.0-beta.71

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-rt.umd.js.LICENSE.txt */
2
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("@ohif/i18n"),require("dcmjs"),require("@cornerstonejs/tools/enums"),require("@ohif/ui-next"),require("@ohif/extension-cornerstone"),require("@ohif/core/src")):"function"==typeof define&&define.amd?define(["@ohif/core","@ohif/i18n","dcmjs","@cornerstonejs/tools/enums","@ohif/ui-next","@ohif/extension-cornerstone","@ohif/core/src"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-rt"]=t(require("@ohif/core"),require("@ohif/i18n"),require("dcmjs"),require("@cornerstonejs/tools/enums"),require("@ohif/ui-next"),require("@ohif/extension-cornerstone"),require("@ohif/core/src")):e["ohif-extension-cornerstone-dicom-rt"]=t(e["@ohif/core"],e["@ohif/i18n"],e.dcmjs,e["@cornerstonejs/tools/enums"],e["@ohif/ui-next"],e["@ohif/extension-cornerstone"],e["@ohif/core/src"])}(globalThis,(e,t,r,n,o,s,a)=>(()=>{var i,c,u={585:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>d});var n=r(326),o=r(598),s=r.n(o),a=r(55),i=r(669);const c=function({servicesManager:e,rtDisplaySet:t,viewportId:r,preHydrateCallbacks:n,hydrateRTDisplaySet:o}){return i.utils.promptHydrationDialog({servicesManager:e,viewportId:r,displaySet:t,preHydrateCallbacks:n,hydrateCallback:o,type:"RTSTRUCT"})};const u=function(e,t,r){const n=t.getCustomization("cornerstone.overlayViewportTools");return e.createToolGroupAndAddTools(r,n)};var l=r(459);function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},f.apply(null,arguments)}function p(e){const{servicesManager:t,commandsManager:r}=(0,l.useSystem)(),{children:o,displaySets:s,viewportOptions:p}=e,{displaySetService:d,toolGroupService:S,segmentationService:y,customizationService:I}=t.services,m=p.viewportId,v=`RTToolGroup-${m}`;if(s.length>1)throw new Error("RT viewport should only have a single display set");const h=I.getCustomization("ui.loadingIndicatorTotalPercent"),D=s[0],[{viewports:b,activeViewportId:R},g]=(0,a.useViewportGrid)(),{setPositionPresentation:O}=(0,i.usePositionPresentationStore)(),[C,T]=(0,n.useState)(!D.isLoaded),[U,w]=(0,n.useState)({percentComplete:null,totalSegments:null}),E=(0,n.useRef)(null),P=D.referencedDisplaySetInstanceUID;if(!P){const e=I.getCustomization("missingReferenceDisplaySetHandler"),{handled:t}=e();if(t)return}const _=d.getDisplaySetByUID(P),x=function(e){const t=e.images[0],r={PatientID:t.PatientID,PatientName:t.PatientName,PatientSex:t.PatientSex,PatientAge:t.PatientAge,SliceThickness:t.SliceThickness,StudyDate:t.StudyDate,SeriesDescription:t.SeriesDescription,SeriesInstanceUID:t.SeriesInstanceUID,SeriesNumber:t.SeriesNumber,ManufacturerModelName:t.ManufacturerModelName,SpacingBetweenSlices:t.SpacingBetweenSlices};return r}(_);E.current={displaySet:_,metadata:x},(0,n.useEffect)(()=>{C||m===R&&c({servicesManager:t,viewportId:m,rtDisplaySet:D,hydrateRTDisplaySet:async()=>r.runCommand("hydrateSecondaryDisplaySet",{displaySet:D,viewportId:m})})},[t,m,D,C,r,R]),(0,n.useEffect)(()=>{const{unsubscribe:e}=y.subscribe(y.EVENTS.SEGMENTATION_LOADING_COMPLETE,e=>{if(e.rtDisplaySet?.displaySetInstanceUID===D.displaySetInstanceUID&&T(!1),D?.firstSegmentedSliceImageId&&p?.presentationIds){const{firstSegmentedSliceImageId:e}=D,{presentationIds:t}=p;O(t.positionPresentationId,{viewportType:"stack",viewReference:{referencedImageId:e},viewPresentation:{}})}});return()=>{e()}},[D]),(0,n.useEffect)(()=>{const e=y.subscribe(y.EVENTS.SEGMENT_LOADING_COMPLETE,({percentComplete:e,numSegments:t})=>{w({percentComplete:e,totalSegments:t})}),t=d.subscribe(d.EVENTS.DISPLAY_SETS_REMOVED,({displaySetInstanceUIDs:e})=>{const t=b.get(R);e.includes(t.displaySetInstanceUID)&&g.setDisplaySetsForViewport({viewportId:R,displaySetInstanceUIDs:[]})});return()=>{e.unsubscribe(),t.unsubscribe()}},[D,d,b,R,g]),(0,n.useEffect)(()=>{let e=S.getToolGroup(v);if(!e)return e=u(S,I,v),()=>{y.removeSegmentationRepresentations(m),E.current=null,S.destroyToolGroup(v)}},[]);const N=(0,n.useCallback)(()=>{const{displaySet:t}=E.current;return n.createElement(i.OHIFCornerstoneViewport,f({},e,{displaySets:[t,D],viewportOptions:{viewportType:p.viewportType,toolGroupId:v,orientation:p.orientation,viewportId:p.viewportId,presentationIds:p.presentationIds},onElementEnabled:t=>{e.onElementEnabled?.(t)}}))},[m,D,v]);let j=null;return E.current&&_.displaySetInstanceUID===E.current.displaySet.displaySetInstanceUID?(o&&o.length&&(j=o.map((e,t)=>e&&n.cloneElement(e,{viewportId:m,key:t}))),n.createElement(n.Fragment,null,n.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},C&&n.createElement(h,{className:"h-full w-full",totalNumbers:U.totalSegments,percentComplete:U.percentComplete,loadingText:"Loading RTSTRUCT..."}),N(),j))):null}p.propTypes={displaySets:s().arrayOf(s().object),viewportId:s().string.isRequired,dataSource:s().object,children:s().node};const d=p},856:(e,t,r)=>{"use strict";var n=r(183);function o(){}function s(){}s.resetWarningCache=o,e.exports=function(){function e(e,t,r,o,s,a){if(a!==n){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:s,resetWarningCache:o};return r.PropTypes=r,r}},598:(e,t,r)=>{e.exports=r(856)()},183:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},249:(e,t)=>{"use strict";var r=Symbol.for("react.element"),n=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),i=Symbol.for("react.provider"),c=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),l=Symbol.for("react.suspense"),f=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),d=Symbol.iterator;var S={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},y=Object.assign,I={};function m(e,t,r){this.props=e,this.context=t,this.refs=I,this.updater=r||S}function v(){}function h(e,t,r){this.props=e,this.context=t,this.refs=I,this.updater=r||S}m.prototype.isReactComponent={},m.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")},m.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=m.prototype;var D=h.prototype=new v;D.constructor=h,y(D,m.prototype),D.isPureReactComponent=!0;var b=Array.isArray,R=Object.prototype.hasOwnProperty,g={current:null},O={key:!0,ref:!0,__self:!0,__source:!0};function C(e,t,n){var o,s={},a=null,i=null;if(null!=t)for(o in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(a=""+t.key),t)R.call(t,o)&&!O.hasOwnProperty(o)&&(s[o]=t[o]);var c=arguments.length-2;if(1===c)s.children=n;else if(1<c){for(var u=Array(c),l=0;l<c;l++)u[l]=arguments[l+2];s.children=u}if(e&&e.defaultProps)for(o in c=e.defaultProps)void 0===s[o]&&(s[o]=c[o]);return{$$typeof:r,type:e,key:a,ref:i,props:s,_owner:g.current}}function T(e){return"object"==typeof e&&null!==e&&e.$$typeof===r}var U=/\/+/g;function w(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(e,t,o,s,a){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 r:case n:c=!0}}if(c)return a=a(c=e),e=""===s?"."+w(c,0):s,b(a)?(o="",null!=e&&(o=e.replace(U,"$&/")+"/"),E(a,t,o,"",function(e){return e})):null!=a&&(T(a)&&(a=function(e,t){return{$$typeof:r,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(a,o+(!a.key||c&&c.key===a.key?"":(""+a.key).replace(U,"$&/")+"/")+e)),t.push(a)),1;if(c=0,s=""===s?".":s+":",b(e))for(var u=0;u<e.length;u++){var l=s+w(i=e[u],u);c+=E(i,t,o,l,a)}else if(l=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=d&&e[d]||e["@@iterator"])?e:null}(e),"function"==typeof l)for(e=l.call(e),u=0;!(i=e.next()).done;)c+=E(i=i.value,t,o,l=s+w(i,u++),a);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 P(e,t,r){if(null==e)return e;var n=[],o=0;return E(e,n,"","",function(e){return t.call(r,e,o++)}),n}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 x={current:null},N={transition:null},j={ReactCurrentDispatcher:x,ReactCurrentBatchConfig:N,ReactCurrentOwner:g};function M(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:P,forEach:function(e,t,r){P(e,function(){t.apply(this,arguments)},r)},count:function(e){var t=0;return P(e,function(){t++}),t},toArray:function(e){return P(e,function(e){return e})||[]},only:function(e){if(!T(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=m,t.Fragment=o,t.Profiler=a,t.PureComponent=h,t.StrictMode=s,t.Suspense=l,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=j,t.act=M,t.cloneElement=function(e,t,n){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=y({},e.props),s=e.key,a=e.ref,i=e._owner;if(null!=t){if(void 0!==t.ref&&(a=t.ref,i=g.current),void 0!==t.key&&(s=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(u in t)R.call(t,u)&&!O.hasOwnProperty(u)&&(o[u]=void 0===t[u]&&void 0!==c?c[u]:t[u])}var u=arguments.length-2;if(1===u)o.children=n;else if(1<u){c=Array(u);for(var l=0;l<u;l++)c[l]=arguments[l+2];o.children=c}return{$$typeof:r,type:e.type,key:s,ref:a,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=C,t.createFactory=function(e){var t=C.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:u,render:e}},t.isValidElement=T,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:_}},t.memo=function(e,t){return{$$typeof:f,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=N.transition;N.transition={};try{e()}finally{N.transition=t}},t.unstable_act=M,t.useCallback=function(e,t){return x.current.useCallback(e,t)},t.useContext=function(e){return x.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return x.current.useDeferredValue(e)},t.useEffect=function(e,t){return x.current.useEffect(e,t)},t.useId=function(){return x.current.useId()},t.useImperativeHandle=function(e,t,r){return x.current.useImperativeHandle(e,t,r)},t.useInsertionEffect=function(e,t){return x.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return x.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return x.current.useMemo(e,t)},t.useReducer=function(e,t,r){return x.current.useReducer(e,t,r)},t.useRef=function(e){return x.current.useRef(e)},t.useState=function(e){return x.current.useState(e)},t.useSyncExternalStore=function(e,t,r){return x.current.useSyncExternalStore(e,t,r)},t.useTransition=function(){return x.current.useTransition()},t.version="18.3.1"},326:(e,t,r)=>{"use strict";e.exports=r(249)},404:e=>{"use strict";e.exports=n},2:t=>{"use strict";t.exports=e},459:e=>{"use strict";e.exports=a},669:e=>{"use strict";e.exports=s},545:e=>{"use strict";e.exports=t},55:e=>{"use strict";e.exports=o},111:e=>{"use strict";e.exports=r}},l={};function f(e){var t=l[e];if(void 0!==t)return t.exports;var r=l[e]={exports:{}};return u[e](r,r.exports,f),r.exports}f.m=u,i=[],f.O=(e,t,r,n)=>{if(!t){var o=1/0;for(u=0;u<i.length;u++){for(var[t,r,n]=i[u],s=!0,a=0;a<t.length;a++)(!1&n||o>=n)&&Object.keys(f.O).every(e=>f.O[e](t[a]))?t.splice(a--,1):(s=!1,n<o&&(o=n));if(s){i.splice(u--,1);var c=r();void 0!==c&&(e=c)}}return e}n=n||0;for(var u=i.length;u>0&&i[u-1][2]>n;u--)i[u]=i[u-1];i[u]=[t,r,n]},f.F={},f.E=e=>{Object.keys(f.F).map(t=>{f.F[t](e)})},f.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return f.d(t,{a:t}),t},f.d=(e,t)=>{for(var r in t)f.o(t,r)&&!f.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},f.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c={524:0},f.F.j=e=>{if(!f.o(c,e)||void 0===c[e]){c[e]=null;var t=document.createElement("link");f.nc&&t.setAttribute("nonce",f.nc),t.rel="prefetch",t.as="script",t.href=f.p+f.u(e),document.head.appendChild(t)}},f.O.j=e=>0===c[e],f.O(0,[524],()=>{f.E(524)},5);var p={};return(()=>{"use strict";f.r(p),f.d(p,{default:()=>w});const e=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-rt"}').UU,t=`${e}.sopClassHandlerModule.dicom-rt`;var r=f(326),n=f(2),o=f(545),s=f.n(o),a=f(111),i=f.n(a);const{DicomMessage:c,DicomMetaDictionary:u}=i().data,l=i().data.Colors.dicomlab2RGB;const d=async({extensionManager:e,rtStructDisplaySet:t,headers:r})=>{const n=e.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common"),{dicomLoaderService:o}=n.exports,s=await o.findDicomDataPromise(t,null,r),a=c.readFile(s),i=u.naturalizeDataset(a.dict);return i._meta=u.namifyDataset(a.meta),i};async function S(e,t,r){const n=e.getActiveDataSource()[0],{bulkDataURI:o}=n.getConfig?.()||{};t.isLoaded=!0;let s=t.instance;s=o&&o.enabled?await async function({instance:e,dataSource:t,extensionManager:r,rtStructDisplaySet:n,headers:o}){let s=e;if(!(s&&s.ROIContourSequence||(s=await d({extensionManager:r,rtStructDisplaySet:n,headers:o}),s&&s.ROIContourSequence)))return Promise.reject("Invalid instance object or ROIContourSequence");const a=new Map;for(const e of s.ROIContourSequence){const r=e.ReferencedROINumber;if(e&&e.ContourSequence)for(const n of e.ContourSequence){if(!n||!n.ContourData)return Promise.reject("Invalid Contour or ContourData");const e=n.ContourData;if(Array.isArray(e))a.has(r)?a.get(r).push(Promise.resolve(e)):a.set(r,[Promise.resolve(e)]);else if(e&&e.BulkDataURI){const n=e.BulkDataURI;if(!t||!t.retrieve||!t.retrieve.bulkDataURI)return Promise.reject("Invalid dataSource object or retrieve function");const o=t.retrieve.bulkDataURI({BulkDataURI:n,StudyInstanceUID:s.StudyInstanceUID,SeriesInstanceUID:s.SeriesInstanceUID,SOPInstanceUID:s.SOPInstanceUID});a.has(r)?a.get(r).push(o):a.set(r,[o])}else{if(!e||!e.InlineBinary)return Promise.reject(`Invalid ContourData: ${e}`);{const t=e.InlineBinary,n=atob(t).split("\\"),o=[];if(n.length%3!=0)return Promise.reject("ContourData raw values not divisible by 3");for(let e=0;e<n.length;e+=3)if(e+2<n.length){const t=parseFloat(n[e]),r=parseFloat(n[e+1]),s=parseFloat(n[e+2]);if(isNaN(t)||isNaN(r)||isNaN(s))return Promise.reject("Error parsing contourData from InlineBinary format");o.push(t),o.push(r),o.push(s)}a.has(r)?a.get(r).push(o):a.set(r,[o])}}}else a.set(r,[Promise.resolve([])])}const i=new Map;for(const[e,t]of a.entries())i.set(e,await Promise.allSettled(t));return s.ROIContourSequence.forEach(e=>{try{const t=e.ReferencedROINumber,r=i.get(t);e.ContourSequence&&e.ContourSequence.forEach((e,t)=>{const n=r[t];if("fulfilled"===n.status)if(Array.isArray(n.value)&&n.value.every(e=>Number.isFinite(Number(e))))e.ContourData=n.value.map(Number);else{const t=new Uint8Array(n.value),r=(new TextDecoder).decode(t);"string"==typeof r&&r.includes("\\")?e.ContourData=r.split("\\").map(parseFloat):e.ContourData=[]}else console.error(n.reason)})}catch(e){console.error(e)}}),s}({instance:s,dataSource:n,extensionManager:e,rtStructDisplaySet:t,headers:r}):await d({extensionManager:e,rtStructDisplaySet:t,headers:r});const{StructureSetROISequence:a,ROIContourSequence:i,RTROIObservationsSequence:c}=s,u={StructureSetLabel:s.StructureSetLabel,SeriesInstanceUID:s.SeriesInstanceUID,ROIContours:[],visible:!0,ReferencedSOPInstanceUIDsSet:new Set};for(let e=0;e<i.length;e++){const t=i[e],{ContourSequence:r}=t;if(!r)continue;const n=I(r),o=[];for(const e of n){const{ContourData:t,NumberOfContourPoints:r,ContourGeometricType:n,ContourImageSequence:s}=e,a=[];for(let e=0;e<3*r;e+=3)a.push({x:t[e],y:t[e+1],z:t[e+2]});const i=new Map([["CLOSED_PLANAR",!1],["OPEN_NONPLANAR",!1],["OPEN_PLANAR",!1],["POINT",!0]]);o.push({numberOfPoints:r,points:a,type:n,isSupported:i.get(n)??!1}),s?.ReferencedSOPInstanceUID&&u.ReferencedSOPInstanceUIDsSet.add(s?.ReferencedSOPInstanceUID)}y(u,a,c,t,o)}return u}function y(e,t,r,n,o){const s=t.find(e=>e.ROINumber===n.ReferencedROINumber),a={ROINumber:s.ROINumber,ROIName:s.ROIName,ROIGenerationAlgorithm:s.ROIGenerationAlgorithm,ROIDescription:s.ROIDescription,contourPoints:o,visible:!0,colorArray:[]};!function(e,t){let{ROIDisplayColor:r,RecommendedDisplayCIELabValue:n}=e;!r&&n&&(r=l(n));r&&(t.colorArray=[...r])}(n,a),r&&function(e,t,r){const n=t.find(e=>e.ReferencedROINumber===r);if(n){const{ObservationNumber:t,ROIObservationDescription:r,RTROIInterpretedType:o,ROIInterpreter:s}=n;e.RTROIObservations={ObservationNumber:t,ROIObservationDescription:r,RTROIInterpretedType:o,ROIInterpreter:s}}}(a,r,n.ReferencedROINumber),e.ROIContours.push(a)}function I(e){return Array.isArray(e)?e:[e]}const{sopClassDictionary:m}=n.utils,v=[m.RTStructureSetStorage],h=new Set,D={};function b(e,r,o){n.utils.sortStudyInstances(e);const a=e[e.length-1],{StudyInstanceUID:i,SeriesInstanceUID:c,SOPInstanceUID:u,SeriesDescription:l="",SeriesNumber:f,SeriesDate:p,SeriesTime:d,StructureSetDate:y,StructureSetTime:I,SOPClassUID:m,wadoRoot:b,wadoUri:R,wadoUriRoot:g,imageId:O}=a,C={Modality:"RTSTRUCT",loading:!1,isReconstructable:!1,displaySetInstanceUID:n.utils.guid(),SeriesDescription:l,SeriesNumber:f,SeriesDate:y||p,SeriesTime:I||d,SOPInstanceUID:u,SeriesInstanceUID:c,StudyInstanceUID:i,SOPClassHandlerId:t,SOPClassUID:m,referencedImages:null,referencedSeriesInstanceUID:null,referencedDisplaySetInstanceUID:null,isDerivedDisplaySet:!0,isLoaded:!1,isHydrated:!1,structureSet:null,sopClassUids:v,instance:a,instances:e,predecessorImageId:O,wadoRoot:b,wadoUriRoot:g,wadoUri:R,isOverlayDisplaySet:!0,label:l||`${s().t("Series")} ${f} - ${s().t("RTSTRUCT")}`};let T=a.ReferencedSeriesSequence;if(a.ReferencedFrameOfReferenceSequence?.RTReferencedStudySequence&&!a.ReferencedSeriesSequence&&(a.ReferencedSeriesSequence=function(e){const t=[];return e.forEach(e=>{const{RTReferencedStudySequence:r}=e;r.forEach(e=>{const{RTReferencedSeriesSequence:r}=e;r.forEach(e=>{const r=[],{ContourImageSequence:n,SeriesInstanceUID:o}=e;n.forEach(e=>{r.push({ReferencedSOPInstanceUID:e.ReferencedSOPInstanceUID,ReferencedSOPClassUID:e.ReferencedSOPClassUID})});const s={SeriesInstanceUID:o,ReferencedInstanceSequence:r};t.push(s)})})}),t}(a.ReferencedFrameOfReferenceSequence),T=a.ReferencedSeriesSequence),!T)return void console.error("ReferencedSeriesSequence is missing for the RTSTRUCT");const U=T[0];C.referencedImages=a.ReferencedSeriesSequence.ReferencedInstanceSequence,C.referencedSeriesInstanceUID=U.SeriesInstanceUID;const{displaySetService:w}=r.services,E=w.getDisplaySetsForReferences(T);if(E?.length>1&&console.warn("Reference applies to more than 1 display set for Contours, applying only to first display set"),E&&0!==E.length){const[e]=E;C.referencedDisplaySetInstanceUID=e.displaySetInstanceUID,C.isReconstructable=e.isReconstructable}else{const{unsubscribe:e}=w.subscribe(w.EVENTS.DISPLAY_SETS_ADDED,({displaySetsAdded:t})=>{const r=t[0];r.SeriesInstanceUID===C.referencedSeriesInstanceUID&&(C.referencedDisplaySetInstanceUID=r.displaySetInstanceUID,C.isReconstructable=r.isReconstructable,e())})}return C.load=({headers:e,createSegmentation:t=!0})=>function(e,t,r,n,o=!0){const{SOPInstanceUID:s}=e,{segmentationService:a}=t.services;if((e.loading||e.isLoaded)&&D[s]&&h.has(e.displaySetInstanceUID))return D[s];e.loading=!0;const{unsubscribe:i}=a.subscribe(a.EVENTS.SEGMENTATION_LOADING_COMPLETE,t=>{t.rtDisplaySet?.displaySetInstanceUID===e.displaySetInstanceUID&&(h.add(e.displaySetInstanceUID),i())});return D[s]=new Promise(async(t,s)=>{try{if(!e.structureSet){const t=await S(r,e,n);e.structureSet=t}o&&await a.createSegmentationForRTDisplaySet(e),t()}catch(e){s(e)}finally{e.loading=!1}}),D[s]}(C,r,o,e,t),[C]}const R=function(e){const{servicesManager:t,extensionManager:r}=e;return[{name:"dicom-rt",sopClassUids:v,getDisplaySetsFromSeries:e=>b(e,t,r)}]};var g=f(404);const O=({commandsManager:e,servicesManager:t})=>{const r=t.services,{displaySetService:n,viewportGridService:o}=r,s={hydrateRTSDisplaySet:({displaySet:t,viewportId:r})=>{if("RTSTRUCT"!==t.Modality)throw new Error("Display set is not an RTSTRUCT");const s=n.getDisplaySetByUID(t.referencedDisplaySetInstanceUID);e.runCommand("updateStoredSegmentationPresentation",{displaySet:t,type:g.SegmentationRepresentations.Contour}),e.runCommand("updateStoredPositionPresentation",{viewportId:r,displaySetInstanceUIDs:[s.displaySetInstanceUID]}),o.setDisplaySetsForViewport({viewportId:r,displaySetInstanceUIDs:[s.displaySetInstanceUID]})}};return{actions:s,definitions:{hydrateRTSDisplaySet:{commandFn:s.hydrateRTSDisplaySet,storeContexts:[],options:{}}},defaultContext:"cornerstone-dicom-rt"}};function C(){return C=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},C.apply(null,arguments)}const T=r.lazy(()=>Promise.resolve().then(f.bind(f,585))),U=e=>r.createElement(r.Suspense,{fallback:r.createElement("div",null,"Loading...")},r.createElement(T,e)),w={id:e,getCommandsModule:O,getViewportModule:({servicesManager:e,extensionManager:t,commandsManager:n})=>[{name:"dicom-rt",component:o=>r.createElement(U,C({servicesManager:e,extensionManager:t,commandsManager:n},o))}],getSopClassHandlerModule:R}})(),p=f.O(p)})());
2
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("@ohif/i18n"),require("@cornerstonejs/tools"),require("dcmjs"),require("@cornerstonejs/tools/enums"),require("@ohif/ui-next"),require("@ohif/extension-cornerstone"),require("@ohif/core/src")):"function"==typeof define&&define.amd?define(["@ohif/core","@ohif/i18n","@cornerstonejs/tools","dcmjs","@cornerstonejs/tools/enums","@ohif/ui-next","@ohif/extension-cornerstone","@ohif/core/src"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-rt"]=t(require("@ohif/core"),require("@ohif/i18n"),require("@cornerstonejs/tools"),require("dcmjs"),require("@cornerstonejs/tools/enums"),require("@ohif/ui-next"),require("@ohif/extension-cornerstone"),require("@ohif/core/src")):e["ohif-extension-cornerstone-dicom-rt"]=t(e["@ohif/core"],e["@ohif/i18n"],e["@cornerstonejs/tools"],e.dcmjs,e["@cornerstonejs/tools/enums"],e["@ohif/ui-next"],e["@ohif/extension-cornerstone"],e["@ohif/core/src"])}(globalThis,(e,t,r,n,o,s,a,i)=>(()=>{var c,u,l={585(e,t,r){"use strict";r.r(t),r.d(t,{default:()=>d});var n=r(326),o=r(598),s=r.n(o),a=r(55),i=r(669);const c=function({servicesManager:e,rtDisplaySet:t,viewportId:r,preHydrateCallbacks:n,hydrateRTDisplaySet:o}){return i.utils.promptHydrationDialog({servicesManager:e,viewportId:r,displaySet:t,preHydrateCallbacks:n,hydrateCallback:o,type:"RTSTRUCT"})};const u=function(e,t,r){const n=t.getCustomization("cornerstone.overlayViewportTools");return e.createToolGroupAndAddTools(r,n)};var l=r(459);function f(){return f=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},f.apply(null,arguments)}function p(e){const{servicesManager:t,commandsManager:r}=(0,l.useSystem)(),{children:o,displaySets:s,viewportOptions:p}=e,{displaySetService:d,toolGroupService:S,segmentationService:y,customizationService:m}=t.services,I=p.viewportId,v=`RTToolGroup-${I}`;if(s.length>1)throw new Error("RT viewport should only have a single display set");const h=m.getCustomization("ui.loadingIndicatorTotalPercent"),D=s[0],[{viewports:R,activeViewportId:b},g]=(0,a.useViewportGrid)(),{setPositionPresentation:O}=(0,i.usePositionPresentationStore)(),[C,U]=(0,n.useState)(!D.isLoaded),[w,T]=(0,n.useState)({percentComplete:null,totalSegments:null}),E=(0,n.useRef)(null),P=D.referencedDisplaySetInstanceUID;if(!P){const e=m.getCustomization("missingReferenceDisplaySetHandler"),{handled:t}=e();if(t)return}const _=d.getDisplaySetByUID(P),x=function(e){const t=e.images[0],r={PatientID:t.PatientID,PatientName:t.PatientName,PatientSex:t.PatientSex,PatientAge:t.PatientAge,SliceThickness:t.SliceThickness,StudyDate:t.StudyDate,SeriesDescription:t.SeriesDescription,SeriesInstanceUID:t.SeriesInstanceUID,SeriesNumber:t.SeriesNumber,ManufacturerModelName:t.ManufacturerModelName,SpacingBetweenSlices:t.SpacingBetweenSlices};return r}(_);E.current={displaySet:_,metadata:x},(0,n.useEffect)(()=>{C||I===b&&c({servicesManager:t,viewportId:I,rtDisplaySet:D,hydrateRTDisplaySet:async()=>r.runCommand("hydrateSecondaryDisplaySet",{displaySet:D,viewportId:I})})},[t,I,D,C,r,b]),(0,n.useEffect)(()=>{const{unsubscribe:e}=y.subscribe(y.EVENTS.SEGMENTATION_LOADING_COMPLETE,e=>{if(e.rtDisplaySet?.displaySetInstanceUID===D.displaySetInstanceUID&&U(!1),D?.firstSegmentedSliceImageId&&p?.presentationIds){const{firstSegmentedSliceImageId:e}=D,{presentationIds:t}=p;O(t.positionPresentationId,{viewportType:"stack",viewReference:{referencedImageId:e},viewPresentation:{}})}});return()=>{e()}},[D]),(0,n.useEffect)(()=>{const e=y.subscribe(y.EVENTS.SEGMENT_LOADING_COMPLETE,({percentComplete:e,numSegments:t})=>{T({percentComplete:e,totalSegments:t})}),t=d.subscribe(d.EVENTS.DISPLAY_SETS_REMOVED,({displaySetInstanceUIDs:e})=>{const t=R.get(b);e.includes(t.displaySetInstanceUID)&&g.setDisplaySetsForViewport({viewportId:b,displaySetInstanceUIDs:[]})});return()=>{e.unsubscribe(),t.unsubscribe()}},[D,d,R,b,g]),(0,n.useEffect)(()=>{let e=S.getToolGroup(v);if(!e)return e=u(S,m,v),()=>{y.removeRepresentationsFromViewport(I),E.current=null,S.destroyToolGroup(v)}},[]);const N=(0,n.useCallback)(()=>{const{displaySet:t}=E.current;return n.createElement(i.OHIFCornerstoneViewport,f({},e,{displaySets:[t,D],viewportOptions:{viewportType:p.viewportType,toolGroupId:v,orientation:p.orientation,viewportId:p.viewportId,presentationIds:p.presentationIds},onElementEnabled:t=>{e.onElementEnabled?.(t)}}))},[I,D,v]);let j=null;return E.current&&_.displaySetInstanceUID===E.current.displaySet.displaySetInstanceUID?(o&&o.length&&(j=o.map((e,t)=>e&&n.cloneElement(e,{viewportId:I,key:t}))),n.createElement(n.Fragment,null,n.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},C&&n.createElement(h,{className:"h-full w-full",totalNumbers:w.totalSegments,percentComplete:w.percentComplete,loadingText:"Loading RTSTRUCT..."}),N(),j))):null}p.propTypes={displaySets:s().arrayOf(s().object),viewportId:s().string.isRequired,dataSource:s().object,children:s().node};const d=p},856(e,t,r){"use strict";var n=r(183);function o(){}function s(){}s.resetWarningCache=o,e.exports=function(){function e(e,t,r,o,s,a){if(a!==n){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var r={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:s,resetWarningCache:o};return r.PropTypes=r,r}},598(e,t,r){e.exports=r(856)()},183(e){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},249(e,t){"use strict";var r=Symbol.for("react.element"),n=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),i=Symbol.for("react.provider"),c=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),l=Symbol.for("react.suspense"),f=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),d=Symbol.iterator;var S={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},y=Object.assign,m={};function I(e,t,r){this.props=e,this.context=t,this.refs=m,this.updater=r||S}function v(){}function h(e,t,r){this.props=e,this.context=t,this.refs=m,this.updater=r||S}I.prototype.isReactComponent={},I.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")},I.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=I.prototype;var D=h.prototype=new v;D.constructor=h,y(D,I.prototype),D.isPureReactComponent=!0;var R=Array.isArray,b=Object.prototype.hasOwnProperty,g={current:null},O={key:!0,ref:!0,__self:!0,__source:!0};function C(e,t,n){var o,s={},a=null,i=null;if(null!=t)for(o in void 0!==t.ref&&(i=t.ref),void 0!==t.key&&(a=""+t.key),t)b.call(t,o)&&!O.hasOwnProperty(o)&&(s[o]=t[o]);var c=arguments.length-2;if(1===c)s.children=n;else if(1<c){for(var u=Array(c),l=0;l<c;l++)u[l]=arguments[l+2];s.children=u}if(e&&e.defaultProps)for(o in c=e.defaultProps)void 0===s[o]&&(s[o]=c[o]);return{$$typeof:r,type:e,key:a,ref:i,props:s,_owner:g.current}}function U(e){return"object"==typeof e&&null!==e&&e.$$typeof===r}var w=/\/+/g;function T(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(e,t,o,s,a){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 r:case n:c=!0}}if(c)return a=a(c=e),e=""===s?"."+T(c,0):s,R(a)?(o="",null!=e&&(o=e.replace(w,"$&/")+"/"),E(a,t,o,"",function(e){return e})):null!=a&&(U(a)&&(a=function(e,t){return{$$typeof:r,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(a,o+(!a.key||c&&c.key===a.key?"":(""+a.key).replace(w,"$&/")+"/")+e)),t.push(a)),1;if(c=0,s=""===s?".":s+":",R(e))for(var u=0;u<e.length;u++){var l=s+T(i=e[u],u);c+=E(i,t,o,l,a)}else if(l=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=d&&e[d]||e["@@iterator"])?e:null}(e),"function"==typeof l)for(e=l.call(e),u=0;!(i=e.next()).done;)c+=E(i=i.value,t,o,l=s+T(i,u++),a);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 P(e,t,r){if(null==e)return e;var n=[],o=0;return E(e,n,"","",function(e){return t.call(r,e,o++)}),n}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 x={current:null},N={transition:null},j={ReactCurrentDispatcher:x,ReactCurrentBatchConfig:N,ReactCurrentOwner:g};function q(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:P,forEach:function(e,t,r){P(e,function(){t.apply(this,arguments)},r)},count:function(e){var t=0;return P(e,function(){t++}),t},toArray:function(e){return P(e,function(e){return e})||[]},only:function(e){if(!U(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=I,t.Fragment=o,t.Profiler=a,t.PureComponent=h,t.StrictMode=s,t.Suspense=l,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=j,t.act=q,t.cloneElement=function(e,t,n){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var o=y({},e.props),s=e.key,a=e.ref,i=e._owner;if(null!=t){if(void 0!==t.ref&&(a=t.ref,i=g.current),void 0!==t.key&&(s=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(u in t)b.call(t,u)&&!O.hasOwnProperty(u)&&(o[u]=void 0===t[u]&&void 0!==c?c[u]:t[u])}var u=arguments.length-2;if(1===u)o.children=n;else if(1<u){c=Array(u);for(var l=0;l<u;l++)c[l]=arguments[l+2];o.children=c}return{$$typeof:r,type:e.type,key:s,ref:a,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=C,t.createFactory=function(e){var t=C.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:u,render:e}},t.isValidElement=U,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:_}},t.memo=function(e,t){return{$$typeof:f,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=N.transition;N.transition={};try{e()}finally{N.transition=t}},t.unstable_act=q,t.useCallback=function(e,t){return x.current.useCallback(e,t)},t.useContext=function(e){return x.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return x.current.useDeferredValue(e)},t.useEffect=function(e,t){return x.current.useEffect(e,t)},t.useId=function(){return x.current.useId()},t.useImperativeHandle=function(e,t,r){return x.current.useImperativeHandle(e,t,r)},t.useInsertionEffect=function(e,t){return x.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return x.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return x.current.useMemo(e,t)},t.useReducer=function(e,t,r){return x.current.useReducer(e,t,r)},t.useRef=function(e){return x.current.useRef(e)},t.useState=function(e){return x.current.useState(e)},t.useSyncExternalStore=function(e,t,r){return x.current.useSyncExternalStore(e,t,r)},t.useTransition=function(){return x.current.useTransition()},t.version="18.3.1"},326(e,t,r){"use strict";e.exports=r(249)},713(e){"use strict";e.exports=r},404(e){"use strict";e.exports=o},2(t){"use strict";t.exports=e},459(e){"use strict";e.exports=i},669(e){"use strict";e.exports=a},545(e){"use strict";e.exports=t},55(e){"use strict";e.exports=s},111(e){"use strict";e.exports=n}},f={};function p(e){var t=f[e];if(void 0!==t)return t.exports;var r=f[e]={exports:{}};return l[e](r,r.exports,p),r.exports}p.m=l,c=[],p.O=(e,t,r,n)=>{if(!t){var o=1/0;for(u=0;u<c.length;u++){for(var[t,r,n]=c[u],s=!0,a=0;a<t.length;a++)(!1&n||o>=n)&&Object.keys(p.O).every(e=>p.O[e](t[a]))?t.splice(a--,1):(s=!1,n<o&&(o=n));if(s){c.splice(u--,1);var i=r();void 0!==i&&(e=i)}}return e}n=n||0;for(var u=c.length;u>0&&c[u-1][2]>n;u--)c[u]=c[u-1];c[u]=[t,r,n]},p.F={},p.E=e=>{Object.keys(p.F).map(t=>{p.F[t](e)})},p.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return p.d(t,{a:t}),t},p.d=(e,t)=>{for(var r in t)p.o(t,r)&&!p.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},p.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),p.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u={524:0},p.F.j=e=>{if(!p.o(u,e)||void 0===u[e]){u[e]=null;var t=document.createElement("link");t.charset="utf-8",p.nc&&t.setAttribute("nonce",p.nc),t.rel="prefetch",t.as="script",t.href=p.p+p.u(e),document.head.appendChild(t)}},p.O.j=e=>0===u[e],p.O(0,[524],()=>{p.E(524)},5);var d={};return(()=>{"use strict";p.r(d),p.d(d,{default:()=>T});const e=JSON.parse('{"UU":"@ohif/extension-cornerstone-dicom-rt"}').UU,t=`${e}.sopClassHandlerModule.dicom-rt`;var r=p(326),n=p(2),o=p(545),s=p.n(o),a=p(713),i=p(111),c=p.n(i);const{DicomMessage:u,DicomMetaDictionary:l}=c().data,f=c().data.Colors.dicomlab2RGB;const S=async({extensionManager:e,rtStructDisplaySet:t,headers:r})=>{const n=e.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common"),{dicomLoaderService:o}=n.exports,s=await o.findDicomDataPromise(t,null,r),a=u.readFile(s),i=l.naturalizeDataset(a.dict);return i._meta=l.namifyDataset(a.meta),i};async function y(e,t,r){const n=e.getActiveDataSource()[0],{bulkDataURI:o}=n.getConfig?.()||{};t.isLoaded=!0;let s=t.instance;s=o&&o.enabled?await async function({instance:e,dataSource:t,extensionManager:r,rtStructDisplaySet:n,headers:o}){let s=e;if(!(s&&s.ROIContourSequence||(s=await S({extensionManager:r,rtStructDisplaySet:n,headers:o}),s&&s.ROIContourSequence)))return Promise.reject("Invalid instance object or ROIContourSequence");const a=new Map;for(const e of s.ROIContourSequence){const r=e.ReferencedROINumber;if(e&&e.ContourSequence)for(const n of e.ContourSequence){if(!n||!n.ContourData)return Promise.reject("Invalid Contour or ContourData");const e=n.ContourData;if(Array.isArray(e))a.has(r)?a.get(r).push(Promise.resolve(e)):a.set(r,[Promise.resolve(e)]);else if(e&&e.BulkDataURI){const n=e.BulkDataURI;if(!t||!t.retrieve||!t.retrieve.bulkDataURI)return Promise.reject("Invalid dataSource object or retrieve function");const o=t.retrieve.bulkDataURI({BulkDataURI:n,StudyInstanceUID:s.StudyInstanceUID,SeriesInstanceUID:s.SeriesInstanceUID,SOPInstanceUID:s.SOPInstanceUID});a.has(r)?a.get(r).push(o):a.set(r,[o])}else{if(!e||!e.InlineBinary)return Promise.reject(`Invalid ContourData: ${e}`);{const t=e.InlineBinary,n=atob(t).split("\\"),o=[];if(n.length%3!=0)return Promise.reject("ContourData raw values not divisible by 3");for(let e=0;e<n.length;e+=3)if(e+2<n.length){const t=parseFloat(n[e]),r=parseFloat(n[e+1]),s=parseFloat(n[e+2]);if(isNaN(t)||isNaN(r)||isNaN(s))return Promise.reject("Error parsing contourData from InlineBinary format");o.push(t),o.push(r),o.push(s)}a.has(r)?a.get(r).push(o):a.set(r,[o])}}}else a.set(r,[Promise.resolve([])])}const i=new Map;for(const[e,t]of a.entries())i.set(e,await Promise.allSettled(t));return s.ROIContourSequence.forEach(e=>{try{const t=e.ReferencedROINumber,r=i.get(t);e.ContourSequence&&e.ContourSequence.forEach((e,t)=>{const n=r[t];if("fulfilled"===n.status)if(Array.isArray(n.value)&&n.value.every(e=>Number.isFinite(Number(e))))e.ContourData=n.value.map(Number);else{const t=new Uint8Array(n.value),r=(new TextDecoder).decode(t);"string"==typeof r&&r.includes("\\")?e.ContourData=r.split("\\").map(parseFloat):e.ContourData=[]}else console.error(n.reason)})}catch(e){console.error(e)}}),s}({instance:s,dataSource:n,extensionManager:e,rtStructDisplaySet:t,headers:r}):await S({extensionManager:e,rtStructDisplaySet:t,headers:r});const{StructureSetROISequence:a,ROIContourSequence:i,RTROIObservationsSequence:c}=s,u={StructureSetLabel:s.StructureSetLabel,SeriesInstanceUID:s.SeriesInstanceUID,ROIContours:[],visible:!0,ReferencedSOPInstanceUIDsSet:new Set};for(let e=0;e<i.length;e++){const t=i[e],{ContourSequence:r}=t;if(!r)continue;const n=I(r),o=[];for(const e of n){const{ContourData:t,NumberOfContourPoints:r,ContourGeometricType:n,ContourImageSequence:s}=e,a=[];for(let e=0;e<3*r;e+=3)a.push({x:t[e],y:t[e+1],z:t[e+2]});const i=new Map([["CLOSED_PLANAR",!1],["OPEN_NONPLANAR",!1],["OPEN_PLANAR",!1],["POINT",!0]]);o.push({numberOfPoints:r,points:a,type:n,isSupported:i.get(n)??!1}),s?.ReferencedSOPInstanceUID&&u.ReferencedSOPInstanceUIDsSet.add(s?.ReferencedSOPInstanceUID)}m(u,a,c,t,o)}return u}function m(e,t,r,n,o){const s=t.find(e=>e.ROINumber===n.ReferencedROINumber),a={ROINumber:s.ROINumber,ROIName:s.ROIName,ROIGenerationAlgorithm:s.ROIGenerationAlgorithm,ROIDescription:s.ROIDescription,contourPoints:o,visible:!0,colorArray:[]};!function(e,t){let{ROIDisplayColor:r,RecommendedDisplayCIELabValue:n}=e;!r&&n&&(r=f(n));r&&(t.colorArray=[...r])}(n,a),r&&function(e,t,r){const n=t.find(e=>e.ReferencedROINumber===r);if(n){const{ObservationNumber:t,ROIObservationDescription:r,RTROIInterpretedType:o,ROIInterpreter:s}=n;e.RTROIObservations={ObservationNumber:t,ROIObservationDescription:r,RTROIInterpretedType:o,ROIInterpreter:s}}}(a,r,n.ReferencedROINumber),e.ROIContours.push(a)}function I(e){return Array.isArray(e)?e:[e]}const{sopClassDictionary:v}=n.utils,h=[v.RTStructureSetStorage],D={};function R(e,r,o){n.utils.sortStudyInstances(e);const i=e[e.length-1],{StudyInstanceUID:c,SeriesInstanceUID:u,SOPInstanceUID:l,SeriesDescription:f="",SeriesNumber:p,SeriesDate:d,SeriesTime:S,StructureSetDate:m,StructureSetTime:I,SOPClassUID:v,wadoRoot:R,wadoUri:b,wadoUriRoot:g,imageId:O}=i,C={Modality:"RTSTRUCT",loading:!1,isReconstructable:!1,displaySetInstanceUID:n.utils.guid(),SeriesDescription:f,SeriesNumber:p,SeriesDate:m||d,SeriesTime:I||S,SOPInstanceUID:l,SeriesInstanceUID:u,StudyInstanceUID:c,SOPClassHandlerId:t,SOPClassUID:v,FrameOfReferenceUID:null,referencedImages:null,referencedSeriesInstanceUID:null,referencedDisplaySetInstanceUID:null,isDerivedDisplaySet:!0,isLoaded:!1,isHydrated:!1,structureSet:null,sopClassUids:h,instance:i,instances:e,predecessorImageId:O,wadoRoot:R,wadoUriRoot:g,wadoUri:b,isOverlayDisplaySet:!0,label:f||`${s().t("Series")} ${p} - ${s().t("RTSTRUCT")}`};let U=i.ReferencedSeriesSequence;if(i.ReferencedFrameOfReferenceSequence?.RTReferencedStudySequence&&!i.ReferencedSeriesSequence&&(i.ReferencedSeriesSequence=function(e){const t=[];return e.forEach(e=>{const{RTReferencedStudySequence:r}=e;r.forEach(e=>{const{RTReferencedSeriesSequence:r}=e;r.forEach(e=>{const r=[],{ContourImageSequence:n,SeriesInstanceUID:o}=e;n.forEach(e=>{r.push({ReferencedSOPInstanceUID:e.ReferencedSOPInstanceUID,ReferencedSOPClassUID:e.ReferencedSOPClassUID})});const s={SeriesInstanceUID:o,ReferencedInstanceSequence:r};t.push(s)})})}),t}(i.ReferencedFrameOfReferenceSequence),U=i.ReferencedSeriesSequence),!U)return void console.error("ReferencedSeriesSequence is missing for the RTSTRUCT");const w=U[0];C.referencedImages=i.ReferencedSeriesSequence.ReferencedInstanceSequence,C.referencedSeriesInstanceUID=w.SeriesInstanceUID,C.FrameOfReferenceUID=i.ReferencedFrameOfReferenceSequence?.[0]?.FrameOfReferenceUID;const{displaySetService:T}=r.services,E=T.getDisplaySetsForReferences(U);if(E?.length>1&&console.warn("Reference applies to more than 1 display set for Contours, applying only to first display set"),E&&0!==E.length){const[e]=E;C.referencedDisplaySetInstanceUID=e.displaySetInstanceUID,C.isReconstructable=e.isReconstructable,C.FrameOfReferenceUID=e.FrameOfReferenceUID}else{const{unsubscribe:e}=T.subscribe(T.EVENTS.DISPLAY_SETS_ADDED,({displaySetsAdded:t})=>{const r=t[0];r.SeriesInstanceUID===C.referencedSeriesInstanceUID&&(C.referencedDisplaySetInstanceUID=r.displaySetInstanceUID,C.isReconstructable=r.isReconstructable,C.FrameOfReferenceUID=r.FrameOfReferenceUID,e())})}return C.load=({headers:e,createSegmentation:t=!0})=>function(e,t,r,n,o=!0){const{SOPInstanceUID:s}=e,{segmentationService:i}=t.services;if((e.loading||e.isLoaded)&&D[s]&&(c=e,a.segmentation.state.getSegmentation(c.displaySetInstanceUID)))return D[s];var c;return e.loading=!0,D[s]=new Promise(async(t,s)=>{try{if(!e.structureSet){const t=await y(r,e,n);e.structureSet=t}o&&await i.createSegmentationForRTDisplaySet(e),t()}catch(e){s(e)}finally{e.loading=!1}}),D[s]}(C,r,o,e,t),[C]}const b=function(e){const{servicesManager:t,extensionManager:r}=e;return[{name:"dicom-rt",sopClassUids:h,getDisplaySetsFromSeries:e=>R(e,t,r)}]};var g=p(404);const O=({commandsManager:e,servicesManager:t})=>{const r=t.services,{displaySetService:n,viewportGridService:o}=r,s={hydrateRTSDisplaySet:({displaySet:t,viewportId:r})=>{if("RTSTRUCT"!==t.Modality)throw new Error("Display set is not an RTSTRUCT");const s=n.getDisplaySetByUID(t.referencedDisplaySetInstanceUID);e.runCommand("updateStoredSegmentationPresentation",{displaySet:t,type:g.SegmentationRepresentations.Contour}),e.runCommand("updateStoredPositionPresentation",{viewportId:r,displaySetInstanceUIDs:[s.displaySetInstanceUID]}),o.setDisplaySetsForViewport({viewportId:r,displaySetInstanceUIDs:[s.displaySetInstanceUID]})}};return{actions:s,definitions:{hydrateRTSDisplaySet:{commandFn:s.hydrateRTSDisplaySet,storeContexts:[],options:{}}},defaultContext:"cornerstone-dicom-rt"}};function C(){return C=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)({}).hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},C.apply(null,arguments)}const U=r.lazy(()=>Promise.resolve().then(p.bind(p,585))),w=e=>r.createElement(r.Suspense,{fallback:r.createElement("div",null,"Loading...")},r.createElement(U,e)),T={id:e,getCommandsModule:O,getViewportModule:({servicesManager:e,extensionManager:t,commandsManager:n})=>[{name:"dicom-rt",component:o=>r.createElement(w,C({servicesManager:e,extensionManager:t,commandsManager:n},o))}],getSopClassHandlerModule:b}})(),d=p.O(d)})());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ohif/extension-cornerstone-dicom-rt",
3
- "version": "3.13.0-beta.7",
3
+ "version": "3.13.0-beta.71",
4
4
  "description": "DICOM RT 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.13.0-beta.7",
37
- "@ohif/extension-cornerstone": "3.13.0-beta.7",
38
- "@ohif/extension-default": "3.13.0-beta.7",
39
- "@ohif/i18n": "3.13.0-beta.7",
36
+ "@ohif/core": "3.13.0-beta.71",
37
+ "@ohif/extension-cornerstone": "3.13.0-beta.71",
38
+ "@ohif/extension-default": "3.13.0-beta.71",
39
+ "@ohif/i18n": "3.13.0-beta.71",
40
40
  "prop-types": "15.8.1",
41
41
  "react": "18.3.1",
42
42
  "react-dom": "18.3.1",