{"version":3,"sources":["common/utils/handle-response.js","common/utils/history.js","common/utils/role.js","common/services/authentication.service.js","common/utils/Backend.jsx","viewer/components/Histogram.jsx","viewer/components/ToggleButton.jsx","globalComponents/CustomSvgIcon.jsx","viewer/contexts/TilesContext.jsx","viewer/components/VerticalResizeBorder.jsx","viewer/contexts/PersistentStorageContext.jsx","viewer/utils/RandomColorGenerator.jsx","viewer/utils/StructuresUtils.jsx","viewer/contexts/ProjectContext.jsx","viewer/contexts/ProjectHistoryContext.jsx","common/components/Spinloader.jsx","viewer/contexts/AllViewerContexts.jsx","viewer/contexts/ResultTabContext.jsx","viewer/components/VerticalToolBar.jsx","home/components/AIModelDialogTable.jsx","home/dialogs/AIModelDialog.jsx","home/dialogs/TrainAIModelComponents/TrainModelStep0.jsx","viewer/components/SketchColorPicker.jsx","viewer/utils/ROI.jsx","viewer/utils/PolygonUtil.jsx","viewer/components/ListItemOptionsMenu.jsx","viewer/components/ListItemStructure.jsx","viewer/components/ListItemSubType.jsx","home/dialogs/TrainAIModelComponents/TrainModelStep1.jsx","home/dialogs/TrainAIModelComponents/TrainModelStep2.jsx","home/dialogs/TrainAIModelComponents/TrainModelStep3.jsx","home/dialogs/TrainAIModelComponents/TrainModelStep4.jsx","home/dialogs/TrainAIModelDialog.jsx","viewer/components/sidebar/SideBarTabAISelectByModel.jsx","viewer/components/sidebar/SideBarTabAI.jsx","viewer/components/sidebar/SideBarTabRois.jsx","viewer/components/FileTreeView.jsx","viewer/components/sidebar/SideBarTabView.jsx","viewer/components/ScoringMatrixHistoClassification.jsx","viewer/components/ScoringMatrixHistoPointCounting.jsx","viewer/utils/CanvasUtil.jsx","viewer/components/MiniMap.jsx","viewer/components/sidebar/SideBarTabResults.jsx","viewer/components/SideBar.jsx","viewer/utils/RendererUtils.jsx","viewer/components/ScaleBar.jsx","viewer/components/ZoomBar.jsx","viewer/components/ResultTable.jsx","viewer/utils/GeometricInterpolation.jsx","viewer/components/TimeChart.jsx","viewer/components/TimeLineTool.jsx","viewer/components/ZStackBar.jsx","viewer/components/ImageInfo.jsx","viewer/components/Renderer.jsx","viewer/components/OverlaySlider.jsx","viewer/components/WindowTool.jsx","viewer/components/3DViewHelper.jsx","viewer/components/3D-Viewer.jsx","viewer/components/tools/Tool.jsx","viewer/components/tools/ConfigForms/OverlapConfigForm.jsx","viewer/components/tools/PenTool.jsx","viewer/components/tools/MagicWandTool.jsx","viewer/components/tools/RegionGrowingTool.jsx","viewer/components/tools/RegionGrabCutTool.jsx","viewer/components/tools/CopyTool.jsx","viewer/components/tools/SelectionTool.jsx","viewer/components/tools/AITrainingTool.jsx","viewer/components/tools/FindSmallestROITool.jsx","viewer/components/tools/GridTool.jsx","viewer/components/tools/GridAnnotationTool.jsx","viewer/components/tools/TilesClassificationTool.jsx","viewer/components/tools/TilesHistoPointCountingTool.jsx","viewer/utils/TinyQueue.jsx","viewer/utils/rbush-knn.jsx","viewer/components/tools/PlotNearestRoiTool.jsx","viewer/components/tools/RegionTool.jsx","viewer/components/tools/RectangleTool.jsx","viewer/components/tools/CommentTool.jsx","viewer/components/tools/EllipseTool.jsx","viewer/components/tools/FillTool.jsx","viewer/components/tools/ActiveLearningTool.jsx","viewer/components/tools/InstantAnalysisTool.jsx","viewer/components/ClassroomChat.jsx","viewer/components/CroppedImage.jsx","viewer/components/SceneImage.jsx","viewer/components/AccuracyGraph.jsx","viewer/components/GalleryToolBoxes.jsx","viewer/components/Gallery.jsx","viewer/components/tools/LandmarkTool.jsx","viewer/components/tools/HeatmapTool.jsx","viewer/Viewer.jsx","proteomViewer/components/ProteomSettings.jsx","proteomViewer/components/Preview3d.jsx","proteomViewer/components/ProteomSideBar.jsx","proteomViewer/components/ProteomResults.jsx","proteomViewer/components/ProteomToolBar.jsx","proteomViewer/ProteomViewer.jsx","spectraViewer/contexts/SpectraViewerContext.jsx","spectraViewer/components/SpectraSidebarTabs/SpectraTab.jsx","spectraViewer/components/SpectraSidebarTabs/OperationsTab.jsx","spectraViewer/components/SpectraSidebarTabs/ModelTab.jsx","spectraViewer/components/SpectraSidebarTabs/AnalysisTab.jsx","spectraViewer/components/SpectraSideBar.jsx","spectraViewer/components/ELineChart.jsx","spectraViewer/components/ResultChart.jsx","spectraViewer/components/SpectraResultCharts.jsx","spectraViewer/components/FileParamForm.jsx","spectraViewer/components/SpectraToolBar.jsx","spectraViewer/components/SpectraLeftTableResults.jsx","spectraViewer/components/CustomResultTable.jsx","spectraViewer/components/SpectraBottomTableResults.jsx","spectraViewer/components/LocalVerticalResizeBorder.jsx","spectraViewer/components/LocalHorizontalResizeBorder.jsx","spectraViewer/SpectraViewer.jsx","scanViewer/contexts/ScanViewerContext.jsx","scanViewer/components/ScanMinimap.jsx","scanViewer/components/ScanComments.jsx","scanViewer/components/ScanRenderer.jsx","scanViewer/components/SelectFileDialog.jsx","scanViewer/components/ScanToolBar.jsx","globalComponents/CustomSlider.jsx","globalComponents/CustomSelector.jsx","scanViewer/components/ScanMicroscopeSettings.jsx","scanViewer/components/ScanFluorescence.jsx","scanViewer/ScanViewer.jsx","home/Report.jsx","common/components/PrivateRoute.jsx","admin/components/SystemContainer.jsx","admin/components/UsersContainer.jsx","admin/components/FolderChooser.jsx","admin/components/ImporterContainer.jsx","admin/components/ModuleSelectionDialog.jsx","admin/components/ModuleCreationContainer.jsx","admin/AdminPage.jsx","account/LoginPage.jsx","licensing/LicensingPage.jsx","home/dialogs/CreateProjectdialogComponents/Step0.jsx","home/dialogs/CreateProjectdialogComponents/Step1.jsx","home/dialogs/CreateProjectdialogComponents/EmptySlideCreation.jsx","home/dialogs/CreateProjectdialogComponents/Step2.jsx","home/dialogs/CreateProjectDialog.jsx","home/dialogs/ImportProjectsDialog.jsx","home/components/ProjectsTable.jsx","common/utils/Localization.jsx","home/HomePage.jsx","cases/components/CasesSideBar.jsx","cases/components/CasesTable.jsx","cases/components/CasesViewer.jsx","cases/CasesPage.jsx","prediction/images/p1.jpg","prediction/images/p2.jpg","prediction/images/p3.jpg","prediction/images/p4.jpg","prediction/PredictionPage.jsx","settings/SettingsPage.jsx","common/components/NavigationBar.jsx","about/AboutPage.jsx","common/components/CustomDialog.jsx","App.jsx","registerServiceWorker.js","index.js"],"names":["handleResponse","response","text","then","data","JSON","parse","ok","indexOf","status","authenticationService","logout","window","location","reload","error","message","statusText","Promise","reject","history","createBrowserHistory","Role","currentUserSubject","BehaviorSubject","localStorage","getItem","login","email","password","requestOptions","method","headers","body","stringify","fetch","user","setItem","next","removeItem","currentUser","asObservable","currentUserValue","value","fetch_auth","url","config","token","Authorization","Backend","callback","json","id","catch","errorName","console","log","customErrorPrint","appsettings","params","errorCallback","progressCallback","jobId","Math","random","toString","substr","connection","HubConnectionBuilder","withUrl","configureLogging","LogLevel","Warning","build","serverTimeoutInMilliseconds","on","line","debug","start","invoke","err","res","fileId","obj_res","s","Stream","Readable","_read","parser","JSONStream","obj","Object","assign","values","result","temp_obj","entries","key","lowerCaseValue","charAt","toLowerCase","slice","push","reader","getReader","ReadableStream","controller","pump","read","done","close","array","string","TextDecoder","decode","enqueue","pipe","model_path","online","models","unlistedModels","warn","modelErrs","map","model","name","version","shortErr","openErrorDialog","ex","projectIds","exportName","blob","URL","createObjectURL","a","document","createElement","href","download","appendChild","click","remove","file","FormData","append","aiModel","names","output_name","img","folderPath","fileName","projectJson","formData","fileMappings","projectNames","projectId","projectType","encodeURIComponent","availabeProjectTypes","waitForElement","setTimeout","getVersion","ptKey","projectTypes","loadAvailableProjectTypes","item","annotations","description","isUserModule","order","label","dir","str","e","spinloader","keepAliveIntervalInMilliseconds","isJsonString","jsonLine","k","showWarningSnackbar","trainingProgress","includes","progress","replace","showWithProgress","parseInt","show","project","myJson","stdout","galleryTrainingProgress","alModel","page","lv","x","y","sourcePath","image_path","zRange","showPointCloud","path","successCallback","modelType","isVdlModel","parameters","advancedSettings","comDLArchitecture","updateTrainingData","verifiedAIModel","selectedAIModel","redirect","graphRequestSettings","startsWith","uuidv4","Accept","tileExportProgress","Error","WebSocket","SERVER_URL","styles","root","overflow","chartContainer","height","position","marginBottom","rangeSlider","bottom","actionButton","display","border","background","marginRight","toggleContainer","boxShadow","verticalAlign","title","padding","fontSize","toolbar","width","toolButton","toolButtonRight","float","grow","flexGrow","gradientBar","dragIndicator","color","top","right","cursor","grabbing","borderRadius","channelLabel","minWidth","lineHeight","popover","zIndex","cover","left","toggleBtnContent","HistogramScale","hexToRGB","hex","alpha","r","g","b","validateGamma","gamma","pow","ChannelsConfig","omeChannels","nChannels","length","this","channels","i","isNaN","channelName","enabled","min","low","max","high","type","scale","Histogram","props","setMountedState","stateObject","_isMounted","setState","handleColorPickerClick","index","selectedSingleChannel","displayColorPicker","state","selectedChannels","handleColorPickerClose","handleColorPickerChange","newHistogramConfig","histogramConfig","onChange","forceUpdateWithTimeout","delay","forceUpdate","activateAllChannels","Array","from","validGamma","singleChannelMode","channelSelectMode","leftGammaValue","gammaFunction","rightGammaValue","changeChannelSelectMode","updateChannels","apply","changeChannel","filter","v","onExportHistogramParameters","strData","projectContext","getProjectStringInfos","downloadName","date","dataStr","dlAnchorElem","setAttribute","onImportHistogramParameters","files","target","fr","FileReader","onload","selectedCs","loadedConfig","showErrorSnackbar","stateToSet","newStateObject","c","isBrightfield","readAsText","stateGamma","originalHistogramConfig","getEnabledChannels","histograms","datasets","sliderMode","Image","src","renderRegion","calcHist","drawGammaLine","val","dimensions","container","offsetWidth","channel","offScrCan","ctx1","getContext","drawImage","imgData","getImageData","step","histo","histo2","n","sum","count","j","backgroundCanvas","bitDepth","visibleStep","ctx","w","h","clearRect","beginPath","font","fillStyle","moveTo","lineTo","fillText","strokeStyle","closePath","stroke","maxValues","lineWidth","borderColor","backgroundColor","globalAlpha","transformedCount","fill","gammaCanvas","selectedChannel","handleMinMaxRange","reduce","total","leftSide","rightSide","lastX","middleBarActive","deltaX","clientX","new_min","new_max","dataset","p","onDragStart","preventDefault","onMouseMove","buttons","updateRange","leftBarActive","rightBarActive","onMouseUp","Fragment","style","ref","drawHistogramBackground","onMouseDown","className","leftGamma","stopPropagation","handleGammaChange","blur","rightGamma","round","borderRight","borderLeft","toFixed","onClick","channelsArray","borderWidth","labels","classes","initData","el","Tooltip","disableInteractive","IconButton","marginTop","handleReset","size","icon","faUndo","handleLogLin","faChartArea","handleMinMaxFit","faArrowsAltH","handleBestFit","faChartLine","GetApp","getElementById","Publish","accept","renderHistogram","slider1","parseFloat","sliderGamma","marginLeft","slider2","ToggleButtonGroup","onDoubleClick","paddingBottom","renderColorPicker","FormControlLabel","control","Checkbox","checked","Component","withStyles","ToggleButton","onToggle","disabled","classNames","toolbarButton","toolbarButtonChecked","Map","toolbarButtonIcon","faInfoCircle","faRuler","faStopwatch","faLayerGroup","faInfo","LinearScale","transform","faTable","UnfoldMore","defaultProps","CustomSvgIcon","vertAlign","xmlns","viewBox","isolation","d","fillRule","mask","vectorEffect","strokeWidth","strokeLinejoin","strokeLinecap","strokeMiterlimit","focusable","React","TilesContext","createContext","withTiles","WrappedComponent","Consumer","context","tiles","displayName","TilesProvider","getIndex","strAnnoCount","getIndexObj","strSubtypesPages","resetStPg","visibleImage","visibleImageUpdatedAt","coloredImages","coloredImagesUpdatedAt","imgWidth","imgHeight","pageIndex","selectedLayerColor","selcetedLayerIndex","annotationCount","firstIteration","accPoints","pointCount","galleryVisible","isMousedown","isOnImage","IsInOtherImage","onPageInput","structure","structureBefore","graphAcc","roiProps","isSubtype","subtypeName","pos","hsitoClassificationStarted","zLevel","chainLeaderId","transformationMatrix","transformationFactor","transformationOffset","Provider","setVisibleImage","clearTiles","keys","pushVisibleImage","tileId","Date","getTime","sorted","sort","undefined","resetVisibleImages","f","getVisibleImages","getVisibleImage","setColoredImages","pushColoredImages","resetColoredImages","getColoredImages","getColoredImage","setImgWidth","getImgWidth","setImgHeight","getImgHeight","setPageIndex","getPageIndex","setHistogramConfig","getHistogramConfig","setSelectedLayerColor","getSelectedLayerColor","setSelectedLayerIndex","selectedLayerIndex","getSelectedLayerIndex","addAnnotationCount","setAnnotationCount","getAnnotationCount","setFirstIteration","getFirstIteration","pushAccPoint","point","getAccPoints","setGalleryVisible","getGalleryVisible","setIsMousedown","getIsMousedown","setIsOnImage","getIsOnImage","setIsInOtherImage","isInOtherImage","getIsInOtherImage","setRoiProps","getRoiProps","setPositionRoi","setOnPageInput","getOnPageInput","pushStrAnnoCount","pushDynamicStructureAC","splice","setStrAnnoCount","idx","setParentAnnoCount","getStrAnnoCountElement","getStrAnnoCount","setAnnoCount","changeAnnoCount","idx_a","idx_b","pushSubtypesPages","tilePage","subtypes","pushDynamicStructureSP","getSubtypesPages","setSubtypesPages","setPage","getPage","setTilePage","getTilePage","setSubtypes","setSingleSubtype","getSubtypes","resetSubtypesPages","setStructure","getStructure","getStructureBefore","setGraphAcc","pushGraphAcc","getGraphAcc","setHsitoClassificationStarted","getHsitoClassificationStarted","setFileId","getFileId","setZLevel","getZLevel","setTransformationMatnFactnOff","fact","Off","getTransformationMatrix","getTransformationFactor","getTransformationOffset","removeTransformationMatrix","resetAllTransformationMatnFact","getAllTransformationMatrices","getAllTransformationFactors","getAllTransformationOffsets","children","VerticalResizeBorder","handleMouseDown","resizeMode","lastPageX","pageX","handleMouseMove","resizeSideBar","handleMouseEnd","overlayBorder","resizesBorder","onMouseLeave","PersistentStorageContext","withPersistentStorage","persistentStorage","PersistentStorageProvider","loadedState","save","load","loadAll","colors","colorIdx","getRandomColor","floor","generateParentList","structures","parentList","currentStruct","classificationSubtype","parentId","getParentIndex","generateChildrenList","childrenList","generateAListOfAllChildrenRecursively","hasChild","allChildren","struct","child","getParentIndexLayer","findIndex","element","subtypeLevel","getContainedRegionRois","roiLayers","resultRois","decendentList","parent","parent_idx","forEach","decendent","layer","regionRois","roi","structureId","ProjectContext","withProject","ProjectProvider","init","viewer","setChangingFile","changingFile","setActiveTab","tab","activeTab","getActiveTab","colorInUse","getUnusedColor","getRegionById","find","getNumberOfChilds","parentStructure","importStructures","tools","inverted","tree","RBush","addStructure","grid","viewerConfig","newLayerId","newStructure","dynamic","visible","allToolNames","dynamicStructure","classFrequencies","class_0","class_1","class_2","class_3","class_4","class_5","class_6","avgClassFrequnecy","isUnfolded","showSubtypes","defaultSelected","alterStructure","newRoilayer","addSubStructure","fromHistoModule","selectedLayer","subStructure","parentColor","subtypeColor","numberChilds","roiIndex","addSubtypeText","addSubType","findChilds","subType","deleteStructure","childs","toplevelParentId","structureIndex","roiIdx","subtypesRemoved","RegionRoi","parentStruct","toplevelParentIndex","fullChildrenList","currentChildren","updateStructures","newSelectedLayer","duplicateStructure","pureLabel","split","copiesCount","duplicateChildren","findChildren","oldParent","newParent","newId","canMoveStructure","selectedStructure","direction","structuresSameLevel","moveStructure","strt","ed","allElements_1","lastStructure","idxSwapStructure","otherParent","sceneGUID","roi_layer_a","roi_layer_b","join","today","dd","String","getDate","padStart","mm","getMonth","yyyy","getFullYear","setStateNow","newState","setAiModelRepository","aiModelRepository","setAiStateObject","aiStateObject","commentLayers","ome","galleryImageSize","fileRoiLayers","ProjectHistoryContext","ProjectHistoryProvider","past","future","add","action","copy","updateState","processItem","stepType","parentLayerIdx","parentRoiLayer","insert","treeItem","uuid","all","undo","pop","redo","canUndo","canRedo","getHistoryLength","sizeLimitReached","projectHistory","newItem","mergePastItems","SpinloaderContext","withSpinloader","SpinloaderProvider","progressObject","messagePresent","indefinite","clearTimeout","timeout","showWithMessage","rightWidth","scenesLeft","timeoutSeconds","waitTime","timeoutHide","hide","func","showWithTimeout","numberScenes","progObject","resetTimer","numberRestScenes","hideTimeDelayed","setRightWidth","greyedOutBackground","progressContainer","Dialog","dialog","open","hideBackdrop","DialogTitle","CircularProgress","LinearProgress","linearProgress","variant","margin","textAlign","pointerEvents","withAllViewerContexts","component","withProjectHistory","ResultTabContext","withResultTab","propsWithoutClasses","resultTab","ResultTabProvider","getPosition","rendererCtx","getTransform","getScale","selectedRoi","selectedChildIndex","changeFile","hundredTiles","rendererInitialized","rendererCanvas","zoomLevelFixed","gridExists","resetPressed","selSampleSet","fileChange","getSelectedRoi","setSelectedRoi","getSelectedChildIndex","setSelectedChildIndex","getSelectedStructure","setSelectedStructure","getChangeFile","setChangeFile","getHundredTiles","setHundredTiles","getRendererInitialized","setRendererInitialized","getRendererCanvas","setRendererCanvas","getRendererCtx","setRendererCtx","getZoomLevelFixed","toggleZoomLevelFixed","setZoomLevelFixed","getGridExists","setGridExists","getResetPressed","setResetPressed","getSelSampleSet","setSelSampleSet","getFileChange","setFileChange","Tools","NONE","RECT_ROI","PEN_ROI","MAGICWAND_ROI","REGIONGROWING_ROI","REGIONGRABCUT_ROI","REGION_ROI","RECTANGLE_ROI","COMMENT_ROI","ELLIPSE_ROI","COPY_ROI","SELECTION_ROI","FINDSMALLESTROI_ROI","PLOTNEAREST_ROI","FILL","IAM","AL","AITRAINING","GRIDTOOL","GRIDANNOTATIONTOOL","SELECTION_Tile","POINTCOUNTING_Tile","LANDMARK","HEATMAP","VerticalToolBar","componentDidMount","setToolBarWidth","viewerToGallery","containerElement","topElement","bottomElement","verticalToolBarWidth","containerHeight","clientHeight","topHeight","bottomHeight","resultWidth","updateToolBarWidth","exportAllFiles","fileIDs","exportGallery","str_1","str_2","showMessage","setAlruns","exportCurrentFile","showSuccessSnackbar","setStructureIds","setZLevelforRois","zLevelClassification","z","ApplyModel","trainingWarning","saveChangesGallery","applyDL","findClassificationChilds","enoughAnnotations","minFive","twoAnnotated","numberElements","enough","onStartTraining","saveProject","onSave","anchorEl","toolName","toolsInProject","allScenes","onChangeTool","activeTool","displayTimeBar","onToggleTimeBar","displayZStackBar","showGallery","filesGalleryActive","show3DViewer","onToggle3DViewer","onToggleMeshView","showTilesGallery","onSaveScreenshot","onZoomDelta","onZoomFit","onZoomOriginal","onToggleSideBar","rendererRef","showZoomLevels","showUndoRedo","showSaveTool","showToggleSideBar","toolBar","Popper","placement","transition","TransitionProps","Fade","Paper","getLayoutElement","Boolean","physicalSizeX","checkToolInConfig","isImporting","onToggleGallery","setGalleryTool","changeToSelectedFile","faImages","faCube","faBraille","onToggleTilesGallery","faSquareFull","splitscreenCount","onToggleFullscreen","showFullscreen","ViewQuilt","Divider","divider","faPlus","faPen","faMagic","CheckBoxOutlineBlank","faCircle","faDrawPolygon","faFillDrip","faMousePointer","faClone","faBrain","faThLarge","faTh","tool","toolConfig","tooltip","aiUsedStructures","structureName","selectedModel","selectedVersion","alruns","faPlayCircle","onSaveImages","faDownload","faFileDownload","toolBarRow","faExchangeAlt","Save","onToggleOverlay","showOverlay","onToggleWindowTool","showWindowTool","faCamera","textIcon","onZoomOneToN","ZoomOutMap","bind","ZoomIn","ZoomOut","theme","gridTemplateRows","overflowX","overflowY","fontWeight","palette","primary","main","handleRowClick","columns","options","AIModelDialogTable","selected","sortOrder","filterType","print","responsive","rowsSelected","selectToolbarPlacement","draggableColumns","tableBodyMaxHeight","onRowSelectionChange","currentRowsSelected","selectedObject","dataIndex","handleSelectedAIModels","handleAddButton","onRowClick","textLabels","noMatch","toolTip","columnHeaderTooltip","column","pagination","previous","rowsPerPage","displayRows","search","downloadCsv","viewColumns","filterTable","reset","titleAria","selectedRows","delete","deleteAria","dataTable","verified","row","versions","validationloss","validationmiou","validationmeaniou","trainingObjectsCount","trainingobjectscount","epochs","datetime","modeltype","PaperComponent","handle","cancel","Transition","forwardRef","Slide","AIModelDialog","selectedAIModels","addButtonDisabled","existingAIModels","selectedModelIdx","selectedModelSourcepath","trainExistingModel","modelsInitialized","handleClose","finishAddCustomAIModels","successful","information","initAIFormData","modelSelectionContainer","modelInformationContainer","getModelMetadata","addCustomAIModelButton","addCustomAIModelText","TransitionComponent","keepMounted","onClose","tableDialog","DialogContent","dialogContent","DialogContentText","DialogActions","Button","openResponseDialog","deleteCustomAIModels","customAIModelsAdded","selectedAiModel","sourcepath","addCustomAIModels","FormControl","fullWidth","Grid","xs","gridContent","InputLabel","Select","selectContent","event","aiModels","MenuItem","selectedModelInformation","getSelectedModelSourcepath","setSelectedExistingModel","minHeight","maxWidth","TrainModelStep1","defaultImages","projectProperties","paddingTop","ImageList","spacing","cols","ImageListItem","projectTile","projectTileSelected","updateFormDataGeneral","alt","images","ImageListItemBar","loading","objectFit","tileHeadline","imgContainer","SketchColorPicker","yPosition","handleClick","clientY","innerHeight","handleChange","reactCSS","pickerContainer","default","swatch","BaseROI","strokeColor","fillColor","CommentROI","regions","commentValue","computedValue","fontScaleFactor","updateBounds","bounds","calcBoundingBox","RegionROI","isObject","roiCopy","isAnnotated","isLabeled","isSelObj","aiAnnotated","setRegions","center","subtype","color1","ai","annotated","labeled","isSel","isSaved","saved","fullyLoaded","comment","tileName","selectedWithKey","frequencyClass","isStartData","aiIdx","galleryIndex","firstTimeGallery","minX","minY","maxX","maxY","poly","turf","pointOnPolygon","geometry","coordinates","region","converted","area","inputRegions","resultRegions","p1","p2","comp","numObjects","getSimplifiedRectRegions","intRegions","simplifyedRegions","tolerance","simplifiedPoly","highQuality","simplifyRegions","pArea","abs","RectROI","drawingMode","resizePoint","cornerRadius","dragStart","canvas","hovered","vw","vh","rect","cornerDiameter","getFirstValidatedIndexValue","createRoisFromAnno","anno","geoJSON","frequencyCl","lineArrayBuffer","lineArray","radius","feature","buffered","buffer","viewRect","distance","deltaY","sqrt","pointInsideRegion","turfPoint","turfPoly","pointInside","regionRoi","hasIntersection","regionRoi1","regionRoi2","poly1","poly2","intersects","findIndexById","findSameLayer","defaultParentIndex","parentLayerId","parentIndex","findSiblingRoiLayers","overlapRoiLayers","checkIfStructureHidden","findClickedRoi","includeBaseROI","inversed","overlapTreeItems","getExterior","drawRegion","arr","getIndexOf","drawRegionGeoJson","PolyBool","polygonToGeoJSON","drawRegionWithoutHoles","getTreeItemsFromRois","reducedLayerRegionRois","differenceRegionsAndInfo","overlapItems","transformResult","differenceRegionsInfo","segDiff","idxRoi","segGeoJSON","idxRegionsInfo","updateDrawLayer","clear","drawRegionRois","multiLayerRegions","multiDrawRegions","coordArray","roiToAdd","createRegionRoi","turfPolyToRegionRois","updateLayer","positionInRoiLayer","overlap","parentLayer","clickedOnRoi","historyItem","histId","parentRegionRois","multiParentRegions","intersection","overlapRoiLayer","drawRoi","drawPoly","isIntersecting","transformResultInfo","firstRoiToAdd","fromIndex","arraymove","findRoi","resultRoi","targetLayerIndex","toIndex","epsilon","ListItemOptionsMenu","optionsAnchorEl","handleOptionsOpen","handleOptionsClose","downloadAsFile","jsonObject","exportAnnotations","roiRegions","importAnnotations","inputElem","onchange","drawRegions","nonOverlapping","overlappingRois","intersecting","onSelectLayer","parentIdx","Menu","ListItemIcon","ListItemStructure","hideSubtypes","visibilitySubtypesOff","visibilitySubtypesOn","selectStructure","toolChanged","selectedToolName","updateStructureChange","adaptRois","newName","onChangeLayers","updateViewer","setTextInput","renderLocation","allStructuresEnabled","ListItem","listItem","button","updateFormDataStructures","currentTarget","selStructures","TextField","structureInput","inputRef","InputProps","disableUnderline","ListItemText","textOverflow","whiteSpace","forceSidebarUpdate","ArrowDropUp","ArrowDropDown","Visibility","VisibilityOff","ListItemSubType","findAllSubtypes","allChilds","concat","shift","itemClicked","activeToolName","t","drawDivider","classificationChilds","numberOfObjects","listItemRef","isInView","paddingLeft","PlayArrow","Remove","parLayer","allStructures","Typography","List","isAdmin","verticalFlip","horizontalFlip","updateFormDataAugmentations","TrainModelStep3","checkNameAvailibility","valueToCheck","isInvalidInput","input","test","newModelName","versionName","metaData","nameInUse","invalidChar","firstSelectField","select","updateFormDataMetaData","updateFormDataAdvSettings","image_size","setSelectedModel","helperText","uniqueName","TrainModelStep4","handleChangeEncoder","encoder","architecture","encoders","updateFormDataAdvSettingsEncoders","renderEncoder","types","getOptimizerIndex","optimizers","updateModelInFormData","encoderArchitecture","decoderArchitecture","decoderArchitectures","updateComDLModelInFormData","setObjectBasedStructure","structureAnnotationIndex","parentAnnotationIndex","renderModelSettings","selectedDecoder","selectedEncoderTypeIdx","selectedEncoderArchitecture","odModelArchitectures","instanceSegModelArchitectures","selectedOdModelArchitecture","selectedInstanceSegModelArchitecture","FormLabel","encoderType","multiple","renderValue","updateFormDataAdvSettingsFlChannels","placeholder","inputProps","selectedLevel","levelDataArray","levelData","level","optimizer","log2","resultValue","createDataSet","maxLevel","unfolded","lastVersion","calculateWeightMap","calculate_weight_map","pyramid_level","modelData","replaceAll","Unet","UnetPlusPlus","DeepLabV3Plus","decoder","encoderTypeFound","backbone","selArchitecture","settingsType","largestRoiPx","totalRoisArea","numberRois","layerIdx","avgArea","pyramidLevel","imageSize","fullScene","objects150ImageSize","lvDistance","ceil","RadioGroup","defaultValue","Radio","textInputField","dropDownLabel","getStringBetween","dataString","stringBefore","stringAfter","regexString","match","TrainAIModelDialog","updateTrainingProgressObject","errorLabel","trainingFinished","trainingSuccessful","showTrainingButton","buildingModel","maxEpochs","tempProgress","overallProgress","stepsProgress","epochsProgress","vallossProgress","valmeanIoUProgress","lossProgress","meanIoUProgress","metricsDict","splitMetrics","substring","keyValue","showTrainingProgress","componentWillUnmount","augmentation","tileProgress","buildingModelProgress","processingFilesCount","multiplier","initTraining","handleNext","datasetOnly","validChar","newModel","activeStep","selStructure","startTrainingTime","aiTrainingSignalR","readOnly","Number","trainModelInfo","stopAITraining","showOptimizationProgress","modelOptimizeProgress","trainingFailed","textalign","startIcon","hideStartTraining","onSubmit","dialogRowContainer","content","TrainModelStep0","TrainModelStep2","Stepper","alternativeLabel","nonLinear","Step","StepButton","MobileStepper","steps","nextButton","KeyboardArrowRight","backButton","KeyboardArrowLeft","Accordion","borderBottom","expanded","MuiAccordion","AccordionSummary","MuiAccordionSummary","AccordionDetails","MuiAccordionDetails","usableModels","SideBarTabAISelectByModel","componentDidUpdate","formDataAICockpit","aiCockpitLoaded","updateModelCheckboxes","modelIsSelected","modelName","selectedModels","checkboxesChanged","modelIsDisabled","modelIsChecked","usableStructures","usableStructure","structureIsChecked","isChecked","structureIsDisabled","isDisabled","updateSelectedTool","availableModels","availableModelsForStructure","getAvailableModelsForStructure","fullStructure","structurePath","findParentId","usableStructurClone","structure_indices","expandedIdx","setAiUsedStructures","selectedLayerIdx","projectStringProperties","handleExpandingChange","onExportClick","export","Name","WeightsName","exportAIModel","onDeleteClick","deleteAIModel","toggleModel","handleChangeModel","structureNameArray","handleModelChange","checkedStructure","selectedDropDownVersion","modelVersion","expandIcon","onFocus","Table","TableBody","TableRow","TableCell","handleChangeVersion","thickness","structureIdx","toPrecision","SideBarTabAI","setFormDataAICockpit","setAIFormData","checkForAvailableIAMSubtype","findClassificationSubtypes","selModel","handleImportModelSelection","importAIModels","success","fileIsNew","handleChangeActiveTab","modelIncludesSubtypes","renderRow","visibleVersions","lastSubtype","align","scope","Online","initModelCounter","Tabs","tabsContainer","indicatorColor","textColor","Tab","getOnlineModelsContainer","CloudDownload","Refresh","tabContainer","setAvailableModels","setModelsInitialized","accordionContainer","showFirstAccordion","toggleShowFirstAccordion","square","TableContainer","tableContainer","table","TableHead","spinnerContainer","flexRowRemainingHeight","flex","SideBarTabRois","structureScrollList","removeEventListener","handlestructureListScroll","countVisibleStructures","acc","cur","dynamicStructureText","focusTextInput","getBoundingClientRect","getAttribute","addEventListener","parentTop","parentHeight","elTop","structuresListHeight","textInput","createRef","structureRefs","rois","tabContent","flexVerticalContainer","flexRowContentHeight","onExportParameters","onImportParameters","onKeyDown","Add","onCenterROI","onMouseEnter","onHoverROI","secondary","summary","FormHelperText","Slider","opacity","newValue","onChangeOpacity","roiContainer","FileTreeView","handleScroll","scrollTop","hasNotExcludedScenes","some","excludeScene","imageList","handleImageListScroll","overflowListRef","missingThumbnails","imageListItemRefs","current","scrollPosition","scrollTo","onSelectFile","onExcludeFilesToggle","splitscreenFileIds","fileGroups","rv","endsWith","fileNames","selectedPath","scenes","fileTreeView","excludeButton","toExclude","filesList","fn","fn_index","fileItem","noWrap","labelWrap","scene","sceneFile","f_id","sceneItem","sceneName","previewImageContainer","previewImageSelected","previewImageInSplitscreen","previewImageNotSelected","importText","draggable","dataTransfer","setData","previewImage","renderThumbnail","onError","lineThrough1","lineThrough2","sidebarHandle","closeButton","expensionSummary","paddingRight","visibility","SideBarTabView","isMounted","mode","histogramContainer","sideBarWidth","onChangeChannels","ScoringMatrixHistoClassification","UNSAFE_componentWillMount","selSample","selId","parentIdxSelStructure","getAbbreviationOfStructure","strWithBracket","isCriticalOrSelected","isStructureCritical","numberTiles","totalClassFrequencies","mean","setAvgClassFrequ","criticalClass","avgClassFrequency","subtractFrequencyClass","addFrequencyClass","fClass","newSelChildIdx","warningWasShown","warningStr","handleChangeSelectedStructure","parentStructures","idxNewSelectedStructure","resetStructures","selectRow","childIdx","renderSubtypeRow","rowFrequencyClass","renderFrequencyClasses","isSelSampleSet","ScoringMatrixHistoPointCounting","getCount","classifyTile","getTotalCount","onNext","classifyTileWithkey","keyNumber","structureForClassification","isTileClassified","tileHasStructureClass","indexSubtype","fromRendering","emptyId","renderMatrixBottom","renderMatrixHeader","trackTransforms","svg","createElementNS","xform","createSVGMatrix","savedTransforms","translate","call","restore","sx","sy","scaleNonUniform","rotate","radians","PI","dx","dy","m2","multiply","setTransform","pt","createSVGPoint","transformedPoint","matrixTransform","inverse","backTransformedPoint","MiniMap","initialized","mousewheel","passive","offsetHeight","inSideBar","getCtx","miniMapMouseEvent","pageY","onMoveTo","chainMouseMove","mouseDown","dragging","mouseMove","mouseUp","zoomMouseWheel","stopEvent","componentRef","draw","factor","getPageForChannel","imgLoaded","sizeX","sizeY","coloredImg","globalCompositeOperation","prototype","zoomOut","mainCanvas","screenX","zoom","screenY","screenW","screenH","offsetX","offsetY","classToUse","rootsideBar","onStart","onStop","withTheme","rootsidebar","HistoClassififcationLabels","SideBarTabResults","setSelectedSampleFromFilename","sampleAbbr","sampleLabel","idxSelectedStructure","exists","l","changeSample","roiLayer","createGrid","roiItem","setNextTile","resetRoiLayers","allRoiLayers","gridSize","setZoomLevelForGridSize","savedRoi","checkIfSkipped","setClassToZero","startHistoPointCounting","setGridSize","onPause","onPrevious","previousHistoClassification","previousHistoPointCounting","prevFileId","getPrevFileId","nextRoi","lastTileIndices","roiFile","nextButtonDisabled","nextHistoClassification","nextHistoPointCounting","nextFileId","getNextFileId","id_range","getRoiLayersIdRange","tmp","roi_min","roi_max","isLastClassifiedTile","indicesObject","classifiedTiles","idxLastTile","blueTilesClassified","inxCurrentFile","onEnd","setProjectsPending","renderGridTool","noConfig","renderConfiguration","dynamicStructureAbbrText","newSubstructureLabel","addSelectedStructures","structuresToAdd","showLabelsToAdd","getCurrentFileInx","startOrContinueText","nextOrSkipText","isLastFile","lastTileClassification","lastTileCounting","labelWithBracket","getOtherLabels","sampleChilds","sampleChildsLabels","newLabels","histoLabel","handleChangeNewStructures","updatedStructures","labelStr","numberTilesFile","showAddSubstructure","withRouter","SideBar","subscribe","role","initAICockpitData","structureIndices","augmentations","backbones","unet","unet_pp","deepLabV3_p","classification_models","lossFunction","physicalSize","physicalSizeUnit","physicalSizeXUnit","in_channels","setInputChannels","flChannels","setFlChannels","modelsize","lr","batch_size","datasetApproach","tileSize","objectBasedBaseStructure","useExistingDataset","useClassWeights","connectOnline","selected_model","selected_version","loadProject","projectData","stringProperties","DefaultModels","foundModel","foundVersion","structureKey","initPythonModules","handleTabChange","isResultTab","setSideBarWidth","nextTab","getActiveTabResults","renderCommentTool","sidebar","faCog","faPencilRuler","gridTileCount","faChartBar","tabContentContainer","sideBarTabResults","borderTop","configureImage","putImageData","__assign","arguments","hasOwnProperty","calculateAffineTransformation","opointBase","opointShift","bfact","tfact","pointBase","pointShift","ny","muXSumX","muXSumY","muYSumX","muYSumY","muX","muY","x0","y0","muXSumXQ","muXSumYQ","muYSumXQ","muYSumYQ","ssX","ssY","normX","normY","newX0","newY0","_a","u","eps","withu","withv","tol","TypeError","l1","m","testConvergence","q","iteration","SVD","transpose","U","Vt","V","T","traceTA","Z","R","S","calcOnloading","counter","imgs","currentSrc","baseId","translateScale","hMat","onloading","visImg","xStart","yStart","tilesToLoad","transformPoint","tileRegistration","callbackPushImage","cv","splited","maxTile","iM","inv","tileWidth","tileHeight","xPosition","pointTL","pointTR","pointBL","pointBR","invPointTL","invPointTR","invPointBL","invPointBR","rectPointTL","rectPointBR","rectWidth","rectHeight","OriginRectPointTL","OriginRectPointTR","OriginRectPointBL","OriginRectPointBR","matSource","matFromArray","CV_32FC2","matTarget","newMat","getPerspectiveTransform","xEnd","yEnd","diff","trunc","tileLoaderParams","matFromImageData","dst","Mat","dsize","Size","warpPerspective","INTER_NEAREST","BORDER_REPLICATE","newImgData","ImageData","Uint8ClampedArray","rows","offTileCan","tileLoader","colorInImage","fillRect","scaleUnitLabels","scaleUnits","maxScaleWidth","ScaleBar","newWidth","scalebarMeters","exponent","toExponential","unitExponent","unitExponentIndex","mantissa","roundedMantissa","fluorescence","setScaleBarData","parentObj","offsetParent","onDrag","marks","ZoomBar","isSelected","mark","clickable","verticalBar","markButton","fab","changeValue","ResultTable","updateResultTable","percentageNumber","getPercentageAndNumber","percentage","numberObjects","structuredTableValues","percNumb","childIds","childLabels","numberParentObjects","renderIcon","onResize","tableSize","resizableContainer","resizeHandles","maxHeight","getDist","pointA","pointB","getPointByPlaceInCurve","startIndex","points","place","distAr","indexA","indexB","dist","getCurveDistances","distSum","absPlace","accLen","distIndex","absPlaceDist","getStartInterpolPoint","indA","indB","pA","pB","linearInterpol","pStart","pEnd","tStart","tEnd","getFigure","figureA","figureB","startPointIndA","startPointIndB","figAIsClockwise","figBIsClockwise","pointsCount","t1","t2","delta","figure","clockwiseSignA","clockwiseSignB","xInd","xB","predictStartPointIndex","xMin","Infinity","xMax","yMin","yMax","pInd","minDist","startPointIndex","anchorPoint","getVec","traversalPolylineClockwise","fig","ind","theMostLeftPointIndex","aNext","aPrev","vPrev","vNext","TimeChart","keyFrames","frameWidth","interpolatedIntervals","keyFrameEls","keyFrame","keyFrameElSize","intervalEls","interval","intervalElHeight","stepWalker","stepLeft","timeCounter","modePanel","interpolate","outline","framerate","playButtons","justifyContent","playPauseForward","playPauseBackward","stepRight","resizeTongue","resizingLine","TimeLineTool","ev","setPosByMouse","handleInterpolation","frameArray","curT","time","findLayer","isKeyFrame","prevKeyFrame","searchPrevKeyFrame","nextKeyFrame","searchNextKeyFrame","regionRoisStart","regionRoisEnd","figureCount","frame","frameArrayItem","getOrCreateFrameArrayItem","getOrCreateRoiLayer","figureIndex","figureStart","figureEnd","startPointIndexA","startPointIndexB","interpolatedFigure","requiredLayer","handleResizeMouseDown","isResizing","resizePos","handleResizeMouseMove","newResizePos","resizeTimeLine","handleResizeMouseUp","coordX","onChangeT","sizeT","innerContainer","clientLeft","newRoiLayer","innerWidth","frameSeparatorColor","bgImage","charts","frameIndices","frameIndex","frameInfo","addLength","backgroundImage","onStep","onPlayPause","playing","playDirection","onChangeSr","sr","timeLineHeight","ArrowLeft","PauseCircleOutline","PlayCircleOutline","ArrowRight","renderContent","ValueLabelComponent","enterTouchDelay","ZStackBar","minZ","maxZ","zsr","onChangeZ","onChangeZValue","onChangeZSr","barIcon","verticalTextfield","sizeZ","playPauseDown","stepUp","slider","orientation","valueLabelDisplay","stepDown","playPauseUp","ImageInfo","infoArea","sizeS","toBase","base","symbols","decimal","conversion","Renderer","createBackgroundPattern","backgroundPattern","patternContext","canvasId","mouseup","mousemove","heatmap","h337","create","gradient","maxOpacity","minOpacity","lastY","t0","performance","now","loadObject","showZStackBar","showTimeBar","checkMiniMapVisivility","mousePos","getMousePositionInImage","keepRendering","loadAllTiles","updatePreviewRect","getPointInCanvas","setPreviewRect","previewRect","updatePreviewRectSize","updateObjectMode","objectMode","UNSAFE_componentWillReceiveProps","nextProps","isActive","setLayer","drawLayer","updateProject","commentLayer","landmarkLayer","landmarkLayers","viewerConfig_project","rendererDict","previewRectChanged","getMousePosition","p3","getPositionInImage","X","Y","toolMouseForward","mouse","selectedId","renderer","getPointInCanvasCoord","tp","mousedown","ctrlKey","selection","selROI","classify","classifySelectedRoi","newROI","resizeROI","onChangeROIs","dragROI","isChained","fDragStart","chainListFileIds","altKey","tempChainToggle","fsChain","onChangeChain","splitscreenIdx","isDrawing","setHeatmapData","maxValue","showHeatmap","heatmapData","mouseBusy","mouseOnCanvas","middleMousePos","drag","resize","fPt","chainMouseDrag","zoomMoveActionDebounced","lastMoveTime","mouseEnter","mouseLeave","centerX","centerY","updateFrameArray","handleMouseUp","showResultTable","onScaleOnly","wheelDelta","detail","zoomDirection","newZoom","zoomValueOut","activeFileId","zoomTo","returnValue","zoomPoint","chainMousewheel","leaderZoomPoint","shiftKey","miniMapZoom","tpt","miniMapRef","initialScale","zoomMoveAction","chainMoveTo","hoverROI","centerROI","transformLandmark","landmarkRois","transformLandmarkNoOffset","transformAnnotation","newRegionList","newRegion","temp","newRoi","generateTransformationOffset","origCenter","xValues","yValues","generateLandmarkTransformation","targetId","baseOme","ids","calculateTransformationMatrix","tOffset","offset","pushRegTile","colImg","mat","isArray","imgRegistered","callbackCounter","isLoadingTiles","Img","pushColoredImage","complete","preloadNextFrames","changeHiConfig","bufferSize","preloadFrame","preloadNextZFrames","playDirectionZ","zoomToFactor","scaleTarget","zoomOriginal","resultTabActive","zoomOneToN","zoomDelta","zoomFit","canvasTranform","imageSmoothingEnabled","centerRoi","selRoi","pt2","zoomInRoi","zoomROI","pt1","zoomLeft","zoomRight","zoomTop","zoomBottom","tzoomROI1","setSubtypeRois","childStructures","findRoiLayer","strs","parentLayerRois","doubleObject","doubleObjectIndex","parentRoi","newArray","zoomObject","zoomRoi","inDebounce","args","debounce","moveAnnotations","updateZ","updateGlobalZ","updateT","updateGlobalT","drawVisibleImage","dt","lastFps","fps","newT","playingZ","newZ","initializedZ","getBaseLog","visX","visY","compositionModeFluor","parentlv","imgOld","requestAnimationFrame","scaleFactor","limitVisibleRegions","rr","rRoi","visibleRegions","updateCounter","visibleRegionsRadius","serachParams","structureHasRois","showSubstructure","subtypeHasSubstructureParent","hasStrParent","fillstyle","findColor","ptrn","createPattern","patternScale","boundsAreaCompare","getDynamicRegions","showGridLabels","textBaseline","txt","tempStrokeStyle","tempLineWidth","getRectRegions","showObjectIdx","layerRois","getPointOnPoly","textToShow","commentRois","angle","vector","atan2","wrapText","showMarks","linelength","showScaleBar","scaleBarData","scaleWidth","stopLineHeight","fontMargin","selectedROI","drawCustomCursor","nowTime","windowToolRef","updateCanvas","lineIdx","words","testLine","measureText","getChildsofStructure","setNewSelRoi","classId","withMouse","parentIndexLayer","idxStr","strToUse","automaticFileChange","keyDown","rendererKeyDown","keyDownSelection","isTilesToolUsed","hasLayerTileNames","updateFLChannels","onPlayPauseZ","onSeek","onStepZ","scaledWidth","scaledHeight","previewWidth","previewHeight","minSize","maxSize","setPreviewSize","newSize","prevW","prevH","keyExtender","hideMiniMap","showMiniMap","hideRestrictions","saveString","render","miniMapKey","showImageInfo","showZoomBar","showFileNavButtons","toolbarButtonRootSingle","toolbarButtonRoot","heatmapContainer","userSelect","onContextMenu","rightSpace","preview","frameArrayDict","fileNavLeftBtn","followCursor","openPrevFile","fileNavRightBtn","openNextFile","tMin","tMax","layerTrees","startY","miniMapReady","visibleRegionsLimit","structureRegionLimits","slowestStructureIdx","fastestStructureIdx","fileIdStateData","initFrameArray","updateExistingStructures","oldVisibleRegionCount","tempLayer","applyFrameArray","loadFrameArray","updatedFrameArrayFrame","getClearedRoiLayer","prevState","prevT","prevZ","curZ","prevFrameIndex","storeRoiLayersToFrameArray","removedStructures","existingStructures","layerId","prevProps","oldFileId","newFileId","oldFrameIndex","getRemovedStructures","removeLayersFromFrameArray","flipRoiLayers","histoModule","clearRoiLayers","loadedAnnotationsCounter","OverlaySlider","update","checkedUp","upperListValue","addFile","lowerListValue","fileCheck","checkedLow","handleUpVisChange","handleLowVisChange","setOpacity","handleUpMenuChange","setActive","handleLowMenuChange","handleCheck","lowValue","fullscreenFileIds","omeDict","upperArea","upperList","formControl","lowerArea","lowerList","sliderDiv","upFormcontrol","lowFormcontrol","upButton","lowButton","chainButton","getAriaValueText","WindowTool","handleSizeChanged","CompContainer","canvasComp","flexDirection","alignItems","ViewHelper","viewHelperSize","setClearColor","setSize","mount","domElement","cameraPosition","THREE","focusPoint","camera","set","lookAt","color2","color3","xAxis","getAxisMaterial","yAxis","zAxis","rotation","posXAxisHelper","getSpriteMaterial","userData","posYAxisHelper","posZAxisHelper","negXAxisHelper","negYAxisHelper","negZAxisHelper","setScalar","renderScene","toneMapped","arc","getStyle","texture","applyQuaternion","quaternion","material","frameId","animate","stop","cancelAnimationFrame","antialias","propsCam","Viewer3D","renderer3D","outputEncoding","toneMappingExposure","aspect","updateProjectionMatrix","light","controls","OrbitControls","get3dObjects","GLTFLoader","gltf","setFromObject","getCenter","get3DAllObjectsExists","load3DObject","getObjectByName","Tool","flag","prevX","currX","prevY","currY","downScale","OverlapConfigForm","removeOverlap","removeOverlapSame","useNodeDrawingMode","onChangeRemoveOverlap","onChangeRemoveOverlapSame","onChangeUseNodeDrawingMode","PenTool","penRadius","minPenRadius","maxPenRadius","lastP","tempRemoveOverlap","tempRemoveOverlapSame","tempUseNodeDrawingMode","addPoint","eventPoint","lastEventPoint","initDrawing","replaceLastPointInDrawLayer","addPointToDrawLayer","applyDrawLayer","linePoly","lineRegions","originalSelectedLayer","layerResults","code","mousePosition","fkt","fromGallery","penRad","onChangePenRadius","ConfigForm","hatchOffset","MagicWandTool","threshold","shiftflag","lastp","mouseWheelEvent","useMagicWand","image","bytes","wandMask","MagicWandToolLib","floodFill","len","gaussBlurOnlyBorder","cacheInd","getBorderIndices","trace","cs","traceContours","simplifyContours","inner","ps","startPoint","onChangeThreshold","RegionGrowingTool","growRegion","seed","inputData","outputData","seedIdx","seedR","seedG","seedB","edge","newedge","ii","next4Edges","jj","ci","cr","cg","cb","getPolygonsWithOpenCV","imageData","growResult","resultImageData","rgbaPlanes","MatVector","get","THRESH_BINARY","contours","hierarchy","findContours","RETR_CCOMP","CHAIN_APPROX_SIMPLE","polygons","cnt","contourArea","polygon","Point","data32S","updateDrawing","onApply","onChangeCommitted","RegionGrabCutTool","penOpacity","lines","matline","fitPointToImage","endPoint","tlp","rect1","Rect","resizeMultiplier","originalSize","workingSize","INTER_AREA","point1","point2","cvtColor","COLOR_RGBA2RGB","zeros","CV_8U","obvFgColor","Scalar","GC_FGD","obvBgColor","GC_BGD","posFgColor","GC_PR_FGD","fgP1","fgP2","rectangle","circle","bgdModel","fgdModel","grabCut","GC_INIT_WITH_MASK","ucharPtr","COLOR_RGBA2GRAY","removeCenteredObject","centeredRoi","getTopLeftPoint","getBottomRightPoint","isPointOutsideRect","isOutside","brp","isDrawingpointInsideRect","isInside","resetViuals","lineFlag","obvColor","rad","zoomToRect","topLeftPoint","CopyTool","selectedSameLayer","historyLength","foundRoiResults","foundRegionIndex","foundRoi","allRegions","regionroi","regionRois1","regionRois2","regions1","regions2","getIntersections","roi_region","historyLength2","onChangeMode","FormGroup","SelectionTool","foundLayer","classificationId","setCol","setIds","setBorderColor","setClassificationId","setClassification","setAutomaticFileChange","changeItem","fromButton","boundsSelection","findSmallestTreeItem","moveToRect","changeTile","deleteSelectedRoi","classifyFullSceneImage","ClassifySceneAsOneImage","resultItem","minArea","MAX_SAFE_INTEGER","treeItems","bArea","fromRenderer","tilesProject","curX","curY","dashLength","setLineDash","changeSelRoi","handleChangeClassification","handleAutomaticFileChange","unshift","Mouse","Keyboard","nativeEvent","which","NavigateBefore","NavigateNext","AITrainingTool","updateTrainingProgress","showDownloadProgress","buildingModelText","elapsedTime","modelDownloadProgress","configForm","onParameterChange","selectedExistingModel","errorEpochs","errorAIName","openTrainExistingDialog","selectedExistingModelSourcepath","toolLayerConfig","createProjectModel","projectModel","calcPreview","calcFull","onApplyAll","ConfigFormRaw","handleClickOpen","required","FindSmallestROITool","selectionIdx","sortedTreeItems","checkJumps","updateSortedTreeItems","treeItem1","treeItem2","selectRegion","toggleJumps","deleteSelection","sortIdx","Pagination","shape","GridTool","noGridForChilds","fromFileChange","projectNoViewConfig","lenChilds","newGridSize","resetStructure","c_1","c_2","c_3","c_4","create1mmGrid","GridAnnotationTool","rightClick","gridOffsetX","gridOffsetY","progressText","exportClasses","baseROIOnly","currentFileId","createSelectionArea","sP","eP","treeSelection","gridLayer","baseRois","printFunction","setSelectedLayer","baseRoi","saveGridConfig","onClickExport","tile","pconfig","fileIndex","exportObject","selectedStructureId","fileConfig","tileExport","newLine","tileCount","saveObject","disableExport","rendererObj","mp","onChangeGridSize","onChangeOverlap","onChangeGridOffsetX","onChangeGridOffsetY","onChangeExportClasses","onChangeBaseROIOnly","TilesClassificationTool","TilesHistoPointCountingTool","crosshairColor","crosshairLineWidth","lineLengthWidth","lineLengthHeight","crosshairOpacity","TinyQueue","compare","defaultCompare","_down","_up","halfLength","best","knn","predicate","maxDistance","candidate","node","toBBox","queue","compareDist","boxDist","leaf","isItem","peek","box","axisDist","PlotNearestRoiTool","nearestLayer","nearest","mainRadius","nearestRadius","connectionLineWidth","mainVisibility","nearestVisibility","connectionVisibility","maxDistanceVisibility","nearestLayerId","setSelectedRoiLayer","onChangeColors","onChangeConfig","onChangeSelection","nearestCenters","center2","drawDistanceCircles","selectedTree","drawNearestConnections","drawLayerCircles","onChangeColor","colorObject","configObject","numberInput","filteredStructures","RegionTool","RectangleTool","drawMode","selectedIndex","resizingStarted","selectNexRoi","getValidatedRegions","lastRoi","layerIndex","hoveredRoi","editRoi","deleteRoi","mouseDownPosition","mouseDownRoi","hoveredIndex","rw","rh","setHoveredRoi","deltaP","setClickedRoiSelected","rb","cornerSize","roiWidth","roiHeight","highlightRoi","highlightResizeCorner","buttonStyle","listButtonStyle","CommentTool","mouseActionState","commentState","selectedTool","selectedCommentIdx","gripData","generateDistancePoints","dl","generateArrowPoints","updateCommentRoi","changeSelectedCommentIdx","changeCommentState","deleteCommentRoi","changeSelectedColor","changeSelectedCommentValue","changeRoiFontSize","lineColor","selectionColor","numPoints","physicalLength","unitLength","mouseP","selectedCommentRoi","containsPoint","commentRoiArea","deltaXProc","deltaYProc","computePolygonArea","physicalSizeY","computLengthValue","pointInsideBounds","fct","pointInsideSelection","gripPoints","gripPoint","gripSize","gripSizeInner","bInner","changeCommentType","commentRoi","ListItemAvatar","Avatar","multiline","InputLabelProps","shrink","ListItemSecondaryAction","reverse","EllipseTool","numberOfSegments","cos","sin","pointsToCirclePolygon","FillTool","mainRoi","hole","tempHoleRoi","overlappingRegionRoiTreeItems","possibleRoiCandidates","oRoi","finalPossibleRoiCandidates","roisToExclude","possibleOverlapRoi","excludedOverlapRoi","fRoi","fillHole","ActiveLearningTool","InstantAnalysisTool","runAnalysis","callbackFunction","fileIds","instantAnalysisSignalR","calcTileName","letters","numberRows","numberCellsAlphabet","firstLetter","lettersIdx","resetParameters","configFormRef","parameter","ui","pixelLengthX","pixelLengthY","pixelArea","updateFileClasses","findParentStructure","fileClassification","toolParams","selLayerStructureId","outerParentidx","findOuterParentIdx","layersToSave","depending_structure","depending_channel","required_structures","required_struture","rendererdict","activeLearningSignalR","parentlist","annotationSaveStructureId","annotationSaveStructureIndex","newRois","collides","itemsToRemove","itemToRemove","applyToAll","getSelectedObjects","resultProject","pFile","coord","formControlInUse","validateParameters","cIndex","toolParam","tempCIndex","accordionExpanded","formControls","optionalFormControls","digits","valueOf","hiddenStructures","component_type","transformExponential","htmlFor","optional","students","avatar","ClassroomChat","classRoomChatWidth","headline","student","inline","CroppedImage","roI","validateZ","globalZ","findVisibleRois","pd","parentLayerIndex","areAllImagesComplete","allComplete","imgLeft","imgTop","canvasFactor","getRoiStructureId","getClassificationStructure","handleCanvasClick","automaticTraining","setSelectedWithKey","updateGallery","classificationStructure","roiWasSubtype","bufferRoiId","getNuberChildRois","startData","startAutomaticTraining","giveWarning","allImgsAnnotated","allImagesLabeled","setFUllyAnnotated","setAnnotated","handleCanvasMouseDown","drawingEnabled","mouseX","mouseY","canvasFactor1","gallery","mousepos","posInRoiLayer","positionInLayer","setObjectToLoad","handleMouseLeave","handleMouseEnter","onZStep","zoomSpeed","imgBoundWidth","actTool","previousPageIndex","loadedCount","fullyLoadedCount","imgs1","scroll","zoomSp","imgBoundHeight","canvasWidth","imgBottom","imgRight","factorPyramidLevel","factor_w","factor_h","xBound","yBound","boundWidth","boundHeight","xTile","yTile","rows1","cols1","objectToLoad","vImg","sX","sY","sWidth","sHeight","x1D","y1D","wD","hD","imageForCanvas","fktWidth","fktHeight","contour","ctxOv","canvasOverlay","drawCrosshair","lineLength","linePostion","widthHeight","deltaZ","pixelSize","unit","canvasWidthString","zBar","zStackIcon","zStepUp","zStepDown","SceneImage","handleImageClick","selectedInGallery","getColorFromId","getParentColor","galleryMounted","showFileNames","renderOriginalImage","cWdt","GalleryToolBoxes","getShowContour","setDrawContour","getProjectLabel","isScrollbarVisible","scrollHeight","toolbarSize","handleChangeContour","showContour","handleChangeShowFileNames","setShowFileNames","handleChangeCombo","setFirstTimeGallery","getStructuresForDropDown","findParentIndex","handleChangeFilteredStructure","emptyIdx","handleChangeCrosshair","fromKeyPress","setDrawCrosshair","setAutomaticTraining","startTraining","activeLearning","passiveLearning","applyModel","handleChangeMakePredictions","setApplyModelAfterTraining","originalToolbarHeight","comboBoxSizeOptions","childsGallery","setCrosshairColor","setCrosshairOpacity","setCrosshairLineWidth","isFilesGallery","comboBoxSizeValue","option","Card","Build","toolBox","trainingAcc","setStartData","makePredictions","defaultChecked","ChatBubbleOutline","flexFlow","aiLabel","imgOuter","Gallery","drawContour","allImagesLoaded","allImagesComplete","fromChangePage","fromMount","loadedRois","pg","isRoiSubtype","setElementCount","elCnt","childNames","elementCount","setDynamicStructure","dynamicIndex","setAnnotationsContext","lenStructures","setSubtypesPagesContext","setSubtypeValues","twoSubtypes","behavior","selectNewImage","selectNewRoi","selectNewFile","roiLay","idxSelRoi","subtypeRois","idxInSubtypes","idxNextRoi","visibleFiles","idxNext","handleChangePage","onGallerychangePage","checkIfLoadNewObject","scrollToTop","prevStr","handleChangeRowsPerPage","pageInput","numObjsInLayer","getNumberOfElements","numEls","classifyImageWithKey","classifyRoiWithKey","classifyFileWithKey","currentRoi","classifyTilesGalleryWithKey","setPageSelectedRoi","enoughAnnosCount","handleDivMouseDown","handleDivMouseUp","prps","childColors","isFileSubtype","fileClassId","setProgress","validationAcc","filterObjects","renderCroppedImage","onRefresh","number","visImgs","indexOffset","fromAI","renderSceneImage","getRowsPerPageForProject","canvasSize","selectedObjects","object","clr","selObjCord","selObjs","indexLayer","classificationFiles","iam_ai_inference","toolTipCircularProgress","roisForImages","displayedFiles","alignContent","onScroll","maxHeigth","TablePagination","labelRowsPerPage","rowsPerPageOptions","getRowsPerPageOptionsForProject","backIconButtonProps","nextIconButtonProps","onPageChange","onRowsPerPageChange","labelDisplayedRows","fontFamily","LandmarkTool","selectedLandmarkIdx","gripIdx","radioValue","deletedNumberQ","onClickRemoveTransformation","matrix","reallocateLandmarkNumbers","bMarks","onClickApplyTransformation","baseMarks","targetMarks","handleRadioChange","onClickRemoveAllMarks","mousePoint","topLeft","bottomRight","roiColor","markNumber","tag","checkBoundingBox","HeatmapTool","searchRadius","prevSelectedLayer","activeGrid","initTool","visibilityState","getSubtypeLabels","structs","getRois","checkRTree","rtree","KDBush","treePoints","worldToCanvas","yToWorld","xToWorld","worldDistance","dStart","dEnd","makeTiles","tileSizeX","tileSizeY","canvasHeight","TLx","TLy","BRx","BRy","setHeatmapWithGrid","results","gridMaxValue","range","avgX","avgY","setHeatmapWithoutGrid","noGridMaxValue","within","checkVisibleObjects","pxlValue","textAlignLast","Viewer","setSelLayerConfig","migrateTools","toolIndex","viewerConfigTool","vTool","transformedVParameters","generateToolParameterDict","makeProjectCompatible","sructuresWithNoId","projDataStr","viewerConfStr","newLayerIndices","loadAllFiles","newProjectObject","newRoiLayers","projId","fileAnnotationsLoaded","loadAnnotationsFunction","createAnnotationsProjectModel","loadAnnotations","withHoles","onlyAnnotations","saveWithSpinloader","toolParameters","sharedToolParameters","shared","structureHasChild","findStructureSubtypeLevel","subtypeLevelCount","pIndex","clearOtherLayers","initLayersAndStructures","histogram","storedParams","checkIfErrorInProjectData","newRegionRois","selObjects","graphData","selectedFileId","processGeoJSONArray","geoJSONArray","layerID","newRegionRoisObject","layerObject","tIdx","projectWithClasses","elem","activeElement","localName","onSaveClick","toggleSideBar","pressedNumber","getArrayDepth","depthArray","depth","isCorrespondingPolygon","createNewRois","frameGeoJson","fileIdx","deleteRoiLayersForScene","annotatedFileIds","galleryChangeTool","checkTool","exit","checkPropertyInConfig","property","persisObj","updateStructure","sliderRef","addFileToFullscreen","onSwitchFileSplitscreen","saveFunction","projectObject","toggleFileTreeView","showFileTreeView","containerKey","loadSCNXMLAnnotations","deleteforAllScenes","getNumberSubstructuresWithRois","nextParentLayer","readableId","job","tMatrices","tFactors","tOffsets","fullyAnnotated","current_id","idTimeArr","idLayer","tArrRois","frameIdTimeArr","structID","idframeArray","selLayer","selStructureId","exportSubstructures","numberSubstructuresWithRois","fileID","fromActiveLearning","updateCount","setAIObjects","Objs","subtypeStructureIdx","idxLastLabeled","unlabeled","sortedObjects","newSortedArray","updatedRoiLayer","findFileIndex","applyModelAfterTraining","startPassiveLearningTraining","prepareImagesForTraining","startClassification","projModel","warning","adjustRoiLayers","subtypeLayer","addStuff","filesByteArray","checkStringLength","largeFilesJSONtoBlobConverter","tmpString","keyIdx","annoIdx","annoKeys","annoKeyIdx","annoKey","annoValue","geoJSONKeys","geoJSONKeyIdx","paramKey","paramValue","polyIdx","finalizeByteArray","Blob","getProjectInfoString","projectName","toDataURL","lastIndex","lastIndexOf","saveScreenshot","dataURItoBlob","savePath","link","screenShotName","createZoomObjectForRect","fullscreenChain","fullscreenInitFilePlacement","fs","o","onSaveGalleryClick","originalSideBarWidth","updateDimensions","toggleClassRoomChat","showGrid","resizeEnd","newSideBarWidth","minSideBarWidth","minRendererWidth","newTimeLineHeight","minTimeLineHeight","minCanvasHeight","newToolBarWidth","galleryView","isElementVisible","sideBarWidthObject","sideBarWidthFromConfig","saveChainStatus","chainList","onSelectFileSplitscreen","openFile","onExcludeSplitscreen","onChainSplitscreen","bool","onDropFile","getData","showSplitscreenDropzone","setActiveView","setOpacityChangeFullscreen","firstFullscreenOpacity","secFullscreenOpacity","firstRef","secRef","firstId","secId","setActiveFileFullscreen","onToggleFullscreenChain","task","aiStructures","timeLineHeightObject","verticalToolBarIconsHeight","importProgress","hC","scrollGallery","dimensionsUpdated","refreshState","zoomObjectDict","structureTools","resetRoiZoom","resetRoiZoomInDict","onmousedown","onmouseup","onmousemove","toolPresets","paramName","setNavigationbarTitle","commentLayersObject","landmarkLayersObject","projectDataFiles","getCurrentUser","fullName","openedFileId","sFileIds","fsFileIds","newZoomObjectDict","gl","X1","Y1","hConfig","paramDict","paramLabelDict","activeId","savedT","newroiLayers","emptyIdxs","idTimeArray","loadedframeArray","objectframeArray","Set","structROIs","widthThreshold","outerWidth","heightThreshold","outerHeight","Firebug","chrome","isInitialized","lastFileId","loadImage","newOme","failedFilePath","automaticFullImageRoiLayer","msg","currentFile","docstr","doc","DOMParser","parseFromString","annodoc","getElementsByTagName","tagName","vertices","vertex","selRoiLayer","fromExport","defaultSaveCallback","saveAnnotations","dataURI","byteString","atob","unescape","mimeString","ia","Uint8Array","charCodeAt","mainContainer","flexBasis","onWheel","onDragEnter","onDragLeave","onDragOver","onDrop","dropfieldRoot","activeIndicatorBorder","attachButton","projectConfig","zoomROI1","fullscreenIdx","onSaveGallery","histogramChanged","en","onUpdateDimensions","ProteomSettings","onChangeMetaData","paddingContainer","formItem","Channel","Proteome","hidden","Continues","Discontinues","EpitopeLengthMax","EpitopeLengthMin","MinScore","applyButton","Preview3d","addScript","script","async","head","addStyle","rel","initPeptide","updateProtein","selectedRow","shownProteinId","proteinId","getUniprotData","found","locationMin","locationMax","viewer3D","xmlhttp","XMLHttpRequest","onreadystatechange","readyState","xmlDoc","responseXML","dbReference","viewerId","childNodes","chainsArr","valueArr","chain","positionsArr","minPos","maxPos","openMolecule","send","getLiteMolScope","liteMolScope","angular","isolateScope","moleculeId","LiteMolComponent","destroyPlugin","createPlugin","loadMolecule","sequenceAnnotation","loadSequenceAnnotation","colorChains","selectionDetails","entity_id","struct_asym_id","start_residue_number","end_residue_number","highlightOn","initLiteMolScope","ready","litemolelem","bootstrap","liteMolElement","angularScript","replaceWith","view3d","hiddenView3d","centeredRow","ProteomeSideBar","faDna","changeProjectName","saveAndRunProject","numeric","desc","orderBy","stableSort","cmp","stabilizedThis","getSorting","ProteomResultsHead","createSortHandler","onRequestSort","sortDirection","enterDelay","TableSortLabel","active","ProteomResults","allRows","score","proteinName","proteins","createRow","handleRequestSort","setSelectedRow","handleEpitopeRowClick","epitopes","collapsed","isCollapsed","epitope","tempRow","tableWrapper","rowCount","epitopeRow","hover","tabIndex","ProteomToolBar","downloadPath","downloadReport","topTools","SvgIcon","bottomTools","ProteomeViewer","loadAnnotationsObject","nameChanged","renameProject","field","outerContainer","ToolBarContainer","SideBarContainer","gridTemplateColumns","PreviewContainer","SpectraViewerContext","withSpectraViewer","spectraViewer","SpectraViewerProvider","setContextState","updateAreas","areas","refs","toggleSavedCalcs","useSavedCalcs","setMaxScores","availableSamples","rawSpectra","maxScores","sortPCAs","valueToSortBy","temp_pcas","pcas","pcaOrder","selectedSpectrum","operationSets","rawSpectraLoaded","selectedPca","selectedPcaId","focusedPca","info","scores","approximations","analysisResults","analysisResultsLoaded","selectedPcaScore","selectedProcessedSpectrum","currentlyShownData","ratedSpectra","selectedModelName","passingCriteria","passingCriteria_idx","passingCriteria_min","passingCriteria_max","spectraPredictionSettings","TooltipTable","statusIcon","spectrum","isTemporary","arrow","Timeline","HourglassEmpty","spectrumRating","spectrumWithinTolerances","ratedSpectrum","pass","rating","interactive","ErrorOutline","CheckCircle","Cancel","showRawSpectra","toggleAll","toggleLegend","newColor","updateChartData","setInitialized","operations","int","minMax","quant","std","vec","OperationsTab","coordRange","onAddOperationsSet","operationSetsCopy","onRemoveOperationSet","onAddOperation","operation","lastSet","toAdd","onChangeChip","setIdx","onApplySettings","throwError","requestData","onEnterArea","tempAreas","chart","dispatchAction","applyContainer","applyMainContent","short","operationButton","chipIndikation","Chip","operationSet","operationSetRow","chipContainer","removeIcon","hideRemove","hideAdd","labelValue","chip","onDelete","deleteIcon","Input","onBlur","onKeyUp","xAxisData","stepX","applyBottomContent","textAligne","textTransform","flexWrap","listStyle","criteriaUpperBound","selectionContainer","minMaxInput","ModelTab","selectionContainerRef","tabScrollPosition","scrollContainerHeight","onPCASelection","onModelSelection","selectedVersionIdx","substances","substance","oldSettings","foundIdx","setting","concentration","onPcaAnalysis","onPredictSpectrum","pcaStats","pca","preprocessing","used_scores","features","r2","modelStats","handleChangeCriteriaLimits","handleChangePredictionSettings","handleChangeManualXRange","xValueMinMax","passingCriteriaSettings","targetIndex","criterium","spectraPreditionSettings","setXRangeManually","returnHome","graph_names","visbilityButton","iconOn","iconOff","onApproxToggleVisibility","checkForChecked","checkForAnyChecked","showAnalysisResults","approximation","orig","pre","approx","resid","SpectraSideBar","to","faCheckCircle","tab_no","ELineChart","initChart","mainChartDataShown","chartDom","chartRef","myChart","echarts","setChart","topContainer","toolBarBorder","ResultChart","resultChart","ecStat","regression","setOption","chartType","xAxisLabel","yAxisLabel","rmse","serie","itemStyle","meta","predictedConcentration","series","lineData","legend","trigger","axisPointer","axisLabel","showMinLabel","showMaxLabel","initChartType","chartTypes","chartObject","CHARTTYPES","SpectraResultCharts","setCurrentlyShownData","resultChartTypes","onUpdateResultChartTypes","onRemoveChart","Fab","FileParamForm","onFileParamChange","fileParams","fileParam","trim","onUpdateFileParams","fp","subName","concentrationsOk","concentr","paperContainer","SpectraToolBar","topContent","toggleLeftTableContainer","bottomContent","SpectraLeftTableResults","mainContent","measurement","descendingComparator","getComparator","comparator","EnhancedTableHead","headCells","headCell","visuallyHidden","CustomResultTable","tableHeight","stickyHeader","isAsc","clip","disablePadding","SpectraBottomTableResults","settings","LocalVerticalResizeBorder","initPageX","leftBorder","resizeWidth","targetWidth","LocalHorizontalResizeBorder","lastPageY","initPageY","bottomBorder","newHeight","resizeHeight","targetHeight","borderHeight","SpectraViewer","simpleParams","legendData","windowSize","gatherAllCriteria","criteria","requestType","useAll","areaSet","selectedSpectrumId","limits","requestSpectraData","rated_spectra","structurePcaAnalysisResults","showPredictionResults","predictedSpectra","model_data","setSeries","currentValue","backendStatus","symbol","character","rawSpectrum","original_data","approximated_data","orig_data","spectra","tmpSpectra","existingNames","validateDatasets","animation","containLabel","toolbox","dataZoom","yAxisIndex","brush","saveAsImage","itemSize","iconStyle","xAxisIndex","brushLink","outOfBrush","colorAlpha","every","handleMainTabChange","activeMainTab","leftTableWidth","bottomTableHeight","leftTableContainer","setParentState","borderBackground","bottomTableContainer","ScanViewerContext","withScanViewerContext","scanViewerContext","ScanViewerProvider","changeScanState","scanState","changeTab","socket","slideScanning","commentCount","objectToSend","setScanRendererSize","changeMicroscopeParams","paramJson","moveCenter","sendMinimapClickPosition","sendFilePath","filePath","tabIdx","createWSI","setVignetteState","setFeaturePointsState","numFeaturePoints","toggleCamera","cameraVisible","toggleMinimap","mapVisible","toggleGrid","gridVisible","toggleComments","commentsVisible","toggleFluorescence","sideBarContent","updateFluorescenceParams","deleteTile","zoomIn","zoomReset","exitScanner","sharpness","streamReady","sharpnessBenchmark","fluorescenceChannels","cameraMinFramerate","cameraMaxFramerate","cameraMinExposureTime","cameraMaxExposureTime","cameraMinGain","cameraMaxGain","cameraMinGamma","cameraMaxGamma","cameraMinBlackValue","cameraMaxBlackValue","pixelSizeCamera","cameraColorMin","cameraColorMax","connectScanner","onopen","onclose","lastStateUpdateTime","onmessage","openWarningDialog","cameraVisibleValue","mapVisibleValue","gridVisibleValue","commentsVisibleValue","sideBarContentValue","ScanMinimap","onMinimapClick","parentRect","minimapRef","handleDrag","defaultPosition","streamImg","cameraSettings","heading","opticsSettings","recordVignette","fluorescenceSettings","startScan","duringScan","pausedScan","ScanComments","texts","cardStyle","CardContent","cardContentStyle","gutterBottom","CardActions","cardActionsStyle","previousButtonStyle","nextButtonStyle","closeButtonStyle","ScanRenderer","onMouseWheel","deleteAtMousePosition","mainStreamRef","mouseState","movementX","movementY","imageHash","onbeforeunload","cleanup","computeRendererSize","clientWidth","progressBar","mainStream","imgStyle","minimapStream","SelectFileDialog","updateCurrentFiles","currentPath","currentFiles","onListItemClick","fileFormats","walkDir","entry","pathParts","extension","validateFilePath","onChangeFileName","fullFilePath","selectedExtension","changeFilePath","inputIsValid","getFileMetadata","numTimePoints","dialogTitle","resultFileRow","folderPathText","resultFileName","extensionDropDown","fileFormat","contentBox","dense","Folder","fileIcon","fileSize","creationTime","onConfirm","selectFileButton","ScanToolBar","fileDialogOpen","sidebarVisible","onToggleSidebar","toolbarButtonActive","Pause","Videocam","GridOn","Flare","RestartAlt","inactive","CustomSlider","sliderContainer","onSliderChange","onSliderchangeComitted","iconButton","CustomSelector","selectedValue","ScanMicroscopeSettings","vignetteState","lightSourceParams","sliderParams","red","green","blue","sendParams","lenseParams","adapterParams","frameRate","minKey","maxKey","standardValue","exposureTime","gain","blackValue","lightSource","lense","adapter","OpticsRow","OpticsSelector","infoButton","vignetteRow","checkboxLabel","recordButton","Stop","textfieldNumber","featurePointRow","ScanFluorescence","addChannel","selectChannel","deleteChannel","buttonSelected","buttonUnselected","ListItemButton","listItemSelected","listItemUnselected","ChannelTextField","ScanViewer","rendererContainer","toolBarContainer","sideBarContainer","Report","tempPath","chartFolderPath","walkProjectDirFiles","download_path","origin","req","responseType","workbook","XLSX","SheetNames","Sheets","Sheet1","A1","sheets","sheet_name","utils","sheet_to_json","header","raw","abc","fromCharCode","sheet","rowLength","lastContentIdx","cell","addRow","array_sheets","tab_name","resultTabContent","array_sheet","valueRenderer","onCellsChanged","renderReportChart","boxSizing","PrivateRoute","roles","rest","pathname","SystemContainer","saveClick","collection","storagePath","galleryOutputPath","writeAppSettings","deleteTempFilesClick","deleteTempFiles","deleted","os","getLicensingInfo","readAppSettings","metaField","schedulerStart","schedulerEnd","paper","UserDetailsDialog","autoFocus","UsersContainer","onUserEdit","createUser","loadUserList","users","updateUser","userDetails","deleteUser","newUserClick","Edit","FolderChooser","updateFolderList","filteredDirFiles","dirfiles","relativePath","other","ImporterContainer","importerFolders","folders","writeImporterSettings","addDirectoryClick","showFolderChooser","removeDirectoryClick","readImporterSettings","folder","folderIdx","importerStart","importerEnd","importerNewerThan","ProjectModuleTiles","availableTypes","onProjectType","onProjectTypeChange","rowHeight","projectTilesList","deleteButton","deleteProjectModuleType","tileImage","tileBar","ModuleSelectionDialog","updateProjectTypes","handleOK","selectedProjectType","onSelectProject","submitted","ModuleCreationContainer","setProject","structureKeys","structureObj","handleStructureSelect","uploadedFile","readFile","contents","resultStructures","tempStructure","toolNames","noStructuresError","handlePreviewSelect","previewError","previewFile","previewImgUrl","onCreateProjectType","missingInput","moduleIdError","moduleLabelError","loadReducedAvailableProjectTypes","createProjectModuleTypeImage","createProjectModuleTypeJsonFile","renderPreviewImage","imagePreview","previewDiv","previewIcon","dialogOpen","exportSelectedProjectType","exportProjectTypes","exportNewProjectTypes","ownProjectTypes","isDevState","selectedProject","ProjectProperties","AutomaticBaseRoiWholeImage","Hidden","HideSubMenus","PreventOverlap","PreventOverlapSame","ProjectStringProperties","SideBarWidth","GalleryTool","TilesTool","AdjustLayoutTool","PlotNearestTool","DrawRectangleAnnotationTool","DrawEllipseAnnotationTool","DrawPixelAnnotationTool","DrawRegionAnnotationTool","SelectRegionAnnotationTool","CopyRegionAnnotationTool","FillHoleAnnotationTool","OtherTools","ScreenshotTool","ZoomOriginalTool","ZoomInOutTool","ZoomFitTool","SaveTool","SaveImagesTool","PassiveLearningTool","ApplyModelTool","RoiTab","AICockpit","ResultTab","ShowALTabTool","GalleryTrainingTool","param","faHandPointer","activeColor","toolsInProjectObject","middleStructuresColumn","tileContainer","importProjectTypes","AdminPage","rootContent","LoginPage","validateUserOrEmail","userList","valid","isUsername","validateEmail","emailErrorText","handleSubmit","isSubmitting","testUserList","license","licenseStatus","ValidatorForm","addValidationRule","getUserList","removeValidationRule","CssBaseline","form","validators","errorMessages","suggested","submit","breakpoints","up","LicensingPage","javaPath","correctPath","writeAppSettingsLicensing","allValid","dialogString","validationObject","removeErrorStyle","validationMsg","hardwareID","expirationDate","localhost","licenseKey","readAppSettingsLicensing","rowsmax","Step0","onChangeFilter","searchText","onChangeName","onSaveName","isHistoModule","sm","imageListRef","searchContent","toSearch","availableType","WIP","expiringMarker","isValid","expiredMarker","expiresInDays","titleBar","Step1","EmptySlideCreation","allowed_formats","checkFormat","valid_regex","format","emptyFile_name","ref_regex","pattern","allowed_format","ref_button","non_utf8_capable_filetypes","Step2","getLastDir","pathEnding","lastSeperator","getFilesFromPath","filterText","addAll","supportedFileFormats","sortedDirFiles","lastDir","char","lastFileName","dirFilePaths","lastFileIdx","firstIdx","lastIdx","fileNameToAdd","onChangeFiles","toggleAllFiles","removeFolder","addFolder","filePaths","filteredFiles","filesToAdd","resultFiles","toggleSortMenu","sortMenuOpen","setSortBy","sortBy","sortReverse","image_error","fileList","clickEvent","imageThumbnail","CheckBox","loaded","AddToPhotos","freeHistoParameters","CreateProjectDialog","updateProjectFiles","name_array","createProject","handle_active_tab_change","nextStep","handleBack","prevStep","newdefaultname","activeModules","activeModule","isExpired","firstValidProjectType","uploadFile","completed","ImportProjectsDialog","filesToMap","mapping","dupeObject","newPath","dup","potDupe","importProjectsFinalize","endAdornment","InputAdornment","onSelectAllClick","numSelected","EnhancedTableToolbar","onRunSelectedClick","onTimedRunSelectedClick","onDuplicateSelectedClick","onImportClick","fileUploader","useRef","Toolbar","highlight","spacer","actions","CloudUpload","lighten","dark","ProjectsTable","projectTypesNames","handleSelectAllClick","projects","handleSelectOneClick","serverIsRunning","handleContextmenu","canRun","setProjectsTimed","importProjects","exportProjects","deleteProjects","deleteGalleryExport","duplicateProjects","onDuplicateSingleClick","labelFromState","progressBarContainer","bar","creatingJobBar","cancelJob","resultObject","countOther","countFinished","tableLayout","showJob","jsonDate","tableRow","onEditProject","labelFromProjectType","creationDateTime","toLocaleString","onCancelRowClick","onSetTimedClick","onRunRowClick","paginationSpacer","darken","incrementDefaultName","maxProjNum","proj","projNum","newMaxProjNum","num","pad","HomePage","checkPythonServer","isLocalServerReady","editableProject","handleEditOpen","refreshProjects","activeTabIndex","newDefaultName","refreshInterval","setInterval","clearInterval","listProjects","serverSpinLoader","tags","subTags","CasesSideBar","expansionRow","expansionDetails","TreeView","treeRoot","defaultCollapseIcon","defaultExpandIcon","TreeItem","tagsTreeItem","nodeId","subtag","caseState","cs0","cs1","cs2","cs3","t3","t4","cases","caseId","creationDate","modificationDat","Patient","caseHolder","tagBox","caseStateContainer","CasesViewer","selectedCase","sceneTile","CasesPage","casesContainer","CasesTable","PredictionPage","p4","SettingsPage","NavigationBar","checkProjectButton","isResultsButtonVisible","dir_path","reportExists","resultsPath","extraButtonState","projectPath","showDevButtons","scannerState","expirationMessage","setPageHeadline","listen","scannerData","expirationDays","contains","fullVersion","navigationBarTitle","AppBar","menuButton","getAbout","logFiles","newestLogFile","decodeURIComponent","removeChild","headerButton","warningColor","handleMenu","Person","disablePortal","Grow","menu","ClickAwayListener","onClickAway","MenuList","menuIcon","ExitToApp","appbarPlaceholder","mixins","transformOrigin","errorColor","LogFilesTab","logFilesPython","AboutTab","intranetUrl","localhostMode","HelpTab","workflows","ReleaseNotesTab","releaseNotes","notes","note","AboutPage","scrollRef","buildDate","Container","CustomDialog","handleConfirmOpen","responseFunction","dialogState","handleErrorOpen","handleWarningOpen","confirmed","downloadError","App","enqueueSnackbar","historyDepth","ProteomViewer","exact","withSnackbar","hostname","baseUrl","rootElement","createTheme","typography","useNextVariants","ReactDOM","basename","StyledEngineProvider","injectFirst","ThemeProvider","maxSnack","navigator","serviceWorker","registration","unregister"],"mappings":"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","file":"static/js/main.6b363dd5.chunk.js","sourcesContent":["import { authenticationService } from '../services';\r\n\r\nexport function handleResponse(response) {\r\n return response.text().then(text => {\r\n const data = text && JSON.parse(text);\r\n if (!response.ok) {\r\n if ([401, 403].indexOf(response.status) !== -1) {\r\n // auto logout if 401 Unauthorized or 403 Forbidden response returned from api\r\n authenticationService.logout();\r\n window.location.reload(true);\r\n }\r\n else if ([409].indexOf(response.status) !== -1) {\r\n authenticationService.logout();\r\n window.location = \"/licensing\";\r\n }\r\n\r\n const error = (data && data.message) || response.statusText;\r\n return Promise.reject(error);\r\n }\r\n\r\n return data;\r\n });\r\n}","import { createBrowserHistory } from 'history';\r\n\r\nexport const history = createBrowserHistory();","export const Role = {\r\n\tAdmin: 'Admin',\r\n\tUser: 'User' \r\n}","import { BehaviorSubject } from \"rxjs\";\r\n\r\nimport { handleResponse } from \"../utils\";\r\n\r\nconst currentUserSubject = new BehaviorSubject(\r\n JSON.parse(localStorage.getItem(\"currentUser\"))\r\n);\r\n\r\nexport const authenticationService = {\r\n login,\r\n logout,\r\n currentUser: currentUserSubject.asObservable(),\r\n get currentUserValue() {\r\n return currentUserSubject.value;\r\n },\r\n};\r\n\r\nfunction login(email, password) {\r\n const requestOptions = {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ email, password }),\r\n };\r\n\r\n return fetch(`/api/users/authenticate`, requestOptions)\r\n .then(handleResponse)\r\n .then((user) => {\r\n // store user details and jwt token in local storage to keep user logged in between page refreshes\r\n localStorage.setItem(\"currentUser\", JSON.stringify(user));\r\n currentUserSubject.next(user);\r\n \r\n return user;\r\n });\r\n}\r\n\r\nfunction logout() {\r\n //window.location.reload(true); //clear cache\r\n // remove user from local storage to log user out\r\n localStorage.removeItem(\"currentUser\");\r\n currentUserSubject.next(null);\r\n}\r\n","import { authenticationService } from \"../services\";\r\n\r\nimport { HubConnectionBuilder, LogLevel } from \"@aspnet/signalr\";\r\nimport JSONStream from \"JSONStream\";\r\nimport Stream from \"stream\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\nconst SERVER_URL = \"http://127.0.0.1:8051/\";\r\n\r\n/**\r\n * injects authorization header into the fetch() function\r\n * @param {String} url backend endpoint\r\n * @param {Object} config additional stuff https://developer.mozilla.org/de/docs/Web/API/Fetch_API/Using_Fetch\r\n * @returns {Promise} result of fetch function\r\n */\r\nfunction fetch_auth(url, config = {}) {\r\n // return authorization header with jwt token\r\n const currentUser = authenticationService.currentUserValue;\r\n if (currentUser && currentUser.token) {\r\n if (!config.headers) config.headers = {};\r\n\r\n // place bearer token\r\n config.headers.Authorization = `Bearer ${currentUser.token}`;\r\n }\r\n return fetch(url, config);\r\n}\r\n\r\nfunction customErrorPrint(errorName, error) {\r\n if (error === \"SyntaxError: Unexpected token < in JSON at position 0\") {\r\n console.log(\"Backend could not be connected!\");\r\n } else {\r\n console.log(\"Backend Error in\", errorName, error);\r\n }\r\n}\r\n\r\nexport default class Backend {\r\n static createUser(user, callback) {\r\n fetch_auth(`/api/admin/createuser`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(user),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n static deleteUser(id, callback) {\r\n fetch_auth(`/api/admin/deleteuser`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(id),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n static updateUser(user, callback) {\r\n fetch_auth(`/api/admin/updateuser`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(user),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n static loadUserList(callback) {\r\n fetch_auth(`/api/admin/userlist`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n /**\r\n * loads version and release notes\r\n * @param {Function} callback Success callback\r\n */\r\n static getAbout(callback) {\r\n fetch_auth(`/api/about/about`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n /**\r\n * loads version code\r\n * @param {Function} callback Success callback\r\n */\r\n static getVersion(callback) {\r\n fetch_auth(`/api/about/version`)\r\n .then((response) => response.json())\r\n .then(callback)\r\n .catch((error) => customErrorPrint(\"getVersion\", error));\r\n }\r\n /**\r\n * loads system configuration from appsettings.json\r\n * @param {Function} callback Success callback with ome data model\r\n */\r\n static readAppSettings(callback) {\r\n fetch_auth(`/api/admin/appsettings`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n /**\r\n * writes system configuration from appsettings.json\r\n * @param {Object} appsettings Appsettings Dictionary\r\n * @param {Function} callback Success callback with ome data model\r\n */\r\n static writeAppSettings(appsettings, callback) {\r\n fetch_auth(`/api/admin/appsettings`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(appsettings),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n /**\r\n * loads system configuration from appsettings.json\r\n * @param {Function} callback Success callback with ome data model\r\n */\r\n static readAppSettingsLicensing(callback) {\r\n fetch_auth(`/api/about/appsettingslicensing`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n /**\r\n * writes system configuration from appsettings.json\r\n * @param {Object} appsettings Appsettings Dictionary\r\n * @param {Function} callback Success callback with ome data model\r\n */\r\n static writeAppSettingsLicensing(appsettings, callback) {\r\n fetch_auth(`/api/about/appsettingslicensing`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(appsettings),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n /**\r\n * loads system configuration from appsettings.json\r\n * @param {Function} callback Success callback with ome data model\r\n */\r\n static readImporterSettings(callback) {\r\n fetch_auth(`/api/admin/importsettings`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n /**\r\n * writes system configuration from appsettings.json\r\n * @param {Object} appsettings Appsettings Dictionary\r\n * @param {Function} callback Success callback with ome data model\r\n */\r\n static writeImporterSettings(appsettings, callback) {\r\n fetch_auth(`/api/admin/importsettings`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(appsettings),\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Deletes {../TEMP/files}-folder.\r\n * @param {Function} callback function after the deletion is done\r\n */\r\n static deleteTempFiles(callback) {\r\n console.log(\"Backend.deleteTempFiles()\");\r\n fetch_auth(`/api/admin/delete_temp_files`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Runs a instant analysis tool with real time updates using signalR\r\n * @param {Object} data Instant analysis configuration\r\n * @param {Function} callback Success callback\r\n * @param {Function} errorCallback Error callback\r\n * @param {Function} progressCallback Progress callback\r\n */\r\n static loadImage(params, callback, errorCallback, progressCallback) {\r\n //console.debug(JSON.stringify(data));\r\n const jobId = \"_\" + Math.random().toString(36).substr(2, 9);\r\n\r\n let connection = new HubConnectionBuilder()\r\n .withUrl(\"/jobprogress\")\r\n .configureLogging(LogLevel.Warning)\r\n .build();\r\n connection.serverTimeoutInMilliseconds = 5000000; // 5000 second\r\n connection.on(\"Progress\", (line) => {\r\n if (line) {\r\n progressCallback(line);\r\n }\r\n });\r\n connection.on(\"StandardOutput\", (line) => {\r\n // output debug prints of python module\r\n if (line) {\r\n console.debug(line);\r\n }\r\n });\r\n connection.on(\"Error\", (line) => {\r\n // output debug prints of python module\r\n if (line) {\r\n console.error(line);\r\n }\r\n });\r\n\r\n connection\r\n .start()\r\n .then(() => connection.invoke(\"AssociateJob\", jobId))\r\n .catch((err) => console.error(err.toString()));\r\n\r\n fetch_auth(`/api/rendering/load_image?id=${params.id}&jobId=${jobId}`)\r\n .then((response) => response.json())\r\n .then((res) => {\r\n res.error ? errorCallback(res.error) : callback(res);\r\n })\r\n .catch((error) => {\r\n errorCallback(error);\r\n });\r\n }\r\n\r\n /**\r\n * load project data from Backend\r\n * @param {Object} params object with project id\r\n * @param {Function} callback Success callback with project model object as parameter\r\n */\r\n static loadProject(params, callback) {\r\n fetch_auth(`/api/project/get?id=${params.id}`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * load file annotations data from Backend\r\n * @param {Object} params object with project id\r\n * @param {Function} callback Success callback with project model object as parameter\r\n */\r\n static loadAnnotations(params, callback) {\r\n fetch_auth(\r\n `/api/project/get_annotations?id=${params.id}&fileId=${params.fileId}`\r\n )\r\n .then((response) => {\r\n let obj_res = {};\r\n let s = new Stream.Readable();\r\n s._read = () => {}; // redundant? see update below\r\n\r\n let parser = JSONStream.parse();\r\n parser.on(\"data\", (obj) => {\r\n obj_res = Object.assign({}, obj_res, obj);\r\n });\r\n parser.on(\"end\", () => {\r\n obj_res = Object.values(obj_res);\r\n let result = [];\r\n for (let obj of obj_res) {\r\n let temp_obj = {};\r\n for (const [key, value] of Object.entries(obj)) {\r\n let lowerCaseValue = key.charAt(0).toLowerCase() + key.slice(1);\r\n if (\r\n !(lowerCaseValue in temp_obj) ||\r\n temp_obj[lowerCaseValue] === null\r\n ) {\r\n temp_obj[lowerCaseValue] = value;\r\n }\r\n }\r\n result.push(temp_obj);\r\n }\r\n callback(result);\r\n });\r\n\r\n const reader = response.body.getReader();\r\n new ReadableStream({\r\n start(controller) {\r\n return pump();\r\n function pump() {\r\n return reader.read().then(({ done, value }) => {\r\n // When no more data needs to be consumed, close the stream\r\n if (done) {\r\n s.push(null);\r\n controller.close();\r\n return;\r\n }\r\n // Enqueue the next data chunk into our target stream\r\n function bin2String(array) {\r\n let result = new TextDecoder().decode(array);\r\n return result;\r\n }\r\n let string = bin2String(value);\r\n s.push(string);\r\n controller.enqueue(string);\r\n return pump();\r\n });\r\n }\r\n },\r\n });\r\n s.pipe(parser);\r\n })\r\n .catch((err) => console.error(err));\r\n }\r\n\r\n /**\r\n * load file annotations data from Backend\r\n * @param {Object} params object with project id\r\n * @param {Function} callback Success callback with project model object as parameter\r\n */\r\n static loadAnnotationsObject(params, callback) {\r\n fetch_auth(\r\n `/api/project/get_annotations_object?id=${params.id}&fileId=${params.fileId}`\r\n )\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n static exportGallery(id, fileId, callback) {\r\n fetch_auth(`/api/project/export_gallery?id=${id}&fileId=${fileId}`, {\r\n method: \"POST\",\r\n })\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Get all model inforamtion from both local as well as optionally from online sources.\r\n * The respose will be parsed and the models passed to callback as json.\r\n * @param {String} model_path \"verified_models\" or \"unverified_models\".\r\n * @param {Bool} online Should models be donwloaded from the HSA online server. Defaults to false.\r\n * @param {Function} callback Function executed after response is received.\r\n */\r\n static getModelMetadata(model_path, online = false, callback) {\r\n fetch_auth(\r\n `/api/project/get_model_metadata?model_path=${model_path}&online=${online}`,\r\n {\r\n method: \"GET\",\r\n }\r\n )\r\n .then((response) => response.json())\r\n .then((result) => {\r\n callback(JSON.parse(result.models));\r\n\r\n // In case of models that could not be loaded\r\n if (result.unlistedModels !== \"[]\") {\r\n const unlistedModels = JSON.parse(result.unlistedModels);\r\n console.warn(\r\n \"Not all models are displayed, missing models are:\\n\",\r\n unlistedModels\r\n );\r\n const modelErrs = unlistedModels.map(\r\n (model) => `\\n${model.name} - ${model.version}: \\t${model.shortErr}`\r\n );\r\n window.openErrorDialog(\r\n `Not all models could be loaded, missing models are:${modelErrs}\\n\\nFor further information see console.`\r\n );\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Pre-load python modules in backend to save loading times when actually needed.\r\n */\r\n static initPythonModules() {\r\n fetch_auth(`/api/project/init_python_modules`, {\r\n method: \"POST\",\r\n });\r\n }\r\n\r\n /**\r\n * List all projects of the logged in user\r\n * @param {Function} callback Success callback with list as parameter\r\n */\r\n static listProjects(callback) {\r\n try {\r\n fetch_auth(\"/api/project/list\")\r\n .then((response) => {\r\n if (response.status === 401) {\r\n console.log(\"not authenticated => logout\");\r\n authenticationService.logout();\r\n return;\r\n }\r\n return response.json();\r\n })\r\n .then(callback)\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n } catch (ex) {\r\n console.log(\"error:\", ex);\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new project in database based on the chosen template\r\n * @param {Object} data Project creation model\r\n * @param {Function} callback Success callback\r\n */\r\n static createProject(data, callback) {\r\n fetch_auth(`/api/project/create`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n callback(data);\r\n });\r\n }\r\n\r\n /**\r\n * Export Projects\r\n * @param {String[]} projectIds\r\n * @param {Function} callback\r\n */\r\n static exportProjects(projectIds, exportName, callback) {\r\n fetch_auth(`/api/project/export`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectIds),\r\n })\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n var url = window.URL.createObjectURL(blob);\r\n var a = document.createElement(\"a\");\r\n a.href = url;\r\n a.download = exportName + \".hsa\";\r\n document.body.appendChild(a); // we need to append the element to the dom -> otherwise it will not work in firefox\r\n a.click();\r\n a.remove(); //afterwards we remove the element again\r\n callback();\r\n });\r\n }\r\n\r\n /**\r\n * Imports Exported Projects\r\n * @param {FormFile} file\r\n * @param {Function} callback\r\n */\r\n static importProjects(file, callback) {\r\n var data = new FormData();\r\n data.append(\"file\", file);\r\n\r\n fetch_auth(`/api/project/import`, {\r\n method: \"POST\",\r\n body: data,\r\n })\r\n .then((response) => response.json())\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n *\r\n * @param {Object} aiModel\r\n * @param {Function} callback\r\n */\r\n static exportAIModel(aiModel) {\r\n fetch_auth(`/api/project/export_aimodel`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(aiModel),\r\n })\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n var url = window.URL.createObjectURL(blob);\r\n var a = document.createElement(\"a\");\r\n a.href = url;\r\n a.download = JSON.parse(aiModel)[\"Name\"] + \".modelhsa\";\r\n document.body.appendChild(a); // we need to append the element to the dom -> otherwise it will not work in firefox\r\n a.click();\r\n a.remove(); //afterwards we remove the element again\r\n });\r\n }\r\n\r\n /**\r\n * Deletes selected Custom AI Model\r\n * @param {*} selectedAIModel\r\n * @param {*} callback\r\n */\r\n static deleteAIModel(aiModel, callback) {\r\n fetch_auth(`/api/ai/delete_models`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(aiModel),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Imports Exported AI Models\r\n * @param {FormFile} file\r\n * @param {Function} callback\r\n */\r\n static importAIModels(file, callback) {\r\n var data = new FormData();\r\n data.append(\"file\", file);\r\n\r\n fetch_auth(`/api/project/import_ai_model`, {\r\n method: \"POST\",\r\n body: data,\r\n })\r\n .then((response) => response.json())\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n * Exports (starts download) multiple project modules as zip file\r\n * @param {String[]} names\r\n * @param {Function} callback\r\n */\r\n static exportProjectTypes(names, output_name, callback) {\r\n fetch_auth(`/api/project/export_project_module_types`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(names),\r\n })\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n var url = window.URL.createObjectURL(blob);\r\n var a = document.createElement(\"a\");\r\n a.href = url;\r\n a.download = output_name + \".zip\";\r\n document.body.appendChild(a); // we need to append the element to the dom -> otherwise it will not work in firefox\r\n a.click();\r\n a.remove(); //afterwards we remove the element again\r\n callback(\"success\");\r\n });\r\n }\r\n\r\n /**\r\n * Create Project Module Preview Image\r\n * @param {String} name\r\n * @param {FormFile} img\r\n * @param {Function} callback\r\n */\r\n static createProjectModuleTypeImage(name, img, callback) {\r\n let data = new FormData();\r\n data.append(\"file\", img);\r\n\r\n fetch_auth(`/api/project/create_project_module_type_image?name=${name}`, {\r\n method: \"POST\",\r\n body: data,\r\n })\r\n .then((response) => response.json())\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n * Save screenshot in slides sub folder\r\n * @param {String} name\r\n * @param {FormFile} img\r\n * @param {Function} callback\r\n */\r\n static saveScreenshot(folderPath, fileName, img, callback) {\r\n let data = new FormData();\r\n data.append(\"file\", img);\r\n fetch_auth(\r\n `/api/project/save_screenshot?fileName=${fileName}&folderPath=${folderPath}`,\r\n {\r\n method: \"POST\",\r\n body: data,\r\n }\r\n )\r\n .then((response) => response.json())\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n * Create Project Module Preview Image\r\n * @param {String} name\r\n * @param {String} projectJson\r\n * @param {Function} callback\r\n */\r\n static createProjectModuleTypeJsonFile(name, projectJson, callback) {\r\n fetch_auth(`/api/project/create_project_module_type_json?name=${name}`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectJson),\r\n })\r\n .then((response) => response.json())\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n * Delete Project Module Preview Image and json file\r\n * @param {String} name\r\n * @param {Function} callback\r\n */\r\n static deleteProjectModuleType(name, callback) {\r\n fetch_auth(`/api/project/delete_project_module_type?name=${name}`, {\r\n method: \"POST\",\r\n })\r\n .then((response) => response.json())\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n * Imports Exported Projects\r\n * @param {FormFile} file\r\n * @param {Function} callback\r\n */\r\n static importProjectsFinalize(formData, callback) {\r\n fetch_auth(`/api/project/import_finalize`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(formData),\r\n })\r\n .then((response) => response.json())\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n * Imports Exported Project Types\r\n * @param {FormFile} fileMappings\r\n * @param {Function} callback\r\n * @param {Function} errorCallback\r\n */\r\n static importProjectTypes(fileMappings, callback, errorCallback) {\r\n var data = new FormData();\r\n data.append(\"file\", fileMappings);\r\n fetch_auth(`/api/project/import_project_types`, {\r\n method: \"POST\",\r\n body: data,\r\n })\r\n .then((response) => response.json())\r\n .then((res) => (res.error ? errorCallback(res.error) : callback(res)))\r\n .catch((error) => errorCallback(error));\r\n }\r\n\r\n /**\r\n * Deletes multiple Projects\r\n * @param {String[]} projectIds\r\n * @param {Function} callback\r\n */\r\n static deleteProjects(projectIds, callback) {\r\n fetch_auth(`/api/project/delete`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectIds),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Deletes Gallery Export of Projects\r\n * @param {String[]} projectNames\r\n * @param {Function} callback\r\n */\r\n static deleteGalleryExport(projectNames, callback) {\r\n fetch_auth(`/api/project/deleteGallery`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectNames),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Duplicate multiple Projects\r\n * @param {String[]} projectIds\r\n * @param {Function} callback\r\n */\r\n static duplicateProjects(projectIds, callback) {\r\n fetch_auth(`/api/project/duplicate`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectIds),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Rename Project\r\n * @param {String} projectId\r\n * @param {String} name\r\n * @param {Function} callback\r\n */\r\n static renameProject(projectId, name, callback) {\r\n let params = [projectId, name];\r\n fetch_auth(`/api/project/rename`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(params),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Update Project Files\r\n * @param {String} projectId\r\n * @param {Object} model\r\n * @param {Function} callback\r\n */\r\n static updateProjectFiles(projectId, model, callback) {\r\n fetch_auth(`/api/project/update_files?id=${projectId}`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(model),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Sets multiple Projects to pending\r\n * @param {String[]} projectIds\r\n * @param {Function} callback\r\n */\r\n static setProjectsPending(projectIds, callback) {\r\n fetch_auth(`/api/project/pending`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectIds),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Sets multiple Projects to timed\r\n * @param {String[]} projectIds\r\n * @param {Function} callback\r\n */\r\n static setProjectsTimed(projectIds, callback) {\r\n fetch_auth(`/api/project/timed`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(projectIds),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * saves project data into a json file\r\n * @param {Object} data project model\r\n * @param {Function} callback\r\n */\r\n static saveProject(data, callback) {\r\n fetch_auth(`/api/project/saveProject`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data, null, 2),\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n callback(data);\r\n });\r\n }\r\n\r\n /**\r\n * saves annotations into json files\r\n * @param {String} projectId\r\n * @param {Object} data project model\r\n * @param {Function} callback\r\n */\r\n static saveAnnotations(projectId, fileId, data, callback) {\r\n // https://stackoverflow.com/questions/50918007/accepting-byte-in-a-net-core-webapi-controller\r\n // data = new Blob([data.buffer]);\r\n fetch_auth(\r\n `/api/project/saveAnnotations?projectId=${projectId}&fileId=${fileId}`,\r\n {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/octet-stream\" },\r\n body: data,\r\n }\r\n )\r\n .then((response) => response.json())\r\n .then((data) => {\r\n callback(data);\r\n })\r\n .catch((error) => console.log(\"error\", error));\r\n }\r\n\r\n /**\r\n * saves project data into a json file\r\n * @param {Object} data project model\r\n * @param {Function} callback\r\n */\r\n static saveGallery() {}\r\n\r\n /**\r\n * load project type viewer configuration\r\n * @param {String} projectType name of project type\r\n * @param {Function} callback\r\n */\r\n static loadViewerConfig(projectType, callback) {\r\n fetch_auth(\r\n `/api/project/load_viewer_config?name=${encodeURIComponent(projectType)}`\r\n )\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * load all available project types\r\n * only load once, otherwise weit for a variable to be filled before returning result\r\n * @param {Function} callback contains list of all project types\r\n */\r\n static loadAvailableProjectTypes(callback) {\r\n //let t0 = performance.now();\r\n if (typeof window.availabeProjectTypes === \"undefined\") {\r\n window.availabeProjectTypes = \"blocked\";\r\n fetch_auth(\"/api/project/get_project_types\")\r\n .then((response) => response.json())\r\n .then((data) => {\r\n //console.log(\"loadAPTs time:\", performance.now() - t0);\r\n window.availabeProjectTypes = data;\r\n callback(data);\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n } else {\r\n const waitForElement = () => {\r\n if (window.availabeProjectTypes !== \"blocked\") {\r\n //console.log(\"loadAPTs time:\", performance.now() - t0);\r\n callback(window.availabeProjectTypes);\r\n } else {\r\n setTimeout(waitForElement, 200);\r\n }\r\n };\r\n waitForElement();\r\n }\r\n }\r\n\r\n /**\r\n * load all available project types, but only return reduced information, to be faster\r\n * also save and load from local storage\r\n * @param {Function} callback contains list of all project types\r\n */\r\n static loadReducedAvailableProjectTypes(callback) {\r\n //let t0 = performance.now();\r\n Backend.getVersion((data) => {\r\n const ptKey = \"projectTypes_\" + data.version;\r\n let projectTypes = JSON.parse(localStorage.getItem(ptKey));\r\n if (projectTypes === null) {\r\n Backend.loadAvailableProjectTypes((data) => {\r\n projectTypes = data.map((item) => {\r\n return {\r\n annotations: item.annotations,\r\n description: item.description,\r\n isUserModule: item.isUserModule,\r\n name: item.name,\r\n order: item.order,\r\n label: item.label,\r\n };\r\n });\r\n localStorage.setItem(ptKey, JSON.stringify(projectTypes));\r\n //console.log(\"loadRAPTs time:\", performance.now() - t0);\r\n callback(projectTypes);\r\n });\r\n } else {\r\n //console.log(\"loadRAPTs time:\", performance.now() - t0);\r\n callback(projectTypes);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * load all available project types\r\n * @param {String} dir directory to list files within\r\n * @param {Function} callback contains list of all project types\r\n */\r\n static walkDir(dir, callback) {\r\n fetch_auth(`/api/project/walk_dir?path=${encodeURIComponent(dir)}`)\r\n .then((response) => response.json())\r\n .then(callback)\r\n .catch((error) => {\r\n console.log(\"error\", error);\r\n });\r\n }\r\n\r\n /**\r\n * load all available project types\r\n * @param {String} dir directory to list files within\r\n * @param {Function} callback contains list of all project types\r\n */\r\n static walkProjectDirFiles(dir, callback) {\r\n fetch_auth(\r\n `/api/project/walk_project_dir_files?path=${encodeURIComponent(dir)}`\r\n )\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Cancel Job\r\n * @param {String} id\r\n */\r\n static cancelJob(id) {\r\n fetch_auth(`/api/project/cancel`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(id),\r\n }).then((response) => response.json());\r\n }\r\n\r\n /**\r\n * Check if String has JSON-Format\r\n * @param {String} str\r\n */\r\n static isJsonString(str) {\r\n try {\r\n // for (var i = 0; i < str.length; i++) {\r\n\r\n // }\r\n JSON.parse(str);\r\n } catch (e) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Runs a instant analysis tool with real time updates using signalR\r\n * @param {Object} data Instant analysis configuration\r\n * @param {Function} callback Success callback\r\n * @param {Function} error Error callback\r\n */\r\n static instantAnalysisSignalR(data, spinloader, callback, error) {\r\n //console.debug(JSON.stringify(data));\r\n //console.log(\"data:\", data);\r\n\r\n let connection = new HubConnectionBuilder()\r\n .withUrl(\"/jobprogress\")\r\n .configureLogging(LogLevel.Warning)\r\n .build();\r\n connection.serverTimeoutInMilliseconds = 5000000; // 5000 second\r\n connection.keepAliveIntervalInMilliseconds = 5000000; // 5000 second\r\n // connection.on(\"Progress\", (line) => {\r\n // // output debug prints of python module\r\n // //console.debug(line);\r\n // });\r\n connection.on(\"StandardOutput\", (line) => {\r\n // output debug prints of python module\r\n\r\n // output warning\r\n if (line) {\r\n if (this.isJsonString(line)) {\r\n const jsonLine = JSON.parse(line);\r\n for (var k in jsonLine) {\r\n switch (k) {\r\n case \"warning\":\r\n window.showWarningSnackbar(jsonLine[\"warning\"]);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n } else {\r\n window.trainingProgress(line);\r\n }\r\n if (line.includes(\"[DownloadProgress]\")) {\r\n let progress = line.replace(\"[DownloadProgress]\", \"\");\r\n spinloader.showWithProgress({\r\n message: \"Download Model\",\r\n progress: parseInt(progress, 10),\r\n });\r\n } else if (line.includes(\"[IAMProgress]\")) {\r\n let progress = line.replace(\"[IAMProgress]\", \"\");\r\n spinloader.showWithProgress({\r\n message: \"Progress\",\r\n progress: parseInt(progress, 10),\r\n });\r\n } else if (!line.includes(\"[MESSAGE]\")) {\r\n console.debug(line);\r\n spinloader.show();\r\n }\r\n }\r\n });\r\n connection.on(\"Result\", (json) => {\r\n console.log(\"iam result returned\");\r\n if (json.error) {\r\n // there was an exception in python module\r\n error(json.error);\r\n } else {\r\n // success\r\n callback(json.project);\r\n }\r\n });\r\n\r\n setTimeout(() => {\r\n fetch_auth(`/api/analysis/iam`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .then((myJson) => {\r\n connection\r\n .start()\r\n .then(() => connection.invoke(\"AssociateJob\", myJson.jobId))\r\n .catch((err) => console.error(err.toString()));\r\n });\r\n }, 500); //wait 0.5 s, so there are less problems, todo: check when ready and start the fetch then\r\n }\r\n\r\n /**\r\n * Runs a instant analysis tool\r\n * @param {Object} data Instant analysis configuration\r\n * @param {Function} callback Success callback\r\n * @param {Function} error Error callback\r\n */\r\n static instantAnalysis(data, callback, error) {\r\n fetch_auth(`/api/analysis/iam`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n console.log(json.stdout);\r\n if (json.error) {\r\n error(json.error);\r\n } else {\r\n // success\r\n callback(json.project);\r\n }\r\n });\r\n }\r\n /**\r\n * Runs a instant analysis tool with real time updates using signalR\r\n * @param {Object} data Instant analysis configuration\r\n * @param {Function} callback Success callback\r\n * @param {Function} error Error callback\r\n */\r\n static activeLearningSignalR(data, callback, error) {\r\n //console.debug(JSON.stringify(data));\r\n\r\n let connection = new HubConnectionBuilder()\r\n .withUrl(\"/jobprogress\")\r\n .configureLogging(LogLevel.Warning)\r\n .build();\r\n connection.serverTimeoutInMilliseconds = 5000000; // 5000 second\r\n // connection.on(\"Progress\", (line) => {\r\n // // output debug prints of python module\r\n // //console.debug(line);\r\n // });\r\n connection.on(\"StandardOutput\", (line) => {\r\n // output debug prints and warnings of python module\r\n if (line) {\r\n if (this.isJsonString(line)) {\r\n const jsonLine = JSON.parse(line);\r\n for (var k in jsonLine) {\r\n switch (k) {\r\n case \"warning\":\r\n window.showWarningSnackbar(jsonLine[\"warning\"]);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n } else {\r\n window.galleryTrainingProgress(line);\r\n }\r\n console.debug(line);\r\n }\r\n });\r\n connection.on(\"Result\", (json) => {\r\n if (json.error) {\r\n // there was an exception in python module\r\n error(json.error);\r\n } else {\r\n // success\r\n callback(json.alModel);\r\n }\r\n });\r\n\r\n fetch_auth(`/api/analysis/alm`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .then((myJson) => {\r\n connection\r\n .start()\r\n .then(() => connection.invoke(\"AssociateJob\", myJson.jobId))\r\n .catch((err) => console.error(err.toString()));\r\n });\r\n }\r\n\r\n /**\r\n * generate path for images to render a specific region\r\n */\r\n static renderRegion(params) {\r\n return `/api/rendering/render_region?id=${params.id}&page=${params.page}&level=${params.lv}&x=${params.x}&y=${params.y}`;\r\n //return `http://localhost:8051/api/v1/render_region?id=${params.id}&page=${params.page}&level=${params.lv}&x=${params.x}&y=${params.y}`;\r\n }\r\n\r\n /**\r\n * generate path for thumbnail image\r\n */\r\n static renderThumbnail(id) {\r\n return `/api/rendering/render_thumbnail?id=${id}`;\r\n }\r\n\r\n /**\r\n * generate path for original image\r\n * @param {string} sourcePath Path to the image being loaded.\r\n * @returns {string} Api link to original image file.\r\n */\r\n static renderOriginalImage(sourcePath) {\r\n return `/api/rendering/render_original_image?sourcePath=${sourcePath}`;\r\n }\r\n\r\n /**\r\n * Get the loaction of thumbnails for a image based on its path.\r\n * @param {string} image_path Path to the image being loaded.\r\n * @returns {string} Api link to image thumbnail.\r\n */\r\n static imageThumbnail(image_path) {\r\n return `/api/project/image_thumbnail?path=${image_path}`;\r\n }\r\n\r\n /**\r\n * generate and load 3d objects\r\n * @param {Object} data Instant analysis configuration\r\n */\r\n static get3dObjects(data) {\r\n return `/api/rendering/get3dObjects?file_id=${data.fileId}&project_id=${data.projectId}&zRange=${data.zRange}&showPointCloud=${data.showPointCloud}`;\r\n }\r\n\r\n /**\r\n * check if Sony QD Job ran\r\n * @param {Object} data Instant analysis configuration\r\n */\r\n static get3DAllObjectsExists(data, callback) {\r\n fetch_auth(\r\n `/api/rendering/get3DAllObjectsExists?file_id=${data.fileId}&project_id=${data.projectId}`,\r\n {\r\n method: \"GET\",\r\n }\r\n )\r\n .then((res) => res.text())\r\n .then((data) => callback(data));\r\n }\r\n\r\n /**\r\n * check, if python server is running\r\n * @param {*} callback\r\n */\r\n static isLocalServerReady(callback) {\r\n fetch_auth(`/api/rendering/is_running`, {\r\n method: \"GET\",\r\n })\r\n .then((res) => res.text())\r\n .then((data) => callback(data === \"True\"))\r\n .catch(() => console.log(\"error is_running\"));\r\n }\r\n\r\n /**\r\n * generate download url for project report\r\n * @param {String} id Project ID\r\n */\r\n static downloadReport(id) {\r\n return `/api/project/report?id=${id}`;\r\n }\r\n\r\n /**\r\n * generate image source to report chart\r\n * @param {String} id Project ID\r\n */\r\n static renderReportChart(path) {\r\n return `/api/project/report_chart?path=${path}`;\r\n }\r\n\r\n /**\r\n * Runs a instant analysis tool with real time updates using signalR\r\n * @param {Object} data Instant analysis configuration\r\n * @param {Function} callback Success callback\r\n * @param {Function} error Error callback\r\n */\r\n static aiTrainingSignalR(\r\n data,\r\n progressCallback,\r\n successCallback,\r\n errorCallback\r\n ) {\r\n let modelType = \"none\";\r\n let isVdlModel = false;\r\n if (data.parameters && data.parameters.modelType) {\r\n modelType = data.parameters.modelType;\r\n if (modelType == \"instance segmentation\") {\r\n // check if vdl model\r\n if (data.parameters.advancedSettings.comDLArchitecture === null) {\r\n isVdlModel = true;\r\n } else if (\r\n data.parameters.advancedSettings.comDLArchitecture &&\r\n data.parameters.advancedSettings.comDLArchitecture.label ==\r\n \"Mask R-CNN VDL\"\r\n ) {\r\n isVdlModel = true;\r\n }\r\n }\r\n }\r\n //console.debug(JSON.stringify(data));\r\n\r\n let connection = new HubConnectionBuilder()\r\n .withUrl(\"/jobprogress\")\r\n .configureLogging(LogLevel.Warning)\r\n .build();\r\n connection.serverTimeoutInMilliseconds = 5000000; // 5000 second\r\n connection.on(\"Progress\", (line) => {\r\n if (line) {\r\n progressCallback(line);\r\n }\r\n });\r\n connection.on(\"StandardOutput\", (line) => {\r\n // output debug prints of python module\r\n if (line) {\r\n console.debug(line);\r\n window.trainingProgress(line);\r\n if (typeof window.updateTrainingData === \"function\") {\r\n window.updateTrainingData(line, modelType, isVdlModel);\r\n }\r\n }\r\n });\r\n connection.on(\"Result\", (json) => {\r\n if (json.error) {\r\n console.log(\"training callback error:\", json);\r\n // there was an exception in python module\r\n errorCallback(json.error);\r\n } else {\r\n // success\r\n successCallback(json.project);\r\n }\r\n });\r\n\r\n fetch_auth(`/api/ai/train`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .then((myJson) => {\r\n connection\r\n .start()\r\n .then(() => connection.invoke(\"AssociateJob\", myJson.jobId))\r\n .catch((err) => console.error(err.toString()));\r\n });\r\n }\r\n\r\n /**\r\n * Runs a instant analysis tool with real time updates using signalR\r\n * @param {Function} callback Success callback\r\n */\r\n static stopAITraining(callback) {\r\n fetch_auth(`/api/ai/stop_train`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Opens a dialog where you can select an AI model for the selected structure\r\n * @param {Function} callback\r\n */\r\n static getAIModelDialogData(callback) {\r\n fetch_auth(`/api/ai/custom_models`)\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Copies the selected AI models to {../TEMP/custom_models/verified}-folder. This folder is accessable from the AICockpit.\r\n * @param {string} verifiedAIModel selected ai model which gets copied to verified models folder\r\n * @param {Function} callback\r\n */\r\n static addCustomAIModels(verifiedAIModel, callback) {\r\n fetch_auth(`/api/ai/add_custom_models?verifiedAIModel=${verifiedAIModel}`)\r\n .then((response) => response.json())\r\n .then((res) => callback(res));\r\n }\r\n\r\n /**\r\n * Deletes selected Custom AI Model\r\n * @param {*} selectedAIModel\r\n * @param {*} callback\r\n */\r\n static deleteCustomAIModels(selectedAIModel, callback) {\r\n fetch_auth(`/api/ai/delete_custom_models`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(selectedAIModel),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * gets the sourcepath of selected verified model\r\n * @param {*} selectedAIModel\r\n * @param {*} callback\r\n */\r\n static getSelectedModelSourcepath(selectedAIModel, callback) {\r\n fetch_auth(`/api/ai/get_model_sourcepath`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(selectedAIModel),\r\n })\r\n .then((response) => response.json())\r\n .then((json) => {\r\n // success\r\n callback(json);\r\n });\r\n }\r\n\r\n /**\r\n * Get License Infos for LicensingPage\r\n * @param {Function} callback Success callback\r\n */\r\n static getLicensingInfo(callback) {\r\n var requestOptions = {\r\n method: \"GET\",\r\n redirect: \"follow\",\r\n };\r\n\r\n fetch(\"/api/about/licensingInfo\", requestOptions)\r\n .then((response) => response.json())\r\n .then(callback)\r\n .catch((error) => console.log(\"error!!!!!!!!!\", error));\r\n }\r\n\r\n /**\r\n * Get Operating System\r\n * @param {Function} callback Success callback\r\n */\r\n static getOS(callback) {\r\n fetch(\"/api/about/os\")\r\n .then((response) => response.text())\r\n .then((result) => {\r\n console.log(result);\r\n callback(result);\r\n })\r\n .catch((error) => console.log(\"error\", error));\r\n }\r\n\r\n /**\r\n * Get currently logged in User\r\n * @param {Function} callback Success callback\r\n */\r\n static getCurrentUser(callback) {\r\n fetch_auth(\"/api/project/currentUser\")\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Get user list from login-Page\r\n * @param {Function} callback Success callback\r\n */\r\n static getUserList(callback) {\r\n fetch(\"/api/login/userlist\")\r\n .then((response) => response.json())\r\n .then(callback);\r\n }\r\n\r\n /**\r\n * Receives instructions on how to perform PCA in json format\r\n * Sends results in json format. Gives real time updates.\r\n * @param {JSON} graphRequestSettings Specification of the request\r\n * @param {Function} callback Success callback on json request\r\n * @param {Function} error Error callback on json request\r\n * @param {Function} progressCallback Webhook callback for progress\r\n */\r\n static requestSpectraData(\r\n graphRequestSettings,\r\n callback,\r\n error,\r\n progressCallback\r\n ) {\r\n let connection = new HubConnectionBuilder()\r\n .withUrl(\"/jobprogress\")\r\n .configureLogging(LogLevel.Warning)\r\n .build();\r\n connection.serverTimeoutInMilliseconds = 5000000; // 5000 second\r\n connection.on(\"StandardOutput\", (line) => {\r\n // output debug prints of python module\r\n if (line) {\r\n // NOTE: [MESSAGE] is kept as compatibility with independent import functions\r\n // used for Image import, background AI processes, etc.\r\n if (line.startsWith(\"[MESSAGE]\")) {\r\n // Remove [MESSAGE] and extract JSON payload\r\n progressCallback(JSON.parse(line.slice(9)));\r\n } else {\r\n console.debug(line);\r\n }\r\n }\r\n });\r\n\r\n // Add GUID for WebHook\r\n graphRequestSettings.jobId = uuidv4();\r\n connection\r\n .start()\r\n .then(() => connection.invoke(\"AssociateJob\", graphRequestSettings.jobId))\r\n .catch((err) => {\r\n console.log(\"error catch\");\r\n console.error(err.toString());\r\n });\r\n\r\n var requestOptions = {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n },\r\n body: JSON.stringify(graphRequestSettings),\r\n };\r\n\r\n fetch_auth(\"/api/analysis/pcaupdate\", requestOptions)\r\n .then((response) => response.json())\r\n .then((json) => {\r\n if (json.result.error) {\r\n // there was an exception in python module\r\n error(json.result.error);\r\n } else {\r\n // success\r\n callback(json.result);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Runs a Grid annotation tool with real time updates\r\n * @param {Object} data export Data\r\n * @param {Function} callback Success callback\r\n * @param {Function} error Error callback\r\n */\r\n static tileExport(data) {\r\n let connection = new HubConnectionBuilder()\r\n .withUrl(\"/jobprogress\")\r\n .configureLogging(LogLevel.Warning)\r\n .build();\r\n connection.serverTimeoutInMilliseconds = 5000000; // 5000 second\r\n connection.on(\"Progress\", (line) => {\r\n if (line) {\r\n console.log(\"line\", line);\r\n }\r\n });\r\n connection.on(\"StandardOutput\", (line) => {\r\n if (line) {\r\n window.tileExportProgress(line);\r\n }\r\n });\r\n connection.on(\"Result\", (json) => {\r\n if (json.error) {\r\n console.log(\"json error\");\r\n }\r\n });\r\n\r\n fetch_auth(`/api/project/tileexport`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(data),\r\n })\r\n .then((response) => response.json())\r\n .then((myJson) => {\r\n connection\r\n .start()\r\n .then(() => connection.invoke(\"AssociateJob\", myJson.jobId))\r\n .catch((err) => {\r\n console.error(err.toString());\r\n console.log(\"error catch\");\r\n });\r\n });\r\n }\r\n\r\n static validateResponse(response) {\r\n if (!response.ok) {\r\n throw Error(response.statusText);\r\n }\r\n return response;\r\n }\r\n\r\n /**\r\n * connect to backend via Websocket and returns it for communication\r\n * @param {func} callback\r\n */\r\n static connectScanner() {\r\n return new WebSocket(\"ws://127.0.0.1:8051/api/scan/connect\");\r\n }\r\n\r\n /**\r\n * gets metadata from .hsasld file\r\n */\r\n static getFileMetadata(path, callback) {\r\n fetch(SERVER_URL + \"api/scan/get_hsasld_meta?path=\" + path)\r\n .then((response) => response.json())\r\n .then((myJson) => callback(myJson));\r\n }\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { IconButton, Tooltip, Checkbox, FormControlLabel } from \"@mui/material\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { SketchPicker } from \"react-color\";\r\n\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport {\r\n faChartArea,\r\n faUndo,\r\n faArrowsAltH,\r\n faChartLine,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\nimport { GetApp, Publish } from \"@mui/icons-material\";\r\n\r\nimport ToggleButton from \"@mui/material/ToggleButton\";\r\nimport ToggleButtonGroup from \"@mui/material/ToggleButtonGroup\";\r\nimport \"./../../css/histogram.css\";\r\n\r\nconst styles = {\r\n root: {\r\n overflow: \"visible\",\r\n },\r\n chartContainer: {\r\n height: 120,\r\n position: \"relative\",\r\n marginBottom: 0,\r\n },\r\n rangeSlider: {\r\n bottom: 12,\r\n },\r\n actionButton: {\r\n display: \"inline-block\",\r\n border: \"none\",\r\n background: \"rgba(0, 0, 0, 0.2)\",\r\n marginRight: \"2px\",\r\n height: \"35px\",\r\n },\r\n toggleContainer: {\r\n boxShadow: \"none\",\r\n display: \"inline-block\",\r\n verticalAlign: \"top\",\r\n },\r\n title: {\r\n padding: 5,\r\n fontSize: 14,\r\n },\r\n toolbar: {\r\n width: \"100%\",\r\n },\r\n toolButton: {\r\n fontSize: 18,\r\n },\r\n toolButtonRight: {\r\n fontSize: 18,\r\n float: \"right\",\r\n },\r\n grow: {\r\n flexGrow: 1,\r\n },\r\n gradientBar: {\r\n height: 5,\r\n width: \"100%\",\r\n background: \"linear-gradient(90deg, black, white)\",\r\n },\r\n dragIndicator: {\r\n color: \"#757575\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n cursor: \"grab\",\r\n },\r\n grabbing: {\r\n cursor: \"grabbing\",\r\n },\r\n color: {\r\n borderRadius: \"2px\",\r\n },\r\n channelLabel: {\r\n minWidth: \"42px\",\r\n lineHeight: \"18px\",\r\n },\r\n popover: {\r\n position: \"absolute\",\r\n zIndex: \"2\",\r\n },\r\n cover: {\r\n position: \"fixed\",\r\n top: \"0px\",\r\n right: \"0px\",\r\n bottom: \"0px\",\r\n left: \"0px\",\r\n },\r\n toggleBtnContent: {\r\n position: \"relative\",\r\n },\r\n};\r\n\r\n// Histogram Scale Enum\r\nconst HistogramScale = {\r\n LINEAR: \"linear\",\r\n LOGARITHMIC: \"logarithmic\",\r\n};\r\n\r\n/**\r\n * convert hex colors to rgb values with alpha\r\n * @param {String} hex Hax Color Code\r\n * @param {Number} alpha Alpha value\r\n */\r\nfunction hexToRGB(hex, alpha) {\r\n var r = parseInt(hex.slice(1, 3), 16),\r\n g = parseInt(hex.slice(3, 5), 16),\r\n b = parseInt(hex.slice(5, 7), 16);\r\n\r\n if (alpha) {\r\n return \"rgba(\" + r + \", \" + g + \", \" + b + \", \" + alpha + \")\";\r\n } else {\r\n return \"rgb(\" + r + \", \" + g + \", \" + b + \")\";\r\n }\r\n}\r\n\r\nfunction validateGamma(gamma) {\r\n return gamma > 2 ? Math.pow(gamma, 1 / 4) : gamma;\r\n}\r\n\r\n/**\r\n * Configuration of a Fluorescence Channel\r\n */\r\nexport class ChannelsConfig {\r\n constructor(omeChannels) {\r\n let nChannels = omeChannels.length;\r\n this.nChannels = nChannels;\r\n\r\n this.channels = [];\r\n for (let i = 0; i < nChannels; i++) {\r\n let color = omeChannels[i].color;\r\n if (color !== -1) {\r\n if (!isNaN(color)) {\r\n color = parseInt(color, 10);\r\n // handle negative color integers\r\n if (color < 0) color = 16777216 - color;\r\n // conver decimal to hex\r\n color = color.toString(16);\r\n // add leading zeros\r\n while (color.length < 6 || color.length % 2 !== 0) {\r\n color = \"0\" + color;\r\n }\r\n // add leading #\r\n color = \"#\" + color;\r\n }\r\n }\r\n let channelName =\r\n omeChannels[i].name === \"TL Brightfield\" ? \"RGB\" : omeChannels[i].name;\r\n\r\n channelName =\r\n channelName === \"\"\r\n ? i === 0\r\n ? \"R\"\r\n : i === 1\r\n ? \"G\"\r\n : \"B\"\r\n : channelName;\r\n this.channels[i] = {\r\n color: color,\r\n enabled: true,\r\n min: 250 * omeChannels[i].low,\r\n max: 250 * Math.min(omeChannels[i].high, 1),\r\n gamma: validateGamma(omeChannels[i].gamma),\r\n name: omeChannels[i].name,\r\n type: omeChannels[i].type,\r\n };\r\n }\r\n\r\n // default scaling is linear\r\n this.scale = HistogramScale.LOGARITHMIC;\r\n }\r\n}\r\n\r\nclass Histogram extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n let stateGamma = this.props.histogramConfig.channels[0].gamma;\r\n if (stateGamma > 2) {\r\n stateGamma = Math.pow(stateGamma, 1 / 4);\r\n }\r\n this._isMounted = false;\r\n this.state = {\r\n originalHistogramConfig: JSON.parse(\r\n JSON.stringify(props.histogramConfig)\r\n ),\r\n selectedSingleChannel: -1,\r\n selectedChannels: this.getEnabledChannels(),\r\n histograms: [],\r\n datasets: [],\r\n displayColorPicker: false,\r\n singleChannelMode: false,\r\n channelSelectMode: this.props.channelSelectMode,\r\n sliderMode: false,\r\n leftGammaValue: this.gammaFunction(0.25, stateGamma),\r\n rightGammaValue: this.gammaFunction(0.75, stateGamma),\r\n min:\r\n props.histogramConfig.channels[0].min > 250\r\n ? 0\r\n : props.histogramConfig.channels[0].min,\r\n max:\r\n props.histogramConfig.channels[0].max > 255\r\n ? 250\r\n : props.histogramConfig.channels[0].max,\r\n gamma: stateGamma,\r\n isBrightfield: this.isBrightfield(),\r\n };\r\n // load small images from backend and calculate histogram\r\n for (let c = 0; c < props.histogramConfig.nChannels; c++) {\r\n let img = new Image();\r\n img.src = Backend.renderRegion({\r\n id: props.id,\r\n page: c, // TODO calc page for complex images (timeframes and z stack)\r\n lv: 0,\r\n x: 0,\r\n y: 0,\r\n debug: false,\r\n });\r\n // wait until image is loaded succesfully\r\n img.onload = () => {\r\n // calcualte histogram\r\n let histograms = this.state.histograms;\r\n if (this.state.isBrightfield) {\r\n histograms[0] = this.calcHist(img, 0);\r\n histograms[1] = this.calcHist(img, 1);\r\n histograms[2] = this.calcHist(img, 2);\r\n } else {\r\n histograms[c] = this.calcHist(img, 0);\r\n }\r\n\r\n this.setMountedState({ histograms: histograms });\r\n if (this._isMounted) this.forceUpdate();\r\n };\r\n }\r\n }\r\n\r\n isBrightfield() {\r\n let channels = this.props.histogramConfig.channels;\r\n if (channels.length > 1) return false;\r\n return (\r\n channels[0].type === \"brightfield\" ||\r\n channels[0].name === \"TL Brightfield\" ||\r\n channels[0].name === \"RGB\"\r\n );\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n const histogramConfig = this.props.histogramConfig;\r\n this.drawGammaLine();\r\n\r\n // find all selected channels and put in channels array\r\n let channels = this.props.histogramConfig.channels\r\n .map((val, index) => (val.enabled ? index : null))\r\n .filter((val) => val !== null);\r\n if (this.state.isBrightfield) {\r\n channels = [-1];\r\n }\r\n let stateObject = {\r\n selectedChannels: channels,\r\n dimensions: {\r\n width: this.container.offsetWidth,\r\n height: 120,\r\n },\r\n };\r\n\r\n // if one channel selected, set min max state of this channel\r\n if (channels.length === 1 && channels[0] !== -1) {\r\n stateObject.min = histogramConfig.channels[channels[0]].min;\r\n stateObject.max = histogramConfig.channels[channels[0]].max;\r\n stateObject.gamma = validateGamma(\r\n histogramConfig.channels[channels[0]].gamma\r\n );\r\n }\r\n this.setMountedState(stateObject);\r\n }\r\n\r\n calcHist(img, channel) {\r\n // create a temporary canvas to convert our image into imagedata array\r\n let offScrCan = document.createElement(\"canvas\");\r\n offScrCan.width = img.width;\r\n offScrCan.height = img.height;\r\n let ctx1 = offScrCan.getContext(\"2d\");\r\n\r\n // draw image all over the canvas\r\n ctx1.drawImage(img, 0, 0, img.width, img.height);\r\n\r\n // read out image data array\r\n let imgData = ctx1.getImageData(0, 0, img.width, img.height).data;\r\n\r\n // step is 4 beacouse our data array is structured like this:\r\n // [r0,g0,b0,a0, r1,g1,b1,a1, r2,g2,b2,a2, ...]\r\n //let step = parseInt((img.width * img.height) / imgData.length, 10);\r\n //let step = 4;\r\n let step = parseInt(imgData.length / (img.width * img.height), 10);\r\n\r\n // create zeros array\r\n let histo = Array.from(Array(256), () => 1);\r\n let histo2 = Array.from(Array(256), () => 1);\r\n\r\n // count occuracys for each brightness value\r\n for (let i = 0, n = imgData.length; i < n - 1; i += step) {\r\n histo[imgData[i + channel]] += 1;\r\n }\r\n\r\n //interpolate histo values\r\n for (let i = 2; i < histo.length - 2; i++) {\r\n let sum = 0;\r\n let count = 0;\r\n for (let j = i - 2; j < i + 3; j++) {\r\n if (histo[j] > 1) {\r\n sum += histo[j];\r\n count += 1;\r\n }\r\n }\r\n if (count > 0) {\r\n histo2[i] = sum / count;\r\n } else {\r\n histo2[i] = histo[i];\r\n }\r\n }\r\n\r\n return histo2;\r\n }\r\n\r\n handleColorPickerClick = (e, index) => {\r\n this.setMountedState({\r\n selectedSingleChannel: index,\r\n displayColorPicker: !this.state.displayColorPicker,\r\n });\r\n let selectedChannels = this.state.selectedChannels;\r\n if (!selectedChannels.includes(index)) {\r\n selectedChannels.push(index);\r\n this.setMountedState({\r\n selectedChannels: selectedChannels,\r\n });\r\n }\r\n };\r\n\r\n handleColorPickerClose = () => {\r\n this.setMountedState({ displayColorPicker: false });\r\n };\r\n\r\n handleColorPickerChange = (color) => {\r\n if (this.state.selectedSingleChannel >= 0) {\r\n let newHistogramConfig = this.props.histogramConfig;\r\n newHistogramConfig.channels[this.state.selectedSingleChannel].color =\r\n color.hex;\r\n this.props.onChange(newHistogramConfig);\r\n this.forceUpdateWithTimeout(10);\r\n }\r\n };\r\n\r\n handleLogLin() {\r\n let newHistogramConfig = this.props.histogramConfig;\r\n // toggle histogram scale\r\n Object.assign(newHistogramConfig, {\r\n scale:\r\n newHistogramConfig.scale === HistogramScale.LINEAR\r\n ? HistogramScale.LOGARITHMIC\r\n : HistogramScale.LINEAR,\r\n });\r\n\r\n this.props.onChange(newHistogramConfig);\r\n this.forceUpdateWithTimeout(10);\r\n }\r\n\r\n gammaFunction(x, gamma) {\r\n gamma = 2 - gamma;\r\n let y = gamma > 1 ? gamma ** 4 : gamma;\r\n return x ** y;\r\n }\r\n\r\n drawHistogramBackground() {\r\n const data = this.data;\r\n if (this.backgroundCanvas) {\r\n const max = 2 ** this.props.bitDepth - 1;\r\n let visibleStep = 50;\r\n switch (this.props.bitDepth) {\r\n case 10:\r\n visibleStep = 250;\r\n break;\r\n case 12:\r\n visibleStep = 1000;\r\n break;\r\n case 14:\r\n visibleStep = 2500;\r\n break;\r\n case 16:\r\n visibleStep = 15000;\r\n break;\r\n default:\r\n }\r\n let ctx = this.backgroundCanvas.getContext(\"2d\");\r\n let w = this.backgroundCanvas.width;\r\n let h = this.backgroundCanvas.height;\r\n ctx.clearRect(0, 0, w, h);\r\n ctx.beginPath();\r\n let step = (visibleStep * w) / max;\r\n ctx.font = \"12px Arial\";\r\n ctx.fillStyle = \"#ddd\";\r\n for (let s = step, i = 1; s < w; s += step, i++) {\r\n ctx.moveTo(s, 0);\r\n ctx.lineTo(s, h);\r\n ctx.fillText(i * visibleStep, s + 2, 12);\r\n }\r\n step = h / 5;\r\n for (let s = step; s < h; s += step) {\r\n ctx.moveTo(0, s);\r\n ctx.lineTo(w, s);\r\n }\r\n ctx.strokeStyle = \"#ddd\";\r\n ctx.closePath();\r\n ctx.stroke();\r\n\r\n let maxValues = 0;\r\n\r\n for (let i = 0; i < data.datasets.length; i++) {\r\n ctx.beginPath();\r\n for (let j = 0; j < data.datasets[i].data.length; j++) {\r\n maxValues = Math.max(maxValues, data.datasets[i].data[j]);\r\n }\r\n }\r\n\r\n for (let i = 0; i < data.datasets.length; i++) {\r\n ctx.beginPath();\r\n ctx.lineWidth = 2;\r\n ctx.strokeStyle = data.datasets[i].borderColor;\r\n ctx.fillStyle = data.datasets[i].backgroundColor;\r\n ctx.moveTo(0, h + 2);\r\n ctx.globalAlpha = 1.0;\r\n for (let j = 0; j < data.datasets[i].data.length; j++) {\r\n let count = data.datasets[i].data[j];\r\n let transformedCount = (h * count) / maxValues;\r\n ctx.lineTo(\r\n (j * w) / data.datasets[i].data.length,\r\n h - transformedCount\r\n );\r\n }\r\n ctx.lineTo(w, h + 2);\r\n ctx.fill(\"nonzero\");\r\n ctx.closePath();\r\n ctx.stroke();\r\n }\r\n }\r\n }\r\n\r\n drawGammaLine() {\r\n if (this.gammaCanvas) {\r\n const width = this.gammaCanvas.width;\r\n const height = this.gammaCanvas.height;\r\n let ctx = this.gammaCanvas.getContext(\"2d\");\r\n ctx.clearRect(0, 0, width, height);\r\n ctx.beginPath();\r\n ctx.moveTo(0, height);\r\n for (let i = 0; i < this.gammaCanvas.width; i++) {\r\n let x = i / this.gammaCanvas.width;\r\n let res = this.gammaFunction(x, this.state.gamma);\r\n ctx.lineTo(i, height - res * height);\r\n ctx.moveTo(i, height - res * height);\r\n }\r\n ctx.lineTo(this.gammaCanvas.width, 0);\r\n ctx.lineWidth = 3;\r\n ctx.strokeStyle = \"#FFFFFF\";\r\n ctx.closePath();\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n // slider callback\r\n handleMinMaxRange(values, gamma) {\r\n let newHistogramConfig = this.props.histogramConfig;\r\n for (let selectedChannel of this.state.selectedChannels) {\r\n if (this.state.channelSelectMode === \"all\") {\r\n // change for all channels\r\n for (let channel of newHistogramConfig.channels) {\r\n channel.min = values[0];\r\n channel.max = values[1];\r\n channel.gamma = gamma;\r\n }\r\n } else {\r\n // change selected channel only\r\n newHistogramConfig.channels[selectedChannel].min = values[0];\r\n newHistogramConfig.channels[selectedChannel].max = values[1];\r\n newHistogramConfig.channels[selectedChannel].gamma = gamma;\r\n }\r\n }\r\n\r\n this.drawGammaLine();\r\n this.props.onChange(newHistogramConfig);\r\n this.forceUpdateWithTimeout(10);\r\n }\r\n\r\n forceUpdateWithTimeout = (delay) => {\r\n setTimeout(() => {\r\n if (this._isMounted) this.forceUpdate();\r\n }, delay);\r\n };\r\n\r\n handleGammaChange() {\r\n let newHistogramConfig = this.props.histogramConfig;\r\n for (let selectedChannel of this.state.selectedChannels) {\r\n // change selected channel only\r\n newHistogramConfig.channels[\r\n selectedChannel < 0 ? 0 : selectedChannel\r\n ].gamma = this.state.gamma;\r\n }\r\n this.props.onChange(newHistogramConfig);\r\n this.forceUpdateWithTimeout(10);\r\n }\r\n\r\n handleReset() {\r\n let isBrightfield = this.state.isBrightfield;\r\n let selectedChannels = this.state.selectedChannels;\r\n if (!isBrightfield) {\r\n let newHistogramConfig = this.props.histogramConfig;\r\n\r\n for (let i = 0; i < newHistogramConfig.channels.length; i++) {\r\n newHistogramConfig.channels[i].color =\r\n this.state.originalHistogramConfig.channels[i].color;\r\n }\r\n Object.assign(newHistogramConfig, {\r\n scale: HistogramScale.LOGARITHMIC,\r\n });\r\n this.scale = HistogramScale.LOGARITHMIC;\r\n selectedChannels = Array.from(\r\n Array(newHistogramConfig.channels.length),\r\n (x, index) => index\r\n );\r\n selectedChannels =\r\n selectedChannels.length > 0 && selectedChannels[0] === 0\r\n ? [-1]\r\n : selectedChannels;\r\n } else {\r\n selectedChannels = [0, 1, 2];\r\n }\r\n\r\n this.setMountedState({\r\n singleChannelMode: false,\r\n channelSelectMode: \"all\",\r\n selectedChannels: selectedChannels,\r\n min: 0,\r\n max: 2 ** this.props.bitDepth - 1,\r\n gamma: 1.0,\r\n leftGammaValue: 0.25,\r\n rightGammaValue: 0.75,\r\n });\r\n //this.props.onChange(newHistogramConfig);\r\n this.handleMinMaxRange([0, 250], 1.0);\r\n if (!isBrightfield) {\r\n this.updateChannels(selectedChannels);\r\n this.activateAllChannels();\r\n }\r\n }\r\n\r\n handleMinMaxFit() {\r\n const { histograms, selectedSingleChannel } = this.state;\r\n let min = 0;\r\n let max = 255;\r\n\r\n let histo = Array.from(Array(256), () => 0); //to do real 16 bit\r\n if (this.state.channelSelectMode === \"all\") {\r\n // merge all channel histograms\r\n for (let c = 0; c < histograms.length; c++) {\r\n for (let i = 0; i < histograms[c].length; i++) {\r\n histo[i] += histograms[c][i];\r\n }\r\n }\r\n } else {\r\n // use histogram of selected channel\r\n histo = histograms[selectedSingleChannel];\r\n }\r\n\r\n if (histo) {\r\n // accumulate all values\r\n let sum = histo.reduce((total, val) => total + val);\r\n\r\n // find left statistical border\r\n let leftSide = 0;\r\n for (min = 0; min < histo.length; min++) {\r\n leftSide += histo[min] / sum;\r\n if (leftSide > 0.0001) {\r\n break;\r\n }\r\n }\r\n\r\n // find right statistical border\r\n let rightSide = 0;\r\n for (max = 255; max >= 0; max--) {\r\n rightSide += histo[max] / sum;\r\n if (rightSide > 0.0001) {\r\n break;\r\n }\r\n }\r\n\r\n // apply calculated range\r\n this.handleMinMaxRange([min, max], this.state.gamma);\r\n this.setMountedState({\r\n min: min,\r\n max: max,\r\n });\r\n }\r\n }\r\n\r\n handleBestFit() {\r\n const { histograms, selectedSingleChannel } = this.state;\r\n let min = 0;\r\n let max = 255;\r\n\r\n let histo = Array.from(Array(256), () => 0);\r\n if (this.state.channelSelectMode === \"all\") {\r\n // merge all channel histograms\r\n for (let c = 0; c < histograms.length; c++) {\r\n for (let i = 0; i < histograms[c].length; i++) {\r\n histo[i] += histograms[c][i];\r\n }\r\n }\r\n } else {\r\n // use histogram of selected channel\r\n histo = histograms[selectedSingleChannel];\r\n }\r\n\r\n // accumulate all values\r\n let sum = histo.reduce((total, val) => total + val);\r\n\r\n // find left statistical border\r\n let leftSide = 0;\r\n for (min = 0; min < histo.length; min++) {\r\n leftSide += histo[min] / sum;\r\n if (leftSide > 0.0005) {\r\n break;\r\n }\r\n }\r\n\r\n // find right statistical border\r\n let rightSide = 0;\r\n for (max = 255; max >= 0; max--) {\r\n rightSide += histo[max] / sum;\r\n if (rightSide > 0.0005) {\r\n break;\r\n }\r\n }\r\n\r\n // apply calculated range\r\n this.handleMinMaxRange([min, max], this.state.gamma);\r\n this.setMountedState({\r\n min: min,\r\n max: max,\r\n });\r\n }\r\n\r\n activateAllChannels = () => {\r\n let selectedChannels = Array.from(\r\n Array(this.props.histogramConfig.nChannels),\r\n (x, index) => index\r\n );\r\n let validGamma = validateGamma(\r\n this.props.histogramConfig.channels[selectedChannels[0]].gamma\r\n );\r\n this.setMountedState({\r\n singleChannelMode: false,\r\n selectedSingleChannel: selectedChannels[0],\r\n selectedChannels: selectedChannels,\r\n channelSelectMode: \"all\",\r\n min:\r\n this.props.histogramConfig.channels[selectedChannels[0]].min > 250\r\n ? 0\r\n : this.props.histogramConfig.channels[selectedChannels[0]].min,\r\n max:\r\n this.props.histogramConfig.channels[selectedChannels[0]].max > 255\r\n ? 250\r\n : this.props.histogramConfig.channels[selectedChannels[0]].max,\r\n gamma: validGamma,\r\n leftGammaValue: this.gammaFunction(0.25, validGamma),\r\n rightGammaValue: this.gammaFunction(0.75, validGamma),\r\n });\r\n this.forceUpdateWithTimeout(10);\r\n this.props.changeChannelSelectMode(\"all\");\r\n this.updateChannels(selectedChannels);\r\n };\r\n\r\n changeChannelSelectMode = (e, value) => {\r\n value = value ? \"single\" : \"all\";\r\n let selectedChannels = this.state.selectedChannels;\r\n if (value !== \"all\") {\r\n selectedChannels = [Math.min.apply(Math, this.state.selectedChannels)];\r\n }\r\n let validGamma = validateGamma(\r\n this.props.histogramConfig.channels[selectedChannels[0]].gamma\r\n );\r\n this.setMountedState({\r\n singleChannelMode: value === \"single\",\r\n selectedSingleChannel: selectedChannels[0],\r\n selectedChannels: selectedChannels,\r\n channelSelectMode: value,\r\n min:\r\n this.props.histogramConfig.channels[selectedChannels[0]].min > 250\r\n ? 0\r\n : this.props.histogramConfig.channels[selectedChannels[0]].min,\r\n max:\r\n this.props.histogramConfig.channels[selectedChannels[0]].max > 255\r\n ? 250\r\n : this.props.histogramConfig.channels[selectedChannels[0]].max,\r\n gamma: validGamma,\r\n leftGammaValue: this.gammaFunction(0.25, validGamma),\r\n rightGammaValue: this.gammaFunction(0.75, validGamma),\r\n });\r\n this.props.changeChannelSelectMode(value);\r\n this.updateChannels(selectedChannels);\r\n };\r\n\r\n changeChannel = (value) => {\r\n //prevent deselecting all\r\n if (value.length === 0) return;\r\n\r\n if (this.state.channelSelectMode === \"single\") {\r\n value = value.filter((v) => v !== this.state.selectedChannels[0]);\r\n }\r\n let validGamma = validateGamma(\r\n this.props.histogramConfig.channels[value[0]].gamma\r\n );\r\n this.setMountedState({\r\n selectedSingleChannel: value[0],\r\n selectedChannels: value,\r\n min:\r\n this.props.histogramConfig.channels[value[0]].min > 250\r\n ? 0\r\n : this.props.histogramConfig.channels[value[0]].min,\r\n max:\r\n this.props.histogramConfig.channels[value[0]].max > 255\r\n ? 250\r\n : this.props.histogramConfig.channels[value[0]].max,\r\n gamma: validGamma,\r\n leftGammaValue: this.gammaFunction(0.25, validGamma),\r\n rightGammaValue: this.gammaFunction(0.75, validGamma),\r\n });\r\n\r\n this.updateChannels(value);\r\n };\r\n\r\n /**\r\n * Updates Channel Comfiguration in histogram like colors, etc.\r\n * @param {Number[]} selectedChannels Selected Channel Indices\r\n */\r\n updateChannels(selectedChannels) {\r\n if (selectedChannels.length > 0 && selectedChannels[0] === -1) {\r\n selectedChannels = [0];\r\n }\r\n // hide or show channel layer\r\n let newHistogramConfig = this.props.histogramConfig;\r\n for (let i = 0; i < newHistogramConfig.channels.length; i++) {\r\n newHistogramConfig.channels[i].enabled = selectedChannels.includes(i)\r\n ? true\r\n : false;\r\n }\r\n this.props.onChange(newHistogramConfig);\r\n this.forceUpdateWithTimeout(10);\r\n }\r\n\r\n getEnabledChannels() {\r\n let selectedChannels = [];\r\n for (let i = 0; i < this.props.histogramConfig.length; i++) {\r\n if (this.props.histogramConfig.channels[i].enabled) {\r\n selectedChannels.push(i);\r\n }\r\n }\r\n return selectedChannels.length > 0 ? selectedChannels : [-1];\r\n }\r\n\r\n updateRange(e) {\r\n if (!this.state.lastX) {\r\n this.setMountedState({ lastX: e.clientX });\r\n return;\r\n }\r\n if (this.state.middleBarActive) {\r\n let deltaX =\r\n (255 * (e.clientX - this.state.lastX)) / this.state.dimensions.width;\r\n let min = this.state.min;\r\n let max = this.state.max;\r\n if (deltaX < 0) {\r\n let new_min = Math.max(0, min + deltaX);\r\n deltaX = min > 0 ? new_min - min : 0;\r\n } else {\r\n let new_max = Math.min(this.state.dimensions.width, max + deltaX);\r\n deltaX = new_max < 255 ? new_max - max : 255 - max;\r\n }\r\n min = Math.max(0, min + deltaX);\r\n max = Math.min(255, max + deltaX);\r\n this.setMountedState({\r\n min: min,\r\n max: max,\r\n lastX: e.clientX,\r\n });\r\n }\r\n }\r\n\r\n renderHistogram() {\r\n const { histogramConfig } = this.props;\r\n const { histograms, dimensions } = this.state;\r\n const data = this.data;\r\n\r\n if (data.datasets.length === 0) {\r\n data.datasets = this.state.datasets;\r\n }\r\n if (data.datasets.length === 0) {\r\n return null;\r\n }\r\n if (histogramConfig.scale === HistogramScale.LOGARITHMIC) {\r\n data.datasets = data.datasets.map((dataset) => {\r\n dataset.data = dataset.data.map((p) => 10 * Math.log(p));\r\n return dataset;\r\n });\r\n }\r\n\r\n if (histograms.length === 0) {\r\n return (\r\n \r\n );\r\n }\r\n return (\r\n {\r\n e.preventDefault();\r\n }}\r\n onMouseMove={(e) => {\r\n if (e.buttons === 1) {\r\n this.updateRange(e);\r\n } else {\r\n if (\r\n this.state.leftBarActive ||\r\n this.state.middleBarActive ||\r\n this.state.rightBarActive\r\n ) {\r\n this.setMountedState({\r\n middleBarActive: false,\r\n });\r\n }\r\n }\r\n }}\r\n onMouseUp={() => {\r\n this.handleMinMaxRange(\r\n [this.state.min, this.state.max],\r\n this.state.gamma\r\n );\r\n }}\r\n >\r\n {dimensions && (\r\n \r\n {\r\n this.backgroundCanvas = c;\r\n this.drawHistogramBackground();\r\n }}\r\n />\r\n {\r\n this.setMountedState({\r\n middleBarActive: true,\r\n lastX: e.clientX,\r\n });\r\n }}\r\n >\r\n {/* Line */}\r\n {\r\n this.gammaCanvas = c;\r\n this.drawGammaLine();\r\n }}\r\n />\r\n
\r\n (this.leftGamma = c)}\r\n value={this.state.leftGammaValue}\r\n onMouseDown={(e) => {\r\n e.stopPropagation();\r\n }}\r\n onChange={() => {\r\n let x = 0.25;\r\n let res = this.leftGamma.value;\r\n let gamma = Math.log(res) / Math.log(x);\r\n if (gamma > 1) {\r\n gamma = gamma ** 0.25;\r\n }\r\n gamma = 2 - gamma;\r\n this.setMountedState({\r\n gamma: gamma,\r\n leftGammaValue: res,\r\n rightGammaValue: this.gammaFunction(0.75, gamma),\r\n });\r\n }}\r\n onMouseUp={() => {\r\n this.handleGammaChange();\r\n this.leftGamma.blur();\r\n }}\r\n type=\"range\"\r\n min=\"0.01\"\r\n max=\"0.99\"\r\n step=\"0.01\"\r\n className=\"slider-vertical\"\r\n />\r\n
\r\n
\r\n (this.rightGamma = c)}\r\n value={this.state.rightGammaValue}\r\n onMouseDown={(e) => {\r\n e.stopPropagation();\r\n }}\r\n onChange={() => {\r\n let x = 0.75;\r\n let res = this.rightGamma.value;\r\n let gamma = Math.log(res) / Math.log(x);\r\n if (gamma > 1) {\r\n gamma = gamma ** 0.25;\r\n }\r\n gamma = 2 - gamma;\r\n if (gamma > 0) {\r\n this.setMountedState({\r\n gamma: gamma,\r\n leftGammaValue: this.gammaFunction(0.25, gamma),\r\n rightGammaValue: res,\r\n });\r\n }\r\n }}\r\n onMouseUp={() => {\r\n this.handleGammaChange();\r\n this.rightGamma.blur();\r\n }}\r\n type=\"range\"\r\n min=\"0.01\"\r\n max=\"0.99\"\r\n step=\"0.01\"\r\n className=\"slider-vertical\"\r\n />\r\n
\r\n\r\n \r\n Min:{\" \"}\r\n {Math.round(\r\n (this.state.min * (2 ** this.props.bitDepth - 1)) / 255\r\n )}\r\n \r\n\r\n \r\n Max:{\" \"}\r\n {Math.round(\r\n (this.state.max * (2 ** this.props.bitDepth - 1)) / 255\r\n )}\r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n Gamma:{\" \"}\r\n {(this.state.gamma < 1\r\n ? (2 - this.state.gamma) ** 4\r\n : 2 - this.state.gamma\r\n ).toFixed(2, 10)}\r\n \r\n
\r\n )}\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Renders Color Picker Popup Button to choose FL channel color\r\n */\r\n renderColorPicker() {\r\n return (\r\n
\r\n {this.state.displayColorPicker ? (\r\n
\r\n
\r\n \r\n
\r\n ) : null}\r\n
\r\n );\r\n }\r\n\r\n onExportHistogramParameters = () => {\r\n const strData = this.props.projectContext.getProjectStringInfos();\r\n const downloadName =\r\n strData.name +\r\n \"_\" +\r\n strData.date +\r\n \"_\" +\r\n this.props.projectContext.user +\r\n \".hishsa\";\r\n\r\n let dataStr =\r\n \"data:text/json;charset=utf-8,\" +\r\n encodeURIComponent(JSON.stringify(this.props.histogramConfig));\r\n let dlAnchorElem = document.createElement(\"a\");\r\n dlAnchorElem.setAttribute(\"href\", dataStr);\r\n dlAnchorElem.setAttribute(\"download\", downloadName);\r\n dlAnchorElem.click();\r\n dlAnchorElem.remove();\r\n };\r\n\r\n onImportHistogramParameters = (e) => {\r\n let files = e.target.files;\r\n if (files.length <= 0) return false;\r\n\r\n let fr = new FileReader();\r\n fr.onload = (e) => {\r\n try {\r\n let selectedCs = [];\r\n let loadedConfig = JSON.parse(e.target.result);\r\n if (\r\n this.props.histogramConfig.channels.length !==\r\n loadedConfig.channels.length\r\n ) {\r\n window.showErrorSnackbar(\"Not compatible with this histogram!\");\r\n return;\r\n }\r\n let newHistogramConfig = this.props.histogramConfig;\r\n let stateToSet = true;\r\n let newStateObject = {};\r\n for (let i = 0; i < loadedConfig.channels.length; i++) {\r\n let c = loadedConfig.channels[i];\r\n if (c.enabled) {\r\n selectedCs.push(i);\r\n if (stateToSet) {\r\n let validGamma = validateGamma(c.gamma);\r\n newStateObject = {\r\n min: c.min,\r\n max: c.max,\r\n gamma: validGamma,\r\n leftGammaValue: this.gammaFunction(0.25, validGamma),\r\n rightGammaValue: this.gammaFunction(0.75, validGamma),\r\n };\r\n stateToSet = false;\r\n }\r\n }\r\n }\r\n if (this.state.isBrightfield) selectedCs = [-1];\r\n\r\n newStateObject.selectedChannels = selectedCs;\r\n Object.assign(newHistogramConfig, {\r\n scale: loadedConfig.scale,\r\n });\r\n\r\n this.setMountedState(newStateObject);\r\n newHistogramConfig.channels = loadedConfig.channels;\r\n\r\n this.props.onChange(newHistogramConfig);\r\n this.forceUpdateWithTimeout(10);\r\n } catch (e) {\r\n console.log(\"import errror:\", e);\r\n window.showErrorSnackbar(\"File not supported!\");\r\n }\r\n };\r\n fr.readAsText(files.item(0));\r\n };\r\n\r\n initData() {\r\n const { histogramConfig } = this.props;\r\n const { histograms, selectedChannels } = this.state;\r\n\r\n let datasets = [];\r\n let channelsArray = histogramConfig.channels;\r\n let isBrightfield =\r\n (histograms.length === 0 || histograms.length === 3) &&\r\n histogramConfig.channels.length === 1;\r\n if (isBrightfield) {\r\n channelsArray = [\r\n {\r\n enabled: true,\r\n name: \"R\",\r\n color: \"#ff0000\",\r\n },\r\n {\r\n enabled: true,\r\n name: \"G\",\r\n color: \"#00ff00\",\r\n },\r\n {\r\n enabled: true,\r\n name: \"B\",\r\n color: \"#0000ff\",\r\n },\r\n ];\r\n }\r\n if (selectedChannels.includes(-1)) {\r\n // display all channels\r\n for (let c = 0; c < channelsArray.length; c++) {\r\n // skip disabled channels\r\n if (!channelsArray[c].enabled || !histograms[c]) continue;\r\n\r\n // push channel to dataset\r\n datasets.push({\r\n label: channelsArray[c].name,\r\n backgroundColor:\r\n channelsArray[c].color !== -1\r\n ? hexToRGB(channelsArray[c].color, 0.2)\r\n : hexToRGB(\"#000000\", 0.2),\r\n borderColor:\r\n channelsArray[c].color !== -1 ? channelsArray[c].color : \"#000000\",\r\n borderWidth: 1,\r\n data: histograms[c],\r\n });\r\n }\r\n } else {\r\n for (let selectedChannel of selectedChannels) {\r\n if (typeof histograms[selectedChannel] === \"undefined\") continue;\r\n // dispaly single selected channel\r\n datasets.push({\r\n label: channelsArray[selectedChannel].name,\r\n backgroundColor:\r\n channelsArray[selectedChannel].color !== -1\r\n ? hexToRGB(channelsArray[selectedChannel].color, 0.2)\r\n : hexToRGB(\"#000000\", 0.2),\r\n borderColor:\r\n channelsArray[selectedChannel].color !== -1\r\n ? channelsArray[selectedChannel].color\r\n : \"#000000\",\r\n borderWidth: 1,\r\n data: histograms[selectedChannel],\r\n });\r\n }\r\n }\r\n this.data = {\r\n labels: Array.from(Array(256), (x, index) => index),\r\n datasets: datasets,\r\n };\r\n }\r\n\r\n render() {\r\n const { histogramConfig, classes, projectType } = this.props;\r\n const { dimensions, isBrightfield } = this.state;\r\n\r\n this.initData();\r\n\r\n return (\r\n
(this.container = el)}>\r\n
\r\n \r\n this.handleReset()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n {!(\r\n projectType.includes(\"HistoPointCounting\") ||\r\n projectType.includes(\"HistoClassification\")\r\n ) && (\r\n
\r\n \r\n this.handleLogLin()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n\r\n {!isBrightfield && (\r\n \r\n \r\n this.handleMinMaxFit()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n this.handleBestFit()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n document.getElementById(\"selectHistogramFile\").click()\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n
\r\n )}\r\n
\r\n
\r\n
\r\n {dimensions && this.renderHistogram()}\r\n
\r\n
\r\n
\r\n (this.slider1 = c)}\r\n onChange={() => {\r\n this.setMountedState({\r\n min: Math.min(\r\n parseFloat(this.slider1.value),\r\n this.state.max - 5\r\n ),\r\n });\r\n }}\r\n onMouseUp={() => {\r\n let min = Math.min(\r\n parseFloat(this.slider1.value),\r\n this.state.max - 5\r\n );\r\n let max = this.state.max;\r\n this.handleMinMaxRange([min, max], this.state.gamma);\r\n this.slider1.blur();\r\n }}\r\n value={this.state.min}\r\n type=\"range\"\r\n min=\"0\"\r\n max=\"255\"\r\n className=\"slider-bar\"\r\n />\r\n {dimensions && (\r\n (this.sliderGamma = c)}\r\n style={{\r\n marginLeft: (dimensions.width / 255) * this.state.min + \"px\",\r\n width:\r\n (dimensions.width * (this.state.max - this.state.min)) /\r\n 255 +\r\n \"px\",\r\n }}\r\n onChange={() => {\r\n let gamma = parseFloat(this.sliderGamma.value);\r\n this.setMountedState({\r\n gamma: gamma,\r\n leftGammaValue: this.gammaFunction(0.25, gamma),\r\n rightGammaValue: this.gammaFunction(0.75, gamma),\r\n });\r\n this.drawGammaLine();\r\n }}\r\n onMouseUp={() => {\r\n this.handleGammaChange();\r\n this.sliderGamma.blur();\r\n }}\r\n value={this.state.gamma}\r\n type=\"range\"\r\n min=\"0.00\"\r\n max=\"1.99\"\r\n step=\"0.01\"\r\n className=\"slider\"\r\n />\r\n )}\r\n\r\n (this.slider2 = c)}\r\n onChange={() => {\r\n this.setMountedState({\r\n max: Math.max(\r\n parseFloat(this.slider2.value),\r\n this.state.min + 5\r\n ),\r\n });\r\n }}\r\n onMouseUp={() => {\r\n let min = this.state.min;\r\n let max = Math.max(this.slider2.value, min + 5);\r\n this.handleMinMaxRange([min, max], this.state.gamma);\r\n this.slider2.blur();\r\n }}\r\n value={this.state.max}\r\n type=\"range\"\r\n min=\"0\"\r\n max=\"255\"\r\n className=\"slider-bar\"\r\n />\r\n
\r\n
\r\n {!isBrightfield &&\r\n !(\r\n projectType.includes(\"HistoPointCounting\") ||\r\n projectType.includes(\"HistoClassification\")\r\n ) && (\r\n \r\n this.activateAllChannels()}\r\n >\r\n ALL\r\n \r\n this.changeChannel(value)}\r\n >\r\n {histogramConfig.channels.map((channel, index) => (\r\n this.handleColorPickerClick(e, index)}\r\n >\r\n \r\n
\r\n {channel.name}{\" \"}\r\n {this.state.selectedChannels.includes(index)}\r\n
\r\n \r\n
\r\n \r\n ))}\r\n \r\n\r\n {dimensions && this.renderColorPicker()}\r\n \r\n this.changeChannelSelectMode(e, value)\r\n }\r\n color=\"primary\"\r\n checked={this.state.channelSelectMode === \"single\"}\r\n value=\"singleChannelMode\"\r\n />\r\n }\r\n label=\"Single Channel\"\r\n />\r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nHistogram.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n histogramConfig: PropTypes.object,\r\n bitDepth: PropTypes.number,\r\n channelSelectMode: PropTypes.string.isRequired,\r\n changeChannelSelectMode: PropTypes.func,\r\n id: PropTypes.string.isRequired,\r\n onChange: PropTypes.func,\r\n projectType: PropTypes.string,\r\n projectContext: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(Histogram);\r\n","import { IconButton, Tooltip } from \"@mui/material\";\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport classNames from \"classnames\";\r\nimport {\r\n faRuler,\r\n faStopwatch,\r\n faLayerGroup,\r\n faInfo,\r\n faTable,\r\n faInfoCircle,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { UnfoldMore, LinearScale, Map } from \"@mui/icons-material\";\r\n\r\nclass ToggleButton extends Component {\r\n static defaultProps = {\r\n disabled: false,\r\n };\r\n\r\n render() {\r\n const { title, name, value, icon, onToggle, classes, disabled } =\r\n this.props;\r\n\r\n return (\r\n \r\n \r\n (disabled ? {} : onToggle(name))}\r\n size=\"small\"\r\n disabled={disabled}\r\n >\r\n {icon === \"MapIcon\" && (\r\n \r\n )}\r\n {icon === \"faInfoCircle\" && }\r\n {icon === \"faRuler\" && }\r\n {icon === \"faStopwatch\" && }\r\n {icon === \"faLayerGroup\" && }\r\n {icon === \"faInfo\" && }\r\n {icon === \"LinearScaleIcon\" && (\r\n \r\n )}\r\n {icon === \"faTable\" && }\r\n {icon === \"UnfoldMore\" && (\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nToggleButton.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n title: PropTypes.string,\r\n key: PropTypes.string,\r\n value: PropTypes.bool,\r\n icon: PropTypes.string,\r\n onToggle: PropTypes.func,\r\n name: PropTypes.string,\r\n disabled: PropTypes.bool,\r\n};\r\n\r\nexport default ToggleButton;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nclass CustomSvgIcon extends React.Component {\r\n render() {\r\n const { name, width, height, stroke, vertAlign } = this.props;\r\n switch (name) {\r\n case \"GrabCutIcon\":\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n case \"ResultsIcon\":\r\n return (\r\n \r\n \r\n \r\n );\r\n case \"HeatmapIcon\":\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n case \"ResetZoomIcon\":\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n}\r\n\r\nCustomSvgIcon.propTypes = {\r\n name: PropTypes.string,\r\n width: PropTypes.string,\r\n height: PropTypes.string,\r\n stroke: PropTypes.string,\r\n vertAlign: PropTypes.string,\r\n};\r\n\r\nexport default CustomSvgIcon;\r\n","//import React from 'react';\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// make a new context\r\nconst TilesContext = React.createContext();\r\n\r\nexport const withTiles = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withTiles(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\n// create provider component\r\nexport class TilesProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {};\r\n\r\n this.visibleImage = [];\r\n this.visibleImageUpdatedAt = [];\r\n this.coloredImages = [];\r\n this.coloredImagesUpdatedAt = [];\r\n this.imgWidth = 0;\r\n this.imgHeight = 0;\r\n this.pageIndex = 0;\r\n this.histogramConfig = null;\r\n this.selectedLayerColor = \"#fff\";\r\n this.selcetedLayerIndex = 0;\r\n this.annotationCount = 0;\r\n this.firstIteration = true;\r\n this.accPoints = [];\r\n this.pointCount = 0;\r\n this.galleryVisible = false;\r\n this.isMousedown = false;\r\n this.isOnImage = false;\r\n this.IsInOtherImage = false;\r\n this.onPageInput = false;\r\n this.strAnnoCount = [];\r\n this.strSubtypesPages = [];\r\n this.structure = null;\r\n this.structureBefore = null;\r\n this.graphAcc = [];\r\n this.roiProps = {\r\n color: \"\",\r\n isSubtype: false,\r\n subtypeName: \"\",\r\n pos: -1,\r\n };\r\n this.hsitoClassificationStarted = false;\r\n this.fileId = null;\r\n this.zLevel = 0;\r\n this.chainLeaderId = null;\r\n this.transformationMatrix = {};\r\n this.transformationFactor = {};\r\n this.transformationOffset = {};\r\n }\r\n\r\n getIndex = (a) => {\r\n if (this.strAnnoCount) {\r\n for (let i = 0; i < this.strAnnoCount.length; i++) {\r\n if (this.strAnnoCount[i][0] === a) {\r\n return i;\r\n }\r\n }\r\n }\r\n return -1;\r\n };\r\n\r\n getIndexObj = (a) => {\r\n if (this.strSubtypesPages) {\r\n for (let i = 0; i < this.strSubtypesPages.length; i++) {\r\n if (this.strSubtypesPages[i].id === a) {\r\n return i;\r\n }\r\n }\r\n }\r\n return -1;\r\n };\r\n\r\n resetStPg = () => {\r\n if (this.strSubtypesPages) {\r\n for (let i = 0; i < this.strSubtypesPages.length; i++) {\r\n this.strSubtypesPages[i].page = 0;\r\n }\r\n }\r\n };\r\n\r\n render() {\r\n return (\r\n {\r\n this.visibleImage = a;\r\n },\r\n clearTiles: () => {\r\n for (let key of Object.keys(this.visibleImage)) {\r\n this.visibleImage[key] = null;\r\n }\r\n for (let key of Object.keys(this.visibleImage)) {\r\n delete this.visibleImage[key];\r\n }\r\n for (let key of Object.keys(this.coloredImages)) {\r\n this.coloredImages[key] = null;\r\n }\r\n for (let key of Object.keys(this.coloredImages)) {\r\n delete this.coloredImages[key];\r\n }\r\n },\r\n pushVisibleImage: (a, tileId) => {\r\n this.visibleImage[tileId] = a;\r\n this.visibleImageUpdatedAt[tileId] = new Date().getTime();\r\n\r\n // 275 imgs ~ 1GB RAM\r\n if (Object.keys(this.visibleImage).length > 150) {\r\n let sorted = [];\r\n for (let tileId in this.visibleImageUpdatedAt) {\r\n sorted.push([tileId, this.visibleImageUpdatedAt[tileId]]);\r\n }\r\n sorted.sort(function (a, b) {\r\n return a[1] - b[1];\r\n });\r\n\r\n let i = 0;\r\n while (\r\n Object.keys(this.visibleImage).length > 125 &&\r\n i < sorted.length\r\n ) {\r\n if (\r\n sorted &&\r\n sorted[i] &&\r\n this.visibleImage[sorted[i][0]] &&\r\n this.visibleImageUpdatedAt[sorted[i][0]] &&\r\n sorted[i][0] !== \"0,0,0,0\"\r\n ) {\r\n this.visibleImage[sorted[i][0]].onload = null;\r\n this.visibleImage[sorted[i][0]].src = null;\r\n this.visibleImage[sorted[i][0]] = null;\r\n delete this.visibleImage[sorted[i][0]];\r\n delete this.visibleImageUpdatedAt[sorted[i][0]];\r\n } else {\r\n if (this.visibleImageUpdatedAt[sorted[i][0]] === undefined) {\r\n delete this.visibleImageUpdatedAt[sorted[i][0]];\r\n }\r\n }\r\n i++;\r\n }\r\n }\r\n },\r\n resetVisibleImages: () => {\r\n for (let f in this.visibleImage) {\r\n if (f !== \"0,0,0,0\") {\r\n this.visibleImage[f].onload = null;\r\n this.visibleImage[f].src = null;\r\n this.visibleImage[f] = null;\r\n delete this.visibleImage[f];\r\n delete this.visibleImageUpdatedAt[f];\r\n }\r\n }\r\n // this.visibleImage = [];\r\n },\r\n getVisibleImages: () => {\r\n return this.visibleImage;\r\n },\r\n getVisibleImage: (tileId) => {\r\n let img = this.visibleImage[tileId];\r\n if (img !== undefined) {\r\n this.visibleImageUpdatedAt[tileId] = new Date().getTime();\r\n }\r\n return img;\r\n },\r\n\r\n // Colored Images\r\n setColoredImages: (a) => {\r\n this.coloredImages = a;\r\n },\r\n pushColoredImages: (a, tileId) => {\r\n this.coloredImages[tileId] = a;\r\n this.coloredImagesUpdatedAt[tileId] = new Date().getTime();\r\n\r\n // 275 imgs ~ 1GB RAM\r\n if (Object.keys(this.coloredImages).length > 150) {\r\n let sorted = [];\r\n for (let tileId in this.coloredImagesUpdatedAt) {\r\n sorted.push([tileId, this.coloredImagesUpdatedAt[tileId]]);\r\n }\r\n\r\n sorted.sort(function (a, b) {\r\n return a[1] - b[1];\r\n });\r\n\r\n let i = 0;\r\n while (\r\n Object.keys(this.coloredImages).length > 125 &&\r\n i < sorted.length\r\n ) {\r\n if (\r\n sorted &&\r\n sorted[i] &&\r\n this.coloredImages[sorted[i][0]] &&\r\n this.coloredImagesUpdatedAt[sorted[i][0]] &&\r\n sorted[i][0] !== \"0,0,0,0\"\r\n ) {\r\n this.coloredImages[sorted[i][0]].onload = null;\r\n this.coloredImages[sorted[i][0]].src = null;\r\n this.coloredImages[sorted[i][0]] = null;\r\n delete this.coloredImages[sorted[i][0]];\r\n delete this.coloredImagesUpdatedAt[sorted[i][0]];\r\n } else {\r\n if (this.coloredImagesUpdatedAt[sorted[i][0]] === undefined) {\r\n delete this.coloredImagesUpdatedAt[sorted[i][0]];\r\n }\r\n }\r\n i++;\r\n }\r\n }\r\n },\r\n resetColoredImages: () => {\r\n for (let f in this.coloredImages) {\r\n if (this.coloredImages[f] && f !== \"0,0,0,0\") {\r\n this.coloredImages[f].onload = null;\r\n this.coloredImages[f].src = null;\r\n this.coloredImages[f] = null;\r\n delete this.coloredImages[f];\r\n delete this.coloredImagesUpdatedAt[f];\r\n }\r\n }\r\n },\r\n getColoredImages: () => {\r\n return this.coloredImages;\r\n },\r\n getColoredImage: (tileId) => {\r\n let img = this.coloredImages[tileId];\r\n if (img !== undefined) {\r\n this.coloredImagesUpdatedAt[tileId] = new Date().getTime();\r\n }\r\n return img;\r\n },\r\n\r\n setImgWidth: (a) => {\r\n this.imgWidth = a;\r\n },\r\n getImgWidth: () => {\r\n return this.imgWidth;\r\n },\r\n\r\n setImgHeight: (a) => {\r\n this.imgHeight = a;\r\n },\r\n getImgHeight: () => {\r\n return this.imgHeight;\r\n },\r\n\r\n setPageIndex: (a) => {\r\n this.pageIndex = a;\r\n },\r\n getPageIndex: () => {\r\n return this.pageIndex;\r\n },\r\n\r\n setHistogramConfig: (a) => {\r\n this.histogramConfig = a;\r\n },\r\n getHistogramConfig: () => {\r\n return this.histogramConfig;\r\n },\r\n\r\n setSelectedLayerColor: (a) => {\r\n this.selectedLayerColor = a;\r\n },\r\n getSelectedLayerColor: () => {\r\n return this.selectedLayerColor;\r\n },\r\n\r\n setSelectedLayerIndex: (a) => {\r\n this.selectedLayerIndex = a;\r\n },\r\n getSelectedLayerIndex: () => {\r\n return this.selectedLayerIndex;\r\n },\r\n\r\n addAnnotationCount: (x) => {\r\n this.annotationCount = this.annotationCount + x;\r\n },\r\n setAnnotationCount: (x) => {\r\n return (this.annotationCount = x);\r\n },\r\n getAnnotationCount: () => {\r\n return this.annotationCount;\r\n },\r\n\r\n setFirstIteration: (x) => {\r\n this.firstIteration = x;\r\n },\r\n getFirstIteration: () => {\r\n return this.firstIteration;\r\n },\r\n\r\n pushAccPoint: (x) => {\r\n let point = {\r\n x: 30 * this.pointCount,\r\n y: x,\r\n };\r\n this.accPoints.push(point);\r\n this.pointCount = this.pointCount + 1;\r\n },\r\n getAccPoints: () => {\r\n return this.accPoints;\r\n },\r\n\r\n setGalleryVisible: (a) => {\r\n this.galleryVisible = a;\r\n },\r\n getGalleryVisible: () => {\r\n return this.galleryVisible;\r\n },\r\n\r\n setIsMousedown: (a) => {\r\n this.isMousedown = a;\r\n },\r\n getIsMousedown: () => {\r\n return this.isMousedown;\r\n },\r\n\r\n setIsOnImage: (a) => {\r\n this.isOnImage = a;\r\n },\r\n getIsOnImage: () => {\r\n return this.isOnImage;\r\n },\r\n\r\n setIsInOtherImage: (a) => {\r\n this.isInOtherImage = a;\r\n },\r\n getIsInOtherImage: () => {\r\n return this.isInOtherImage;\r\n },\r\n\r\n setRoiProps: (a) => {\r\n this.roiProps.color = a.color;\r\n this.roiProps.isSubtype = a.isSubtype;\r\n this.roiProps.subtypeName = a.subtypeName;\r\n },\r\n getRoiProps: () => {\r\n return this.roiProps;\r\n },\r\n\r\n setPositionRoi: (a) => {\r\n this.roiProps.pos = a;\r\n },\r\n\r\n setOnPageInput: (a) => {\r\n this.onPageInput = a;\r\n },\r\n getOnPageInput: () => {\r\n return this.onPageInput;\r\n },\r\n\r\n pushStrAnnoCount: (a) => {\r\n this.strAnnoCount.push([a, 0]);\r\n },\r\n pushDynamicStructureAC: (a, b) => {\r\n this.strAnnoCount.splice(b, 0, [a, 0]);\r\n },\r\n setStrAnnoCount: (a, b) => {\r\n let idx = this.getIndex(a);\r\n if (this.strAnnoCount[idx]) {\r\n this.strAnnoCount[idx][1] = this.strAnnoCount[idx][1] + b;\r\n }\r\n },\r\n setParentAnnoCount: (a, b) => {\r\n let idx = this.getIndex(a);\r\n if (this.strAnnoCount[idx]) {\r\n this.strAnnoCount[idx][1] = this.strAnnoCount[idx][1] + b;\r\n }\r\n },\r\n getStrAnnoCountElement: (a) => {\r\n let idx = this.getIndex(a);\r\n return this.strAnnoCount[idx][1];\r\n },\r\n getStrAnnoCount: () => {\r\n return this.strAnnoCount;\r\n },\r\n setAnnoCount: (a) => {\r\n this.strAnnoCount = a;\r\n },\r\n changeAnnoCount: (a, b) => {\r\n let idx_a = this.getIndex(a);\r\n let idx_b = this.getIndex(b);\r\n if (this.strAnnoCount[idx_a] && this.strAnnoCount[idx_b]) {\r\n this.strAnnoCount[idx_a][1] = this.strAnnoCount[idx_a][1] + 1;\r\n this.strAnnoCount[idx_b][1] = this.strAnnoCount[idx_b][1] - 1;\r\n }\r\n },\r\n\r\n pushSubtypesPages: (a, b) => {\r\n let obj = {\r\n name: a,\r\n page: 0,\r\n tilePage: 0,\r\n subtypes: [],\r\n id: b,\r\n };\r\n this.strSubtypesPages.push(obj);\r\n },\r\n pushDynamicStructureSP: (a, b) => {\r\n let obj = {\r\n name: a.label,\r\n page: 0,\r\n tilePage: 0,\r\n subtypes: [],\r\n id: a.id,\r\n };\r\n this.strSubtypesPages.splice(b, 0, obj);\r\n },\r\n getSubtypesPages: () => {\r\n return this.strSubtypesPages;\r\n },\r\n setSubtypesPages: (a) => {\r\n this.strSubtypesPages = a;\r\n },\r\n setPage: (a, b) => {\r\n let idx = this.getIndexObj(a);\r\n this.strSubtypesPages[idx].page = b;\r\n },\r\n getPage: (a) => {\r\n let idx = this.getIndexObj(a);\r\n if (this.strSubtypesPages[idx]) {\r\n return this.strSubtypesPages[idx].page;\r\n } else {\r\n return 0;\r\n }\r\n },\r\n setTilePage: (a, b) => {\r\n let idx = this.getIndexObj(a);\r\n this.strSubtypesPages[idx].tilePage = b;\r\n },\r\n getTilePage: (a) => {\r\n let idx = this.getIndexObj(a);\r\n return this.strSubtypesPages[idx].tilePage;\r\n },\r\n setSubtypes: (a, b) => {\r\n let idx = this.getIndexObj(a);\r\n this.strSubtypesPages[idx].subtypes = b;\r\n },\r\n setSingleSubtype: (a, b, c) => {\r\n let idx = this.getIndexObj(a);\r\n this.strSubtypesPages[idx].subtypes[c] = b;\r\n },\r\n getSubtypes: (a) => {\r\n let idx = this.getIndexObj(a);\r\n return this.strSubtypesPages[idx].subtypes;\r\n },\r\n resetSubtypesPages: () => {\r\n this.resetStPg();\r\n //this.strSubtypesPages = [];\r\n },\r\n\r\n setStructure: (a) => {\r\n this.structureBefore = this.structure;\r\n this.structure = a;\r\n },\r\n getStructure: () => {\r\n return this.structure;\r\n },\r\n getStructureBefore: () => {\r\n return this.structureBefore;\r\n },\r\n\r\n setGraphAcc: (a) => {\r\n this.graphAcc = a;\r\n },\r\n pushGraphAcc: (a) => {\r\n this.graphAcc.push(a);\r\n },\r\n getGraphAcc: () => {\r\n return this.graphAcc;\r\n },\r\n\r\n setHsitoClassificationStarted: (a) => {\r\n this.hsitoClassificationStarted = a;\r\n },\r\n getHsitoClassificationStarted: () => {\r\n return this.hsitoClassificationStarted;\r\n },\r\n\r\n setFileId: (a) => {\r\n this.fileId = a;\r\n },\r\n getFileId: () => {\r\n return this.fileId;\r\n },\r\n\r\n setZLevel: (a) => {\r\n this.zLevel = a;\r\n },\r\n getZLevel: () => {\r\n return this.zLevel;\r\n },\r\n setTransformationMatnFactnOff: (a, fileId, fact, Off) => {\r\n this.transformationMatrix[fileId] = a;\r\n this.transformationFactor[fileId] = fact;\r\n this.transformationOffset[fileId] = Off;\r\n },\r\n getTransformationMatrix: (fileId) => {\r\n return this.transformationMatrix[fileId];\r\n },\r\n getTransformationFactor: (fileId) => {\r\n return this.transformationFactor[fileId];\r\n },\r\n getTransformationOffset: (fileId) => {\r\n return this.transformationOffset[fileId];\r\n },\r\n removeTransformationMatrix: (fileId) => {\r\n delete this.transformationMatrix[fileId];\r\n delete this.transformationFactor[fileId];\r\n delete this.transformationOffset[fileId];\r\n },\r\n resetAllTransformationMatnFact: () => {\r\n this.transformationMatrix = {};\r\n this.transformationFactor = {};\r\n this.transformationOffset = {};\r\n },\r\n getAllTransformationMatrices: () => {\r\n return this.transformationMatrix;\r\n },\r\n getAllTransformationFactors: () => {\r\n return this.transformationFactor;\r\n },\r\n getAllTransformationOffsets: () => {\r\n return this.transformationOffset;\r\n },\r\n }}\r\n >\r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nTilesProvider.propTypes = {\r\n children: PropTypes.element.isRequired,\r\n};\r\n\r\nexport default TilesContext;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n// define the component's styling\r\nconst styles = () => ({\r\n resizesBorder: {\r\n position: \"absolute\",\r\n zIndex: 9999999,\r\n height: \"100%\",\r\n right: -8,\r\n width: 12,\r\n top: 0,\r\n cursor: \"col-resize\",\r\n },\r\n overlayBorder: {\r\n position: \"fixed\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n zIndex: 9999999,\r\n cursor: \"col-resize\",\r\n },\r\n});\r\n\r\nclass VerticalResizeBorder extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n resizeMode: false,\r\n borderWidth: 8,\r\n };\r\n }\r\n\r\n handleMouseDown = (e) => {\r\n this.setState({ resizeMode: true, lastPageX: e.pageX });\r\n };\r\n handleMouseMove = (e) => {\r\n e.preventDefault();\r\n if (this.state.resizeMode) {\r\n let deltaX = this.state.lastPageX - e.pageX;\r\n this.props.resizeSideBar(deltaX, false);\r\n this.setState({ lastPageX: e.pageX });\r\n }\r\n };\r\n handleMouseEnd = () => {\r\n if (this.state.resizeMode) {\r\n this.setState({ resizeMode: false });\r\n this.props.resizeSideBar(0, true);\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n //const { borderWidth } = this.state;\r\n return (\r\n this.handleMouseDown(e)}\r\n onMouseMove={(e) => this.handleMouseMove(e)}\r\n onMouseLeave={(e) => this.handleMouseEnd(e)}\r\n onMouseUp={(e) => this.handleMouseEnd(e)}\r\n >
\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nVerticalResizeBorder.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n resizeSideBar: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(VerticalResizeBorder);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst PersistentStorageContext = React.createContext();\r\n\r\nexport const withPersistentStorage = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withPersistentStorage(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\n// this is the main component, it has to be added at the root of the app.\r\n// all components that use withPersistentStorage(...) will have access to it via this.props.persistentStorage...\r\nclass PersistentStorageProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n this._isMounted = false;\r\n const loadedState = JSON.parse(localStorage.getItem(this.props.projectId));\r\n this.state = loadedState ? loadedState : {};\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n }\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n save(key, value) {\r\n // let stateObject = JSON.parse(localStorage.getItem(this.props.projectId));\r\n let v = JSON.stringify(value);\r\n let stateObject = { ...this.state }; //copy whole state for saving\r\n stateObject[key] = v;\r\n localStorage.setItem(this.props.projectId, JSON.stringify(stateObject));\r\n this.setMountedState({ [key]: v }); //only update key value in state\r\n }\r\n\r\n load(key) {\r\n if (typeof this.state[key] === \"string\") {\r\n try {\r\n return JSON.parse(this.state[key]);\r\n } catch (e) {\r\n return this.state[key];\r\n }\r\n } else {\r\n return this.state[key];\r\n }\r\n }\r\n\r\n loadAll() {\r\n let stateObject = {};\r\n for (const [key, value] of Object.entries(this.state)) {\r\n try {\r\n stateObject[key] = JSON.parse(value);\r\n } catch (e) {\r\n stateObject[key] = value;\r\n }\r\n }\r\n return stateObject;\r\n }\r\n\r\n render() {\r\n return (\r\n this.save(key, value),\r\n load: (key) => this.load(key),\r\n loadAll: () => this.loadAll(),\r\n }}\r\n >\r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nPersistentStorageProvider.propTypes = {\r\n projectId: PropTypes.string,\r\n children: PropTypes.element.isRequired,\r\n};\r\n\r\nexport default PersistentStorageProvider;\r\n","const colors = [\r\n \"#e6194b\",\r\n \"#3cb44b\",\r\n \"#ffe119\",\r\n \"#4363d8\",\r\n \"#f58231\",\r\n \"#911eb4\",\r\n \"#46f0f0\",\r\n \"#f032e6\",\r\n \"#bcf60c\",\r\n \"#fabebe\",\r\n \"#008080\",\r\n \"#e6beff\",\r\n \"#9a6324\",\r\n \"#fffac8\",\r\n \"#800000\",\r\n \"#aaffc3\",\r\n \"#808000\",\r\n \"#ffd8b1\",\r\n \"#000075\",\r\n \"#808080\",\r\n];\r\n\r\nlet colorIdx = 0;\r\nexport function getRandomColor() {\r\n var letters = \"0123456789ABCDEF\";\r\n var color = \"#\";\r\n if (colorIdx < colors.length) {\r\n color = colors[colorIdx];\r\n colorIdx++;\r\n } else {\r\n for (var i = 0; i < 6; i++) {\r\n color += letters[Math.floor(Math.random() * 16)];\r\n }\r\n }\r\n return color;\r\n}\r\n","/**\r\n * Generates an array which references all contained structures to their parent structure.\r\n * Each row of the array starts with the child and ends with the topmost parent.\r\n * The function stops at structures or substructures.\r\n * Overlying structures will not see the subtypes contained inside the structure.\r\n * @param {Array} structures All structures, substructures, and subtypes seen in sidebar.\r\n * @returns {Array} Array of parents, child is the first entry of each row, respectively.\r\n */\r\n\r\n/*eslint no-constant-condition: [\"error\", { \"checkLoops\": false }]*/\r\nexport function generateParentList(structures) {\r\n let parentList = [];\r\n // First, each structure contains itself sa a minimum.\r\n for (let structure of structures) {\r\n parentList.push([structure]);\r\n }\r\n\r\n // Find all parents of a structure, bottom up.\r\n for (let idx = 0; idx < parentList.length; idx++) {\r\n while (true) {\r\n let currentStruct = parentList[idx];\r\n // We're done when we reach the topmost layer\r\n // or if the next level would be a (sub-) structure\r\n if (\r\n !currentStruct[currentStruct.length - 1].classificationSubtype ||\r\n currentStruct[currentStruct.length - 1].parentId === 0\r\n ) {\r\n break;\r\n }\r\n\r\n // Add the parent structure to the row.\r\n parentList[idx].push(\r\n structures[\r\n getParentIndex(currentStruct[currentStruct.length - 1], structures)\r\n ]\r\n );\r\n }\r\n }\r\n\r\n return parentList;\r\n}\r\n\r\n/**\r\n * Generates an array which references all contained structures to their child structures.\r\n * Each row of the array starts with the parent and ends with the bottom-most child.\r\n * The function stops at structures or substructures.\r\n * Underlying structures will not see the subtypes contained inside the structure.\r\n * @param {Array} structures All structures, substructures, and subtypes seen in sidebar.\r\n * @returns {Array} Array of children, parent is the first entry of each row, respectively.\r\n */\r\nexport function generateChildrenList(structures) {\r\n let childrenList = [];\r\n for (let structure of structures) {\r\n childrenList.push(\r\n generateAListOfAllChildrenRecursively(structure, structures)\r\n );\r\n }\r\n return childrenList;\r\n}\r\n\r\n/**\r\n * Recursively goes down the structure tree, beginning from the given parent.\r\n * Adds all structures along the way until it reaches a structure without children.\r\n * @param {Object} structure The selected structure/substructure/subtype for this iteration.\r\n * @param {Array} structures All structures, substructures, and subtypes seen in sidebar.\r\n * @returns {Array} Array of Children when done.\r\n * @returns {Array} Object of a child in an array when child does not have a child of its own.\r\n */\r\nfunction generateAListOfAllChildrenRecursively(structure, structures) {\r\n // Continue until we reach the bottom-most layer\r\n // or if the current structure would be a (sub-) structure\r\n if (structure.hasChild) {\r\n // Add the structure itself to the tree\r\n let allChildren = [];\r\n allChildren.push(structure);\r\n\r\n // Find all children of the structure, that are subtypes, not substructures\r\n let children = structures.filter(\r\n (struct) =>\r\n struct.classificationSubtype && struct.parentId === structure.id\r\n );\r\n\r\n // Recursively add all children and children of children\r\n for (let child of children) {\r\n allChildren.push(\r\n ...generateAListOfAllChildrenRecursively(child, structures)\r\n );\r\n }\r\n return allChildren;\r\n } else {\r\n // No children, bottom-level child returns itself\r\n return [structure];\r\n }\r\n}\r\n\r\n/**\r\n * Returns index of the topmost parent structure\r\n * @param {Object} structure The selected structure/substructure/subtype from the sidebar.\r\n * @param {Array} structures All structures, substructures, and subtypes seen in sidebar.\r\n * @returns {Int} the index of the topmost parent structure.\r\n */\r\nexport function getParentIndexLayer(structure, structures) {\r\n let index = structures.findIndex((element) => element === structure);\r\n while (\r\n structures[index].subtypeLevel !== 0 &&\r\n structures[index].classificationSubtype\r\n ) {\r\n index = getParentIndex(structures[index], structures);\r\n }\r\n return structures.findIndex((element) => element === structures[index]);\r\n}\r\n\r\n/**\r\n * Returns index of the direct parent structure\r\n * @param {Object} structure The selected structure/substructure/subtype from the sidebar.\r\n * @param {Array} structures All structures, substructures, and subtypes seen in sidebar.\r\n * @returns {Int} the index of the parent structure.\r\n */\r\nexport function getParentIndex(structure, structures) {\r\n // return index of parent structure\r\n return structures.findIndex((element) => element.id === structure.parentId);\r\n}\r\n\r\n/**\r\n * Returns objects for this structure, including its subtypes.\r\n * @param {Object} structure The selected structure/substructure/subtype from the sidebar.\r\n * @param {Array} structures All structures, substructures, and subtypes seen in sidebar.\r\n * @param {List} roiLayers Annotations of the structures ordered by structure.\r\n * @returns {List} All ROIs for a certain structure, including its subtypes.\r\n */\r\nexport function getContainedRegionRois(structure, structures, roiLayers) {\r\n let resultRois = [];\r\n let idx = structures.indexOf(structure);\r\n let parentList = generateParentList(structures);\r\n let decendentList = generateChildrenList(structures);\r\n\r\n // The parent contains all annotation objects,\r\n // their subtype is assigend in the annotations object.\r\n let parent = parentList[idx][parentList[idx].length - 1];\r\n let parent_idx = structures.findIndex((struct) => struct.id === parent.id);\r\n\r\n // Consider all decendents\r\n decendentList[idx].forEach((decendent) => {\r\n resultRois.push(\r\n // Find all annotations that belong to the structure\r\n ...roiLayers[parent_idx].layer.regionRois.filter(\r\n (roi) => roi.structureId === decendent.id\r\n )\r\n );\r\n });\r\n\r\n return resultRois;\r\n}\r\n\r\n/**\r\n * Updates the full structure tree of a structure, ensuring correctly displayed icons.\r\n * @param {Object} structure The full tree of this structure will be updated.\r\n * @param {Array} structures All structures. Contains the structure given.\r\n * @returns {Array} Updated structures.\r\n */\r\nexport function updateStructures(structure, structures) {\r\n // Check for missing strucutre import\r\n if (!structure) {\r\n console.debug(\"Error: No structure given, canceling strucutre update\");\r\n return structures;\r\n }\r\n\r\n // Get toplevel parent\r\n let toplevelParentIndex = getParentIndexLayer(structure, structures);\r\n\r\n // Not found, therefore return unedited structures\r\n if (toplevelParentIndex === -1) {\r\n console.debug(\r\n \"Error: Could not find top level parent when updating structures.\"\r\n );\r\n return structures;\r\n }\r\n\r\n // Get all children of toplevel parent\r\n let fullChildrenList = generateChildrenList(structures);\r\n let children = fullChildrenList[toplevelParentIndex];\r\n\r\n // Update their status\r\n for (let structure of children) {\r\n // Find children of currently viewed child\r\n let currentChildren = fullChildrenList.find(\r\n (children) => children[0].id === structure.id\r\n );\r\n\r\n // Update properties\r\n structure.hasChild = currentChildren.length > 0;\r\n\r\n // Find location of current structure in structures\r\n let structureIndex = structures.findIndex(\r\n (struct) => struct.id === structure.id\r\n );\r\n\r\n // Overwrite with updated properties\r\n structures[structureIndex] = structure;\r\n }\r\n\r\n return structures;\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport RBush from \"rbush\";\r\nimport { getRandomColor } from \"../utils/RandomColorGenerator\";\r\nimport {\r\n getParentIndexLayer,\r\n updateStructures,\r\n} from \"../utils/StructuresUtils\";\r\n\r\nconst ProjectContext = React.createContext();\r\n\r\nexport const withProject = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withProject(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\n// this is the main component, it has to be added at the root of the app.\r\n// all components that use withProject(...) will have access to it via this.props.Project...\r\nclass ProjectProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this._isMounted = false;\r\n this.state = {\r\n structures: [],\r\n roiLayers: {},\r\n commentLayers: {},\r\n selectedLayer: 0,\r\n ome: null,\r\n activeTab: 0,\r\n changingFile: false,\r\n user: \"\",\r\n galleryImageSize: 300,\r\n };\r\n this.aiModelRepository = [];\r\n this.aiStateObject = {};\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n /**\r\n * Initializes the Project provider and passes a viewer component\r\n *\r\n * @param {object} viewer - Viewer Component\r\n */\r\n init = (viewer) => {\r\n this.viewer = viewer;\r\n };\r\n\r\n setChangingFile = (a) => {\r\n this.setMountedState({ changingFile: a });\r\n };\r\n\r\n setActiveTab = (tab) => {\r\n this.setMountedState({ activeTab: tab });\r\n this.activeTab = tab;\r\n this.forceUpdate();\r\n };\r\n\r\n getActiveTab = () => {\r\n return this.state.activeTab;\r\n };\r\n\r\n colorInUse = (color) => {\r\n for (let structure of this.state.structures) {\r\n if (color === structure.color) return true;\r\n }\r\n return false;\r\n };\r\n\r\n getUnusedColor = () => {\r\n let color = getRandomColor();\r\n while (this.colorInUse(color)) {\r\n color = getRandomColor();\r\n }\r\n return color;\r\n };\r\n\r\n /**\r\n * Returns Roi Region Object\r\n *\r\n * @param {int} structureId - id of the structure\r\n * @param {int} fileId - id of the file, if undefined the currently opened file will be used\r\n */\r\n getRegionById = (structureId, fileId) => {\r\n if (!fileId) fileId = this.state.fileId;\r\n return this.state.roiLayers[fileId].find((c) => c.id === structureId);\r\n };\r\n\r\n getNumberOfChilds = (parentStructure) => {\r\n const { structures } = this.state;\r\n\r\n return structures.filter(\r\n (element) => element.parentId === parentStructure.id\r\n ).length;\r\n };\r\n\r\n importStructures = (structures) => {\r\n const { roiLayers, fileId } = this.state;\r\n\r\n for (let structure of structures) {\r\n if (structure.tools.length === 0) {\r\n if (structure.parentId > 0) {\r\n let parentStructure = structures.find(\r\n (item) => item.id === structure.parentId\r\n );\r\n if (parentStructure) {\r\n structure.tools = parentStructure.tools;\r\n }\r\n }\r\n }\r\n const roiLayer = roiLayers[fileId].find((c) => c.id === structure.id);\r\n if (!roiLayer) {\r\n roiLayers[fileId].push({\r\n id: structure.id,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n });\r\n }\r\n }\r\n\r\n this.setMountedState({ structures: structures, roiLayers });\r\n };\r\n\r\n /**\r\n * Adds a new Dynamic Structure to the Project Model\r\n *\r\n * @param {string} name - Display name of the new structure\r\n */\r\n addStructure = (name, grid = false) => {\r\n const { structures, roiLayers, viewerConfig, fileId } = this.state;\r\n\r\n // findHighest id number\r\n const newLayerId = structures.reduce((a, c) => Math.max(a, c.id), 0) + 1;\r\n\r\n let newStructure = {\r\n id: newLayerId,\r\n dynamic: true,\r\n //name: name,\r\n label: name,\r\n color: grid ? \"#00000000\" : this.getUnusedColor(),\r\n visible: true,\r\n allToolNames: structures[0].allToolNames,\r\n tools: viewerConfig.project.dynamicStructure.tools,\r\n classFrequencies: {\r\n class_0: 0,\r\n class_1: 0,\r\n class_2: 0,\r\n class_3: 0,\r\n class_4: 0,\r\n class_5: 0,\r\n class_6: 0,\r\n },\r\n avgClassFrequnecy: 0,\r\n isSubtype: false,\r\n isUnfolded: true,\r\n classificationSubtype: false,\r\n parentId: 0,\r\n showSubtypes: false,\r\n subtypeLevel: 0,\r\n defaultSelected: false,\r\n };\r\n newStructure = this.viewer.alterStructure(newStructure);\r\n\r\n let newRoilayer = {\r\n id: newLayerId,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n\r\n structures.push(newStructure);\r\n\r\n roiLayers[fileId].push(newRoilayer);\r\n\r\n this.setMountedState({ structures, roiLayers });\r\n };\r\n\r\n addSubStructure = (parent, name, fromHistoModule) => {\r\n const { structures, roiLayers, selectedLayer, fileId } = this.state;\r\n\r\n // findHighest id number\r\n const newLayerId = structures.reduce((a, c) => Math.max(a, c.id), 0) + 1;\r\n\r\n let subStructure = {\r\n id: newLayerId,\r\n dynamic: true,\r\n parentId: parent.id,\r\n label: name ? name : parent.label,\r\n color: this.getUnusedColor(),\r\n visible: true,\r\n allToolNames: parent.allToolNames,\r\n tools: parent.tools, // what tools should be used?\r\n classFrequencies: {\r\n class_0: 0,\r\n class_1: 0,\r\n class_2: 0,\r\n class_3: 0,\r\n class_4: 0,\r\n class_5: 0,\r\n class_6: 0,\r\n },\r\n avgClassFrequnecy: 0,\r\n showSubtypes: false,\r\n isSubtype: true,\r\n parentColor: parent.color,\r\n subtypeColor: this.getUnusedColor(),\r\n isUnfolded: true,\r\n subtypeLevel: parent.subtypeLevel + 1,\r\n hasChild: false,\r\n classificationSubtype: false,\r\n defaultSelected: false,\r\n };\r\n // add substructure as last child (for now just in histo modules / for other modules check if this works too)\r\n let numberChilds = 0;\r\n if (fromHistoModule) {\r\n numberChilds = this.getNumberOfChilds(structures[selectedLayer]);\r\n }\r\n\r\n structures.splice(selectedLayer + 1 + numberChilds, 0, subStructure);\r\n const roiIndex = roiLayers[fileId].findIndex(\r\n (c) => c.id === structures[selectedLayer].id\r\n );\r\n\r\n roiLayers[fileId].splice(roiIndex + 1, 0, {\r\n id: newLayerId,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n });\r\n parent.addSubtypeText = \"\";\r\n parent.hasChild = true;\r\n\r\n this.setMountedState({ structures, roiLayers });\r\n };\r\n\r\n addSubType = (parent, name, fromHistoModule) => {\r\n const { structures, roiLayers, selectedLayer, fileId } = this.state;\r\n\r\n // findHighest id number\r\n const newLayerId = structures.reduce((a, c) => Math.max(a, c.id), 0) + 1;\r\n\r\n let subStructure = {\r\n id: newLayerId,\r\n dynamic: true,\r\n parentId: parent.id,\r\n label: name ? name : parent.label,\r\n color: this.getUnusedColor(),\r\n visible: true,\r\n allToolNames: parent.allToolNames,\r\n tools: parent.tools, // what tools should be used?\r\n classFrequencies: {\r\n class_0: 0,\r\n class_1: 0,\r\n class_2: 0,\r\n class_3: 0,\r\n class_4: 0,\r\n class_5: 0,\r\n class_6: 0,\r\n },\r\n avgClassFrequnecy: 0,\r\n showSubtypes: false,\r\n isSubtype: true,\r\n isUnfolded: fromHistoModule ? false : true,\r\n subtypeLevel: parent.subtypeLevel + 1,\r\n hasChild: false,\r\n classificationSubtype: true,\r\n defaultSelected: false,\r\n };\r\n // add substructure as last child (for now just in histo modules / for other modules check if this works too)\r\n let numberChilds = 0;\r\n if (fromHistoModule) {\r\n numberChilds = this.getNumberOfChilds(structures[selectedLayer]);\r\n // for point counting module only 11 subtypes are possible because of template\r\n if (numberChilds >= 10) {\r\n window.showWarningSnackbar(\"Reached maximum amount of subtypes.\");\r\n return;\r\n }\r\n }\r\n\r\n structures.splice(selectedLayer + 1 + numberChilds, 0, subStructure);\r\n const roiIndex = roiLayers[fileId].findIndex(\r\n (c) => c.id === structures[selectedLayer].id\r\n );\r\n\r\n roiLayers[fileId].splice(roiIndex + 1 + numberChilds, 0, {\r\n id: newLayerId,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n });\r\n parent.addSubtypeText = \"\";\r\n parent.hasChild = true;\r\n\r\n this.setMountedState({ structures, roiLayers });\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.state;\r\n\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n /**\r\n * Removes a structure and corresponding regions from project model.\r\n *\r\n * @param {object} structure - Structure to remove.\r\n * @returns {Int} The id of the next layer to be selected.\r\n */\r\n deleteStructure = (structure) => {\r\n const { selectedLayer, fileId } = this.state;\r\n let { structures, roiLayers } = this.state;\r\n\r\n // Recursively delete all children.\r\n if (structure.hasChild) {\r\n let childs = this.findChilds(structure);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.deleteStructure(childs[i]);\r\n }\r\n }\r\n\r\n let toplevelParentId = null;\r\n // In case of subtypes, find the next (sub-)structure\r\n if (structure.classificationSubtype) {\r\n toplevelParentId =\r\n structures[getParentIndexLayer(structure, structures)].id;\r\n }\r\n // Otherwise, get the direct parent\r\n else {\r\n toplevelParentId = structure.parentId;\r\n }\r\n\r\n // Delete from structure\r\n const structureIndex = structures.findIndex((c) => c.id === structure.id);\r\n structures.splice(structureIndex, 1);\r\n\r\n // Delete from ROIs.\r\n const roiIndex = roiLayers[fileId].findIndex((c) => c.id === structure.id);\r\n roiLayers[fileId].splice(roiIndex, 1);\r\n\r\n // In case of subtype, delete ROIs from containing layer.\r\n if (structure.isSubtype) {\r\n // Get structure where ROIs are stored\r\n let roiIdx = roiLayers[fileId].findIndex(\r\n (struct) => struct.id === toplevelParentId\r\n );\r\n\r\n // Only keep ROIs not from the deleted subtype\r\n let subtypesRemoved = roiLayers[fileId][roiIdx].tree.data.children.filter(\r\n (RegionRoi) =>\r\n !RegionRoi.roi.isSubtype &&\r\n RegionRoi.roi.subtypeName !== structure.label\r\n );\r\n\r\n // Overwrite previous ROIs\r\n roiLayers[fileId][roiIdx].tree.data.children = subtypesRemoved;\r\n }\r\n\r\n // Update children status of parent.\r\n let parentStruct = structures.find(\r\n (struct) => struct.id === structure.parentId\r\n );\r\n // Only update if there is something to update\r\n if (parentStruct) {\r\n structures = updateStructures(parentStruct, structures);\r\n }\r\n\r\n // if last layer gets deleted make selectedLayer 0\r\n let newSelectedLayer =\r\n selectedLayer >= structures.length ? 0 : selectedLayer;\r\n\r\n this.setMountedState({\r\n structures,\r\n roiLayers,\r\n selectedLayer: newSelectedLayer,\r\n });\r\n\r\n return newSelectedLayer;\r\n };\r\n\r\n /**\r\n * Duplicates a structure and corresponding parameters from project model.\r\n *\r\n * @param {object} structure - Structure to remove\r\n */\r\n duplicateStructure = (structure) => {\r\n const { structures, roiLayers, fileId } = this.state;\r\n\r\n // findHighest id number\r\n const newLayerId =\r\n structures.reduce((a, c) => (a ? Math.max(a, c.id) : c.id), 0) + 1;\r\n\r\n // clone structure\r\n const pureLabel = structure.label.split(\" - copy\")[0];\r\n const copiesCount = structures.reduce(\r\n (a, c) => (c.label.startsWith(pureLabel + \" - copy\") ? a + 1 : a),\r\n 0\r\n );\r\n let newStructure = Object.assign(JSON.parse(JSON.stringify(structure)), {\r\n id: newLayerId,\r\n label:\r\n copiesCount > 0\r\n ? pureLabel + \" - copy(\" + (copiesCount + 1) + \")\"\r\n : pureLabel + \" - copy\",\r\n });\r\n\r\n let newRoilayer = {\r\n id: newLayerId,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n\r\n structures.push(newStructure);\r\n roiLayers[fileId].push(newRoilayer);\r\n\r\n this.duplicateChildren(structure, newStructure);\r\n\r\n let newSelectedLayer = structures.findIndex((c) => c.id === newLayerId);\r\n this.setMountedState({\r\n structures,\r\n roiLayers,\r\n selectedLayer: newSelectedLayer,\r\n });\r\n\r\n return newSelectedLayer;\r\n };\r\n\r\n findChildren = (structure) => {\r\n const { structures } = this.state;\r\n\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === structure.subtypeLevel + 1 &&\r\n element.parentId === structure.id\r\n );\r\n };\r\n\r\n duplicateChildren = (oldParent, newParent) => {\r\n const { structures, roiLayers, fileId } = this.state;\r\n\r\n for (let structure of this.findChildren(oldParent)) {\r\n // findHighest id number\r\n const newId =\r\n structures.reduce((a, c) => (a ? Math.max(a, c.id) : c.id)) + 1;\r\n\r\n // clone structure\r\n let newStructure = Object.assign(JSON.parse(JSON.stringify(structure)), {\r\n id: newId,\r\n parentId: newParent.id,\r\n });\r\n\r\n let newRoilayer = {\r\n id: newId,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n\r\n structures.push(newStructure);\r\n roiLayers[fileId].push(newRoilayer);\r\n\r\n this.duplicateChildren(structure, newStructure);\r\n }\r\n };\r\n\r\n /**\r\n * Checks if a structure can be moved in a direction.\r\n *\r\n * @param {Object} selectedStructure - Structure to move\r\n * @param {int} direction - 1 is up -1 is down\r\n * @returns {bool} Move in this direction possible\r\n */\r\n canMoveStructure = (selectedStructure, direction) => {\r\n const { structures } = this.state;\r\n if (!selectedStructure.dynamic) return false;\r\n\r\n let structuresSameLevel = {\r\n structure: [],\r\n index: [],\r\n };\r\n\r\n // get structures in same level of same parent\r\n structuresSameLevel.structure = structures.filter(\r\n (element) =>\r\n element.parentId === selectedStructure.parentId &&\r\n element.subtypeLevel === selectedStructure.subtypeLevel\r\n );\r\n\r\n // if parent is selected (e.g. Base Roi)\r\n if (!selectedStructure.isSubtype) {\r\n structuresSameLevel.structure = structures.filter(\r\n (element) => element.subtypeLevel === selectedStructure.subtypeLevel\r\n );\r\n }\r\n // get indices in all structures\r\n structuresSameLevel.structure.forEach((element) =>\r\n structuresSameLevel.index.push(\r\n structures.findIndex((structure) => structure === element)\r\n )\r\n );\r\n\r\n // index of selected layer of structures in same level\r\n let index = structuresSameLevel.structure.findIndex(\r\n (structure) => structure === selectedStructure\r\n );\r\n\r\n if (direction > 0) {\r\n // if first object --> move up not possible.\r\n // Also, moving above fixed, non-dynamic structures is forbidden.\r\n if (index === 0 || !structuresSameLevel.structure[index - 1].dynamic) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n } else {\r\n // if last object --> move down not possible\r\n if (index === structuresSameLevel.structure.length - 1) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Moves a structure up or down in structure list\r\n *\r\n * @param {Object} selectedStructure - Structure to move\r\n * @param {int} direction - 1 is up -1 is down\r\n */\r\n moveStructure = (selectedStructure, direction) => {\r\n const { structures, roiLayers } = this.state;\r\n\r\n let structuresSameLevel = {\r\n structure: [],\r\n index: [],\r\n };\r\n\r\n // get structures in same level of same parent\r\n structuresSameLevel.structure = structures.filter(\r\n (element) =>\r\n element.parentId === selectedStructure.parentId &&\r\n element.subtypeLevel === selectedStructure.subtypeLevel\r\n );\r\n\r\n // if parent is selected (e.g. Base Roi)\r\n if (!selectedStructure.isSubtype) {\r\n structuresSameLevel.structure = structures.filter(\r\n (element) => element.subtypeLevel === selectedStructure.subtypeLevel\r\n );\r\n }\r\n // get indices in all structures\r\n structuresSameLevel.structure.forEach((element) =>\r\n structuresSameLevel.index.push(\r\n structures.findIndex((structure) => structure === element)\r\n )\r\n );\r\n\r\n // index of selected layer of structures in same level\r\n let index = structuresSameLevel.structure.findIndex(\r\n (structure) => structure === selectedStructure\r\n );\r\n\r\n if (direction > 0) {\r\n // if first object --> move up not possible.\r\n // Also, moving above fixed, non-dynamic structures is forbidden.\r\n if (index === 0 || !structuresSameLevel.structure[index - 1].dynamic) {\r\n window.showWarningSnackbar(\"Moving structure up not possible!\");\r\n return;\r\n }\r\n // swap two neighbor structures with subtypes\r\n // get all elements of selected structure\r\n let strt = structuresSameLevel.index[index];\r\n let ed = structuresSameLevel.index[index + 1];\r\n // if structure to move up is last structure\r\n if (!ed) {\r\n // get index first structure in same level\r\n let idxFirstSubtype = structures.findIndex(\r\n (structure) => structure === structuresSameLevel.structure[0]\r\n );\r\n for (let i = idxFirstSubtype; i < structures.length; i++) {\r\n if (structures[i].subtypeLevel < selectedStructure.subtypeLevel) {\r\n ed = i;\r\n break;\r\n }\r\n }\r\n }\r\n // Get all children of the selected structure.\r\n let allElements_1 = structures.slice(strt, ed);\r\n\r\n // delete elements to swap from structures\r\n structures.splice(structuresSameLevel.index[index], allElements_1.length);\r\n\r\n // put elements to right index in structures\r\n let start = structures.findIndex(\r\n (structure) => structure === structuresSameLevel.structure[index - 1]\r\n );\r\n for (let i = allElements_1.length - 1; i >= 0; i--) {\r\n structures.splice(start, 0, allElements_1[i]);\r\n }\r\n } else {\r\n // if last object --> move down not possible\r\n if (index === structuresSameLevel.structure.length - 1) {\r\n window.showWarningSnackbar(\"Moving structure down not possible!\");\r\n return;\r\n }\r\n\r\n // swap two neighbor structures with subtypes\r\n // get all elements of selected structure\r\n let strt = structuresSameLevel.index[index];\r\n let ed = structuresSameLevel.index[index + 1];\r\n let allElements_1 = structures.slice(strt, ed);\r\n\r\n // delete elements of first structure to swap\r\n structures.splice(structuresSameLevel.index[index], allElements_1.length);\r\n\r\n // put elements to right index in structures\r\n let start = structures.findIndex(\r\n (structure) => structure === structuresSameLevel.structure[index + 2]\r\n );\r\n\r\n // if structure to swap is last subtype\r\n let lastStructure = false;\r\n if (start === -1) {\r\n // get index of structure to swap\r\n let idxSwapStructure = structures.findIndex(\r\n (structure) => structure === structuresSameLevel.structure[index + 1]\r\n );\r\n // if it is the last structure of all structures\r\n // search next parent structure\r\n let otherParent = false;\r\n for (let i = idxSwapStructure; i < structures.length; i++) {\r\n if (structures[i].subtypeLevel < selectedStructure.subtypeLevel) {\r\n otherParent = true;\r\n }\r\n }\r\n if (!otherParent) {\r\n lastStructure = true;\r\n } else {\r\n // search next parent structure\r\n for (let i = idxSwapStructure; i < structures.length; i++) {\r\n if (structures[i].subtypeLevel < selectedStructure.subtypeLevel) {\r\n start = i;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!lastStructure) {\r\n // put all elements to index after structure to swap\r\n for (let i = allElements_1.length - 1; i >= 0; i--) {\r\n structures.splice(start, 0, allElements_1[i]);\r\n }\r\n } else {\r\n // if last structure push elements to the end\r\n for (let i = 0; i < allElements_1.length; i++) {\r\n structures.push(allElements_1[i]);\r\n }\r\n }\r\n }\r\n\r\n // Match roiLayer structure to new structure structure.\r\n // Sorts the roilayers for each scene in project by having their ID-order\r\n // match the order set by the structures.\r\n for (let sceneGUID in roiLayers) {\r\n roiLayers[sceneGUID].sort((roi_layer_a, roi_layer_b) => {\r\n // Location of the first roi-Layer Id in strcutures\r\n let index_of_roi_layer_a_in_structures = structures.findIndex(\r\n (element) => {\r\n return element.id === roi_layer_a.id;\r\n }\r\n );\r\n\r\n // Location of the second roi-Layer Id in strcutures\r\n let index_of_roi_layer_b_in_structures = structures.findIndex(\r\n (element) => {\r\n return element.id === roi_layer_b.id;\r\n }\r\n );\r\n\r\n // Check if the first index comes before the second.\r\n // Else, swap per sort algorithm.\r\n return (\r\n index_of_roi_layer_a_in_structures -\r\n index_of_roi_layer_b_in_structures\r\n );\r\n });\r\n }\r\n\r\n let newSelectedLayer = structures.findIndex((c) => c === selectedStructure);\r\n this.setMountedState({ structures, selectedLayer: newSelectedLayer });\r\n return newSelectedLayer;\r\n };\r\n\r\n getProjectStringInfos = () => {\r\n const project = this.state.project;\r\n const file = project.files.find((file) => file.id === this.state.fileId);\r\n const fileName = file.fileName.split(\".\").slice(0, -1).join(\".\");\r\n let today = new Date();\r\n let dd = String(today.getDate()).padStart(2, \"0\");\r\n let mm = String(today.getMonth() + 1).padStart(2, \"0\"); //January is 0!\r\n let yyyy = today.getFullYear();\r\n today = yyyy + \"-\" + mm + \"-\" + dd;\r\n\r\n // projekt_methode_filename_SceneNr_001.png\r\n return {\r\n name: project.name,\r\n type: project.type,\r\n fileName: fileName,\r\n date: today,\r\n };\r\n };\r\n\r\n setStateNow = (newState) => {\r\n Object.assign(this.state, newState);\r\n this.forceUpdate();\r\n };\r\n\r\n setAiModelRepository = (aiModelRepository) => {\r\n this.aiModelRepository = aiModelRepository;\r\n };\r\n\r\n setAiStateObject = (aiStateObject) => {\r\n this.aiStateObject = aiStateObject;\r\n };\r\n\r\n render() {\r\n return (\r\n this.setMountedState(e, callback),\r\n forceUpdate: () => this.forceUpdate(),\r\n getRegionById: this.getRegionById,\r\n setChangingFile: this.setChangingFile,\r\n setActiveTab: this.setActiveTab,\r\n getActiveTab: this.getActiveTab,\r\n /* Handle Structures */\r\n importStructures: this.importStructures,\r\n addStructure: this.addStructure,\r\n addSubStructure: this.addSubStructure,\r\n addSubType: this.addSubType,\r\n deleteStructure: this.deleteStructure,\r\n moveStructure: this.moveStructure,\r\n canMoveStructure: this.canMoveStructure,\r\n duplicateStructure: this.duplicateStructure,\r\n setStateNow: this.setStateNow,\r\n getProjectStringInfos: this.getProjectStringInfos,\r\n setAiModelRepository: this.setAiModelRepository,\r\n setAiStateObject: this.setAiStateObject,\r\n /* State */\r\n ...this.state,\r\n fileRoiLayers:\r\n this.state.roiLayers && this.state.roiLayers[this.state.fileId],\r\n }}\r\n >\r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nProjectProvider.propTypes = {\r\n children: PropTypes.element.isRequired,\r\n};\r\n\r\nexport default ProjectProvider;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// import RBush from \"rbush\";\r\n\r\n// import { createRoisFromAnno } from \"../utils/ROI\";\r\n\r\nimport { withPersistentStorage } from \"./PersistentStorageContext\";\r\nimport { withProject } from \"./ProjectContext\";\r\n\r\nimport { getParentIndexLayer } from \"../utils/StructuresUtils\";\r\n\r\nconst ProjectHistoryContext = React.createContext();\r\n\r\nexport const withProjectHistory = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withProjectHistory(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\n// this is the main component, it has to be added at the root of the app.\r\n// all components that use withProject(...) will have access to it via this.props.Project...\r\nclass ProjectHistoryProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n canUndo: false,\r\n canRedo: false,\r\n sizeLimitReached: false,\r\n };\r\n window.projectHistory = this;\r\n }\r\n\r\n /**\r\n * Initializes the Project provider and passes a viewer component\r\n *\r\n * @param {object} viewer - Viewer Component\r\n */\r\n init = (viewer) => {\r\n this.viewer = viewer;\r\n this.past = [];\r\n this.future = [];\r\n };\r\n\r\n add = (item) => {\r\n if (item.length > 0) {\r\n item = item.map((action) => {\r\n action.roi = action.roi.copy();\r\n return action;\r\n });\r\n this.past.push(item);\r\n this.future = [];\r\n this.updateState();\r\n }\r\n };\r\n\r\n //intern function, adds and removes polys for one item (history step)\r\n processItem = (item, stepType) => {\r\n if (item.length === 0) return;\r\n\r\n const { fileId, structures } = this.viewer.props.projectContext;\r\n let roiLayers = this.viewer.props.projectContext.roiLayers[fileId];\r\n\r\n for (let action of item) {\r\n let parentLayerIdx = -1;\r\n try {\r\n parentLayerIdx = getParentIndexLayer(\r\n structures.find((str) => str.id === action.id),\r\n structures\r\n );\r\n } catch (ex) {\r\n console.log(stepType, \"error:\", ex);\r\n window.showErrorSnackbar(\r\n \"Something went wrong, \" + stepType + \" ignored!\"\r\n );\r\n return;\r\n }\r\n const parentRoiLayer = roiLayers[parentLayerIdx];\r\n\r\n if (\r\n (stepType === \"redo\" && action.add) ||\r\n (stepType === \"undo\" && !action.add)\r\n ) {\r\n parentRoiLayer.tree.insert(action.roi.treeItem);\r\n } else {\r\n parentRoiLayer.tree.remove(action.roi.treeItem, (a, b) => {\r\n return a.roi.uuid === b.roi.uuid;\r\n });\r\n }\r\n parentRoiLayer.layer.regionRois = parentRoiLayer.tree\r\n .all()\r\n .map((treeItem) => treeItem.roi);\r\n }\r\n };\r\n\r\n undo = () => {\r\n if (this.past.length > 0) {\r\n let item = this.past.pop();\r\n this.processItem(item, \"undo\");\r\n this.future.push(item);\r\n }\r\n this.updateState();\r\n };\r\n\r\n redo = () => {\r\n if (this.future.length > 0) {\r\n let item = this.future.pop();\r\n this.processItem(item, \"redo\");\r\n this.past.push(item);\r\n }\r\n this.updateState();\r\n };\r\n\r\n updateState = () => {\r\n this.setState({\r\n canUndo: this.past.length > 0,\r\n canRedo: this.future.length > 0,\r\n });\r\n };\r\n\r\n getHistoryLength = () => {\r\n return this.past.length;\r\n };\r\n\r\n mergePastItems(n) {\r\n if (n > 1) {\r\n let newItem = [];\r\n for (let i = 0; i < n; i++) {\r\n let item = this.past.pop();\r\n newItem.push(...item);\r\n }\r\n this.past.push(newItem);\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nProjectHistoryProvider.propTypes = {\r\n historyDepth: PropTypes.number.isRequired,\r\n projectContext: PropTypes.object,\r\n children: PropTypes.element.isRequired,\r\n};\r\n\r\nexport default withPersistentStorage(withProject(ProjectHistoryProvider));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n// import classnames from \"classnames\";\r\nimport { DialogTitle, Dialog, LinearProgress } from \"@mui/material\";\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport \"./Spinloader.css\";\r\n\r\nconst SpinloaderContext = React.createContext();\r\n\r\nexport const withSpinloader = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withSpinloader(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\nconst styles = () => ({\r\n progressContainer: {\r\n position: \"fixed\",\r\n top: 64,\r\n left: 0,\r\n right: 390,\r\n bottom: 0,\r\n zIndex: 100000,\r\n margin: \"auto\",\r\n textAlign: \"center\",\r\n height: 50,\r\n },\r\n dialog: { pointerEvents: \"none\", right: 500, top: 60 },\r\n message: {\r\n display: \"inline-block\",\r\n position: \"relative\",\r\n top: -10,\r\n marginLeft: 10,\r\n },\r\n linearProgress: {\r\n height: 10,\r\n },\r\n greyedOutBackground: {\r\n background: \"rgba(0,0,0,0.5)\",\r\n top: 0,\r\n left: 0,\r\n width: \"10000px\",\r\n height: \"10000px\",\r\n position: \"fixed\",\r\n zIndex: 999999,\r\n },\r\n});\r\n\r\n// this is the main component, it has to be added at the root of the app.\r\n// all components that use withSpinloader(...) will have access to it via this.props.spinloader...\r\nclass SpinloaderProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n rightWidth: 100,\r\n show: false,\r\n messagePresent: false,\r\n message: \"\",\r\n indefinite: true,\r\n progress: 0,\r\n };\r\n this.timeout = null;\r\n }\r\n /**\r\n * Shows an indefinte spinloader\r\n */\r\n show() {\r\n if (!this.state.show) {\r\n this.setState({\r\n show: true,\r\n messagePresent: false,\r\n message: \"\",\r\n indefinite: true,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Shows a progressbar with a prominent message above\r\n * @param {JSON} progressObject JSON Object with message and progress {message: , progress: }\r\n */\r\n showWithProgress = (progressObject) => {\r\n this.setState({\r\n show: true,\r\n messagePresent: true,\r\n message: progressObject.message + \": \" + progressObject.progress + \"%\",\r\n progress: progressObject.progress,\r\n indefinite: false,\r\n });\r\n clearTimeout(this.timeout);\r\n };\r\n /**\r\n * Shows an indefinite loader with a prominent message above\r\n * @param {String} message The info to be displayed\r\n */\r\n showWithMessage = (message) => {\r\n this.setState({\r\n show: true,\r\n messagePresent: true,\r\n message: message,\r\n indefinite: true,\r\n });\r\n };\r\n\r\n /**\r\n * Shows Spinloader and hides it after a defined time to prevent constant blocking of the screen\r\n * @param {int} scenesLeft Scenes to analyse. Used for delay calculation.\r\n * @param {int} timeoutSeconds Seconds to wait until hiding spinloader\r\n */\r\n showWithTimeout(scenesLeft, timeoutSeconds = 30) {\r\n let waitTime = 300000;\r\n if (scenesLeft) {\r\n waitTime = scenesLeft * timeoutSeconds * 1000;\r\n waitTime = Math.max(waitTime, 60000);\r\n }\r\n this.setState({ show: true });\r\n this.timeout = setTimeout(() => this.timeoutHide(), waitTime);\r\n }\r\n\r\n /**\r\n *\r\n * @param {*} scenesLeft\r\n * @param {*} timeoutSeconds\r\n */\r\n resetTimer(scenesLeft, timeoutSeconds = 30) {\r\n let waitTime = scenesLeft * timeoutSeconds * 1000;\r\n waitTime = Math.min(waitTime, 60000);\r\n clearTimeout(this.timeout);\r\n if (scenesLeft > 0) {\r\n this.timeout = setTimeout(() => this.timeoutHide(), waitTime);\r\n } else {\r\n this.hide();\r\n }\r\n }\r\n\r\n hide() {\r\n clearTimeout(this.timeout);\r\n this.setState({ show: false, messagePresent: false, message: \"\" });\r\n }\r\n\r\n timeoutHide() {\r\n this.hide();\r\n window.showWarningSnackbar(\r\n \"Warning: Timeout! Process is taking especially long.\"\r\n );\r\n }\r\n\r\n hideTimeDelayed(delay) {\r\n setTimeout(() => {\r\n this.hide();\r\n }, delay);\r\n }\r\n\r\n load(func) {\r\n this.setState({ show: true });\r\n setTimeout(() => {\r\n func();\r\n this.setState({ show: false, messagePresent: false });\r\n }, 0);\r\n }\r\n\r\n setRightWidth(width) {\r\n this.setState({ rightWidth: width });\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n this.show(),\r\n showWithTimeout: (numberScenes) => this.showWithTimeout(numberScenes),\r\n showWithProgress: (progObject) => this.showWithProgress(progObject),\r\n showWithMessage: (message) => this.showWithMessage(message),\r\n resetTimer: (numberRestScenes) => this.resetTimer(numberRestScenes),\r\n hide: () => this.hide(),\r\n hideTimeDelayed: (delay) => this.hideTimeDelayed(delay),\r\n load: (callback) => this.load(callback),\r\n setRightWidth: (width) => this.setRightWidth(width),\r\n }}\r\n >\r\n {this.props.children}\r\n {this.state.show && (\r\n
\r\n \r\n {this.state.messagePresent ? (\r\n // Dialog option for more text\r\n \r\n \r\n \r\n
{this.state.message}
\r\n
\r\n {this.state.indefinite ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n ) : (\r\n // Normal, indefinite spinloader\r\n \r\n )}\r\n
\r\n
\r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nSpinloaderProvider.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n children: PropTypes.element.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(SpinloaderProvider);\r\n","import { withPersistentStorage } from \"./PersistentStorageContext\";\r\nimport { withProjectHistory } from \"./ProjectHistoryContext\";\r\nimport { withProject } from \"./ProjectContext\";\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\n\r\n/**\r\n * Wraps often used react contexts arrour a component and saves some lines ^^\r\n *\r\n * @param {React.Component} component - React Component that will be wrapped\r\n */\r\nexport const withAllViewerContexts = (component) =>\r\n withPersistentStorage(\r\n withProjectHistory(withProject(withSpinloader(component)))\r\n );\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst ResultTabContext = React.createContext();\r\n\r\nexport const withResultTab = (Component) => {\r\n const WrappedComponent = ({ ...propsWithoutClasses }) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withResultTab(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\n// this is the main component, it has to be added at the root of the app.\r\n// all components that use withResultTab(...) will have access to it via this.props.resultTab...\r\nclass ResultTabProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.selectedRoi = 0;\r\n this.selectedChildIndex = 1;\r\n this.selectedStructure = 0;\r\n this.changeFile = false;\r\n this.hundredTiles = false;\r\n this.rendererInitialized = false;\r\n this.rendererCanvas = null;\r\n this.rendererCtx = null;\r\n this.zoomLevelFixed = false;\r\n this.gridExists = false;\r\n this.resetPressed = false;\r\n this.selSampleSet = false;\r\n this.fileChange = false;\r\n }\r\n\r\n getSelectedRoi() {\r\n return this.selectedRoi;\r\n }\r\n\r\n setSelectedRoi(a) {\r\n this.selectedRoi = a;\r\n }\r\n\r\n getSelectedChildIndex() {\r\n return this.selectedChildIndex;\r\n }\r\n\r\n setSelectedChildIndex(a) {\r\n this.selectedChildIndex = a;\r\n }\r\n\r\n getSelectedStructure() {\r\n return this.selectedStructure;\r\n }\r\n\r\n setSelectedStructure(a) {\r\n this.selectedStructure = a;\r\n }\r\n\r\n getChangeFile() {\r\n return this.changeFile;\r\n }\r\n\r\n setChangeFile(a) {\r\n this.changeFile = a;\r\n }\r\n\r\n getHundredTiles() {\r\n return this.hundredTiles;\r\n }\r\n\r\n setHundredTiles(a) {\r\n this.hundredTiles = a;\r\n }\r\n\r\n getRendererInitialized() {\r\n return this.rendererInitialized;\r\n }\r\n\r\n setRendererInitialized(a) {\r\n this.rendererInitialized = a;\r\n }\r\n\r\n getRendererCanvas() {\r\n return this.rendererCanvas;\r\n }\r\n\r\n setRendererCanvas(a) {\r\n this.rendererCanvas = a;\r\n }\r\n\r\n getRendererCtx() {\r\n return this.rendererCtx;\r\n }\r\n\r\n setRendererCtx(a) {\r\n this.rendererCtx = a;\r\n }\r\n\r\n // returns position of our image\r\n getPosition = () => {\r\n return {\r\n x: -this.rendererCtx.getTransform().e,\r\n y: -this.rendererCtx.getTransform().f,\r\n };\r\n };\r\n\r\n // returns the current zoom scale\r\n getScale = () => {\r\n return this.rendererCtx ? this.rendererCtx.getTransform().a : 1;\r\n };\r\n\r\n /**\r\n * Is the current zoom level be fixed?\r\n * @returns {bool} Is the current zoom level fixed?\r\n */\r\n getZoomLevelFixed() {\r\n return this.zoomLevelFixed;\r\n }\r\n\r\n /**\r\n * Toggle the state of zoomLevelFixed.\r\n */\r\n toggleZoomLevelFixed() {\r\n this.zoomLevelFixed = !this.zoomLevelFixed;\r\n }\r\n\r\n /**\r\n * Set the attribute zoomLevelFixed to true or false.\r\n * @param {bool} value Should the zoom be fixed?\r\n */\r\n setZoomLevelFixed(value) {\r\n this.zoomLevelFixed = value;\r\n }\r\n\r\n getGridExists() {\r\n return this.gridExists;\r\n }\r\n\r\n setGridExists(a) {\r\n this.gridExists = a;\r\n }\r\n\r\n getResetPressed() {\r\n return this.resetPressed;\r\n }\r\n\r\n setResetPressed(a) {\r\n this.resetPressed = a;\r\n }\r\n\r\n getSelSampleSet() {\r\n return this.selSampleSet;\r\n }\r\n\r\n setSelSampleSet(a) {\r\n this.selSampleSet = a;\r\n }\r\n\r\n getFileChange() {\r\n return this.fileChange;\r\n }\r\n\r\n setFileChange(a) {\r\n this.fileChange = a;\r\n }\r\n\r\n render() {\r\n return (\r\n this.getSelectedRoi(),\r\n setSelectedRoi: (a) => this.setSelectedRoi(a),\r\n getSelectedChildIndex: () => this.getSelectedChildIndex(),\r\n setSelectedChildIndex: (a) => this.setSelectedChildIndex(a),\r\n getSelectedStructure: () => this.getSelectedStructure(),\r\n setSelectedStructure: (a) => this.setSelectedStructure(a),\r\n getChangeFile: () => this.getChangeFile(),\r\n setChangeFile: (a) => this.setChangeFile(a),\r\n getHundredTiles: () => this.getHundredTiles(),\r\n setHundredTiles: (a) => this.setHundredTiles(a),\r\n getRendererInitialized: () => this.getRendererInitialized(),\r\n setRendererInitialized: (a) => this.setRendererInitialized(a),\r\n getRendererCanvas: () => this.getRendererCanvas(),\r\n setRendererCanvas: (a) => this.setRendererCanvas(a),\r\n getRendererCtx: () => this.getRendererCtx(),\r\n setRendererCtx: (a) => this.setRendererCtx(a),\r\n getPosition: () => this.getPosition(),\r\n getScale: () => this.getScale(),\r\n getZoomLevelFixed: () => this.getZoomLevelFixed(),\r\n toggleZoomLevelFixed: () => this.toggleZoomLevelFixed(),\r\n setZoomLevelFixed: (a) => this.setZoomLevelFixed(a),\r\n getGridExists: () => this.getGridExists(),\r\n setGridExists: (a) => this.setGridExists(a),\r\n getResetPressed: () => this.getResetPressed(),\r\n setResetPressed: (a) => this.setResetPressed(a),\r\n getSelSampleSet: () => this.getSelSampleSet(),\r\n setSelSampleSet: (a) => this.setSelSampleSet(a),\r\n getFileChange: () => this.getFileChange(),\r\n setFileChange: (a) => this.setFileChange(a),\r\n }}\r\n >\r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nResultTabProvider.propTypes = {\r\n children: PropTypes.element.isRequired,\r\n};\r\n\r\nexport default ResultTabProvider;\r\n","import React, { Component } from \"react\";\r\n\r\nimport PropTypes from \"prop-types\";\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n IconButton,\r\n Tooltip,\r\n Divider,\r\n Fade,\r\n Popper,\r\n Paper,\r\n // SvgIcon,\r\n} from \"@mui/material\";\r\n\r\nimport {\r\n faImages,\r\n faCube,\r\n faFillDrip,\r\n faPlus,\r\n faPen,\r\n faDrawPolygon,\r\n faClone,\r\n faMousePointer,\r\n faCamera,\r\n faDownload,\r\n faPlayCircle,\r\n faExchangeAlt,\r\n faSquareFull,\r\n faThLarge,\r\n faTh,\r\n faBrain,\r\n faMagic,\r\n faBraille,\r\n faFileDownload,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\nimport AllOutIcon from \"@mui/icons-material/AllOut\";\r\nimport { faCircle } from \"@fortawesome/free-regular-svg-icons\";\r\nimport UndoIcon from \"@mui/icons-material/Undo\";\r\nimport RedoIcon from \"@mui/icons-material/Redo\";\r\nimport RateReviewIcon from \"@mui/icons-material/RateReview\";\r\n//import IsoIcon from \"@mui/icons-material/Iso\";\r\nimport PinDropIcon from \"@mui/icons-material/PinDrop\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport {\r\n Save,\r\n ZoomOutMap,\r\n CheckBoxOutlineBlank,\r\n ZoomIn,\r\n ZoomOut,\r\n ViewQuilt,\r\n} from \"@mui/icons-material\";\r\nimport SelectAllIcon from \"@mui/icons-material/SelectAll\";\r\nimport FullscreenIcon from \"@mui/icons-material/Fullscreen\";\r\nimport FullscreenExitIcon from \"@mui/icons-material/FullscreenExit\";\r\nimport FlipIcon from \"@mui/icons-material/Flip\";\r\nimport SortIcon from \"@mui/icons-material/Sort\";\r\nimport ScatterPlotIcon from \"@mui/icons-material/ScatterPlot\";\r\nimport InlineSVG from \"svg-inline-react\";\r\nimport ToggleButton from \"./ToggleButton\";\r\nimport CustomSvgIcon from \"../../globalComponents/CustomSvgIcon.jsx\";\r\n\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport VerticalResizeBorder from \"./VerticalResizeBorder\";\r\nimport { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\r\nimport { withResultTab } from \"../contexts/ResultTabContext\";\r\n\r\n// enum containing all available tools\r\nexport const Tools = {\r\n NONE: \"none\",\r\n // shape anotation tools\r\n RECT_ROI: \"rect\",\r\n // pixel anotation tools\r\n PEN_ROI: \"pen\",\r\n MAGICWAND_ROI: \"magic wand\",\r\n REGIONGROWING_ROI: \"region growing\",\r\n REGIONGRABCUT_ROI: \"region grabcut\",\r\n REGION_ROI: \"region\",\r\n RECTANGLE_ROI: \"rectangle\",\r\n COMMENT_ROI: \"comment\",\r\n ELLIPSE_ROI: \"ellipse\",\r\n COPY_ROI: \"copy\",\r\n SELECTION_ROI: \"selection\",\r\n FINDSMALLESTROI_ROI: \"smallestroi\",\r\n PLOTNEAREST_ROI: \"nearestroi\",\r\n FILL: \"fill\",\r\n IAM: \"iam\",\r\n // active learning\r\n AL: \"activeLearning\",\r\n AITRAINING: \"aiTraining\",\r\n GRIDTOOL: \"gridtool\",\r\n GRIDANNOTATIONTOOL: \"gridannotationtool\",\r\n SELECTION_Tile: \"selectiontile\",\r\n POINTCOUNTING_Tile: \"pointcountingtile\",\r\n // tileRegistration\r\n LANDMARK: \"landmark\",\r\n HEATMAP: \"heatmap\",\r\n};\r\n\r\n// define the component's styling\r\nconst styles = (theme) => ({\r\n toolBar: {\r\n position: \"relative\",\r\n margin: 0,\r\n padding: 0,\r\n marginRight: 5,\r\n background: \"#fff\",\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n overflowX: \"hidden\",\r\n overflowY: \"auto\",\r\n },\r\n toolbarButton: {\r\n display: \"inline-block\",\r\n width: 40,\r\n height: 40,\r\n padding: 0,\r\n margin: 0,\r\n fontSize: 22,\r\n },\r\n toolbarButtonIcon: {\r\n verticalAlign: \"-4px\",\r\n },\r\n textIcon: {\r\n fontSize: 18,\r\n fontWeight: \"bold\",\r\n },\r\n toolbarButtonChecked: {\r\n width: 40,\r\n color: theme.palette.primary.main,\r\n },\r\n divider: {\r\n marginLeft: 5,\r\n marginRight: 5,\r\n },\r\n});\r\n\r\nclass VerticalToolBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n open: false,\r\n anchorEl: null,\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n this.setToolBarWidth(false);\r\n };\r\n\r\n // trigger on window resize: set toolbarwidth to 1 col, 2 col or 2 cols with scrollbar\r\n setToolBarWidth = (viewerToGallery) => {\r\n if (this.containerElement && this.topElement && this.bottomElement) {\r\n const { verticalToolBarWidth } = this.props;\r\n let containerHeight = this.containerElement.clientHeight;\r\n let topHeight = this.topElement.clientHeight;\r\n let bottomHeight = this.bottomElement.clientHeight;\r\n let resultWidth = verticalToolBarWidth;\r\n if (verticalToolBarWidth > 45) {\r\n if ((topHeight + bottomHeight) * 2 < containerHeight) {\r\n resultWidth = 45;\r\n } else if (containerHeight < topHeight + bottomHeight) {\r\n resultWidth = 101;\r\n } else {\r\n resultWidth = 90;\r\n }\r\n } else if (topHeight + bottomHeight > containerHeight) {\r\n resultWidth = 90;\r\n }\r\n if (verticalToolBarWidth !== resultWidth - 5) {\r\n this.props.updateToolBarWidth(resultWidth, viewerToGallery);\r\n }\r\n }\r\n };\r\n\r\n checkToolInConfig(toolName) {\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n exportAllFiles = (idx, projectId) => {\r\n // export images of structure to folder in png format\r\n let fileIDs = this.props.project.files;\r\n this.props.spinloader.show();\r\n Backend.exportGallery(projectId, fileIDs[idx].id, (e) => {\r\n let str_1 = \"Export File \" + fileIDs[idx].id;\r\n let str_2 = \"Gallery exported to: \" + e.path;\r\n if (idx + 1 < this.props.project.files.length) {\r\n this.showMessage(str_1);\r\n this.exportAllFiles(idx + 1, projectId, fileIDs[idx + 1].id);\r\n } else {\r\n this.showMessage(str_1);\r\n this.showMessage(str_2);\r\n this.props.setAlruns(false);\r\n this.props.spinloader.hide();\r\n }\r\n });\r\n };\r\n\r\n exportCurrentFile = (idx, projectId, fileId) => {\r\n // export images of structure to folder in png format\r\n this.props.spinloader.show();\r\n Backend.exportGallery(projectId, fileId, (e) => {\r\n let str_1 = \"Export File \" + fileId;\r\n let str_2 = \"Gallery exported to: \" + e.path;\r\n this.showMessage(str_1);\r\n this.showMessage(str_2);\r\n this.props.setAlruns(false);\r\n this.props.spinloader.hide();\r\n });\r\n };\r\n\r\n showMessage = (x) => {\r\n window.showSuccessSnackbar(x);\r\n };\r\n\r\n setStructureIds = () => {\r\n const { structures, roiLayers } = this.props;\r\n // make sure thath all rois have structureIds --> somtimes have no ids after run iams\r\n for (let i = 0; i < structures.length; i++) {\r\n // if parent structure set structureIds because parent rois do not have ids after iam / job\r\n roiLayers[i].layer.regionRois.forEach((roi) => {\r\n // if roi is no subtype an has no structureId yet\r\n if (roi.structureId === 0 && !roi.isSubtype) {\r\n roi.structureId = structures[i].id;\r\n roi.color = structures[i].color;\r\n }\r\n });\r\n }\r\n };\r\n\r\n onSaveImages(allScenes) {\r\n // make sure that all rois have a structure id (if only run job parents do not have structureId)\r\n this.setStructureIds();\r\n // save and export images\r\n this.props.saveChangesGallery(true);\r\n this.props.setAlruns(true);\r\n\r\n if (allScenes) {\r\n // wait until saving is finished (project json) --> then start export\r\n setTimeout(() => {\r\n this.exportAllFiles(0, this.props.projectId, this.props.fileId);\r\n }, 2000);\r\n } else {\r\n // wait until saving is finished (project json) --> then start export\r\n setTimeout(() => {\r\n this.exportCurrentFile(0, this.props.projectId, this.props.fileId);\r\n }, 2000);\r\n }\r\n }\r\n\r\n setZLevelforRois = () => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // set z level of rois to selected z level in viewer\r\n let zLevelClassification = this.props.tiles.getZLevel();\r\n roiLayers[selectedLayer].layer.regionRois.forEach((roi) => {\r\n roi.z = zLevelClassification;\r\n });\r\n };\r\n\r\n ApplyModel = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // apply trained dl model to selected structure\r\n\r\n // check if selectedLayer is parent\r\n if (structures[selectedLayer].classificationSubtype) {\r\n this.props.trainingWarning(\"subtype\");\r\n return;\r\n }\r\n\r\n // check if structure has childs\r\n // check if selectedLayer is parent\r\n if (!structures[selectedLayer].hasChild) {\r\n this.props.trainingWarning(\"hasNoChilds\");\r\n return;\r\n }\r\n\r\n // make warning that not changing layer while applying model\r\n window.showWarningSnackbar(\r\n \"Please do not change structure while applying the model.\"\r\n );\r\n\r\n // set z-Index of rois to selected z-Level\r\n this.setZLevelforRois();\r\n this.props.saveChangesGallery();\r\n this.props.setAlruns(true);\r\n let passiveLearning = true;\r\n let applyModel = true;\r\n this.props.applyDL(\r\n this.props.tools[\"alm_gallery_tool\"],\r\n this.props.projectId,\r\n this.props.fileId,\r\n passiveLearning,\r\n applyModel\r\n );\r\n };\r\n\r\n findClassificationChilds = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // return direct classification subtypes\r\n return structures.filter(\r\n (element) =>\r\n element.parentId === structures[selectedLayer].id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n enoughAnnotations = (childs) => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // check if enough annotations for training of dl model (at least one class with 5 annotations and one other class with 1 annotation)\r\n let minFive = false;\r\n let twoAnnotated = 0;\r\n childs.forEach((element) => {\r\n // get number of elements for child\r\n let numberElements = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi) => roi.structureId === element.id\r\n ).length;\r\n\r\n // check if minimum of five in one class\r\n if (numberElements >= 5) {\r\n minFive = true;\r\n }\r\n // check if two classes with at least one element\r\n if (numberElements >= 1) {\r\n twoAnnotated = twoAnnotated + 1;\r\n }\r\n });\r\n\r\n // if one class with at least five and one other class with at least one annotation --> enough annotations for training\r\n let enough = false;\r\n if (minFive && twoAnnotated >= 2) {\r\n enough = true;\r\n }\r\n return enough;\r\n };\r\n\r\n onStartTraining = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // start training for dl model\r\n\r\n // check if selectedLayer is parent\r\n if (structures[selectedLayer].classificationSubtype) {\r\n this.props.trainingWarning(\"subtype\");\r\n return;\r\n }\r\n\r\n // check if structure has childs\r\n // check if selectedLayer is parent\r\n if (!structures[selectedLayer].hasChild) {\r\n this.props.trainingWarning(\"hasNoChilds\");\r\n return;\r\n }\r\n\r\n // check if enough objects per class\r\n let childs = this.findClassificationChilds();\r\n let enoughAnnos = this.enoughAnnotations(childs);\r\n if (!enoughAnnos) {\r\n this.props.trainingWarning(\"tooFewAnnotations\");\r\n return;\r\n }\r\n\r\n this.props.saveChangesGallery();\r\n this.props.setAlruns(true);\r\n let passiveLearning = true;\r\n this.props.applyDL(\r\n this.props.tools[\"alm_gallery_tool\"],\r\n this.props.projectId,\r\n this.props.fileId,\r\n passiveLearning\r\n );\r\n };\r\n\r\n saveProject = () => {\r\n // save contextObject in local storage\r\n this.props.persistentStorage.save(\r\n \"contextObject\",\r\n this.props.tiles.getStrAnnoCount()\r\n );\r\n\r\n // save SubtypesPagesObject in local storage\r\n this.props.persistentStorage.save(\r\n \"subtypesPagesObject\",\r\n this.props.tiles.getSubtypesPages()\r\n );\r\n\r\n // save project\r\n this.props.onSave();\r\n };\r\n\r\n showSubtypes = (str) => {\r\n const { structures } = this.props;\r\n // unfold subtypes when using specific tool (so suptypes are displayed in subtype color not parent color)\r\n structures.forEach(function (element) {\r\n if (element.parentId === str.id) {\r\n element.isUnfolded = true;\r\n }\r\n });\r\n\r\n this.props.projectContext.setState({ structures });\r\n };\r\n\r\n render() {\r\n const {\r\n classes,\r\n viewerConfig,\r\n structures,\r\n tools,\r\n onChangeTool,\r\n activeTool,\r\n displayTimeBar,\r\n onToggleTimeBar,\r\n displayZStackBar,\r\n showGallery,\r\n filesGalleryActive,\r\n show3DViewer,\r\n onToggle3DViewer,\r\n showPointCloud,\r\n onToggleMeshView,\r\n showTilesGallery,\r\n selectedLayer,\r\n onSaveScreenshot,\r\n onZoomDelta,\r\n onZoomFit,\r\n onZoomOriginal,\r\n onToggleSideBar,\r\n onSave,\r\n projectHistory,\r\n verticalToolBarWidth,\r\n ome,\r\n activeTab,\r\n rendererRef,\r\n } = this.props;\r\n\r\n const { anchorEl, open } = this.state;\r\n\r\n // check which elements should be displayed in specific modules\r\n let showZoomLevels = true;\r\n let showUndoRedo = true;\r\n let showSaveTool = true;\r\n let showToggleSideBar = true;\r\n if (\r\n this.props.project &&\r\n (this.props.project.type.includes(\"HistoPointCounting\") ||\r\n this.props.project.type.includes(\"HistoClassification\"))\r\n ) {\r\n showZoomLevels = activeTab !== 1;\r\n showUndoRedo = activeTab !== 1;\r\n showSaveTool = activeTab !== 1;\r\n showToggleSideBar = activeTab !== 1;\r\n if (showGallery) {\r\n showToggleSideBar = false;\r\n }\r\n if (show3DViewer) {\r\n showToggleSideBar = false;\r\n showUndoRedo = false;\r\n showSaveTool = false;\r\n showZoomLevels = false;\r\n }\r\n }\r\n return (\r\n {\r\n this.containerElement = containerElement;\r\n }}\r\n className={classes.toolBar}\r\n style={{\r\n width: verticalToolBarWidth - 5,\r\n }}\r\n >\r\n
\r\n {!(\r\n this.props.projectContext.activeTab > 0 &&\r\n this.props.project &&\r\n (this.props.project.type.includes(\"HistoPointCounting\") ||\r\n this.props.project.type.includes(\"HistoClassification\"))\r\n ) && (\r\n \r\n )}\r\n \r\n {({ TransitionProps }) => (\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n )}\r\n \r\n {\r\n this.topElement = topElement;\r\n }}\r\n >\r\n {this.checkToolInConfig(\"GalleryTool\") && !show3DViewer && (\r\n \r\n {\r\n if (this.props.isImporting) {\r\n window.showWarningSnackbar(\r\n \"File import is running, please be patient!\"\r\n );\r\n return;\r\n }\r\n this.props.onToggleGallery(!showGallery);\r\n if (showGallery === true) {\r\n this.props.tiles.setGalleryVisible(false);\r\n this.props.setGalleryTool();\r\n this.props.changeToSelectedFile(); // if files gallery is active change to selected file\r\n } else {\r\n this.setToolBarWidth(true);\r\n this.props.tiles.setGalleryVisible(true);\r\n this.props.setGalleryTool();\r\n }\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n {/* ADD 3D-Converting Tool -> start converting with apply */}\r\n {this.checkToolInConfig(\"3DViewer\") && (\r\n \r\n {\r\n onToggle3DViewer(!show3DViewer);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n {this.checkToolInConfig(\"3DPointCloudView\") && show3DViewer && (\r\n \r\n {\r\n onToggleMeshView(!showPointCloud);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"TilesTool\") && (\r\n \r\n {\r\n this.props.onToggleTilesGallery(!showTilesGallery);\r\n this.props.setGalleryTool();\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"FindSmallestROITool\") &&\r\n !show3DViewer &&\r\n !showGallery &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.FINDSMALLESTROI_ROI\r\n ? Tools.NONE\r\n : Tools.FINDSMALLESTROI_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"PlotNearestTool\") &&\r\n !show3DViewer &&\r\n !showGallery &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.PLOTNEAREST_ROI\r\n ? Tools.NONE\r\n : Tools.PLOTNEAREST_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n {this.props.splitscreenCount > 1 && (\r\n \r\n this.props.onToggleFullscreen()}\r\n >\r\n {this.props.showFullscreen ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n {(this.props.showFullscreen || this.props.splitscreenCount === 1) &&\r\n this.checkToolInConfig(\"AdjustLayoutTool\") &&\r\n !show3DViewer &&\r\n !showGallery &&\r\n !showTilesGallery && (\r\n \r\n \r\n this.setState({\r\n open: !this.state.open,\r\n anchorEl: e.target,\r\n })\r\n }\r\n >\r\n \r\n \r\n \r\n )}\r\n {viewerConfig && viewerConfig.project.annotations !== \"pixel\" ? (\r\n \r\n \r\n {this.checkToolInConfig(\"DrawRectangleAnnotationTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.RECT_ROI\r\n ? Tools.NONE\r\n : Tools.RECT_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n \r\n ) : (\r\n \r\n \r\n {this.checkToolInConfig(\"DrawPixelAnnotationTool\") &&\r\n !filesGalleryActive &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.PEN_ROI\r\n ? Tools.NONE\r\n : Tools.PEN_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"DrawMagicWandAnnotationTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.MAGICWAND_ROI\r\n ? Tools.NONE\r\n : Tools.MAGICWAND_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"DrawRectangleAnnotationTool\") &&\r\n !filesGalleryActive &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.RECTANGLE_ROI\r\n ? Tools.NONE\r\n : Tools.RECTANGLE_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"DrawEllipseAnnotationTool\") &&\r\n !filesGalleryActive &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.ELLIPSE_ROI\r\n ? Tools.NONE\r\n : Tools.ELLIPSE_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"DrawRegionAnnotationTool\") &&\r\n !filesGalleryActive &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.REGION_ROI\r\n ? Tools.NONE\r\n : Tools.REGION_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {(this.checkToolInConfig(\"DrawRegionGrowingAnnotationTool\") ||\r\n this.checkToolInConfig(\"DrawGrabCutAnnotationTool\")) && (\r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"DrawRegionGrowingAnnotationTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery &&\r\n !filesGalleryActive && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.REGIONGROWING_ROI\r\n ? Tools.NONE\r\n : Tools.REGIONGROWING_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"DrawGrabCutAnnotationTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery &&\r\n !filesGalleryActive && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.REGIONGRABCUT_ROI\r\n ? Tools.NONE\r\n : Tools.REGIONGRABCUT_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"HeatmapTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.HEATMAP\r\n ? Tools.NONE\r\n : Tools.HEATMAP\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {(showGallery || showTilesGallery || show3DViewer) && (\r\n \r\n )}\r\n\r\n {/*viewerConfig &&\r\n viewerConfig.project.structures[selectedLayer] &&\r\n viewerConfig.project.structures[selectedLayer].tools.map(\r\n tool =>\r\n tool.name &&\r\n tool.name === \"alm_gallery_tool\" &&\r\n showGallery &&\r\n !this.props.alruns &&\r\n this.checkToolInConfig(\"OtherTools\") && (\r\n \r\n {\r\n onChangeTool(\r\n activeTool === tool.name ? Tools.NONE : tool.name\r\n );\r\n }}\r\n >\r\n \r\n \r\n \r\n )\r\n )*/}\r\n \r\n )}\r\n\r\n {showGallery || showTilesGallery ? (\r\n \r\n ) : (\r\n \r\n \r\n {viewerConfig &&\r\n viewerConfig.project.annotations !== \"pixel\" ? (\r\n \r\n {/*this.checkToolInConfig(\"DrawRectangleAnnotationTool\") && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.RECT_ROI\r\n ? Tools.NONE\r\n : Tools.RECT_ROI\r\n )\r\n }\r\n >\r\n \r\n \r\n \r\n )*/}\r\n \r\n ) : (\r\n \r\n {this.checkToolInConfig(\"FillHoleAnnotationTool\") &&\r\n !show3DViewer && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.FILL\r\n ? Tools.NONE\r\n : Tools.FILL\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"SelectRegionAnnotationTool\") &&\r\n !show3DViewer && (\r\n \r\n {\r\n onChangeTool(\r\n activeTool === Tools.SELECTION_ROI\r\n ? Tools.NONE\r\n : Tools.SELECTION_ROI\r\n );\r\n // make showsubtypes true for selected structure an unfold subtypes\r\n structures[selectedLayer].showSubtypes = true;\r\n this.showSubtypes(structures[selectedLayer]);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"CopyRegionAnnotationTool\") &&\r\n !show3DViewer && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.COPY_ROI\r\n ? Tools.NONE\r\n : Tools.COPY_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"AITrainingTool\") && !show3DViewer && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.AITRAINING\r\n ? Tools.NONE\r\n : Tools.AITRAINING\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"GridTool\") &&\r\n !this.props.tiles.getHsitoClassificationStarted() &&\r\n !this.props.resultTab.getGridExists() &&\r\n !show3DViewer && (\r\n \r\n {\r\n onChangeTool(\r\n activeTool === Tools.GRIDTOOL\r\n ? Tools.NONE\r\n : Tools.GRIDTOOL\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"GridAnnotationTool\") &&\r\n !show3DViewer && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.GRIDANNOTATIONTOOL\r\n ? Tools.NONE\r\n : Tools.GRIDANNOTATIONTOOL\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n \r\n\r\n {structures &&\r\n structures[selectedLayer] &&\r\n structures[selectedLayer].tools.map(\r\n (tool) =>\r\n tool.name &&\r\n tools[tool.name] &&\r\n tool.name !== \"alm_gallery_tool\" &&\r\n tool.name !== \"iam_ai_inference\" &&\r\n this.checkToolInConfig(\"OtherTools\") &&\r\n !show3DViewer && (\r\n \r\n {\r\n onChangeTool(\r\n activeTool === tool.name\r\n ? Tools.NONE\r\n : tool.name\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )\r\n )}\r\n {structures &&\r\n structures[selectedLayer] &&\r\n this.props.aiUsedStructures.map(\r\n (struct, idx) =>\r\n struct.structureName &&\r\n tools[\"iam_ai_inference\"] &&\r\n structures[selectedLayer].label ===\r\n struct.structureName &&\r\n structures[selectedLayer].id === struct.id &&\r\n this.checkToolInConfig(\"OtherTools\") &&\r\n !show3DViewer && (\r\n \r\n {\r\n onChangeTool(\r\n activeTool === \"iam_ai_inference\"\r\n ? Tools.NONE\r\n : \"iam_ai_inference\",\r\n {\r\n selectedModel: struct.selectedModel,\r\n selectedVersion: struct.selectedVersion,\r\n }\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )\r\n )}\r\n \r\n )}\r\n\r\n {false &&\r\n this.checkToolInConfig(\"PassiveLearningTool\") &&\r\n !show3DViewer &&\r\n showGallery &&\r\n !this.props.alruns && (\r\n \r\n this.onStartTraining()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"ApplyModelTool\") &&\r\n !show3DViewer &&\r\n !showGallery &&\r\n !this.props.alruns && (\r\n \r\n this.ApplyModel()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"SaveImagesTool\") &&\r\n !show3DViewer &&\r\n showGallery &&\r\n !this.props.alruns && (\r\n \r\n this.onSaveImages(true)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n {this.checkToolInConfig(\"SaveImagesTool\") &&\r\n !show3DViewer &&\r\n showGallery &&\r\n !this.props.alruns && (\r\n \r\n this.onSaveImages(false)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n
\r\n \r\n
\r\n {\r\n this.bottomElement = bottomElement;\r\n }}\r\n >\r\n {!showGallery && !showTilesGallery && !show3DViewer ? (\r\n
\r\n {this.checkToolInConfig(\"CommentTool\") && (\r\n \r\n \r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.COMMENT_ROI\r\n ? Tools.NONE\r\n : Tools.COMMENT_ROI\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.props.showFullscreen && (\r\n \r\n this.props.onToggleOverlay()}\r\n size=\"large\"\r\n >\r\n {this.props.showOverlay ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"LandmarkTool\") && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.LANDMARK\r\n ? Tools.NONE\r\n : Tools.LANDMARK\r\n )\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {this.props.showFullscreen && this.props.showOverlay && (\r\n \r\n this.props.onToggleWindowTool()}\r\n size=\"large\"\r\n >\r\n {this.props.showWindowTool ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n {this.checkToolInConfig(\"ScreenshotTool\") && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n\r\n {this.checkToolInConfig(\"ZoomOriginalTool\") && showZoomLevels && (\r\n \r\n \r\n
1:1
\r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"ZoomOriginalTool\") && showZoomLevels && (\r\n \r\n this.props.onZoomOneToN(0.25)}\r\n size=\"large\"\r\n >\r\n
1:4
\r\n \r\n
\r\n )}\r\n\r\n {this.checkToolInConfig(\"ZoomOriginalTool\") && showZoomLevels && (\r\n \r\n this.props.onZoomOneToN(0.1)}\r\n size=\"large\"\r\n >\r\n
1:10
\r\n \r\n
\r\n )}\r\n\r\n {this.checkToolInConfig(\"ZoomFitTool\") && showZoomLevels && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"ZoomInOutTool\") && showZoomLevels && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {this.checkToolInConfig(\"ZoomInOutTool\") && showZoomLevels && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n\r\n {this.checkToolInConfig(\"SaveTool\") && showToggleSideBar && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n\r\n {showUndoRedo && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {showUndoRedo && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.checkToolInConfig(\"SaveTool\") && showSaveTool && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n ) : (\r\n
\r\n \r\n {this.checkToolInConfig(\"SaveTool\") &&\r\n showToggleSideBar &&\r\n !show3DViewer && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n {this.checkToolInConfig(\"SaveTool\") &&\r\n showSaveTool &&\r\n !show3DViewer && (\r\n \r\n this.saveProject()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n
\r\n )}\r\n
\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nVerticalToolBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n verticalToolBarWidth: PropTypes.number,\r\n viewerConfig: PropTypes.object,\r\n structures: PropTypes.array,\r\n // change view layout\r\n onToggleTimeBar: PropTypes.func,\r\n showTimeBar: PropTypes.bool,\r\n displayTimeBar: PropTypes.bool,\r\n onToggleMiniMap: PropTypes.func,\r\n showObjectIdx: PropTypes.bool,\r\n showMiniMap: PropTypes.bool,\r\n onToggleScaleBar: PropTypes.func,\r\n showScaleBar: PropTypes.bool,\r\n showGallery: PropTypes.bool,\r\n show3DViewer: PropTypes.bool,\r\n showPointCloud: PropTypes.bool,\r\n onToggleZStackBar: PropTypes.func,\r\n showZStackBar: PropTypes.bool,\r\n displayZStackBar: PropTypes.bool,\r\n onToggleImageInfo: PropTypes.func,\r\n onToggleResultTable: PropTypes.func,\r\n showImageInfo: PropTypes.bool,\r\n showZoomBar: PropTypes.bool,\r\n onToggleGallery: PropTypes.func,\r\n // tools\r\n onChangeTool: PropTypes.func,\r\n activeTool: PropTypes.string,\r\n // change layer\r\n selectedLayer: PropTypes.number,\r\n // screenshot functions\r\n onSaveScreenshot: PropTypes.func,\r\n // zoom functions\r\n onZoomOriginal: PropTypes.func,\r\n onZoomOneToN: PropTypes.func,\r\n onZoomDelta: PropTypes.func,\r\n onZoomFit: PropTypes.func,\r\n // toggle Sidebar\r\n onToggleSideBar: PropTypes.func,\r\n // save changes\r\n onSave: PropTypes.func,\r\n resizeSideBar: PropTypes.func,\r\n // from withTiles\r\n tiles: PropTypes.object,\r\n updateToolBarWidth: PropTypes.func,\r\n isImporting: PropTypes.bool,\r\n //not ordered\r\n project: PropTypes.object,\r\n spinloader: PropTypes.object,\r\n setAlruns: PropTypes.func,\r\n roiLayers: PropTypes.array,\r\n saveChangesGallery: PropTypes.func,\r\n projectId: PropTypes.string,\r\n fileId: PropTypes.string,\r\n trainingWarning: PropTypes.func,\r\n applyDL: PropTypes.func,\r\n tools: PropTypes.array,\r\n persistentStorage: PropTypes.object,\r\n projectContext: PropTypes.object,\r\n onToggle3DViewer: PropTypes.func,\r\n onToggleMeshView: PropTypes.func,\r\n showTilesGallery: PropTypes.bool,\r\n projectHistory: PropTypes.object,\r\n ome: PropTypes.object,\r\n activeTab: PropTypes.number,\r\n rendererRef: PropTypes.object,\r\n setGalleryTool: PropTypes.func,\r\n changeToSelectedFile: PropTypes.func,\r\n onToggleTilesGallery: PropTypes.func,\r\n splitscreenCount: PropTypes.number,\r\n onToggleFullscreen: PropTypes.func,\r\n showFullscreen: PropTypes.bool,\r\n resultTab: PropTypes.object,\r\n alruns: PropTypes.bool,\r\n onToggleOverlay: PropTypes.func,\r\n showOverlay: PropTypes.bool,\r\n onToggleWindowTool: PropTypes.func,\r\n showWindowTool: PropTypes.bool,\r\n filesGalleryActive: PropTypes.bool,\r\n aiUsedStructures: PropTypes.array,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withTiles(withResultTab(withStyles(styles)(VerticalToolBar)))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport MUIDataTable from \"mui-datatables\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n dataTable: {\r\n boxShadow: \"none !important\",\r\n \"& .MuiTableSortLabel-active\": {\r\n height: \"auto !important\",\r\n },\r\n },\r\n});\r\n\r\nconst handleRowClick = () => {\r\n // console.log(rowData, rowMeta);\r\n};\r\n\r\nconst columns = [\r\n {\r\n name: \"name\",\r\n label: \"Name\",\r\n options: {\r\n filter: true,\r\n sort: false,\r\n },\r\n },\r\n {\r\n name: \"structure\",\r\n label: \"Structure\",\r\n options: {\r\n filter: true,\r\n sort: false,\r\n },\r\n },\r\n {\r\n name: \"datetime\",\r\n label: \"Date created\",\r\n options: {\r\n filter: true,\r\n sort: true,\r\n },\r\n },\r\n {\r\n name: \"validationloss\",\r\n label: \"Validation Loss\",\r\n options: {\r\n filter: false,\r\n sort: true,\r\n },\r\n },\r\n {\r\n name: \"validationmiou\",\r\n label: \"Validation Mean IoU\",\r\n options: {\r\n filter: false,\r\n sort: true,\r\n },\r\n },\r\n {\r\n name: \"epochs\",\r\n label: \"Epochs\",\r\n options: {\r\n filter: false,\r\n sort: true,\r\n },\r\n },\r\n {\r\n name: \"trainingObjectsCount\",\r\n label: \"Object Count\",\r\n options: {\r\n filter: false,\r\n sort: true,\r\n },\r\n },\r\n {\r\n name: \"modelType\",\r\n label: \"Model Type\",\r\n options: {\r\n filter: false,\r\n sort: true,\r\n },\r\n },\r\n];\r\n\r\nclass AIModelDialogTable extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n selected: [],\r\n };\r\n }\r\n\r\n render() {\r\n const { data, classes } = this.props;\r\n\r\n const options = {\r\n sortOrder: {\r\n name: \"datetime\",\r\n direction: \"desc\",\r\n },\r\n filter: true,\r\n filterType: \"dropdown\",\r\n print: false,\r\n download: false,\r\n responsive: \"standard\",\r\n rowsSelected: this.props.rowsSelected,\r\n selectToolbarPlacement: \"none\",\r\n draggableColumns: {\r\n enabled: true,\r\n },\r\n tableBodyMaxHeight: \"auto\",\r\n onRowSelectionChange: (currentRowsSelected) => {\r\n let selectedObject = this.props.rowsSelected;\r\n if (currentRowsSelected[0] != null && currentRowsSelected.length < 2) {\r\n if (!selectedObject.includes(currentRowsSelected[0].dataIndex)) {\r\n selectedObject.push(currentRowsSelected[0].dataIndex);\r\n } else {\r\n var index = selectedObject.indexOf(\r\n currentRowsSelected[0].dataIndex\r\n );\r\n if (index > -1) {\r\n selectedObject.splice(index, 1);\r\n }\r\n }\r\n } else selectedObject = [];\r\n this.props.handleSelectedAIModels(selectedObject);\r\n if (selectedObject.length > 0) {\r\n this.props.handleAddButton(false);\r\n } else this.props.handleAddButton(true);\r\n },\r\n onRowClick: handleRowClick,\r\n textLabels: {\r\n body: {\r\n noMatch: \"Sorry, no matching AIModels found\",\r\n toolTip: \"Sort\",\r\n columnHeaderTooltip: (column) => `Sort for ${column.label}`,\r\n },\r\n pagination: {\r\n next: \"Next Page\",\r\n previous: \"Previous Page\",\r\n rowsPerPage: \"Rows per page:\",\r\n displayRows: \"of\",\r\n },\r\n toolbar: {\r\n search: \"Search\",\r\n downloadCsv: \"Download CSV\",\r\n print: \"Print\",\r\n viewColumns: \"View Columns\",\r\n filterTable: \"Filter Table\",\r\n },\r\n filter: {\r\n all: \"All\",\r\n title: \"Filters\",\r\n reset: \"Reset\",\r\n },\r\n viewColumns: {\r\n title: \"Show Columns\",\r\n titleAria: \"Show/Hide Table Columns\",\r\n },\r\n selectedRows: {\r\n text: \"row(s) selected\",\r\n delete: \"Delete\",\r\n deleteAria: \"Delete Selected Rows\",\r\n },\r\n },\r\n };\r\n\r\n return (\r\n x.verified != true)\r\n .map((row) => {\r\n return {\r\n name: row.name,\r\n structure: row.versions[0] ? row.versions[0].structure : \"-\",\r\n validationloss:\r\n row.versions[0] && row.versions[0].validationloss !== 1\r\n ? row.versions[0].validationloss\r\n : \"-\",\r\n validationmiou:\r\n row.versions[0] && row.versions[0].validationmeaniou !== 1\r\n ? row.versions[0].validationmeaniou\r\n : \"-\",\r\n trainingObjectsCount: row.versions[0]\r\n ? row.versions[0].trainingobjectscount\r\n : \"-\",\r\n epochs:\r\n row.versions[0] && row.versions[0].epochs !== 0\r\n ? row.versions[0].epochs\r\n : \"-\",\r\n datetime: row.versions[0] ? row.versions[0].datetime : \"-\",\r\n modelType: row.versions[0] ? row.versions[0].modeltype : \"-\",\r\n };\r\n })}\r\n columns={columns}\r\n options={options}\r\n />\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nAIModelDialogTable.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n data: PropTypes.array,\r\n rowsSelected: PropTypes.array,\r\n handleSelectedAIModels: PropTypes.func,\r\n handleAddButton: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(AIModelDialogTable);\r\n","import React, { Component } from \"react\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport Slide from \"@mui/material/Slide\";\r\nimport {\r\n MenuItem,\r\n Select,\r\n InputLabel,\r\n Grid,\r\n FormControlLabel,\r\n Checkbox,\r\n Tooltip,\r\n FormControl,\r\n} from \"@mui/material\";\r\nimport AddCircleOutlineIcon from \"@mui/icons-material/AddCircleOutline\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport Draggable from \"react-draggable\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport AIModelDialogTable from \"../components/AIModelDialogTable\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport PropTypes from \"prop-types\";\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n selectContent: {\r\n \"& .MuiSelect-root\": {\r\n minWidth: \"200px\",\r\n width: \"auto\",\r\n },\r\n },\r\n dialogContent: {\r\n overflowY: \"hidden\",\r\n minHeight: \"100%\",\r\n },\r\n gridContent: {\r\n padding: \"30px\",\r\n },\r\n tableDialog: {\r\n \"& .MuiPaper-root\": {\r\n maxWidth: \"none\",\r\n },\r\n },\r\n modelSelectionContainer: {},\r\n addCustomAIModelButton: {\r\n textAlign: \"left\",\r\n cursor: \"pointer\",\r\n margin: 15,\r\n },\r\n addCustomAIModelText: {\r\n fontWeight: \"bold\",\r\n position: \"relative\",\r\n marginLeft: 10,\r\n top: 2,\r\n },\r\n modelInformationContainer: {\r\n height: \"100%\",\r\n },\r\n});\r\n\r\nfunction PaperComponent(props) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst Transition = React.forwardRef(function Transition(props, ref) {\r\n return ;\r\n});\r\n\r\nclass AIModelDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n open: false,\r\n selectedAIModels: [],\r\n addButtonDisabled: true,\r\n existingAIModels: [],\r\n selectedModel: null,\r\n selectedModelIdx: null,\r\n selectedModelSourcepath: undefined,\r\n selectedVersion: null,\r\n trainExistingModel: false,\r\n modelsInitialized: false,\r\n };\r\n this.data = [];\r\n }\r\n\r\n handleSelectedAIModels = (value) => {\r\n this.setState({ selectedAIModels: value });\r\n };\r\n\r\n handleAddButton = (value) => {\r\n this.setState({ addButtonDisabled: value });\r\n };\r\n\r\n render() {\r\n const { classes, dialog } = this.props;\r\n const existingAIModels = this.state.existingAIModels;\r\n\r\n const handleClickOpen = () => {\r\n this.setState({ open: true });\r\n Backend.getModelMetadata(\"unverified_models\", false, (result) => {\r\n this.data = result;\r\n this.setState({\r\n modelsInitialized: true,\r\n });\r\n this.forceUpdate();\r\n });\r\n };\r\n\r\n const handleClickOpenExistingModels = () => {\r\n if (!this.state.trainExistingModel) {\r\n this.setState({\r\n open: true,\r\n trainExistingModel: !this.state.trainExistingModel,\r\n });\r\n this.setState({ existingAIModels: this.props.existingAIModels });\r\n } else\r\n this.setState({ trainExistingModel: !this.state.trainExistingModel });\r\n };\r\n\r\n const handleSelectModel = (event) => {\r\n let selectedVersion = null;\r\n if (existingAIModels.aiModels[event.target.value - 1].versions)\r\n selectedVersion =\r\n existingAIModels.aiModels[event.target.value - 1].versions.slice(\r\n -1\r\n )[0].label;\r\n this.setState({\r\n selectedModel: event.target.value,\r\n selectedVersion: selectedVersion,\r\n });\r\n };\r\n\r\n const handleSelectVersion = (event) => {\r\n this.setState({ selectedVersion: event.target.value });\r\n };\r\n\r\n const handleClose = (e) => {\r\n if (this.state.selectedModel == null) {\r\n this.setState({ trainExistingModel: false });\r\n }\r\n this.setState({ open: false });\r\n e.preventDefault();\r\n this.setState({ selectedAIModels: [], addButtonDisabled: true });\r\n };\r\n\r\n const finishAddCustomAIModels = (result) => {\r\n console.log(\"finishAddCustomAIModels()\", result);\r\n this.setState({ selectedAIModels: [], addButtonDisabled: true });\r\n if (result.successful) {\r\n window.showSuccessSnackbar(result.information);\r\n this.props.initAIFormData(false);\r\n } else window.showErrorSnackbar(result.information);\r\n };\r\n\r\n const handleAdd = (e) => {\r\n this.setState({ open: false });\r\n e.preventDefault();\r\n this.customAIModelsAdded = 0;\r\n for (let i = 0; i < this.state.selectedAIModels.length; i++) {\r\n var selectedAiModel = this.data.filter((x) => x.verified != true)[\r\n this.state.selectedAIModels[i]\r\n ];\r\n var aiModel = {\r\n sourcepath: selectedAiModel.versions[0]\r\n ? selectedAiModel.versions[0].sourcepath\r\n : \"-\",\r\n name: selectedAiModel.name,\r\n };\r\n Backend.addCustomAIModels(\r\n JSON.stringify(aiModel),\r\n finishAddCustomAIModels\r\n );\r\n }\r\n };\r\n\r\n const handleRemove = (e) => {\r\n e.preventDefault();\r\n window.openResponseDialog(\r\n \"Delete the models permanently?\",\r\n (response) => {\r\n if (response) {\r\n for (let i = 0; i < this.state.selectedAIModels.length; i++) {\r\n Backend.deleteCustomAIModels(\r\n this.data[this.state.selectedAIModels[i]].name,\r\n () => {\r\n this.setState({\r\n selectedAIModels: [],\r\n addButtonDisabled: true,\r\n });\r\n this.forceUpdate();\r\n }\r\n );\r\n Backend.getModelMetadata(\"unverified_models\", false, (result) => {\r\n this.data = result.filter((x) => x.verified != true);\r\n this.setState({\r\n modelsInitialized: true,\r\n });\r\n this.forceUpdate();\r\n });\r\n }\r\n }\r\n }\r\n );\r\n };\r\n\r\n // send selected exisiting model to AITrainingTool.jsx (parent)\r\n const handleAddExistingModel = (e) => {\r\n let selectedModelInformation = [\r\n this.state.existingAIModels.aiModels[this.state.selectedModel - 1]\r\n .label,\r\n this.state.selectedVersion,\r\n ];\r\n\r\n Backend.getSelectedModelSourcepath(selectedModelInformation, (value) => {\r\n this.props.setSelectedExistingModel(value);\r\n });\r\n handleClose(e);\r\n };\r\n\r\n return (\r\n
\r\n {dialog === \"AIDataTable\" && (\r\n
\r\n \r\n \r\n \r\n Add Custom AI Model\r\n \r\n
\r\n \r\n \r\n Custom Trained AI Models\r\n \r\n \r\n \r\n Select the previously trained AI Model\r\n \r\n \r\n {this.state.modelsInitialized ? (\r\n \r\n ) : (\r\n \r\n \r\n
\r\n )}\r\n \r\n \r\n \r\n Remove\r\n \r\n \r\n Add\r\n \r\n \r\n \r\n \r\n )}\r\n {dialog === \"AISelectExistingModel\" && (\r\n
\r\n \r\n \r\n
\r\n \r\n }\r\n label=\"Train existing model\"\r\n />\r\n
\r\n \r\n
\r\n \r\n \r\n AI Models\r\n \r\n \r\n \r\n Select an existing model and version to initialize them for\r\n further training.\r\n \r\n \r\n\r\n \r\n \r\n Select Model\r\n \r\n \r\n Select Model ...\r\n \r\n {existingAIModels.aiModels &&\r\n existingAIModels.aiModels.map((model, idx) => {\r\n return (\r\n \r\n {model.label}\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n Select Version\r\n \r\n \r\n Select Version ...\r\n \r\n {this.state.selectedModel &&\r\n existingAIModels.aiModels &&\r\n existingAIModels.aiModels.length > 0 &&\r\n existingAIModels.aiModels[\r\n this.state.selectedModel - 1\r\n ].versions.map((version, idx) => (\r\n \r\n {version.label}\r\n \r\n ))}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n Okay\r\n \r\n \r\n \r\n
\r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nAIModelDialog.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n dialog: PropTypes.string,\r\n handleOptionsClose: PropTypes.func,\r\n structures: PropTypes.array,\r\n formDataAICockpit: PropTypes.object,\r\n setAvailableModels: PropTypes.func,\r\n setFormDataAICockpit: PropTypes.func,\r\n initAIFormData: PropTypes.func,\r\n existingAIModels: PropTypes.array,\r\n setSelectedExistingModel: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(AIModelDialog);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport classNames from \"classnames\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n DialogContent,\r\n DialogContentText,\r\n ImageListItem,\r\n ImageListItemBar,\r\n ImageList,\r\n} from \"@mui/material\";\r\n\r\nconst styles = () => ({\r\n dialogContent: {},\r\n images: {\r\n width: \"100%\",\r\n height: \"calc(100% - 36px)\",\r\n objectFit: \"contain\",\r\n },\r\n projectTile: {\r\n cursor: \"pointer\",\r\n padding: 5,\r\n \"&:hover\": {\r\n background: \"#AAA\",\r\n },\r\n },\r\n projectTileSelected: {\r\n background: \"#1BA1E2!important\",\r\n },\r\n tileHeadline: {\r\n textAlign: \"center\",\r\n padding: 0,\r\n marginBottom: 4,\r\n lineHeight: \"32px\",\r\n },\r\n imgContainer: {\r\n width: \"100%\",\r\n },\r\n});\r\n\r\nclass TrainModelStep1 extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n render() {\r\n const { classes, formData, viewerConfig } = this.props;\r\n let defaultImages = viewerConfig.project.projectProperties[\r\n \"MedicalAICockpitImages\"\r\n ]\r\n ? false\r\n : true;\r\n\r\n return (\r\n \r\n \r\n
\r\n Choose the model type for your training:\r\n
    \r\n
  • \r\n Classification: assign objects to different\r\n classes\r\n
  • \r\n
  • \r\n Object Detection: detect object and draw\r\n bounding box around it\r\n
  • \r\n
  • \r\n Segmentation: detect object and draw exact\r\n border around object\r\n
  • \r\n
  • \r\n Instance Segmentation: segmentation +\r\n differentiate between touching objects\r\n
  • \r\n
\r\n
\r\n \r\n \r\n \r\n this.props.updateFormDataGeneral(\"modelType\", \"classification\")\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n this.props.updateFormDataGeneral(\"modelType\", \"object detection\")\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n this.props.updateFormDataGeneral(\"modelType\", \"segmentation\")\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n this.props.updateFormDataGeneral(\r\n \"modelType\",\r\n \"instance segmentation\"\r\n )\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nTrainModelStep1.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n name: PropTypes.string,\r\n projectType: PropTypes.string,\r\n onChangeName: PropTypes.func,\r\n onSaveName: PropTypes.func,\r\n availableTypes: PropTypes.array,\r\n onProjectType: PropTypes.func,\r\n preloadedImages: PropTypes.object,\r\n formData: PropTypes.object,\r\n updateFormDataGeneral: PropTypes.func,\r\n viewerConfig: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(TrainModelStep1);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport reactCSS from \"reactcss\";\r\nimport { SketchPicker } from \"react-color\";\r\n\r\nclass SketchColorPicker extends React.Component {\r\n state = {\r\n displayColorPicker: false,\r\n color: \"#ffffff\",\r\n yPosition: 0,\r\n };\r\n\r\n handleClick = (e) => {\r\n let y = e.clientY;\r\n if (window.innerHeight - e.clientY < 330) {\r\n y -= 330;\r\n }\r\n this.setState({\r\n yPosition: y,\r\n displayColorPicker: true,\r\n });\r\n e.stopPropagation();\r\n };\r\n\r\n handleClose = (e) => {\r\n this.setState({ displayColorPicker: false });\r\n e.stopPropagation();\r\n };\r\n\r\n handleChange = (color) => {\r\n this.setState({ color: color.hex });\r\n this.props.handleChange(color.hex);\r\n };\r\n\r\n render() {\r\n const { color } = this.props;\r\n const styles = reactCSS({\r\n pickerContainer: {\r\n position: \"relative\",\r\n },\r\n default: {\r\n color: {\r\n width: \"36px\",\r\n height: \"14px\",\r\n borderRadius: \"2px\",\r\n background: color,\r\n },\r\n swatch: {\r\n padding: \"5px\",\r\n background: \"#fff\",\r\n borderRadius: \"1px\",\r\n boxShadow: \"0 0 0 1px rgba(0,0,0,.1)\",\r\n display: \"inline-block\",\r\n cursor: \"pointer\",\r\n marginTop: 6,\r\n },\r\n popover: {\r\n position: \"fixed\",\r\n zIndex: \"2\",\r\n right: 0,\r\n marginRight: \"10px\",\r\n },\r\n cover: {\r\n position: \"fixed\",\r\n top: \"0px\",\r\n right: \"0px\",\r\n bottom: \"0px\",\r\n left: \"0px\",\r\n },\r\n },\r\n });\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n {this.state.displayColorPicker ? (\r\n \r\n
\r\n \r\n
\r\n ) : null}\r\n
\r\n );\r\n }\r\n}\r\n\r\nSketchColorPicker.propTypes = {\r\n color: PropTypes.string,\r\n handleChange: PropTypes.func,\r\n};\r\n\r\nexport default SketchColorPicker;\r\n","import { calcBoundingBox, simplifyRegions } from \"../utils/PolygonUtil\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport * as turf from \"@turf/turf\";\r\n\r\n// Base class of a roi\r\nexport class BaseROI {\r\n constructor() {\r\n this.strokeColor = \"green\";\r\n this.fillColor = null;\r\n }\r\n}\r\n\r\nexport class CommentROI {\r\n constructor(regions, color, type, commentValue, computedValue) {\r\n this.inverted = false;\r\n this.fontScaleFactor = 1;\r\n this.regions = regions;\r\n this.color = color;\r\n this.type = type;\r\n this.commentValue = commentValue;\r\n this.computedValue = computedValue;\r\n this.updateBounds();\r\n }\r\n\r\n updateBounds() {\r\n this.bounds = calcBoundingBox([this.regions]);\r\n this.width = this.bounds.right - this.bounds.left;\r\n this.height = this.bounds.bottom - this.bounds.top;\r\n }\r\n\r\n containsPoint(p) {\r\n return !(\r\n p.x < this.bounds.left ||\r\n p.x > this.bounds.right ||\r\n p.y < this.bounds.top ||\r\n p.y > this.bounds.bottom\r\n );\r\n }\r\n}\r\n\r\n// polygon roi\r\nexport class RegionROI {\r\n isObject = false;\r\n constructor(obj) {\r\n this.setRegions(obj.regions ? obj.regions : obj);\r\n //this.regions = bufferSimplifyRegions(this.regions); //simplify old regions with small gap\r\n this.uuid = uuidv4();\r\n this.inverted = false;\r\n\r\n this.center = {\r\n x: this.bounds.left + (this.bounds.right - this.bounds.left) / 2,\r\n y: this.bounds.top + (this.bounds.bottom - this.bounds.top) / 2,\r\n };\r\n this.borderColor = \"4px solid white\";\r\n\r\n this.isSubtype = obj.subtype\r\n ? obj.subtype\r\n : obj.isSubtype\r\n ? obj.isSubtype\r\n : false;\r\n this.color = obj.color1 ? obj.color1 : obj.color ? obj.color : \"#FFFFFF\";\r\n this.subtypeName = obj.name\r\n ? obj.name\r\n : obj.subtypeName\r\n ? obj.subtypeName\r\n : \"\";\r\n this.aiAnnotated = obj.ai\r\n ? obj.ai\r\n : obj.aiAnnotated\r\n ? obj.aiAnnotated\r\n : false;\r\n this.isAnnotated = obj.annotated\r\n ? obj.annotated\r\n : obj.isAnnotated\r\n ? obj.isAnnotated\r\n : false;\r\n this.isLabeled = obj.labeled\r\n ? obj.labeled\r\n : obj.isLabeled\r\n ? obj.isLabeled\r\n : false;\r\n this.isSelObj = obj.isSel ? obj.isSel : obj.isSelObj ? obj.isSelObj : false;\r\n this.isSaved = obj.saved ? obj.saved : obj.isSaved ? obj.isSaved : false;\r\n this.z = obj.z ? obj.z : -1;\r\n this.fullyLoaded = obj.fullyLoaded ? obj.fullyLoaded : false;\r\n this.comment = obj.comment ? obj.comment : \"\";\r\n this.tileName = obj.tileName ? obj.tileName : \"\";\r\n this.structureId = obj.structureId ? obj.structureId : 0;\r\n this.selected = obj.selected ? obj.selected : false;\r\n this.selectedWithKey = obj.selectedWithKey ? obj.selectedWithKey : false;\r\n this.frequencyClass = obj.frequencyClass ? obj.frequencyClass : -1;\r\n this.isObject = obj.isObject ? obj.isObject : false;\r\n if (this.regions[0].length > 5) this.isObject = false; //can not be object\r\n\r\n this.isStartData = false;\r\n this.aiIdx = 0;\r\n this.galleryIndex = null;\r\n this.firstTimeGallery = true;\r\n\r\n this.treeItem = {\r\n minX: this.bounds.left,\r\n minY: this.bounds.top,\r\n maxX: this.bounds.right,\r\n maxY: this.bounds.bottom,\r\n roi: this,\r\n };\r\n }\r\n\r\n copy = () => {\r\n let roiCopy = new RegionROI(this);\r\n roiCopy.regions = JSON.parse(JSON.stringify(this.regions)); // [...this.regions];\r\n roiCopy.uuid = this.uuid;\r\n roiCopy.color = this.color;\r\n roiCopy.isSubtype = this.isSubtype;\r\n roiCopy.isAnnotated = this.isAnnotated;\r\n roiCopy.subtypeName = this.subtypeName;\r\n roiCopy.structureId = this.structureId;\r\n roiCopy.isLabeled = this.isLabeled;\r\n roiCopy.isSelObj = this.isSelObj;\r\n roiCopy.aiAnnotated = this.aiAnnotated;\r\n return roiCopy;\r\n };\r\n\r\n getPointOnPoly() {\r\n let poly = turf.polygon(this.regions);\r\n var pointOnPolygon = turf.centerOfMass(poly);\r\n return {\r\n x: pointOnPolygon.geometry.coordinates[0],\r\n y: pointOnPolygon.geometry.coordinates[1],\r\n };\r\n }\r\n\r\n /** Create turf region for coordinate set.\r\n *\r\n * @param {Array} regions Regions to be edited. Must have format [[[x,y], ..., [x,y]]]\r\n */\r\n setRegions(regions) {\r\n try {\r\n // Allow redundant styles of nesting\r\n if (typeof regions[0][0] === \"number\") {\r\n regions = [regions];\r\n } else if (typeof regions[0][0][0] === \"number\") {\r\n // regions = regions; -> Do nothing\r\n } else {\r\n regions = regions[0];\r\n }\r\n\r\n // use less float digits\r\n for (let region of regions) {\r\n for (let point of region) {\r\n point[0] = +point[0].toFixed(2);\r\n point[1] = +point[1].toFixed(2);\r\n }\r\n }\r\n\r\n for (let region of regions) {\r\n if (\r\n region[0][0] !== region[region.length - 1][0] ||\r\n region[0][1] !== region[region.length - 1][1]\r\n ) {\r\n region.push(region[0]);\r\n }\r\n }\r\n this.bounds = calcBoundingBox(regions);\r\n try {\r\n let poly = turf.polygon(regions);\r\n let converted = turf.toWgs84(poly);\r\n this.area = turf.area(converted);\r\n } catch (e) {\r\n this.area = -1;\r\n }\r\n if (this.area < 0) {\r\n this.area =\r\n (this.bounds.right - this.bounds.left) *\r\n (this.bounds.bottom - this.bounds.top);\r\n }\r\n\r\n this.regions = regions; // simplifyRegions(regions, 0.01);\r\n } catch {\r\n console.log(\"Error, regions could not be set:\", regions);\r\n }\r\n }\r\n\r\n removeDuplicates(inputRegions) {\r\n for (let regions of inputRegions) {\r\n let resultRegions = [];\r\n if (regions.length > 2) {\r\n regions.push(regions[0]);\r\n let resultRegions = [regions[0]];\r\n for (let i = 1; i < regions.length; i++) {\r\n let p1 = regions[i - 1];\r\n let p2 = regions[i];\r\n let isEqual = p1[0] === p2[0] && p1[1] === p2[1];\r\n if (!isEqual) {\r\n resultRegions.push(p2);\r\n }\r\n }\r\n }\r\n inputRegions = resultRegions;\r\n }\r\n return inputRegions;\r\n }\r\n\r\n getRectRegions() {\r\n return [\r\n [\r\n [this.bounds.left, this.bounds.top],\r\n [this.bounds.right, this.bounds.top],\r\n [this.bounds.right, this.bounds.bottom],\r\n [this.bounds.left, this.bounds.bottom],\r\n [this.bounds.left, this.bounds.top],\r\n ],\r\n ];\r\n }\r\n\r\n getSimplifiedRectRegions() {\r\n return [\r\n [\r\n [parseInt(this.bounds.left, 10), parseInt(this.bounds.top, 10)],\r\n [parseInt(this.bounds.right, 10), parseInt(this.bounds.top, 10)],\r\n [parseInt(this.bounds.right, 10), parseInt(this.bounds.bottom, 10)],\r\n [parseInt(this.bounds.left, 10), parseInt(this.bounds.bottom, 10)],\r\n [parseInt(this.bounds.left, 10), parseInt(this.bounds.top, 10)],\r\n ],\r\n ];\r\n }\r\n\r\n //return regions, so that rendering is still fast\r\n getDynamicRegions(comp, numObjects) {\r\n if (comp > 0.001 || numObjects < 100) {\r\n //if big, return original\r\n return this.regions;\r\n }\r\n\r\n if (comp < 0.00005) {\r\n //if very small return rectangles (bounding box)\r\n return this.getSimplifiedRectRegions();\r\n } else if (typeof this.intRegions === \"undefined\") {\r\n //else return rounded polygon\r\n this.intRegions = this.regions.map((regions) => {\r\n return regions.map((p) => [parseInt(p[0], 10), parseInt(p[1], 10)]);\r\n });\r\n }\r\n\r\n if (comp < 0.0005) {\r\n if (typeof this.simplifyedRegions === \"undefined\") {\r\n this.simplifyedRegions = simplifyRegions(this.intRegions, 1);\r\n }\r\n return this.simplifyedRegions;\r\n }\r\n return this.intRegions;\r\n }\r\n\r\n intersects(p1, p2) {\r\n return !(\r\n p2.x < this.bounds.left ||\r\n p1.x > this.bounds.right ||\r\n p2.y < this.bounds.top ||\r\n p1.y > this.bounds.bottom\r\n );\r\n }\r\n\r\n boundsAreaCompare(p1, p2) {\r\n let pArea = Math.abs(p2.x - p1.x) * Math.abs(p2.y - p1.y);\r\n let b = this.bounds;\r\n let area = Math.abs(b.right - b.left) * Math.abs(b.bottom - b.top);\r\n return area / pArea;\r\n }\r\n}\r\n\r\n// simple recatangle roi\r\nexport class RectROI extends BaseROI {\r\n constructor(ctx, x, y, w, h, drawingMode = false) {\r\n super();\r\n this.x = x;\r\n this.y = y;\r\n this.w = w;\r\n this.h = h;\r\n this.ctx = ctx;\r\n if (drawingMode) {\r\n this.resizePoint = 3;\r\n }\r\n }\r\n\r\n summary() {\r\n return (\r\n \"Rect (\" +\r\n Math.round(this.x) +\r\n \",\" +\r\n Math.round(this.y) +\r\n \",\" +\r\n Math.round(this.w) +\r\n \",\" +\r\n Math.round(this.h) +\r\n \")\"\r\n );\r\n }\r\n\r\n handleMouseDown(p1) {\r\n let cornerRadius = 5 / this.ctx.getTransform().a;\r\n if (\r\n p1.x >= this.x - cornerRadius &&\r\n p1.x <= this.x + cornerRadius &&\r\n p1.y >= this.y - cornerRadius &&\r\n p1.y <= this.y + cornerRadius\r\n ) {\r\n this.resizePoint = 0;\r\n return 2;\r\n } else if (\r\n p1.x >= this.x + this.w - cornerRadius &&\r\n p1.x <= this.x + this.w + cornerRadius &&\r\n p1.y >= this.y - cornerRadius &&\r\n p1.y <= this.y + cornerRadius\r\n ) {\r\n this.resizePoint = 1;\r\n return 2;\r\n } else if (\r\n p1.x >= this.x - cornerRadius &&\r\n p1.x <= this.x + cornerRadius &&\r\n p1.y >= this.y + this.h - cornerRadius &&\r\n p1.y <= this.y + this.h + cornerRadius\r\n ) {\r\n this.resizePoint = 2;\r\n return 2;\r\n } else if (\r\n p1.x >= this.x + this.w - cornerRadius &&\r\n p1.x <= this.x + this.w + cornerRadius &&\r\n p1.y >= this.y + this.h - cornerRadius &&\r\n p1.y <= this.y + this.h + cornerRadius\r\n ) {\r\n this.resizePoint = 3;\r\n return 2;\r\n } else if (\r\n p1.x >= this.x &&\r\n p1.x <= this.x + this.w &&\r\n p1.y >= this.y &&\r\n p1.y <= this.y + this.h\r\n ) {\r\n this.dragStart = p1;\r\n return 1;\r\n }\r\n }\r\n\r\n handleMouseMove(p1) {\r\n let cornerRadius = 5 / this.ctx.getTransform().a;\r\n if (\r\n p1.x >= this.x - cornerRadius &&\r\n p1.x <= this.x + cornerRadius &&\r\n p1.y >= this.y - cornerRadius &&\r\n p1.y <= this.y + cornerRadius\r\n ) {\r\n this.ctx.canvas.style.cursor = \"se-resize\";\r\n this.hovered = true;\r\n } else if (\r\n p1.x >= this.x + this.w - cornerRadius &&\r\n p1.x <= this.x + this.w + cornerRadius &&\r\n p1.y >= this.y - cornerRadius &&\r\n p1.y <= this.y + cornerRadius\r\n ) {\r\n this.ctx.canvas.style.cursor = \"ne-resize\";\r\n this.hovered = true;\r\n } else if (\r\n p1.x >= this.x - cornerRadius &&\r\n p1.x <= this.x + cornerRadius &&\r\n p1.y >= this.y + this.h - cornerRadius &&\r\n p1.y <= this.y + this.h + cornerRadius\r\n ) {\r\n this.ctx.canvas.style.cursor = \"ne-resize\";\r\n this.hovered = true;\r\n } else if (\r\n p1.x >= this.x + this.w - cornerRadius &&\r\n p1.x <= this.x + this.w + cornerRadius &&\r\n p1.y >= this.y + this.h - cornerRadius &&\r\n p1.y <= this.y + this.h + cornerRadius\r\n ) {\r\n this.ctx.canvas.style.cursor = \"se-resize\";\r\n this.hovered = true;\r\n } else if (\r\n p1.x >= this.x &&\r\n p1.x <= this.x + this.w &&\r\n p1.y >= this.y &&\r\n p1.y <= this.y + this.h\r\n ) {\r\n if (this.ctx.canvas.style.cursor === \"default\") {\r\n this.ctx.canvas.style.cursor = \"pointer\";\r\n }\r\n this.hovered = true;\r\n } else {\r\n this.hovered = false;\r\n }\r\n }\r\n\r\n handleMouseUp() {\r\n // heal rois (fix negative width and height)\r\n if (this.w < 0) {\r\n this.x += this.w;\r\n this.w = -this.w;\r\n }\r\n if (this.h < 0) {\r\n this.y += this.h;\r\n this.h = -this.h;\r\n }\r\n }\r\n\r\n drag(p1, vw, vh) {\r\n // apply relative movement\r\n this.x += p1.x - this.dragStart.x;\r\n this.y += p1.y - this.dragStart.y;\r\n\r\n // check if out of image bounds\r\n this.x = Math.max(Math.min(vw - this.w, this.x), 0);\r\n this.y = Math.max(Math.min(vh - this.h, this.y), 0);\r\n\r\n // save cursor position\r\n this.dragStart = p1;\r\n }\r\n\r\n resize(p1, vw, vh) {\r\n // check if out of image bounds\r\n p1.x = Math.max(Math.min(vw, p1.x), 0);\r\n p1.y = Math.max(Math.min(vh, p1.y), 0);\r\n\r\n if (this.resizePoint === 0) {\r\n this.w -= p1.x - this.x;\r\n this.x = p1.x;\r\n this.h -= p1.y - this.y;\r\n this.y = p1.y;\r\n\r\n if ((this.w > 0 && this.h > 0) || (this.w < 0 && this.h < 0)) {\r\n this.ctx.canvas.style.cursor = \"se-resize\";\r\n } else {\r\n this.ctx.canvas.style.cursor = \"ne-resize\";\r\n }\r\n } else if (this.resizePoint === 1) {\r\n this.w += p1.x - this.w - this.x;\r\n this.h -= p1.y - this.y;\r\n this.y = p1.y;\r\n\r\n if ((this.w > 0 && this.h > 0) || (this.w < 0 && this.h < 0)) {\r\n this.ctx.canvas.style.cursor = \"ne-resize\";\r\n } else {\r\n this.ctx.canvas.style.cursor = \"se-resize\";\r\n }\r\n } else if (this.resizePoint === 2) {\r\n this.w -= p1.x - this.x;\r\n this.x = p1.x;\r\n this.h += p1.y - this.h - this.y;\r\n\r\n if ((this.w > 0 && this.h > 0) || (this.w < 0 && this.h < 0)) {\r\n this.ctx.canvas.style.cursor = \"ne-resize\";\r\n } else {\r\n this.ctx.canvas.style.cursor = \"se-resize\";\r\n }\r\n } else if (this.resizePoint === 3) {\r\n this.w += p1.x - this.w - this.x;\r\n this.h += p1.y - this.h - this.y;\r\n\r\n if ((this.w > 0 && this.h > 0) || (this.w < 0 && this.h < 0)) {\r\n this.ctx.canvas.style.cursor = \"se-resize\";\r\n } else {\r\n this.ctx.canvas.style.cursor = \"ne-resize\";\r\n }\r\n }\r\n }\r\n\r\n draw() {\r\n this.ctx.strokeStyle = this.strokeColor;\r\n\r\n if (this.hovered) this.ctx.strokeStyle = \"yellow\";\r\n\r\n // fixed line width\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n\r\n // custom drawing\r\n this.ctx.beginPath();\r\n this.ctx.rect(this.x, this.y, this.w, this.h);\r\n this.ctx.stroke();\r\n this.ctx.closePath();\r\n\r\n if (this.hovered) {\r\n this.ctx.lineWidth = 1 / this.ctx.getTransform().a;\r\n let cornerDiameter = 10 / this.ctx.getTransform().a;\r\n let cornerRadius = 5 / this.ctx.getTransform().a;\r\n\r\n this.ctx.fillStyle = \"white\";\r\n this.ctx.strokeStyle = \"black\";\r\n\r\n // draw corner haptic\r\n this.ctx.beginPath();\r\n this.ctx.rect(\r\n this.x - cornerRadius,\r\n this.y - cornerRadius,\r\n cornerDiameter,\r\n cornerDiameter\r\n );\r\n this.ctx.rect(\r\n this.x + this.w - cornerRadius,\r\n this.y - cornerRadius,\r\n cornerDiameter,\r\n cornerDiameter\r\n );\r\n this.ctx.rect(\r\n this.x - cornerRadius,\r\n this.y + this.h - cornerRadius,\r\n cornerDiameter,\r\n cornerDiameter\r\n );\r\n this.ctx.rect(\r\n this.x + this.w - cornerRadius,\r\n this.y + this.h - cornerRadius,\r\n cornerDiameter,\r\n cornerDiameter\r\n );\r\n this.ctx.fill();\r\n this.ctx.stroke();\r\n this.ctx.closePath();\r\n }\r\n }\r\n}\r\n\r\nfunction getFirstValidatedIndexValue(item, index) {\r\n if (item && item[index] && item[index].length > 0) {\r\n return item[index][0];\r\n } else {\r\n return item;\r\n }\r\n}\r\n\r\nexport function createRoisFromAnno(anno) {\r\n return anno.geoJSON.coordinates\r\n .filter((c) => c.length > 0)\r\n .map((c, index) => {\r\n const r = new RegionROI({\r\n regions: c,\r\n color1: getFirstValidatedIndexValue(anno.geoJSON.color1, index),\r\n subtype: getFirstValidatedIndexValue(anno.geoJSON.subtype, index),\r\n name: getFirstValidatedIndexValue(anno.geoJSON.name, index),\r\n ai: getFirstValidatedIndexValue(anno.geoJSON.aiAnnotated, index),\r\n annotated: getFirstValidatedIndexValue(anno.geoJSON.isAnnotated, index),\r\n labeled: getFirstValidatedIndexValue(anno.geoJSON.isLabeled, index),\r\n isSel: getFirstValidatedIndexValue(anno.geoJSON.isSelObj, index),\r\n saved: getFirstValidatedIndexValue(anno.geoJSON.isSaved, index),\r\n z: getFirstValidatedIndexValue(anno.geoJSON.z, index),\r\n comment: getFirstValidatedIndexValue(anno.geoJSON.comment, index),\r\n tileName: getFirstValidatedIndexValue(anno.geoJSON.tileName, index),\r\n structureId: getFirstValidatedIndexValue(\r\n anno.geoJSON.structureId,\r\n index\r\n ),\r\n isObject: getFirstValidatedIndexValue(anno.geoJSON.isObject, index),\r\n frequencyCl: getFirstValidatedIndexValue(anno.geoJSON.frequencyClass),\r\n });\r\n return r;\r\n });\r\n}\r\n","import PolyBool from \"polybooljs\";\r\n\r\nimport { RegionROI } from \"./ROI\";\r\nimport * as turf from \"@turf/turf\";\r\n//import { booleanIntersects, difference, simplify } from \"@turf/turf\";\r\n// use old turf library, since new turf lib breaks GeoJSON coordinates when buffering\r\nimport { buffer } from \"turf\";\r\n\r\n//default: 0.0000000001\r\nPolyBool.epsilon(0.0000000001);\r\n\r\nexport function lineArrayBuffer(lineArray, radius, vw, vh) {\r\n if (lineArray.length === 1) {\r\n lineArray = [lineArray[0], lineArray[0]];\r\n }\r\n let feature =\r\n lineArray.length > 1 ? turf.lineString(lineArray) : turf.point(lineArray);\r\n let buffered = buffer(feature, radius * 110);\r\n let viewRect = turf.bboxPolygon([0, 0, vw, vh]);\r\n let result = null;\r\n try {\r\n result = turf.intersect(buffered, viewRect);\r\n } catch {\r\n console.log(\"pen tool error:\", buffered, viewRect);\r\n return null;\r\n }\r\n return result;\r\n}\r\n\r\nexport function circleToPolygon(center, radius, numberOfSegments) {\r\n let n = numberOfSegments ? numberOfSegments : 32;\r\n let coordinates = [];\r\n\r\n for (let i = 0; i < n; ++i) {\r\n coordinates.push([\r\n center[0] + radius * Math.cos((2 * Math.PI * i) / n),\r\n center[1] + radius * Math.sin((2 * Math.PI * i) / n),\r\n ]);\r\n }\r\n\r\n return {\r\n regions: [coordinates],\r\n inverted: false,\r\n };\r\n}\r\n\r\nexport function distance(p1, p2) {\r\n let deltaX = p1.x - p2.x;\r\n let deltaY = p1.y - p2.y;\r\n return Math.sqrt(deltaX * deltaX + deltaY * deltaY);\r\n}\r\n\r\nexport function pointsToCirclePolygon(p1, p2, numberOfSegments, vw, vh) {\r\n let n = numberOfSegments ? numberOfSegments : 32;\r\n let center = {\r\n x: (p1.x + p2.x) / 2,\r\n y: (p1.y + p2.y) / 2,\r\n };\r\n let dist = distance(p1, center);\r\n let coordinates = [];\r\n let x = center.x - dist;\r\n let y = center.y - dist;\r\n let w = 2 * dist;\r\n let h = 2 * dist;\r\n\r\n for (let i = 0; i < n; ++i) {\r\n let point = [\r\n x + w / 2 + (w / 2) * Math.cos((2 * Math.PI * i) / n),\r\n y + h / 2 + (h / 2) * Math.sin((2 * Math.PI * i) / n),\r\n ];\r\n point[0] = Math.max(0, point[0]);\r\n point[1] = Math.max(0, point[1]);\r\n point[0] = Math.min(vw, point[0]);\r\n point[1] = Math.min(vh, point[1]);\r\n coordinates.push(point);\r\n }\r\n\r\n return {\r\n regions: [coordinates],\r\n inverted: false,\r\n };\r\n}\r\n\r\nexport function rectangleToEllipyePolygon(x, y, w, h, numberOfSegments) {\r\n let n = numberOfSegments ? numberOfSegments : 32;\r\n let coordinates = [];\r\n\r\n for (let i = 0; i < n; ++i) {\r\n coordinates.push([\r\n x + w / 2 + (w / 2) * Math.cos((2 * Math.PI * i) / n),\r\n y + h / 2 + (h / 2) * Math.sin((2 * Math.PI * i) / n),\r\n ]);\r\n }\r\n\r\n return {\r\n regions: [coordinates],\r\n inverted: false,\r\n };\r\n}\r\n\r\nexport function lineToPolygon(start, stop, width) {\r\n let coordinates = [];\r\n\r\n let normalVector = [-(stop[1] - start[1]), stop[0] - start[0]];\r\n\r\n let normalVectorLength = Math.sqrt(\r\n normalVector[0] * normalVector[0] + normalVector[1] * normalVector[1]\r\n );\r\n normalVector[0] /= normalVectorLength;\r\n normalVector[1] /= normalVectorLength;\r\n\r\n coordinates.push([\r\n start[0] + (normalVector[0] * width) / 2,\r\n start[1] + (normalVector[1] * width) / 2,\r\n ]);\r\n coordinates.push([\r\n stop[0] + (normalVector[0] * width) / 2,\r\n stop[1] + (normalVector[1] * width) / 2,\r\n ]);\r\n coordinates.push([\r\n stop[0] - (normalVector[0] * width) / 2,\r\n stop[1] - (normalVector[1] * width) / 2,\r\n ]);\r\n coordinates.push([\r\n start[0] - (normalVector[0] * width) / 2,\r\n start[1] - (normalVector[1] * width) / 2,\r\n ]);\r\n\r\n return {\r\n regions: [coordinates],\r\n inverted: false,\r\n };\r\n}\r\n\r\nexport function simplifyRegions(regions, tolerance) {\r\n let poly = turf.polygon(regions);\r\n let simplifiedPoly = regions;\r\n try {\r\n simplifiedPoly = turf.simplify(poly, {\r\n tolerance: tolerance,\r\n highQuality: false,\r\n });\r\n } catch (e) {\r\n return regions;\r\n }\r\n\r\n return simplifiedPoly.geometry.coordinates;\r\n}\r\n\r\nexport function bufferSimplifyRegions(regions) {\r\n let poly = turf.polygon(regions);\r\n poly = buffer(poly, -5);\r\n if (poly.geometry.coordinates[0].length === 0) return regions;\r\n let simplifiedPoly = turf.simplify(poly, {\r\n tolerance: 0.05,\r\n highQuality: false,\r\n });\r\n return simplifiedPoly.geometry.coordinates;\r\n}\r\n\r\nexport function calcBoundingBox(region) {\r\n if (region.length === 0) {\r\n // region is empty\r\n return { left: 0, top: 0, right: 0, bottom: 0 };\r\n }\r\n let rect = {\r\n left: region[0][region[0].length - 1][0],\r\n top: region[0][region[0].length - 1][1],\r\n right: region[0][region[0].length - 1][0],\r\n bottom: region[0][region[0].length - 1][1],\r\n };\r\n for (let p of region[0]) {\r\n if (p[0] < rect.left) rect.left = p[0];\r\n if (p[0] > rect.right) rect.right = p[0];\r\n if (p[1] < rect.top) rect.top = p[1];\r\n if (p[1] > rect.bottom) rect.bottom = p[1];\r\n }\r\n return rect;\r\n}\r\n\r\nexport function getTreeItem(regions) {\r\n let bounds = calcBoundingBox(regions);\r\n return {\r\n minX: bounds.left,\r\n minY: bounds.top,\r\n maxX: bounds.right,\r\n maxY: bounds.bottom,\r\n used: false,\r\n regions: regions[0],\r\n };\r\n}\r\n\r\nexport function calcBoundingBoxes(layer) {\r\n let rects = [];\r\n for (let roi of layer.regionRois) {\r\n let region = roi.region;\r\n if (region[region.length - 1]) {\r\n rects.push(calcBoundingBox(region));\r\n }\r\n }\r\n return rects;\r\n}\r\n\r\nexport function intersectRect(r1, r2) {\r\n return !(\r\n r2.left >= r1.right ||\r\n r2.right <= r1.left ||\r\n r2.top >= r1.bottom ||\r\n r2.bottom <= r1.top\r\n );\r\n}\r\n\r\nexport function pointInsidePoly(p, polyPoints) {\r\n let x = p.x,\r\n y = p.y;\r\n let intersections = 0;\r\n let ss = \"\";\r\n for (let i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {\r\n let xi = polyPoints[i][0],\r\n yi = polyPoints[i][1];\r\n let xj = polyPoints[j][0],\r\n yj = polyPoints[j][1];\r\n if (yj === yi && yj === y && x > Math.min(xj, xi) && x < Math.max(xj, xi)) {\r\n // Check if point is on an horizontal polygon boundary\r\n return true;\r\n }\r\n\r\n if (\r\n y > Math.min(yj, yi) &&\r\n y <= Math.max(yj, yi) &&\r\n x <= Math.max(xj, xi) &&\r\n yj !== yi\r\n ) {\r\n ss = ((y - yj) * (xi - xj)) / (yi - yj) + xj;\r\n if (ss === x) {\r\n // Check if point is on the polygon boundary (other than horizontal)\r\n return true;\r\n }\r\n if (xj === xi || x <= ss) {\r\n intersections++;\r\n }\r\n }\r\n }\r\n // If the number of edges we passed through is odd, then it’s in the polygon.\r\n if (intersections % 2 !== 0) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nexport function pointInsideRegion(p, region) {\r\n let turfPoint = turf.point([p.x, p.y]);\r\n let turfPoly = turf.polygon([region]);\r\n return !turf.booleanDisjoint(turfPoly, turfPoint);\r\n}\r\n\r\nexport function pointInside(p, regionRoi) {\r\n let turfPoint = turf.point([p.x, p.y]);\r\n let turfPoly = turf.polygon(regionRoi.regions);\r\n return !turf.booleanDisjoint(turfPoly, turfPoint);\r\n}\r\n\r\nexport function boundsInside(b, regionRoi) {\r\n let points = [\r\n { x: b.left, y: b.top },\r\n { x: b.right, y: b.top },\r\n { x: b.right, y: b.bottom },\r\n { x: b.left, y: b.bottom },\r\n ];\r\n let returnValue = true;\r\n for (let p of points) {\r\n if (!pointInside(p, regionRoi)) returnValue = false;\r\n }\r\n return returnValue;\r\n}\r\n\r\n// if one poly intersects or is inside other poly\r\nexport function hasIntersection(regionRoi1, regionRoi2) {\r\n let poly1 = turf.polygon(regionRoi1.regions);\r\n let poly2 = turf.polygon(regionRoi2.regions);\r\n return !turf.booleanDisjoint(poly1, poly2);\r\n}\r\n\r\nexport function intersects(regionRoi1, regionRoi2) {\r\n let poly1 = turf.polygon(regionRoi1.regions[0]);\r\n let poly2 = turf.polygon(regionRoi2.regions[0]);\r\n return turf.booleanIntersects(poly1, poly2);\r\n}\r\n\r\nexport function filterInvalidRegions(layer) {\r\n let result = layer.regionRois.filter(\r\n (roi) => roi.regions[roi.regions.length - 1]\r\n );\r\n layer.regionRois = result;\r\n}\r\n\r\nexport function getIntersections(regionRois1, regionRois2) {\r\n let regions1 = regionRois1.map((roi) => roi.regions);\r\n let regions2 = regionRois2.map((roi) => roi.regions);\r\n\r\n let poly1 = turf.multiPolygon(regions1);\r\n let poly2 = turf.multiPolygon(regions2);\r\n let intersection = turf.intersect(poly1, poly2);\r\n return intersection;\r\n}\r\nfunction findIndexById(structures, id) {\r\n return structures.findIndex((structure) => structure.id === id);\r\n}\r\nexport function findSameLayer(structures, selectedLayer) {\r\n let defaultParentIndex = selectedLayer === 0 ? -1 : 0;\r\n let parentLayerId = structures[selectedLayer].parentId;\r\n while (structures[selectedLayer].classificationSubtype) {\r\n selectedLayer = findIndexById(structures, parentLayerId);\r\n parentLayerId = structures[selectedLayer].parentId;\r\n }\r\n let parentIndex = structures.findIndex(\r\n (structure) => structure.id === structures[selectedLayer].parentId\r\n );\r\n return [selectedLayer, parentIndex < 0 ? defaultParentIndex : parentIndex];\r\n}\r\n\r\nexport function findSiblingRoiLayers(structures, selectedLayer, roiLayers) {\r\n let overlapRoiLayers = [];\r\n let parentLayerId = structures[selectedLayer].parentId;\r\n for (let i = 1; i < structures.length; i++) {\r\n if (\r\n selectedLayer !== i &&\r\n structures[i].parentId === parentLayerId &&\r\n structures[i].visible\r\n ) {\r\n if (roiLayers[i].layer.regionRois.length > 0) {\r\n overlapRoiLayers.push(roiLayers[i]);\r\n }\r\n }\r\n }\r\n return overlapRoiLayers;\r\n}\r\n\r\n/**\r\n * Check if structure is hidden when starting drawing and if so unhide it\r\n * @param {*} structures reference on this.structures needed! No copy!\r\n * @param {*} selectedLayer index of selected structure\r\n * @param {*}\r\n */\r\nexport function checkIfStructureHidden(\r\n structures,\r\n selectedLayer,\r\n isSubtype,\r\n name,\r\n color\r\n) {\r\n // set baseRoi to visible\r\n structures[0].visible = true;\r\n\r\n // if subtype get correct selectedLayer\r\n if (isSubtype) {\r\n selectedLayer = structures.findIndex(\r\n (structure) => structure.label === name && structure.color === color\r\n );\r\n }\r\n if (!structures[selectedLayer].visible) {\r\n window.showWarningSnackbar(\"Unhiding drawing structure\");\r\n structures[selectedLayer].visible = true;\r\n }\r\n let parentId = structures[selectedLayer].parentId;\r\n while (parentId !== 0) {\r\n // unhide all subtypes with same parent structure\r\n for (let idx in structures) {\r\n if (structures[idx].parentId === parentId) {\r\n if (!structures[idx].visible) {\r\n structures[idx].visible = true;\r\n }\r\n }\r\n }\r\n // unhide parent structure\r\n for (let structure of structures) {\r\n if (structure.id === parentId) {\r\n if (!structure.visible) {\r\n structure.visible = true;\r\n }\r\n parentId = structure.parentId;\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Filter only relevant Regions from given rois\r\n * @param {*} tree search tree\r\n * @param {*} rois ROI used as filter using Bounding Box\r\n * @returns [largestROI, reducedLayerRegions]\r\n */\r\nexport function getTreeRegionsFromRois(tree, rois) {\r\n let reducedLayerRois = [];\r\n for (let regionRoi of rois) {\r\n tree\r\n .search(regionRoi.treeItem)\r\n .filter((treeItem) => treeItem.roi.isObject === false)\r\n .forEach((treeItem) => {\r\n const index = reducedLayerRois.findIndex(\r\n (roi) => roi.uuid === treeItem.roi.uuid\r\n );\r\n if (index === -1) {\r\n reducedLayerRois.push(treeItem.roi);\r\n }\r\n });\r\n }\r\n return [\r\n reducedLayerRois[0],\r\n reducedLayerRois.map((roi) => roi.regions),\r\n reducedLayerRois,\r\n ];\r\n}\r\n\r\n/**\r\n * find smallest region\r\n * @param {*} p mouse position\r\n * @param {*} selectedLayer this.selectedLayer\r\n * @param {*} structures this.structures\r\n * @param {*} roiLayers this.roiLayers\r\n * @param {boolean} includeBaseROI this.includeBaseROI\r\n * @returns {[]} region polygon or false if none was found\r\n */\r\nexport function findRegion(\r\n p,\r\n selectedLayer,\r\n structures,\r\n roiLayers,\r\n includeBaseROI\r\n) {\r\n if (\r\n structures[selectedLayer].visible &&\r\n (includeBaseROI || !structures[selectedLayer].inversed)\r\n ) {\r\n let smallestRoi = null;\r\n for (let roi of roiLayers[selectedLayer].layer.regionRois) {\r\n if (pointInside(p, roi)) {\r\n if (smallestRoi === null || roi.area < smallestRoi.area) {\r\n smallestRoi = roi;\r\n }\r\n }\r\n }\r\n if (smallestRoi !== null) return smallestRoi;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * find clicked on ROI\r\n * @param {*} p mouse position\r\n * @param {*} selectedLayer this.selectedLayer\r\n * @param {*} structures this.structures\r\n * @param {*} roiLayers this.roiLayers\r\n * @param {boolean} includeBaseROI this.includeBaseROI\r\n * @returns {[]} region polygon or false if none was found\r\n */\r\nexport function findClickedRoi(\r\n p,\r\n selectedLayer,\r\n structures,\r\n roiLayers,\r\n includeBaseROI\r\n) {\r\n if (\r\n structures[selectedLayer].visible &&\r\n (includeBaseROI || !structures[selectedLayer].inversed)\r\n ) {\r\n let overlapTreeItems = roiLayers[selectedLayer].tree.search({\r\n minX: parseInt(p.x, 10),\r\n minY: parseInt(p.y, 10),\r\n maxX: parseInt(p.x, 10),\r\n maxY: parseInt(p.y, 10),\r\n });\r\n for (let treeItem of overlapTreeItems) {\r\n if (pointInside(p, treeItem.roi)) {\r\n return treeItem.roi;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/** Find all ROIs of a layer present at a certain location.\r\n *\r\n * @param {Object} p (Mouse) position {x: , y: }\r\n * @param {Int} selectedLayer The id of the selected layer.\r\n * @param {Array} structures Structures of the project.\r\n * @param {Array} roiLayers The layers containing all ROIs.\r\n * @param {Bool} includeBaseROI Whether or not to include the Base ROI.\r\n * @returns {Object} The ROI object found.\r\n * @returns {Bool} If no ROI is found, returns false.\r\n */\r\nexport function findClickedBounds(\r\n p,\r\n selectedLayer,\r\n structures,\r\n roiLayers,\r\n includeBaseROI\r\n) {\r\n if (\r\n structures[selectedLayer].visible &&\r\n (includeBaseROI || !structures[selectedLayer].inversed)\r\n ) {\r\n let overlapTreeItems = roiLayers[selectedLayer].tree.search({\r\n minX: parseInt(p.x, 10),\r\n minY: parseInt(p.y, 10),\r\n maxX: parseInt(p.x, 10),\r\n maxY: parseInt(p.y, 10),\r\n });\r\n for (let treeItem of overlapTreeItems) {\r\n return treeItem.roi;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if layer.regionRoi corresponse to Roi in overlapRegionRoi\r\n * @param {*} overlapRegionRois Regions that are overlapping with draw region\r\n * @param {ROI} checkRegion ROI of object.layer to be checked if the same as overlapRegionRois\r\n * @returns {boolean} true if is Hole, false if is outside\r\n */\r\nexport function isInRegionRois(overlapRegionRois, checkRegion) {\r\n let inRegionRois = false;\r\n\r\n for (let region of overlapRegionRois.regions) {\r\n if (\r\n region.find(\r\n (point) =>\r\n point[0] === checkRegion.regions[0][0] &&\r\n point[1] === checkRegion.regions[0][1]\r\n )\r\n ) {\r\n if (\r\n region.find(\r\n (point) =>\r\n point[0] === checkRegion.regions[1][0] &&\r\n point[1] === checkRegion.regions[1][1]\r\n )\r\n ) {\r\n inRegionRois = true;\r\n return inRegionRois;\r\n }\r\n }\r\n }\r\n\r\n return inRegionRois;\r\n}\r\n\r\n/**\r\n * generate overlapRegionRois based on GeoJson logic without the region (incl holes) that was clicked on\r\n * @param {*} reducedLayerRegionsGeoJson geoJson polygon/multipolygon\r\n * @param {*} clickedOnRegion (opt.) regions of clicked on ROI\r\n * @returns [overlapPolygon, clickedOnPolygon]\r\n */\r\nexport function generateOverlapRegionRois(\r\n reducedLayerRegionsGeoJson,\r\n clickedOnRegion\r\n) {\r\n let overlapPolygon = {\r\n inverted: false,\r\n regions: [],\r\n };\r\n let clickedOnPolygon = {\r\n inverted: false,\r\n regions: [],\r\n };\r\n\r\n if (reducedLayerRegionsGeoJson.coordinates.length > 0) {\r\n if (reducedLayerRegionsGeoJson[\"type\"] === \"Polygon\") {\r\n let clickIsOnPolygon = false;\r\n if (clickedOnRegion) {\r\n if (\r\n reducedLayerRegionsGeoJson[\"coordinates\"][0].find(\r\n (point) =>\r\n point[0] === clickedOnRegion[0][0] &&\r\n point[1] === clickedOnRegion[0][1]\r\n )\r\n ) {\r\n if (\r\n reducedLayerRegionsGeoJson[\"coordinates\"][0].find(\r\n (point) =>\r\n point[0] === clickedOnRegion[1][0] &&\r\n point[1] === clickedOnRegion[1][1]\r\n )\r\n ) {\r\n clickIsOnPolygon = true;\r\n }\r\n }\r\n }\r\n let tmpPoly = {\r\n inverted: false,\r\n regions: reducedLayerRegionsGeoJson[\"coordinates\"],\r\n };\r\n if (clickIsOnPolygon) {\r\n clickedOnPolygon = tmpPoly;\r\n } else {\r\n overlapPolygon = tmpPoly;\r\n }\r\n } else {\r\n for (let polygon of reducedLayerRegionsGeoJson[\"coordinates\"]) {\r\n let clickIsOnPolygon = false;\r\n if (clickedOnRegion) {\r\n if (\r\n polygon[0].find(\r\n (point) =>\r\n point[0] === clickedOnRegion[0][0] &&\r\n point[1] === clickedOnRegion[0][1]\r\n )\r\n ) {\r\n if (\r\n polygon[0].find(\r\n (point) =>\r\n point[0] === clickedOnRegion[1][0] &&\r\n point[1] === clickedOnRegion[1][1]\r\n )\r\n ) {\r\n clickIsOnPolygon = true;\r\n }\r\n }\r\n }\r\n if (clickIsOnPolygon) {\r\n clickedOnPolygon.regions = [...clickedOnPolygon.regions, ...polygon];\r\n } else {\r\n overlapPolygon.regions = [...overlapPolygon.regions, ...polygon];\r\n }\r\n }\r\n }\r\n }\r\n return [overlapPolygon, clickedOnPolygon];\r\n}\r\n\r\n/**\r\n * generate regions that intersect with drawRegion based on GeoJson logic\r\n * @param {{ type: String, coordinates: any }} reducedLayerRegionsGeoJson geoJson polygon/multipolygon\r\n * @param {[]} drawRegion region others have to intersect with\r\n * @returns overlapRegionRois\r\n */\r\nexport function getIntersectingRegions(reducedLayerRegionsGeoJson, drawRegion) {\r\n let poly = [];\r\n if (drawRegion.length === 1) drawRegion = drawRegion[0];\r\n let poly1 = turf.polygon([drawRegion]);\r\n\r\n if (reducedLayerRegionsGeoJson[\"type\"] === \"Polygon\") {\r\n if (reducedLayerRegionsGeoJson[\"coordinates\"].length > 0) {\r\n let poly2 = turf.polygon(reducedLayerRegionsGeoJson.coordinates[0]);\r\n\r\n if (turf.booleanIntersects(poly1, poly2)) {\r\n poly.push({\r\n regions: reducedLayerRegionsGeoJson.coordinates\r\n ? reducedLayerRegionsGeoJson.coordinates\r\n : [],\r\n inverted: false,\r\n });\r\n }\r\n } else {\r\n poly.push({\r\n regions: reducedLayerRegionsGeoJson.coordinates\r\n ? reducedLayerRegionsGeoJson.coordinates\r\n : [],\r\n inverted: false,\r\n });\r\n }\r\n } else {\r\n for (let regions of reducedLayerRegionsGeoJson.coordinates) {\r\n let poly2 = {\r\n type: \"Feature\",\r\n properties: {},\r\n geometry: {\r\n type: \"Polygon\",\r\n coordinates: regions[0],\r\n },\r\n };\r\n if (turf.booleanIntersects(poly1, poly2)) {\r\n poly.push({\r\n regions: regions,\r\n inverted: false,\r\n });\r\n }\r\n }\r\n }\r\n return poly;\r\n}\r\n\r\n/**\r\n * before further analysis remove holes from drawRegion\r\n * -> uses buffer of 1\r\n * @param {*} drawRegion in GeoJson format\r\n * @returns drawRegion without holes\r\n */\r\nexport function getExterior(drawRegion) {\r\n // custom index filter to get duplicated points\r\n function getIndexOf(a, arr) {\r\n for (let i = 0; i < arr.length; i++) {\r\n let el = arr[i];\r\n if (el[0] === a[0] && el[1] === a[1]) return i;\r\n }\r\n return -1;\r\n }\r\n\r\n try {\r\n drawRegion.regions[0] = drawRegion.regions[0].filter(\r\n (a, i, arr) => getIndexOf(a, arr) === i\r\n );\r\n let drawRegionGeoJson = PolyBool.polygonToGeoJSON(drawRegion);\r\n\r\n if (drawRegionGeoJson.coordinates.length !== 0) {\r\n drawRegionGeoJson = buffer(drawRegionGeoJson, 1).geometry;\r\n let drawRegionWithoutHoles = {\r\n inverted: false,\r\n regions: [],\r\n };\r\n if (drawRegionGeoJson.type === \"Polygon\") {\r\n drawRegionWithoutHoles.regions.push(drawRegionGeoJson.coordinates[0]);\r\n } else {\r\n for (let regions of drawRegionGeoJson.coordinates) {\r\n drawRegionWithoutHoles.regions.push(regions[0]);\r\n }\r\n }\r\n drawRegion = drawRegionWithoutHoles;\r\n }\r\n } catch {\r\n console.log(\"Error in getExterior, returning empty regions instead!\");\r\n drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n }\r\n\r\n return drawRegion;\r\n}\r\n\r\n// /**\r\n// * Get all regions and Rois that overlap with drawing region and the largest included area based on the provided rTree\r\n// * @param {*} tree rTree with all relevant ROIs\r\n// * @param {*} drawRegionRois drawn region that should be used as baseline\r\n// * @returns [reducedLayerRegions, reducedLayerRegionRois] which contain all regions/ROIs that are relevant for the drawn region\r\n// */\r\n// function getOverlapRegionsAndRois(tree, drawRegionRois) {\r\n// let reducedLayerRegions = [];\r\n// let reducedLayerRegionRois = [];\r\n// if (tree) {\r\n// // get all Regions that overlap with drawRegion\r\n// let tmpResult = getTreeRegionsFromRois(tree, drawRegionRois);\r\n// reducedLayerRegions = tmpResult[1];\r\n// reducedLayerRegionRois = tmpResult[2];\r\n// }\r\n// return [reducedLayerRegions, reducedLayerRegionRois];\r\n// }\r\n\r\nfunction getTreeItemsFromRois(tree, regionRois) {\r\n let reducedLayerRegionRois = [];\r\n if (tree) {\r\n for (let roi of regionRois) {\r\n tree.search(roi.treeItem).forEach((treeItem) => {\r\n let idx = reducedLayerRegionRois.findIndex(\r\n (r) => r.uuid === treeItem.roi.uuid\r\n );\r\n if (idx < 0) reducedLayerRegionRois.push(treeItem.roi);\r\n });\r\n }\r\n }\r\n return reducedLayerRegionRois;\r\n}\r\n\r\n/**\r\n * Generates difference Regions and Informations to account for subtypes when deleting (using turf)\r\n * @param {*} overlapItems overlapping tree items\r\n * @param {*} transformResult turf.difference() result\r\n * @returns differenceRegionsInfo - corresponding Info\r\n */\r\nfunction differenceRegionsAndInfo(overlapItems, transformResult) {\r\n let differenceRegionsInfo = [];\r\n\r\n transformResult = transformResult ? transformResult : turf.multiPolygon([]);\r\n if (transformResult.geometry.type === \"Polygon\") {\r\n transformResult = turf.multiPolygon([transformResult.geometry.coordinates]);\r\n }\r\n\r\n for (let poly of transformResult.geometry.coordinates) {\r\n differenceRegionsInfo.push({\r\n name: null,\r\n color: null,\r\n subtype: null,\r\n structureId: null,\r\n });\r\n let segDiff = turf.polygon(poly);\r\n for (let idxRoi in overlapItems) {\r\n let segGeoJSON = turf.polygon(overlapItems[idxRoi].regions);\r\n if (!turf.booleanDisjoint(segDiff, segGeoJSON)) {\r\n let idxRegionsInfo = differenceRegionsInfo.length - 1;\r\n differenceRegionsInfo[idxRegionsInfo].name =\r\n overlapItems[idxRoi].subtypeName;\r\n differenceRegionsInfo[idxRegionsInfo].color =\r\n overlapItems[idxRoi].color;\r\n differenceRegionsInfo[idxRegionsInfo].subtype =\r\n overlapItems[idxRoi].isSubtype;\r\n differenceRegionsInfo[idxRegionsInfo].structureId =\r\n overlapItems[idxRoi].structureId;\r\n break;\r\n }\r\n }\r\n }\r\n return differenceRegionsInfo;\r\n}\r\n\r\n// /**\r\n// * custom GeoJSON converter to throw that sees them all as outer Polygons\r\n// * TODO: Add efficient way to detect wholes\r\n// * @param {*} reducedLayerRegions\r\n// * @returns\r\n// */\r\n// function customGeoJsonConverter(reducedLayerRegions) {\r\n// let resultGeoJSON = {\r\n// coordinates: [],\r\n// };\r\n// if (reducedLayerRegions.length === 0) {\r\n// resultGeoJSON.type = \"Polygon\";\r\n// } else if (reducedLayerRegions.length === 1) {\r\n// resultGeoJSON.type = \"Polygon\";\r\n// resultGeoJSON.coordinates = reducedLayerRegions;\r\n// } else {\r\n// resultGeoJSON.type = \"MultiPolygon\";\r\n// for (let reducedLayerRegion of reducedLayerRegions) {\r\n// resultGeoJSON.coordinates.push([reducedLayerRegion]);\r\n// }\r\n// }\r\n// return resultGeoJSON;\r\n// }\r\n\r\n// function checkIfExists(value) {\r\n// return value ? value : null;\r\n// }\r\n\r\n// /**\r\n// * checks object for needed parameters and if not exists, set to null\r\n// * @param {*} object original object to check\r\n// * @returns object with all entries\r\n// */\r\n// function checkObject(object) {\r\n// object = {\r\n// layer: checkIfExists(object.layer),\r\n// drawRegion: checkIfExists(object.drawRegion),\r\n// clear: checkIfExists(object.clear),\r\n// color: checkIfExists(object.color),\r\n// subtype: checkIfExists(object.subtype),\r\n// name: checkIfExists(object.name),\r\n// tree: checkIfExists(object.tree),\r\n// positionInRoiLayer: checkIfExists(object.positionInRoiLayer),\r\n// fullyLoaded: checkIfExists(object.fullyLoaded),\r\n// overlap: checkIfExists(object.overlap),\r\n// parentLayer: checkIfExists(object.parentLayer),\r\n// structureId: checkIfExists(object.structureId),\r\n// overlapRoiLayers: checkIfExists(object.overlapRoiLayers),\r\n// clickedOnRegion: checkIfExists(object.clickedOnRegion),\r\n// convert: checkIfExists(object.convert),\r\n// };\r\n// return object;\r\n// }\r\n\r\n/** Updates the objects currently being drawn.\r\n *\r\n * @param {Object} layer Structure being edited {regionRois: [], inverted: Bool}\r\n * @param {Object} drawRegion Objects inside the structure: {regions: [[x:, y: ], ...], inverted: Bool}\r\n * @param {Bool} clear Delete mode?\r\n * @param {String} color Color of the currently selected structure (#012DEF)\r\n * @param {Bool} subtype Whether or not the annotation is a subtype.\r\n * @param {String} name Name of the structure.\r\n */\r\nexport function updateDrawLayer(\r\n layer,\r\n drawRegion,\r\n clear,\r\n color,\r\n subtype,\r\n name\r\n) {\r\n // drawRegionRois -> region that was clicked on\r\n let drawRegionRois = drawRegion.regions.map((regions) => {\r\n return new RegionROI({\r\n regions: regions,\r\n color1: color,\r\n subtype: subtype,\r\n name: name,\r\n });\r\n });\r\n let multiLayerRegions = layer.regionRois.map((roi) => roi.regions);\r\n let multiDrawRegions = drawRegionRois.map((roi) => roi.regions);\r\n let transformResult = turf.union(\r\n turf.multiPolygon(multiDrawRegions),\r\n turf.multiPolygon(multiLayerRegions)\r\n );\r\n\r\n layer.regionRois = [];\r\n let coordArray = [];\r\n if (transformResult === null) {\r\n coordArray = [];\r\n } else if (transformResult.geometry.type === \"Polygon\") {\r\n coordArray = [transformResult.geometry.coordinates];\r\n } else {\r\n coordArray = transformResult.geometry.coordinates;\r\n }\r\n for (let coordinates of coordArray) {\r\n let roiToAdd = createRegionRoi(\r\n coordinates,\r\n color,\r\n subtype,\r\n name,\r\n null,\r\n null\r\n );\r\n if (roiToAdd.area > 2) layer.regionRois.push(roiToAdd);\r\n }\r\n}\r\n\r\n/** Creates a ROI object.\r\n *\r\n * @param {Array} regions Array of coordninate arrays: [[x,y], ..., [x,y]]\r\n * @param {String} color #012DEF\r\n * @param {Bool} subtype Is the ROI a subtype or not?\r\n * @param {String} name Name of the object structure, e.g. \"Base ROI\"\r\n * @param {Bool} fullyLoaded\r\n * @param {Int} structureId Id of the objects structure.\r\n * @param {Bool} isObject Is the ROI an object for object detection? Defaults to false.\r\n * @returns\r\n */\r\nexport function createRegionRoi(\r\n regions,\r\n color,\r\n isSubtype,\r\n name,\r\n fullyLoaded,\r\n structureId,\r\n isObject = false\r\n) {\r\n return new RegionROI({\r\n regions: regions,\r\n color1: color,\r\n subtype: isSubtype,\r\n name: name,\r\n fullyLoaded: fullyLoaded,\r\n structureId: structureId,\r\n isObject: isObject,\r\n });\r\n}\r\n\r\nfunction turfPolyToRegionRois(\r\n poly,\r\n color,\r\n isSubtype,\r\n name,\r\n fullyLoaded,\r\n structureId\r\n) {\r\n let coordArray = [];\r\n if (poly === null) {\r\n coordArray = [];\r\n } else if (poly.geometry.type === \"Polygon\") {\r\n coordArray = [poly.geometry.coordinates];\r\n } else {\r\n coordArray = poly.geometry.coordinates;\r\n }\r\n return coordArray.map((coordinates) => {\r\n return createRegionRoi(\r\n coordinates,\r\n color,\r\n isSubtype,\r\n name,\r\n fullyLoaded,\r\n structureId\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Checks if a ROI is inside its parentlayer,\r\n * calculates resulting polygon for overlapping polygons.\r\n *\r\n * @param {Object} layer Structure being edited {regionRois: [], inverted: Bool}\r\n * @param {Object} drawRegion Objects inside the structure: {regions: [RegionROI, ...], inverted: Bool}\r\n * @param {Bool} clear Delete mode?\r\n * @param {String} color Color of the currently selected structure (#012DEF)\r\n * @param {Bool} isSubtype Whether or not the annotation is a subtype.\r\n * @param {String} name Name of the structure.\r\n * @param {rTree} tree R Tree containing structure information of the selected layer\r\n * @param {Bool} positionInRoiLayer Is the object inside a ROI Layer?\r\n * @param {Bool} fullyLoaded\r\n * @param {Bool} overlap\r\n * @param {Object} parentLayer The parent structure as object. Prevents annotations outside of paranet layer.\r\n * @param {Int} structureId The id of the structure.\r\n * @param {Array} overlapRoiLayers List of all ROI Layers, 1 for each struct, substruct and subtypes of the same parent. Depends on the checkboxes set in remove overlaps.\r\n * @param {Object} clickedOnRoi The ROI the user clicked on to begin with, if any.\r\n * @param {Bool} isObject Is this an object detection annotation? Defaults to false.\r\n * @param {Bool} convert (Not used). Whether or not to convert. Defaults to false.\r\n */\r\nexport function updateLayer(\r\n layer,\r\n drawRegion,\r\n clear,\r\n color,\r\n isSubtype,\r\n name,\r\n tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n overlap,\r\n parentLayer,\r\n structureId,\r\n overlapRoiLayers,\r\n clickedOnRoi,\r\n isObject = false\r\n) {\r\n let historyItem = [];\r\n let histId = structureId;\r\n // drawRegionRois -> region that was clicked on\r\n // Creates a Region ROI for the freshly created ROI\r\n let drawRegionRois = [];\r\n for (let regionRoi of drawRegion.regions) {\r\n drawRegionRois.push(regionRoi);\r\n }\r\n\r\n // Extract the regions of the freshly created ROI\r\n let multiDrawRegions = drawRegionRois.map((roi) => roi.regions);\r\n\r\n // Filter with Base ROI and Parent Annotations\r\n if (parentLayer && parentLayer.tree && !clear) {\r\n let parentRegionRois = getTreeItemsFromRois(\r\n parentLayer.tree,\r\n drawRegionRois\r\n );\r\n // Extract the regions of parent regions\r\n let multiParentRegions = parentRegionRois.map((roi) => roi.regions);\r\n\r\n // Check if in parent region\r\n let poly1 = turf.multiPolygon(multiDrawRegions);\r\n poly1 = turf.simplify(poly1, {\r\n tolerance: 0.05,\r\n highQuality: false,\r\n });\r\n let poly2 = turf.multiPolygon(multiParentRegions);\r\n let intersection = turf.intersect(poly1, poly2);\r\n if (intersection) {\r\n multiDrawRegions = turfPolyToRegionRois(\r\n intersection,\r\n color,\r\n isSubtype,\r\n name,\r\n fullyLoaded,\r\n structureId\r\n ).map((roi) => roi.regions);\r\n } else {\r\n multiDrawRegions = [];\r\n window.showWarningSnackbar(\"Can only be drawn inside parent regions.\");\r\n return;\r\n }\r\n }\r\n\r\n // Remove Overlaps, if checkbox is active\r\n if (!clear && overlapRoiLayers && overlapRoiLayers.length > 0) {\r\n for (let overlapRoiLayer of overlapRoiLayers) {\r\n if (overlapRoiLayer.layer.regionRois.length > 0) {\r\n // get all Regions that overlap with drawRegion\r\n if (!isObject && overlapRoiLayer.tree) {\r\n let overlapItems = [];\r\n for (let drawRoi of drawRegionRois) {\r\n let drawPoly = turf.polygon(drawRoi.regions);\r\n overlapRoiLayer.tree\r\n .search(drawRoi.treeItem)\r\n .filter((treeItem) => treeItem.roi.isObject === isObject)\r\n .forEach((treeItem) => {\r\n if (clickedOnRoi && treeItem.roi.uuid === clickedOnRoi.uuid)\r\n return;\r\n let poly = turf.polygon(treeItem.roi.regions);\r\n let isIntersecting = true;\r\n try {\r\n isIntersecting = !turf.booleanDisjoint(poly, drawPoly);\r\n } catch (e) {\r\n console.log(\r\n \"intersection check failed, treeting polygon as intersecting!\"\r\n );\r\n isIntersecting = true;\r\n }\r\n if (isIntersecting) {\r\n overlapItems.push(treeItem.roi);\r\n }\r\n });\r\n }\r\n\r\n let multiLayerRegions = overlapItems.map((roi) => roi.regions);\r\n let transformResult = null;\r\n let poly1 = turf.multiPolygon(multiDrawRegions);\r\n let poly2 = turf.multiPolygon(multiLayerRegions);\r\n transformResult = turf.difference(poly1, poly2);\r\n if (transformResult) {\r\n // Reduce size of ROIs for good measure\r\n transformResult = buffer(transformResult, -10);\r\n if (transformResult.geometry.coordinates[0].length > 0) {\r\n transformResult = turf.simplify(transformResult, {\r\n tolerance: 0.05,\r\n highQuality: false,\r\n });\r\n }\r\n }\r\n\r\n let coordArray = [];\r\n if (transformResult === null) {\r\n coordArray = [];\r\n } else if (transformResult.geometry.type === \"Polygon\") {\r\n coordArray = [transformResult.geometry.coordinates];\r\n } else {\r\n coordArray = transformResult.geometry.coordinates;\r\n }\r\n drawRegionRois = [];\r\n for (let coordinates of coordArray) {\r\n if (coordinates[0].length < 1) continue;\r\n let roiToAdd = createRegionRoi(\r\n coordinates,\r\n color,\r\n isSubtype,\r\n name,\r\n fullyLoaded,\r\n structureId,\r\n isObject\r\n );\r\n if (roiToAdd.area > 2) drawRegionRois.push(roiToAdd);\r\n }\r\n multiDrawRegions = drawRegionRois.map((roi) => roi.regions);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Add objects to structure trees\r\n if (tree) {\r\n let overlapItems = [];\r\n for (let drawRoi of drawRegionRois) {\r\n let drawPoly = turf.polygon(drawRoi.regions);\r\n tree\r\n .search(drawRoi.treeItem)\r\n .filter((treeItem) => treeItem.roi.isObject === isObject)\r\n .forEach((treeItem) => {\r\n // if drawPoly is subtype, filter all annotations that aren't of the same subtype\r\n if (isSubtype && clear) {\r\n overlapItems.push(treeItem.roi);\r\n treeItem.roi.comment = \"\";\r\n tree.remove(treeItem);\r\n historyItem.push({\r\n add: false,\r\n id: histId,\r\n roi: treeItem.roi.copy(),\r\n });\r\n\r\n return;\r\n }\r\n let poly = turf.polygon(treeItem.roi.regions);\r\n let isIntersecting = true;\r\n try {\r\n isIntersecting = !turf.booleanDisjoint(poly, drawPoly);\r\n } catch (e) {\r\n console.log(\r\n \"intersection check failed, treating polygon as intersecting!\"\r\n );\r\n isIntersecting = true;\r\n }\r\n if (isIntersecting) {\r\n overlapItems.push(treeItem.roi);\r\n treeItem.roi.comment = \"\";\r\n tree.remove(treeItem);\r\n historyItem.push({\r\n add: false,\r\n id: structureId,\r\n roi: treeItem.roi.copy(),\r\n });\r\n }\r\n });\r\n //overlapItems.push(drawRoi);\r\n }\r\n let multiLayerRegions = overlapItems.map((roi) => roi.regions);\r\n let transformResult = null;\r\n let transformResultInfo = null;\r\n\r\n // Add a polygon\r\n if (!clear) {\r\n if (isObject) {\r\n // Ensure both the new and the old ROI are included.\r\n // No transformation\r\n multiLayerRegions.forEach((region) => {\r\n multiDrawRegions.push(region);\r\n });\r\n transformResult = turf.multiPolygon(multiDrawRegions);\r\n }\r\n // Non-Object ROI was clicked\r\n // Transform according to settings\r\n else {\r\n let poly1 = turf.multiPolygon(multiDrawRegions);\r\n // No overlapping regions\r\n if (multiLayerRegions.length === 0 && !overlap) {\r\n transformResult = poly1;\r\n }\r\n // Overlapping regions exist\r\n else {\r\n let poly2 = turf.multiPolygon(multiLayerRegions);\r\n try {\r\n transformResult = overlap\r\n ? turf.intersect(poly1, poly2)\r\n : turf.union(poly1, poly2);\r\n } catch (e) {\r\n console.debug(\"Overlap error:\", e);\r\n window.openErrorDialog(\r\n \"Overlap Error!\\n Probably too many objects to compute:\\n\" + e\r\n );\r\n }\r\n }\r\n }\r\n }\r\n // Remove a polygon\r\n else {\r\n if (!isObject) {\r\n if (overlapItems.length <= 100) {\r\n transformResult = turf.difference(\r\n turf.multiPolygon(multiLayerRegions),\r\n turf.multiPolygon(multiDrawRegions)\r\n );\r\n transformResultInfo = differenceRegionsAndInfo(\r\n overlapItems,\r\n transformResult\r\n );\r\n } else {\r\n window.showWarningSnackbar(\r\n \"Too many intersections, \" +\r\n overlapItems.length +\r\n \" objects deleted whole!\"\r\n );\r\n }\r\n }\r\n }\r\n\r\n // The new coordinates of the transformed object\r\n let coordArray = [];\r\n if (transformResult === null) {\r\n coordArray = [];\r\n } else if (transformResult.geometry.type === \"Polygon\") {\r\n coordArray = [transformResult.geometry.coordinates];\r\n } else {\r\n coordArray = transformResult.geometry.coordinates;\r\n }\r\n let firstRoiToAdd = null;\r\n for (let idx in coordArray) {\r\n let roiToAdd = createRegionRoi(\r\n coordArray[idx],\r\n transformResultInfo ? transformResultInfo[idx].color : color,\r\n transformResultInfo ? transformResultInfo[idx].subtype : isSubtype,\r\n transformResultInfo ? transformResultInfo[idx].name : name,\r\n fullyLoaded,\r\n transformResultInfo\r\n ? transformResultInfo[idx].structureId\r\n : structureId,\r\n isObject\r\n );\r\n if (roiToAdd.area > 2) {\r\n if (idx === \"0\") {\r\n firstRoiToAdd = roiToAdd;\r\n }\r\n\r\n tree.insert(roiToAdd.treeItem);\r\n historyItem.push({ add: true, id: histId, roi: roiToAdd });\r\n }\r\n }\r\n layer.regionRois = tree.all().map((treeItem) => treeItem.roi);\r\n if (firstRoiToAdd !== null && positionInRoiLayer >= 0) {\r\n let fromIndex = layer.regionRois.findIndex(\r\n (item) => item.uuid === firstRoiToAdd.uuid\r\n );\r\n arraymove(layer.regionRois, fromIndex, positionInRoiLayer);\r\n }\r\n }\r\n window.projectHistory.add(historyItem);\r\n}\r\n\r\n/**\r\n * Special findRegion function for CopyTools, since they require additional information of the layer\r\n * @param {Object} p mouse position {x:, y: }\r\n * @param {Array} roiLayers The layers containing all ROIs.\r\n * @param {Array} structures Structures of the project.\r\n * @param {Bool} includeBaseROI Whether or not to include the Base ROI.\r\n * @returns {[*, []]} Array with index of layer where region was found in and array with region in polygon form\r\n */\r\nexport function findRoi(p, roiLayers, structures, includeBaseROI) {\r\n let resultRoi = null;\r\n let targetLayerIndex = -1;\r\n\r\n for (let i = 0; i < roiLayers.length; i++) {\r\n if (\r\n structures[i].visible &&\r\n (includeBaseROI || !structures[i].inversed) &&\r\n roiLayers[i].layer.regionRois.length > 0\r\n ) {\r\n let overlapTreeItems = roiLayers[i].tree.search({\r\n minX: parseInt(p.x, 10),\r\n minY: parseInt(p.y, 10),\r\n maxX: parseInt(p.x, 10),\r\n maxY: parseInt(p.y, 10),\r\n });\r\n for (let treeItem of overlapTreeItems) {\r\n if (pointInside(p, treeItem.roi)) {\r\n if (resultRoi) {\r\n if (resultRoi.area > treeItem.roi.area) {\r\n resultRoi = treeItem.roi;\r\n targetLayerIndex = i;\r\n }\r\n } else {\r\n resultRoi = treeItem.roi;\r\n targetLayerIndex = i;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return [targetLayerIndex, resultRoi];\r\n}\r\n\r\nfunction arraymove(arr, fromIndex, toIndex) {\r\n var element = arr[fromIndex];\r\n arr.splice(fromIndex, 1);\r\n arr.splice(toIndex, 0, element);\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport MoreVertIcon from \"@mui/icons-material/MoreVert\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport PlaylistAddIcon from \"@mui/icons-material/PlaylistAdd\";\r\nimport ArrowUpwardIcon from \"@mui/icons-material/ArrowUpward\";\r\nimport ArrowDownwardIcon from \"@mui/icons-material/ArrowDownward\";\r\nimport FileCopyIcon from \"@mui/icons-material/FileCopy\";\r\n\r\nimport {\r\n Tooltip,\r\n IconButton,\r\n Menu,\r\n MenuItem,\r\n ListItemIcon,\r\n Divider,\r\n} from \"@mui/material\";\r\nimport { GetApp, Publish } from \"@mui/icons-material\";\r\n\r\nimport { intersects } from \"../utils/PolygonUtil\";\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\nimport { RegionROI } from \"../utils/ROI\";\r\nimport { getContainedRegionRois } from \"../utils/StructuresUtils\";\r\n\r\nclass ListItemOptionsMenu extends Component {\r\n state = {\r\n optionsAnchorEl: null,\r\n };\r\n\r\n handleOptionsOpen = (e) => {\r\n this.setState({ optionsAnchorEl: e.target });\r\n };\r\n\r\n handleOptionsClose = (e) => {\r\n this.setState({ optionsAnchorEl: null });\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return false;\r\n };\r\n\r\n addSubType = (e) => {\r\n const { structure, projectContext } = this.props;\r\n\r\n if (structure.subtypeLevel < 9) {\r\n projectContext.addSubType(structure);\r\n structure.showSubtypes = true;\r\n structure.hasChild = true;\r\n this.handleOptionsClose(e);\r\n }\r\n };\r\n\r\n addSubStructure = (e) => {\r\n const { structure, projectContext } = this.props;\r\n\r\n if (structure.subtypeLevel < 9) {\r\n projectContext.addSubStructure(structure);\r\n structure.showSubtypes = true;\r\n structure.hasChild = true;\r\n this.handleOptionsClose(e);\r\n }\r\n };\r\n\r\n // start download as json file with given name\r\n downloadAsFile = (jsonObject, downloadName) => {\r\n let dataStr =\r\n \"data:text/json;charset=utf-8,\" +\r\n encodeURIComponent(JSON.stringify(jsonObject));\r\n let dlAnchorElem = document.createElement(\"a\");\r\n dlAnchorElem.setAttribute(\"href\", dataStr);\r\n dlAnchorElem.setAttribute(\"download\", downloadName);\r\n dlAnchorElem.click();\r\n dlAnchorElem.remove();\r\n };\r\n\r\n // start export of annotations of selected structure\r\n exportAnnotations = (e) => {\r\n const { projectContext } = this.props;\r\n const { selectedLayer, structures } = projectContext;\r\n const strData = projectContext.getProjectStringInfos();\r\n const roiLayers = projectContext.roiLayers[projectContext.fileId];\r\n let rois = getContainedRegionRois(\r\n structures[selectedLayer],\r\n structures,\r\n roiLayers\r\n );\r\n let roiRegions = rois.map((regionRoi) => {\r\n return {\r\n regions: regionRoi.regions,\r\n isObject: regionRoi.isObject,\r\n };\r\n });\r\n\r\n this.downloadAsFile(\r\n roiRegions,\r\n strData.name +\r\n \"_\" +\r\n this.props.structure.label +\r\n \"_\" +\r\n strData.date +\r\n \"_\" +\r\n roiRegions.length +\r\n \"_\" +\r\n projectContext.user +\r\n \".annhsa\"\r\n );\r\n this.handleOptionsClose(e);\r\n };\r\n\r\n // open file dialog and import structures from selcted file\r\n importAnnotations = (e) => {\r\n const { projectContext } = this.props;\r\n const roiLayers = projectContext.roiLayers[projectContext.fileId];\r\n let inputElem = document.createElement(\"INPUT\");\r\n inputElem.setAttribute(\"type\", \"file\");\r\n inputElem.setAttribute(\"onChange\", \"file\");\r\n inputElem.setAttribute(\"accept\", \".annhsa\");\r\n inputElem.onchange = (e) => {\r\n let files = e.target.files;\r\n if (files.length <= 0) return false;\r\n\r\n let fr = new FileReader();\r\n fr.onload = (e) => {\r\n this.props.spinloader.show();\r\n //timeout, so spinloader can start\r\n setTimeout(() => {\r\n try {\r\n let drawRegions = JSON.parse(e.target.result);\r\n let nonOverlapping = [];\r\n const tree = roiLayers[projectContext.selectedLayer].tree;\r\n for (let i = 0; i < drawRegions.length; i++) {\r\n let drawRegion = drawRegions[i];\r\n const roi = new RegionROI({\r\n regions: drawRegion.regions,\r\n isObject: drawRegion.isObject,\r\n });\r\n const overlappingRois = tree.search(roi.treeItem);\r\n let intersecting = false;\r\n for (let r of overlappingRois) {\r\n try {\r\n if (intersects(roi, r.roi)) {\r\n intersecting = true;\r\n break;\r\n }\r\n } catch (e) {\r\n intersecting = true;\r\n break;\r\n }\r\n }\r\n if (!intersecting) {\r\n nonOverlapping.push(roi);\r\n }\r\n }\r\n nonOverlapping.forEach((r) => {\r\n roiLayers[projectContext.selectedLayer].layer.regionRois.push(r);\r\n tree.insert(r.treeItem);\r\n });\r\n } catch (e) {\r\n console.log(\"not supported error:\", e);\r\n window.showErrorSnackbar(\"File not supported!\");\r\n }\r\n this.props.spinloader.hide();\r\n });\r\n };\r\n fr.readAsText(files.item(0));\r\n };\r\n inputElem.click();\r\n inputElem.remove();\r\n this.handleOptionsClose(e);\r\n };\r\n\r\n /**\r\n * Checks if a structure can be moved in a direction.\r\n *\r\n * @param {int} direction - 1 is up -1 is down\r\n * @returns {bool} Move in this direction possible\r\n */\r\n canMoveStructure = (direction) => {\r\n const { structure, projectContext } = this.props;\r\n return projectContext.canMoveStructure(structure, direction);\r\n };\r\n\r\n /**\r\n * Moves a structure up or down in structure list\r\n *\r\n * @param {event} e\r\n * @param {int} direction - 1 is up -1 is down\r\n */\r\n moveStructure = (e, direction) => {\r\n const { structure, projectContext } = this.props;\r\n const newSelectedLayer = projectContext.moveStructure(structure, direction);\r\n if (newSelectedLayer) this.props.onSelectLayer(newSelectedLayer);\r\n this.handleOptionsClose(e);\r\n };\r\n\r\n deleteStructure = (e) => {\r\n const { structure, projectContext } = this.props;\r\n let parentId = structure.parentId;\r\n const newSelectedLayer = projectContext.deleteStructure(structure);\r\n if (newSelectedLayer) this.props.onSelectLayer(newSelectedLayer);\r\n this.handleOptionsClose(e);\r\n\r\n // check if parent still has childs\r\n let numberChilds = projectContext.structures.filter(\r\n (element) => element.parentId === parentId\r\n ).length;\r\n\r\n if (numberChilds === 0 && parentId !== 0) {\r\n let parentIdx = projectContext.structures.findIndex(\r\n (element) => element.id === parentId\r\n );\r\n projectContext.structures[parentIdx].hasChild = false;\r\n }\r\n };\r\n\r\n duplicateStructure = (e) => {\r\n const { structure, projectContext } = this.props;\r\n const newSelectedLayer = projectContext.duplicateStructure(structure);\r\n if (newSelectedLayer) this.props.onSelectLayer(newSelectedLayer);\r\n this.handleOptionsClose(e);\r\n };\r\n\r\n render() {\r\n const { structure } = this.props;\r\n\r\n const { optionsAnchorEl } = this.state;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {optionsAnchorEl && (\r\n \r\n {structure.id !== 1 && [\r\n \r\n \r\n \r\n \r\n Add subtype\r\n ,\r\n \r\n \r\n \r\n \r\n Add substructure\r\n ,\r\n \r\n \r\n \r\n \r\n Duplicate structure\r\n ,\r\n ]}\r\n\r\n \r\n \r\n \r\n \r\n Export annotations\r\n \r\n \r\n \r\n \r\n \r\n Import annotations\r\n \r\n {structure.id !== 1 && [\r\n ,\r\n this.moveStructure(e, 1)}\r\n disabled={!this.canMoveStructure(1)}\r\n >\r\n \r\n \r\n \r\n Move structure up\r\n ,\r\n this.moveStructure(e, -1)}\r\n disabled={!this.canMoveStructure(-1)}\r\n >\r\n \r\n \r\n \r\n Move structure down\r\n ,\r\n ,\r\n \r\n \r\n \r\n \r\n Delete structure\r\n ,\r\n ]}\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nListItemOptionsMenu.propTypes = {\r\n projectContext: PropTypes.object,\r\n structure: PropTypes.object,\r\n onSelectLayer: PropTypes.func,\r\n spinloader: PropTypes.object,\r\n};\r\n\r\nexport default withSpinloader(ListItemOptionsMenu);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport SketchColorPicker from \"./SketchColorPicker\";\r\n\r\nimport ListItemOptionsMenu from \"./ListItemOptionsMenu\";\r\n\r\nimport {\r\n TextField,\r\n ListItem,\r\n ListItemText,\r\n Tooltip,\r\n IconButton,\r\n Checkbox,\r\n} from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n VisibilityOff,\r\n Visibility,\r\n ArrowDropDown,\r\n ArrowDropUp,\r\n} from \"@mui/icons-material\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n listItem: {\r\n \"&.Mui-selected\": {\r\n background: \"rgba(0, 0, 0, 0.2) !important\",\r\n },\r\n },\r\n structureInput: {\r\n \"& >div\": {\r\n width: \"100%\",\r\n },\r\n \"& input\": {\r\n textOverflow: \"ellipsis\",\r\n overflow: \"hidden\",\r\n whiteSpace: \"nowrap\",\r\n },\r\n },\r\n});\r\n\r\nclass ListItemStructure extends Component {\r\n state = {\r\n optionsAnchorEl: null,\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return all direct childs\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n getParentIndex = (structure) => {\r\n // return index of parent structure\r\n let parentIndex = this.props.structures.findIndex(\r\n (element) => element.id === structure.parentId\r\n );\r\n return parentIndex;\r\n };\r\n\r\n hideSubtypes = (subType, lv) => {\r\n const { structures } = this.props;\r\n // hide subtypes if not unfolded anymore in sidebar\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.hideSubtypes(childs[i], lv);\r\n }\r\n }\r\n // make visibility like parent\r\n if (subType.classificationSubtype && subType.subtypeLevel > lv) {\r\n let idx = this.getParentIndex(subType);\r\n subType.visible = structures[idx].visible;\r\n }\r\n subType.showSubtypes = false;\r\n subType.isUnfolded = false;\r\n this.props.projectContext.forceUpdate();\r\n };\r\n\r\n showSubtypes = (subType) => {\r\n const { structures } = this.props;\r\n // unfold direct subtypes of structure\r\n for (let structure of structures) {\r\n if (structure.parentId === subType.id) {\r\n structure.isUnfolded = true;\r\n }\r\n }\r\n this.props.projectContext.setState({ structures });\r\n };\r\n\r\n visibilitySubtypesOff = (subType) => {\r\n // set visibility of rois in viewer of subtypes to invisible\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.visibilitySubtypesOff(childs[i]);\r\n }\r\n }\r\n subType.visible = false;\r\n this.props.projectContext.forceUpdate();\r\n };\r\n\r\n visibilitySubtypesOn = (subType) => {\r\n // set visibility of rois in viewer of subtypes to visible\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.visibilitySubtypesOn(childs[i]);\r\n }\r\n }\r\n subType.visible = true;\r\n this.props.projectContext.forceUpdate();\r\n };\r\n\r\n selectStructure = (structure, index) => {\r\n const { onChangeTool, activeTool, showGallery } = this.props;\r\n this.props.onSelectLayer(index, () => {\r\n let toolChanged = false;\r\n if (\r\n activeTool === \"none\" ||\r\n structure.allToolNames.includes(activeTool)\r\n ) {\r\n let toolName = \"none\";\r\n if (structure.tools.length > 0 && !showGallery) {\r\n toolChanged = true;\r\n if (structure.selectedToolName) {\r\n toolName = structure.selectedToolName;\r\n } else {\r\n toolName = structure.tools[0].name;\r\n }\r\n }\r\n onChangeTool(toolName);\r\n }\r\n\r\n if (!toolChanged && showGallery) {\r\n this.props.updateStructureChange();\r\n }\r\n\r\n this.props.tiles.setStructure(structure);\r\n });\r\n };\r\n\r\n adaptRois = (str, newName) => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // change subtypename of rois\r\n roiLayers[selectedLayer].layer.regionRois.forEach((element) => {\r\n if (element.structureId === str.id) {\r\n element.subtypeName = newName;\r\n }\r\n });\r\n };\r\n\r\n render() {\r\n const {\r\n selectedLayer,\r\n roiLayers,\r\n classes,\r\n projectContext,\r\n onChangeLayers,\r\n updateViewer,\r\n onSelectLayer,\r\n // item props\r\n structure,\r\n index,\r\n setTextInput,\r\n renderLocation,\r\n structures,\r\n formData,\r\n allStructuresEnabled,\r\n } = this.props;\r\n\r\n return (\r\n {\r\n if (renderLocation == \"SideBarTabRois\") {\r\n this.selectStructure(structure, index);\r\n }\r\n }}\r\n >\r\n {renderLocation == \"AI-Cockpit\" && (\r\n {\r\n this.props.updateFormDataStructures(\r\n structures[structure.index],\r\n e.currentTarget.checked\r\n );\r\n }}\r\n checked={\r\n formData.selStructures.findIndex(\r\n (item) => item.id === structures[structure.index].id\r\n ) > -1\r\n }\r\n />\r\n )}\r\n\r\n {selectedLayer === index ? (\r\n \r\n \r\n {\r\n if (\r\n e.target.value.includes(\"_\") ||\r\n e.target.value.includes(\"/\")\r\n ) {\r\n window.showWarningSnackbar(\r\n \"Do no use / and _ inside structure names.\"\r\n );\r\n return; // do not allow these signs in structure label\r\n }\r\n // update rois and structure\r\n this.adaptRois(structure, e.target.value);\r\n structure.label = e.target.value;\r\n projectContext.forceUpdate();\r\n }}\r\n inputRef={setTextInput}\r\n InputProps={{\r\n disableUnderline: true,\r\n }}\r\n />\r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n {structure.label || \"Brightfield\"}\r\n
\r\n }\r\n />\r\n \r\n \r\n )}\r\n\r\n {structure.hasChild && renderLocation == \"SideBarTabRois\" && (\r\n {\r\n if (structure.showSubtypes === false) {\r\n this.showSubtypes(structure);\r\n structure.showSubtypes = true;\r\n } else {\r\n this.hideSubtypes(structure, structure.subtypeLevel);\r\n structure.isUnfolded = true;\r\n }\r\n setTimeout(() => {\r\n this.props.forceSidebarUpdate();\r\n }, 10);\r\n }}\r\n size=\"large\"\r\n >\r\n {structure.showSubtypes ? : }\r\n \r\n )}\r\n {renderLocation == \"SideBarTabRois\" && (\r\n \r\n {\r\n structure.visible = !structure.visible;\r\n if (!structure.visible) {\r\n this.visibilitySubtypesOff(structure);\r\n } else {\r\n this.visibilitySubtypesOn(structure);\r\n }\r\n this.forceUpdate();\r\n onChangeLayers(roiLayers);\r\n e.stopPropagation();\r\n }}\r\n size=\"large\"\r\n >\r\n {structure.visible ? : }\r\n \r\n \r\n )}\r\n\r\n {structure.color !== -1 && (\r\n {\r\n structure.color = color;\r\n // adjust roi color\r\n roiLayers[selectedLayer].layer.regionRois.forEach(function (\r\n element\r\n ) {\r\n if (element.subtypeName === \"\") {\r\n element.color = color;\r\n }\r\n });\r\n updateViewer();\r\n }}\r\n />\r\n )}\r\n {!this.props.viewerConfig.project.projectProperties[\"HideSubMenus\"] &&\r\n renderLocation == \"SideBarTabRois\" && (\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nListItemStructure.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n roiLayers: PropTypes.array,\r\n structures: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n projectContext: PropTypes.object,\r\n viewerConfig: PropTypes.object,\r\n onChangeLayers: PropTypes.func,\r\n updateViewer: PropTypes.func,\r\n isAdmin: PropTypes.bool,\r\n // item specific\r\n structure: PropTypes.object,\r\n tiles: PropTypes.object,\r\n index: PropTypes.number,\r\n activeTool: PropTypes.string,\r\n setTextInput: PropTypes.func,\r\n onChangeTool: PropTypes.func,\r\n showGallery: PropTypes.bool,\r\n updateStructureChange: PropTypes.func,\r\n onSelectLayer: PropTypes.func,\r\n forceSidebarUpdate: PropTypes.func,\r\n renderLocation: PropTypes.string,\r\n updateFormDataStructures: PropTypes.func,\r\n formData: PropTypes.object,\r\n allStructuresEnabled: PropTypes.bool,\r\n};\r\n\r\nexport default withStyles(styles)(ListItemStructure);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport SketchColorPicker from \"./SketchColorPicker\";\r\nimport {\r\n getParentIndexLayer,\r\n getParentIndex,\r\n getContainedRegionRois,\r\n} from \"../utils/StructuresUtils\";\r\n\r\nimport {\r\n Divider,\r\n TextField,\r\n ListItem,\r\n ListItemText,\r\n Tooltip,\r\n IconButton,\r\n Checkbox,\r\n} from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { Tools } from \"./VerticalToolBar\";\r\nimport {\r\n VisibilityOff,\r\n Visibility,\r\n ArrowDropDown,\r\n ArrowDropUp,\r\n Remove,\r\n PlayArrow,\r\n} from \"@mui/icons-material\";\r\nimport ListItemOptionsMenu from \"./ListItemOptionsMenu\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n listItem: {\r\n \"&.Mui-selected\": {\r\n background: \"rgba(0, 0, 0, 0.2) !important\",\r\n },\r\n },\r\n});\r\n\r\nclass ListItemSubType extends Component {\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return all direct childs\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n findAllSubtypes = (str) => {\r\n // find all childs of structure (not only direct childs)\r\n let childs = this.findChilds(str);\r\n let allChilds = [];\r\n while (childs.length !== 0) {\r\n childs = childs.concat(this.findChilds(childs[0]));\r\n if (!allChilds.includes(childs[0])) {\r\n allChilds.push(childs[0]);\r\n }\r\n childs.shift();\r\n }\r\n return allChilds;\r\n };\r\n\r\n hideSubtypes = (subType, lv) => {\r\n const { structures } = this.props;\r\n // hide subtypes if not unfolded anymore in sidebar\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.hideSubtypes(childs[i], lv);\r\n }\r\n }\r\n // make visibility like parent\r\n if (subType.classificationSubtype && subType.subtypeLevel > lv) {\r\n let idx = getParentIndex(subType, structures);\r\n subType.visible = structures[idx].visible;\r\n }\r\n subType.showSubtypes = false;\r\n subType.isUnfolded = false;\r\n };\r\n\r\n showSubtypes = (subType) => {\r\n const { structures } = this.props;\r\n // unfold direct subtypes of structure\r\n structures.forEach(function (element) {\r\n if (element.parentId === subType.id) {\r\n element.isUnfolded = true;\r\n }\r\n });\r\n };\r\n\r\n visibilitySubtypesOff = (subType) => {\r\n // set visibility of rois in viewer of subtypes to invisible\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.visibilitySubtypesOff(childs[i]);\r\n }\r\n }\r\n subType.visible = false;\r\n };\r\n\r\n visibilitySubtypesOn = (subType) => {\r\n // set visibility of rois in viewer of subtypes to visible\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.visibilitySubtypesOn(childs[i]);\r\n }\r\n }\r\n subType.visible = true;\r\n };\r\n\r\n itemClicked = () => {\r\n const {\r\n structures,\r\n onChangeTool,\r\n activeTool,\r\n showGallery,\r\n updateStructureChange,\r\n onSelectLayer,\r\n subType,\r\n } = this.props;\r\n\r\n if (subType.tools.length > 0) {\r\n let activeToolName = activeTool;\r\n if (!activeToolName || activeToolName === Tools.NONE) {\r\n onChangeTool(\"none\");\r\n } else {\r\n if (\r\n typeof subType.allToolNames !== \"undefined\" &&\r\n subType.allToolNames.includes(activeToolName)\r\n ) {\r\n let toolNames = Object.values(subType.tools).map((t) => t.name);\r\n if (\r\n !toolNames.includes(activeToolName) ||\r\n activeToolName === Tools.NONE\r\n ) {\r\n onChangeTool(subType.tools[0].name);\r\n }\r\n }\r\n }\r\n } else if (activeTool && activeTool.startsWith(\"iam_\")) {\r\n onChangeTool(\"none\");\r\n }\r\n if (showGallery) {\r\n updateStructureChange();\r\n }\r\n\r\n onSelectLayer(structures.findIndex((element) => element.id === subType.id));\r\n this.props.tiles.setStructure(subType);\r\n this.forceUpdate();\r\n };\r\n\r\n adaptRois = (str, newName) => {\r\n const { roiLayers, structures } = this.props;\r\n // change subtypename of rois\r\n let parentIdxLayer = getParentIndexLayer(str, structures);\r\n roiLayers[parentIdxLayer].layer.regionRois.forEach((element) => {\r\n if (element.structureId === str.id) {\r\n element.subtypeName = newName;\r\n }\r\n });\r\n };\r\n\r\n render() {\r\n const {\r\n roiLayers,\r\n selectedLayer,\r\n structures,\r\n projectContext,\r\n onChangeLayers,\r\n updateViewer,\r\n // item specific\r\n subType,\r\n parent,\r\n i,\r\n onSelectLayer,\r\n classes,\r\n renderLocation,\r\n formData,\r\n allStructuresEnabled,\r\n } = this.props;\r\n\r\n // only draw if it is in subtypes of parent\r\n if (\r\n renderLocation == \"SideBarTabRois\" &&\r\n !this.findAllSubtypes(parent).includes(subType)\r\n ) {\r\n return
;\r\n }\r\n\r\n // calculate if draw divider to seperate substructures from classification subtypes\r\n let drawDivider = false;\r\n let parentIndex = structures.findIndex(\r\n (element) => element.id === subType.parentId\r\n );\r\n let childs = this.findChilds(structures[parentIndex]);\r\n let subStructures = childs.filter(\r\n (element) => !element.classificationSubtype\r\n );\r\n if (subStructures.length !== 0) {\r\n // parent has substructures\r\n let classificationChilds = childs.filter(\r\n (element) => element.classificationSubtype\r\n );\r\n // if subType is first classification subtype --> draw divider\r\n if (\r\n classificationChilds[classificationChilds.length - 1] &&\r\n subType.label ===\r\n classificationChilds[classificationChilds.length - 1].label\r\n ) {\r\n drawDivider = true;\r\n }\r\n }\r\n\r\n const index = structures.findIndex((element) => element.id === subType.id);\r\n\r\n let numberOfObjects = getContainedRegionRois(\r\n subType,\r\n structures,\r\n roiLayers\r\n ).length;\r\n\r\n // check if structure is unfolded/visible in sidebar\r\n if (!subType.isUnfolded && renderLocation == \"SideBarTabRois\") {\r\n return null;\r\n }\r\n\r\n return (\r\n {\r\n this.listItemRef = el;\r\n }}\r\n style={{\r\n height: 48,\r\n width: \"100%\",\r\n }}\r\n >\r\n {(renderLocation == \"AI-Cockpit\" ||\r\n this.props.isInView(this.listItemRef) > 0) && (\r\n
\r\n element.id === subType.id\r\n ) && renderLocation == \"SideBarTabRois\"\r\n }\r\n className={classes.listItem}\r\n style={{\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n }}\r\n onClick={() => {\r\n if (renderLocation == \"SideBarTabRois\") {\r\n this.itemClicked();\r\n }\r\n }}\r\n >\r\n {renderLocation == \"AI-Cockpit\" && (\r\n {\r\n this.props.updateFormDataStructures(\r\n structures[subType.index],\r\n e.currentTarget.checked\r\n );\r\n }}\r\n checked={\r\n formData.selStructures.findIndex(\r\n (item) => item.id === structures[subType.index].id\r\n ) > -1\r\n }\r\n />\r\n )}\r\n\r\n \r\n {subType.classificationSubtype ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n {selectedLayer === index ? (\r\n \r\n \r\n {\r\n if (\r\n e.target.value.includes(\"_\") ||\r\n e.target.value.includes(\"/\")\r\n ) {\r\n window.showWarningSnackbar(\r\n \"Do no use / and _ inside structure names.\"\r\n );\r\n return; // do not allow these signs in structure label\r\n }\r\n // update rois and structure\r\n this.adaptRois(subType, e.target.value);\r\n subType.label = e.target.value;\r\n projectContext.forceUpdate();\r\n }}\r\n InputProps={{\r\n disableUnderline: true,\r\n }}\r\n />\r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n {subType.label}\r\n
\r\n }\r\n />\r\n \r\n \r\n )}\r\n {subType.hasChild && renderLocation == \"SideBarTabRois\" && (\r\n {\r\n if (subType.showSubtypes === false) {\r\n this.showSubtypes(subType);\r\n subType.showSubtypes = true;\r\n } else {\r\n this.hideSubtypes(subType, subType.subtypeLevel);\r\n subType.isUnfolded = true;\r\n }\r\n setTimeout(() => {\r\n this.props.forceSidebarUpdate();\r\n }, 10);\r\n }}\r\n size=\"large\"\r\n >\r\n {subType.showSubtypes ? : }\r\n \r\n )}\r\n {renderLocation == \"SideBarTabRois\" && (\r\n \r\n {\r\n subType.visible = !subType.visible;\r\n if (!subType.visible) {\r\n this.visibilitySubtypesOff(subType);\r\n } else {\r\n this.visibilitySubtypesOn(subType);\r\n }\r\n this.forceUpdate();\r\n onChangeLayers(roiLayers);\r\n }}\r\n size=\"large\"\r\n >\r\n {subType.visible ? : }\r\n \r\n \r\n )}\r\n\r\n {\r\n subType.color = color;\r\n // adjust roi color\r\n let parLayer = getParentIndexLayer(subType, structures);\r\n roiLayers[parLayer].layer.regionRois.forEach(function (\r\n element\r\n ) {\r\n if (\r\n subType.classificationSubtype &&\r\n element.subtypeName === subType.label\r\n ) {\r\n element.color = color;\r\n }\r\n if (\r\n !subType.classificationSubtype &&\r\n element.subtypeName === \"\"\r\n ) {\r\n element.color = color;\r\n }\r\n });\r\n updateViewer();\r\n }}\r\n />\r\n {!this.props.viewerConfig.project.projectProperties[\r\n \"HideSubMenus\"\r\n ] &&\r\n renderLocation == \"SideBarTabRois\" && (\r\n \r\n )}\r\n \r\n {drawDivider && }\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nListItemSubType.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n structures: PropTypes.array,\r\n roiLayers: PropTypes.array,\r\n onChangeTool: PropTypes.func,\r\n activeTool: PropTypes.string,\r\n showGallery: PropTypes.bool,\r\n updateStructureChange: PropTypes.func,\r\n projectContext: PropTypes.object,\r\n viewerConfig: PropTypes.object,\r\n tiles: PropTypes.object,\r\n onChangeLayers: PropTypes.func,\r\n updateViewer: PropTypes.func,\r\n onSelectLayer: PropTypes.func,\r\n isAdmin: PropTypes.bool,\r\n // item specific\r\n subType: PropTypes.object,\r\n parent: PropTypes.object,\r\n i: PropTypes.number,\r\n selectedLayer: PropTypes.number,\r\n isInView: PropTypes.func,\r\n forceSidebarUpdate: PropTypes.func,\r\n renderLocation: PropTypes.string,\r\n updateFormDataStructures: PropTypes.func,\r\n formData: PropTypes.object,\r\n allStructuresEnabled: PropTypes.bool,\r\n};\r\n\r\nexport default withStyles(styles)(ListItemSubType);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n DialogContent,\r\n DialogContentText,\r\n List,\r\n FormControlLabel,\r\n Checkbox,\r\n Grid,\r\n Typography,\r\n} from \"@mui/material\";\r\n\r\n// import { getContainedRegionRois } from \"../../../viewer/utils/StructuresUtils\";\r\nimport ListItemStructure from \"../../../viewer/components/ListItemStructure\";\r\nimport ListItemSubType from \"../../../viewer/components/ListItemSubType\";\r\n\r\nconst styles = () => ({});\r\n\r\nclass TrainModelStep1 extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n allStructuresEnabled: false,\r\n };\r\n let allStructures = props.structures.map((item) => {\r\n return item;\r\n });\r\n allStructures.forEach((item, index) => (item.index = index));\r\n this.structures = allStructures;\r\n }\r\n\r\n render() {\r\n const { classes, ...propsWithoutClasses } = this.props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Select all structures that should be detected/classified by your\r\n model:\r\n \r\n \r\n \r\n \r\n this.setState({ allStructuresEnabled: e.target.checked })\r\n }\r\n />\r\n }\r\n label={\r\n Enable all structures\r\n }\r\n />\r\n \r\n \r\n \r\n {this.structures.map((structure, index) => {\r\n return structure.isSubtype ? (\r\n \r\n ) : (\r\n \r\n );\r\n })}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nTrainModelStep1.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n formData: PropTypes.object.isRequired,\r\n projectProperties: PropTypes.object,\r\n projectStringProperties: PropTypes.object,\r\n onChangeMetaData: PropTypes.func,\r\n structures: PropTypes.array,\r\n roiLayers: PropTypes.array,\r\n updateFormDataStructures: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(TrainModelStep1);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n DialogContent,\r\n DialogContentText,\r\n Grid,\r\n Checkbox,\r\n FormControlLabel,\r\n} from \"@mui/material\";\r\n\r\nconst styles = () => ({\r\n dialogContent: {\r\n paddingTop: 0,\r\n maxWidth: 900,\r\n minHeight: 420,\r\n },\r\n images: {\r\n width: 100,\r\n height: 100,\r\n objectFit: \"contain\",\r\n },\r\n});\r\n\r\nclass TrainModelStep1 extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n verticalFlip: false,\r\n horizontalFlip: false,\r\n };\r\n }\r\n\r\n render() {\r\n const { classes, formData, viewerConfig } = this.props;\r\n let defaultImages = viewerConfig.project.projectProperties[\r\n \"MedicalAICockpitImages\"\r\n ]\r\n ? false\r\n : true;\r\n\r\n return (\r\n \r\n \r\n
\r\n Which transformations of your data are realistic and do not change\r\n the meaning of the image?\r\n
\r\n
Select possible transformations:
\r\n \r\n \r\n \r\n \r\n {\r\n this.props.updateFormDataAugmentations(e, \"h_flip\");\r\n }}\r\n />\r\n }\r\n />\r\n
\r\n \r\n \r\n this.props.updateFormDataAugmentations(e, \"v_flip\")\r\n }\r\n />\r\n }\r\n />\r\n
\r\n \r\n \r\n this.props.updateFormDataAugmentations(e, \"rotation\")\r\n }\r\n />\r\n }\r\n />\r\n
\r\n \r\n
\r\n
original orientation
\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nTrainModelStep1.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n files: PropTypes.array,\r\n onChangeFiles: PropTypes.func,\r\n preloadedImages: PropTypes.object,\r\n formData: PropTypes.object,\r\n updateFormDataAugmentations: PropTypes.func,\r\n viewerConfig: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(TrainModelStep1);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n DialogContent,\r\n DialogContentText,\r\n TextField,\r\n FormControl,\r\n MenuItem,\r\n} from \"@mui/material\";\r\nimport { withAllViewerContexts } from \"../../../viewer/contexts/AllViewerContexts\";\r\n\r\nconst styles = () => ({\r\n dialogContent: {\r\n paddingTop: 0,\r\n maxWidth: 900,\r\n },\r\n firstSelectField: {\r\n marginTop: 10,\r\n },\r\n});\r\n\r\nclass TrainModelStep3 extends Component {\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n /**\r\n * Checks if a given modelname already exists.\r\n * @param {string} valueToCheck The text to be checked.\r\n * @returns {bool} Whether or not the name already exists.\r\n */\r\n checkNameAvailibility = (valueToCheck) => {\r\n let aiModelRepository = this.props.projectContext.aiModelRepository\r\n ? this.props.projectContext.aiModelRepository\r\n : [];\r\n return (\r\n aiModelRepository.findIndex((aiModel) => {\r\n let result = aiModel.name === valueToCheck;\r\n return result;\r\n }) >= 0\r\n );\r\n };\r\n\r\n /**\r\n * Checks if input string has forbidden characters.\r\n * @param {string} input The text to be checked.\r\n * @returns {bool} Whether or not a forbidden char is present.\r\n */\r\n isInvalidInput = (input) => {\r\n const invalidChars = /[&+#\\\\/?:*\"|<>]/g;\r\n return invalidChars.test(input);\r\n };\r\n\r\n render() {\r\n const { classes, selectedModel, newModelName, formData, projectContext } =\r\n this.props;\r\n const { versionName } = this.props.formData.metaData;\r\n let aiModelRepository = projectContext.aiModelRepository\r\n ? projectContext.aiModelRepository\r\n : [];\r\n let valueToCheck = \"Custom - \" + newModelName;\r\n let nameInUse = this.checkNameAvailibility(valueToCheck);\r\n let invalidChar = this.isInvalidInput(valueToCheck);\r\n\r\n return (\r\n \r\n \r\n
\r\n You can train a new model from scratch or start training based on an\r\n existing model:\r\n
    \r\n
  • \r\n Train from scratch: type in name of your model\r\n
  • \r\n
  • \r\n Use existing model: select existing model name\r\n and version\r\n
  • \r\n
\r\n
\r\n \r\n \r\n {\r\n let value = e.target.value;\r\n let selectedModel = { name: \"newModel\" };\r\n if (value === \"newModel\") {\r\n this.props.updateFormDataMetaData(\"newModel\", true);\r\n this.props.updateFormDataAdvSettings(\"tileSize\", 512);\r\n } else {\r\n this.props.updateFormDataMetaData(\"newModel\", false);\r\n let aiModel = aiModelRepository.find(\r\n (aiModel) => aiModel.name === value\r\n );\r\n if (typeof aiModel !== \"undefined\" && aiModel.versions) {\r\n selectedModel = aiModel;\r\n let versions = aiModel.versions;\r\n if (aiModel.versions.length > 0) {\r\n let selectedVersion = versions[versions.length - 1].label;\r\n this.props.updateFormDataMetaData(\r\n \"versionName\",\r\n selectedVersion\r\n );\r\n this.props.updateFormDataAdvSettings(\r\n \"tileSize\",\r\n aiModel.versions[0].image_size\r\n );\r\n }\r\n }\r\n }\r\n this.props.setSelectedModel(selectedModel);\r\n value = value.replace(\"Custom - \", \"\");\r\n this.props.updateFormDataMetaData(\"modelName\", value);\r\n }}\r\n >\r\n \r\n New Model\r\n \r\n {aiModelRepository\r\n .filter(\r\n (aiModel) =>\r\n aiModel.versions.length > 0 &&\r\n aiModel.versions[0].modeltype == formData[\"modelType\"]\r\n )\r\n .map((aiModel) => {\r\n return (\r\n \r\n {aiModel.label}\r\n \r\n );\r\n })}\r\n \r\n \r\n
\r\n
\r\n {selectedModel.name === \"newModel\" ? (\r\n '\r\n : \"\"\r\n }\r\n label=\"Name for new Model\"\r\n value={newModelName}\r\n onChange={(e) => {\r\n valueToCheck = \"Custom - \" + e.target.value;\r\n nameInUse = this.checkNameAvailibility(valueToCheck);\r\n invalidChar = this.isInvalidInput(valueToCheck);\r\n let uniqueName = !(\r\n e.target.value === \"\" ||\r\n nameInUse ||\r\n invalidChar\r\n );\r\n\r\n this.props.updateFormDataMetaData(\"modelName\", e.target.value);\r\n this.props.updateFormDataMetaData(\"validChar\", !invalidChar);\r\n this.props.updateFormDataMetaData(\"uniqueName\", uniqueName);\r\n projectContext.aiStateObject.newModelName = e.target.value;\r\n this.forceUpdate();\r\n }}\r\n />\r\n ) : (\r\n \r\n {\r\n let value = e.target.value;\r\n this.props.updateFormDataMetaData(\"versionName\", value);\r\n }}\r\n >\r\n {aiModelRepository.find(\r\n (aiModel) => aiModel.name === selectedModel.name\r\n ) &&\r\n aiModelRepository\r\n .find((aiModel) => aiModel.name === selectedModel.name)\r\n .versions.map((version) => {\r\n return (\r\n \r\n {version.label}\r\n \r\n );\r\n })}\r\n \r\n \r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nTrainModelStep3.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n projectContext: PropTypes.object,\r\n project: PropTypes.object,\r\n files: PropTypes.array,\r\n onChangeFiles: PropTypes.func,\r\n updateFormDataMetaData: PropTypes.func,\r\n formData: PropTypes.object,\r\n selectedModel: PropTypes.object,\r\n newModelName: PropTypes.string,\r\n setSelectedModel: PropTypes.func,\r\n updateFormDataAdvSettings: PropTypes.func,\r\n};\r\n\r\nexport default withAllViewerContexts(withStyles(styles)(TrainModelStep3));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\nimport { getParentIndexLayer } from \"../../../viewer/utils/StructuresUtils\";\r\n\r\nimport {\r\n DialogContent,\r\n DialogContentText,\r\n MenuItem,\r\n TextField,\r\n FormControl,\r\n FormLabel,\r\n RadioGroup,\r\n Radio,\r\n FormControlLabel,\r\n Grid,\r\n Checkbox,\r\n ListItem,\r\n Button,\r\n Select,\r\n ListItemText,\r\n InputLabel,\r\n} from \"@mui/material\";\r\n\r\nconst styles = () => ({\r\n dialogContent: {\r\n paddingTop: 0,\r\n maxWidth: 900,\r\n overflow: \"hidden\",\r\n },\r\n textInputField: {\r\n marginRight: 10,\r\n },\r\n dropDownLabel: {\r\n top: -7,\r\n left: 15,\r\n },\r\n});\r\n\r\nclass TrainModelStep4 extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n let maxLevel = props.ome.maxLevel;\r\n let encoders = [\r\n {\r\n name: \"ResNest\",\r\n types: [\r\n \"resnest14d\",\r\n \"resnest26d\",\r\n \"resnest50d\",\r\n \"resnest50d_1s4x24d\",\r\n \"resnest50d_4s2x40d\",\r\n \"resnest101e\",\r\n \"resnest200e\",\r\n \"resnest269e\",\r\n ],\r\n unfolded: [false, false, false, false],\r\n },\r\n {\r\n name: \"ResNet\",\r\n types: [\r\n \"resnet18\",\r\n \"resnet26\",\r\n \"resnet34\",\r\n \"resnet50\",\r\n \"resnet101\",\r\n \"resnet152\",\r\n \"resnet200\",\r\n ],\r\n unfolded: [false, false, false, false],\r\n },\r\n {\r\n name: \"ResNext\",\r\n types: [\r\n \"resnext50d_32x4d\",\r\n \"resnext101_32x4d\",\r\n \"resnext101_32x8d\",\r\n \"resnest50d_1s4x24d\",\r\n \"resnest50d_4s2x40d\",\r\n \"resnext101_64x4d\",\r\n ],\r\n unfolded: [false, false, false, false],\r\n },\r\n {\r\n name: \"EfficientNet\",\r\n types: [\r\n \"efficientnet_b0\",\r\n \"efficientnet_b1\",\r\n \"efficientnet_b2\",\r\n \"efficientnet_b3\",\r\n \"efficientnet_b4\",\r\n \"efficientnet_b5\",\r\n \"efficientnet_b6\",\r\n \"efficientnet_b7\",\r\n \"efficientnet_b8\",\r\n ],\r\n unfolded: [false, false, false, false],\r\n },\r\n ];\r\n this.decoderArchitectures = [\r\n {\r\n name: \"unet\",\r\n label: \"Unet\",\r\n },\r\n {\r\n name: \"unet_pp\",\r\n label: \"Unet++\",\r\n },\r\n {\r\n name: \"deepLabV3_p\",\r\n label: \"DeepLabV3+\",\r\n },\r\n ];\r\n let odModelArchitectures = [\r\n {\r\n model: \"faster_rcnn\",\r\n config: \"r50_fpn_1x_coco\",\r\n label: \"Faster R-CNN\",\r\n url: \"https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_2x_coco/faster_rcnn_r50_fpn_2x_coco_bbox_mAP-0.384_20200504_210434-a5d8aa15.pth\",\r\n },\r\n {\r\n model: \"cascade_rcnn\",\r\n config: \"r50_fpn_1x_coco\",\r\n label: \"Cascade R-CNN\",\r\n url: \"https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco/cascade_mask_rcnn_r50_fpn_1x_coco_20200203-9d4dcb24.pth\",\r\n },\r\n ];\r\n let instanceSegModelArchitectures = [\r\n { model: \"mask_rcnn_vdl\", config: \"\", label: \"Mask R-CNN VDL\" },\r\n {\r\n model: \"mask_rcnn\",\r\n config: \"r50_fpn_1x_coco\",\r\n label: \"Mask R-CNN\",\r\n url: \"https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_fpn_mstrain-poly_3x_coco_20210524_201154-21b550bb.pth\",\r\n },\r\n {\r\n model: \"swin\",\r\n config: \"mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco\",\r\n label: \"VisionTransformer\",\r\n url: \"https://download.openmmlab.com/mmdetection/v2.0/swin/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco_20210906_131725-bacf6f7b.pth\",\r\n },\r\n ];\r\n\r\n let docderArchitectursMap = {\r\n Unet: \"unet\",\r\n UnetPlusPlus: \"unet_pp\",\r\n DeepLabV3Plus: \"deepLabV3_p\",\r\n };\r\n let selectedLevel = maxLevel;\r\n let selectedEncoderTypeIdx = 0;\r\n let selectedDecoder = this.decoderArchitectures[0].name;\r\n let selectedEncoderArchitecture = encoders[0].types[1];\r\n let selectedOdModelArchitecture = odModelArchitectures[0].label;\r\n let selectedInstanceSegModelArchitecture =\r\n instanceSegModelArchitectures[0].label;\r\n\r\n if (props.selectedModel.versions) {\r\n try {\r\n let lastVersion =\r\n props.selectedModel.versions[props.selectedModel.versions.length - 1];\r\n\r\n if (\"calculate_weight_map\" in lastVersion) {\r\n if (\r\n this.props.formData.advancedSettings.calculateWeightMap !==\r\n lastVersion.calculate_weight_map\r\n ) {\r\n this.props.updateFormDataAdvSettings(\r\n \"calculateWeightMap\",\r\n lastVersion.calculate_weight_map\r\n );\r\n }\r\n }\r\n\r\n if (lastVersion && typeof lastVersion.pyramid_level !== \"undefined\")\r\n selectedLevel = lastVersion.pyramid_level;\r\n if (lastVersion.model !== \"\" && lastVersion.model !== \"yolov5\") {\r\n if (lastVersion.modeltype == \"segmentation\") {\r\n let modelData = JSON.parse(\r\n lastVersion.model.replaceAll(\"'\", '\"')\r\n )[0];\r\n selectedDecoder = docderArchitectursMap[modelData.decoder];\r\n\r\n let encoderTypeFound = false;\r\n for (let i = 0; i < encoders.length; i++) {\r\n let encoder = encoders[i];\r\n for (let encoderType of encoder.types) {\r\n if (modelData.backbone.includes(encoderType)) {\r\n selectedEncoderTypeIdx = i;\r\n selectedEncoderArchitecture = encoderType;\r\n encoderTypeFound = true;\r\n break;\r\n }\r\n }\r\n if (encoderTypeFound) break;\r\n }\r\n } else if (lastVersion.modeltype == \"object detection\") {\r\n selectedOdModelArchitecture = lastVersion.model;\r\n let selArchitecture = odModelArchitectures.filter(\r\n (element) => element.label == selectedOdModelArchitecture\r\n )[0];\r\n if (selArchitecture) {\r\n this.props.updateFormDataAdvSettings(\r\n \"comDLArchitecture\",\r\n selArchitecture\r\n );\r\n }\r\n } else {\r\n selectedInstanceSegModelArchitecture = lastVersion.model;\r\n let selArchitecture = instanceSegModelArchitectures.filter(\r\n (element) => element.label == selectedInstanceSegModelArchitecture\r\n )[0];\r\n if (selArchitecture) {\r\n this.props.updateFormDataAdvSettings(\r\n \"comDLArchitecture\",\r\n selArchitecture\r\n );\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n console.log(\"pyramid level not found in model, selecting max level\", e);\r\n }\r\n }\r\n if (selectedLevel === -1) selectedLevel = maxLevel;\r\n\r\n this.state = {\r\n settingsType: \"dafault\",\r\n selectedLevel: selectedLevel,\r\n selectedDecoder: selectedDecoder,\r\n selectedEncoderTypeIdx: selectedEncoderTypeIdx,\r\n selectedEncoderArchitecture: selectedEncoderArchitecture,\r\n encoders: encoders,\r\n odModelArchitectures: odModelArchitectures,\r\n instanceSegModelArchitectures: instanceSegModelArchitectures,\r\n selectedOdModelArchitecture: selectedOdModelArchitecture,\r\n selectedInstanceSegModelArchitecture:\r\n selectedInstanceSegModelArchitecture,\r\n isBrightfield:\r\n props.ome &&\r\n props.ome.channels.length === 1 &&\r\n props.ome.channels[0].type === \"brightfield\",\r\n };\r\n\r\n this.levelDataArray = [];\r\n\r\n //fill levelDataArray for drop down\r\n if (maxLevel > 0) {\r\n for (let i = maxLevel; i >= 0; i--) {\r\n let zoomFactor = 2 ** (maxLevel - i);\r\n let levelData = {\r\n level: i,\r\n description: \"1 : \" + zoomFactor,\r\n };\r\n if (i === 0) {\r\n levelData.description += \" (Thumbnail)\";\r\n }\r\n this.levelDataArray.push(levelData);\r\n }\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n const { formData, ome } = this.props;\r\n\r\n let IMAGESIZEOPTIONS = [512, 256, 128];\r\n let MAXIMAGESIZE = 512;\r\n // let MINIMAGESIZE = 128;\r\n let structures = this.props.structures;\r\n let roiLayers = this.props.roiLayers;\r\n let selStructures = this.props.formData.selStructures;\r\n let largestRoiPx = 0;\r\n let totalRoisArea = 0;\r\n let numberRois = 0;\r\n for (let i = 0; i < selStructures.length; i++) {\r\n let layerIdx = getParentIndexLayer(selStructures[i], structures);\r\n for (let j = 0; j < roiLayers[layerIdx].layer.regionRois.length; j++) {\r\n let roi = roiLayers[layerIdx].layer.regionRois[j];\r\n let height = roi.bounds.bottom - roi.bounds.bottom;\r\n let width = roi.bounds.right - roi.bounds.left;\r\n let max = Math.max(height, width);\r\n largestRoiPx = max > largestRoiPx ? max : largestRoiPx;\r\n totalRoisArea += roi.area;\r\n numberRois += 1;\r\n }\r\n }\r\n\r\n let avgArea = totalRoisArea / numberRois;\r\n\r\n // largestRoiPx defines the size of the largest roi in the lowest pyramid level\r\n let pyramidLevel = this.props.ome.maxLevel;\r\n let imageSize = 512;\r\n if (formData.fullScene) {\r\n // if module where whole files get classified\r\n imageSize = 512;\r\n pyramidLevel = ome.maxLevel;\r\n } else if (largestRoiPx < MAXIMAGESIZE) {\r\n // if smaller than min size in lowest pyramid level\r\n pyramidLevel = this.props.ome.maxLevel;\r\n let objects150ImageSize = Math.sqrt(150 * avgArea);\r\n imageSize = IMAGESIZEOPTIONS.find((element) => {\r\n return element < objects150ImageSize;\r\n });\r\n imageSize = imageSize ? imageSize : 128;\r\n } else {\r\n // if larger than max size in lowest pyramid level --> get pyramid level where largest object is smaller tha max size\r\n // for each level higher than the base pyramid level, we halve the object size\r\n let lvDistance = Math.ceil(\r\n Math.log(largestRoiPx / MAXIMAGESIZE) / Math.log(2)\r\n );\r\n if (formData[\"modelType\"] == \"segmentation\") {\r\n // go maximum 2 levels above lowest pyramid level\r\n lvDistance = Math.min(2, lvDistance);\r\n }\r\n pyramidLevel = this.props.ome.maxLevel - lvDistance;\r\n pyramidLevel = Math.max(0, pyramidLevel); // no negative pyramid levels are possible\r\n imageSize = 512;\r\n // size of largest object in new pyramid level\r\n largestRoiPx = largestRoiPx / Math.pow(2, Math.ceil(lvDistance));\r\n }\r\n\r\n // update properties with calculated values\r\n this.props.updateFormDataAdvSettings(\"level\", pyramidLevel);\r\n this.setState({ selectedLevel: pyramidLevel });\r\n this.props.updateFormDataAdvSettings(\"tileSize\", imageSize);\r\n this.props.updateFormDataAdvSettings(\"overlap\", parseInt(imageSize / 16));\r\n }\r\n\r\n handleChangeEncoder = (idx, encoder, checked, architecture) => {\r\n const { formData } = this.props;\r\n\r\n let encoders = formData[\"advancedSettings\"][\"backbones\"][architecture];\r\n\r\n if (checked) {\r\n if (!encoders.includes(encoder)) {\r\n encoders.push(encoder);\r\n }\r\n } else {\r\n let index = encoders.indexOf(encoder);\r\n if (index > -1) {\r\n encoders.splice(index, 1);\r\n }\r\n }\r\n\r\n this.props.updateFormDataAdvSettingsEncoders(\r\n \"backbones\",\r\n encoders,\r\n architecture\r\n );\r\n };\r\n\r\n renderEncoder = (encoder, architecture) => {\r\n const { formData } = this.props;\r\n\r\n return (\r\n \r\n {encoder.types.map((encoder, idx) => (\r\n \r\n \r\n this.handleChangeEncoder(\r\n idx,\r\n encoder,\r\n e.currentTarget.checked,\r\n architecture\r\n )\r\n }\r\n />\r\n }\r\n />\r\n \r\n ))}\r\n \r\n );\r\n };\r\n\r\n getOptimizerIndex = (optimizers) => {\r\n let index = optimizers.indexOf(\r\n this.props.formData[\"advancedSettings\"][\"optimizer\"]\r\n );\r\n if (index > -1) {\r\n return index;\r\n } else {\r\n return 0;\r\n }\r\n };\r\n\r\n updateModelInFormData = (encoderArchitecture, decoderArchitecture) => {\r\n for (let item of this.decoderArchitectures) {\r\n this.props.updateFormDataAdvSettingsEncoders(\r\n \"backbones\",\r\n item.name === decoderArchitecture ? [encoderArchitecture] : [],\r\n item.name\r\n );\r\n }\r\n };\r\n\r\n updateComDLModelInFormData = (encoderArchitecture, decoderArchitecture) => {\r\n for (let item of this.decoderArchitectures) {\r\n this.props.updateFormDataAdvSettingsEncoders(\r\n \"backbones\",\r\n item.name === decoderArchitecture ? [encoderArchitecture] : [],\r\n item.name\r\n );\r\n }\r\n };\r\n\r\n setObjectBasedStructure = () => {\r\n const { formData, structures } = this.props;\r\n\r\n if (formData.selStructures.length == 0) {\r\n return;\r\n }\r\n\r\n // get parent of first selected structure\r\n let structureAnnotationIndex = getParentIndexLayer(\r\n formData.selStructures[0],\r\n structures\r\n );\r\n let parentStructure = structures.find(\r\n (s) => s.id === structures[structureAnnotationIndex].parentId\r\n );\r\n let parentAnnotationIndex = getParentIndexLayer(\r\n parentStructure,\r\n structures\r\n );\r\n\r\n this.props.updateFormDataAdvSettings(\r\n \"objectBasedBaseStructure\",\r\n structures[parentAnnotationIndex]\r\n );\r\n };\r\n\r\n renderModelSettings = () => {\r\n const optimizers = [\"Adam\", \"AdamW\", \"SGD\"];\r\n const {\r\n encoders,\r\n selectedDecoder,\r\n selectedEncoderTypeIdx,\r\n selectedEncoderArchitecture,\r\n odModelArchitectures,\r\n instanceSegModelArchitectures,\r\n selectedOdModelArchitecture,\r\n selectedInstanceSegModelArchitecture,\r\n } = this.state;\r\n const { formData, histogramConfig } = this.props;\r\n\r\n return (\r\n
\r\n \r\n \r\n Model architecture:\r\n \r\n \r\n\r\n {formData[\"modelType\"] == \"segmentation\" && (\r\n \r\n \r\n \r\n \r\n {\r\n this.setState({ selectedDecoder: e.target.value });\r\n this.updateModelInFormData(\r\n selectedEncoderArchitecture,\r\n e.target.value\r\n );\r\n }}\r\n >\r\n {this.decoderArchitectures.map((decoderArchitecture) => (\r\n \r\n {decoderArchitecture.label}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n\r\n {(formData[\"modelType\"] == \"segmentation\" ||\r\n formData[\"modelType\"] == \"classification\") && (\r\n \r\n \r\n \r\n \r\n {\r\n this.setState({\r\n selectedEncoderTypeIdx: e.target.value,\r\n selectedEncoderArchitecture:\r\n encoders[e.target.value].types[0],\r\n });\r\n this.updateModelInFormData(\r\n encoders[e.target.value].types[0],\r\n selectedDecoder\r\n );\r\n }}\r\n >\r\n {this.state.encoders.map((encoder, idx) => (\r\n \r\n {encoder.name}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n {\r\n this.setState({\r\n selectedEncoderArchitecture: e.target.value,\r\n });\r\n this.updateModelInFormData(\r\n e.target.value,\r\n selectedDecoder\r\n );\r\n }}\r\n >\r\n {encoders[selectedEncoderTypeIdx].types.map(\r\n (encoderType) => (\r\n \r\n {encoderType}\r\n \r\n )\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {formData[\"modelType\"] == \"object detection\" && (\r\n \r\n {\r\n this.setState({\r\n selectedOdModelArchitecture: e.target.value,\r\n });\r\n this.props.updateFormDataAdvSettings(\r\n \"comDLArchitecture\",\r\n odModelArchitectures.filter(\r\n (element) => element.label == e.target.value\r\n )[0]\r\n );\r\n }}\r\n >\r\n {odModelArchitectures.map((architecture) => (\r\n \r\n {architecture.label}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n\r\n {formData[\"modelType\"] == \"instance segmentation\" && (\r\n \r\n {\r\n this.setState({\r\n selectedInstanceSegModelArchitecture: e.target.value,\r\n });\r\n this.props.updateFormDataAdvSettings(\r\n \"comDLArchitecture\",\r\n instanceSegModelArchitectures.filter(\r\n (element) => element.label == e.target.value\r\n )[0]\r\n );\r\n }}\r\n >\r\n {instanceSegModelArchitectures.map((architecture) => (\r\n \r\n {architecture.label}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n
\r\n\r\n \r\n Hyperparameters:\r\n \r\n\r\n \r\n \r\n {this.state.isBrightfield ? (\r\n \r\n \r\n this.props.updateFormDataAdvSettings(\r\n \"in_channels\",\r\n e.target.value\r\n )\r\n }*/\r\n >\r\n \r\n 3 (RGB)\r\n \r\n {/* \r\n 1 (grey)\r\n */}\r\n \r\n \r\n ) : (\r\n \r\n Input channels\r\n {\r\n if (selected) {\r\n return
{selected.length}
;\r\n } else {\r\n return
0
;\r\n }\r\n }}\r\n >\r\n {histogramConfig.channels.map((channel) => (\r\n \r\n \r\n this.props.updateFormDataAdvSettingsFlChannels(\r\n channel,\r\n e.currentTarget.checked\r\n )\r\n }\r\n />\r\n \r\n \r\n ))}\r\n \r\n
\r\n )}\r\n
\r\n
\r\n \r\n \r\n this.props.updateFormDataAdvSettings(\"epochs\", e.target.value)\r\n }\r\n variant=\"outlined\"\r\n InputProps={{ inputProps: { min: 1, max: 10000 } }}\r\n />\r\n \r\n
\r\n
\r\n \r\n {\r\n this.props.updateFormDataAdvSettings(\r\n \"lossFunction\",\r\n e.target.value\r\n );\r\n }}\r\n >\r\n \r\n Cross Entropy\r\n \r\n \r\n DICE\r\n \r\n \r\n Cross Entropy + DICE\r\n \r\n \r\n \r\n
\r\n \r\n \r\n {\r\n this.setState({ selectedLevel: e.target.value });\r\n this.props.updateFormDataAdvSettings(\"level\", e.target.value);\r\n }}\r\n >\r\n {this.levelDataArray.length > 0 ? (\r\n this.levelDataArray.map((levelData) => (\r\n \r\n {levelData.description}\r\n \r\n ))\r\n ) : (\r\n \r\n 1 : 1\r\n \r\n )}\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n this.props.updateFormDataAdvSettings(\r\n \"batch_size\",\r\n e.target.value\r\n )\r\n }\r\n variant=\"outlined\"\r\n InputProps={{\r\n inputProps: { min: 1, max: 512 },\r\n }}\r\n />\r\n \r\n
\r\n
\r\n {formData[\"modelType\"] === \"segmentation\" && (\r\n \r\n this.props.updateFormDataAdvSettings(\r\n \"useClassWeights\",\r\n e.currentTarget.checked\r\n )\r\n }\r\n />\r\n }\r\n />\r\n )}\r\n
\r\n \r\n \r\n \r\n \r\n this.props.updateFormDataAdvSettings(\"lr\", e.target.value)\r\n }\r\n variant=\"outlined\"\r\n InputProps={{\r\n inputProps: { step: 0.0001 },\r\n }}\r\n />\r\n \r\n
\r\n
\r\n \r\n \r\n this.props.updateFormDataAdvSettings(\r\n \"optimizer\",\r\n optimizers[e.target.value]\r\n )\r\n }\r\n >\r\n {optimizers.map((optimizer, idx) => (\r\n \r\n {optimizer}\r\n \r\n ))}\r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n \r\n Dataset Settings:\r\n \r\n \r\n {formData[\"modelType\"] !== \"classification\" && (\r\n \r\n \r\n \r\n \r\n {\r\n this.props.updateFormDataAdvSettings(\r\n \"datasetApproach\",\r\n e.target.value\r\n );\r\n if (e.target.value === \"Object Based\") {\r\n this.setObjectBasedStructure();\r\n }\r\n }}\r\n >\r\n \r\n Sliding Window\r\n \r\n \r\n Full Image\r\n \r\n \r\n Object Based\r\n \r\n \r\n \r\n \r\n {formData[\"advancedSettings\"][\"datasetApproach\"] ===\r\n \"Sliding Window\" && (\r\n \r\n \r\n {\r\n let n = parseInt(\r\n Math.log2(formData[\"advancedSettings\"][\"tileSize\"]),\r\n 10\r\n );\r\n n =\r\n parseInt(e.target.value) >\r\n formData[\"advancedSettings\"][\"tileSize\"]\r\n ? n + 1\r\n : n - 1;\r\n n = n > 6 ? n : 6;\r\n let resultValue = Math.pow(2, n);\r\n this.props.updateFormDataAdvSettings(\r\n \"tileSize\",\r\n resultValue\r\n );\r\n if (\r\n resultValue <\r\n this.props.formData.advancedSettings.overlap * 2\r\n ) {\r\n this.props.updateFormDataAdvSettings(\r\n \"overlap\",\r\n parseInt(resultValue / 2, 10)\r\n );\r\n }\r\n }}\r\n />\r\n \r\n \r\n )}\r\n\r\n {formData[\"advancedSettings\"][\"datasetApproach\"] ===\r\n \"Sliding Window\" && (\r\n \r\n \r\n \r\n this.props.updateFormDataAdvSettings(\r\n \"overlap\",\r\n e.target.value\r\n )\r\n }\r\n />\r\n \r\n \r\n )}\r\n\r\n {formData[\"advancedSettings\"][\"datasetApproach\"] ===\r\n \"Object Based\" && (\r\n \r\n \r\n this.props.updateFormDataAdvSettings(\r\n \"objectBasedBaseStructure\",\r\n e.target.value\r\n )\r\n }\r\n >\r\n {this.props.structures &&\r\n this.props.structures.map((c) => (\r\n \r\n {c.label}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n\r\n {formData[\"modelType\"] === \"classification\" && (\r\n \r\n \r\n {\r\n let n = parseInt(\r\n Math.log2(formData[\"advancedSettings\"][\"tileSize\"]),\r\n 10\r\n );\r\n n =\r\n parseInt(e.target.value) >\r\n formData[\"advancedSettings\"][\"tileSize\"]\r\n ? n + 1\r\n : n - 1;\r\n n = n > 6 ? n : 6;\r\n let resultValue = Math.pow(2, n);\r\n this.props.updateFormDataAdvSettings(\"tileSize\", resultValue);\r\n }}\r\n />\r\n \r\n \r\n )}\r\n
\r\n \r\n \r\n this.props.updateFormDataAdvSettings(\r\n \"useExistingDataset\",\r\n e.currentTarget.checked\r\n )\r\n }\r\n />\r\n }\r\n />\r\n
\r\n );\r\n };\r\n\r\n render() {\r\n const { classes, formData } = this.props;\r\n const { settingsType } = this.state;\r\n\r\n return (\r\n \r\n \r\n Use default settings if you are a standard user, use advaned settings\r\n if you are an expert user.\r\n \r\n \r\n {\r\n this.setState({ settingsType: e.target.value });\r\n }}\r\n >\r\n }\r\n label=\"Default settings\"\r\n />\r\n }\r\n label=\"Advanced settings\"\r\n />\r\n \r\n \r\n {settingsType === \"advanced\" && (\r\n \r\n {formData[\"modelType\"] === \"segmentation\" &&\r\n this.renderModelSettings()}\r\n {formData[\"modelType\"] === \"classification\" &&\r\n this.renderModelSettings()}\r\n {formData[\"modelType\"] === \"object detection\" &&\r\n this.renderModelSettings()}\r\n {formData[\"modelType\"] === \"instance segmentation\" &&\r\n this.renderModelSettings()}\r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nTrainModelStep4.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n formData: PropTypes.object,\r\n project: PropTypes.object,\r\n files: PropTypes.array,\r\n ome: PropTypes.object,\r\n selectedModel: PropTypes.object,\r\n onChangeFiles: PropTypes.func,\r\n updateFormDataAdvSettingsEncoders: PropTypes.func,\r\n updateFormDataAdvSettings: PropTypes.func,\r\n updateFormDataAdvSettingsFlChannels: PropTypes.func,\r\n deleteFormDataAdvSettingsKeys: PropTypes.func,\r\n createDataSet: PropTypes.func,\r\n structures: PropTypes.array,\r\n roiLayers: PropTypes.array,\r\n histogramConfig: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(TrainModelStep4);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport Slide from \"@mui/material/Slide\";\r\nimport ReplayRoundedIcon from \"@mui/icons-material/ReplayRounded\";\r\nimport {\r\n Stepper,\r\n Step,\r\n StepButton,\r\n MobileStepper,\r\n TextField,\r\n LinearProgress,\r\n} from \"@mui/material\";\r\nimport { ValidatorForm } from \"react-material-ui-form-validator\";\r\nimport AddCircleOutlineIcon from \"@mui/icons-material/AddCircleOutline\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport Draggable from \"react-draggable\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { KeyboardArrowLeft, KeyboardArrowRight } from \"@mui/icons-material\";\r\n\r\nimport TrainModelStep0 from \"./TrainAIModelComponents/TrainModelStep0\";\r\nimport TrainModelStep1 from \"./TrainAIModelComponents/TrainModelStep1\";\r\nimport TrainModelStep2 from \"./TrainAIModelComponents/TrainModelStep2\";\r\nimport TrainModelStep3 from \"./TrainAIModelComponents/TrainModelStep3\";\r\nimport TrainModelStep4 from \"./TrainAIModelComponents/TrainModelStep4\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n dialogContent: {\r\n overflowY: \"hidden\",\r\n minHeight: \"100%\",\r\n },\r\n tableDialog: {\r\n \"& .MuiPaper-root\": {\r\n maxWidth: \"none\",\r\n },\r\n \"& .MuiDialogContent-root\": {\r\n padding: 0,\r\n },\r\n },\r\n dialogRowContainer: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr auto\",\r\n overflow: \"hidden\",\r\n },\r\n content: {\r\n padding: \"0 24px\",\r\n overflow: \"auto\",\r\n },\r\n trainModelInfo: { margin: \"5px\", width: \"calc(50% - 10px)\" },\r\n});\r\n\r\n// finds string between stringBefore and stringAfter\r\nfunction getStringBetween(dataString, stringBefore, stringAfter) {\r\n const regexString = \"(?<=\" + stringBefore + \").*(?=\" + stringAfter + \")\";\r\n return dataString.match(regexString);\r\n}\r\n\r\nfunction PaperComponent(props) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst Transition = React.forwardRef(function Transition(props, ref) {\r\n return ;\r\n});\r\n\r\nclass TrainAIModelDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.selectedModel = { name: \"newModel\" };\r\n this.tileProgress = 0;\r\n this.buildingModelProgress = 0;\r\n this.processingFilesCount = 0;\r\n this.multiplier = 0.0;\r\n }\r\n\r\n updateTrainingProgressObject = (dataString, modelType, isVdlModel) => {\r\n const { projectContext } = this.props;\r\n projectContext.aiStateObject.modelType = modelType;\r\n if (dataString.includes(\"Traceback (most recent call last):\")) {\r\n // further error checking\r\n if (\r\n modelType === \"instance segmentation\" &&\r\n (dataString.includes(\"FileNotFoundError: [Errno 2]\") ||\r\n dataString.includes(\"CUDA out of memory\"))\r\n ) {\r\n projectContext.aiStateObject.errorLabel =\r\n \"Failed: Try a smaller tile size!\";\r\n } else {\r\n projectContext.aiStateObject.errorLabel = \"Failed\";\r\n window.openErrorDialog(dataString);\r\n }\r\n\r\n projectContext.aiStateObject.trainingFinished = true;\r\n projectContext.aiStateObject.trainingSuccessful = false;\r\n projectContext.aiStateObject.showTrainingButton = true;\r\n projectContext.aiStateObject.buildingModel = false;\r\n this.forceUpdate();\r\n return;\r\n } else if (dataString.includes(\"CUDA out of memory\")) {\r\n projectContext.aiStateObject.errorLabel =\r\n \"Failed: Try a smaller tile size / batch size!\";\r\n\r\n projectContext.aiStateObject.trainingFinished = true;\r\n projectContext.aiStateObject.trainingSuccessful = false;\r\n projectContext.aiStateObject.showTrainingButton = true;\r\n projectContext.aiStateObject.buildingModel = false;\r\n }\r\n if (dataString.includes(\"training done\")) {\r\n projectContext.aiStateObject.trainingFinished = true;\r\n projectContext.aiStateObject.showTrainingButton = true;\r\n this.forceUpdate();\r\n return;\r\n }\r\n\r\n if (dataString.includes(\"Train on\")) {\r\n projectContext.aiStateObject.maxEpochs = dataString.match(\"[0-9]+\");\r\n }\r\n\r\n if (dataString.includes(\"processing dataset: \")) {\r\n let tempProgress = parseFloat(\r\n dataString.split(\"processing dataset:\")[1]\r\n ).toFixed(2);\r\n if (tempProgress) {\r\n projectContext.aiStateObject.overallProgress = tempProgress;\r\n }\r\n }\r\n\r\n let stepsProgress = dataString.match(\"[0-9]+/[0-9]+\");\r\n let epochsProgress = projectContext.aiStateObject.epochsProgress;\r\n let vallossProgress = null;\r\n let valmeanIoUProgress = null;\r\n let lossProgress = null;\r\n let meanIoUProgress = null;\r\n\r\n if (\r\n modelType === \"object detection\" ||\r\n (modelType === \"instance segmentation\" && !isVdlModel)\r\n ) {\r\n // instance segmentation and object detection data (comdl models)\r\n // get training progress\r\n epochsProgress = getStringBetween(dataString, \" \\\\[\", \"]\\\\[\");\r\n if (stepsProgress)\r\n projectContext.aiStateObject.stepsProgress = stepsProgress;\r\n\r\n lossProgress = dataString.match(\"(?<=loss:).*\");\r\n if (lossProgress)\r\n projectContext.aiStateObject.metricsDict[\"Training Loss\"] =\r\n lossProgress;\r\n\r\n // get validation metrics\r\n if (dataString.includes(\"Epoch(val)\")) {\r\n let metrics = dataString.substring(\r\n dataString.indexOf(\"]\t\") + 2,\r\n dataString.length\r\n );\r\n let splitMetrics = metrics.split(\", \");\r\n for (let i = 0; i < splitMetrics.length; i++) {\r\n let keyValue = splitMetrics[i].split(\": \");\r\n projectContext.aiStateObject.metricsDict[keyValue[0]] = keyValue[1];\r\n }\r\n }\r\n\r\n // only update if Epochs are included\r\n if (epochsProgress) {\r\n projectContext.aiStateObject.buildingModel = false;\r\n projectContext.aiStateObject.showTrainingProgress = true;\r\n projectContext.aiStateObject.epochsProgress =\r\n epochsProgress + \"/\" + projectContext.aiStateObject.maxEpochs;\r\n }\r\n } else if (modelType === \"instance segmentation\" && isVdlModel) {\r\n // instance segmentation data (vdl models)\r\n if (stepsProgress)\r\n projectContext.aiStateObject.stepsProgress = stepsProgress;\r\n epochsProgress = getStringBetween(dataString, \"Epoch:\", \" Loss:\");\r\n if (epochsProgress) epochsProgress = String(parseInt(epochsProgress) + 1);\r\n\r\n if (dataString.includes(\"Training:\")) {\r\n // training metrics\r\n lossProgress = getStringBetween(dataString, \"Loss: \", \" Best:\");\r\n if (lossProgress)\r\n projectContext.aiStateObject.metricsDict[\"Training Loss\"] =\r\n lossProgress;\r\n } else if (dataString.includes(\"Evaluating:\")) {\r\n // validation metrics\r\n vallossProgress = getStringBetween(dataString, \"Loss: \", \": \");\r\n if (vallossProgress)\r\n projectContext.aiStateObject.metricsDict[\"Validation Loss\"] =\r\n vallossProgress;\r\n }\r\n\r\n // only update if Epochs are included\r\n if (epochsProgress) {\r\n projectContext.aiStateObject.buildingModel = false;\r\n projectContext.aiStateObject.showTrainingProgress = true;\r\n projectContext.aiStateObject.epochsProgress =\r\n epochsProgress + \"/\" + projectContext.aiStateObject.maxEpochs;\r\n }\r\n } else if (modelType === \"classification\") {\r\n // classification data\r\n epochsProgress = dataString.match(\"(?<=Epoch:).*(?=, Loss)\");\r\n if (stepsProgress)\r\n projectContext.aiStateObject.stepsProgress = stepsProgress;\r\n\r\n if (dataString.includes(\"Valid\")) {\r\n vallossProgress = dataString.match(\"(?<=Loss:).*(?=, F1)\");\r\n } else {\r\n lossProgress = dataString.match(\"(?<=Loss:).*(?=, Best)\");\r\n if (lossProgress)\r\n projectContext.aiStateObject.metricsDict[\"Training Loss\"] =\r\n lossProgress;\r\n }\r\n\r\n if (vallossProgress)\r\n projectContext.aiStateObject.metricsDict[\"Validation Loss\"] =\r\n vallossProgress;\r\n\r\n // only update if Epochs are included\r\n if (epochsProgress) {\r\n projectContext.aiStateObject.buildingModel = false;\r\n projectContext.aiStateObject.showTrainingProgress = true;\r\n projectContext.aiStateObject.epochsProgress =\r\n epochsProgress + \"/\" + projectContext.aiStateObject.maxEpochs;\r\n }\r\n } else {\r\n // segmentation data\r\n epochsProgress = dataString.match(\"(?<=Epoch:).*(?=, Loss)\");\r\n if (stepsProgress)\r\n projectContext.aiStateObject.stepsProgress = stepsProgress;\r\n\r\n if (dataString.includes(\"Valid\")) {\r\n vallossProgress = dataString.match(\"(?<=Loss:).*(?=, Accuracy)\");\r\n valmeanIoUProgress = dataString.match(\"(?<=IoU:).*(?=, : )\");\r\n } else {\r\n lossProgress = dataString.match(\"(?<=Loss:).*(?=, Best)\");\r\n if (lossProgress)\r\n projectContext.aiStateObject.metricsDict[\"Training Loss\"] =\r\n lossProgress;\r\n meanIoUProgress = dataString.match(\"(?<=IoU:).*(?=, : )\");\r\n }\r\n\r\n if (meanIoUProgress)\r\n projectContext.aiStateObject.metricsDict[\"Training Loss\"] =\r\n lossProgress;\r\n\r\n if (meanIoUProgress)\r\n projectContext.aiStateObject.metricsDict[\"Training mean IoU\"] =\r\n meanIoUProgress;\r\n\r\n if (vallossProgress)\r\n projectContext.aiStateObject.metricsDict[\"Validation Loss\"] =\r\n vallossProgress;\r\n\r\n if (valmeanIoUProgress)\r\n projectContext.aiStateObject.metricsDict[\"Validation mean IoU\"] =\r\n valmeanIoUProgress;\r\n\r\n // only update if Epochs are included\r\n if (epochsProgress) {\r\n projectContext.aiStateObject.buildingModel = false;\r\n projectContext.aiStateObject.showTrainingProgress = true;\r\n projectContext.aiStateObject.epochsProgress =\r\n epochsProgress + \"/\" + projectContext.aiStateObject.maxEpochs;\r\n }\r\n }\r\n this.forceUpdate();\r\n };\r\n\r\n componentDidMount = () => {\r\n window.updateTrainingData = this.updateTrainingData;\r\n };\r\n\r\n componentWillUnmount = () => {\r\n window.updateTrainingData = this.updateTrainingProgressObject;\r\n };\r\n\r\n setSelectedModel = (model) => {\r\n this.selectedModel = model;\r\n };\r\n\r\n updateTrainingData = (dataString, modelType, isVdlModel) => {\r\n this.updateTrainingProgressObject(dataString, modelType, isVdlModel);\r\n };\r\n\r\n updateFormDataGeneral = (key, value) => {\r\n const { projectContext } = this.props;\r\n projectContext.aiStateObject.formData[key] = value;\r\n this.forceUpdate();\r\n };\r\n\r\n updateFormDataStructures = (structure, checked) => {\r\n const { projectContext } = this.props;\r\n if (checked) {\r\n if (\r\n !projectContext.aiStateObject.formData[\"selStructures\"].includes(\r\n structure\r\n )\r\n ) {\r\n projectContext.aiStateObject.formData[\"selStructures\"].push(structure);\r\n }\r\n } else {\r\n let index =\r\n projectContext.aiStateObject.formData[\"selStructures\"].indexOf(\r\n structure\r\n );\r\n if (index > -1) {\r\n projectContext.aiStateObject.formData[\"selStructures\"].splice(index, 1);\r\n }\r\n }\r\n this.forceUpdate();\r\n };\r\n\r\n updateFormDataAdvSettings = (key, value) => {\r\n const { projectContext } = this.props;\r\n projectContext.aiStateObject.formData[\"advancedSettings\"][key] = value;\r\n this.forceUpdate();\r\n };\r\n\r\n updateFormDataAdvSettingsEncoders = (key, value, architecture) => {\r\n const { projectContext } = this.props;\r\n projectContext.aiStateObject.formData[\"advancedSettings\"][key][\r\n architecture\r\n ] = value;\r\n this.forceUpdate();\r\n };\r\n\r\n updateFormDataAdvSettingsFlChannels = (channel, checked) => {\r\n const { projectContext } = this.props;\r\n if (checked) {\r\n if (\r\n !projectContext.aiStateObject.formData[\"advancedSettings\"][\r\n \"flChannels\"\r\n ].includes(channel.name)\r\n ) {\r\n projectContext.aiStateObject.formData[\"advancedSettings\"][\r\n \"flChannels\"\r\n ].push(channel.name);\r\n }\r\n } else {\r\n let index = projectContext.aiStateObject.formData[\"advancedSettings\"][\r\n \"flChannels\"\r\n ].indexOf(channel.name);\r\n if (index > -1) {\r\n projectContext.aiStateObject.formData[\"advancedSettings\"][\r\n \"flChannels\"\r\n ].splice(index, 1);\r\n }\r\n }\r\n projectContext.aiStateObject.formData[\"advancedSettings\"][\"in_channels\"] =\r\n projectContext.aiStateObject.formData[\"advancedSettings\"][\r\n \"flChannels\"\r\n ].length;\r\n this.forceUpdate();\r\n };\r\n\r\n updateFormDataMetaData = (key, value) => {\r\n const { projectContext } = this.props;\r\n projectContext.aiStateObject.formData[\"metaData\"][key] = value;\r\n this.forceUpdate();\r\n };\r\n\r\n updateFormDataAugmentations = (e, augmentation) => {\r\n const { projectContext } = this.props;\r\n if (e.currentTarget.checked) {\r\n projectContext.aiStateObject.formData[\"augmentations\"].push(augmentation);\r\n } else {\r\n let index =\r\n projectContext.aiStateObject.formData[\"augmentations\"].indexOf(\r\n augmentation\r\n );\r\n if (index > -1) {\r\n projectContext.aiStateObject.formData[\"augmentations\"].splice(index, 1);\r\n }\r\n }\r\n this.forceUpdate();\r\n };\r\n\r\n render() {\r\n const { classes, dialog, projectContext, ...propsWithoutClasses } =\r\n this.props;\r\n\r\n const handleClickOpen = () => {\r\n const { projectContext } = this.props;\r\n projectContext.aiStateObject.open = true;\r\n this.forceUpdate();\r\n };\r\n\r\n const handleClose = (e) => {\r\n const { projectContext } = this.props;\r\n projectContext.aiStateObject.open = false;\r\n e.preventDefault();\r\n this.forceUpdate();\r\n };\r\n\r\n const initTraining = () => {\r\n projectContext.aiStateObject.overallProgress = 0.0;\r\n projectContext.aiStateObject.showTrainingButton = false;\r\n projectContext.aiStateObject.showTrainingProgress = false;\r\n projectContext.aiStateObject.trainingSuccessful = true;\r\n projectContext.aiStateObject.buildingModel = true;\r\n projectContext.aiStateObject.trainingFinished = false;\r\n this.tileProgress = 0;\r\n this.buildingModelProgress = 0;\r\n this.processingFilesCount = 0;\r\n this.forceUpdate();\r\n };\r\n\r\n const handleNext = (datasetOnly = false) => {\r\n const { projectContext } = this.props;\r\n const uniqueName =\r\n projectContext.aiStateObject.formData.metaData.uniqueName;\r\n const validChar =\r\n projectContext.aiStateObject.formData.metaData.validChar;\r\n const newModel = projectContext.aiStateObject.formData.metaData.newModel;\r\n if (typeof datasetOnly !== \"boolean\") {\r\n datasetOnly = false;\r\n }\r\n if (projectContext.aiStateObject.activeStep === 4) {\r\n if (projectContext.aiStateObject.formData.selStructures.length === 0) {\r\n projectContext.aiStateObject.activeStep = 1;\r\n this.forceUpdate();\r\n return;\r\n }\r\n\r\n // skip redirect if dataset only or existing model,\r\n if (!datasetOnly && newModel) {\r\n // else check for valid name\r\n if (!(uniqueName && validChar)) {\r\n projectContext.aiStateObject.activeStep = 3;\r\n this.forceUpdate();\r\n return;\r\n }\r\n }\r\n\r\n initTraining();\r\n\r\n projectContext.aiStateObject.formData[\"selStructures\"].forEach(\r\n (selStructure) => {\r\n let idx = this.props.structures.findIndex(\r\n (element) => element === selStructure\r\n );\r\n\r\n if (idx > -1) {\r\n projectContext.aiStateObject.formData[\"structureIndices\"].push(\r\n idx\r\n );\r\n }\r\n }\r\n );\r\n\r\n projectContext.aiStateObject.open = false;\r\n let data = {\r\n parameters: projectContext.aiStateObject.formData,\r\n projectId: this.props.projectId,\r\n };\r\n data.parameters.datasetOnly = datasetOnly;\r\n\r\n this.props.onSave(() => {\r\n // send parameters to backend for ai training\r\n projectContext.aiStateObject.startTrainingTime = new Date();\r\n Backend.aiTrainingSignalR(\r\n data,\r\n (progress) => {\r\n console.log(\"Training Result\");\r\n console.log(progress);\r\n },\r\n () => {\r\n console.log(\"finished!\");\r\n },\r\n (error) => {\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n });\r\n this.forceUpdate();\r\n return;\r\n }\r\n projectContext.aiStateObject.activeStep += 1;\r\n this.forceUpdate();\r\n };\r\n\r\n const handleBack = () => {\r\n projectContext.aiStateObject.activeStep -= 1;\r\n this.forceUpdate();\r\n };\r\n\r\n const onStopTraining = () => {\r\n Backend.stopAITraining((result) => {\r\n console.log(\"stopping ai training\", result);\r\n });\r\n };\r\n\r\n const steps = [\r\n \"Select Model Type\",\r\n \"Select Structures\",\r\n \"Augmentations\",\r\n \"Meta Data\",\r\n \"Settings\",\r\n ];\r\n\r\n return (\r\n
\r\n {dialog === \"TrainModelPages\" && (\r\n
\r\n {projectContext.aiStateObject.showTrainingButton && (\r\n \r\n \r\n \r\n Train Custom AI Model\r\n \r\n
\r\n )}\r\n\r\n {projectContext.aiStateObject.buildingModel && (\r\n \r\n 0\r\n ? projectContext.aiStateObject.overallProgress + \"%\"\r\n : \"\"\r\n }\r\n InputProps={{\r\n readOnly: true,\r\n disableUnderline: true,\r\n }}\r\n />\r\n 0\r\n ? \"determinate\"\r\n : \"indeterminate\"\r\n }\r\n value={Number(projectContext.aiStateObject.overallProgress)}\r\n />\r\n
\r\n )}\r\n {projectContext.aiStateObject.showTrainingProgress && (\r\n \r\n {(projectContext.aiStateObject.modelType ===\r\n \"object detection\" ||\r\n projectContext.aiStateObject.modelType ===\r\n \"instance segmentation\" ||\r\n projectContext.aiStateObject.modelType === \"segmentation\" ||\r\n projectContext.aiStateObject.modelType ===\r\n \"classification\") && (\r\n
\r\n \r\n \r\n
\r\n {Object.entries(\r\n projectContext.aiStateObject.metricsDict\r\n ).map(([key, value]) => {\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n )}\r\n\r\n {!projectContext.aiStateObject.showTrainingButton && (\r\n
\r\n \r\n Interrupt Training\r\n \r\n
\r\n )}\r\n\r\n {projectContext.aiStateObject.showOptimizationProgress && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n\r\n {projectContext.aiStateObject.trainingFailed && (\r\n
\r\n \r\n {projectContext.aiStateObject.errorLabel}\r\n \r\n }\r\n onClick={() => {\r\n projectContext.aiStateObject.buildingModel = false;\r\n projectContext.aiStateObject.showTrainingProgress = false;\r\n projectContext.aiStateObject.hideStartTraining = false;\r\n projectContext.aiStateObject.trainingFinished = false;\r\n projectContext.aiStateObject.epochsProgress = \"\";\r\n projectContext.aiStateObject.stepsProgress = \"\";\r\n projectContext.aiStateObject.meanIoUProgress = \"\";\r\n projectContext.aiStateObject.lossProgress = \"\";\r\n projectContext.aiStateObject.valmeanIoUProgress = \"\";\r\n projectContext.aiStateObject.vallossProgress = \"\";\r\n this.forceUpdate();\r\n }}\r\n >\r\n Restart Training\r\n \r\n
\r\n )}\r\n \r\n )}\r\n {projectContext.aiStateObject.trainingFinished && (\r\n
\r\n \r\n {projectContext.aiStateObject.trainingSuccessful\r\n ? \"Successful\"\r\n : projectContext.aiStateObject.errorLabel}\r\n \r\n
\r\n )}\r\n \r\n \r\n \r\n
\r\n \r\n {projectContext.aiStateObject.activeStep == 0\r\n ? \"Select Model Type\"\r\n : projectContext.aiStateObject.activeStep == 1\r\n ? \"Select Structures\"\r\n : projectContext.aiStateObject.activeStep == 2\r\n ? \"Augmentations\"\r\n : projectContext.aiStateObject.activeStep == 3\r\n ? \"Meta Data\"\r\n : \"Settings\"}\r\n \r\n
\r\n {projectContext.aiStateObject.activeStep === 0 && (\r\n \r\n )}\r\n {projectContext.aiStateObject.activeStep === 1 && (\r\n \r\n )}\r\n {projectContext.aiStateObject.activeStep === 2 && (\r\n \r\n )}\r\n {projectContext.aiStateObject.activeStep === 3 && (\r\n \r\n )}\r\n {projectContext.aiStateObject.activeStep === 4 && (\r\n {\r\n handleNext(true);\r\n }}\r\n />\r\n )}\r\n
\r\n\r\n
\r\n \r\n {steps.map((label, index) => {\r\n const stepProps = {};\r\n const buttonProps = {};\r\n return (\r\n \r\n {\r\n projectContext.aiStateObject.activeStep =\r\n index;\r\n this.forceUpdate();\r\n }}\r\n {...buttonProps}\r\n >\r\n {label}\r\n \r\n \r\n );\r\n })}\r\n \r\n\r\n \r\n {projectContext.aiStateObject.activeStep === 4\r\n ? \"Train\"\r\n : \"Next\"}\r\n \r\n \r\n }\r\n backButton={\r\n \r\n \r\n {\"Back\"}\r\n \r\n }\r\n />\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nTrainAIModelDialog.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n handleOptionsClose: PropTypes.func,\r\n structures: PropTypes.array,\r\n roiLayers: PropTypes.array,\r\n formDataAICockpit: PropTypes.object,\r\n setAvailableModels: PropTypes.func,\r\n setFormDataAICockpit: PropTypes.func,\r\n projectId: PropTypes.string,\r\n onSave: PropTypes.func,\r\n ome: PropTypes.object,\r\n dialog: PropTypes.string,\r\n projectStringProperties: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n projectContext: PropTypes.object,\r\n fileId: PropTypes.string,\r\n};\r\n\r\nexport default withStyles(styles)(TrainAIModelDialog);\r\n","import React, { Component } from \"react\";\r\n\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n Checkbox,\r\n FormControlLabel,\r\n Table,\r\n TableBody,\r\n TableRow,\r\n TableCell,\r\n Tooltip,\r\n MenuItem,\r\n TextField,\r\n IconButton,\r\n} from \"@mui/material\";\r\nimport PublishIcon from \"@mui/icons-material/Publish\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport MuiAccordion from \"@mui/material/Accordion\";\r\nimport MuiAccordionSummary from \"@mui/material/AccordionSummary\";\r\nimport MuiAccordionDetails from \"@mui/material/AccordionDetails\";\r\n\r\nimport Backend from \"../../../common/utils/Backend\";\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\n\r\nimport { withAllViewerContexts } from \"../../contexts/AllViewerContexts\";\r\n\r\nconst Accordion = withStyles({\r\n root: {\r\n border: \"1px solid rgba(0, 0, 0, .125)\",\r\n boxShadow: \"none\",\r\n \"&:not(:last-child)\": {\r\n borderBottom: 0,\r\n },\r\n \"&:before\": {\r\n display: \"none\",\r\n },\r\n \"&$expanded\": {\r\n margin: \"auto\",\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordion);\r\n\r\nconst AccordionSummary = withStyles({\r\n root: {\r\n backgroundColor: \"rgba(0, 0, 0, .03)\",\r\n borderBottom: \"1px solid rgba(0, 0, 0, .125)\",\r\n marginBottom: -1,\r\n minHeight: 56,\r\n \"&$expanded\": {\r\n minHeight: 56,\r\n },\r\n },\r\n content: {\r\n \"&$expanded\": {\r\n margin: \"12px 0\",\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordionSummary);\r\n\r\nconst AccordionDetails = withStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n },\r\n}))(MuiAccordionDetails);\r\n\r\nconst styles = {\r\n root: {\r\n width: \"100%\",\r\n },\r\n};\r\nlet usableModels = {};\r\n\r\nclass SideBarTabAISelectByModel extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.selectedModels = [];\r\n this.aiCockpitLoaded = false;\r\n this.state = {\r\n expandedIdx: -1, //nothing expanded on mount\r\n export: false,\r\n delete: false,\r\n init: false,\r\n };\r\n }\r\n\r\n componentDidUpdate = () => {\r\n if (this.props.formDataAICockpit && !this.aiCockpitLoaded) {\r\n this.aiCockpitLoaded = true;\r\n this.init();\r\n }\r\n\r\n this.updateModelCheckboxes();\r\n };\r\n\r\n modelIsSelected = (modelName) => {\r\n return this.selectedModels.indexOf(modelName) > -1;\r\n };\r\n\r\n /**\r\n * Evaluate all AI model checkboxes, if they should be checked or not.\r\n * Models for a structure with an appointed model should be deactivated.\r\n * Needed values are stored in props.\r\n */\r\n updateModelCheckboxes = () => {\r\n const { formDataAICockpit } = this.props;\r\n let checkboxesChanged = false;\r\n if (formDataAICockpit) {\r\n // Iterate over all present models\r\n for (const [key, model] of Object.entries(usableModels)) {\r\n let modelIsDisabled = false;\r\n let modelIsChecked = false;\r\n\r\n // Iterate over all possible structures of each model\r\n for (let usableStructure of model.usableStructures) {\r\n // Get current state of currently viewed possible structure of current model\r\n let selectedModel =\r\n formDataAICockpit[usableStructure.id].selectedModel;\r\n let structureIsChecked = usableStructure.isChecked;\r\n let structureIsDisabled = usableStructure.isDisabled;\r\n\r\n // A model has already been assigned to the current structure\r\n if (selectedModel !== null) {\r\n structureIsChecked = true;\r\n\r\n // It is the same as the current model\r\n if (key === selectedModel) {\r\n modelIsChecked = true;\r\n structureIsDisabled = false;\r\n }\r\n // It is a different model\r\n else {\r\n structureIsDisabled = true;\r\n modelIsDisabled = true;\r\n }\r\n }\r\n // No model selected for this structure\r\n else {\r\n structureIsChecked = false;\r\n structureIsDisabled = false;\r\n }\r\n\r\n // Update usable structure attibutes\r\n if (\r\n structureIsChecked !== usableStructure.isChecked ||\r\n structureIsDisabled !== usableStructure.isDisabled\r\n ) {\r\n usableStructure.isDisabled = structureIsDisabled;\r\n usableStructure.isChecked = structureIsChecked;\r\n checkboxesChanged = true;\r\n }\r\n }\r\n\r\n // Update model attributes\r\n if (\r\n modelIsDisabled !== model.isDisabled ||\r\n modelIsChecked !== model.isChecked\r\n ) {\r\n model.isDisabled = modelIsDisabled;\r\n model.isChecked = modelIsChecked;\r\n checkboxesChanged = true;\r\n }\r\n }\r\n if (checkboxesChanged) {\r\n this.updateSelectedTool();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Runs all checks when component initializes or updates.\r\n */\r\n init = () => {\r\n const { structures, formDataAICockpit, availableModels } = this.props;\r\n usableModels = {};\r\n\r\n for (let row of Object.values(formDataAICockpit)) {\r\n // Filter models per structure\r\n let availableModelsForStructure =\r\n this.props.getAvailableModelsForStructure(\r\n availableModels,\r\n row.fullStructure\r\n );\r\n\r\n // Extract necessary information from structure\r\n let usableStructure = {\r\n id: row.fullStructure.id,\r\n structurePath: row.fullStructure.label,\r\n name: row.fullStructure.label,\r\n isChecked: false,\r\n isDisabled: false,\r\n };\r\n\r\n // Find the topmost parent and build the structure path name as follows:\r\n // Top - Intermediate - Intermediate - Target Structure\r\n let parentId = row.fullStructure.parentId;\r\n let findParentId = (structure) => structure.id === parentId;\r\n while (parentId > 0) {\r\n let parentStructure = structures.find(findParentId);\r\n if (parentStructure) {\r\n usableStructure.structurePath =\r\n parentStructure.label + \" - \" + usableStructure.structurePath;\r\n\r\n parentId = parentStructure.parentId;\r\n } else {\r\n parentId = -1;\r\n }\r\n }\r\n\r\n if (availableModelsForStructure) {\r\n // Ensure structures are assigned to models\r\n for (let model of availableModelsForStructure) {\r\n if (model.versions.length === 0) continue;\r\n let usableStructurClone = JSON.parse(JSON.stringify(usableStructure));\r\n\r\n // In case of missing model, insert model into usable models\r\n if (!(model.name in usableModels)) {\r\n // Create new usable model from model\r\n usableModels[model.name] = {\r\n label: model.label,\r\n name: model.name,\r\n versions: [...model.versions],\r\n usableStructures: [usableStructurClone],\r\n isChecked: false,\r\n isDisabled: false,\r\n };\r\n\r\n try {\r\n usableModels[model.name].structure_indices =\r\n model.versions[model.versions.length - 1].structure_indices;\r\n } catch {\r\n console.log(\r\n \"Error: Structure indices in last model version not found\"\r\n );\r\n }\r\n }\r\n\r\n // In case of normal model, simply add model\r\n else {\r\n usableModels[model.name].usableStructures.push(usableStructurClone);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.updateModelCheckboxes();\r\n this.setState({ init: true });\r\n };\r\n\r\n componentDidMount = () => {\r\n if (this.props.formDataAICockpit && !this.aiCockpitLoaded) {\r\n this.aiCockpitLoaded = true;\r\n this.init();\r\n }\r\n };\r\n\r\n updateSelectedTool = () => {\r\n // No model is selected -> exit\r\n if (!(this.state.expandedIdx >= 0)) {\r\n this.props.onChangeTool(\"none\");\r\n return;\r\n }\r\n\r\n // Only modify the currently selected model\r\n // Except models with \"Hyper\" and/or \"Efficiant\" in their name -> exit\r\n let selectedModel = Object.values(usableModels)[this.state.expandedIdx];\r\n if (\r\n !selectedModel.isChecked ||\r\n selectedModel.name.includes(\"Hyper\") ||\r\n selectedModel.name.includes(\"Efficient\")\r\n ) {\r\n this.props.onChangeTool(\"none\");\r\n return;\r\n }\r\n\r\n for (let structure of selectedModel.usableStructures) {\r\n // Ensure that each structure only has 1 model assigned.\r\n if (structure.isDisabled || !structure.isChecked) {\r\n continue;\r\n }\r\n\r\n // Assign checked model to its structure.\r\n this.props.setAiUsedStructures(\r\n {\r\n structureName: structure.name,\r\n selectedModel: selectedModel.name,\r\n selectedVersion: selectedModel.versions[0].label,\r\n id: structure.id,\r\n },\r\n \"add\"\r\n );\r\n // No break\r\n }\r\n\r\n for (let structure of selectedModel.usableStructures) {\r\n if (structure.isDisabled || !structure.isChecked) {\r\n continue;\r\n }\r\n\r\n // Find global index of current structure\r\n let selectedLayerIdx = this.props.structures.findIndex(\r\n (item) => item.id === structure.id\r\n );\r\n\r\n // Check if in viewerless \"FilesGallery\" mode and keep current layer\r\n const fileClassification =\r\n this.props.viewerConfig.project.projectStringProperties[\"ViewerType\"] ==\r\n \"FilesGallery\";\r\n if (fileClassification) {\r\n selectedLayerIdx = this.props.projectContext.selectedLayer; // do not change layer for classification models\r\n }\r\n\r\n // Update selected structure and open the AI preview window for it\r\n if (selectedLayerIdx >= 0) {\r\n this.props.projectContext.setState(\r\n { selectedLayer: selectedLayerIdx },\r\n () => {\r\n this.props.onChangeTool(\"iam_ai_inference\", {\r\n selectedModel: selectedModel.name,\r\n selectedVersion: selectedModel.versions[0].label,\r\n });\r\n }\r\n );\r\n return;\r\n }\r\n break;\r\n }\r\n\r\n this.props.onChangeTool(\"none\");\r\n };\r\n\r\n handleExpandingChange = (idx) => {\r\n let expandedIdx = this.state.expandedIdx === idx ? -1 : idx;\r\n this.setState({ expandedIdx }, () => this.updateSelectedTool());\r\n };\r\n\r\n onExportClick = (modelName, version) => {\r\n this.setState({ export: true });\r\n var aiModel = {\r\n Name: modelName,\r\n WeightsName: version,\r\n };\r\n Backend.exportAIModel(JSON.stringify(aiModel), (result) => {\r\n console.log(\"Success\", result);\r\n this.setState({ export: false });\r\n });\r\n };\r\n\r\n onDeleteClick = (modelName, version) => {\r\n window.openResponseDialog(\"Delete model forever?\", (response) => {\r\n if (response) {\r\n this.setState({ delete: true });\r\n var aiModel = {\r\n Name: modelName,\r\n WeightsName: version,\r\n };\r\n Backend.deleteAIModel(JSON.stringify(aiModel), (result) => {\r\n this.props.initAIFormData(false);\r\n this.setState({ delete: false });\r\n if (result.successful) {\r\n window.showSuccessSnackbar(result.information);\r\n } else {\r\n window.showErrorSnackbar(result.information);\r\n }\r\n });\r\n }\r\n });\r\n };\r\n\r\n // toggle model and uncheck all structures or check best fit structures\r\n toggleModel = (model) => {\r\n const usableStructures = usableModels[model.name].usableStructures;\r\n if (model.isChecked) {\r\n this.props.setAiUsedStructures(null, \"remove_all\");\r\n usableStructures.forEach((usableStructure) => {\r\n if (usableStructure.isChecked && !usableStructure.isDisabled) {\r\n this.props.handleChangeModel(null, usableStructure.id);\r\n }\r\n });\r\n } else {\r\n if (model.structure_indices) {\r\n const structures = this.props.structures;\r\n usableStructures.forEach((usableStructure) => {\r\n for (let idx of model.structure_indices) {\r\n if (\r\n idx < structures.length &&\r\n structures[idx].label === usableStructure.name\r\n ) {\r\n this.props.handleChangeModel(model.name, usableStructure.id);\r\n break;\r\n }\r\n }\r\n });\r\n } else if (model.structure) {\r\n let structureNameArray = model.structure.split(\",\");\r\n for (let structureName of structureNameArray) {\r\n for (let usableStructure of usableStructures) {\r\n if (!usableStructure.isChecked) {\r\n if (usableStructure.name === structureName) {\r\n this.props.handleChangeModel(model.name, usableStructure.id);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n this.props.handleChangeModel(model.name, usableStructures[0].id);\r\n }\r\n }\r\n };\r\n\r\n handleModelChange = (model, usableStructure) => {\r\n this.props.handleChangeModel(\r\n usableStructure.isChecked ? null : model.name,\r\n usableStructure.id\r\n );\r\n };\r\n\r\n render() {\r\n const { expandedIdx } = this.state;\r\n const { classes, formDataAICockpit } = this.props;\r\n return (\r\n
\r\n {Object.values(usableModels).map((model, idx) => {\r\n let checkedStructure = model.usableStructures.find(\r\n (item) => item.isChecked\r\n );\r\n let selectedDropDownVersion =\r\n model.versions[model.versions.length - 1].label;\r\n let selectedModel = model.name;\r\n const modelVersion = model.versions.find(\r\n (version) => version.label === selectedDropDownVersion\r\n );\r\n\r\n // Select the correct version of if the currently opened structure.\r\n let structure = null;\r\n if (checkedStructure && model) {\r\n structure = checkedStructure.id;\r\n selectedDropDownVersion =\r\n (model &&\r\n formDataAICockpit[structure].models[selectedModel] &&\r\n formDataAICockpit[structure].models[selectedModel]\r\n .selectedVersion) ||\r\n \"\";\r\n }\r\n\r\n return (\r\n this.handleExpandingChange(idx)}\r\n >\r\n }\r\n aria-label=\"Expand\"\r\n >\r\n event.stopPropagation()}\r\n onFocus={(event) => event.stopPropagation()}\r\n control={\r\n \r\n {\r\n this.toggleModel(model);\r\n this.updateModelCheckboxes();\r\n }}\r\n />\r\n \r\n }\r\n label={model.label}\r\n />\r\n \r\n \r\n {model.versions.length > 0 && expandedIdx === idx && (\r\n
\r\n \r\n \r\n \r\n Version\r\n \r\n
\r\n {\r\n this.props.handleChangeVersion(\r\n event,\r\n structure,\r\n selectedModel\r\n );\r\n }}\r\n disabled={!model.isChecked}\r\n >\r\n {model.versions.map((version, idx) => (\r\n \r\n {version.label}\r\n \r\n ))}\r\n \r\n\r\n {this.state.export ? (\r\n \r\n ) : (\r\n \r\n \r\n this.onExportClick(\r\n model.label,\r\n selectedDropDownVersion\r\n )\r\n }\r\n style={{\r\n float: \"right\",\r\n }}\r\n >\r\n \r\n \r\n \r\n )}\r\n {this.state.delete ? (\r\n \r\n ) : (\r\n \r\n \r\n this.onDeleteClick(\r\n model.label,\r\n selectedDropDownVersion\r\n )\r\n }\r\n style={{\r\n float: \"right\",\r\n }}\r\n >\r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n
\r\n \r\n Name:\r\n {model.label}\r\n \r\n \r\n Type:\r\n {modelVersion.modeltype}\r\n \r\n \r\n Structures:\r\n \r\n {model.usableStructures.map(\r\n (usableStructure, structureIdx) => (\r\n
\r\n {\r\n if (\r\n model.structure_indices &&\r\n model.structure_indices.length ==\r\n model.usableStructures.length\r\n ) {\r\n for (let struct of model.usableStructures) {\r\n this.handleModelChange(\r\n model,\r\n struct\r\n );\r\n }\r\n } else {\r\n this.handleModelChange(\r\n model,\r\n usableStructure\r\n );\r\n }\r\n\r\n this.updateModelCheckboxes();\r\n }}\r\n />\r\n }\r\n label={usableStructure.structurePath}\r\n />\r\n
\r\n )\r\n )}\r\n
\r\n
\r\n \r\n Creation Date:\r\n {modelVersion.datetime}\r\n \r\n \r\n Objects used for training:\r\n \r\n {modelVersion.trainingobjectscount}\r\n \r\n \r\n \r\n Epochs:\r\n \r\n {modelVersion.epochs && modelVersion.epochs !== 0\r\n ? modelVersion.epochs\r\n : \"-\"}\r\n \r\n \r\n
\r\n
\r\n {\r\n \r\n \r\n \r\n \r\n Validation Loss:\r\n
\r\n {modelVersion.validationloss &&\r\n modelVersion.validationloss !== 1\r\n ? parseFloat(\r\n modelVersion.validationloss.toPrecision(4)\r\n )\r\n : \"-\"}\r\n
\r\n \r\n Validation Mean IoU:\r\n
\r\n {modelVersion.validationmeaniou &&\r\n modelVersion.validationmeaniou !== 1\r\n ? parseFloat(\r\n modelVersion.validationmeaniou.toPrecision(\r\n 4\r\n )\r\n )\r\n : \"-\"}\r\n
\r\n
\r\n
\r\n
\r\n }\r\n
\r\n )}\r\n
\r\n \r\n );\r\n })}\r\n
\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSideBarTabAISelectByModel.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n availableModels: PropTypes.array,\r\n formDataAICockpit: PropTypes.object,\r\n structures: PropTypes.array,\r\n getAvailableModelsForStructure: PropTypes.func,\r\n handleChangeModel: PropTypes.func,\r\n handleChangeVersion: PropTypes.func,\r\n onChangeTool: PropTypes.func,\r\n projectContext: PropTypes.object,\r\n initAIFormData: PropTypes.func,\r\n setAiUsedStructures: PropTypes.func,\r\n viewerConfig: PropTypes.object,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withStyles(styles)(SideBarTabAISelectByModel)\r\n);\r\n","import React, { Component } from \"react\";\r\n\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport Table from \"@mui/material/Table\";\r\nimport {\r\n TableContainer,\r\n TableHead,\r\n Paper,\r\n TableRow,\r\n Select,\r\n MenuItem,\r\n TableBody,\r\n TableCell,\r\n IconButton,\r\n Tabs,\r\n Tab,\r\n Typography,\r\n Tooltip,\r\n} from \"@mui/material\";\r\n\r\nimport MuiAccordion from \"@mui/material/Accordion\";\r\nimport MuiAccordionSummary from \"@mui/material/AccordionSummary\";\r\nimport MuiAccordionDetails from \"@mui/material/AccordionDetails\";\r\n\r\nimport {\r\n Remove,\r\n PlayArrow,\r\n ArrowDropDown,\r\n ArrowDropUp,\r\n Refresh,\r\n CloudDownload,\r\n GetApp,\r\n} from \"@mui/icons-material\";\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\n\r\nimport { withAllViewerContexts } from \"../../../viewer/contexts/AllViewerContexts\";\r\nimport Backend from \"../../../common/utils/Backend\";\r\nimport AIModelDialog from \"../../../home/dialogs/AIModelDialog\";\r\nimport TrainAIModelDialog from \"../../../home/dialogs/TrainAIModelDialog\";\r\nimport SideBarTabAISelectByModel from \"./SideBarTabAISelectByModel\";\r\n\r\nconst Accordion = withStyles({\r\n root: {\r\n border: \"1px solid rgba(0, 0, 0, .125)\",\r\n boxShadow: \"none\",\r\n \"&:not(:last-child)\": {\r\n borderBottom: 0,\r\n },\r\n \"&:before\": {\r\n display: \"none\",\r\n },\r\n \"&$expanded\": {\r\n margin: \"auto\",\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordion);\r\n\r\nconst AccordionSummary = withStyles({\r\n root: {\r\n backgroundColor: \"rgba(0, 0, 0, .03)\",\r\n borderBottom: \"1px solid rgba(0, 0, 0, .125)\",\r\n marginBottom: -1,\r\n minHeight: 56,\r\n \"&$expanded\": {\r\n minHeight: 56,\r\n },\r\n },\r\n content: {\r\n \"&$expanded\": {\r\n margin: \"12px 0\",\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordionSummary);\r\n\r\nconst AccordionDetails = withStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n },\r\n}))(MuiAccordionDetails);\r\n\r\nconst styles = {\r\n root: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n overflow: \"hidden\",\r\n },\r\n tableContainer: {\r\n width: \"100%\",\r\n boxShadow: \"none\",\r\n },\r\n table: {\r\n width: \"100%\",\r\n },\r\n flexRowRemainingHeight: {\r\n flex: \"1 1 auto\",\r\n overflowY: \"auto\",\r\n },\r\n spinnerContainer: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n padding: \"20px\",\r\n textAlign: \"center\",\r\n },\r\n tab: {\r\n minWidth: \"100px\",\r\n minHeight: \"25px\",\r\n fontWeight: \"bold\",\r\n },\r\n tabContainer: {\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n },\r\n modelSelectionContainer: {\r\n position: \"reltative\",\r\n },\r\n getOnlineModelsContainer: {\r\n position: \"absolute\",\r\n top: 5,\r\n right: 15,\r\n },\r\n accordionContainer: {\r\n height: \"100%\",\r\n overflow: \"auto\",\r\n },\r\n};\r\n\r\n// RIP AI-Cockpit\r\nclass SideBarTabAI extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n activeTab: 0,\r\n online: true,\r\n isImporting: false,\r\n };\r\n try {\r\n this.state.online = props.viewerConfig.project.projectProperties.Online;\r\n } catch {\r\n console.log(\r\n \"Error: 'online' could not be read in Project Module config!\"\r\n );\r\n }\r\n this.initModelCounter = -1;\r\n }\r\n\r\n componentDidMount() {\r\n this.props.initAIFormData(false);\r\n }\r\n\r\n setFormDataAICockpit = (formDataAICockpit) => {\r\n this.props.setAIFormData(formDataAICockpit);\r\n };\r\n\r\n checkForAvailableIAMSubtype = (structure) => {\r\n let childs = this.findChilds(structure);\r\n for (let i = 1; i < childs.length; i++) {\r\n if (childs[i].tools.length > 0) return true;\r\n }\r\n return false;\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n findClassificationSubtypes = (subType) => {\r\n const { structures } = this.props;\r\n\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n getParentIndex = (structure) => {\r\n let parentIndex = this.props.structures.findIndex(\r\n (element) => element.id === structure.parentId\r\n );\r\n return parentIndex;\r\n };\r\n\r\n findAllSubtypes = (str) => {\r\n let childs = this.findChilds(str);\r\n let allChilds = [];\r\n\r\n while (childs.length !== 0) {\r\n childs = childs.concat(this.findChilds(childs[0]));\r\n if (!allChilds.includes(childs[0])) {\r\n allChilds.push(childs[0]);\r\n }\r\n childs.shift();\r\n }\r\n\r\n return allChilds;\r\n };\r\n\r\n hideSubtypes = (subType, lv) => {\r\n if (subType.hasChild) {\r\n let childs = this.findChilds(subType);\r\n for (let i = 0; i < childs.length; i++) {\r\n this.hideSubtypes(childs[i], lv);\r\n }\r\n }\r\n // make visibility like parent\r\n if (subType.classificationSubtype && subType.subtypeLevel > lv) {\r\n let idx = this.getParentIndex(subType);\r\n subType.visible = this.props.structures[idx].visible;\r\n }\r\n subType.showSubtypes = false;\r\n subType.isUnfolded = false;\r\n this.props.projectContext.forceUpdate();\r\n };\r\n\r\n showSubtypes = (subType) => {\r\n const { structures } = this.props;\r\n for (let structure of structures) {\r\n if (structure.parentId === subType.id) {\r\n structure.isUnfolded = true;\r\n }\r\n }\r\n this.props.projectContext.setState({ structures });\r\n };\r\n\r\n /**\r\n * Assigns a given model to a given structure.\r\n * @param {string} selModel Name of model\r\n * @param {int} structureId Structure id\r\n */\r\n handleChangeModel = (selModel, structureId) => {\r\n const formDataAICockpit = this.props.formDataAICockpit;\r\n\r\n if (selModel === \"null\") {\r\n selModel = null;\r\n }\r\n\r\n // Assign model to structure\r\n formDataAICockpit[structureId].selectedModel = selModel;\r\n\r\n // Save changes\r\n this.props.setAIFormData(formDataAICockpit);\r\n };\r\n\r\n handleChangeVersion = (event, structure, selectedModel) => {\r\n if (selectedModel) {\r\n const formDataAICockpit = this.props.formDataAICockpit;\r\n const modelName = formDataAICockpit[structure].selectedModel;\r\n const versionName = event.target.value;\r\n formDataAICockpit[structure].models[selectedModel].selectedVersion =\r\n versionName;\r\n\r\n if (modelName !== null) {\r\n for (const key of Object.keys(formDataAICockpit)) {\r\n if (formDataAICockpit[key].selectedModel === modelName) {\r\n formDataAICockpit[key].selectedVersion = versionName;\r\n formDataAICockpit[key].models[selectedModel].selectedVersion =\r\n versionName;\r\n }\r\n }\r\n }\r\n const params = {\r\n selectedModel: selectedModel,\r\n selectedVersion: event.target.value,\r\n };\r\n this.props.onChangeTool(\"iam_ai_inference\", params);\r\n this.props.setAIFormData(formDataAICockpit);\r\n }\r\n };\r\n\r\n handleImportModelSelection = (e) => {\r\n let files = e.target.files;\r\n this.setState({\r\n isImporting: true,\r\n });\r\n Backend.importAIModels(files[0], (result) => {\r\n if (!result.success) {\r\n window.showErrorSnackbar(\"Import failed\");\r\n } else if (result.fileIsNew) {\r\n this.props.initAIFormData(false);\r\n window.showSuccessSnackbar(\"Successfully imported model\");\r\n } else {\r\n window.showWarningSnackbar(\"Model already exists\");\r\n }\r\n this.setState({\r\n isImporting: false,\r\n });\r\n });\r\n };\r\n\r\n handleChangeActiveTab = (event, value) => {\r\n this.setState({ activeTab: value });\r\n };\r\n\r\n getAvailableModelsForStructure = (availableModels, fullStructure) => {\r\n // get models that can be used with given structure\r\n const { structures } = this.props;\r\n\r\n if (availableModels) {\r\n // // different checks for parents and subtypes\r\n // if (!fullStructure.classificationSubtype) {\r\n return availableModels.filter((model) => {\r\n if (model.name.includes(\"Hyper\") || model.name.includes(\"Efficient\")) {\r\n return (\r\n model.versions[0].structure &&\r\n model.versions[0].structure.includes(\r\n fullStructure.label.substring(0, 3)\r\n )\r\n );\r\n } else if (\r\n model.versions.length > 0 &&\r\n model.versions[0].structure_indices\r\n ) {\r\n for (let idx of model.versions[0].structure_indices) {\r\n if (structures.length > idx) {\r\n if (structures[idx].label === fullStructure.label) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n });\r\n // } else {\r\n // let parentStructure = structures.filter(\r\n // (element) => element.id === fullStructure.parentId\r\n // )[0];\r\n // return availableModels.filter(\r\n // (element) =>\r\n // element.name.includes(fullStructure.label.substring(0, 3)) &&\r\n // element.name.includes(parentStructure.label.substring(0, 3)) &&\r\n // element.modelType === \"classification\"\r\n // );\r\n // }\r\n }\r\n };\r\n\r\n modelIncludesSubtypes = () => {\r\n // TODO: depending on naming of classification models, check if model has correct subtypes\r\n // let childs = this.findClassificationSubtypes(parentStructure);\r\n return true;\r\n };\r\n\r\n renderRow = (structure) => {\r\n const formDataAICockpit = this.props.formDataAICockpit;\r\n let selectedModel = formDataAICockpit[structure].selectedModel;\r\n const fullStructure = formDataAICockpit[structure].fullStructure;\r\n const { structures, availableModels } = this.props;\r\n\r\n // get available models for structure\r\n const availableModelsForStructure = this.getAvailableModelsForStructure(\r\n availableModels,\r\n fullStructure\r\n );\r\n const visibleVersions =\r\n selectedModel &&\r\n availableModelsForStructure &&\r\n availableModelsForStructure.length > 0 &&\r\n availableModelsForStructure.find((c) => c.name === selectedModel);\r\n\r\n let selectedDropDownVersion =\r\n (selectedModel &&\r\n formDataAICockpit[structure].models[selectedModel] &&\r\n formDataAICockpit[structure].models[selectedModel].selectedVersion) ||\r\n \"\";\r\n\r\n if (availableModelsForStructure) {\r\n let modelIndex = availableModelsForStructure.findIndex(\r\n (item) => item.name === selectedModel\r\n );\r\n if (modelIndex < 0) {\r\n selectedModel = \"\";\r\n }\r\n }\r\n\r\n if (visibleVersions) {\r\n let versionIndex = visibleVersions.versions.findIndex(\r\n (item) => item.label === selectedDropDownVersion\r\n );\r\n if (versionIndex < 0) {\r\n selectedDropDownVersion = \"\";\r\n }\r\n } else {\r\n selectedDropDownVersion = \"\";\r\n }\r\n\r\n // make line below last classification subtype to seperate classification subtypes from substructures\r\n let lastSubtype = false;\r\n if (fullStructure.classificationSubtype) {\r\n let parentStructure = structures.filter(\r\n (element) => element.id === fullStructure.parentId\r\n );\r\n let childs = null;\r\n if (parentStructure[0]) {\r\n childs = this.findClassificationSubtypes(parentStructure[0]);\r\n }\r\n // if fullStructure is last classification subtype --> draw divider\r\n if (\r\n childs[childs.length - 1] &&\r\n fullStructure.id === childs[childs.length - 1].id\r\n ) {\r\n lastSubtype = true;\r\n }\r\n }\r\n\r\n let id = structures.findIndex((element) => element.id === +structure);\r\n\r\n if (typeof structures[id] !== \"undefined\" && structures[id].isUnfolded) {\r\n return (\r\n \r\n \r\n {fullStructure.isSubtype && fullStructure.classificationSubtype && (\r\n \r\n \r\n \r\n )}\r\n {fullStructure.isSubtype && !fullStructure.classificationSubtype && (\r\n \r\n \r\n \r\n )}\r\n\r\n {fullStructure.label}\r\n \r\n {fullStructure.hasChild && (\r\n \r\n {\r\n if (fullStructure.showSubtypes === false) {\r\n this.showSubtypes(fullStructure);\r\n fullStructure.showSubtypes = true;\r\n } else {\r\n this.hideSubtypes(\r\n fullStructure,\r\n fullStructure.subtypeLevel\r\n );\r\n fullStructure.isUnfolded = true;\r\n }\r\n }}\r\n size=\"large\"\r\n >\r\n {fullStructure.showSubtypes ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n {!fullStructure.hasChild && }\r\n \r\n \r\n this.handleChangeModel(event.target.value, structure)\r\n }\r\n disabled={\r\n !(\r\n availableModelsForStructure &&\r\n availableModelsForStructure.length > 0\r\n )\r\n }\r\n >\r\n \r\n Select Model ...\r\n \r\n {availableModelsForStructure &&\r\n availableModelsForStructure.map((model, idx) => {\r\n if (typeof structure !== \"undefined\" || structure != null) {\r\n return (\r\n \r\n {model.label}\r\n \r\n );\r\n }\r\n return null;\r\n })}\r\n \r\n \r\n \r\n \r\n this.handleChangeVersion(event, structure, selectedModel)\r\n }\r\n disabled={!selectedModel}\r\n >\r\n {visibleVersions &&\r\n visibleVersions.versions.map((version, idx) => (\r\n \r\n {version.label}\r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n }\r\n };\r\n\r\n render() {\r\n const { classes, visible, formDataAICockpit, ...propsWithoutClasses } =\r\n this.props;\r\n if (!visible) return null;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n {this.state.activeTab === 0 && (\r\n \r\n
\r\n {this.state.online && (\r\n \r\n this.props.initAIFormData(true)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n \r\n this.props.initAIFormData(false)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n\r\n {this.state.isImporting ? (\r\n \r\n ) : (\r\n \r\n \r\n document.getElementById(\"importAIModel\").click()\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n {this.props.modelsInitialized ? (\r\n
\r\n \r\n
\r\n this.props.toggleShowFirstAccordion()}\r\n >\r\n }\r\n aria-controls=\"panel1d-content\"\r\n id=\"panel1d-header\"\r\n >\r\n Select by Model\r\n \r\n \r\n {this.props.showFirstAccordion && (\r\n \r\n )}\r\n \r\n \r\n this.props.toggleShowFirstAccordion()}\r\n >\r\n }\r\n aria-controls=\"panel2d-content\"\r\n id=\"panel2d-header\"\r\n >\r\n Select by Structure \r\n \r\n \r\n \r\n {!this.props.showFirstAccordion && (\r\n \r\n \r\n \r\n Structure\r\n \r\n Model\r\n Version\r\n \r\n \r\n \r\n {formDataAICockpit &&\r\n Object.values(formDataAICockpit)\r\n .sort((a, b) =>\r\n a.structureIndex > b.structureIndex ? 1 : -1\r\n ) // sort because dictionary is sorted by structure index value\r\n .filter((item) => item !== \"null\")\r\n .map((element) =>\r\n this.renderRow(element.fullStructure.id)\r\n )}\r\n \r\n
\r\n )}\r\n \r\n
\r\n \r\n
\r\n
\r\n ) : (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n )}\r\n {this.state.activeTab === 1 && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSideBarTabAI.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n viewerConfig: PropTypes.object,\r\n structures: PropTypes.array,\r\n visible: PropTypes.bool,\r\n setAIFormData: PropTypes.func,\r\n formDataAICockpit: PropTypes.object,\r\n onChangeTool: PropTypes.func,\r\n projectContext: PropTypes.object,\r\n parentStructure: PropTypes.object,\r\n roiLayers: PropTypes.array,\r\n projectId: PropTypes.string,\r\n onSave: PropTypes.func,\r\n ome: PropTypes.object,\r\n setAvailableModels: PropTypes.func,\r\n setModelsInitialized: PropTypes.func,\r\n modelsInitialized: PropTypes.bool,\r\n availableModels: PropTypes.array,\r\n initAIFormData: PropTypes.func,\r\n showFirstAccordion: PropTypes.bool,\r\n toggleShowFirstAccordion: PropTypes.func,\r\n setAiUsedStructures: PropTypes.func,\r\n histogramConfig: PropTypes.object,\r\n fileId: PropTypes.string,\r\n};\r\n\r\nexport default withAllViewerContexts(withStyles(styles)(SideBarTabAI));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { getParentIndexLayer } from \"../../../viewer/utils/StructuresUtils\";\r\n\r\nimport {\r\n TextField,\r\n Grid,\r\n List,\r\n ListItem,\r\n ListItemText,\r\n Typography,\r\n Tooltip,\r\n FormHelperText,\r\n Slider,\r\n IconButton,\r\n} from \"@mui/material\";\r\n\r\nimport {\r\n Delete,\r\n VisibilityOff,\r\n GetApp,\r\n Publish,\r\n Visibility,\r\n Add,\r\n} from \"@mui/icons-material\";\r\nimport { withAllViewerContexts } from \"../../contexts/AllViewerContexts\";\r\nimport { withTiles } from \"../../contexts/TilesContext\";\r\nimport ListItemSubType from \"../ListItemSubType\";\r\nimport ListItemStructure from \"../ListItemStructure\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n roiContainer: {\r\n padding: 20,\r\n overflowY: \"auto\",\r\n width: 355,\r\n },\r\n flexVerticalContainer: {\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n },\r\n flexRowContentHeight: {\r\n padding: 10,\r\n },\r\n flexRowRemainingHeight: {\r\n overflowY: \"auto\",\r\n overflowX: \"hidden\",\r\n },\r\n spacing: {\r\n padding: 10,\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n },\r\n});\r\n\r\nclass SideBarTabRois extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n dynamicStructureText: \"\",\r\n structuresListHeight: 300,\r\n };\r\n this.textInput = React.createRef();\r\n this.focusTextInput = this.focusTextInput.bind(this);\r\n this.structureRefs = [];\r\n }\r\n\r\n componentWillUnmount = () => {\r\n if (this.structureScrollList) {\r\n this.structureScrollList.removeEventListener(\r\n \"scroll\",\r\n this.handlestructureListScroll\r\n );\r\n }\r\n };\r\n\r\n handlestructureListScroll = () => {\r\n this.forceUpdate();\r\n };\r\n\r\n focusTextInput() {\r\n setTimeout(() => {\r\n if (this.textInput) {\r\n this.textInput.select();\r\n }\r\n }, 100);\r\n }\r\n\r\n countVisibleStructures = () => {\r\n return this.props.structures.reduce(\r\n (acc, cur) => acc + (cur.visible ? 1 : 0),\r\n 0\r\n );\r\n };\r\n\r\n checkToolInConfig(toolName) {\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n addStructure = () => {\r\n const { roiLayers, projectContext } = this.props;\r\n const { dynamicStructureText } = this.state;\r\n // add dynamic structure\r\n if (dynamicStructureText !== \"\") {\r\n projectContext.addStructure(dynamicStructureText);\r\n this.props.onSelectLayer(roiLayers.length - 1);\r\n this.focusTextInput();\r\n this.setState({ dynamicStructureText: \"\" });\r\n }\r\n };\r\n\r\n isInView = (el) => {\r\n if (\r\n !this.structureScrollList ||\r\n this.structureScrollList.getBoundingClientRect().height === 0\r\n ) {\r\n this.structureScrollList = document.getElementById(\r\n \"StructuresListContainer\"\r\n );\r\n if (\r\n this.structureScrollList &&\r\n this.structureScrollList.getAttribute(\"listener\") !== \"true\"\r\n ) {\r\n this.structureScrollList.addEventListener(\r\n \"scroll\",\r\n this.handlestructureListScroll\r\n );\r\n }\r\n }\r\n let result = true;\r\n if (this.structureScrollList && el) {\r\n let parentTop = this.structureScrollList.getBoundingClientRect().top;\r\n let parentHeight =\r\n this.structureScrollList.getBoundingClientRect().height;\r\n let elTop = el.getBoundingClientRect().top;\r\n let elHeight = el.getBoundingClientRect().height;\r\n\r\n result = elTop + elHeight > parentTop && elTop < parentTop + parentHeight;\r\n }\r\n return result;\r\n };\r\n\r\n render() {\r\n const {\r\n ome,\r\n rois,\r\n activeTool,\r\n roiLayers,\r\n selectedLayer,\r\n structures,\r\n visible,\r\n isAdmin,\r\n } = this.props;\r\n const { classes, ...propsWithoutClasses } = this.props;\r\n\r\n const { dynamicStructureText } = this.state;\r\n\r\n if (!visible) return null;\r\n\r\n return (\r\n \r\n {activeTool !== \"comment\" && (\r\n \r\n \r\n \r\n {ome ? \"Structures (\" + roiLayers.length + \"):\" : \"Channels:\"}\r\n \r\n {\r\n let selectedStructure = structures[selectedLayer];\r\n let historyItem = roiLayers[\r\n selectedLayer\r\n ].layer.regionRois.map((roi) => {\r\n return {\r\n add: false,\r\n id: structures[selectedLayer].id,\r\n roi: roi,\r\n };\r\n });\r\n window.projectHistory.add(historyItem);\r\n roiLayers[selectedLayer].layer.regionRois = [];\r\n roiLayers[selectedLayer].tree.clear();\r\n if (selectedStructure.isSubtype) {\r\n let parentIdx = getParentIndexLayer(\r\n selectedStructure,\r\n structures\r\n );\r\n roiLayers[parentIdx].layer.regionRois = roiLayers[\r\n parentIdx\r\n ].layer.regionRois.filter((regionRoi) => {\r\n if (\r\n regionRoi.subtypeName === selectedStructure.label\r\n ) {\r\n roiLayers[parentIdx].tree.remove(\r\n regionRoi.treeItem\r\n );\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n });\r\n }\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n {/* {selectedLayer === 0 && (\r\n \r\n {\r\n this.props.deleteforAllScenes(selectedLayer);\r\n }}\r\n >\r\n \r\n \r\n \r\n )} */}\r\n 0\r\n ? \"Hide all structures [Shift] + [R]\"\r\n : \"Show all structures [Shift] + [R]\"\r\n }\r\n >\r\n {\r\n if (this.countVisibleStructures() > 0) {\r\n for (let roiLayer of structures) {\r\n roiLayer.visible = false;\r\n }\r\n } else {\r\n for (let roiLayer of structures) {\r\n roiLayer.visible = true;\r\n }\r\n }\r\n this.forceUpdate();\r\n }}\r\n size=\"large\"\r\n >\r\n {this.countVisibleStructures() === 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n document.getElementById(\"selectFiles\").click()\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {structures.map((structure, index) => (\r\n
\r\n {!structure.isSubtype && (\r\n {\r\n this.structureRefs[index] = el;\r\n }}\r\n style={{\r\n height: 48,\r\n width: \"100%\",\r\n }}\r\n >\r\n {this.isInView(this.structureRefs[index]) && (\r\n (this.textInput = el)}\r\n isAdmin={isAdmin}\r\n renderLocation={\"SideBarTabRois\"}\r\n />\r\n )}\r\n
\r\n )}\r\n\r\n {structure.showSubtypes &&\r\n !structure.isSubtype &&\r\n structures\r\n .filter(\r\n (element) =>\r\n element.isSubtype && element.subtypeLevel > 0\r\n )\r\n .map((subType, i) => (\r\n \r\n ))}\r\n \r\n ))}\r\n\r\n {this.props.viewerConfig.project.dynamicStructure && (\r\n \r\n \r\n this.setState({\r\n dynamicStructureText: e.target.value,\r\n })\r\n }\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.addStructure();\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n\r\n \r\n {rois.map((roi, index) => (\r\n this.props.onCenterROI(roi)}\r\n onMouseEnter={() => this.props.onHoverROI(roi, true)}\r\n onMouseLeave={() => this.props.onHoverROI(roi, false)}\r\n >\r\n \r\n \r\n ))}\r\n \r\n
\r\n\r\n \r\n Opacity:\r\n \r\n this.props.onChangeOpacity(newValue / 100)\r\n }\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSideBarTabRois.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n // sidebar tab properties\r\n visible: PropTypes.bool,\r\n isAdmin: PropTypes.bool,\r\n // general properties\r\n viewerConfig: PropTypes.object,\r\n id: PropTypes.string.isRequired,\r\n ome: PropTypes.object,\r\n // roiLayers\r\n roiLayers: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n onSelectLayer: PropTypes.func,\r\n deleteforAllScenes: PropTypes.func,\r\n onCenterROI: PropTypes.func,\r\n onHoverROI: PropTypes.func,\r\n // tools\r\n activeTool: PropTypes.string,\r\n // opacity slider\r\n opacity: PropTypes.number,\r\n onChangeOpacity: PropTypes.func,\r\n // Parameterset Export Import\r\n onExportParameters: PropTypes.func,\r\n onImportParameters: PropTypes.func,\r\n // not ordered\r\n structures: PropTypes.array,\r\n projectContext: PropTypes.object,\r\n rois: PropTypes.array,\r\n};\r\n\r\nexport default withTiles(\r\n withAllViewerContexts(withStyles(styles)(SideBarTabRois))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { withPersistentStorage } from \"../contexts/PersistentStorageContext\";\r\nimport {\r\n Grid,\r\n Typography,\r\n Tooltip,\r\n Divider,\r\n List,\r\n IconButton,\r\n} from \"@mui/material\";\r\nimport RemoveCircleIcon from \"@mui/icons-material/RemoveCircle\";\r\nimport AddCircleIcon from \"@mui/icons-material/AddCircle\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n fileTreeView: {\r\n width: \"100%\",\r\n margin: 0,\r\n background: \"#fff\",\r\n position: \"relative\",\r\n },\r\n sidebarHandle: {\r\n position: \"absolute\",\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n width: 5,\r\n background: \"#EBEBEB\",\r\n cursor: \"pointer\",\r\n \"&:hover\": {\r\n background: \"#0673C1\",\r\n },\r\n },\r\n closeButton: {\r\n position: \"absolute\",\r\n right: 5,\r\n top: 5,\r\n },\r\n expensionSummary: {\r\n marginTop: 0,\r\n marginBottom: 0,\r\n background: \"#ff0000\",\r\n },\r\n labelWrap: {\r\n paddingRight: 15,\r\n width: \"100%\",\r\n textOverflow: \"ellipsis\",\r\n overflow: \"hidden\",\r\n display: \"inline-block\",\r\n },\r\n previewImageContainer: {\r\n position: \"relative\",\r\n },\r\n importText: {\r\n padding: 5,\r\n fontWeight: \"bold\",\r\n lineHeight: \"45px\",\r\n display: \"inline-block\",\r\n },\r\n lineThrough1: {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n pointerEvents: \"none\",\r\n background:\r\n \"linear-gradient(to bottom right, transparent calc(50% - 1px), red, transparent calc(50% + 1px) )\",\r\n },\r\n lineThrough2: {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n pointerEvents: \"none\",\r\n background:\r\n \"linear-gradient(to top right, transparent calc(50% - 1px), red, transparent calc(50% + 1px) )\",\r\n },\r\n previewImageNotSelected: {\r\n border: \"1px solid #ccc\",\r\n },\r\n previewImageSelected: {\r\n border: \"3px solid #0673C1!important\",\r\n },\r\n previewImageInSplitscreen: {\r\n border: \"3px dashed #0673C1!important\",\r\n },\r\n fileItem: {\r\n paddingTop: 10,\r\n paddingBottom: 10,\r\n },\r\n sceneItem: {\r\n position: \"relative\",\r\n display: \"inline-block\",\r\n width: \"fit-content\",\r\n paddingLeft: \"5px\",\r\n objectFit: \"contain\",\r\n // border: \"1px solid #ccc!important\",\r\n cursor: \"pointer\",\r\n \"& button\": {\r\n padding: 0,\r\n visibility: \"hidden\",\r\n zIndex: 999999,\r\n width: 0,\r\n height: 0,\r\n },\r\n \"&:hover\": {\r\n boxShadow: \"1px 1px 2px #333\",\r\n \"& button\": {\r\n visibility: \"visible\",\r\n zIndex: 999999999999,\r\n },\r\n },\r\n },\r\n divider: {\r\n paddingLeft: 5,\r\n paddingRight: 15,\r\n },\r\n filesList: {\r\n height: \"calc(100vh - 480px)\",\r\n overflowY: \"auto\",\r\n overflowX: \"hidden\",\r\n },\r\n excludeButton: {\r\n position: \"absolute\",\r\n top: 0,\r\n right: 0,\r\n },\r\n});\r\n\r\nclass FileTreeView extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.overflowListRef = React.createRef(); // Create a ref object\r\n this.state = {\r\n missingThumbnails: {},\r\n };\r\n this.imageListItemRefs = [];\r\n }\r\n\r\n handleScroll = (e) => {\r\n this.props.persistentStorage.save(\"files_scroll\", e.target.scrollTop);\r\n };\r\n\r\n componentDidMount() {\r\n this.overflowListRef.current.addEventListener(\"scroll\", this.handleScroll);\r\n\r\n let scrollPosition = this.props.persistentStorage.load(\"files_scroll\"); //localStorage.getItem(scrollKey);\r\n this.overflowListRef.current.scrollTo(0, scrollPosition);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.overflowListRef.current.removeEventListener(\r\n \"scroll\",\r\n this.handleScroll\r\n );\r\n }\r\n\r\n hasNotExcludedScenes = (files) => {\r\n const result = files.some((file) => !file.excludeScene);\r\n return result;\r\n };\r\n\r\n isInView = (el) => {\r\n if (\r\n !this.imageList ||\r\n this.imageList.getBoundingClientRect().height === 0\r\n ) {\r\n this.imageList = document.getElementById(\"SceneImageList\");\r\n if (\r\n this.imageList &&\r\n this.imageList.getAttribute(\"listener\") !== \"true\"\r\n ) {\r\n this.imageList.addEventListener(\"scroll\", this.handleImageListScroll);\r\n }\r\n }\r\n let result = false;\r\n if (this.imageList && el) {\r\n let parentTop = this.imageList.getBoundingClientRect().top;\r\n let parentHeight = this.imageList.getBoundingClientRect().height;\r\n let elTop = el.getBoundingClientRect().top;\r\n let elHeight = el.getBoundingClientRect().height;\r\n\r\n result = elTop + elHeight > parentTop && elTop < parentTop + parentHeight;\r\n }\r\n return result;\r\n };\r\n\r\n handleImageListScroll = () => {\r\n this.forceUpdate();\r\n };\r\n\r\n render() {\r\n const {\r\n classes,\r\n project,\r\n onSelectFile,\r\n fileId,\r\n onExcludeFilesToggle,\r\n splitscreenFileIds,\r\n } = this.props;\r\n\r\n var groupBy = function (xs, key) {\r\n return xs.reduce(function (rv, x) {\r\n // Making sure not to bunch virtual slides into eachother.\r\n if (x[key].endsWith(\"empty_file.png\")) {\r\n (rv[x[\"fileName\"]] = rv[x[key]] || []).push(x);\r\n return rv;\r\n }\r\n // Normal sorting I don't understand, but it works.\r\n (rv[x[key]] = rv[x[key]] || []).push(x);\r\n return rv;\r\n }, {});\r\n };\r\n\r\n const fileGroups = groupBy(project.files, \"sourcePath\");\r\n const fileNames = Object.keys(fileGroups).sort();\r\n let selectedPath = \"\";\r\n for (let scenes of Object.values(fileGroups)) {\r\n for (let file of scenes) {\r\n if (fileId === file.id) {\r\n selectedPath = file.sourcePath;\r\n }\r\n }\r\n }\r\n\r\n return (\r\n \r\n {project && (\r\n \r\n \r\n {\"Files (\" + fileNames.length + \"):\"}\r\n \r\n \r\n {\r\n const toExclude = this.hasNotExcludedScenes(project.files);\r\n onExcludeFilesToggle(\r\n project.files.filter(\r\n (file) => file.excludeScene !== toExclude\r\n ),\r\n toExclude\r\n );\r\n }}\r\n >\r\n {this.hasNotExcludedScenes(project.files) ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n {fileNames.map((fn, fn_index) => (\r\n \r\n {\r\n if (!this.imageListItemRefs[fn_index]) {\r\n this.imageListItemRefs[fn_index] = el;\r\n this.forceUpdate();\r\n }\r\n }}\r\n className={classes.fileItem}\r\n style={{\r\n marginTop: fn_index === 0 && 0,\r\n background:\r\n fn === selectedPath ? \"rgba(0, 0, 0, 0.08)\" : \"none\",\r\n }}\r\n >\r\n {this.isInView(this.imageListItemRefs[fn_index]) ? (\r\n \r\n \r\n {fileGroups[fn][0].fileName}\r\n \r\n
\r\n {fileGroups[fn]\r\n .sort((a, b) => a.scene - b.scene)\r\n .map((sceneFile, f_id) => (\r\n \r\n \r\n \r\n onExcludeFilesToggle(\r\n [sceneFile],\r\n !sceneFile.excludeScene\r\n )\r\n }\r\n >\r\n {!sceneFile.excludeScene ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n onSelectFile(sceneFile.id)}\r\n >\r\n \r\n {this.state.missingThumbnails[\r\n sceneFile.id\r\n ] && (\r\n
\r\n import\r\n
\r\n )}\r\n {sceneFile.sceneName ? (\r\n {sceneFile.sceneName}\r\n ) : (\r\n {\r\n e.dataTransfer.setData(\r\n \"text/plain\",\r\n sceneFile.id\r\n );\r\n }}\r\n className={classes.previewImage}\r\n height=\"45\"\r\n src={Backend.renderThumbnail(\r\n sceneFile.id\r\n )}\r\n onError={() => {\r\n let missingThumbnails =\r\n this.state.missingThumbnails;\r\n missingThumbnails[\r\n sceneFile.id\r\n ] = true;\r\n this.setState({\r\n missingThumbnails:\r\n missingThumbnails,\r\n });\r\n }}\r\n alt=\"\"\r\n />\r\n )}\r\n
\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
\r\n ) : (\r\n
\r\n )}\r\n \r\n {fn_index < fileNames.length - 1 && (\r\n \r\n )}\r\n
\r\n ))}\r\n \r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nFileTreeView.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n onSelectFile: PropTypes.func,\r\n onExcludeFilesToggle: PropTypes.func,\r\n fileId: PropTypes.string,\r\n splitscreenFileIds: PropTypes.array,\r\n persistentStorage: PropTypes.object,\r\n};\r\n\r\nexport default withPersistentStorage(withStyles(styles)(FileTreeView));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport Histogram from \"../Histogram\";\r\nimport FileTreeView from \"../FileTreeView\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { Grid, Typography } from \"@mui/material\";\r\n\r\nimport { withAllViewerContexts } from \"../../contexts/AllViewerContexts\";\r\nimport { withTiles } from \"../../contexts/TilesContext\";\r\nimport { withResultTab } from \"../../contexts/ResultTabContext\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n flexRowRemainingHeight: {\r\n flex: \"1 1 auto\",\r\n overflowY: \"auto\",\r\n },\r\n spacing: {\r\n padding: 10,\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n },\r\n histogramContainer: {\r\n minHeight: 280,\r\n },\r\n});\r\n\r\nclass SideBarTabView extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n activeTab: 0,\r\n channelSelectMode: \"all\",\r\n availableModels: [],\r\n isMounted: false,\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n this.setState({ isMounted: true });\r\n };\r\n\r\n changeChannelSelectMode = (mode) => {\r\n this.setState({\r\n channelSelectMode: mode,\r\n });\r\n };\r\n\r\n checkToolInConfig(toolName) {\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n const { classes, histogramConfig, visible } = this.props;\r\n\r\n if (!visible) return null;\r\n\r\n return (\r\n \r\n {histogramConfig[this.props.fileId] && (\r\n \r\n \r\n Histogram:\r\n \r\n
\r\n {this.props.ome && this.state.isMounted && (\r\n \r\n )}\r\n
\r\n\r\n {!this.props.tiles.getHsitoClassificationStarted() && (\r\n \r\n )}\r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSideBarTabView.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n // sidebar tab properties\r\n sideBarWidth: PropTypes.number,\r\n visible: PropTypes.bool,\r\n // general properties\r\n id: PropTypes.string.isRequired,\r\n viewerConfig: PropTypes.object,\r\n // historgram\r\n ome: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n onChangeChannels: PropTypes.func,\r\n // file management\r\n onSelectFile: PropTypes.func,\r\n onExcludeFilesToggle: PropTypes.func,\r\n splitscreenFileIds: PropTypes.array,\r\n // not ordered\r\n fileId: PropTypes.string,\r\n project: PropTypes.object,\r\n projectContext: PropTypes.object,\r\n tiles: PropTypes.object,\r\n resultTab: PropTypes.object,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withTiles(withResultTab(withStyles(styles)(SideBarTabView)))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport { withResultTab } from \"../contexts/ResultTabContext\";\r\n\r\nimport {\r\n Grid,\r\n Typography,\r\n Button,\r\n Tooltip,\r\n FormControl,\r\n InputLabel,\r\n Select,\r\n MenuItem,\r\n} from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = {};\r\n\r\nclass ScoringMatrixHistoClassification extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n window.addFrequencyClass = this.addFrequencyClass;\r\n }\r\n\r\n componentDidMount = () => {};\r\n\r\n componentDidUpdate() {}\r\n\r\n UNSAFE_componentWillMount = () => {\r\n // get all parent structures\r\n let selSample = this.props.persistentStorage.load(\"selLayerSample\");\r\n if (selSample) {\r\n this.props.onSelectLayer(selSample);\r\n let selId = this.props.structures[selSample].id;\r\n\r\n // get all parent structures\r\n let parentStructures = this.props.structures.filter(\r\n (element) => element.subtypeLevel === 0\r\n );\r\n\r\n // get Index of sample in parent structures\r\n let parentIdxSelStructure = parentStructures.findIndex(\r\n (element) => element.id === selId\r\n );\r\n this.props.resultTab.setSelectedStructure(parentIdxSelStructure);\r\n }\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return direct childs of structure\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n getAbbreviationOfStructure = (structure) => {\r\n // get abbreviation of structure --> label [abbreviation]\r\n let strWithBracket = structure.label.split(\"[\")[1];\r\n if (!strWithBracket) {\r\n strWithBracket = structure.label;\r\n }\r\n let abbreviation = strWithBracket.substring(0, strWithBracket.length - 1);\r\n return abbreviation;\r\n };\r\n\r\n isCriticalOrSelected = (structure) => {\r\n const { structures, selectedLayer } = this.props;\r\n // check if structure is selected (color dark grey) or critical (color red)\r\n let selectedChildIndex = this.props.resultTab.getSelectedChildIndex();\r\n if (this.isStructureCritical(structure)) {\r\n // if structure has critical value\r\n return \"#ff0000\";\r\n } else if (\r\n structure.id === structures[selectedLayer + selectedChildIndex].id\r\n ) {\r\n // if structure is selected\r\n return \"#d8d8d8\";\r\n } else {\r\n return \"#ffffff\";\r\n }\r\n };\r\n\r\n isStructureCritical = (structure) => {\r\n const { selectedLayer, roiLayers, project } = this.props;\r\n // calculate arithmetic mean (look at specifications)\r\n let numberTiles =\r\n project.files.length * roiLayers[selectedLayer].layer.regionRois.length;\r\n\r\n let totalClassFrequencies = 0;\r\n let idx = 0;\r\n for (const [key, value] of Object.entries(structure.classFrequencies)) {\r\n if (key !== \"class_0\") {\r\n totalClassFrequencies = totalClassFrequencies + value * idx;\r\n }\r\n idx = idx + 1;\r\n }\r\n\r\n let mean = Math.round(totalClassFrequencies / numberTiles);\r\n this.setAvgClassFrequ(structure, mean);\r\n\r\n // if mean is greater or equal than critical class of structure return true\r\n if (mean >= structure.criticalClass && structure.criticalClass !== 0) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n setAvgClassFrequ = (structure, mean) => {\r\n // set average frequency class\r\n if (!Number.isNaN(mean) && mean !== null) {\r\n structure.avgClassFrequency = mean;\r\n }\r\n };\r\n\r\n subtractFrequencyClass = (x) => {\r\n const { structures, selectedLayer } = this.props;\r\n // subtract frequency class (is structure gert reclassified)\r\n\r\n let selectedChildIndex = this.props.resultTab.getSelectedChildIndex();\r\n let selectedStructure = selectedLayer + selectedChildIndex;\r\n\r\n switch (x) {\r\n case 0:\r\n structures[selectedStructure].classFrequencies.class_0 =\r\n structures[selectedStructure].classFrequencies.class_0 - 1;\r\n break;\r\n case 1:\r\n structures[selectedStructure].classFrequencies.class_1 =\r\n structures[selectedStructure].classFrequencies.class_1 - 1;\r\n break;\r\n case 2:\r\n structures[selectedStructure].classFrequencies.class_2 =\r\n structures[selectedStructure].classFrequencies.class_2 - 1;\r\n break;\r\n case 3:\r\n structures[selectedStructure].classFrequencies.class_3 =\r\n structures[selectedStructure].classFrequencies.class_3 - 1;\r\n break;\r\n case 4:\r\n structures[selectedStructure].classFrequencies.class_4 =\r\n structures[selectedStructure].classFrequencies.class_4 - 1;\r\n break;\r\n case 5:\r\n structures[selectedStructure].classFrequencies.class_5 =\r\n structures[selectedStructure].classFrequencies.class_5 - 1;\r\n break;\r\n case 6:\r\n structures[selectedStructure].classFrequencies.class_6 =\r\n structures[selectedStructure].classFrequencies.class_6 - 1;\r\n break;\r\n default:\r\n }\r\n };\r\n\r\n addFrequencyClass = (x) => {\r\n const { structures, selectedLayer, roiLayers, selectedRoi } = this.props;\r\n // add frequency class when classifying tile\r\n\r\n let selectedChildIndex = this.props.resultTab.getSelectedChildIndex();\r\n\r\n // if not started no classification possible\r\n if (!this.props.tiles.getHsitoClassificationStarted()) {\r\n window.showWarningSnackbar(\"Please click 'RUN' to classify.\");\r\n return;\r\n }\r\n\r\n // if no grid\r\n if (roiLayers[selectedLayer].layer.regionRois.length === 0) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n this.props.onChangeTool(\"gridtool\");\r\n return;\r\n }\r\n\r\n /*// zoomLevel is not fixed yet\r\n if (!this.props.zoomLevelFixed) {\r\n window.showWarningSnackbar(\"Plese fix zoom level before annotating\");\r\n return;\r\n }*/\r\n\r\n let selectedStructure = selectedLayer + selectedChildIndex;\r\n\r\n // check if tile was classified before\r\n let fClass =\r\n roiLayers[selectedStructure].layer.regionRois[selectedRoi].frequencyClass;\r\n if (fClass !== -1) {\r\n // if tile was classified before undo previous classification\r\n this.subtractFrequencyClass(fClass);\r\n }\r\n\r\n switch (x) {\r\n case 0:\r\n structures[selectedStructure].classFrequencies.class_0 =\r\n structures[selectedStructure].classFrequencies.class_0 + 1;\r\n break;\r\n case 1:\r\n structures[selectedStructure].classFrequencies.class_1 =\r\n structures[selectedStructure].classFrequencies.class_1 + 1;\r\n break;\r\n case 2:\r\n structures[selectedStructure].classFrequencies.class_2 =\r\n structures[selectedStructure].classFrequencies.class_2 + 1;\r\n break;\r\n case 3:\r\n structures[selectedStructure].classFrequencies.class_3 =\r\n structures[selectedStructure].classFrequencies.class_3 + 1;\r\n break;\r\n case 4:\r\n structures[selectedStructure].classFrequencies.class_4 =\r\n structures[selectedStructure].classFrequencies.class_4 + 1;\r\n break;\r\n case 5:\r\n structures[selectedStructure].classFrequencies.class_5 =\r\n structures[selectedStructure].classFrequencies.class_5 + 1;\r\n break;\r\n case 6:\r\n structures[selectedStructure].classFrequencies.class_6 =\r\n structures[selectedStructure].classFrequencies.class_6 + 1;\r\n break;\r\n default:\r\n }\r\n\r\n // assign frequencyClass to tile\r\n roiLayers[selectedStructure].layer.regionRois[\r\n this.props.selectedRoi\r\n ].frequencyClass = x;\r\n\r\n if (\r\n selectedChildIndex < this.findChilds(structures[selectedLayer]).length\r\n ) {\r\n // not last substructure of tile\r\n let newSelChildIdx = selectedChildIndex + 1;\r\n this.props.resultTab.setSelectedChildIndex(newSelChildIdx);\r\n } else {\r\n // last substructure of tile\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n }\r\n\r\n if (\r\n structures[selectedStructure] &&\r\n this.isStructureCritical(structures[selectedStructure]) &&\r\n !structures[selectedStructure].warningWasShown\r\n ) {\r\n // show warning that sample is critical\r\n let warningStr =\r\n \"Histologische Beurteilung auffällig (\" +\r\n structures[selectedStructure].label +\r\n \" reached average class \" +\r\n structures[selectedStructure].criticalClass +\r\n \").\";\r\n\r\n window.showErrorSnackbar(warningStr);\r\n structures[selectedStructure].warningWasShown = true;\r\n }\r\n\r\n this.forceUpdate();\r\n };\r\n\r\n handleChangeSelectedStructure = (e) => {\r\n // get all parent structures\r\n let parentStructures = this.props.structures.filter(\r\n (element) => element.subtypeLevel === 0\r\n );\r\n\r\n let idxNewSelectedStructure = this.props.structures.findIndex(\r\n (element) => element.id === parentStructures[e.target.value].id\r\n );\r\n\r\n if (idxNewSelectedStructure >= 0) {\r\n this.props.onSelectLayer(idxNewSelectedStructure);\r\n }\r\n\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n this.props.resultTab.setSelectedStructure(e.target.value);\r\n\r\n // reset structures\r\n this.props.resetStructures(true);\r\n\r\n // save selectedLayer in local storage\r\n this.props.persistentStorage.save(\r\n \"selLayerSample\",\r\n idxNewSelectedStructure\r\n );\r\n };\r\n\r\n selectRow = (structure) => {\r\n const { structures, selectedLayer } = this.props;\r\n // select row which was clicked\r\n // get childindex of selected structure\r\n let childIdx = this.findChilds(structures[selectedLayer]).findIndex(\r\n (element) => element.id === structure.id\r\n );\r\n this.props.resultTab.setSelectedChildIndex(childIdx + 1);\r\n this.forceUpdate();\r\n };\r\n\r\n renderSubtypeRow = (structure, idx) => {\r\n const { structures, roiLayers } = this.props;\r\n\r\n // if it is critical make row red\r\n let backgroundColor = this.isCriticalOrSelected(structure);\r\n\r\n // get frequencyClass of selected Tile for row\r\n let structureIndex = structures.findIndex(\r\n (element) => element.id === structure.id\r\n );\r\n let rowFrequencyClass = 0;\r\n if (\r\n structureIndex > -1 &&\r\n roiLayers[structureIndex].layer.regionRois.length > 0 &&\r\n roiLayers[structureIndex].layer.regionRois[this.props.selectedRoi]\r\n ) {\r\n rowFrequencyClass =\r\n roiLayers[structureIndex].layer.regionRois[this.props.selectedRoi]\r\n .frequencyClass;\r\n }\r\n\r\n if (!structure.avgClassFrequency) {\r\n structure.avgClassFrequency = 0;\r\n }\r\n\r\n return (\r\n this.selectRow(structure)}\r\n >\r\n \r\n \r\n \r\n {this.getAbbreviationOfStructure(structure)}\r\n \r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_0}\r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_1}\r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_2}\r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_3}\r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_4}\r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_5}\r\n \r\n \r\n \r\n \r\n {structure.classFrequencies.class_6}\r\n \r\n \r\n \r\n \r\n {structure.avgClassFrequency}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n renderFrequencyClasses = () => {\r\n return (\r\n \r\n \r\n \r\n 0\r\n \r\n \r\n 0\r\n \r\n \r\n \r\n \r\n 0\r\n \r\n \r\n this.addFrequencyClass(0)}\r\n >\r\n 0\r\n \r\n \r\n \r\n \r\n \r\n 1x\r\n \r\n \r\n this.addFrequencyClass(1)}\r\n >\r\n 1\r\n \r\n \r\n \r\n \r\n \r\n {\"<5%\"}\r\n \r\n \r\n this.addFrequencyClass(2)}\r\n >\r\n 2\r\n \r\n \r\n \r\n \r\n \r\n 5-20%\r\n \r\n \r\n this.addFrequencyClass(3)}\r\n >\r\n 3\r\n \r\n \r\n \r\n \r\n \r\n 20-35%\r\n \r\n \r\n this.addFrequencyClass(4)}\r\n >\r\n 4\r\n \r\n \r\n \r\n \r\n \r\n 35-50%\r\n \r\n \r\n this.addFrequencyClass(5)}\r\n >\r\n 5\r\n \r\n \r\n \r\n \r\n \r\n {\">50%\"}\r\n \r\n \r\n this.addFrequencyClass(6)}\r\n >\r\n 6\r\n \r\n \r\n \r\n \r\n \r\n Ø\r\n \r\n \r\n \r\n Ø\r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n isSelSampleSet = () => {\r\n // disable dropdown if sample is set and classification started\r\n let dropdownDisabled = this.props.tiles.getHsitoClassificationStarted();\r\n return dropdownDisabled;\r\n };\r\n\r\n render() {\r\n const { structures, selectedLayer } = this.props;\r\n return (\r\n
\r\n \r\n Sample\r\n \r\n {this.props.structures\r\n .filter((element) => element.subtypeLevel === 0)\r\n .map((structure, idx) => (\r\n \r\n {structure.label}\r\n \r\n ))}\r\n \r\n \r\n
\r\n
\r\n {this.renderFrequencyClasses()}\r\n {this.findChilds(structures[selectedLayer]).map((structure, idx) =>\r\n this.renderSubtypeRow(structure, idx)\r\n )}\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nScoringMatrixHistoClassification.propTypes = {\r\n persistentStorage: PropTypes.object,\r\n structures: PropTypes.array,\r\n roiLayers: PropTypes.array,\r\n resultTab: PropTypes.object,\r\n onSelectLayer: PropTypes.func,\r\n selectedLayer: PropTypes.number,\r\n project: PropTypes.object,\r\n selectedRoi: PropTypes.number,\r\n tiles: PropTypes.object,\r\n onChangeTool: PropTypes.func,\r\n resetStructures: PropTypes.func,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withTiles(withResultTab(withStyles(styles)(ScoringMatrixHistoClassification)))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport { withResultTab } from \"../contexts/ResultTabContext\";\r\n\r\nimport {\r\n Grid,\r\n Typography,\r\n Tooltip,\r\n FormControl,\r\n InputLabel,\r\n Select,\r\n MenuItem,\r\n IconButton,\r\n} from \"@mui/material\";\r\n\r\nimport { Add } from \"@mui/icons-material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = {};\r\n\r\nclass ScoringMatrixHistoPointCounting extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n window.addFrequencyClass = this.addFrequencyClass;\r\n window.classifyTileWithkey = this.classifyTileWithkey;\r\n }\r\n\r\n componentDidMount = () => {};\r\n\r\n componentDidUpdate() {}\r\n\r\n UNSAFE_componentWillMount = () => {\r\n // get all parent structures\r\n let selSample = this.props.persistentStorage.load(\"selLayerSample\");\r\n if (selSample) {\r\n this.props.onSelectLayer(selSample);\r\n let selId = this.props.structures[selSample].id;\r\n\r\n // get all parent structures\r\n let parentStructures = this.props.structures.filter(\r\n (element) => element.subtypeLevel === 0\r\n );\r\n\r\n // get Index of sample in parent structures\r\n let parentIdxSelStructure = parentStructures.findIndex(\r\n (element) => element.id === selId\r\n );\r\n this.props.resultTab.setSelectedStructure(parentIdxSelStructure);\r\n }\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return direct childs of structure\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n getAbbreviationOfStructure = (structure) => {\r\n // get abbreviation of structure --> label [abbreviation]\r\n let strWithBracket = structure.label.split(\"[\")[1];\r\n if (!strWithBracket) {\r\n strWithBracket = structure.label;\r\n }\r\n let abbreviation = strWithBracket.substring(0, strWithBracket.length - 1);\r\n return abbreviation;\r\n };\r\n\r\n handleChangeSelectedStructure = (e) => {\r\n // get all parent structures\r\n let parentStructures = this.props.structures.filter(\r\n (element) => element.subtypeLevel === 0\r\n );\r\n\r\n let idxNewSelectedStructure = this.props.structures.findIndex(\r\n (element) => element.id === parentStructures[e.target.value].id\r\n );\r\n\r\n if (idxNewSelectedStructure >= 0) {\r\n this.props.onSelectLayer(idxNewSelectedStructure);\r\n }\r\n\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n this.props.resultTab.setSelectedStructure(e.target.value);\r\n\r\n // reset structures\r\n this.props.resetStructures(true);\r\n\r\n // save selectedLayer in local storage\r\n this.props.persistentStorage.save(\r\n \"selLayerSample\",\r\n idxNewSelectedStructure\r\n );\r\n };\r\n\r\n getCount = (structure) => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // calculate number of rois in parent layer\r\n let numberRois = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi) => roi.structureId === structure.id\r\n ).length;\r\n\r\n return numberRois;\r\n };\r\n\r\n classifyTile = (structure) => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // classify tile with clicked structure\r\n\r\n let selectedRoi = this.props.resultTab.getSelectedRoi();\r\n\r\n // if file is changing no classifying possible for a few seconds\r\n if (this.props.resultTab.getFileChange()) {\r\n return;\r\n }\r\n\r\n // if not started no classification possible\r\n if (!this.props.tiles.getHsitoClassificationStarted()) {\r\n window.showWarningSnackbar(\"Please click 'RUN' to classify.\");\r\n return;\r\n }\r\n\r\n // if no grid\r\n if (roiLayers[selectedLayer].layer.regionRois.length === 0) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n this.props.onChangeTool(\"gridtool\");\r\n return;\r\n }\r\n\r\n // do not classify empty structure if 100 already reached\r\n if (\r\n this.props.resultTab.getHundredTiles() &&\r\n structure.label !== \"leer [leer]\" &&\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].subtypeName ===\r\n \"leer [leer]\"\r\n ) {\r\n window.showWarningSnackbar(\"Finished!\");\r\n return;\r\n }\r\n\r\n // classify tile --> set roi properties\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].structureId =\r\n structure.id;\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].subtypeName =\r\n structure.label;\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].color =\r\n structure.color;\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].isSubtype = true;\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].isAnnotated = true;\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].isLabeled = true;\r\n\r\n //this.criticalValueReached();\r\n // set hundret tiles to true only if from classification button\r\n this.getTotalCount();\r\n this.props.onNext();\r\n this.forceUpdate();\r\n };\r\n\r\n classifyTileWithkey = (keyNumber) => {\r\n if (keyNumber > 0) {\r\n const { structures, selectedLayer } = this.props;\r\n // classification with key shortcut\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n\r\n if (childs[keyNumber - 1]) {\r\n let structureForClassification = childs[keyNumber - 1];\r\n this.classifyTile(structureForClassification);\r\n }\r\n }\r\n };\r\n\r\n isTileClassified = (structure) => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // color structure in dark grey if selected tile was classified with structure\r\n\r\n // if no grid return\r\n if (roiLayers[selectedLayer].layer.regionRois.length === 0) {\r\n return;\r\n }\r\n\r\n // check if selected tile has class of structure\r\n let selectedRoi = this.props.resultTab.getSelectedRoi();\r\n let tileHasStructureClass =\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].structureId ===\r\n structure.id;\r\n\r\n // if tile has no classification yet\r\n if (structure.label === \"leer [leer]\" && !tileHasStructureClass) {\r\n tileHasStructureClass =\r\n roiLayers[selectedLayer].layer.regionRois[selectedRoi].structureId ===\r\n 0;\r\n }\r\n\r\n if (tileHasStructureClass && !this.props.showGallery) {\r\n return \"#d8d8d8\";\r\n } else {\r\n return \"#FFFFFF\";\r\n }\r\n };\r\n\r\n renderSubtypeRow = (structure, indexSubtype) => {\r\n // check if selected tile is classified with this structure\r\n let backgroundColor = this.isTileClassified(structure);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {this.getAbbreviationOfStructure(structure)}\r\n \r\n \r\n \r\n \r\n \r\n {this.getCount(structure)}\r\n \r\n \r\n \r\n \r\n this.classifyTile(structure)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n getTotalCount = (fromRendering) => {\r\n const { structures, roiLayers, selectedLayer } = this.props;\r\n\r\n // get id of \"leer\" child\r\n let emptyId = 0;\r\n this.findChilds(structures[selectedLayer]).forEach((child) => {\r\n if (child.label === \"leer [leer]\") {\r\n emptyId = child.id;\r\n }\r\n });\r\n\r\n // get number of rois that are not of class \"leer\"\r\n let numberRois = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi) => roi.isAnnotated && roi.structureId !== emptyId\r\n ).length;\r\n\r\n if (numberRois >= 100 && !fromRendering) {\r\n this.props.resultTab.setHundredTiles(true);\r\n }\r\n\r\n return numberRois;\r\n };\r\n\r\n renderMatrixBottom = () => {\r\n return (\r\n \r\n \r\n Total\r\n \r\n \r\n {this.getTotalCount(true)} / 100\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n renderMatrixHeader = () => {\r\n return (\r\n \r\n \r\n \r\n Gewebeart\r\n \r\n \r\n \r\n \r\n Count\r\n \r\n \r\n \r\n \r\n Increase Count\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n isSelSampleSet = () => {\r\n // disable dropdown if sample is set and classification started\r\n let dropdownDisabled = this.props.tiles.getHsitoClassificationStarted();\r\n return dropdownDisabled;\r\n };\r\n\r\n render() {\r\n const { structures, selectedLayer } = this.props;\r\n return (\r\n
\r\n \r\n Sample\r\n \r\n {this.props.structures\r\n .filter((element) => element.subtypeLevel === 0)\r\n .map((structure, idx) => (\r\n \r\n {structure.label}\r\n \r\n ))}\r\n \r\n \r\n {this.renderMatrixHeader()}\r\n {this.findChilds(structures[selectedLayer]).map((structure, idx) =>\r\n this.renderSubtypeRow(structure, idx)\r\n )}\r\n {this.renderMatrixBottom()}\r\n
\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nScoringMatrixHistoPointCounting.propTypes = {\r\n persistentStorage: PropTypes.object,\r\n resultTab: PropTypes.object,\r\n tiles: PropTypes.object,\r\n selectedLayer: PropTypes.number,\r\n showGallery: PropTypes.bool,\r\n structures: PropTypes.array,\r\n roiLayers: PropTypes.array,\r\n onSelectLayer: PropTypes.func,\r\n resetStructures: PropTypes.func,\r\n onChangeTool: PropTypes.func,\r\n onNext: PropTypes.func,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withTiles(withResultTab(withStyles(styles)(ScoringMatrixHistoPointCounting)))\r\n);\r\n","// Adds ctx.getTransform() - returns an SVGMatrix\r\n// Adds ctx.transformedPoint(x,y) - returns an SVGPoint\r\nexport function trackTransforms(ctx) {\r\n var svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n var xform = svg.createSVGMatrix();\r\n ctx.getTransform = function () {\r\n return xform;\r\n };\r\n\r\n var savedTransforms = [];\r\n var save = ctx.save;\r\n ctx.save = function () {\r\n savedTransforms.push(xform.translate(0, 0));\r\n return save.call(ctx);\r\n };\r\n\r\n var restore = ctx.restore;\r\n ctx.restore = function () {\r\n xform = savedTransforms.pop();\r\n return restore.call(ctx);\r\n };\r\n\r\n var scale = ctx.scale;\r\n ctx.scale = function (sx, sy) {\r\n xform = xform.scaleNonUniform(sx, sy);\r\n return scale.call(ctx, sx, sy);\r\n };\r\n\r\n var rotate = ctx.rotate;\r\n ctx.rotate = function (radians) {\r\n xform = xform.rotate((radians * 180) / Math.PI);\r\n return rotate.call(ctx, radians);\r\n };\r\n\r\n var translate = ctx.translate;\r\n ctx.translate = function (dx, dy) {\r\n xform = xform.translate(dx, dy);\r\n return translate.call(ctx, dx, dy);\r\n };\r\n\r\n var transform = ctx.transform;\r\n ctx.transform = function (a, b, c, d, e, f) {\r\n var m2 = svg.createSVGMatrix();\r\n m2.a = a;\r\n m2.b = b;\r\n m2.c = c;\r\n m2.d = d;\r\n m2.e = e;\r\n m2.f = f;\r\n xform = xform.multiply(m2);\r\n return transform.call(ctx, a, b, c, d, e, f);\r\n };\r\n\r\n var setTransform = ctx.setTransform;\r\n ctx.setTransform = function (a, b, c, d, e, f) {\r\n xform.a = a;\r\n xform.b = b;\r\n xform.c = c;\r\n xform.d = d;\r\n xform.e = e;\r\n xform.f = f;\r\n return setTransform.call(ctx, a, b, c, d, e, f);\r\n };\r\n\r\n var pt = svg.createSVGPoint();\r\n ctx.transformedPoint = function (x, y) {\r\n pt.x = x;\r\n pt.y = y;\r\n try {\r\n return pt.matrixTransform(xform.inverse());\r\n } catch (e) {\r\n return pt;\r\n }\r\n };\r\n\r\n pt = svg.createSVGPoint();\r\n ctx.backTransformedPoint = function (x, y) {\r\n pt.x = x;\r\n pt.y = y;\r\n return pt.matrixTransform(xform);\r\n };\r\n}\r\n\r\n// calculate the log to a specific base\r\nexport function getBaseLog(x, y) {\r\n return Math.log(y) / Math.log(x);\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport withTheme from \"@mui/styles/withTheme\";\r\n\r\nimport { trackTransforms } from \"../utils/CanvasUtil\";\r\nimport DragIndicator from \"@mui/icons-material/DragIndicator\";\r\nimport Draggable from \"react-draggable\";\r\n\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\n\r\nconst styles = {\r\n root: {\r\n position: \"absolute\",\r\n left: 5,\r\n height: 170,\r\n width: 220,\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n opacity: 0.8,\r\n },\r\n rootsidebar: {\r\n height: 170,\r\n width: 220,\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n opacity: 0.8,\r\n },\r\n canvas: {\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n backgroundColor: \"#000000\",\r\n },\r\n dragIndicator: {\r\n color: \"#fff\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n cursor: \"grab\",\r\n },\r\n grabbing: {\r\n cursor: \"grabbing\",\r\n },\r\n};\r\n\r\nclass MiniMap extends Component {\r\n constructor(props) {\r\n super(props);\r\n if (props.componentRef) props.componentRef(this);\r\n\r\n this.state = {\r\n grabbing: false,\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n this.initialized = false;\r\n // add zoom with mouse wheel\r\n this.canvas.addEventListener(\"mousewheel\", (e) => this.mousewheel(e), {\r\n passive: false,\r\n });\r\n\r\n // get drawing context from canvas\r\n this.ctx = this.canvas.getContext(\"2d\");\r\n\r\n // extend context with some fancy additional transformation methods\r\n trackTransforms(this.ctx);\r\n\r\n // converts the relative size css information into an absolute size which we can access\r\n this.width = this.canvas.width = this.canvas.offsetWidth;\r\n this.height = this.canvas.height = this.canvas.offsetHeight;\r\n\r\n // get bounds for correct minimap positionining\r\n let bounds = this.root.getBoundingClientRect();\r\n if (this.props.inSideBar) {\r\n bounds.x = 0;\r\n bounds.y = 0;\r\n }\r\n this.setState({\r\n x: bounds.x,\r\n y: bounds.y,\r\n });\r\n };\r\n\r\n componentWillUnmount() {\r\n this.canvas.removeEventListener(\"mousewheel\", (e) => this.mousewheel(e));\r\n }\r\n\r\n componentDidUpdate() {\r\n // redraw image when the component updates\r\n if (!this.initialized) {\r\n setTimeout(() => {\r\n this.draw();\r\n }, 500);\r\n } else if (this.initialized) {\r\n this.draw();\r\n }\r\n this.draw();\r\n }\r\n\r\n // zoom out to show the whole image\r\n zoomOut() {\r\n // center image first\r\n let pt = this.ctx.transformedPoint(\r\n (this.canvas.width - this.vw) / 2,\r\n (this.canvas.height - this.vh) / 2\r\n );\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc our transformation offset\r\n pt = this.ctx.transformedPoint(\r\n this.canvas.width / 2,\r\n this.canvas.height / 2\r\n );\r\n // move to origin\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc scale factor so we can fit the whole image on our screen\r\n var factor = Math.min(\r\n this.canvas.height / this.vh,\r\n this.canvas.width / this.vw\r\n );\r\n // perform scaling\r\n this.ctx.scale(factor, factor);\r\n // restore our offset\r\n this.ctx.translate(-pt.x, -pt.y);\r\n }\r\n\r\n draw() {\r\n // nothing to draw if we haven't loaded our meta data yet\r\n if (!this.props.ome || this.canvas === null) return;\r\n\r\n // Clear the entire canvas\r\n var p1 = this.ctx.transformedPoint(0, 0);\r\n var p2 = this.ctx.transformedPoint(this.canvas.width, this.canvas.height);\r\n this.ctx.clearRect(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y);\r\n this.ctx.save();\r\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n this.ctx.restore();\r\n\r\n let lv = 0,\r\n x = 0,\r\n y = 0;\r\n for (let c = 0; c < this.props.histogramConfig.channels.length; c++) {\r\n let channel = this.props.histogramConfig.channels[c];\r\n // skip disabled channels\r\n if (!channel.enabled) continue;\r\n\r\n let page = this.props.getPageForChannel(c)\r\n ? this.props.getPageForChannel(c)\r\n : 0;\r\n\r\n // load image first if missing\r\n let tileId =\r\n page + \",\" + lv + \",\" + x + \",\" + y + \",\" + this.props.fileId;\r\n let img = this.props.tiles.getVisibleImage(tileId);\r\n if (img) {\r\n // image is loaded -> draw it\r\n let img = this.props.tiles.getVisibleImage(tileId);\r\n this.imgLoaded = img.width > 0;\r\n if (this.imgLoaded) {\r\n this.vw = this.props.ome.sizeX;\r\n this.vh = this.props.ome.sizeY;\r\n\r\n let coloredImg = this.props.tiles.getColoredImage(tileId);\r\n\r\n if (coloredImg) {\r\n // composition should be difference for fluorescence\r\n // see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\r\n this.ctx.globalCompositeOperation = \"screen\";\r\n // draw colored image layer\r\n if (\r\n Object.prototype.toString.call(coloredImg) ===\r\n \"[object HTMLCanvasElement]\" &&\r\n this.props.tiles.getColoredImage(tileId)\r\n ) {\r\n this.ctx.drawImage(\r\n coloredImg,\r\n x * this.vw,\r\n y * this.vh,\r\n this.vw,\r\n this.vh\r\n );\r\n }\r\n }\r\n }\r\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n this.zoomOut();\r\n this.initialized = true;\r\n }\r\n }\r\n\r\n let mainCanvas = this.props.canvas;\r\n\r\n let screenX = this.props.position.x / this.props.zoom;\r\n let screenY = this.props.position.y / this.props.zoom;\r\n let screenW = mainCanvas.width / this.props.zoom;\r\n let screenH = mainCanvas.height / this.props.zoom;\r\n\r\n // offset of minimap in view\r\n let offsetX = -this.ctx.getTransform().e / this.ctx.getTransform().a;\r\n let offsetY = -this.ctx.getTransform().f / this.ctx.getTransform().a;\r\n\r\n // back to default overlay composition operation\r\n // see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\r\n this.ctx.globalCompositeOperation = \"source-over\";\r\n\r\n // draw screen region\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n this.ctx.strokeStyle = this.props.theme.palette.primary.main;\r\n this.ctx.beginPath();\r\n this.ctx.rect(screenX, screenY, screenW, screenH);\r\n this.ctx.moveTo(screenX + screenW / 2, screenY);\r\n this.ctx.lineTo(screenX + screenW / 2, offsetY);\r\n this.ctx.moveTo(screenX + screenW / 2, screenY + screenH);\r\n this.ctx.lineTo(\r\n screenX + screenW / 2,\r\n this.canvas.height / this.ctx.getTransform().a\r\n );\r\n this.ctx.moveTo(offsetX, screenY + screenH / 2);\r\n this.ctx.lineTo(screenX, screenY + screenH / 2);\r\n this.ctx.moveTo(screenX + screenW, screenY + screenH / 2);\r\n this.ctx.lineTo(\r\n this.canvas.width / this.ctx.getTransform().a,\r\n screenY + screenH / 2\r\n );\r\n this.ctx.stroke();\r\n }\r\n\r\n // returns the current zoom scale\r\n getScale() {\r\n return this.ctx.getTransform().a;\r\n }\r\n\r\n // returns position of our image\r\n getPosition() {\r\n return {\r\n x: -this.ctx.getTransform().e,\r\n y: -this.ctx.getTransform().f,\r\n };\r\n }\r\n\r\n getCtx = () => {\r\n let c = this.ctx;\r\n return c;\r\n };\r\n\r\n miniMapMouseEvent = (event) => {\r\n // transform mouse coordinates on screen to relative to minimap componenent coordinates\r\n let x = event.pageX - this.state.x;\r\n let y = event.pageY - this.state.y;\r\n // transform coordinates into world space\r\n let pt = this.ctx.transformedPoint(x, y);\r\n // let renderer navigate to clicked point\r\n this.props.onMoveTo({ x: pt.x, y: pt.y });\r\n this.props.chainMouseMove(x, y, event);\r\n };\r\n\r\n // handle dragging of the minimap region rectangle\r\n mouseDown = (event) => {\r\n this.miniMapMouseEvent(event);\r\n this.dragging = true;\r\n };\r\n\r\n // handle dragging of the minimap region rectangle\r\n mouseMove = (event) => {\r\n if (this.dragging) {\r\n this.miniMapMouseEvent(event);\r\n }\r\n };\r\n\r\n mouseUp = () => {\r\n this.dragging = false;\r\n };\r\n\r\n // zoom event in minimap\r\n mousewheel = (event) => {\r\n let x = event.pageX - this.state.x;\r\n let y = event.pageY - this.state.y;\r\n this.props.zoomMouseWheel(event, x, y);\r\n };\r\n\r\n // drag stop event of minimap\r\n stopEvent = () => {\r\n let bounds = this.root.getBoundingClientRect();\r\n if (this.props.inSideBar) {\r\n bounds.x = 0;\r\n bounds.y = 0;\r\n }\r\n this.setState({ grabbing: false, x: bounds.x, y: bounds.y });\r\n };\r\n\r\n render() {\r\n const { classes, pointerEvents } = this.props;\r\n const { grabbing } = this.state;\r\n\r\n let classToUse = this.props.inSideBar ? classes.rootsideBar : classes.root;\r\n\r\n return (\r\n this.setState({ grabbing: true })}\r\n onStop={this.stopEvent}\r\n >\r\n (this.root = c)}\r\n className={classNames(classToUse, grabbing && classes.grabbing)}\r\n style={{\r\n pointerEvents: pointerEvents ? \"all\" : \"none\",\r\n top: this.props.canvas.height - 175,\r\n zIndex: 9999,\r\n }}\r\n >\r\n {\r\n this.canvas = c;\r\n }}\r\n className={classes.canvas}\r\n onMouseDown={this.mouseDown}\r\n onMouseMove={this.mouseMove}\r\n onMouseUp={this.mouseUp}\r\n />\r\n {!this.props.inSideBar && (\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nMiniMap.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n ome: PropTypes.object,\r\n theme: PropTypes.object,\r\n zoom: PropTypes.number,\r\n onMoveTo: PropTypes.func,\r\n onScaleOnly: PropTypes.func,\r\n position: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n canvas: PropTypes.object,\r\n pointerEvents: PropTypes.bool,\r\n inSideBar: PropTypes.bool,\r\n zoomMouseWheel: PropTypes.func,\r\n chainMouseMove: PropTypes.func,\r\n componentRef: PropTypes.func,\r\n // from withTiles\r\n tiles: PropTypes.object,\r\n fileId: PropTypes.string,\r\n getPageForChannel: PropTypes.func,\r\n};\r\n\r\nexport default withTiles(withTheme(withStyles(styles)(MiniMap)));\r\n","import React, { Component } from \"react\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport ScoringMatrixHistoClassification from \"../ScoringMatrixHistoClassification\";\r\nimport ScoringMatrixHistoPointCounting from \"../ScoringMatrixHistoPointCounting\";\r\nimport MiniMap from \"../MiniMap\";\r\n\r\nimport { Add, ArrowDropDown, ArrowDropUp } from \"@mui/icons-material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n Grid,\r\n Typography,\r\n Button,\r\n Tooltip,\r\n IconButton,\r\n ListItem,\r\n TextField,\r\n FormControlLabel,\r\n Checkbox,\r\n} from \"@mui/material\";\r\n\r\nimport { withAllViewerContexts } from \"../../contexts/AllViewerContexts\";\r\nimport { withTiles } from \"../../contexts/TilesContext\";\r\nimport { withResultTab } from \"../../contexts/ResultTabContext\";\r\n\r\nimport Backend from \"../../../common/utils/Backend\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n flexRowRemainingHeight: {\r\n flex: \"1 1 auto\",\r\n overflowY: \"auto\",\r\n },\r\n spacing: {\r\n padding: 10,\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n },\r\n});\r\n\r\n// all possible substructures for module \"Histo-Klassifikation\"\r\nconst HistoClassififcationLabels = [\r\n \"Skelettmuskulatur [Skm]\",\r\n \"Brätstrukturen [Brät]\",\r\n \"Bindegewebe kollagenes [kBdg]\",\r\n \"Bindegewebe elastisches [eBdg]\",\r\n \"Fettgewebe [Fett]\",\r\n \"Pflanzliches Fett [pFett]\",\r\n \"Gewürze [Gewü]\",\r\n \"Gefäße [Gefä]\",\r\n \"Drüsengewebe [Drüs]\",\r\n \"Haut äußere Schwarten [Schwa]\",\r\n \"Lebergewebe [Leber]\",\r\n \"Lymphatisches Gewebe [Lymph]\",\r\n \"Muskeleiweiß strukturlos (teils granuliert) [Mus]\",\r\n \"Brät mit Hülle wiederverarbeitetes [ReMit]\",\r\n \"Brät ohne Hülle wiederverarbeitetes [ReOhne]\",\r\n \"Gelatineartige fremde Eiweißstrukturen [Gelat]\",\r\n \"Stärkepartikel [Stärke]\",\r\n \"Haut Geflügel [GHaut]\",\r\n \"Speicheldrüse [Speidrü]\",\r\n \"Knorpelpartikel [Knorpel]\",\r\n \"Knochenpartikel [Knochen]\",\r\n \"Pflanzliches Protein [pProt]\",\r\n \"Pflanzliche Partikel [pPart]\",\r\n \"Muskelabrieb, strukturlose Masse (teils granuliert, auch Vakuolen) [Mgranu]\",\r\n \"Muskelabrieb, feinbrätartig (>drei Vakuolen auf einer Stelle) [Mbrät]\",\r\n \"Muskelabrieb in Form amorpher Proteinstrukturen [Mamorph]\",\r\n \"Deutlich von umgebender Muskulatur abgegrenzte straßenartige Bahnen aus Muskeleiweiß wabig-schaumig vernetzt großporig [MeatIn1]\",\r\n \"Deutlich von umgebender Muskulatur abgegrenzte straßenartige Bahnen aus Muskeleiweiß wabig-schaumig vernetzt kleinporig [MeatIn2]\",\r\n \"Deutlich von umgebender Muskulatur abgegrenzte straßenartige Bahnen aus Muskeleiweiß in Form von Detritus [MeatIn3]\",\r\n \"Strukturen wie durch Transglutaminase entstanden inter-/intramuskulär [Transgl]\",\r\n \"Tierisches Fremdprotein Plasmaeiweiß [tProt]\",\r\n \"Schilddrüse [SchiDrü]\",\r\n \"Skelettmuskulatur, zusammengefügt [SkmZus]\",\r\n \"unbekannte Strukturen [US]\",\r\n];\r\n\r\nclass SideBarTabResults extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n isMounted: false,\r\n dynamicStructureText: \"\",\r\n dynamicStructureAbbrText: \"\",\r\n // shows if grid from last use uf project exists\r\n gridExists: this.getGridExists(),\r\n structuresToAdd: [],\r\n showLabelsToAdd: false,\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n this.setState({ isMounted: true });\r\n this.props.resultTab.setZoomLevelFixed(false); // Re-enable zoom on customer request\r\n if (!this.props.tiles.getHsitoClassificationStarted()) {\r\n this.props.onChangeTool(\"gridtool\");\r\n }\r\n };\r\n\r\n UNSAFE_componentWillMount = () => {\r\n this.setSelectedSampleFromFilename();\r\n };\r\n\r\n componentWillUnmount = () => {\r\n this.props.onChangeTool(\"none\");\r\n };\r\n\r\n setSelectedSampleFromFilename = () => {\r\n // set selected sample according to file name (hint in filename about sample)\r\n if (\r\n this.props.project &&\r\n this.props.project.name &&\r\n !this.props.resultTab.getSelSampleSet()\r\n ) {\r\n let res = this.props.project.name.split(\"-\");\r\n let sampleAbbr = res[res.length - 2];\r\n let sampleLabel = \"\";\r\n switch (sampleAbbr) {\r\n case \"KP\": // Kochpökelware\r\n sampleLabel = \"Kochpökelware\";\r\n break;\r\n case \"BR\": // Brühwurst\r\n sampleLabel = \"Brühwurst\";\r\n break;\r\n case \"HA\": // Hackfleisch\r\n sampleLabel = \"Hackfleisch\";\r\n break;\r\n case \"KO\": // Kochwurst\r\n sampleLabel = \"Kochwurst\";\r\n break;\r\n case \"RO\": // Rohwurst\r\n sampleLabel = \"Rohwurst\";\r\n break;\r\n case \"VP\": // VegFleischersatz\r\n sampleLabel = \"VegFleischersatz\";\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n // get index of sample to select\r\n let idxSelectedStructure = this.props.structures.findIndex(\r\n (element) => element.label === sampleLabel\r\n );\r\n\r\n if (idxSelectedStructure >= 0) {\r\n this.props.onSelectLayer(idxSelectedStructure);\r\n let selId = this.props.structures[idxSelectedStructure].id;\r\n\r\n // get all parent structures\r\n let parentStructures = this.props.structures.filter(\r\n (element) => element.subtypeLevel === 0\r\n );\r\n\r\n // get Index of sample in parent structures\r\n let parentIdxSelStructure = parentStructures.findIndex(\r\n (element) => element.id === selId\r\n );\r\n this.props.resultTab.setSelectedStructure(parentIdxSelStructure);\r\n // save selectedLayer in local storage\r\n this.props.persistentStorage.save(\r\n \"selLayerSample\",\r\n idxSelectedStructure\r\n );\r\n }\r\n this.props.resultTab.setSelSampleSet(true);\r\n }\r\n };\r\n\r\n getGridExists = () => {\r\n const { roiLayers } = this.props;\r\n // check if grid was created in one roilayer\r\n let exists = false;\r\n roiLayers.forEach((l) => {\r\n if (l.layer.regionRois.length > 0) {\r\n exists = true;\r\n }\r\n });\r\n this.props.resultTab.setGridExists(exists);\r\n return exists;\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return direct classification subtypes\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n resetStructures = (changeSample) => {\r\n const {\r\n structures,\r\n roiLayers,\r\n selectedLayer,\r\n tools,\r\n onChangeTool,\r\n project,\r\n } = this.props;\r\n // reset properties for each structure\r\n structures.forEach((structure) => {\r\n structure.avgClassFrequency = 0;\r\n for (const key of Object.keys(structure.classFrequencies)) {\r\n structure.classFrequencies[key] = 0;\r\n }\r\n });\r\n this.props.resultTab.setSelectedRoi(0);\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n\r\n // set resetPressed to true\r\n this.props.resultTab.setResetPressed(true);\r\n\r\n // set hundredTiles to false\r\n this.props.resultTab.setHundredTiles(false);\r\n\r\n if (project.type.includes(\"HistoClassification\")) {\r\n // set started to false\r\n this.props.tiles.setHsitoClassificationStarted(false);\r\n }\r\n\r\n // save selectedRoi in local storage\r\n this.props.persistentStorage.save(\r\n \"selectedRoi\",\r\n this.props.resultTab.getSelectedRoi()\r\n );\r\n\r\n if (changeSample) {\r\n // delete roiLayers\r\n roiLayers.forEach((roiLayer) => {\r\n roiLayer.layer.regionRois = [];\r\n });\r\n //if condistion so that onChangeTool(\"none\") doesnt affect Histo Modules, but otherwise no new bugs occur\r\n if (\r\n !(\r\n project.type.includes(\"HistoClassification\") ||\r\n project.type.includes(\"HistoPointCounting\")\r\n )\r\n ) {\r\n onChangeTool(\"none\");\r\n }\r\n } else {\r\n // make new grid\r\n // if no grid finish here\r\n if (roiLayers[selectedLayer].layer.regionRois.length === 0) {\r\n return;\r\n }\r\n\r\n // make new grid\r\n // calculate gridsize\r\n let size = Math.sqrt(roiLayers[selectedLayer].layer.regionRois.length);\r\n if (project.type.includes(\"HistoClassification\")) {\r\n tools[\"gridtool\"].createGrid(size);\r\n } else if (project.type.includes(\"HistoPointCounting\")) {\r\n tools[\"gridtool\"].createGrid(size, true);\r\n }\r\n\r\n // make tilesClassificationTool active\r\n let roiItem = {\r\n maxX: roiLayers[selectedLayer].layer.regionRois[0].bounds.left,\r\n maxY: roiLayers[selectedLayer].layer.regionRois[0].bounds.top,\r\n minX: roiLayers[selectedLayer].layer.regionRois[0].bounds.right,\r\n minY: roiLayers[selectedLayer].layer.regionRois[0].bounds.bottom,\r\n roi: roiLayers[selectedLayer].layer.regionRois[0],\r\n };\r\n\r\n if (project.type.includes(\"HistoClassification\")) {\r\n onChangeTool(\"selectiontile\");\r\n tools[\"selectiontile\"].setNextTile(roiItem);\r\n } else if (project.type.includes(\"HistoPointCounting\")) {\r\n onChangeTool(\"pointcountingtile\");\r\n tools[\"pointcountingtile\"].setNextTile(roiItem);\r\n }\r\n }\r\n };\r\n\r\n resetRoiLayers = () => {\r\n const { allRoiLayers } = this.props;\r\n // make all roiLayers in all files empty\r\n for (const value of Object.entries(allRoiLayers)) {\r\n value[1].forEach((element) => {\r\n element.layer.regionRois = [];\r\n });\r\n }\r\n };\r\n\r\n onStart = () => {\r\n const {\r\n tools,\r\n onChangeTool,\r\n roiLayers,\r\n selectedLayer,\r\n project,\r\n fileId,\r\n onSelectFile,\r\n } = this.props;\r\n\r\n // check if in first file for starting\r\n let inxCurrentFile = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n if (\r\n inxCurrentFile !== 0 &&\r\n !this.props.tiles.getHsitoClassificationStarted() &&\r\n !this.state.gridExists\r\n ) {\r\n window.showWarningSnackbar(\"Please start in file 1.\");\r\n window.showWarningSnackbar(\"Changing to file 1 ...\");\r\n onSelectFile(project.files[0].id);\r\n return;\r\n }\r\n\r\n // if no grid\r\n if (\r\n roiLayers[selectedLayer].layer.regionRois.length === 0 &&\r\n project.type.includes(\"HistoClassification\")\r\n ) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n this.props.onChangeTool(\"gridtool\");\r\n return;\r\n }\r\n\r\n // reset\r\n if (this.props.tiles.getHsitoClassificationStarted()) {\r\n // initialize gridtool if not initialized yet\r\n onChangeTool(\"gridtool\");\r\n setTimeout(() => this.resetStructures(), 100);\r\n // set started to false\r\n this.props.tiles.setHsitoClassificationStarted(false);\r\n\r\n if (\r\n fileId !== project.files[0].id &&\r\n project.type.includes(\"HistoClassification\")\r\n ) {\r\n // reset roiLayers of all files\r\n this.resetRoiLayers();\r\n window.showWarningSnackbar(\"Changing to file 1 ...\");\r\n onSelectFile(project.files[0].id);\r\n }\r\n return;\r\n }\r\n\r\n // set corresponding zoom level for grid size\r\n let gridSize = Math.sqrt(roiLayers[selectedLayer].layer.regionRois.length);\r\n if (project.type.includes(\"HistoClassification\")) {\r\n window.setZoomLevelForGridSize(gridSize);\r\n }\r\n\r\n if (project.type.includes(\"HistoClassification\")) {\r\n // get selectedRoi from previous use\r\n let savedRoi = this.props.persistentStorage.load(\"selectedRoi\");\r\n if (savedRoi && savedRoi !== null) {\r\n this.props.resultTab.setSelectedRoi(savedRoi);\r\n } else {\r\n savedRoi = 0;\r\n this.props.resultTab.setSelectedRoi(savedRoi);\r\n }\r\n\r\n // make tilesClassificationTool active\r\n let roiItem = {\r\n maxX: roiLayers[selectedLayer].layer.regionRois[savedRoi].bounds.left,\r\n maxY: roiLayers[selectedLayer].layer.regionRois[savedRoi].bounds.top,\r\n minX: roiLayers[selectedLayer].layer.regionRois[savedRoi].bounds.right,\r\n minY: roiLayers[selectedLayer].layer.regionRois[savedRoi].bounds.bottom,\r\n roi: roiLayers[selectedLayer].layer.regionRois[savedRoi],\r\n };\r\n\r\n tools[\"selectiontile\"].setNextTile(roiItem);\r\n onChangeTool(\"selectiontile\");\r\n // On Start set Labels to 0\r\n this.checkIfSkipped();\r\n this.setClassToZero();\r\n } else if (project.type.includes(\"HistoPointCounting\")) {\r\n onChangeTool(\"gridtool\");\r\n // make small delay to initialize grid tool\r\n setTimeout(() => this.startHistoPointCounting(), 100);\r\n }\r\n\r\n // set session started true\r\n this.props.tiles.setHsitoClassificationStarted(true);\r\n\r\n // set resetPressed to false\r\n this.props.resultTab.setResetPressed(false);\r\n\r\n // set gridsize if start old project\r\n let size = Math.sqrt(roiLayers[selectedLayer].layer.regionRois.length);\r\n window.setGridSize(size);\r\n };\r\n\r\n startHistoPointCounting = () => {\r\n const { tools, onChangeTool, roiLayers, selectedLayer } = this.props;\r\n\r\n // only create grid if not exists\r\n if (roiLayers[selectedLayer].layer.regionRois.length === 0) {\r\n tools[\"gridtool\"].createGrid(20, true);\r\n }\r\n\r\n window.setZoomLevelForGridSize(20);\r\n\r\n // get selectedRoi from previous use\r\n let savedRoi = this.props.persistentStorage.load(\"selectedRoi\");\r\n if (savedRoi && savedRoi !== null) {\r\n this.props.resultTab.setSelectedRoi(savedRoi);\r\n } else {\r\n savedRoi = 0;\r\n this.props.resultTab.setSelectedRoi(savedRoi);\r\n }\r\n\r\n // make tilesClassificationTool active\r\n let roiItem = {\r\n maxX: roiLayers[selectedLayer].layer.regionRois[savedRoi].bounds.left,\r\n maxY: roiLayers[selectedLayer].layer.regionRois[savedRoi].bounds.top,\r\n minX: roiLayers[selectedLayer].layer.regionRois[savedRoi].bounds.right,\r\n minY: roiLayers[selectedLayer].layer.regionRois[savedRoi].bounds.bottom,\r\n roi: roiLayers[selectedLayer].layer.regionRois[savedRoi],\r\n };\r\n\r\n onChangeTool(\"pointcountingtile\");\r\n tools[\"pointcountingtile\"].setNextTile(roiItem);\r\n\r\n // check if 100 tiles already classified\r\n let totalCount = this.getTotalCount();\r\n if (totalCount >= 100) {\r\n this.props.resultTab.setHundredTiles(true);\r\n }\r\n };\r\n\r\n onPause = () => {\r\n // save project\r\n this.props.onSave();\r\n };\r\n\r\n onPrevious = () => {\r\n const { tools, roiLayers, selectedLayer, onChangeTool, project } =\r\n this.props;\r\n\r\n // if no grid\r\n if (roiLayers[selectedLayer].layer.regionRois.length === 0) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n this.props.onChangeTool(\"gridtool\");\r\n return;\r\n }\r\n\r\n // set new selectedRoi\r\n if (project.type.includes(\"HistoClassification\")) {\r\n this.previousHistoClassification();\r\n } else if (project.type.includes(\"HistoPointCounting\")) {\r\n this.previousHistoPointCounting();\r\n }\r\n\r\n // roi to select as custom curser in tool\r\n let selectedRoi = this.props.resultTab.getSelectedRoi();\r\n let roiItem = {\r\n maxX: roiLayers[selectedLayer].layer.regionRois[selectedRoi].bounds.left,\r\n maxY: roiLayers[selectedLayer].layer.regionRois[selectedRoi].bounds.top,\r\n minX: roiLayers[selectedLayer].layer.regionRois[selectedRoi].bounds.right,\r\n minY: roiLayers[selectedLayer].layer.regionRois[selectedRoi].bounds\r\n .bottom,\r\n roi: roiLayers[selectedLayer].layer.regionRois[selectedRoi],\r\n };\r\n\r\n // select tile with tool\r\n if (project.type.includes(\"HistoClassification\")) {\r\n tools[\"selectiontile\"].setNextTile(roiItem);\r\n onChangeTool(\"selectiontile\");\r\n } else if (project.type.includes(\"HistoPointCounting\")) {\r\n tools[\"pointcountingtile\"].setNextTile(roiItem);\r\n onChangeTool(\"pointcountingtile\");\r\n }\r\n\r\n // save selectedRoi in local storage\r\n this.props.persistentStorage.save(\r\n \"selectedRoi\",\r\n this.props.resultTab.getSelectedRoi()\r\n );\r\n };\r\n\r\n previousHistoClassification = () => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n\r\n this.checkIfSkipped();\r\n // if first tile of scene go to previous file last tile\r\n if (this.props.resultTab.getSelectedRoi() === 0) {\r\n // change file\r\n let prevFileId = this.getPrevFileId();\r\n if (prevFileId) {\r\n let numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n this.props.resultTab.setSelectedRoi(numberTiles - 1);\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n window.showWarningSnackbar(\"Please wait, loading previous file ...\");\r\n this.props.onSelectFile(prevFileId);\r\n this.props.resultTab.setZoomLevelFixed(false);\r\n this.setClassToZero();\r\n } else {\r\n return;\r\n }\r\n } else {\r\n let nextRoi = this.props.resultTab.getSelectedRoi() - 1;\r\n this.props.resultTab.setSelectedRoi(nextRoi);\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n this.setClassToZero();\r\n }\r\n };\r\n\r\n previousHistoPointCounting = () => {\r\n // if first tile of scene do nothing\r\n if (this.props.resultTab.getSelectedRoi() === 0) {\r\n // change file\r\n let prevFileId = this.getPrevFileId();\r\n if (prevFileId) {\r\n // get tile index from previous file\r\n let lastTileIndices = this.props.persistentStorage.load(\"tileIndices\");\r\n let roiFile = lastTileIndices ? lastTileIndices[prevFileId] : 0;\r\n this.props.resultTab.setSelectedRoi(roiFile);\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n this.props.resultTab.setZoomLevelFixed(false);\r\n this.props.resultTab.setHundredTiles(false);\r\n window.showWarningSnackbar(\"Please wait, loading previous file ...\");\r\n this.props.onSelectFile(prevFileId);\r\n } else {\r\n return;\r\n }\r\n } else {\r\n // if first tile of blue tiles from specification\r\n if (this.props.resultTab.getSelectedRoi() === 21) {\r\n // set last red tile from specification\r\n this.props.resultTab.setSelectedRoi(378);\r\n return;\r\n }\r\n\r\n let selectedRoi = this.props.resultTab.getSelectedRoi();\r\n // check if last tile in row --> then skip next row\r\n let nextRoi = 0;\r\n if (selectedRoi % 20 === 0 || selectedRoi % 20 === 1) {\r\n nextRoi = selectedRoi - 22;\r\n } else {\r\n nextRoi = selectedRoi - 2;\r\n }\r\n\r\n this.props.resultTab.setSelectedRoi(nextRoi);\r\n }\r\n };\r\n\r\n onNext = () => {\r\n const { tools, roiLayers, selectedLayer, onChangeTool, project } =\r\n this.props;\r\n\r\n // if no grid\r\n if (roiLayers[selectedLayer].layer.regionRois.length === 0) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n this.props.onChangeTool(\"gridtool\");\r\n return;\r\n }\r\n\r\n // if file is changing no next possible for a few seconds\r\n if (this.props.resultTab.getFileChange()) {\r\n return;\r\n }\r\n\r\n // if last tile in last file stop\r\n if (this.nextButtonDisabled() && !this.props.resultTab.getFileChange()) {\r\n window.showWarningSnackbar(\"Finished!\");\r\n return;\r\n }\r\n\r\n // set new selectedRoi\r\n if (project.type.includes(\"HistoClassification\")) {\r\n this.nextHistoClassification();\r\n } else if (project.type.includes(\"HistoPointCounting\")) {\r\n this.nextHistoPointCounting();\r\n }\r\n\r\n // roi to select as custom curser in tool\r\n let selectedRoi = this.props.resultTab.getSelectedRoi();\r\n let roiItem = {\r\n maxX: roiLayers[selectedLayer].layer.regionRois[selectedRoi].bounds.left,\r\n maxY: roiLayers[selectedLayer].layer.regionRois[selectedRoi].bounds.top,\r\n minX: roiLayers[selectedLayer].layer.regionRois[selectedRoi].bounds.right,\r\n minY: roiLayers[selectedLayer].layer.regionRois[selectedRoi].bounds\r\n .bottom,\r\n roi: roiLayers[selectedLayer].layer.regionRois[selectedRoi],\r\n };\r\n\r\n // select tile with tool\r\n if (project.type.includes(\"HistoClassification\")) {\r\n tools[\"selectiontile\"].setNextTile(roiItem);\r\n onChangeTool(\"selectiontile\");\r\n } else if (project.type.includes(\"HistoPointCounting\")) {\r\n tools[\"pointcountingtile\"].setNextTile(roiItem);\r\n onChangeTool(\"pointcountingtile\");\r\n }\r\n\r\n // save selectedRoi in local storage\r\n this.props.persistentStorage.save(\r\n \"selectedRoi\",\r\n this.props.resultTab.getSelectedRoi()\r\n );\r\n };\r\n\r\n nextHistoClassification = () => {\r\n const { roiLayers, selectedLayer, onSelectFile } = this.props;\r\n let selectedRoi = this.props.resultTab.getSelectedRoi();\r\n\r\n this.checkIfSkipped();\r\n\r\n let numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n if (selectedRoi === numberTiles - 1) {\r\n // change file\r\n let nextFileId = this.getNextFileId();\r\n if (nextFileId) {\r\n window.showWarningSnackbar(\"Please wait, loading next file ...\");\r\n onSelectFile(nextFileId);\r\n this.props.resultTab.setZoomLevelFixed(false);\r\n this.props.resultTab.setSelectedRoi(0);\r\n } else {\r\n return;\r\n }\r\n } else {\r\n let nextRoi = this.props.resultTab.getSelectedRoi() + 1;\r\n this.props.resultTab.setSelectedRoi(nextRoi);\r\n }\r\n\r\n this.setClassToZero();\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n };\r\n\r\n checkIfSkipped = () => {\r\n const { structures, roiLayers } = this.props;\r\n const selectedRoi = this.props.resultTab.getSelectedRoi();\r\n\r\n let id_range = this.getRoiLayersIdRange();\r\n\r\n // check if some layer was classified, if so return\r\n for (let id in id_range) {\r\n if (\r\n roiLayers[id_range[id]].layer.regionRois[selectedRoi].frequencyClass !==\r\n 0\r\n ) {\r\n return;\r\n }\r\n }\r\n\r\n // set Class to -1 and reduce counter by one for all Rois\r\n for (let id in id_range) {\r\n roiLayers[id_range[id]].layer.regionRois[selectedRoi].frequencyClass = -1;\r\n for (let e in structures) {\r\n if (structures[e].id === roiLayers[id_range[id]].id) {\r\n structures[e].classFrequencies.class_0 -= 1;\r\n break;\r\n }\r\n }\r\n }\r\n };\r\n\r\n setClassToZero = () => {\r\n const { structures, roiLayers } = this.props;\r\n const selectedRoi = this.props.resultTab.getSelectedRoi();\r\n\r\n let id_range = this.getRoiLayersIdRange();\r\n\r\n // set Class to 0 and increase the according counter\r\n for (let id in id_range) {\r\n if (\r\n roiLayers[id_range[id]].layer.regionRois[selectedRoi].frequencyClass ===\r\n -1\r\n ) {\r\n roiLayers[id_range[id]].layer.regionRois[\r\n selectedRoi\r\n ].frequencyClass = 0;\r\n for (let e in structures) {\r\n if (structures[e].id === roiLayers[id_range[id]].id) {\r\n structures[e].classFrequencies.class_0 += 1;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n getRoiLayersIdRange = () => {\r\n const { structures, roiLayers, selectedLayer } = this.props;\r\n\r\n // get ids of RoiLayers that should be set to zero\r\n const tmp = structures.filter(\r\n (element) =>\r\n element.subtypeLevel === structures[selectedLayer].subtypeLevel + 1 &&\r\n element.parentId === structures[selectedLayer].id\r\n );\r\n\r\n // get min and max id\r\n let roi_min = 99999;\r\n let roi_max = -1;\r\n roiLayers.filter((element, idx) => {\r\n for (let e in tmp) {\r\n if (tmp[e].id === element.id) {\r\n if (roi_min > idx) {\r\n roi_min = idx;\r\n }\r\n if (roi_max < idx) {\r\n roi_max = idx;\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n // create a range of ids\r\n let id_range = [...Array(roi_max - roi_min + 1).keys()]; //+roi_min\r\n for (let e in id_range) {\r\n id_range[e] += roi_min;\r\n }\r\n\r\n return id_range;\r\n };\r\n\r\n nextHistoPointCounting = () => {\r\n const { roiLayers, selectedLayer, onSelectFile, fileId } = this.props;\r\n let selectedRoi = this.props.resultTab.getSelectedRoi();\r\n\r\n // if 100 classified tiles --> change file\r\n // if last tile of scene change file\r\n let numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n let totalCount = this.getTotalCount();\r\n if (totalCount >= 100) {\r\n this.props.resultTab.setHundredTiles(true);\r\n } else {\r\n this.props.resultTab.setHundredTiles(false);\r\n }\r\n\r\n if (\r\n (this.props.resultTab.getHundredTiles() && this.isLastClassifiedTile()) ||\r\n selectedRoi === numberTiles - 1\r\n ) {\r\n // change selected file\r\n let nextFileId = this.getNextFileId();\r\n if (nextFileId) {\r\n // save last tileindex of current file\r\n let lastTileIndices = this.props.persistentStorage.load(\"tileIndices\");\r\n if (!lastTileIndices || lastTileIndices.length === 0) {\r\n let indicesObject = {};\r\n indicesObject[fileId] = selectedRoi;\r\n this.props.persistentStorage.save(\"tileIndices\", indicesObject);\r\n } else {\r\n lastTileIndices[fileId] = selectedRoi;\r\n this.props.persistentStorage.save(\"tileIndices\", lastTileIndices);\r\n }\r\n\r\n // change file\r\n window.showWarningSnackbar(\"Please wait, loading next file ...\");\r\n onSelectFile(nextFileId);\r\n this.props.resultTab.setFileChange(true);\r\n this.props.resultTab.setZoomLevelFixed(false);\r\n this.props.resultTab.setSelectedRoi(0);\r\n this.props.resultTab.setHundredTiles(false);\r\n return;\r\n }\r\n }\r\n\r\n // check if last tile in row --> then skip next row\r\n let nextRoi = 0;\r\n if (selectedRoi % 20 === 18 || selectedRoi % 20 === 19) {\r\n nextRoi = selectedRoi + 22;\r\n } else {\r\n nextRoi = selectedRoi + 2;\r\n }\r\n\r\n // check if nextRoi exists\r\n let lenRois = roiLayers[selectedLayer].layer.regionRois.length;\r\n if (nextRoi >= lenRois) {\r\n // roi does not exist --> start with \"blue\" tiles from specifications\r\n nextRoi = 21;\r\n }\r\n\r\n this.props.resultTab.setSelectedRoi(nextRoi);\r\n };\r\n\r\n isLastClassifiedTile = () => {\r\n const { structures, roiLayers, selectedLayer } = this.props;\r\n let selectedRoi = this.props.resultTab.getSelectedRoi();\r\n\r\n // get id of \"leer\" child\r\n let emptyId = 0;\r\n this.findChilds(structures[selectedLayer]).forEach((child) => {\r\n if (child.label === \"leer [leer]\") {\r\n emptyId = child.id;\r\n }\r\n });\r\n\r\n // get all classified tiles\r\n // if selectedRoi is even --> red tile (see specifications)\r\n let classifiedTiles;\r\n if (selectedRoi % 2 === 0) {\r\n classifiedTiles = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi, idx) =>\r\n roi.isAnnotated && roi.structureId !== emptyId && idx % 2 === 0\r\n );\r\n } else {\r\n // if selectedRoi is uneven --> blue tile (see specifications)\r\n classifiedTiles = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi, idx) =>\r\n roi.isAnnotated && roi.structureId !== emptyId && idx % 2 === 1\r\n );\r\n }\r\n\r\n // get index of last classified tile\r\n let idxLastTile = roiLayers[selectedLayer].layer.regionRois.findIndex(\r\n (element) => element === classifiedTiles[classifiedTiles.length - 1]\r\n );\r\n\r\n // check if blue tiles classified\r\n let blueTiles = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi, idx) =>\r\n roi.isAnnotated && roi.structureId !== emptyId && idx % 2 === 1\r\n );\r\n\r\n let blueTilesClassified = blueTiles.length > 0 ? true : false;\r\n\r\n // if selectedRoi has same Index as last classified tile return true\r\n if (idxLastTile === selectedRoi) {\r\n if (selectedRoi === 378 && blueTilesClassified) {\r\n // if last red tile but blue tiles are already classified\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n getNextFileId = () => {\r\n const { project, fileId } = this.props;\r\n let inxCurrentFile = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n if (project.files[inxCurrentFile + 1]) {\r\n return project.files[inxCurrentFile + 1].id;\r\n } else {\r\n // if last file\r\n window.showWarningSnackbar(\"Last file.\");\r\n return null;\r\n }\r\n };\r\n\r\n getPrevFileId = () => {\r\n const { project, fileId } = this.props;\r\n let inxCurrentFile = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n if (project.files[inxCurrentFile - 1]) {\r\n return project.files[inxCurrentFile - 1].id;\r\n } else {\r\n // if first file\r\n window.showWarningSnackbar(\"First file.\");\r\n return null;\r\n }\r\n };\r\n\r\n onEnd = () => {\r\n // save project\r\n if (this.props.project.type.includes(\"HistoClassification\")) {\r\n this.checkIfSkipped();\r\n }\r\n this.props.onSave();\r\n // show warning if not 100 tiles classified\r\n if (\r\n this.getTotalCount() < 100 &&\r\n this.props.project.type.includes(\"HistoPointCounting\")\r\n ) {\r\n window.showWarningSnackbar(\"Not 100 classified tiles in each file\");\r\n }\r\n\r\n // make excel table with results\r\n Backend.setProjectsPending([this.props.project.id], () => {\r\n console.log(\"project state changed to pending:\", this.props.project.id);\r\n });\r\n // return to Home Screen\r\n\r\n let { history } = this.props;\r\n\r\n setTimeout(\r\n function () {\r\n history.push(\"/\");\r\n },\r\n 3000,\r\n history\r\n );\r\n };\r\n\r\n getTotalCount = () => {\r\n const { structures, roiLayers, selectedLayer } = this.props;\r\n\r\n // get id of \"leer\" child\r\n let emptyId = 0;\r\n this.findChilds(structures[selectedLayer]).forEach((child) => {\r\n if (child.label === \"leer [leer]\") {\r\n emptyId = child.id;\r\n }\r\n });\r\n\r\n // get number of rois that are not of class \"leer\"\r\n let numberRois = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi) => roi.isAnnotated && roi.structureId !== emptyId\r\n ).length;\r\n\r\n return numberRois;\r\n };\r\n\r\n renderGridTool = () => {\r\n const { tool } = this.props;\r\n return (\r\n
\r\n {tool && !tool.noConfig && {tool.renderConfiguration()}}\r\n
\r\n );\r\n };\r\n\r\n addStructure = () => {\r\n const { projectContext, structures, selectedLayer, project } = this.props;\r\n const { dynamicStructureText, dynamicStructureAbbrText } = this.state;\r\n\r\n if (dynamicStructureText === \"\") {\r\n window.showWarningSnackbar(\"Please add label of new structure.\");\r\n return;\r\n } else if (dynamicStructureAbbrText === \"\") {\r\n window.showWarningSnackbar(\"Please add abbreviation for new structure.\");\r\n return;\r\n }\r\n\r\n // put label and abbreviation together for label of new structure\r\n let newSubstructureLabel =\r\n dynamicStructureText + \" [\" + dynamicStructureAbbrText + \"]\";\r\n\r\n if (project.type.includes(\"HistoPointCounting\")) {\r\n // add new subtype\r\n projectContext.addSubType(\r\n structures[selectedLayer],\r\n newSubstructureLabel,\r\n true\r\n );\r\n }\r\n\r\n this.setState({ dynamicStructureText: \"\", dynamicStructureAbbrText: \"\" });\r\n };\r\n\r\n addSelectedStructures = () => {\r\n const { projectContext, structures, selectedLayer, project } = this.props;\r\n const { structuresToAdd } = this.state;\r\n\r\n if (project.type.includes(\"HistoClassification\")) {\r\n // add new substructures\r\n structuresToAdd.forEach((newSubstructureLabel) => {\r\n projectContext.addSubStructure(\r\n structures[selectedLayer],\r\n newSubstructureLabel,\r\n true\r\n );\r\n });\r\n }\r\n\r\n this.setState({ structuresToAdd: [], showLabelsToAdd: false });\r\n };\r\n\r\n getCurrentFileInx = () => {\r\n const { project, fileId } = this.props;\r\n return project.files.findIndex((element) => element.id === fileId) + 1;\r\n };\r\n\r\n startOrContinueText = () => {\r\n if (!this.props.tiles.getHsitoClassificationStarted()) {\r\n return \"RUN\";\r\n } else {\r\n if (this.props.project.type.includes(\"HistoClassification\")) {\r\n return \"RESET ALL FILES\";\r\n } else if (this.props.project.type.includes(\"HistoPointCounting\")) {\r\n return \"RESET CURRENT FILE\";\r\n } else {\r\n return \"RESET\";\r\n }\r\n }\r\n };\r\n\r\n nextOrSkipText = () => {\r\n if (this.props.project.type.includes(\"HistoClassification\")) {\r\n return \"NEXT\";\r\n }\r\n\r\n if (!this.getGridExists()) {\r\n return \"NEXT\";\r\n }\r\n const { roiLayers } = this.props;\r\n const selectedRoi = this.props.resultTab.getSelectedRoi();\r\n\r\n let id_range = this.getRoiLayersIdRange();\r\n\r\n // set label to \"NEXT\" if Roi has classifications\r\n for (let id in id_range) {\r\n if (roiLayers[id_range[id]].layer.regionRois[selectedRoi] === undefined) {\r\n return \"NEXT\";\r\n }\r\n if (\r\n roiLayers[id_range[id]].layer.regionRois[selectedRoi].frequencyClass !==\r\n 0\r\n ) {\r\n return \"NEXT\";\r\n }\r\n }\r\n return \"SKIP TILE\";\r\n };\r\n\r\n isLastFile = () => {\r\n const { project, fileId } = this.props;\r\n let inxCurrentFile = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n if (inxCurrentFile === project.files.length - 1) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n nextButtonDisabled = () => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n\r\n // if file change disable next button for three seconds\r\n if (this.props.resultTab.getFileChange()) {\r\n return true;\r\n }\r\n\r\n let disabled;\r\n if (this.props.tiles.getHsitoClassificationStarted()) {\r\n disabled = false;\r\n } else {\r\n disabled = true;\r\n }\r\n\r\n let selectedRoi = this.props.resultTab.getSelectedRoi();\r\n let numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n if (!disabled && this.props.project.type.includes(\"HistoClassification\")) {\r\n // if last file and last tile\r\n let lastTileClassification =\r\n selectedRoi === numberTiles - 1 ? true : false;\r\n if (this.isLastFile() && lastTileClassification) {\r\n return true;\r\n }\r\n } else if (\r\n !disabled &&\r\n this.props.project.type.includes(\"HistoPointCounting\")\r\n ) {\r\n // last file and last tile or last file and 100 annotated\r\n let lastTileCounting = selectedRoi === numberTiles - 1 ? true : false;\r\n if (\r\n (this.isLastFile() && lastTileCounting) ||\r\n (this.isLastFile() &&\r\n this.props.resultTab.getHundredTiles() &&\r\n this.isLastClassifiedTile())\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return disabled;\r\n };\r\n\r\n getAbbreviationOfStructure = (label) => {\r\n let labelWithBracket = label.split(\"[\")[1];\r\n if (!labelWithBracket) {\r\n labelWithBracket = label;\r\n }\r\n let abbreviation = labelWithBracket.substring(\r\n 0,\r\n labelWithBracket.length - 1\r\n );\r\n return abbreviation;\r\n };\r\n\r\n getOtherLabels = () => {\r\n const { structures, selectedLayer } = this.props;\r\n\r\n // get all childs of selected sample\r\n let sampleChilds = structures.filter(\r\n (structure) => structure.parentId === structures[selectedLayer].id\r\n );\r\n\r\n // get all labels sampleChilds\r\n let sampleChildsLabels = [];\r\n sampleChilds.forEach((child) => {\r\n sampleChildsLabels.push(child.label);\r\n });\r\n\r\n // get all labels of histoclassificationlabels that are not in samplechilds\r\n let newLabels = [];\r\n HistoClassififcationLabels.forEach((histoLabel) => {\r\n if (!sampleChildsLabels.includes(histoLabel)) {\r\n newLabels.push(histoLabel);\r\n }\r\n });\r\n\r\n return newLabels;\r\n };\r\n\r\n handleChangeNewStructures = (e, label) => {\r\n // check if add ort remove structure\r\n let updatedStructures = this.state.structuresToAdd;\r\n if (e.target.checked) {\r\n // add structure\r\n updatedStructures.push(label);\r\n } else {\r\n // remove structure\r\n // find index of label and remove it\r\n let idx = updatedStructures.findIndex((labelStr) => labelStr === label);\r\n updatedStructures.splice(idx, 1);\r\n }\r\n\r\n this.setState({ structuresToAdd: updatedStructures });\r\n };\r\n\r\n render() {\r\n const { classes, visible, ...propsWithoutClasses } = this.props;\r\n\r\n if (!visible) return null;\r\n\r\n let numberTilesFile =\r\n this.props.roiLayers[this.props.selectedLayer].layer.regionRois.length;\r\n\r\n let showAddSubstructure = !this.props.tiles.getHsitoClassificationStarted();\r\n\r\n return (\r\n \r\n \r\n \r\n File {this.getCurrentFileInx()} / {this.props.project.files.length}\r\n \r\n {this.props.project.type.includes(\"HistoClassification\") && (\r\n \r\n )}\r\n {this.props.project.type.includes(\"HistoPointCounting\") && (\r\n \r\n )}\r\n {this.props.project.type.includes(\"HistoPointCounting\") &&\r\n showAddSubstructure && (\r\n \r\n \r\n this.setState({\r\n dynamicStructureText: e.target.value,\r\n })\r\n }\r\n />\r\n \r\n this.setState({\r\n dynamicStructureAbbrText: e.target.value,\r\n })\r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {this.props.project.type.includes(\"HistoClassification\") &&\r\n showAddSubstructure && (\r\n
\r\n \r\n Add structures:\r\n \r\n \r\n {\r\n this.setState({\r\n showLabelsToAdd: !this.state.showLabelsToAdd,\r\n });\r\n }}\r\n size=\"large\"\r\n >\r\n {this.state.showLabelsToAdd ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n
\r\n )}\r\n\r\n {this.props.project.type.includes(\"HistoClassification\") &&\r\n showAddSubstructure &&\r\n this.state.showLabelsToAdd && (\r\n
\r\n {this.getOtherLabels().map((histoLabel, idx) => {\r\n return (\r\n \r\n {\r\n this.handleChangeNewStructures(e, histoLabel);\r\n }}\r\n />\r\n }\r\n label={this.getAbbreviationOfStructure(histoLabel)}\r\n />\r\n \r\n );\r\n })}\r\n
\r\n )}\r\n\r\n {this.props.project.type.includes(\"HistoClassification\") &&\r\n showAddSubstructure &&\r\n this.state.showLabelsToAdd && (\r\n \r\n this.addSelectedStructures()}\r\n >\r\n Add selected structures\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n {this.props.resultTab.getRendererInitialized() &&\r\n this.props.histogramConfig && (\r\n c}\r\n fileId={this.props.fileId}\r\n />\r\n )}\r\n \r\n \r\n
\r\n \r\n \r\n this.onNext()}\r\n >\r\n {this.nextOrSkipText()}\r\n \r\n \r\n \r\n this.onPrevious()}\r\n >\r\n Previous\r\n \r\n \r\n \r\n \r\n Tile {this.props.resultTab.getSelectedRoi() + 1} /{\" \"}\r\n {numberTilesFile}\r\n \r\n \r\n \r\n \r\n \r\n this.onStart()}\r\n >\r\n {this.startOrContinueText()}\r\n \r\n \r\n \r\n this.onPause()}\r\n >\r\n Pause\r\n \r\n \r\n \r\n this.onEnd()}\r\n >\r\n End\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSideBarTabResults.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n // sidebar tab properties\r\n sideBarWidth: PropTypes.number,\r\n visible: PropTypes.bool,\r\n // general properties\r\n id: PropTypes.string.isRequired,\r\n viewerConfig: PropTypes.object,\r\n // historgram\r\n ome: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n onChangeChannels: PropTypes.func,\r\n // file management\r\n onSelectFile: PropTypes.func,\r\n onExcludeFilesToggle: PropTypes.func,\r\n //not ordered\r\n project: PropTypes.object,\r\n resultTab: PropTypes.object,\r\n structures: PropTypes.array,\r\n roiLayers: PropTypes.array,\r\n onSelectLayer: PropTypes.func,\r\n persistentStorage: PropTypes.object,\r\n selectedLayer: PropTypes.number,\r\n tools: PropTypes.array,\r\n onChangeTool: PropTypes.func,\r\n tiles: PropTypes.object,\r\n allRoiLayers: PropTypes.object,\r\n fileId: PropTypes.string,\r\n onSave: PropTypes.func,\r\n history: PropTypes.object,\r\n tool: PropTypes.object,\r\n projectContext: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(\r\n withAllViewerContexts(\r\n withTiles(withResultTab(withStyles(styles)(SideBarTabResults)))\r\n )\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { Grid, Tabs, Tab } from \"@mui/material\";\r\n\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport {\r\n faPencilRuler,\r\n faCog,\r\n faBrain,\r\n faChartBar,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\nimport { Tools } from \"./VerticalToolBar\";\r\nimport { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\r\n\r\nimport SideBarTabAI from \"./sidebar/SideBarTabAI\";\r\nimport SideBarTabRois from \"./sidebar/SideBarTabRois\";\r\nimport SideBarTabView from \"./sidebar/SideBarTabView\";\r\nimport SideBarTabResults from \"./sidebar/SideBarTabResults\";\r\nimport { Role } from \"../../common/utils\";\r\nimport { authenticationService } from \"../../common/services\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n sidebar: {\r\n margin: 0,\r\n background: \"#fff\",\r\n },\r\n tabsContainer: {\r\n width: \"100%\",\r\n \"& .MuiTabs-fixed\": {\r\n minHeight: 44,\r\n height: 44,\r\n },\r\n },\r\n tab: {\r\n minWidth: 395 / 3,\r\n minHeight: 44,\r\n height: 44,\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n \"& *\": {\r\n display: \"inline-block\",\r\n fontSize: \"16px\",\r\n lineHeight: \"16px\",\r\n },\r\n \"& svg\": {\r\n marginRight: \"5px\",\r\n position: \"relative\",\r\n top: \"4px\",\r\n },\r\n },\r\n flexVerticalContainer: {\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"60px 1fr\",\r\n },\r\n flexRowContentHeight: {\r\n //flex: \"0 1 auto\",\r\n padding: 10,\r\n },\r\n tabContentContainer: {\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n height: \"100%\",\r\n overflow: \"hidden\",\r\n },\r\n});\r\n\r\nclass SideBar extends Component {\r\n _isMounted = false;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n activeTab: 0,\r\n channelSelectMode: \"all\",\r\n availableModels: [],\r\n currentUser: null,\r\n isAdmin: false,\r\n modelsInitialized: false,\r\n };\r\n\r\n window.forceSidebarUpdate = this.forceSidebarUpdate;\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n forceSidebarUpdate = () => {\r\n this.forceUpdate();\r\n };\r\n\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n // set active tab from local storage\r\n let activeTab = this.props.persistentStorage.load(\"activeTab\");\r\n if (activeTab) {\r\n if (activeTab !== this.state.activeTab) {\r\n this.setMountedState({ activeTab: activeTab });\r\n }\r\n this.props.projectContext.setActiveTab(activeTab);\r\n }\r\n authenticationService.currentUser.subscribe((x) => {\r\n this.setMountedState({\r\n currentUser: x,\r\n isAdmin: x && x.role === Role.Admin,\r\n });\r\n });\r\n\r\n // only load ai data if ai tab is present\r\n if (this.props.viewerConfig.project.toolsInProject[\"AICockpit\"]) {\r\n this.initAIFormData(false);\r\n this.initAICockpitData();\r\n }\r\n };\r\n\r\n initAICockpitData = () => {\r\n let aiStateObject = {\r\n open: false,\r\n activeStep: 0,\r\n maxEpochs: 0,\r\n stepsProgress: \"-\",\r\n epochsProgress: \"-\",\r\n showTrainingButton: true,\r\n buildingModel: false,\r\n showTrainingProgress: false,\r\n trainingFinished: false,\r\n newModelName: \"\",\r\n overallProgress: 0.0,\r\n trainingSuccessful: true,\r\n startTrainingTime: null,\r\n errorLabel: \"Failed\",\r\n metricsDict: {},\r\n formData: {\r\n modelType: \"segmentation\",\r\n datasetOnly: false,\r\n fullScene:\r\n this.props.viewerConfig.project.projectStringProperties[\r\n \"ViewerType\"\r\n ] == \"FilesGallery\",\r\n selStructures: [],\r\n structureIndices: [],\r\n augmentations: [\"h_flip\", \"v_flip\"],\r\n metaData: {\r\n modelName: \"\",\r\n versionName: \"001\",\r\n newModel: true,\r\n uniqueName: false,\r\n validChar: false,\r\n },\r\n advancedSettings: {\r\n backbones: {\r\n unet: [],\r\n unet_pp: [],\r\n deepLabV3_p: [],\r\n classification_models: [],\r\n },\r\n lossFunction: \"Cross Entropy\",\r\n comDLArchitecture: null,\r\n level: this.props.ome.maxLevel,\r\n physicalSize: this.props.ome.physicalSizeX\r\n ? this.props.ome.physicalSizeX\r\n : 1,\r\n physicalSizeUnit: this.props.ome.physicalSizeXUnit\r\n ? this.props.ome.physicalSizeXUnit\r\n : \"px\",\r\n in_channels: this.setInputChannels(),\r\n flChannels: this.setFlChannels(),\r\n modelsize: \"m\",\r\n epochs: 100,\r\n optimizer: \"Adam\",\r\n lr: 0.0001,\r\n batch_size: 2,\r\n datasetApproach: \"Sliding Window\",\r\n tileSize: 512,\r\n overlap: 64,\r\n objectBasedBaseStructure: null,\r\n calculateWeightMap: false,\r\n useExistingDataset: false,\r\n useClassWeights: false,\r\n },\r\n },\r\n };\r\n\r\n this.props.projectContext.setState({\r\n aiStateObject: aiStateObject,\r\n });\r\n };\r\n\r\n setInputChannels = () => {\r\n const { ome } = this.props;\r\n let isBrightfield =\r\n ome &&\r\n ome.channels.length === 1 &&\r\n ome.channels[0].type === \"brightfield\";\r\n\r\n return isBrightfield ? 3 : ome.channels.length;\r\n };\r\n\r\n setFlChannels = () => {\r\n const { ome, histogramConfig, fileId } = this.props;\r\n let isBrightfield =\r\n ome &&\r\n ome.channels.length === 1 &&\r\n ome.channels[0].type === \"brightfield\";\r\n\r\n if (histogramConfig[fileId] && !isBrightfield) {\r\n return histogramConfig[fileId].channels.map((c) => c.name);\r\n } else {\r\n return [];\r\n }\r\n };\r\n\r\n componentWillUnmount = () => {\r\n this._isMounted = false;\r\n };\r\n\r\n setAvailableModels = (availableModels) => {\r\n this.setMountedState({ availableModels: availableModels });\r\n };\r\n\r\n setModelsInitialized = (initialized) => {\r\n this.setMountedState({ modelsInitialized: initialized });\r\n };\r\n\r\n /**\r\n * Request all model data from disk and optionally from online sources.\r\n * @param {bool} connectOnline Should models be donwloaded from the HSA online server. Defaults to false.\r\n */\r\n initAIFormData = (connectOnline = false) => {\r\n this.setMountedState({ modelsInitialized: false });\r\n\r\n Backend.getModelMetadata(\"verified_models\", connectOnline, (aiModels) => {\r\n // TODO Viktor: please check online mode\r\n\r\n // if (aiModelRepository.length === 0 && aiModelRepository.online) {\r\n // this.initModelCounter++;\r\n // if (this.initModelCounter < 5 && window.navigator.onLine) {\r\n // setTimeout(() => {\r\n // this.initAIFormData(connectOnline);\r\n // }, 2000);\r\n // return;\r\n // }\r\n // }\r\n if (aiModels) {\r\n let formDataAICockpit = {};\r\n // start with index 1 -> skip Base ROI\r\n for (let i = 1; i < this.props.structures.length; i++) {\r\n let s = this.props.structures[i];\r\n let selected_model = null;\r\n let selected_version = null;\r\n if (this.props.formDataAICockpit != null) {\r\n if (typeof this.props.formDataAICockpit[s.id] !== \"undefined\") {\r\n selected_model = this.props.formDataAICockpit[s.id].selectedModel;\r\n\r\n if (\r\n selected_model !== null &&\r\n this.props.formDataAICockpit[s.id].models[selected_model]\r\n ) {\r\n selected_version =\r\n this.props.formDataAICockpit[s.id].models[selected_model]\r\n .selectedVersion;\r\n }\r\n }\r\n }\r\n\r\n formDataAICockpit[s.id] = {\r\n structureIndex: i,\r\n selectedModel: selected_model,\r\n selectedVersion: selected_version,\r\n modelType: null,\r\n fullStructure: s,\r\n models: {},\r\n };\r\n if (aiModels) {\r\n for (let model of aiModels) {\r\n if (model.versions.length > 0) {\r\n formDataAICockpit[s.id].models[model.name] = {\r\n selectedVersion:\r\n formDataAICockpit[s.id].selectedVersion === null\r\n ? model.versions.slice(-1)[0].label\r\n : formDataAICockpit[s.id].selectedVersion,\r\n modelType:\r\n formDataAICockpit[s.id].modelType === null\r\n ? model.versions.slice(-1)[0].modeltype\r\n : formDataAICockpit[s.id].modeltype,\r\n };\r\n }\r\n }\r\n }\r\n }\r\n this.setMountedState({\r\n availableModels: aiModels,\r\n modelsInitialized: true,\r\n });\r\n //this.props.projectContext.setAiModelRepository(aiModelRepository);\r\n this.props.projectContext.setState({\r\n aiModelRepository: aiModels,\r\n });\r\n\r\n // when project not saved yet\r\n // try to apply models in project config\r\n Backend.loadProject({ id: this.props.project.id }, (project) => {\r\n if (project.projectData === null) {\r\n const stringProperties =\r\n this.props.viewerConfig.project.projectStringProperties;\r\n if (\r\n stringProperties.DefaultModels &&\r\n stringProperties.DefaultModels != \"\"\r\n ) {\r\n for (let modelName of stringProperties.DefaultModels.split(\",\")) {\r\n let foundModel = aiModels.find(\r\n (item) => item.name === modelName\r\n );\r\n if (foundModel && foundModel.versions) {\r\n let foundVersion =\r\n foundModel.versions[foundModel.versions.length - 1];\r\n if (foundVersion) {\r\n for (let structureIndex of foundVersion.structure_indices) {\r\n if (structureIndex > 0) {\r\n let structureKey = Object.keys(formDataAICockpit).find(\r\n (key) =>\r\n formDataAICockpit[key].structureIndex ===\r\n structureIndex\r\n );\r\n if (structureKey) {\r\n formDataAICockpit[structureKey].selectedModel =\r\n modelName;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // check if selected models still exist, otherwise, deselect it!\r\n for (const structure of Object.values(formDataAICockpit)) {\r\n if (structure.selectedModel !== null) {\r\n const modelInRepo = aiModels.find(\r\n (item) => item.name === structure.selectedModel\r\n );\r\n if (typeof modelInRepo === \"undefined\") {\r\n structure.selectedModel = null;\r\n structure.selectedVersion = null;\r\n }\r\n }\r\n }\r\n\r\n this.props.setAIFormData(formDataAICockpit);\r\n });\r\n }\r\n });\r\n\r\n Backend.initPythonModules();\r\n };\r\n\r\n componentDidUpdate() {\r\n const { activeTool } = this.props;\r\n if (\r\n activeTool === \"none\" ||\r\n typeof activeTool === \"undefined\" ||\r\n activeTool === Tools.NONE ||\r\n activeTool === \"iam_ai_inference\" ||\r\n (activeTool === \"gridtool\" &&\r\n !(\r\n this.props.project.type.includes(\"HistoPointCounting\") ||\r\n this.props.project.type.includes(\"HistoClassification\")\r\n ))\r\n )\r\n return;\r\n }\r\n\r\n handleTabChange = (event, value) => {\r\n const { project } = this.props;\r\n\r\n if (value === this.state.activeTab) return;\r\n // select tool coresponding to roilayer roi tab\r\n if (value === 1 && this.props.activeTool === \"none\") {\r\n if (this.props.structures[this.props.selectedLayer].tools[0]) {\r\n let toolName =\r\n this.props.structures[this.props.selectedLayer].tools[0].name;\r\n if (\r\n (toolName =\r\n \"iam_ai_inference\" &&\r\n !this.props.aiUsedStructures.filter(\r\n (e) => e.id === this.props.structures[this.props.selectedLayer].id\r\n ).length > 0)\r\n ) {\r\n toolName = \"none\";\r\n }\r\n\r\n this.props.onChangeTool(toolName);\r\n }\r\n }\r\n\r\n // make tools to none in those two modules\r\n if (\r\n value === 0 &&\r\n (project.type.includes(\"HistoPointCounting\") ||\r\n project.type.includes(\"HistoClassification\"))\r\n ) {\r\n this.props.onChangeTool(\"none\");\r\n }\r\n\r\n // if resultTab select coresponding tools\r\n if (this.isResultTab(value)) {\r\n if (project.type.includes(\"HistoPointCounting\")) {\r\n this.props.onChangeTool(\"pointcountingtile\");\r\n } else if (project.type.includes(\"HistoClassification\")) {\r\n this.props.onChangeTool(\"selectiontile\");\r\n }\r\n }\r\n\r\n // save active tab to local storage\r\n if (this.state.activeTab !== value) {\r\n this.props.persistentStorage.save(\"activeTab\", value);\r\n this.setMountedState({ activeTab: value });\r\n }\r\n this.props.projectContext.setActiveTab(value);\r\n\r\n // only update if sidebar width changed\r\n if (\r\n project.type.includes(\"HistoPointCounting\") ||\r\n project.type.includes(\"HistoClassification\")\r\n ) {\r\n setTimeout(() => this.props.setSideBarWidth(), 50);\r\n }\r\n };\r\n\r\n isResultTab = (tab) => {\r\n // check if active tab is result tab\r\n if (!this.checkToolInConfig(\"ResultTab\")) {\r\n return false;\r\n }\r\n\r\n // check which tabs exist in module --> then decide which index result tab has\r\n let nextTab = tab;\r\n if (\r\n this.checkToolInConfig(\"AICockpit\") &&\r\n this.checkToolInConfig(\"RoiTab\")\r\n ) {\r\n // resultTab = 3\r\n return nextTab === 3;\r\n } else if (\r\n this.checkToolInConfig(\"AICockpit\") ||\r\n this.checkToolInConfig(\"RoiTab\")\r\n ) {\r\n // resultTab = 2\r\n return nextTab === 2;\r\n } else {\r\n // resultTab = 1\r\n return nextTab === 1;\r\n }\r\n };\r\n\r\n changeChannelSelectMode = (mode) => {\r\n this.setMountedState({\r\n channelSelectMode: mode,\r\n });\r\n };\r\n\r\n checkToolInConfig(toolName) {\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n getActiveTabResults = () => {\r\n // get tab number/index for reslults tab\r\n // if AICockpit in project module results tab is number 3\r\n if (\r\n this.checkToolInConfig(\"AICockpit\") &&\r\n this.checkToolInConfig(\"RoiTab\")\r\n ) {\r\n return 3;\r\n } else if (\r\n this.checkToolInConfig(\"AICockpit\") ||\r\n this.checkToolInConfig(\"RoiTab\")\r\n ) {\r\n return 2;\r\n } else {\r\n return 1;\r\n }\r\n };\r\n\r\n renderCommentTool = () => {\r\n const { tool } = this.props;\r\n return (\r\n
\r\n {tool && !tool.noConfig && {tool.renderConfiguration()}}\r\n
\r\n );\r\n };\r\n\r\n render() {\r\n const { classes, ...propsWithoutClasses } = this.props;\r\n const { rois, roiLayers, activeTool, showGallery, rendererRef, tool } =\r\n this.props;\r\n const { activeTab, isAdmin } = this.state;\r\n\r\n if (!roiLayers) return null;\r\n\r\n return (\r\n \r\n \r\n }\r\n label=\"View\"\r\n >\r\n {this.checkToolInConfig(\"RoiTab\") && rendererRef && (\r\n }\r\n label={\r\n \"ROIS (\" +\r\n (rois.length -\r\n rendererRef.gridTileCount +\r\n roiLayers.reduce(\r\n (acc, cur) => acc + cur.layer.regionRois.length,\r\n 0\r\n )) +\r\n \")\"\r\n }\r\n />\r\n )}\r\n {this.checkToolInConfig(\"AICockpit\") && (\r\n }\r\n label=\"AI\"\r\n >\r\n )}\r\n {this.checkToolInConfig(\"ResultTab\") && (\r\n }\r\n label=\"scoring\"\r\n >\r\n )}\r\n \r\n {activeTool !== \"comment\" || activeTool !== \"landmark\" ? (\r\n
\r\n \r\n {this.checkToolInConfig(\"RoiTab\") && (\r\n \r\n )}\r\n {this.checkToolInConfig(\"AICockpit\") && (\r\n \r\n )}\r\n {this.checkToolInConfig(\"ResultTab\") && (\r\n (this.sideBarTabResults = c)}\r\n visible={\r\n activeTab === this.getActiveTabResults() && !showGallery\r\n }\r\n {...propsWithoutClasses}\r\n />\r\n )}\r\n {tool && !tool.noConfig && (\r\n \r\n {tool.renderConfiguration()}\r\n \r\n )}\r\n
\r\n ) : (\r\n
{this.renderCommentTool()}
\r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSideBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n sideBarWidth: PropTypes.number,\r\n viewerConfig: PropTypes.object,\r\n alterStructure: PropTypes.func,\r\n histogramConfig: PropTypes.object,\r\n onChangeChannels: PropTypes.func,\r\n id: PropTypes.string.isRequired,\r\n ome: PropTypes.object,\r\n rois: PropTypes.array,\r\n onCenterROI: PropTypes.func,\r\n onHoverROI: PropTypes.func,\r\n onSelectFile: PropTypes.func,\r\n onExcludeFileToggle: PropTypes.func,\r\n // roiLayers\r\n roiLayers: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n onChangeLayers: PropTypes.func,\r\n onChangeTool: PropTypes.func,\r\n deleteforAllScenes: PropTypes.func,\r\n // tools\r\n activeTool: PropTypes.string,\r\n tool: PropTypes.object,\r\n // opacity slider\r\n opacity: PropTypes.number,\r\n onChangeOpacity: PropTypes.func,\r\n // Parameterset Export Import\r\n onExportParameters: PropTypes.func,\r\n onImportParameters: PropTypes.func,\r\n formDataAICockpit: PropTypes.object,\r\n onUpdateDimensions: PropTypes.func,\r\n onSave: PropTypes.func,\r\n //not ordered\r\n persistentStorage: PropTypes.object,\r\n projectContext: PropTypes.object,\r\n project: PropTypes.object,\r\n rendererRef: PropTypes.object,\r\n setSideBarWidth: PropTypes.func,\r\n showGallery: PropTypes.bool,\r\n structures: PropTypes.array,\r\n setAIFormData: PropTypes.func,\r\n setAiUsedStructures: PropTypes.func,\r\n aiUsedStructures: PropTypes.array,\r\n fileId: PropTypes.string,\r\n};\r\n\r\nexport default withAllViewerContexts(withStyles(styles)(SideBar));\r\n","import Backend from \"../../common/utils/Backend\";\r\nimport { inv, multiply, transpose } from \"mathjs\";\r\n\r\nexport function configureImage(img, channel) {\r\n if (!img || img.width === 0) {\r\n return null;\r\n }\r\n\r\n let offScrCan = document.createElement(\"canvas\");\r\n offScrCan.width = img.width;\r\n offScrCan.height = img.height;\r\n\r\n let ctx1 = offScrCan.getContext(\"2d\");\r\n\r\n ctx1.drawImage(img, 0, 0, img.width, img.height);\r\n\r\n // do histogram manipulation\r\n if (img.width === 0) return null;\r\n let imgData = ctx1.getImageData(0, 0, img.width, img.height);\r\n let step = 4; // rgba\r\n let min = channel.min;\r\n let max = channel.max;\r\n let gamma = channel.gamma;\r\n\r\n for (let i = 0; i < imgData.data.length; i += step) {\r\n // alter r,g and b\r\n for (let j = 0; j < 3; j++) {\r\n let val = imgData.data[i + j];\r\n val = (Math.min(Math.max(val - min, 0), max) * 255) / (max - min);\r\n imgData.data[i + j] = 255 * (val / 255) ** (1 / gamma);\r\n }\r\n }\r\n ctx1.putImageData(imgData, 0, 0);\r\n return offScrCan;\r\n}\r\n\r\nvar __assign =\r\n (this && this.__assign) ||\r\n function () {\r\n __assign =\r\n Object.assign ||\r\n function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s)\r\n if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n };\r\n//function is necessary for procrustes calculation\r\nfunction SVD(a, options) {\r\n let _a = __assign({ u: true, v: true, eps: Math.pow(2, -52) }, options),\r\n withu = _a.u,\r\n withv = _a.v,\r\n eps = _a.eps;\r\n var tol = 1e-64 / eps;\r\n // throw error if a is not defined\r\n if (!a) {\r\n throw new TypeError(\"Matrix a is not defined\");\r\n }\r\n // Householder's reduction to bidiagonal form\r\n var n = a[0].length;\r\n var m = a.length;\r\n if (m < n) {\r\n throw new TypeError(\"Invalid matrix: m < n\");\r\n }\r\n var l1, c, f, h, s, y, z;\r\n var l = 0,\r\n g = 0,\r\n x = 0;\r\n var e = [];\r\n var u = [];\r\n var v = [];\r\n // Initialize u\r\n for (let i = 0; i < m; i++) {\r\n u[i] = new Array(n).fill(0);\r\n }\r\n // Initialize v\r\n for (let i = 0; i < n; i++) {\r\n v[i] = new Array(n).fill(0);\r\n }\r\n // Initialize q\r\n var q = new Array(n).fill(0);\r\n // Copy array a in u\r\n for (let i = 0; i < m; i++) {\r\n for (let j = 0; j < n; j++) {\r\n u[i][j] = a[i][j];\r\n }\r\n }\r\n for (let i = 0; i < n; i++) {\r\n e[i] = g;\r\n s = 0;\r\n l = i + 1;\r\n for (let j = i; j < m; j++) {\r\n s += Math.pow(u[j][i], 2);\r\n }\r\n if (s < tol) {\r\n g = 0;\r\n } else {\r\n f = u[i][i];\r\n g = f < 0 ? Math.sqrt(s) : -Math.sqrt(s);\r\n h = f * g - s;\r\n u[i][i] = f - g;\r\n for (let j = l; j < n; j++) {\r\n s = 0;\r\n for (let k = i; k < m; k++) {\r\n s += u[k][i] * u[k][j];\r\n }\r\n f = s / h;\r\n for (let k = i; k < m; k++) {\r\n u[k][j] = u[k][j] + f * u[k][i];\r\n }\r\n }\r\n }\r\n q[i] = g;\r\n s = 0;\r\n for (let j = l; j < n; j++) {\r\n s += Math.pow(u[i][j], 2);\r\n }\r\n if (s < tol) {\r\n g = 0;\r\n } else {\r\n f = u[i][i + 1];\r\n g = f < 0 ? Math.sqrt(s) : -Math.sqrt(s);\r\n h = f * g - s;\r\n u[i][i + 1] = f - g;\r\n for (let j = l; j < n; j++) {\r\n e[j] = u[i][j] / h;\r\n }\r\n for (let j = l; j < m; j++) {\r\n s = 0;\r\n for (let k = l; k < n; k++) {\r\n s += u[j][k] * u[i][k];\r\n }\r\n for (let k = l; k < n; k++) {\r\n u[j][k] = u[j][k] + s * e[k];\r\n }\r\n }\r\n }\r\n y = Math.abs(q[i]) + Math.abs(e[i]);\r\n if (y > x) {\r\n x = y;\r\n }\r\n }\r\n // Accumulation of right-hand transformations\r\n if (withv) {\r\n for (let i = n - 1; i >= 0; i--) {\r\n if (g !== 0) {\r\n h = u[i][i + 1] * g;\r\n for (let j = l; j < n; j++) {\r\n v[j][i] = u[i][j] / h;\r\n }\r\n for (let j = l; j < n; j++) {\r\n s = 0;\r\n for (let k = l; k < n; k++) {\r\n s += u[i][k] * v[k][j];\r\n }\r\n for (let k = l; k < n; k++) {\r\n v[k][j] = v[k][j] + s * v[k][i];\r\n }\r\n }\r\n }\r\n for (let j = l; j < n; j++) {\r\n v[i][j] = 0;\r\n v[j][i] = 0;\r\n }\r\n v[i][i] = 1;\r\n g = e[i];\r\n l = i;\r\n }\r\n }\r\n // Accumulation of left-hand transformations\r\n if (withu) {\r\n for (let i = n - 1; i >= 0; i--) {\r\n l = i + 1;\r\n g = q[i];\r\n for (let j = l; j < n; j++) {\r\n u[i][j] = 0;\r\n }\r\n if (g !== 0) {\r\n h = u[i][i] * g;\r\n for (let j = l; j < n; j++) {\r\n s = 0;\r\n for (let k = l; k < m; k++) {\r\n s += u[k][i] * u[k][j];\r\n }\r\n f = s / h;\r\n for (let k = i; k < m; k++) {\r\n u[k][j] = u[k][j] + f * u[k][i];\r\n }\r\n }\r\n for (let j = i; j < m; j++) {\r\n u[j][i] = u[j][i] / g;\r\n }\r\n } else {\r\n for (let j = i; j < m; j++) {\r\n u[j][i] = 0;\r\n }\r\n }\r\n u[i][i] = u[i][i] + 1;\r\n }\r\n }\r\n // Diagonalization of the bidiagonal form\r\n eps = eps * x;\r\n var testConvergence;\r\n for (let k = n - 1; k >= 0; k--) {\r\n for (let iteration = 0; iteration < 50; iteration++) {\r\n // test-f-splitting\r\n testConvergence = false;\r\n for (l = k; l >= 0; l--) {\r\n if (Math.abs(e[l]) <= eps) {\r\n testConvergence = true;\r\n break;\r\n }\r\n if (Math.abs(q[l - 1]) <= eps) {\r\n break;\r\n }\r\n }\r\n if (!testConvergence) {\r\n // cancellation of e[l] if l>0\r\n c = 0;\r\n s = 1;\r\n l1 = l - 1;\r\n for (let i = l; i < k + 1; i++) {\r\n f = s * e[i];\r\n e[i] = c * e[i];\r\n if (Math.abs(f) <= eps) {\r\n break; // goto test-f-convergence\r\n }\r\n g = q[i];\r\n q[i] = Math.sqrt(f * f + g * g);\r\n h = q[i];\r\n c = g / h;\r\n s = -f / h;\r\n if (withu) {\r\n for (let j = 0; j < m; j++) {\r\n y = u[j][l1];\r\n z = u[j][i];\r\n u[j][l1] = y * c + z * s;\r\n u[j][i] = -y * s + z * c;\r\n }\r\n }\r\n }\r\n }\r\n // test f convergence\r\n z = q[k];\r\n if (l === k) {\r\n // convergence\r\n if (z < 0) {\r\n // q[k] is made non-negative\r\n q[k] = -z;\r\n if (withv) {\r\n for (var j = 0; j < n; j++) {\r\n v[j][k] = -v[j][k];\r\n }\r\n }\r\n }\r\n break; // break out of iteration loop and move on to next k value\r\n }\r\n // Shift from bottom 2x2 minor\r\n x = q[l];\r\n y = q[k - 1];\r\n g = e[k - 1];\r\n h = e[k];\r\n f = ((y - z) * (y + z) + (g - h) * (g + h)) / (2 * h * y);\r\n g = Math.sqrt(f * f + 1);\r\n f = ((x - z) * (x + z) + h * (y / (f < 0 ? f - g : f + g) - h)) / x;\r\n // Next QR transformation\r\n c = 1;\r\n s = 1;\r\n for (let i = l + 1; i < k + 1; i++) {\r\n g = e[i];\r\n y = q[i];\r\n h = s * g;\r\n g = c * g;\r\n z = Math.sqrt(f * f + h * h);\r\n e[i - 1] = z;\r\n c = f / z;\r\n s = h / z;\r\n f = x * c + g * s;\r\n g = -x * s + g * c;\r\n h = y * s;\r\n y = y * c;\r\n if (withv) {\r\n for (let j = 0; j < n; j++) {\r\n x = v[j][i - 1];\r\n z = v[j][i];\r\n v[j][i - 1] = x * c + z * s;\r\n v[j][i] = -x * s + z * c;\r\n }\r\n }\r\n z = Math.sqrt(f * f + h * h);\r\n q[i - 1] = z;\r\n c = f / z;\r\n s = h / z;\r\n f = c * g + s * y;\r\n x = -s * g + c * y;\r\n if (withu) {\r\n for (let j = 0; j < m; j++) {\r\n y = u[j][i - 1];\r\n z = u[j][i];\r\n u[j][i - 1] = y * c + z * s;\r\n u[j][i] = -y * s + z * c;\r\n }\r\n }\r\n }\r\n e[l] = 0;\r\n e[k] = f;\r\n q[k] = x;\r\n }\r\n }\r\n // Number below eps should be zero\r\n for (let i = 0; i < n; i++) {\r\n if (q[i] < eps) q[i] = 0;\r\n }\r\n return { u: u, q: q, v: v };\r\n}\r\n\r\nfunction calculateAffineTransformation(opointBase, opointShift, bfact, tfact) {\r\n //copy arrays\r\n let pointBase = JSON.parse(JSON.stringify(opointBase));\r\n let pointShift = JSON.parse(JSON.stringify(opointShift));\r\n\r\n for (let i = 0; i < pointBase.length; i++) {\r\n pointShift[i][0] = pointShift[i][0] * tfact;\r\n pointShift[i][1] = pointShift[i][1] * tfact;\r\n pointBase[i][0] = pointBase[i][0] * bfact;\r\n pointBase[i][1] = pointBase[i][1] * bfact;\r\n }\r\n\r\n //procrustes Calculation\r\n let n = pointBase.length;\r\n let ny = pointShift.length;\r\n\r\n let muXSumX = 0;\r\n let muXSumY = 0;\r\n for (let i = 0; i < n; i++) {\r\n muXSumX += pointBase[i][0];\r\n muXSumY += pointBase[i][1];\r\n }\r\n let muYSumX = 0;\r\n let muYSumY = 0;\r\n for (let i = 0; i < ny; i++) {\r\n muYSumX += pointShift[i][0];\r\n muYSumY += pointShift[i][1];\r\n }\r\n let muX = [muXSumX / n, muXSumY / n];\r\n let muY = [muYSumX / ny, muYSumY / ny];\r\n\r\n let x0 = [];\r\n let y0 = [];\r\n for (let i = 0; i < n; i++) {\r\n x0.push([pointBase[i][0] - muX[0], pointBase[i][1] - muX[1]]);\r\n }\r\n for (let i = 0; i < ny; i++) {\r\n y0.push([pointShift[i][0] - muY[0], pointShift[i][1] - muY[1]]);\r\n }\r\n\r\n let muXSumXQ = 0;\r\n let muXSumYQ = 0;\r\n for (let i = 0; i < n; i++) {\r\n muXSumXQ += x0[i][0] ** 2;\r\n muXSumYQ += x0[i][1] ** 2;\r\n }\r\n let muYSumXQ = 0;\r\n let muYSumYQ = 0;\r\n for (let i = 0; i < ny; i++) {\r\n muYSumXQ += y0[i][0] ** 2;\r\n muYSumYQ += y0[i][1] ** 2;\r\n }\r\n let ssX = muXSumXQ + muXSumYQ;\r\n let ssY = muYSumXQ + muYSumYQ;\r\n\r\n let normX = Math.sqrt(ssX);\r\n let normY = Math.sqrt(ssY);\r\n\r\n let newX0 = [];\r\n let newY0 = [];\r\n for (let i = 0; i < n; i++) {\r\n newX0.push([x0[i][0] / normX, x0[i][1] / normX]);\r\n }\r\n for (let i = 0; i < ny; i++) {\r\n newY0.push([y0[i][0] / normY, y0[i][1] / normY]);\r\n }\r\n\r\n let a = multiply(transpose(newX0), newY0);\r\n let { u, q, v } = SVD(a);\r\n\r\n let U = JSON.parse(JSON.stringify(u));\r\n U[0][0] = u[0][1];\r\n U[0][1] = u[0][0];\r\n U[1][0] = u[1][1];\r\n U[1][1] = u[1][0];\r\n let Vt = JSON.parse(JSON.stringify(v));\r\n Vt[0][0] = v[0][1];\r\n Vt[0][1] = v[0][0];\r\n Vt[1][0] = v[1][1];\r\n Vt[1][1] = v[1][0];\r\n let s = JSON.parse(JSON.stringify(q));\r\n s[0] = q[1];\r\n s[1] = q[0];\r\n\r\n let V = transpose(Vt);\r\n\r\n let T = multiply(V, transpose(U));\r\n // reflection always at best\r\n // scaling always true\r\n // view python code for details\r\n let traceTA = 0;\r\n for (let i = 0; i < s.length; i++) {\r\n traceTA += s[i];\r\n }\r\n let b = (traceTA * normX) / normY;\r\n let Z = multiply(newY0, T);\r\n\r\n for (let i = 0; i < Z.length; i++) {\r\n Z[i][0] = normX * traceTA * Z[i][0] + muX[0];\r\n Z[i][1] = normX * traceTA * Z[i][1] + muX[1];\r\n }\r\n let c = multiply(muY, T);\r\n c[0] = muX[0] - c[0] * b;\r\n c[1] = muX[1] - c[1] * b;\r\n let R = [\r\n [T[0][0], T[0][1], 0],\r\n [T[1][0], T[1][1], 0],\r\n [0, 0, 1],\r\n ];\r\n let S = [\r\n [b, 0, 0],\r\n [0, b, 0],\r\n [0, 0, 1],\r\n ];\r\n let t = [\r\n [1, 0, c[0]],\r\n [0, 1, c[1]],\r\n [0, 0, 1],\r\n ];\r\n let Matrix = transpose(multiply(multiply(R, S), transpose(t)));\r\n return Matrix;\r\n}\r\n\r\nfunction calcOnloading(params, img) {\r\n img.onload = () => {\r\n params.counter += 1;\r\n params.imgs.push(img);\r\n if (params.counter === 2) {\r\n let str = params.imgs[0].currentSrc;\r\n //let baseHeight = null;\r\n let targetHeight = null;\r\n if (str.includes(params.baseId)) {\r\n //baseHeight = params.imgs[0].height;\r\n targetHeight = params.imgs[1].height;\r\n } else {\r\n return;\r\n }\r\n\r\n let bfact = 1; // baseHeight / params.baseOme.sizeY;\r\n let tfact = 1;\r\n let translateScale = targetHeight / params.ome.sizeY; //baseHeight / params.baseOme.sizeY;\r\n\r\n let m = calculateAffineTransformation(\r\n params.pointBase,\r\n params.pointShift,\r\n bfact,\r\n tfact\r\n );\r\n let hMat = [\r\n m[0][0],\r\n m[0][1],\r\n m[0][2],\r\n m[1][0],\r\n m[1][1],\r\n m[1][2],\r\n m[2][0],\r\n m[2][1],\r\n m[2][2],\r\n ];\r\n params.callback(hMat, translateScale);\r\n }\r\n };\r\n}\r\n\r\nexport function calculateTransformationMatrix(\r\n pointBase,\r\n pointShift,\r\n ome,\r\n baseId,\r\n targetId,\r\n baseOme,\r\n callback\r\n) {\r\n let ids = [baseId, targetId];\r\n let counter = 0;\r\n let imgs = [];\r\n let params = {\r\n counter,\r\n imgs,\r\n pointBase,\r\n pointShift,\r\n ome,\r\n baseOme,\r\n callback,\r\n baseId,\r\n };\r\n for (let i = 0; i < ids.length; i++) {\r\n let img = new Image();\r\n img.src = Backend.renderRegion({\r\n id: ids[i],\r\n page: 0,\r\n lv: 0,\r\n x: 0,\r\n y: 0,\r\n });\r\n calcOnloading(params, img);\r\n }\r\n}\r\n\r\nfunction onloading(p, i, j, visImg) {\r\n visImg.onload = () => {\r\n p.counter += 1;\r\n p.imgs.push(visImg);\r\n p.pos.push([j - p.xStart, i - p.yStart]);\r\n if (p.counter === p.tilesToLoad) {\r\n p.callback(p.imgs, p.pos);\r\n }\r\n };\r\n}\r\n\r\nfunction tileLoader(params) {\r\n for (let i = params.yStart; i <= params.yEnd; i++) {\r\n for (let j = params.xStart; j <= params.xEnd; j++) {\r\n let visImg = new Image();\r\n visImg.src = Backend.renderRegion({\r\n id: params.fileId,\r\n page: params.page,\r\n lv: params.lv,\r\n x: j,\r\n y: i,\r\n });\r\n onloading(params, i, j, visImg);\r\n }\r\n }\r\n}\r\n\r\nfunction transformPoint(x, y, m) {\r\n let a = m[0][0] * x + m[0][1] * y + m[0][2];\r\n let b = m[1][0] * x + m[1][1] * y + m[1][2];\r\n let c = m[2][0] * x + m[2][1] * y + m[2][2];\r\n if (c !== 1) {\r\n console.log(\"transformation error\");\r\n }\r\n let resultX = a / c;\r\n let resultY = b / c;\r\n return [resultX, resultY];\r\n}\r\n\r\nexport function tileRegistration(\r\n img,\r\n tileId,\r\n hMat,\r\n fact,\r\n channel,\r\n callbackPushImage\r\n) {\r\n let cv = window.cv;\r\n let splited = tileId.split(\",\");\r\n let page = parseInt(splited[0]);\r\n let lv = parseInt(splited[1]);\r\n let x = parseInt(splited[2]);\r\n let y = parseInt(splited[3]);\r\n let fileId = splited[4];\r\n let maxTile = Math.pow(2, lv);\r\n //let strin = \"-\" + page + \",\" + lv + \",\" + x + \",\" + y + \"-\";\r\n let m = [\r\n [hMat[0], hMat[1], hMat[2] * fact],\r\n [hMat[3], hMat[4], hMat[5] * fact],\r\n [hMat[6], hMat[7], hMat[8]],\r\n ];\r\n\r\n let iM = inv(m);\r\n let s = [\r\n [maxTile, 0, 0],\r\n [0, maxTile, 0],\r\n [0, 0, 1],\r\n ];\r\n m = multiply(multiply(s, m), inv(s));\r\n iM = inv(m);\r\n\r\n //get tile coordinates\r\n let tileWidth = img.width;\r\n let tileHeight = img.height;\r\n let xPosition = (x + 1) * tileWidth;\r\n let yPosition = (y + 1) * tileHeight;\r\n\r\n let pointTL = [xPosition - tileWidth, yPosition - tileHeight];\r\n let pointTR = [xPosition, yPosition - tileHeight];\r\n let pointBL = [xPosition - tileWidth, yPosition];\r\n let pointBR = [xPosition, yPosition];\r\n\r\n //reverse transfrom the tile coordinates\r\n let invPointTL = transformPoint(pointTL[0], pointTL[1], iM);\r\n let invPointTR = transformPoint(pointTR[0], pointTR[1], iM);\r\n let invPointBL = transformPoint(pointBL[0], pointBL[1], iM);\r\n let invPointBR = transformPoint(pointBR[0], pointBR[1], iM);\r\n\r\n //create rectangle around transformed coordinates\r\n let minX = Math.min(\r\n invPointTL[0],\r\n invPointTR[0],\r\n invPointBL[0],\r\n invPointBR[0]\r\n );\r\n let minY = Math.min(\r\n invPointTL[1],\r\n invPointTR[1],\r\n invPointBL[1],\r\n invPointBR[1]\r\n );\r\n let maxX = Math.max(\r\n invPointTL[0],\r\n invPointTR[0],\r\n invPointBL[0],\r\n invPointBR[0]\r\n );\r\n let maxY = Math.max(\r\n invPointTL[1],\r\n invPointTR[1],\r\n invPointBL[1],\r\n invPointBR[1]\r\n );\r\n\r\n let rectPointTL = [minX, minY];\r\n let rectPointBR = [maxX, maxY];\r\n let rectWidth = Math.abs(maxX - minX);\r\n let rectHeight = Math.abs(maxY - minY);\r\n\r\n //create mats and use them to calc needed transformation matrix\r\n let OriginRectPointTL = [\r\n invPointTL[0] - rectPointTL[0],\r\n invPointTL[1] - rectPointTL[1],\r\n ];\r\n let OriginRectPointTR = [\r\n invPointTR[0] - rectPointTL[0],\r\n invPointTR[1] - rectPointTL[1],\r\n ];\r\n let OriginRectPointBL = [\r\n invPointBL[0] - rectPointTL[0],\r\n invPointBL[1] - rectPointTL[1],\r\n ];\r\n let OriginRectPointBR = [\r\n invPointBR[0] - rectPointTL[0],\r\n invPointBR[1] - rectPointTL[1],\r\n ];\r\n\r\n let matSource = [\r\n OriginRectPointTL[0],\r\n OriginRectPointTL[1],\r\n OriginRectPointTR[0],\r\n OriginRectPointTR[1],\r\n OriginRectPointBL[0],\r\n OriginRectPointBL[1],\r\n OriginRectPointBR[0],\r\n OriginRectPointBR[1],\r\n ];\r\n\r\n matSource = cv.matFromArray(4, 1, cv.CV_32FC2, matSource);\r\n let matTarget = [0, 0, tileWidth, 0, 0, tileHeight, tileWidth, tileHeight];\r\n matTarget = cv.matFromArray(4, 1, cv.CV_32FC2, matTarget);\r\n let newMat = cv.getPerspectiveTransform(matSource, matTarget);\r\n\r\n //calculate wich tiles need to be loaded for complete information\r\n let xStart = x;\r\n let yStart = y;\r\n let xEnd = x;\r\n let yEnd = y;\r\n if (rectPointTL[0] < pointTL[0] && pointTL[0] !== 0) {\r\n let diff = pointTL[0] - rectPointTL[0];\r\n diff = diff / tileWidth;\r\n xStart = xStart - (Math.trunc(diff) + 1);\r\n if (xStart < 0) xStart = 0;\r\n }\r\n if (rectPointBR[0] > pointBR[0]) {\r\n let diff = rectPointBR[0] - pointBR[0];\r\n diff = diff / tileWidth;\r\n xEnd = xEnd + (Math.trunc(diff) + 1);\r\n if (xEnd > maxTile - 1) xEnd = maxTile - 1;\r\n }\r\n if (rectPointTL[1] < pointTL[1] && pointTL[1] !== 0) {\r\n let diff = pointTL[1] - rectPointTL[1];\r\n diff = diff / tileHeight;\r\n yStart = yStart - (Math.trunc(diff) + 1);\r\n if (yStart < 0) yStart = 0;\r\n }\r\n if (rectPointBR[1] > pointBR[1]) {\r\n let diff = rectPointBR[1] - pointBR[1];\r\n diff = diff / tileHeight;\r\n yEnd = yEnd + (Math.trunc(diff) + 1);\r\n if (yEnd > maxTile - 1) yEnd = maxTile - 1;\r\n }\r\n\r\n //create offline canvas\r\n let offScrCan = document.createElement(\"canvas\");\r\n offScrCan.width = (xEnd - xStart + 1) * tileWidth;\r\n offScrCan.height = (yEnd - yStart + 1) * tileHeight;\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n\r\n //adjust canvas size\r\n if (rectPointTL[0] - pointTL[0] < 0) {\r\n offScrCan.width = offScrCan.width + Math.abs(rectPointTL[0] - pointTL[0]);\r\n offsetX = Math.abs(rectPointTL[0] - pointTL[0]);\r\n }\r\n if (rectPointBR[0] - pointBR[0] > (xEnd - xStart + 1) * tileWidth) {\r\n offScrCan.width = offScrCan.width + Math.abs(rectPointBR[0] - pointBR[0]);\r\n }\r\n if (rectPointTL[1] - pointTL[1] < 0) {\r\n offScrCan.height = offScrCan.height + Math.abs(rectPointTL[1] - pointTL[1]);\r\n offsetY = Math.abs(rectPointTL[1] - pointTL[1]);\r\n }\r\n if (rectPointBR[1] - pointBR[1] > (yEnd - yStart + 1) * tileHeight) {\r\n offScrCan.height = offScrCan.height + Math.abs(rectPointBR[1] - pointBR[1]);\r\n }\r\n\r\n let ctx = offScrCan.getContext(\"2d\");\r\n //load the tiles wich will be later drawn into offline canvas\r\n let imgs = [];\r\n let pos = [];\r\n let counter = 0;\r\n let tilesToLoad = (yEnd - yStart + 1) * (xEnd - xStart + 1);\r\n //tileloaderparams\r\n let tileLoaderParams = {\r\n yStart,\r\n yEnd,\r\n xStart,\r\n xEnd,\r\n fileId,\r\n page,\r\n lv,\r\n tilesToLoad,\r\n counter,\r\n imgs,\r\n pos,\r\n callback: (imgs, pos) => {\r\n if (imgs.length === pos.length) {\r\n for (let i = 0; i < imgs.length; i++) {\r\n let p = pos[i];\r\n ctx.drawImage(\r\n imgs[i],\r\n p[0] * tileWidth + offsetX,\r\n p[1] * tileHeight + offsetY,\r\n tileWidth,\r\n tileHeight\r\n );\r\n }\r\n } else {\r\n console.log(\"RETURN ERROR\");\r\n return;\r\n }\r\n //create rectangle with information from offline canvas\r\n let imgData = ctx.getImageData(\r\n rectPointTL[0] - xStart * tileWidth + offsetX,\r\n rectPointTL[1] - yStart * tileHeight + offsetY,\r\n rectWidth,\r\n rectHeight\r\n );\r\n //transform the rectangle\r\n let src = cv.matFromImageData(imgData);\r\n let dst = new cv.Mat();\r\n let dsize = new cv.Size(tileWidth, tileHeight);\r\n cv.warpPerspective(\r\n src,\r\n dst,\r\n newMat,\r\n dsize,\r\n cv.INTER_NEAREST,\r\n cv.BORDER_REPLICATE\r\n );\r\n\r\n let newImgData = new ImageData(\r\n new Uint8ClampedArray(dst.data),\r\n dst.cols,\r\n dst.rows\r\n );\r\n //create new canvas in tile size and draw transformation result into it\r\n let offTileCan = document.createElement(\"canvas\");\r\n offTileCan.width = tileWidth;\r\n offTileCan.height = tileHeight;\r\n let ctxTile = offTileCan.getContext(\"2d\");\r\n ctxTile.putImageData(newImgData, 0, 0);\r\n //console.log(\"REGISTERED\", page, lv, x, y, fileId);\r\n // ctxTile.font = \"100px Arial\";\r\n // ctxTile.fillStyle = \"red\";\r\n // ctxTile.textAlign = \"center\";\r\n // ctxTile.fillText(\r\n // strin,\r\n // parseInt(tileWidth / 2),\r\n // parseInt(tileHeight / 2)\r\n // );\r\n offTileCan = configureImage(offTileCan, channel);\r\n\r\n callbackPushImage(offTileCan);\r\n },\r\n };\r\n tileLoader(tileLoaderParams);\r\n}\r\n\r\n// function autoRegistration(\r\n// pointBase,\r\n// pointShift,\r\n// ome,\r\n// fileId,\r\n// activeFileId,\r\n// splitIds,\r\n// callback\r\n// ) {\r\n// //fileIdBase, fileIdShift\r\n// let cv = window.cv;\r\n// let idBase = fileId;\r\n// let idShift = fileId;\r\n// if (fileId !== activeFileId) {\r\n// idBase = activeFileId;\r\n// idShift = fileId;\r\n// } else {\r\n// idBase = splitIds[0];\r\n// idShift = splitIds[1];\r\n// }\r\n\r\n// // let ids = [fileIdBase, fileIdShift];\r\n// let ids = [idBase, idShift];\r\n// let counter = 0;\r\n// let imgs = [];\r\n\r\n// for (let i = 0; i < ids.length; i++) {\r\n// let img = new Image();\r\n// img.src = Backend.renderRegion({\r\n// id: ids[i],\r\n// page: 0,\r\n// lv: 0,\r\n// x: 0,\r\n// y: 0,\r\n// });\r\n// img.onload = () => {\r\n// counter += 1;\r\n// imgs.push(img);\r\n// if (counter === 2) {\r\n// console.log(\"Images loaded\");\r\n// // let factor = 2;\r\n// // //alot of code just to get imgs as mats\r\n\r\n// // //Image Base\r\n// // let offScrnBase = document.createElement(\"canvas\");\r\n// // offScrnBase.width = imgs[0].width;\r\n// // offScrnBase.height = imgs[0].height;\r\n// // let ctxBase = offScrnBase.getContext(\"2d\");\r\n// // ctxBase.drawImage(imgs[0], 0, 0, offScrnBase.width, offScrnBase.height);\r\n// // let imgDataBase = ctxBase.getImageData(\r\n// // 0,\r\n// // 0,\r\n// // offScrnBase.width,\r\n// // offScrnBase.height\r\n// // );\r\n// // let srcBase = cv.matFromImageData(imgDataBase);\r\n\r\n// // //Image Shift\r\n// // let offScrnShift = document.createElement(\"canvas\");\r\n// // offScrnShift.width = imgs[1].width;\r\n// // offScrnShift.height = imgs[1].height;\r\n\r\n// // let ctxShift = offScrnShift.getContext(\"2d\");\r\n// // ctxShift.drawImage(\r\n// // imgs[1],\r\n// // 0,\r\n// // 0,\r\n// // offScrnShift.width,\r\n// // offScrnShift.height\r\n// // );\r\n// // let imgDataShift = ctxShift.getImageData(\r\n// // 0,\r\n// // 0,\r\n// // offScrnShift.width,\r\n// // offScrnShift.height\r\n// // );\r\n// // let srcShift = cv.matFromImageData(imgDataShift);\r\n\r\n// // //now we have imgs as mats\r\n\r\n// // // convert 2 grayscale\r\n// // let imgBaseGray = new cv.Mat();\r\n// // let imgShiftGray = new cv.Mat();\r\n// // cv.cvtColor(srcBase, imgBaseGray, cv.COLOR_BGRA2GRAY);\r\n// // cv.cvtColor(srcShift, imgShiftGray, cv.COLOR_BGRA2GRAY);\r\n\r\n// // //resize images\r\n// // let shiftShrinkWidth = parseInt(offScrnShift.width / factor);\r\n// // let shiftShrinkHeight = parseInt(offScrnShift.height / factor);\r\n// // let imgBaseGrayShrink = new cv.Mat();\r\n// // let imgShiftGrayShrink = new cv.Mat();\r\n// // cv.resize(\r\n// // imgBaseGray,\r\n// // imgBaseGrayShrink,\r\n// // new cv.Size(\r\n// // parseInt(offScrnBase.width / factor),\r\n// // parseInt(offScrnBase.height / factor)\r\n// // ),\r\n// // cv.INTER_NEAREST\r\n// // );\r\n// // cv.resize(\r\n// // imgShiftGray,\r\n// // imgShiftGrayShrink,\r\n// // new cv.Size(shiftShrinkWidth, shiftShrinkHeight),\r\n// // cv.INTER_NEAREST\r\n// // );\r\n\r\n// // //Feature detection and matrix creation\r\n// // var t0 = performance.now();\r\n\r\n// // let kp1 = new cv.KeyPointVector();\r\n// // let kp2 = new cv.KeyPointVector();\r\n// // let dscrpt1 = new cv.Mat();\r\n// // let dscrpt2 = new cv.Mat();\r\n// // let orb = new cv.ORB(5000);\r\n\r\n// // orb.detectAndCompute(imgBaseGrayShrink, new cv.Mat(), kp1, dscrpt1);\r\n// // orb.detectAndCompute(imgShiftGrayShrink, new cv.Mat(), kp2, dscrpt2);\r\n\r\n// // let goodMatches = new cv.DMatchVector();\r\n// // let matcher = new cv.BFMatcher(cv.NORM_HAMMING, true);\r\n// // let matches = new cv.DMatchVector();\r\n\r\n// // matcher.match(dscrpt1, dscrpt2, matches);\r\n\r\n// // //let qualityCounter = 0;\r\n// // // for (let i = 0; i < matches.size(); i++) {\r\n// // // if (matches.get(i).distance < 45) {\r\n// // // qualityCounter += 1;\r\n// // // goodMatches.push_back(matches.get(i));\r\n// // // }\r\n// // // }\r\n// // // while (goodMatches.size() < matches.size() * 0.9) {\r\n// // // for (let i = 0; i < matches.size(); i++) {\r\n// // // if (matches.get(i).distance < cntr) {\r\n// // // goodMatches.push_back(matches.get(i));\r\n// // // }\r\n// // // }\r\n// // // cntr += 10;\r\n// // // }\r\n// // // top 90%\r\n// // // let arr = [];\r\n// // // for (let i = 0; i < matches.size(); i++) {\r\n// // // arr.push([i, matches.get(i).distance]);\r\n// // // }\r\n// // // arr.sort((a, b) => {\r\n// // // if (a[1] === b[1]) {\r\n// // // return 0;\r\n// // // } else {\r\n// // // return a[1] < b[1] ? -1 : 1;\r\n// // // }\r\n// // // });\r\n\r\n// // // for (let i = 0; i < matches.size() * 0.9; i++) {\r\n// // // goodMatches.push_back(matches.get(arr[i][0]));\r\n// // // }\r\n\r\n// // let points1 = [];\r\n// // let points2 = [];\r\n// // for (let i = 0; i < goodMatches.size(); i++) {\r\n// // points1.push(kp1.get(goodMatches.get(i).queryIdx).pt.x);\r\n// // points1.push(kp1.get(goodMatches.get(i).queryIdx).pt.y);\r\n// // points2.push(kp2.get(goodMatches.get(i).trainIdx).pt.x);\r\n// // points2.push(kp2.get(goodMatches.get(i).trainIdx).pt.y);\r\n// // }\r\n// // var mat1 = new cv.Mat(points1.length, 1, cv.CV_32FC2);\r\n// // mat1.data32F.set(points1);\r\n// // var mat2 = new cv.Mat(points2.length, 1, cv.CV_32FC2);\r\n// // mat2.data32F.set(points2);\r\n\r\n// // let h = cv.findHomography(mat2, mat1, cv.RANSAC);\r\n\r\n// // //get warped Image for comparison\r\n// // let dst = new cv.Mat();\r\n// // let dsize = new cv.Size(shiftShrinkWidth, shiftShrinkHeight);\r\n// // cv.warpPerspective(srcShift, dst, h, dsize);\r\n\r\n// // //check mif result is good\r\n// // let kp1Check = new cv.KeyPointVector();\r\n// // let kp2Check = new cv.KeyPointVector();\r\n// // let dscrpt1Check = new cv.Mat();\r\n// // let dscrpt2Check = new cv.Mat();\r\n// // let orbCheck = new cv.ORB(5000);\r\n\r\n// // orbCheck.detectAndCompute(\r\n// // imgBaseGrayShrink,\r\n// // new cv.Mat(),\r\n// // kp1Check,\r\n// // dscrpt1Check\r\n// // );\r\n// // orbCheck.detectAndCompute(dst, new cv.Mat(), kp2Check, dscrpt2Check);\r\n\r\n// // //let goodMatchesCheck = new cv.DMatchVector();\r\n// // let matcherCheck = new cv.BFMatcher(cv.NORM_HAMMING, true);\r\n// // let matchesCheck = new cv.DMatchVector();\r\n\r\n// // matcherCheck.match(dscrpt1Check, dscrpt2Check, matchesCheck);\r\n\r\n// // // let qualityCounterCheck = 0;\r\n// // // for (let i = 0; i < matchesCheck.size(); i++) {\r\n// // // if (matchesCheck.get(i).distance < 20) {\r\n// // // qualityCounterCheck += 1;\r\n// // // }\r\n// // // }\r\n// // if (matchesCheck.size() < matches.size() * 0.4) {\r\n// // console.log(\"probably failed\");\r\n// // }\r\n\r\n// // /*\r\n// // warp\r\n// // diff = newImgData imgDataBase\r\n// // if diff > x\r\n// // do it again\r\n// // parameterset [0,1,2,3,4...]\r\n// // if still\r\n// // return \"automatic reg not suitable\"\r\n\r\n// // */\r\n\r\n// // var t1 = performance.now();\r\n// // console.log(\"Exec Time \" + (t1 - t0) / 1000 + \" seconds.\");\r\n\r\n// // let m = [\r\n// // [h.data64F[0], h.data64F[1], h.data64F[2]],\r\n// // [h.data64F[3], h.data64F[4], h.data64F[5]],\r\n// // [h.data64F[6], h.data64F[7], h.data64F[8]],\r\n// // ];\r\n// // let s = [\r\n// // [factor, 0, 0],\r\n// // [0, factor, 0],\r\n// // [0, 0, 1],\r\n// // ];\r\n// // m = multiply(multiply(s, m), inv(s));\r\n// let m = calculateAffineTransformation(pointBase, pointShift, ome);\r\n// let hMat = [\r\n// m[0][0],\r\n// m[0][1],\r\n// m[0][2],\r\n// m[1][0],\r\n// m[1][1],\r\n// m[1][2],\r\n// m[2][0],\r\n// m[2][1],\r\n// m[2][2],\r\n// ];\r\n// callback(hMat);\r\n// }\r\n// };\r\n// }\r\n// }\r\n\r\nexport function colorInImage(img, channel) {\r\n if (!img || img.width === 0) {\r\n return null;\r\n }\r\n\r\n let offScrCan = document.createElement(\"canvas\");\r\n offScrCan.width = img.width;\r\n offScrCan.height = img.height;\r\n\r\n let ctx1 = offScrCan.getContext(\"2d\");\r\n\r\n ctx1.drawImage(img, 0, 0, img.width, img.height);\r\n\r\n // do histogram manipulation\r\n if (img.width === 0) return null;\r\n let imgData = ctx1.getImageData(0, 0, img.width, img.height);\r\n let step = 4; // rgba\r\n let min = channel.min;\r\n let max = channel.max;\r\n let gamma = channel.gamma;\r\n const maxPixelValue = 255;\r\n let rgb = false;\r\n\r\n //let rgb = true;\r\n for (let i = 0, n = imgData.data.length; i < n; i += step) {\r\n let val = imgData.data[i];\r\n // let val = imgData.data[i + (step - 1)];\r\n // if (val < maxPixelValue) rgb = false;\r\n\r\n val = (Math.min(Math.max(val - min, 0), max) * maxPixelValue) / (max - min);\r\n imgData.data[i + (step - 1)] =\r\n maxPixelValue * (val / maxPixelValue) ** (1 / gamma);\r\n }\r\n\r\n ctx1.putImageData(imgData, 0, 0);\r\n\r\n if (channel.type !== \"brightfield\" && !rgb) {\r\n // color in alpha channel\r\n ctx1.globalCompositeOperation = \"source-in\";\r\n ctx1.fillStyle = channel.color;\r\n ctx1.fillRect(0, 0, img.width, img.height);\r\n }\r\n return offScrCan;\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport Draggable from \"react-draggable\";\r\n\r\nconst maxScaleWidth = 200;\r\nconst maxScaleBarWidth = maxScaleWidth * 1.5;\r\nconst scaleUnitLabels = [\"km\", \"m\", \"mm\", \"µm\", \"nm\", \"pm\", \"fm\", \"am\", \"zm\"];\r\nconst scaleUnits = [3, 1, -3, -6, -9, -12, -15, -18, -21];\r\n\r\nconst styles = {\r\n root: {\r\n width: maxScaleBarWidth,\r\n height: 30,\r\n\r\n position: \"absolute\",\r\n bottom: 4,\r\n right: 6,\r\n color: \"#ffffff\",\r\n\r\n textAlign: \"center\",\r\n padding: 4,\r\n cursor: \"grab\",\r\n },\r\n};\r\n\r\n/**\r\n * computing data to let renderer render the scalebar as a canvas element, so it can be printed with screenshot tool\r\n */\r\nclass ScaleBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n grabbing: false,\r\n x: 0,\r\n y: 0,\r\n newWidth: 0,\r\n };\r\n }\r\n\r\n componentDidUpdate() {\r\n const { ome, zoom } = this.props;\r\n let scalebarMeters = ome.physicalSizeX * (maxScaleWidth / zoom);\r\n\r\n // hide if no scale information is given\r\n if (!ome.physicalSizeX) return null;\r\n\r\n let exponent = parseFloat(scalebarMeters.toExponential().split(\"e\")[1]);\r\n\r\n // find best fitting exponennt\r\n let unitExponent = 1;\r\n let unitExponentIndex = 1;\r\n for (\r\n unitExponentIndex = 0;\r\n unitExponentIndex < scaleUnits.length;\r\n unitExponentIndex++\r\n ) {\r\n if (scaleUnits[unitExponentIndex] <= exponent) {\r\n unitExponent = scaleUnits[unitExponentIndex];\r\n break;\r\n }\r\n }\r\n\r\n let mantissa = scalebarMeters / Math.pow(10, unitExponent);\r\n\r\n let roundedMantissa = mantissa;\r\n if (mantissa < 1.5) {\r\n roundedMantissa = 1;\r\n } else if (mantissa < 3.5) {\r\n roundedMantissa = 2;\r\n } else if (mantissa < 7.5) {\r\n roundedMantissa = 5;\r\n } else if (mantissa < 15) {\r\n roundedMantissa = 10;\r\n } else if (mantissa < 35) {\r\n roundedMantissa = 20;\r\n } else if (mantissa < 75) {\r\n roundedMantissa = 50;\r\n } else if (mantissa < 150) {\r\n roundedMantissa = 100;\r\n } else if (mantissa < 350) {\r\n roundedMantissa = 200;\r\n } else if (mantissa < 750) {\r\n roundedMantissa = 500;\r\n } else {\r\n roundedMantissa = 1;\r\n unitExponentIndex--;\r\n unitExponent = scaleUnits[unitExponentIndex];\r\n mantissa = scalebarMeters / Math.pow(10, unitExponent);\r\n }\r\n\r\n // round finer without skipped steps\r\n // if (mantissa < 10) {\r\n // roundedMantissa = Math.floor(mantissa / 1) * 1;\r\n // } else if (mantissa < 100) {\r\n // roundedMantissa = Math.floor(mantissa / 10) * 10;\r\n // } else if (mantissa < 1000) {\r\n // roundedMantissa = Math.floor(mantissa / 100) * 100;\r\n // }\r\n\r\n let newWidth = (maxScaleWidth * roundedMantissa) / mantissa;\r\n\r\n const fluorescence = ome.channels[0].type !== \"brightfield\";\r\n //console.log(\"setting scaleBarData1\");\r\n this.props.setScaleBarData({\r\n x: this.state.x,\r\n y: this.state.y,\r\n width: newWidth,\r\n label: roundedMantissa + \" \" + scaleUnitLabels[unitExponentIndex],\r\n color: fluorescence ? \"#fff\" : \"#000\",\r\n maxScaleWidth: maxScaleBarWidth,\r\n });\r\n }\r\n\r\n render() {\r\n const { classes, setScaleBarData } = this.props;\r\n const { grabbing } = this.state;\r\n\r\n return (\r\n {\r\n this.parentObj = e.target.offsetParent.getBoundingClientRect();\r\n this.setState({ grabbing: true });\r\n }}\r\n onStop={() => this.setState({ grabbing: false })}\r\n onDrag={(e) => {\r\n let rect = e.target.getBoundingClientRect();\r\n if (this.parentObj.right !== rect.right) {\r\n this.setState({\r\n x: rect.right - this.parentObj.right,\r\n y: rect.bottom - this.parentObj.bottom,\r\n });\r\n }\r\n }}\r\n >\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nScaleBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n ome: PropTypes.object,\r\n zoom: PropTypes.number,\r\n pointerEvents: PropTypes.bool,\r\n setScaleBarData: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(ScaleBar);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n// define the component's styling\r\nconst styles = () => ({\r\n root: {\r\n height: 300,\r\n width: 50,\r\n position: \"absolute\",\r\n bottom: 50,\r\n right: 5,\r\n opacity: 0.8,\r\n },\r\n verticalBar: {\r\n position: \"absolute\",\r\n top: -15,\r\n left: \"50%\",\r\n marginLeft: -2,\r\n width: 4,\r\n height: \"100%\",\r\n background: \"#0673C1\",\r\n },\r\n fab: {\r\n position: \"absolute\",\r\n marginTop: -15,\r\n marginLeft: -15,\r\n left: \"50%\",\r\n width: 30,\r\n height: 30,\r\n background: \"white\",\r\n color: \"#0673C1\",\r\n border: \"2px solid #0673C1\",\r\n borderRadius: \"50%\",\r\n fontSize: \"12px\",\r\n fontWeight: \"bold\",\r\n lineHeight: \"25px\",\r\n textAlign: \"center\",\r\n cursor: \"pointer\",\r\n },\r\n});\r\nconst marks = [\r\n {\r\n value: 100,\r\n level: 40,\r\n },\r\n {\r\n value: 75,\r\n level: 20,\r\n },\r\n {\r\n value: 50,\r\n level: 10,\r\n },\r\n {\r\n value: 30,\r\n level: 4,\r\n },\r\n {\r\n value: 15,\r\n level: 2,\r\n },\r\n {\r\n value: 0,\r\n level: 1,\r\n },\r\n];\r\n\r\nclass ZoomBar extends Component {\r\n isSelected = (idx) => {\r\n let zoom = this.props.zoom;\r\n let result = marks.length - 1;\r\n let max = 0;\r\n for (let i = 0; i < marks.length; i++) {\r\n let mark = marks[i];\r\n if (mark.level <= zoom && mark.level >= max) {\r\n max = mark.level;\r\n result = i;\r\n }\r\n }\r\n return result === idx;\r\n };\r\n\r\n render() {\r\n const { classes, zoom, clickable } = this.props;\r\n return (\r\n \r\n \r\n
\r\n\r\n {marks.map((mark, idx) => {\r\n return (\r\n
\r\n this.props.changeValue(mark.level)}\r\n >\r\n {(this.isSelected(idx) ? Math.round(zoom) : mark.level) + \"x\"}\r\n
\r\n
\r\n );\r\n })}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nZoomBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n zoom: PropTypes.number,\r\n clickable: PropTypes.bool,\r\n changeValue: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(ZoomBar);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport withTheme from \"@mui/styles/withTheme\";\r\n\r\nimport DragIndicator from \"@mui/icons-material/DragIndicator\";\r\nimport Draggable from \"react-draggable\";\r\nimport { Resizable } from \"react-resizable\";\r\n\r\nimport {\r\n List,\r\n ListItem,\r\n ListItemText,\r\n Typography,\r\n IconButton,\r\n} from \"@mui/material\";\r\n\r\nimport { Remove, PlayArrow } from \"@mui/icons-material\";\r\n\r\nimport { getParentIndexLayer } from \"../utils/StructuresUtils\";\r\n\r\nconst styles = {\r\n root: {\r\n position: \"absolute\",\r\n top: 76,\r\n left: 5,\r\n height: 400,\r\n width: 500,\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n opacity: 0.8,\r\n backgroundColor: \"#000000\",\r\n color: \"#ffffff\",\r\n },\r\n dragIndicator: {\r\n color: \"#fff\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 0,\r\n cursor: \"grab\",\r\n },\r\n grabbing: {\r\n cursor: \"grabbing\",\r\n },\r\n resizableContainer: {\r\n \"& .react-resizable-handle\": {\r\n pointerEvents: \"all\",\r\n },\r\n \"& .react-resizable-handle-se::before\": {\r\n content: \"''\",\r\n display: \"block\",\r\n position: \"absolute\",\r\n bottom: 3,\r\n right: 3,\r\n width: 6,\r\n height: 6,\r\n borderBottom: \"1px solid #fff\",\r\n borderRight: \"1px solid #fff\",\r\n },\r\n },\r\n};\r\n\r\nclass ResultTable extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n grabbing: false,\r\n tableSize: {\r\n width: 500,\r\n height: 499,\r\n },\r\n structuredTableValues: props.structures.map((structure) => {\r\n return {\r\n label: structure.label,\r\n id: structure.id,\r\n percentage: 0,\r\n numberObjects: 0,\r\n };\r\n }),\r\n };\r\n\r\n window.updateResultTable = this.updateResultTable;\r\n }\r\n\r\n componentDidMount = () => {\r\n this.updateResultTable();\r\n };\r\n\r\n updateResultTable = () => {\r\n const { structures } = this.props;\r\n let stateObject = [];\r\n structures.forEach((structure) => {\r\n let percentageNumber = this.getPercentageAndNumber(structure);\r\n let obj = {\r\n label: structure.label,\r\n id: structure.id,\r\n percentage: percentageNumber.percentage,\r\n numberObjects: percentageNumber.numberObjects,\r\n };\r\n stateObject.push(obj);\r\n });\r\n this.setState({ structuredTableValues: stateObject });\r\n };\r\n\r\n findChilds = (str) => {\r\n // return direct classification subtypes\r\n return this.props.structures.filter(\r\n (element) =>\r\n element.subtypeLevel === str.subtypeLevel + 1 &&\r\n element.parentId === str.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n findAllSubtypes = (structure) => {\r\n // get all subtypes of selectedLayer (also subsubtypes)\r\n\r\n // first get all direct childs\r\n let childs = this.findChilds(structure);\r\n let allChilds = [];\r\n\r\n // search for childs of childs until no childs are checked for childs\r\n while (childs.length !== 0) {\r\n // code block to be executed\r\n childs = childs.concat(this.findChilds(childs[0]));\r\n if (!allChilds.includes(childs[0]) && childs[0].classificationSubtype) {\r\n allChilds.push(childs[0]);\r\n }\r\n childs.shift();\r\n }\r\n return allChilds;\r\n };\r\n\r\n getPercentageAndNumber = (structure) => {\r\n const { allRoiLayers, fileId, structures } = this.props;\r\n\r\n let percNumb = { percentage: 0, numberObjects: 0 };\r\n\r\n // get number of all objects of structure\r\n let parentLayer = getParentIndexLayer(structure, structures);\r\n if (structure.classificationSubtype) {\r\n // for subtypes\r\n // get number of objects:\r\n\r\n // get all childNames to find rois\r\n let childIds = [];\r\n let childLabels = [];\r\n this.findAllSubtypes(structure).forEach((element) => {\r\n childIds.push(element.id);\r\n childLabels.push(element.label);\r\n });\r\n childIds.push(structure.id); // push current structure\r\n childLabels.push(structure.label); // push current structure\r\n\r\n percNumb.numberObjects = allRoiLayers[fileId][\r\n parentLayer\r\n ].layer.regionRois.filter(\r\n (element) => childIds.includes(element.structureId) /* ||\r\n childLabels.includes(element.subtypeName)*/\r\n ).length;\r\n\r\n // get percentage:\r\n // get number of parent objects\r\n let parentIdx = structures.findIndex(\r\n (element) => element.id === structure.parentId\r\n );\r\n\r\n let numberParentObjects = this.getPercentageAndNumber(\r\n structures[parentIdx]\r\n ).numberObjects;\r\n\r\n if (percNumb.numberObjects > 0 && numberParentObjects > 0) {\r\n percNumb.percentage = percNumb.numberObjects / numberParentObjects;\r\n } else {\r\n percNumb.percentage = 0;\r\n }\r\n } else {\r\n // for parent structures\r\n percNumb.numberObjects =\r\n allRoiLayers[fileId][parentLayer].layer.regionRois.length;\r\n percNumb.percentage = \"-\";\r\n }\r\n\r\n return percNumb;\r\n };\r\n\r\n renderIcon = (structure) => {\r\n if (structure.isSubtype) {\r\n return (\r\n \r\n {structure.classificationSubtype ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n }\r\n };\r\n\r\n renderRow = (structure, structureIdx) => {\r\n const { structures, selectedLayer } = this.props;\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n let childIds = childs.map((obj) => {\r\n return obj.id;\r\n });\r\n let isSelected =\r\n childIds.includes(structure.id) ||\r\n structure.id === structures[selectedLayer].id;\r\n\r\n return (\r\n \r\n {this.renderIcon(structures[structureIdx])}\r\n \r\n \r\n {structure.percentage === \"-\"\r\n ? \"\"\r\n : (structure.percentage * 100).toFixed(2) + \"%\"}\r\n \r\n \r\n {structure.numberObjects}\r\n \r\n \r\n );\r\n };\r\n\r\n onResize = (event, { size }) => {\r\n // resize element\r\n let minSizeWidth = 240;\r\n let minSizeHeight = 150;\r\n let maxSizeWidth = 600;\r\n let maxSizeHeight = 1200;\r\n size.width = size.width < minSizeWidth ? minSizeWidth : size.width;\r\n size.width = size.width > maxSizeWidth ? maxSizeWidth : size.width;\r\n size.height = size.height < minSizeHeight ? minSizeHeight : size.height;\r\n size.height = size.height > maxSizeHeight ? maxSizeHeight : size.height;\r\n\r\n this.setState({ tableSize: size });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { grabbing, structuredTableValues } = this.state;\r\n\r\n return (\r\n this.setState({ grabbing: true })}\r\n onStop={() => this.setState({ grabbing: false })}\r\n >\r\n \r\n (this.root = c)}\r\n className={classNames(classes.root, grabbing && classes.grabbing)}\r\n style={{\r\n height: this.state.tableSize.height,\r\n width: this.state.tableSize.width,\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n Percentage\r\n \r\n \r\n Objects\r\n \r\n \r\n {structuredTableValues.map((structure, index) =>\r\n this.renderRow(structure, index)\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nResultTable.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n structures: PropTypes.array,\r\n allRoiLayers: PropTypes.object,\r\n fileId: PropTypes.string,\r\n selectedLayer: PropTypes.number,\r\n};\r\n\r\nexport default withTheme(withStyles(styles)(ResultTable));\r\n","\r\n\r\nfunction getDist(pointA, pointB) {\r\n\tconst dx = pointA[0] - pointB[0];\r\n\tconst dy = pointA[1] - pointB[1];\r\n\treturn Math.sqrt(dx*dx + dy*dy);\r\n}\r\n\r\nfunction getCurveDistances(startIndex, points) {\r\n\tconst distAr = [];\r\n\tfor (let i = 0; i < points.length; i++) {\r\n\t\tconst indexA = (startIndex + i) % points.length;\r\n\t\tconst indexB = (startIndex + i + 1) % points.length;\r\n\t\tconst pointA = points[indexA];\r\n\t\tconst pointB = points[indexB];\r\n\t\tconst dist = getDist(pointA, pointB);\r\n\t\tdistAr.push(dist);\r\n\t}\r\n\treturn distAr;\r\n}\r\n\r\nfunction getStartInterpolPoint(distAr, absPlace) {\r\n\tlet accLen = 0;\r\n\tfor (let i = 0; i < distAr.length; i++) {\r\n\t\taccLen += distAr[i];\r\n\t\tif (absPlace <= accLen) {\r\n\t\t\treturn {\r\n\t\t\t\tdistIndex: i,\r\n\t\t\t\tabsPlaceDist: absPlace - (accLen - distAr[i]),\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n\treturn {\r\n\t\tdistIndex: distAr.length - 1,\r\n\t\tabsPlaceDist: distAr[distAr.length - 1],\r\n\t};\r\n}\r\n\r\nfunction getPointByPlaceInCurve(startIndex, points, place) {\r\n\tconst distAr = getCurveDistances(startIndex, points);\r\n\tconst distSum = distAr.reduce((a, b) => a + b, 0);\r\n\tconst absPlace = place * distSum;\r\n\tconst { distIndex, absPlaceDist } = getStartInterpolPoint(distAr, absPlace);\r\n\tconst indA = (startIndex + distIndex) % points.length;\r\n\tconst indB = (startIndex + distIndex + 1) % points.length;\r\n\tconst pA = points[indA];\r\n\tconst pB = points[indB];\r\n\tconst k = absPlaceDist / distAr[distIndex];\r\n\treturn [\r\n\t\tpA[0] + (pB[0] - pA[0]) * k,\r\n\t\tpA[1] + (pB[1] - pA[1]) * k,\r\n\t];\r\n}\r\n\r\n\r\nfunction linearInterpol(pStart, pEnd, tStart, tEnd, t) {\r\n const k = (t - tStart) / (tEnd - tStart);\r\n return [\r\n pStart[0] + (pEnd[0] - pStart[0]) * k,\r\n pStart[1] + (pEnd[1] - pStart[1]) * k,\r\n ]\r\n}\r\n\r\nexport function getFigure(figureA, figureB, startPointIndA, startPointIndB, \r\n\tfigAIsClockwise, figBIsClockwise, pointsCount, t1, t2, t) {\r\n if (t > t2) {\r\n t = t2;\r\n }\r\n if (t < t1) {\r\n t = t1;\r\n }\r\n const delta = 1/pointsCount;\r\n const figure = [];\r\n const clockwiseSignA = figAIsClockwise ? -1 : 1;\r\n const clockwiseSignB = figBIsClockwise ? -1 : 1;\r\n for (let xInd = 0; xInd < pointsCount; xInd++) {\r\n\tconst xAInd = (startPointIndA + clockwiseSignA * xInd + pointsCount) % pointsCount; \r\n\tconst xBInd = (startPointIndB + clockwiseSignB * xInd + pointsCount) % pointsCount; \r\n\tconst xA = xAInd * delta;\r\n\tconst xB = xBInd * delta;\r\n const pointFrom = getPointByPlaceInCurve(0, figureA, xA);\r\n const pointTo = getPointByPlaceInCurve(0, figureB, xB);\r\n const point = linearInterpol(pointFrom, pointTo, t1, t2, t);\r\n figure.push(point);\r\n }\r\n return figure;\r\n}\r\n\r\nexport function predictStartPointIndex(figure, pointsCount) {\r\n\tconst delta = 1/pointsCount;\r\n\t//const figure = [];\r\n\tlet xMin = Infinity;\r\n\tlet xMax = -Infinity;\r\n\tlet yMin = Infinity;\r\n\tlet yMax = -Infinity;\r\n\tfor (let pInd = 0; pInd < pointsCount; pInd++) {\r\n\t\tconst d = pInd * delta;\r\n\t\tconst p = getPointByPlaceInCurve(0, figure, d);\r\n\t\tif (p[0] < xMin) {\r\n\t\t\txMin = p[0];\r\n\t\t}\r\n\t\tif (p[0] > xMax) {\r\n\t\t\txMax = p[0];\r\n\t\t}\r\n\t\tif (p[1] < yMin) {\r\n\t\t\tyMin = p[1];\r\n\t\t}\r\n\t\tif (p[1] > yMax) {\r\n\t\t\tyMax = p[1];\r\n\t\t}\r\n\t}\r\n\r\n\tlet minDist = Infinity;\r\n\tlet startPointIndex = 0;\r\n\tconst anchorPoint = [(xMin + xMax) / 2, yMin];\r\n\tfor (let pInd = 0; pInd < pointsCount; pInd++) {\r\n\t\tconst d = pInd * delta;\r\n\t\tconst p = getPointByPlaceInCurve(0, figure, d);\r\n\t\tconst dist = getDist(anchorPoint, p);\r\n\t\tif (dist < minDist) {\r\n\t\t\tminDist = dist;\r\n\t\t\tstartPointIndex = pInd;\r\n\t\t}\r\n\t}\r\n\treturn startPointIndex;\r\n}\r\n\r\nfunction getVec(pointA, pointB) {\r\n\treturn [pointB[0] - pointA[0], pointB[1] - pointA[1]];\r\n}\r\n\r\nexport function traversalPolylineClockwise(fig) {\r\n\tlet a = theMostLeftPointIndex(fig);\r\n\tlet aNext = (a + 1) % fig.length;\r\n\tlet aPrev = (a - 1 + fig.length) % fig.length;\r\n\tconst vPrev = getVec(fig[a], fig[aPrev]);\r\n\tconst vNext = getVec(fig[a], fig[aNext]);\r\n\treturn vPrev[0] * vNext[1] - vPrev[1] * vNext[0] < 0;\r\n}\r\n\r\nfunction theMostLeftPointIndex(fig) {\r\n\tlet ind = 0;\r\n\tlet xMin = Infinity;\r\n\tfor (let i = 0; i < fig.length; i++) {\r\n\t\tif (fig[ind][0] < xMin) {\r\n\t\t\txMin = fig[ind][0];\r\n\t\t\tind = i;\r\n\t\t}\t\r\n\t}\t\r\n\treturn ind;\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = {\r\n root: {\r\n backgroundColor: \"transparent\",\r\n margin: \"20px 0px\",\r\n height: \"30px\",\r\n position: \"relative\",\r\n },\r\n\r\n keyFrame: {\r\n position: \"absolute\",\r\n backgroundColor: \"black\",\r\n borderRadius: \"100%\",\r\n },\r\n\r\n interval: {\r\n position: \"absolute\",\r\n },\r\n};\r\n\r\nclass TimeChart extends Component {\r\n render() {\r\n const {\r\n classes,\r\n structure,\r\n keyFrames,\r\n frameWidth,\r\n interpolatedIntervals,\r\n isSelected,\r\n } = this.props;\r\n const timeChartHeight = 30;\r\n const keyFrameElSize = 8; //Math.min(frameWidth, timeChartHeight) / 2;\r\n const keyFrameEls = [];\r\n for (let keyFrame in keyFrames) {\r\n keyFrameEls.push(\r\n \r\n );\r\n }\r\n\r\n const intervalEls = [];\r\n const intervalElHeight = 2;\r\n for (let interval of interpolatedIntervals) {\r\n intervalEls.push(\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {intervalEls}\r\n {keyFrameEls}\r\n \r\n );\r\n }\r\n}\r\n\r\nTimeChart.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n structure: PropTypes.object,\r\n keyFrames: PropTypes.object,\r\n interpolatedIntervals: PropTypes.array,\r\n frameWidth: PropTypes.number,\r\n isSelected: PropTypes.bool,\r\n};\r\n\r\nexport default withStyles(styles)(TimeChart);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { IconButton, TextField, Tooltip } from \"@mui/material\";\r\nimport {\r\n PlayCircleOutline,\r\n PauseCircleOutline,\r\n ArrowLeft,\r\n ArrowRight,\r\n} from \"@mui/icons-material\";\r\n\r\nimport {\r\n getFigure,\r\n predictStartPointIndex,\r\n traversalPolylineClockwise,\r\n} from \"../utils/GeometricInterpolation\";\r\nimport { RegionROI } from \"../utils/ROI\";\r\nimport RBush from \"rbush\";\r\n\r\nimport TimeChart from \"./TimeChart\";\r\n\r\nconst tongueWidth = 30;\r\n\r\nconst styles = {\r\n root: {\r\n padding: 0,\r\n },\r\n\r\n stepWalker: {\r\n backgroundColor: \"rgb(211,211,211)\",\r\n position: \"relative\",\r\n height: 50,\r\n },\r\n\r\n container: {\r\n position: \"relative\",\r\n // add scrolling, if needed\r\n overflow: \"auto\",\r\n boxShadow: \"0px -2px 10px 0px rgba(0,0,0,0.29)\",\r\n //border: \"2px solid rgb(0, 0, 200)\",\r\n height: \"calc(100% - 80px)\",\r\n background: \"white\",\r\n },\r\n\r\n stepLeft: {\r\n position: \"absolute\",\r\n left: 5,\r\n top: 6,\r\n padding: 0,\r\n color: \"rgb(6,115,193)\",\r\n },\r\n\r\n timeCounter: {\r\n textAlign: \"center\",\r\n color: \"rgb(6,115,193)\",\r\n },\r\n\r\n modePanel: {\r\n backgroundColor: \"rgb(211,211,211)\",\r\n position: \"relative\",\r\n boxShadow: \"0px -2px 10px 0px rgba(0,0,0,0.29)\",\r\n height: 30,\r\n },\r\n\r\n interpolate: {\r\n padding: 0,\r\n borderWidth: 0,\r\n outline: 0,\r\n display: \"inline-block\",\r\n position: \"relative\",\r\n textAlign: \"center\",\r\n left: 10,\r\n fontSize: 12 + \"px\",\r\n top: 2,\r\n color: \"rgb(6,115,193)\",\r\n height: 20,\r\n width: 100,\r\n \"&:hover\": {\r\n backgroundColor: \"#fff\",\r\n },\r\n },\r\n framerate: {\r\n marginLeft: 20,\r\n color: \"red\",\r\n width: 60,\r\n \"& div\": {\r\n color: \"black\",\r\n marginTop: 4,\r\n width: 52,\r\n },\r\n \"& label\": {\r\n color: \"rgb(6,115,193) !important\",\r\n fontSize: 10,\r\n lineHeight: \"12px\",\r\n padding: 0,\r\n margin: 0,\r\n },\r\n \"& input\": {\r\n padding: \"6px 0 0px\",\r\n fontSize: 12,\r\n },\r\n },\r\n\r\n playButtons: {\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n },\r\n\r\n playPauseForward: {\r\n marginLeft: 10,\r\n display: \"inline-block\",\r\n padding: 0,\r\n color: \"rgb(6,115,193)\",\r\n },\r\n\r\n playPauseBackward: {\r\n display: \"inline-block\",\r\n padding: 0,\r\n color: \"rgb(6,115,193)\",\r\n transform: \"scale(-1, 1)\",\r\n },\r\n\r\n stepRight: {\r\n position: \"absolute\",\r\n right: 5,\r\n top: 6,\r\n padding: 0,\r\n color: \"rgb(6,115,193)\",\r\n },\r\n\r\n resizeTongue: {\r\n backgroundColor: \"rgb(211,211,211)\",\r\n position: \"absolute\",\r\n height: 9,\r\n width: tongueWidth,\r\n marginLeft: -tongueWidth / 2,\r\n bottom: 0,\r\n left: \"50%\",\r\n boxShadow: \"0px -2px 10px -2px rgba(0,0,0,0.29)\",\r\n //boxShadow: \"1px -13px 19px 0px rgba(0,0,0,0.55)\",\r\n cursor: \"row-resize\",\r\n zIndex: 999999,\r\n },\r\n\r\n resizingLine: {\r\n backgroundColor: \"#888\",\r\n marginTop: 4,\r\n marginLeft: 4,\r\n marginRight: 4,\r\n height: 1,\r\n },\r\n};\r\n\r\nconst frameMinWidth = 14;\r\nconst frameMaxWidth = 28;\r\n\r\nclass TimeLineTool extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n dimensions: null,\r\n isResizing: false,\r\n resizePos: 0,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n document.addEventListener(\"mousemove\", this.handleResizeMouseMove);\r\n document.addEventListener(\"mouseup\", this.handleResizeMouseUp);\r\n this.setState({\r\n dimensions: {\r\n width: this.container.offsetWidth,\r\n height: this.container.offsetHeight,\r\n },\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n document.removeEventListener(\"mousemove\", this.handleResizeMouseMove);\r\n document.removeEventListener(\"mouseup\", this.handleResizeMouseUp);\r\n }\r\n\r\n setPosByMouse(coordX) {\r\n const { dimensions } = this.state;\r\n const { ome, onChangeT } = this.props;\r\n let frameWidth = Math.floor(dimensions.width / ome.sizeT);\r\n if (frameWidth < frameMinWidth) {\r\n frameWidth = frameMinWidth;\r\n }\r\n if (frameWidth > frameMaxWidth) {\r\n frameWidth = frameMaxWidth;\r\n }\r\n // rect with borders in context of client window of the browser\r\n const rect = this.innerContainer.getBoundingClientRect();\r\n let x = Math.floor(\r\n (coordX - rect.left - this.innerContainer.clientLeft) / frameWidth\r\n );\r\n if (x < 0) {\r\n // x is frame number\r\n x = 0;\r\n }\r\n if (x >= ome.sizeT) {\r\n x = ome.sizeT - 1;\r\n }\r\n\r\n onChangeT(x);\r\n }\r\n\r\n handleMouseDown = (ev) => {\r\n if (ev.button !== 0) {\r\n return;\r\n }\r\n this.setPosByMouse(ev.clientX);\r\n };\r\n\r\n handleMouseMove = (ev) => {\r\n if (!(ev.buttons & 1)) {\r\n return;\r\n }\r\n this.setPosByMouse(ev.clientX);\r\n };\r\n\r\n searchPrevKeyFrame(curT, structureIndex, frameArray) {\r\n for (let i = curT - 1; i >= 0; i--) {\r\n const layer = this.findLayer(structureIndex, frameArray[i]);\r\n if (layer && layer.isKeyFrame) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n searchNextKeyFrame(curT, structureIndex, frameArray) {\r\n for (let i = curT + 1; i < this.props.ome.sizeT; i++) {\r\n const layer = this.findLayer(structureIndex, frameArray[i]);\r\n if (layer && layer.isKeyFrame) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n findLayer(structureIndex, frameArrayItem) {\r\n if (!frameArrayItem || !this.props.structures[structureIndex]) {\r\n return null;\r\n }\r\n for (let layer of frameArrayItem) {\r\n if (layer.id === this.props.structures[structureIndex].id) {\r\n return layer;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n getOrCreateFrameArrayItem(frame) {\r\n if (this.props.frameArray[frame]) {\r\n return this.props.frameArray[frame];\r\n }\r\n this.props.frameArray[frame] = [];\r\n return this.props.frameArray[frame];\r\n }\r\n\r\n getOrCreateRoiLayer(frameArrayItem, structureIndex) {\r\n const roiLayer = frameArrayItem.find(\r\n (x) => x.id === this.props.structures[structureIndex].id\r\n );\r\n if (roiLayer) {\r\n return roiLayer;\r\n }\r\n const newRoiLayer = {\r\n id: this.props.structures[structureIndex].id,\r\n layer: {\r\n inverted: false,\r\n regionRois: [],\r\n },\r\n tree: new RBush(),\r\n };\r\n frameArrayItem.push(newRoiLayer);\r\n return newRoiLayer;\r\n }\r\n\r\n handleInterpolation = () => {\r\n const frameArray = this.props.frameArray;\r\n const selectedLayer = this.props.selectedLayer;\r\n const curT = Math.floor(this.props.time);\r\n const layer = this.findLayer(selectedLayer, frameArray[curT]);\r\n if (!layer || (layer.isKeyFrame && layer.layer.regionRois.length > 0)) {\r\n return;\r\n }\r\n const prevKeyFrame = this.searchPrevKeyFrame(\r\n curT,\r\n selectedLayer,\r\n frameArray\r\n );\r\n const nextKeyFrame = this.searchNextKeyFrame(\r\n curT,\r\n selectedLayer,\r\n frameArray\r\n );\r\n if (prevKeyFrame < 0 || nextKeyFrame < 0) {\r\n return;\r\n }\r\n const regionRoisStart = this.findLayer(\r\n selectedLayer,\r\n frameArray[prevKeyFrame]\r\n ).layer.regionRois;\r\n const regionRoisEnd = this.findLayer(\r\n selectedLayer,\r\n frameArray[nextKeyFrame]\r\n ).layer.regionRois;\r\n const figureCount = Math.min(regionRoisStart.length, regionRoisEnd.length);\r\n const isSubtype =\r\n this.props.structures[this.props.selectedLayer].isSubtype &&\r\n this.props.structures[this.props.selectedLayer].classificationSubtype;\r\n const name = isSubtype\r\n ? this.props.structures[this.props.selectedLayer].label\r\n : \"\";\r\n const color = this.props.structures[this.props.selectedLayer].color;\r\n const pointsCount = 100;\r\n for (let frame = prevKeyFrame + 1; frame < nextKeyFrame; frame++) {\r\n const frameArrayItem = this.getOrCreateFrameArrayItem(frame);\r\n const requiredLayer = this.getOrCreateRoiLayer(\r\n frameArrayItem,\r\n selectedLayer\r\n );\r\n requiredLayer.layer.regionRois = [];\r\n }\r\n for (let figureIndex = 0; figureIndex < figureCount; figureIndex++) {\r\n const figureStart = regionRoisStart[figureIndex];\r\n const figureEnd = regionRoisEnd[figureIndex];\r\n const startPointIndexA = predictStartPointIndex(\r\n figureStart.regions,\r\n pointsCount\r\n );\r\n const startPointIndexB = predictStartPointIndex(\r\n figureEnd.regions,\r\n pointsCount\r\n );\r\n const figAIsClockwise = traversalPolylineClockwise(figureStart.regions);\r\n const figBIsClockwise = traversalPolylineClockwise(figureEnd.regions);\r\n for (let frame = prevKeyFrame + 1; frame < nextKeyFrame; frame++) {\r\n const interpolatedFigure = getFigure(\r\n figureStart.regions,\r\n figureEnd.regions,\r\n startPointIndexA,\r\n startPointIndexB,\r\n figAIsClockwise,\r\n figBIsClockwise,\r\n pointsCount,\r\n prevKeyFrame,\r\n nextKeyFrame,\r\n frame\r\n );\r\n const frameArrayItem = this.getOrCreateFrameArrayItem(frame);\r\n const requiredLayer = this.getOrCreateRoiLayer(\r\n frameArrayItem,\r\n selectedLayer\r\n );\r\n const regionRoi = new RegionROI({\r\n regions: interpolatedFigure,\r\n color1: color,\r\n subtype: isSubtype,\r\n name: name,\r\n structureId: this.props.structures[selectedLayer].id,\r\n });\r\n\r\n requiredLayer.layer.regionRois.push(regionRoi);\r\n }\r\n }\r\n this.forceUpdate();\r\n };\r\n\r\n handleResizeMouseDown = (e) => {\r\n this.setState({\r\n isResizing: true,\r\n resizePos: e.pageY,\r\n });\r\n };\r\n\r\n handleResizeMouseMove = (e) => {\r\n if (!this.state.isResizing) {\r\n return;\r\n }\r\n const newResizePos = e.pageY;\r\n const deltaY = this.state.resizePos - newResizePos;\r\n this.setState({\r\n resizePos: newResizePos,\r\n });\r\n this.props.resizeTimeLine(deltaY, false);\r\n };\r\n\r\n handleResizeMouseUp = (e) => {\r\n if (!this.state.isResizing) {\r\n return;\r\n }\r\n const newResizePos = e.pageY;\r\n const deltaY = this.state.resizePos - newResizePos;\r\n this.setState({\r\n resizePos: newResizePos,\r\n isResizing: false,\r\n });\r\n this.props.resizeTimeLine(deltaY, true);\r\n };\r\n\r\n renderContent() {\r\n const { dimensions } = this.state;\r\n const {\r\n //classes, // will be added by withStyles func\r\n // ome.sizeT --- count of frames in the videosequence\r\n ome,\r\n // time --- current frame\r\n time,\r\n structures,\r\n frameArray,\r\n } = this.props;\r\n let frameWidth = dimensions.width / ome.sizeT;\r\n let innerWidth = \"100%\";\r\n if (frameWidth < frameMinWidth) {\r\n frameWidth = frameMinWidth; // width of one frame in TimeLineTool\r\n innerWidth = frameMinWidth * ome.sizeT + \"px\";\r\n }\r\n\r\n if (frameWidth > frameMaxWidth) {\r\n frameWidth = frameMaxWidth;\r\n innerWidth = frameWidth * ome.sizeT + \"px\";\r\n }\r\n\r\n const frameSeparatorColor = \"rgb(230, 230, 230)\";\r\n const bgImage =\r\n `repeating-linear-gradient(to right, ${frameSeparatorColor}, ` +\r\n `${frameSeparatorColor} 2px, white 2px, ` +\r\n `white ${frameWidth}px)`;\r\n //console.log('structures', this.props.structures);\r\n const charts = [];\r\n if (structures && structures.length > 1) {\r\n const frameIndices = Object.keys(frameArray)\r\n .map((x) => +x)\r\n .sort((x, y) => x - y);\r\n for (\r\n let structureIndex = 1;\r\n structureIndex < structures.length;\r\n structureIndex++\r\n ) {\r\n const structure = structures[structureIndex];\r\n if (!structure.isUnfolded) {\r\n continue;\r\n }\r\n const keyFrames = {};\r\n let prevKeyFrame = -1;\r\n const interpolatedIntervals = [];\r\n if (frameArray) {\r\n for (let frameIndex of frameIndices) {\r\n if (frameArray[frameIndex]) {\r\n const frameInfo = frameArray[frameIndex];\r\n const roiLayer = frameInfo.find(\r\n (roiLayer) => roiLayer.id === structure.id\r\n );\r\n if (\r\n roiLayer &&\r\n /* roiLayer.layer && roiLayer.layer.regionRois\r\n && roiLayer.layer.regionRois.length > 0 && */ roiLayer.isKeyFrame\r\n ) {\r\n if (prevKeyFrame > -1 && frameIndex - prevKeyFrame !== 1) {\r\n const frameInfo = frameArray[prevKeyFrame + 1];\r\n if (frameInfo) {\r\n const roiLayer = frameInfo.find(\r\n (roiLayer) => roiLayer.id === structure.id\r\n );\r\n if (\r\n roiLayer &&\r\n roiLayer.layer &&\r\n roiLayer.layer.regionRois &&\r\n roiLayer.layer.regionRois.length > 0\r\n ) {\r\n interpolatedIntervals.push([prevKeyFrame, frameIndex]);\r\n }\r\n }\r\n }\r\n keyFrames[frameIndex] = true;\r\n prevKeyFrame = frameIndex;\r\n }\r\n }\r\n }\r\n }\r\n charts.push(\r\n \r\n );\r\n }\r\n }\r\n\r\n const addLength = charts.length * 50 + this.container.offsetHeight;\r\n\r\n //Fragment is used to return multiple elements on the highest hierarchy level\r\n return (\r\n (this.innerContainer = el)}\r\n >\r\n {charts}\r\n\r\n \r\n \r\n );\r\n }\r\n\r\n render() {\r\n const { dimensions } = this.state;\r\n const {\r\n classes,\r\n time,\r\n onStep,\r\n ome,\r\n onPlayPause,\r\n playing,\r\n playDirection,\r\n onChangeSr,\r\n sr,\r\n } = this.props;\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n onChangeSr(\r\n Math.max(1, Math.min(1500, parseInt(e.target.value, 10)))\r\n )\r\n }\r\n />\r\n \r\n
\r\n
\r\n onStep(-1)}\r\n disabled={time <= 0}\r\n size=\"large\"\r\n >\r\n \r\n \r\n
\r\n {Math.floor(time) + 1}/{ome.sizeT}\r\n
\r\n
\r\n \r\n playDirection < 0\r\n ? onPlayPause(!playing, -1)\r\n : onPlayPause(true, -1)\r\n }\r\n size=\"large\"\r\n >\r\n {playing && playDirection < 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n playDirection > 0\r\n ? onPlayPause(!playing, 1)\r\n : onPlayPause(true, 1)\r\n }\r\n size=\"large\"\r\n >\r\n {playing && playDirection > 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n
\r\n onStep(1)}\r\n disabled={time >= ome.sizeT - 1}\r\n size=\"large\"\r\n >\r\n \r\n \r\n
\r\n
(this.container = el)}>\r\n {dimensions && this.renderContent()}\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nTimeLineTool.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n ome: PropTypes.object,\r\n playing: PropTypes.bool,\r\n time: PropTypes.number,\r\n onPlayPause: PropTypes.func,\r\n onSeek: PropTypes.func,\r\n playDirection: PropTypes.number,\r\n onChangeSr: PropTypes.func,\r\n onChangeT: PropTypes.func,\r\n sr: PropTypes.number,\r\n onStep: PropTypes.func,\r\n structures: PropTypes.array,\r\n frameArray: PropTypes.object,\r\n selectedLayer: PropTypes.number,\r\n resizeTimeLine: PropTypes.func,\r\n timeLineHeight: PropTypes.number,\r\n};\r\n\r\n// withStyles is used to apply defined styles to TimeLineTool via passed classes\r\nexport default withStyles(styles)(TimeLineTool);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faLayerGroup } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { IconButton, Slider, TextField, Tooltip } from \"@mui/material\";\r\n\r\nimport {\r\n PlayCircleOutline,\r\n PauseCircleOutline,\r\n ArrowDropUp,\r\n ArrowDropDown,\r\n} from \"@mui/icons-material\";\r\n\r\nconst styles = {\r\n root: {\r\n width: 40,\r\n position: \"absolute\",\r\n top: 70,\r\n bottom: 185,\r\n left: 5,\r\n color: \"#ffffff\",\r\n\r\n padding: 0,\r\n \"& :active\": {\r\n outline: \"\",\r\n },\r\n background: \"#000000AA\",\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n borderRadius: 10,\r\n },\r\n barIcon: {\r\n position: \"absolute\",\r\n left: 0,\r\n top: 4,\r\n height: 26,\r\n width: \"36px!important\",\r\n color: \"#fff\",\r\n },\r\n stepUp: {\r\n position: \"absolute\",\r\n top: 174,\r\n left: 5,\r\n padding: 0,\r\n color: \"#fff\",\r\n },\r\n stepDown: {\r\n position: \"absolute\",\r\n bottom: 32,\r\n left: 5,\r\n padding: 0,\r\n color: \"#fff\",\r\n },\r\n slider: {\r\n position: \"absolute\",\r\n top: 200,\r\n left: 2,\r\n bottom: 58,\r\n },\r\n verticalTextfield: {\r\n position: \"absolute\",\r\n left: 0,\r\n color: \"#fff\",\r\n\r\n \"& div\": {\r\n color: \"#fff\",\r\n marginTop: 4,\r\n width: \"100%\",\r\n },\r\n \"& label\": {\r\n color: \"#fff !important\",\r\n fontSize: 11,\r\n lineHeight: \"14px\",\r\n padding: 0,\r\n width: \"100%\",\r\n textAlign: \"center\",\r\n margin: 0,\r\n left: \"-5px\",\r\n },\r\n \"& input\": {\r\n marginTop: 4,\r\n padding: \"0px 0 0px\",\r\n textAlign: \"center\",\r\n },\r\n \"& .MuiOutlinedInput-input\": {\r\n \"&::-webkit-outer-spin-button, &::-webkit-inner-spin-button\": {\r\n \"-webkit-appearance\": \"none\",\r\n },\r\n },\r\n },\r\n playPauseDown: {\r\n position: \"absolute\",\r\n top: 142,\r\n padding: 5,\r\n color: \"#fff\",\r\n },\r\n playPauseUp: {\r\n position: \"absolute\",\r\n bottom: 0,\r\n padding: 5,\r\n color: \"#fff\",\r\n },\r\n};\r\n\r\nfunction ValueLabelComponent(props) {\r\n const { children, open, value } = props;\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nValueLabelComponent.propTypes = {\r\n children: PropTypes.element.isRequired,\r\n open: PropTypes.bool.isRequired,\r\n value: PropTypes.number.isRequired,\r\n};\r\n\r\nclass ZStackBar extends Component {\r\n render() {\r\n const {\r\n classes,\r\n ome,\r\n z,\r\n minZ,\r\n maxZ,\r\n zsr,\r\n onStep,\r\n onChangeZ,\r\n onChangeZValue,\r\n onChangeZSr,\r\n playing,\r\n playDirection,\r\n onPlayPause,\r\n pointerEvents,\r\n } = this.props;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n onChangeZValue(\r\n Math.max(\r\n 0,\r\n Math.min(ome.sizeZ - 1, parseInt(e.target.value, 10))\r\n )\r\n )\r\n }\r\n />\r\n \r\n \r\n {\r\n onChangeZSr(Math.max(1, parseInt(e.target.value, 10)));\r\n }}\r\n />\r\n \r\n \r\n playDirection > 0\r\n ? onPlayPause(true, -1)\r\n : onPlayPause(!playing, -1)\r\n }\r\n size=\"large\"\r\n >\r\n {playing && playDirection < 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n onStep(1)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n
\r\n \r\n
\r\n onStep(-1)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n 0 ? \"rotate(0deg)\" : \"rotate(-90deg)\",\r\n }}\r\n onClick={() =>\r\n playDirection > 0 ? onPlayPause(!playing, 1) : onPlayPause(true, 1)\r\n }\r\n size=\"large\"\r\n >\r\n {playing && playDirection > 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nZStackBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n ome: PropTypes.object,\r\n playing: PropTypes.bool,\r\n playDirection: PropTypes.number,\r\n z: PropTypes.number,\r\n minZ: PropTypes.number,\r\n maxZ: PropTypes.number,\r\n onStep: PropTypes.func,\r\n onChangeZSr: PropTypes.func,\r\n onChangeZValue: PropTypes.func,\r\n zsr: PropTypes.number,\r\n onChangeZ: PropTypes.func,\r\n onPlayPause: PropTypes.func,\r\n pointerEvents: PropTypes.bool,\r\n};\r\n\r\nexport default withStyles(styles)(ZStackBar);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faInfo } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\nconst styles = {\r\n root: {\r\n pointerEvents: \"none\",\r\n width: \"auto\",\r\n maxWidth: \"600px\",\r\n height: 46,\r\n\r\n position: \"absolute\",\r\n top: 10,\r\n left: 5,\r\n color: \"#ffffff\",\r\n\r\n padding: 0,\r\n \"& :active\": {\r\n outline: \"\",\r\n },\r\n background: \"#000000AA\",\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n borderRadius: 10,\r\n zIndex: 9999,\r\n },\r\n barIcon: {\r\n position: \"absolute\",\r\n top: -1,\r\n left: 2,\r\n height: 42,\r\n width: \"36px!important\",\r\n padding: 8,\r\n color: \"#ffffff\",\r\n },\r\n infoArea: {\r\n paddingLeft: \"40px\",\r\n paddingRight: \"10px\",\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n color: \"#fff\",\r\n },\r\n};\r\n\r\nclass ImageInfo extends Component {\r\n render() {\r\n const { classes, ome } = this.props;\r\n\r\n return (\r\n
\r\n \r\n {ome && (\r\n
\r\n \r\n {ome.fileName}{\" \"}\r\n {ome.sizeS > 1 && , Scene {ome.scene + 1}}\r\n \r\n \r\n Size: {ome.sizeX}x{ome.sizeY}\r\n \r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nImageInfo.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n ome: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(ImageInfo);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n CircularProgress,\r\n IconButton,\r\n LinearProgress,\r\n Tooltip,\r\n Fade,\r\n Popper,\r\n Paper,\r\n} from \"@mui/material\";\r\nimport { trackTransforms, getBaseLog } from \"../utils/CanvasUtil\";\r\nimport {\r\n configureImage,\r\n colorInImage,\r\n tileRegistration,\r\n calculateTransformationMatrix,\r\n} from \"../utils/RendererUtils\";\r\nimport { getParentIndexLayer, getParentIndex } from \"../utils/StructuresUtils\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { RectROI, RegionROI } from \"../utils/ROI\";\r\n// import { knn } from \"../utils/rbush-knn\";\r\nimport RBush from \"rbush\";\r\nimport ScaleBar from \"./ScaleBar\";\r\nimport ZoomBar from \"./ZoomBar\";\r\nimport MiniMap from \"./MiniMap\";\r\nimport ResultTable from \"./ResultTable\";\r\nimport { Tools } from \"./VerticalToolBar\";\r\nimport TimeLineTool from \"./TimeLineTool\";\r\nimport ZStackBar from \"./ZStackBar\";\r\nimport ImageInfo from \"./ImageInfo\";\r\nimport ToggleButton from \"./ToggleButton\";\r\nimport { Resizable } from \"react-resizable\";\r\nimport \"react-resizable/css/styles.css\";\r\n\r\nimport { withPersistentStorage } from \"../contexts/PersistentStorageContext\";\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport { withResultTab } from \"../contexts/ResultTabContext\";\r\nimport { ViewQuilt } from \"@mui/icons-material\";\r\nimport KeyboardArrowLeftIcon from \"@mui/icons-material/KeyboardArrowLeft\";\r\nimport KeyboardArrowRightIcon from \"@mui/icons-material/KeyboardArrowRight\";\r\n\r\nimport h337 from \"heatmapjs\";\r\n\r\n// debug flags\r\nconst FPS = false;\r\n\r\nconst styles = {\r\n canvas: {\r\n position: \"relative\",\r\n display: \"block\",\r\n width: \"100%\",\r\n backgroundColor: \"#D3D3D3\",\r\n },\r\n\r\n root: {\r\n height: \"100%\",\r\n },\r\n\r\n heatmapContainer: {\r\n pointerEvents: \"none\",\r\n position: \"absolute !important\",\r\n zIndex: \"9998\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n\r\n toolbarButtonRoot: {\r\n color: \"#666\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 75,\r\n zIndex: 100,\r\n },\r\n toolbarButtonRootSingle: {\r\n color: \"#666\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n zIndex: 100,\r\n },\r\n toolbarButton: {\r\n position: \"relative\",\r\n display: \"inline-block\",\r\n\r\n width: 40,\r\n height: 40,\r\n padding: 8,\r\n margin: 0,\r\n },\r\n toolbarButtonIcon: {\r\n verticalAlign: \"-4px\",\r\n },\r\n toolbarButtonChecked: {\r\n width: 40,\r\n color: \"#0673C1\",\r\n },\r\n progress: {\r\n position: \"absolute\",\r\n margin: -20,\r\n left: \"50%\",\r\n top: \"50%\",\r\n zIndex: 1000,\r\n },\r\n fps: {\r\n position: \"absolute\",\r\n right: 50,\r\n top: 50,\r\n color: \"white\",\r\n fontSize: 20,\r\n pointerEvents: \"none\",\r\n },\r\n resizableContainer: {\r\n \"& .react-resizable-handle\": {\r\n pointerEvents: \"all\",\r\n },\r\n \"& .react-resizable-handle-se::before\": {\r\n content: \"''\",\r\n display: \"block\",\r\n position: \"absolute\",\r\n bottom: 3,\r\n right: 3,\r\n width: 6,\r\n height: 6,\r\n borderBottom: \"1px solid #0673c1\",\r\n borderRight: \"1px solid #0673c1\",\r\n },\r\n },\r\n fileNavLeftBtn: {\r\n position: \"absolute\",\r\n left: 5,\r\n top: \"50%\",\r\n marginTop: \"-40px\",\r\n \"& svg\": {\r\n fontSize: \"80px\",\r\n },\r\n },\r\n fileNavRightBtn: {\r\n position: \"absolute\",\r\n right: 5,\r\n top: \"50%\",\r\n marginTop: \"-40px\",\r\n \"& svg\": {\r\n fontSize: \"80px\",\r\n },\r\n },\r\n};\r\n\r\nNumber.prototype.toBase = function (base) {\r\n var symbols =\r\n \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\".split(\"\");\r\n var decimal = this;\r\n var conversion = \"\";\r\n\r\n if (base > symbols.length || base <= 1) {\r\n return false;\r\n }\r\n\r\n while (decimal >= 1) {\r\n conversion =\r\n symbols[decimal - base * Math.floor(decimal / base)] + conversion;\r\n decimal = Math.floor(decimal / base);\r\n }\r\n\r\n return base < 11 ? parseInt(conversion) : conversion;\r\n};\r\n\r\nconst debounce = (func, delay) => {\r\n let inDebounce;\r\n return function () {\r\n const context = this;\r\n const args = arguments;\r\n clearTimeout(inDebounce);\r\n inDebounce = setTimeout(() => func.apply(context, args), delay);\r\n };\r\n};\r\n\r\nclass Renderer extends Component {\r\n _isMounted = false;\r\n\r\n constructor(props) {\r\n super(props);\r\n // transmit context to componentRef\r\n if (props.componentRef) props.componentRef(this);\r\n\r\n this.state = {\r\n previewWidth: 100,\r\n previewHeight: 100,\r\n dragStart: null,\r\n isDrawing: false,\r\n mouseOnCanvas: false,\r\n ome: props.ome,\r\n initialized: false,\r\n initializedZ: false,\r\n initialScale: 1,\r\n tMin: 0,\r\n tMax: 0,\r\n t: 0,\r\n z: Math.floor(props.ome.sizeZ / 2),\r\n minZ: 0,\r\n maxZ: props.ome.sizeZ - 1,\r\n fps: 0,\r\n // time playback\r\n sr: 60,\r\n // z playback\r\n zsr: 60,\r\n bufferSize: 100,\r\n playing: false,\r\n playingZ: false,\r\n playDirection: 1,\r\n playDirectionZ: 1,\r\n miniMapKey: 0,\r\n // tools\r\n rois: [],\r\n selectedROI: null,\r\n limitVisibleRegions: false,\r\n layerTrees: [],\r\n previewRectChanged: false,\r\n isBrightfield:\r\n props.ome &&\r\n props.ome.channels.length === 1 &&\r\n props.ome.channels[0].type === \"brightfield\",\r\n scaleBarData: null,\r\n startY: 0,\r\n showMiniMap: true,\r\n showObjectIdx: false,\r\n miniMapReady: false,\r\n open: false,\r\n anchorEl: null,\r\n displayTimeBar: false,\r\n displayZStackBar: false,\r\n showScaleBar: true,\r\n showTimeBar: false,\r\n showZStackBar: false,\r\n showImageInfo: true,\r\n showZoomBar: true,\r\n showResultTable: false,\r\n showFileNavButtons: false,\r\n hideMiniMap: false,\r\n };\r\n this.updateCounter = 0;\r\n this.visibleRegionsLimit = 3000;\r\n this.visibleRegionsRadius = 1000;\r\n this.structureRegionLimits = [];\r\n this.slowestStructureIdx = -1;\r\n this.fastestStructureIdx = -1;\r\n this.fileIdStateData = {};\r\n\r\n this.initFrameArray();\r\n this.updateExistingStructures();\r\n\r\n this.lineIdx = 0;\r\n this.keepRendering = true;\r\n\r\n this.lastMoveTime = performance.now();\r\n\r\n this.selROI = null;\r\n window.setNewSelRoi = this.setNewSelRoi;\r\n window.getMousePositionInImage = this.getMousePositionInImage;\r\n window.setZoomLevelForGridSize = this.setZoomLevelForGridSize;\r\n\r\n // frontend cached alpha channel images\r\n this.visibleImage = [];\r\n // frontend cached colored images\r\n this.coloredImages = [];\r\n\r\n this.hMat = [];\r\n this.imgRegistered = true;\r\n this.callbackCounter = 0;\r\n\r\n this.oldVisibleRegionCount = 0;\r\n\r\n this.gridTileCount = 0;\r\n\r\n // fps history to smooth fps counter update\r\n this.lastFps = Array.from(Array(10), () => 60);\r\n\r\n this.createBackgroundPattern();\r\n this.tempLayer = null;\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n createBackgroundPattern = () => {\r\n this.backgroundPattern = document.createElement(\"canvas\");\r\n const patternContext = this.backgroundPattern.getContext(\"2d\");\r\n\r\n // Give the pattern a width and height of 50\r\n const w = 30;\r\n const h = 30;\r\n this.backgroundPattern.width = w;\r\n this.backgroundPattern.height = h;\r\n\r\n // Give the pattern a background color and draw an arc\r\n patternContext.fillStyle = \"transparent\";\r\n patternContext.strokeStyle = \"#999\";\r\n patternContext.fillRect(0, 0, w, h);\r\n patternContext.lineWidth = 1;\r\n patternContext.moveTo(-w / 2, h);\r\n patternContext.lineTo(w, -h / 2);\r\n patternContext.moveTo(0, h + h / 2);\r\n patternContext.lineTo(w + w / 2, 0);\r\n patternContext.stroke();\r\n };\r\n\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n let stateObject = {};\r\n this.canvas = document.getElementById(this.props.canvasId);\r\n this.props.resultTab.setRendererCanvas(this.canvas);\r\n // get drawing context from canvas\r\n this.ctx = this.canvas.getContext(\"2d\");\r\n this.props.resultTab.setRendererCtx(this.ctx);\r\n\r\n // bind mouse wheel events\r\n this.canvas.addEventListener(\"DOMMouseScroll\", this.mousewheel, true);\r\n this.canvas.addEventListener(\"mousewheel\", this.mousewheel, {\r\n passive: false,\r\n });\r\n // bind mouse events\r\n window.addEventListener(\"mouseup\", this.mouseup, { passive: true });\r\n window.addEventListener(\"mousemove\", this.mousemove, { passive: true });\r\n\r\n this.heatmap = h337.create({\r\n container: document.getElementById(\"heatmapDiv\"),\r\n gradient: {\r\n \".25\": \"#0000ff\",\r\n \".5\": \"#00ff00\",\r\n \".75\": \"#ffff00\",\r\n \".99\": \"#ff0000\",\r\n },\r\n maxOpacity: 0.8,\r\n minOpacity: 0,\r\n blur: 0.99,\r\n });\r\n\r\n // extend context with some fancy additional transformation methods\r\n trackTransforms(this.ctx);\r\n\r\n // converts the relative size css information into an absolute size which we can access\r\n this.canvas.width = this.canvas.offsetWidth;\r\n this.canvas.height = this.canvas.offsetHeight;\r\n\r\n // initialize position\r\n stateObject.lastX = this.canvas.width / 2;\r\n stateObject.lastY = this.canvas.height / 2;\r\n\r\n this.t0 = performance.now();\r\n\r\n let loadObject = [\r\n \"hideMiniMap\",\r\n \"showObjectIdx\",\r\n \"showMiniMap\",\r\n \"showScaleBar\",\r\n \"showTimeBar\",\r\n \"showZStackBar\",\r\n \"showImageInfo\",\r\n \"showZoomBar\",\r\n \"showResultTable\",\r\n \"showFileNavButtons\",\r\n ];\r\n\r\n let i = null;\r\n if (this.props.showFullscreen) {\r\n loadObject.forEach((element) => {\r\n i = this.props.persistentStorage.load(element + \"Full\");\r\n if (i === true || i === false) stateObject[element] = i;\r\n });\r\n } else {\r\n loadObject.forEach((element) => {\r\n i = this.props.persistentStorage.load(element);\r\n if (i === true || i === false) stateObject[element] = i;\r\n });\r\n }\r\n\r\n stateObject[\"displayTimeBar\"] = this.props.displayTimeBar;\r\n stateObject[\"displayZStackBar\"] = this.props.displayZStackBar;\r\n stateObject[\"showZStackBar\"] = this.props.showZStackBar;\r\n stateObject[\"showTimeBar\"] = this.props.showTimeBar;\r\n\r\n this.setMountedState(stateObject, () => {\r\n this.checkMiniMapVisivility();\r\n });\r\n //set mouse postition to center of canvas\r\n this.mousePos = this.getMousePositionInImage();\r\n this.draw();\r\n };\r\n\r\n loadFrameArray(frameIndex) {\r\n this.applyFrameArray(frameIndex);\r\n }\r\n\r\n initFrameArray() {\r\n const ome = this.state.ome;\r\n const frameIndex = this.state.t * ome.sizeZ + this.state.z;\r\n this.loadFrameArray(frameIndex);\r\n }\r\n\r\n // looks for annotations to visible frame excluding base roi\r\n applyFrameArray(frameIndex) {\r\n const roiLayers = this.props.roiLayers;\r\n if (Object.keys(this.props.frameArrayDict[this.props.fileId]).length === 0)\r\n return;\r\n\r\n for (let idx = 1; idx < this.props.structures.length; idx++) {\r\n const structure = this.props.structures[idx];\r\n let newRoiLayer;\r\n newRoiLayer = this.findRoiLayer(\r\n this.props.frameArrayDict[this.props.fileId][frameIndex],\r\n structure\r\n );\r\n roiLayers[idx] = newRoiLayer;\r\n }\r\n }\r\n\r\n storeRoiLayersToFrameArray(frameIndex) {\r\n let updatedFrameArrayFrame = [];\r\n for (let structure of this.props.structures) {\r\n if (structure.id === 1) {\r\n continue;\r\n }\r\n updatedFrameArrayFrame.push(\r\n this.findRoiLayer(this.props.roiLayers, structure)\r\n );\r\n }\r\n this.props.frameArrayDict[this.props.fileId][frameIndex] =\r\n updatedFrameArrayFrame;\r\n }\r\n\r\n findRoiLayer(roiLayers, structure) {\r\n const roiLayer = roiLayers\r\n ? roiLayers.find((x) => structure.id === x.id)\r\n : roiLayers;\r\n if (roiLayer === undefined) {\r\n return this.getClearedRoiLayer(structure.id);\r\n }\r\n return roiLayer;\r\n }\r\n\r\n flipRoiLayers(prevState) {\r\n const prevT = Math.floor(prevState.t);\r\n const prevZ = Math.floor(prevState.z);\r\n const curT = Math.floor(this.state.t);\r\n const curZ = Math.floor(this.state.z);\r\n const prevFrameIndex = prevT * this.state.ome.sizeZ + prevZ;\r\n const frameIndex = curT * this.state.ome.sizeZ + curZ;\r\n\r\n this.storeRoiLayersToFrameArray(prevFrameIndex);\r\n this.applyFrameArray(frameIndex);\r\n this.storeRoiLayersToFrameArray(frameIndex);\r\n }\r\n\r\n updateFrameArray() {\r\n const curT = Math.floor(this.state.t);\r\n const curZ = Math.floor(this.state.z);\r\n const frameIndex = curT * this.state.ome.sizeZ + curZ;\r\n this.storeRoiLayersToFrameArray(frameIndex);\r\n const structure = this.props.structures[this.props.selectedLayer];\r\n if (!structure) {\r\n return;\r\n }\r\n const roiLayer = this.findRoiLayer(this.props.roiLayers, structure);\r\n roiLayer.isKeyFrame = roiLayer.layer.regionRois.length > 0;\r\n }\r\n\r\n getClearedRoiLayer(id) {\r\n return {\r\n id: id,\r\n layer: {\r\n inverted: false,\r\n regionRois: [],\r\n },\r\n tree: new RBush(),\r\n };\r\n }\r\n\r\n /**\r\n * Clear roiLayers except base roi\r\n */\r\n clearRoiLayers() {\r\n for (let i = 1; i < this.props.roiLayers.length; i++) {\r\n this.props.roiLayers[i] = this.getClearedRoiLayer(\r\n this.props.roiLayers[i].id\r\n );\r\n }\r\n }\r\n\r\n removeLayersFromFrameArray(removedStructures) {\r\n for (let structureId of removedStructures) {\r\n for (let frameIndex in this.props.frameArrayDict[this.props.fileId]) {\r\n const roiLayers =\r\n this.props.frameArrayDict[this.props.fileId][frameIndex];\r\n for (let i = roiLayers.length - 1; i >= 0; i--) {\r\n if (roiLayers[i].id === structureId) {\r\n roiLayers.splice(i, 1);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n updateExistingStructures() {\r\n this.existingStructures = {};\r\n for (let structure of this.props.structures) {\r\n this.existingStructures[structure.id] = true;\r\n }\r\n }\r\n\r\n getRemovedStructures() {\r\n const removedStructures = [];\r\n for (let layerId in this.existingStructures) {\r\n if (!this.props.structures.find((x) => x.id === layerId)) {\r\n removedStructures.push(layerId);\r\n }\r\n }\r\n return removedStructures;\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n const oldFileId = prevProps.fileId;\r\n const newFileId = this.props.fileId;\r\n const oldFrameIndex = prevState.t * prevState.ome.sizeZ + prevState.z;\r\n //const newFrameIndex = this.state.t * this.state.ome.sizeZ + this.state.z;\r\n const prevT = Math.floor(prevState.t);\r\n const prevZ = Math.floor(prevState.z);\r\n const curT = Math.floor(this.state.t);\r\n const curZ = Math.floor(this.state.z);\r\n\r\n const removedStructures = this.getRemovedStructures();\r\n this.removeLayersFromFrameArray(removedStructures);\r\n this.updateExistingStructures();\r\n\r\n if (prevT !== curT || prevZ !== curZ) {\r\n this.flipRoiLayers(prevState);\r\n }\r\n\r\n // on file change => reset renderer cache\r\n if (oldFileId && oldFileId !== newFileId) {\r\n // TODO: [BP-35] fix this part for histo modules (fix hot fix correctly)\r\n let histoModule =\r\n this.props.project.type.includes(\"HistoClassification\") ||\r\n this.props.project.type.includes(\"HistoPointCounting\");\r\n if (\r\n !this.props.frameArrayDict[newFileId][oldFrameIndex] &&\r\n !histoModule\r\n ) {\r\n this.clearRoiLayers();\r\n } else {\r\n this.applyFrameArray(oldFrameIndex);\r\n }\r\n this.fileIdStateData[oldFileId] = prevState;\r\n\r\n if (this.fileIdStateData[newFileId]) {\r\n this.setMountedState(this.fileIdStateData[newFileId]);\r\n }\r\n\r\n setTimeout(() => this.zoomFit(), 100);\r\n this.setMountedState({\r\n miniMapKey: new Date().getTime(),\r\n });\r\n }\r\n if (\r\n prevProps.loadedAnnotationsCounter !== this.props.loadedAnnotationsCounter\r\n ) {\r\n this.initFrameArray();\r\n }\r\n\r\n let idx = this.props.structures.findIndex((s) => s.label === \"Grid\");\r\n if (this.props.roiLayers[idx]) {\r\n if (idx > -1) {\r\n this.gridTileCount = this.props.roiLayers[idx].layer.regionRois.length;\r\n } else {\r\n this.gridTileCount = 0;\r\n }\r\n }\r\n }\r\n\r\n componentWillUnmount = () => {\r\n this._isMounted = false;\r\n // unbind mouse wheel events\r\n this.canvas.removeEventListener(\"DOMMouseScroll\", this.mousewheel);\r\n this.canvas.removeEventListener(\"mousewheel\", this.mousewheel);\r\n // unbind mouse events\r\n window.removeEventListener(\"mouseup\", this.mouseup, { passive: true });\r\n window.removeEventListener(\"mousemove\", this.mousemove, { passive: true });\r\n this.keepRendering = false;\r\n };\r\n\r\n reset = () => {\r\n // resets renderer to initial state\r\n //TODO: adapt for Splitscreen, so that not all frames are reseted\r\n this.props.tiles.clearTiles();\r\n // frontend cached alpha channel images\r\n this.props.tiles.setVisibleImage([]);\r\n // frontend cached colored images\r\n this.props.tiles.setColoredImages([]);\r\n\r\n this.setMountedState({\r\n dragStart: null,\r\n playing: false,\r\n //initialized: false,\r\n });\r\n\r\n this.loadAllTiles();\r\n this.props.setChangingFile(false);\r\n //this.props.setAIObjects();\r\n };\r\n\r\n updatePreviewRect = (activeTool) => {\r\n if (this.props.tools[activeTool] && this.canvas) {\r\n let p2 = this.getPointInCanvas({\r\n x: this.canvas.offsetWidth / 2,\r\n y: this.canvas.offsetHeight / 2,\r\n });\r\n this.props.tools[activeTool].setPreviewRect(p2.x, p2.y); //set position\r\n if (typeof this.props.tools[activeTool].previewRect !== \"undefined\")\r\n this.updatePreviewRectSize({\r\n width: this.props.tools[activeTool].previewRect.w,\r\n height: this.props.tools[activeTool].previewRect.h,\r\n });\r\n }\r\n };\r\n\r\n updateObjectMode = (value) => {\r\n this.objectMode = value;\r\n };\r\n\r\n UNSAFE_componentWillReceiveProps = (nextProps) => {\r\n const { structures, selectedLayer } = this.props;\r\n // set canvas context for pen tool\r\n if (\r\n structures[selectedLayer] &&\r\n structures[selectedLayer].isSubtype &&\r\n structures[selectedLayer].classificationSubtype\r\n ) {\r\n let parentIndex = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n if (\r\n nextProps.tools[nextProps.activeTool] &&\r\n this.props.isActive &&\r\n nextProps.roiLayers[parentIndex]\r\n ) {\r\n nextProps.tools[nextProps.activeTool].setLayer({\r\n layer: nextProps.roiLayers[parentIndex].layer,\r\n ome: nextProps.ome,\r\n fileId: nextProps.fileId,\r\n projectId: nextProps.projectId,\r\n structures: nextProps.structures,\r\n roiLayers: nextProps.roiLayers,\r\n drawLayer: nextProps.drawLayer,\r\n selectedLayer: nextProps.selectedLayer,\r\n updateProject: nextProps.updateProject,\r\n commentLayer: nextProps.commentLayer,\r\n landmarkLayer: nextProps.landmarkLayer,\r\n landmarkLayers: nextProps.landmarkLayers,\r\n allRoiLayers: nextProps.allRoiLayers,\r\n viewerConfig_project: nextProps.viewerConfig.project,\r\n project: nextProps.project,\r\n ctx: this.ctx,\r\n histogramConfig: nextProps.histogramConfig,\r\n rendererDict: nextProps.rendererDict,\r\n updateObjectMode: this.updateObjectMode,\r\n splitscreenFileIds: nextProps.splitscreenFileIds,\r\n });\r\n }\r\n } else {\r\n let offset = 0;\r\n if (\r\n nextProps.structures[nextProps.selectedLayer - offset] &&\r\n nextProps.tools[nextProps.activeTool] &&\r\n nextProps.roiLayers &&\r\n this.props.isActive\r\n ) {\r\n nextProps.tools[nextProps.activeTool].setLayer({\r\n layer: nextProps.roiLayers.find(\r\n (x) =>\r\n x.id === nextProps.structures[nextProps.selectedLayer - offset].id\r\n ).layer,\r\n ome: nextProps.ome,\r\n fileId: nextProps.fileId,\r\n projectId: nextProps.projectId,\r\n structures: nextProps.structures,\r\n roiLayers: nextProps.roiLayers,\r\n drawLayer: nextProps.drawLayer,\r\n selectedLayer: nextProps.selectedLayer,\r\n updateProject: nextProps.updateProject,\r\n commentLayer: nextProps.commentLayer,\r\n landmarkLayer: nextProps.landmarkLayer,\r\n landmarkLayers: nextProps.landmarkLayers,\r\n allRoiLayers: nextProps.allRoiLayers,\r\n viewerConfig_project: nextProps.viewerConfig.project,\r\n project: nextProps.project,\r\n ctx: this.ctx,\r\n histogramConfig: nextProps.histogramConfig,\r\n rendererDict: nextProps.rendererDict,\r\n updateObjectMode: this.updateObjectMode,\r\n splitscreenFileIds: nextProps.splitscreenFileIds,\r\n });\r\n }\r\n }\r\n\r\n // update preview rect\r\n if (!nextProps.showGallery) {\r\n if (!this.state.previewRectChanged)\r\n this.setMountedState({ previewRectChanged: true });\r\n }\r\n };\r\n\r\n getPage = (c, z, t) => {\r\n // calculate page index from coordinates\r\n return (\r\n Math.round(t) * this.props.ome.channels.length * this.props.ome.sizeZ +\r\n c * this.props.ome.sizeZ +\r\n Math.round(z)\r\n );\r\n };\r\n\r\n getPageForChannel = (c) => {\r\n // calculate page index from coordinates\r\n return (\r\n Math.round(this.state.t) *\r\n this.props.ome.channels.length *\r\n this.props.ome.sizeZ +\r\n Math.round(this.state.z) * this.props.ome.channels.length +\r\n c\r\n );\r\n };\r\n\r\n getMousePositionInImage = () => {\r\n let x = window.getMousePosition()[0];\r\n let y = window.getMousePosition()[1];\r\n this.lastX = x - this.canvas.getBoundingClientRect().left;\r\n this.lastY = y - this.canvas.getBoundingClientRect().top; //- this.canvas.offsetTop\r\n\r\n // calculate mouse position in image coordinates\r\n let p1 = this.getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n let p2 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p3 = this.getPosition();\r\n\r\n p1.x += p2.x - p3.x / this.getScale();\r\n p1.y += p2.y - p3.y / this.getScale();\r\n\r\n return p1;\r\n };\r\n\r\n getPositionInImage = (position) => {\r\n // calculate corner points top left (position==0), bottom right (position==1), center (position==2)\r\n let X;\r\n let Y;\r\n if (position === 0) {\r\n // top left\r\n X = this.canvas.getBoundingClientRect().left;\r\n Y = this.canvas.getBoundingClientRect().top; //64 - this.canvas.offsetTop + 32; // 32 is half of blue header\r\n } else if (position === 1) {\r\n // bottom right\r\n X = this.canvas.getBoundingClientRect().right;\r\n Y = this.canvas.getBoundingClientRect().bottom;\r\n //- this.canvas.offsetTop + 32; // 32 is half of blue header\r\n } else {\r\n // center\r\n X =\r\n (this.canvas.getBoundingClientRect().left +\r\n this.canvas.getBoundingClientRect().right) /\r\n 2;\r\n Y =\r\n (this.canvas.getBoundingClientRect().top +\r\n this.canvas.getBoundingClientRect().bottom) /\r\n 2;\r\n //+32; // 32 is half of blue header\r\n }\r\n\r\n // calculate mouse position in image coordinates\r\n let p1 = this.getPointInCanvas({\r\n x: X - this.canvas.getBoundingClientRect().left,\r\n y: Y - this.canvas.getBoundingClientRect().top,\r\n });\r\n let p2 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p3 = this.getPosition();\r\n p1.x += p2.x - p3.x / this.getScale();\r\n p1.y += p2.y - p3.y / this.getScale();\r\n\r\n return p1;\r\n };\r\n\r\n toolMouseForward = (event) => {\r\n const parentId = this.props.structures[this.props.selectedLayer].parentId;\r\n\r\n let parentIdx = this.props.structures.findIndex(\r\n (item) => item.id === parentId\r\n );\r\n parentIdx = this.props.selectedLayer > 0 ? Math.max(0, parentIdx) : -1;\r\n let p1 = this.mousePos;\r\n p1.x = p1.x < 0 ? 0 : p1.x;\r\n p1.x = p1.x > this.vw ? this.vw : p1.x;\r\n p1.y = p1.y < 0 ? 0 : p1.y;\r\n p1.y = p1.y > this.vh ? this.vh : p1.y;\r\n const isSubtype =\r\n this.props.structures[this.props.selectedLayer].isSubtype &&\r\n this.props.structures[this.props.selectedLayer].classificationSubtype;\r\n\r\n let selection = this.props.tools[this.props.activeTool].mouse({\r\n event: event,\r\n p: p1,\r\n color: this.props.structures[this.props.selectedLayer].color,\r\n subtype: isSubtype,\r\n name: isSubtype\r\n ? this.props.structures[this.props.selectedLayer].label\r\n : \"\",\r\n positionInRoiLayer: false,\r\n fullyLoaded: false,\r\n parentIdx: parentIdx,\r\n selectedId: this.props.structures[this.props.selectedLayer].id,\r\n vw: this.vw,\r\n vh: this.vh,\r\n scale: this.getScale(),\r\n renderer: this,\r\n });\r\n return selection;\r\n };\r\n\r\n getPointInCanvasCoord = (x, y) => {\r\n let pt = {\r\n x: Math.round(x * this.ctx.getTransform().a + this.ctx.getTransform().e),\r\n y: Math.round(y * this.ctx.getTransform().d + this.ctx.getTransform().f),\r\n };\r\n return pt;\r\n };\r\n\r\n getPointInCanvas = (p) => {\r\n try {\r\n let tp = this.ctx.transformedPoint(p.x, p.y);\r\n return {\r\n x: tp.x,\r\n y: tp.y,\r\n };\r\n } catch (ex) {\r\n // Skip this frame\r\n // console.error(ex);\r\n return {\r\n x: -1,\r\n y: -1,\r\n };\r\n }\r\n };\r\n\r\n mousedown = (event) => {\r\n let p1 = this.getMousePositionInImage();\r\n this.mousePos = p1;\r\n this.props.tiles.chainLeaderId = this.props.canvasId;\r\n\r\n if (this.props.tools[this.props.activeTool] && !event.ctrlKey) {\r\n // only drawing on image is allowed\r\n if (p1.x >= 0 && p1.x <= this.vw && p1.y >= 0 && p1.y <= this.vh) {\r\n let selection = this.toolMouseForward(event);\r\n // if tool is selection then save selected roi\r\n if (\r\n this.props.tools[this.props.activeTool].name === \"Selection\" &&\r\n selection\r\n ) {\r\n this.selROI = selection;\r\n this.props.setSelectedRoi(selection);\r\n if (selection.classify) {\r\n this.classifySelectedRoi(selection, true);\r\n }\r\n }\r\n }\r\n } else if (event.button === 0 && !event.ctrlKey) {\r\n if (this.props.activeTool === Tools.RECT_ROI) {\r\n // only drawing on image is allowed\r\n if (p1.x >= 0 && p1.x <= this.vw && p1.y >= 0 && p1.y <= this.vh) {\r\n // create new rectangle in drawing mode\r\n let newROI = new RectROI(this.ctx, p1.x, p1.y, 0, 0, true);\r\n // select new rectangle for resizing\r\n this.resizeROI = newROI;\r\n\r\n // update component state\r\n this.props.onChangeROIs([...this.props.rois, newROI]);\r\n }\r\n } else {\r\n // corner radius of our rectangles\r\n for (let roi of this.props.rois) {\r\n switch (roi.handleMouseDown(p1)) {\r\n case 1: // dragging\r\n this.dragROI = roi;\r\n break;\r\n case 2: // resizing\r\n this.resizeROI = roi;\r\n this.dragROI = null;\r\n return;\r\n default:\r\n // no collision\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // start dragging if middle mouse button is down or not tool selected\r\n if (\r\n event.button === 1 ||\r\n (event.button === 0 && event.ctrlKey) ||\r\n (!this.dragROI &&\r\n !this.resizeROI &&\r\n ![\r\n Tools.MAGICWAND_ROI,\r\n Tools.REGIONGROWING_ROI,\r\n Tools.REGIONGRABCUT_ROI,\r\n Tools.PEN_ROI,\r\n Tools.RectROI,\r\n Tools.REGION_ROI,\r\n Tools.RECTANGLE_ROI,\r\n Tools.COMMENT_ROI,\r\n Tools.ELLIPSE_ROI,\r\n Tools.COPY_ROI,\r\n Tools.FILL,\r\n Tools.SELECTION_ROI,\r\n Tools.GRIDANNOTATIONTOOL,\r\n Tools.LANDMARK,\r\n ].includes(\r\n //deactivate dragging for this tools\r\n this.props.activeTool\r\n ))\r\n ) {\r\n let dragStart = this.getPointInCanvas({ x: this.lastX, y: this.lastY });\r\n this.setMountedState({\r\n dragStart: dragStart,\r\n });\r\n if (this.props.isChained) {\r\n if (this.props.showFullscreen) {\r\n for (const value of Object.values(this.props.splitscreenFileIds)) {\r\n let fDragStart = this.props.rendererDict[\r\n \"Full\" + value\r\n ].getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n this.props.rendererDict[\"Full\" + value].setState({\r\n dragStart: fDragStart,\r\n });\r\n }\r\n } else {\r\n for (const value of Object.values(this.props.chainListFileIds)) {\r\n let fDragStart = this.props.rendererDict[value].getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n this.props.rendererDict[value].setState({\r\n dragStart: fDragStart,\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.canvas.style.cursor = \"move\";\r\n\r\n if ((event.button === 0 || event.button === 1) && event.altKey) {\r\n this.tempChainToggle = true;\r\n\r\n if (this.props.showFullscreen) {\r\n this.props.fsChain();\r\n } else {\r\n this.props.onChangeChain(\r\n false,\r\n this.props.splitscreenIdx,\r\n this.props.fileId\r\n );\r\n }\r\n }\r\n\r\n // dont forward any event upwards\r\n event.preventDefault();\r\n return false;\r\n } else {\r\n if (!this.state.isDrawing) {\r\n this.setMountedState({ isDrawing: true });\r\n }\r\n }\r\n };\r\n\r\n setHeatmapData = (data, maxValue, show = true) => {\r\n this.showHeatmap = show;\r\n let heatmapData = {\r\n max: maxValue,\r\n data: data,\r\n };\r\n this.heatmap.setData(heatmapData);\r\n };\r\n\r\n mouseBusy = () => {\r\n return !this.canvas.style.cursor !== \"default\";\r\n };\r\n\r\n mousemove = (event) => {\r\n if (this.props.resultTab.getZoomLevelFixed()) {\r\n return;\r\n }\r\n let p1 = this.getMousePositionInImage();\r\n if (this.state.isDrawing || this.state.mouseOnCanvas) {\r\n this.mousePos = p1;\r\n } else {\r\n this.middleMousePos();\r\n }\r\n if (this.dragROI) {\r\n // handle roi dragging\r\n this.dragROI.drag(p1, this.vw, this.vh);\r\n } else if (this.resizeROI) {\r\n // resize the roi if inside the image\r\n this.resizeROI.resize(p1, this.vw, this.vh);\r\n } else if (\r\n this.state.dragStart &&\r\n this.props.tiles.chainLeaderId === this.props.canvasId\r\n ) {\r\n // handle canvas dragging\r\n let pt = this.getPointInCanvas({ x: this.lastX, y: this.lastY });\r\n // translate canvas\r\n\r\n this.ctx.translate(\r\n pt.x - this.state.dragStart.x,\r\n pt.y - this.state.dragStart.y\r\n );\r\n if (this.props.isChained) {\r\n if (this.props.showFullscreen) {\r\n for (const value of Object.values(this.props.splitscreenFileIds)) {\r\n let fPt = this.props.rendererDict[\"Full\" + value].getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n this.props.rendererDict[\"Full\" + value].chainMouseDrag(\r\n fPt.x,\r\n fPt.y\r\n );\r\n }\r\n } else {\r\n for (const value of Object.values(this.props.chainListFileIds)) {\r\n let fPt = this.props.rendererDict[value].getPointInCanvas({\r\n x: this.lastX,\r\n y: this.lastY,\r\n });\r\n this.props.rendererDict[value].chainMouseDrag(fPt.x, fPt.y);\r\n }\r\n }\r\n }\r\n this.zoomMoveActionDebounced();\r\n } else if (\r\n this.props.tools[this.props.activeTool] &&\r\n this.props.activeTool !== Tools.LANDMARK\r\n ) {\r\n // only drawing on image is allowed\r\n this.toolMouseForward(event);\r\n } else if (this.props.activeTool === Tools.LANDMARK) {\r\n // handle roi drawing mode\r\n if (p1.x >= 0 && p1.x <= this.vw && p1.y >= 0 && p1.y <= this.vh) {\r\n // only show crosshair if cursor on the image\r\n this.canvas.style.cursor = \"crosshair\";\r\n } else {\r\n this.canvas.style.cursor = \"default\";\r\n }\r\n this.toolMouseForward(event);\r\n } else if (this.props.activeTool === Tools.RECT_ROI) {\r\n // handle roi drawing mode\r\n if (p1.x >= 0 && p1.x <= this.vw && p1.y >= 0 && p1.y <= this.vh) {\r\n // only show crosshair if cursor on the image\r\n this.canvas.style.cursor = \"crosshair\";\r\n } else {\r\n this.canvas.style.cursor = \"default\";\r\n }\r\n } else {\r\n // handle hover events etc.\r\n this.canvas.style.cursor = \"default\";\r\n for (let roi of this.props.rois) {\r\n roi.handleMouseMove(p1);\r\n }\r\n }\r\n this.lastMoveTime = performance.now();\r\n\r\n // redraw screen\r\n //this.forceUpdate();\r\n };\r\n\r\n chainMouseDrag = (x, y) => {\r\n if (this.props.tiles.chainLeaderId !== this.props.canvasId) {\r\n if (this.props.isChained) {\r\n this.ctx.translate(\r\n x - this.state.dragStart.x,\r\n y - this.state.dragStart.y\r\n );\r\n }\r\n }\r\n };\r\n\r\n mouseEnter = () => {\r\n this.setMountedState({ mouseOnCanvas: true });\r\n };\r\n\r\n mouseLeave = () => {\r\n this.setMountedState({ mouseOnCanvas: false });\r\n };\r\n\r\n middleMousePos = () => {\r\n let p1 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p2 = this.getPointInCanvas({\r\n x: this.canvas.width,\r\n y: this.canvas.height,\r\n });\r\n let centerX = p1.x + (p2.x - p1.x) / 2;\r\n let centerY = p1.y + (p2.y - p1.y) / 2;\r\n this.mousePos = { x: centerX, y: centerY };\r\n };\r\n\r\n mouseup = (event) => {\r\n let p1 = this.getMousePositionInImage();\r\n this.mousePos = p1;\r\n\r\n if (\r\n this.props.tools[this.props.activeTool] &&\r\n (this.state.isDrawing || this.props.activeTool === \"gridannotationtool\")\r\n ) {\r\n this.toolMouseForward(event);\r\n this.updateFrameArray();\r\n }\r\n\r\n // stop dragging the canvas\r\n if (this.state.dragStart) {\r\n this.setMountedState({ dragStart: null });\r\n this.canvas.style.cursor = \"default\";\r\n }\r\n\r\n // stop resizing a roi\r\n if (this.resizeROI) {\r\n this.resizeROI.handleMouseUp();\r\n this.resizeROI = null;\r\n }\r\n\r\n // stop dragging a roi\r\n if (this.dragROI) {\r\n this.dragROI.handleMouseUp();\r\n this.dragROI = null;\r\n }\r\n\r\n if (this.state.isDrawing) {\r\n this.setMountedState({ isDrawing: false });\r\n }\r\n\r\n if (this.tempChainToggle) {\r\n this.tempChainToggle = false;\r\n if (this.props.showFullscreen) {\r\n this.props.fsChain();\r\n } else {\r\n this.props.onChangeChain(\r\n true,\r\n this.props.splitscreenIdx,\r\n this.props.fileId\r\n );\r\n }\r\n }\r\n\r\n if (this.state.showResultTable) {\r\n window.updateResultTable();\r\n }\r\n\r\n // update view\r\n this.forceUpdate();\r\n };\r\n\r\n onScaleOnly = (event) => {\r\n let delta = 0;\r\n\r\n if (event.wheelDelta) {\r\n /* IE/Opera. */\r\n delta = -(event.wheelDelta / 120);\r\n } else if (event.detail) {\r\n /* Mozilla */\r\n delta = event.detail / 3;\r\n }\r\n\r\n if (delta) {\r\n // zoom in (1) or out (-1)\r\n this.zoomDirection = delta < 0 ? 1 : -1;\r\n\r\n // set destination scale value\r\n let newZoom = this.getScale() * Math.pow(2, this.zoomDirection);\r\n\r\n // max zoom out value\r\n this.zoomValueOut = (0.75 * this.canvas.height) / this.vh;\r\n\r\n if ((0.75 * this.canvas.width) / this.vw < this.zoomValueOut) {\r\n this.zoomValueOut = (0.75 * this.canvas.width) / this.vw;\r\n }\r\n\r\n if (this.props.isActive === false && this.props.isChained) {\r\n this.zoomValueOut = this.props.showFullscreen\r\n ? this.props.rendererDict[\"Full\" + this.props.activeFileId]\r\n .zoomValueOut\r\n : this.props.rendererDict[this.props.activeFileId].zoomValueOut;\r\n }\r\n\r\n if (newZoom < this.zoomValueOut) {\r\n newZoom = this.zoomValueOut;\r\n }\r\n\r\n // Limit maximum zoom in value\r\n const maxZoomIn = 32;\r\n newZoom = newZoom > maxZoomIn ? maxZoomIn : newZoom;\r\n\r\n this.zoomTo = newZoom;\r\n // redraw ui\r\n this.forceUpdate();\r\n }\r\n\r\n // prevent other scroll actions\r\n if (event.preventDefault) {\r\n event.preventDefault();\r\n }\r\n event.returnValue = false;\r\n };\r\n\r\n mousewheel = (event) => {\r\n // save zoom destination point\r\n this.props.tiles.chainLeaderId = this.props.canvasId;\r\n if (\r\n this.state.initialized &&\r\n !event.ctrlKey &&\r\n !this.props.resultTab.getZoomLevelFixed()\r\n ) {\r\n this.zoomPoint = {\r\n x: this.lastX,\r\n y: this.lastY, // - this.canvas.getBoundingClientRect().top,\r\n };\r\n this.onScaleOnly(event);\r\n }\r\n\r\n if (this.props.isChained) {\r\n if (this.props.showFullscreen) {\r\n for (const value of Object.values(this.props.splitscreenFileIds)) {\r\n this.props.rendererDict[\"Full\" + value].chainMousewheel(\r\n event,\r\n this.zoomPoint\r\n );\r\n }\r\n } else {\r\n for (const value of Object.values(this.props.chainListFileIds)) {\r\n this.props.rendererDict[value].chainMousewheel(event, this.zoomPoint);\r\n }\r\n }\r\n }\r\n event.preventDefault();\r\n };\r\n\r\n chainMousewheel = (event, leaderZoomPoint) => {\r\n // save zoom destination point\r\n if (this.props.tiles.chainLeaderId !== this.props.canvasId) {\r\n if (this.props.isChained) {\r\n if (\r\n this.state.initialized &&\r\n !event.ctrlKey &&\r\n !event.shiftKey &&\r\n !this.props.resultTab.getZoomLevelFixed()\r\n ) {\r\n this.zoomPoint = leaderZoomPoint;\r\n this.onScaleOnly(event);\r\n }\r\n }\r\n event.preventDefault();\r\n } else return;\r\n };\r\n\r\n miniMapZoom = (event, x, y) => {\r\n this.props.tiles.chainLeaderId = this.props.canvasId;\r\n if (\r\n this.state.initialized &&\r\n !event.ctrlKey &&\r\n !this.props.resultTab.getZoomLevelFixed()\r\n ) {\r\n let ctx = this.miniMapRef.getCtx();\r\n let tpt = ctx.transformedPoint(x, y);\r\n let pt = {\r\n x: tpt.x * this.ctx.getTransform().a + this.ctx.getTransform().e,\r\n y: tpt.y * this.ctx.getTransform().d + this.ctx.getTransform().f,\r\n };\r\n pt.x = Math.round(pt.x);\r\n pt.y = Math.round(pt.y);\r\n if (\r\n pt.x < this.canvas.width &&\r\n pt.x > 0 &&\r\n pt.y < this.canvas.height &&\r\n pt.y > 0\r\n ) {\r\n this.zoomPoint = pt;\r\n } else {\r\n return;\r\n }\r\n this.onScaleOnly(event);\r\n }\r\n if (this.props.isChained) {\r\n let l = this.props.showFullscreen\r\n ? this.props.splitscreenFileIds\r\n : this.props.chainListFileIds;\r\n for (const value of Object.values(l)) {\r\n if (value !== this.props.fileId) {\r\n let r = this.props.showFullscreen\r\n ? this.props.rendererDict[\"Full\" + value]\r\n : this.props.rendererDict[value];\r\n let c = r.miniMapRef.getCtx();\r\n let p = c.transformedPoint(x, y);\r\n let pt = {\r\n x: p.x * r.ctx.getTransform().a + r.ctx.getTransform().e,\r\n y: p.y * r.ctx.getTransform().d + r.ctx.getTransform().f,\r\n };\r\n pt.x = Math.round(pt.x);\r\n pt.y = Math.round(pt.y);\r\n if (\r\n pt.x < r.canvas.width &&\r\n pt.x > 0 &&\r\n pt.y < r.canvas.height &&\r\n pt.y > 0\r\n ) {\r\n r.zoomPoint = pt;\r\n } else {\r\n return;\r\n }\r\n r.chainMousewheel(event, pt);\r\n }\r\n }\r\n }\r\n event.preventDefault();\r\n };\r\n\r\n // returns the current zoom scale\r\n getScale = () => {\r\n return this.ctx ? this.ctx.getTransform().a : 1;\r\n };\r\n\r\n // returns position of our image\r\n getPosition = () => {\r\n return {\r\n x: -this.ctx.getTransform().e,\r\n y: -this.ctx.getTransform().f,\r\n };\r\n };\r\n\r\n // zoom out to show the whole image\r\n zoomOut = () => {\r\n // center image first\r\n let pt = this.getPointInCanvas({\r\n x: (this.canvas.width - this.vw) / 2,\r\n y: (this.canvas.height - this.vh) / 2,\r\n });\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc our transformation offset\r\n pt = this.getPointInCanvas({\r\n x: this.canvas.width / 2,\r\n y: this.canvas.height / 2,\r\n });\r\n // move to origin\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc scale factor so we can fit the whole image on our screen\r\n let factor = Math.min(\r\n this.canvas.height / this.vh,\r\n this.canvas.width / this.vw\r\n );\r\n // perform scaling\r\n this.ctx.scale(factor, factor);\r\n // restore our offset\r\n this.ctx.translate(-pt.x, -pt.y);\r\n // save initial scale into our state\r\n this.setMountedState({\r\n initialized: true,\r\n initialScale: factor,\r\n });\r\n this.props.resultTab.setRendererInitialized(true);\r\n };\r\n\r\n moveTo = (e) => {\r\n // get curent position (center of screen) and transform into world coordinates\r\n let pt = this.getPointInCanvas({\r\n x: this.canvas.width / 2,\r\n y: this.canvas.height / 2,\r\n });\r\n // translate by the offset to the destination point\r\n this.ctx.translate(-(e.x - pt.x), -(e.y - pt.y));\r\n // redraw screen\r\n this.forceUpdate();\r\n this.zoomMoveAction();\r\n };\r\n\r\n chainMoveTo = (x, y) => {\r\n // get curent position (center of screen) and transform into world coordinates\r\n let pt = this.getPointInCanvas({\r\n x: this.canvas.width / 2,\r\n y: this.canvas.height / 2,\r\n });\r\n // translate by the offset to the destination point\r\n this.ctx.translate(-(x - pt.x), -(y - pt.y));\r\n // redraw screen\r\n this.forceUpdate();\r\n this.zoomMoveAction();\r\n };\r\n\r\n chainMouseMove = (x, y, e) => {\r\n if (this.props.isChained) {\r\n if (this.props.showFullscreen) {\r\n for (const value of Object.values(this.props.splitscreenFileIds)) {\r\n if (value !== this.props.fileId) {\r\n let ctx =\r\n this.props.rendererDict[\"Full\" + value].miniMapRef.getCtx();\r\n let pt = ctx.transformedPoint(x, y);\r\n this.props.rendererDict[\"Full\" + value].chainMoveTo(pt.x, pt.y, e);\r\n }\r\n }\r\n } else {\r\n for (const value of Object.values(this.props.chainListFileIds)) {\r\n if (value !== this.props.fileId) {\r\n let ctx = this.props.rendererDict[value].miniMapRef.getCtx();\r\n let pt = ctx.transformedPoint(x, y);\r\n this.props.rendererDict[value].chainMoveTo(pt.x, pt.y, e);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n hoverROI = (roi, hovered) => {\r\n // update hovered parameter of roi\r\n roi.hovered = hovered;\r\n // redraw screen\r\n this.forceUpdate();\r\n };\r\n\r\n centerROI = (roi) => {\r\n // center roi\r\n this.moveTo({ x: roi.x - roi.w / 2, y: roi.y - roi.h / 2 });\r\n };\r\n\r\n transformPoint = (x, y, m, tfact) => {\r\n m[2] *= tfact;\r\n m[5] *= tfact;\r\n let a = m[0] * x + m[1] * y + m[2];\r\n let b = m[3] * x + m[4] * y + m[5];\r\n return [a, b];\r\n };\r\n\r\n transformLandmark = (h, tfact) => {\r\n for (let roi of this.props.landmarkLayer.landmarkRois) {\r\n let p = roi.regions;\r\n roi.regions = this.transformPoint(p[0], p[1], h, tfact);\r\n }\r\n };\r\n\r\n transformLandmarkNoOffset = (h, tfact) => {\r\n let m = [];\r\n for (let roi of this.props.landmarkLayer.landmarkRois) {\r\n let p = roi.regions;\r\n m.push(this.transformPoint(p[0], p[1], h, tfact));\r\n }\r\n return m;\r\n };\r\n\r\n transformAnnotation = (h, tfact) => {\r\n for (let struct of this.props.roiLayers) {\r\n let newRegionList = [];\r\n if (struct.layer.regionRois.length > 0) {\r\n for (let roi of struct.layer.regionRois) {\r\n let newRegion = [];\r\n for (let region of roi.regions[0]) {\r\n let point = this.transformPoint(region[0], region[1], h, tfact);\r\n newRegion.push(point);\r\n }\r\n let temp = roi;\r\n temp.regions = newRegion;\r\n let newRoi = new RegionROI(temp);\r\n newRegionList.push(newRoi);\r\n }\r\n struct.tree.clear();\r\n struct.layer.regionRois = newRegionList;\r\n struct.tree.load(newRegionList.map((item) => item.treeItem));\r\n }\r\n }\r\n };\r\n\r\n generateTransformationOffset = (marks) => {\r\n let origCenter = { x: this.vw / 2, y: this.vh / 2 };\r\n\r\n let xValues = [];\r\n let yValues = [];\r\n for (let i = 0; i < marks.length; i++) {\r\n xValues.push(marks[i][0]);\r\n yValues.push(marks[i][1]);\r\n }\r\n let xMin = Math.min(...xValues);\r\n let xMax = Math.max(...xValues);\r\n let yMin = Math.min(...yValues);\r\n let yMax = Math.max(...yValues);\r\n\r\n let bbCenter = { x: xMin + (xMax - xMin) / 2, y: yMin + (yMax - yMin) / 2 };\r\n let offset = { x: origCenter.x - bbCenter.x, y: origCenter.y - bbCenter.y };\r\n return offset;\r\n // return { x: 0, y: 0 };\r\n };\r\n\r\n generateLandmarkTransformation = (\r\n pointBase,\r\n pointShift,\r\n baseId,\r\n targetId,\r\n baseOme\r\n ) => {\r\n calculateTransformationMatrix(\r\n pointBase,\r\n pointShift,\r\n this.props.ome,\r\n baseId,\r\n targetId,\r\n baseOme,\r\n (h, tfact) => {\r\n let marks = this.transformLandmarkNoOffset(h, 1);\r\n let tOffset = this.generateTransformationOffset(marks);\r\n h[2] += tOffset.x;\r\n h[5] += tOffset.y;\r\n let offset = [];\r\n offset.push(tOffset.x);\r\n offset.push(tOffset.y);\r\n this.transformLandmark(h, 1);\r\n this.transformAnnotation(h, 1);\r\n this.props.tiles.setTransformationMatnFactnOff(\r\n h,\r\n this.props.fileId,\r\n tfact,\r\n offset\r\n );\r\n this.reset();\r\n }\r\n );\r\n };\r\n\r\n pushRegTile = (tileId, colImg, channel) => {\r\n let mat = this.props.tiles.getTransformationMatrix(this.props.fileId);\r\n let fact = this.props.tiles.getTransformationFactor(this.props.fileId);\r\n if (Array.isArray(mat)) {\r\n if (mat.length > 0) {\r\n this.imgRegistered = false;\r\n this.callbackCounter += 1;\r\n if (this.state.isLoadingTiles === false) {\r\n this.setMountedState({ isLoadingTiles: true });\r\n }\r\n var t0 = performance.now();\r\n tileRegistration(colImg, tileId, mat, fact, channel, (Img) => {\r\n this.props.tiles.pushColoredImages(Img, tileId);\r\n var t1 = performance.now();\r\n console.log(\"Tile registration took \", t1 - t0, \" ms.\");\r\n if (mat.length === 0) {\r\n console.log(\"empty mat\");\r\n }\r\n this.callbackCounter -= 1;\r\n if (this.callbackCounter === 0) {\r\n this.imgRegistered = true;\r\n this.setMountedState({ isLoadingTiles: false });\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n pushColoredImage = (c, tileId, visImg) => {\r\n let channel = this.props.histogramConfig.channels[c];\r\n if (\r\n (this.props.histogramConfig.channels.length < 2 &&\r\n channel.color === \"#ffffff\") ||\r\n channel.color === -1\r\n ) {\r\n // rgb channel\r\n if (!this.props.tiles.getColoredImage(tileId)) {\r\n let colImg = configureImage(visImg, channel);\r\n this.props.tiles.pushColoredImages(colImg, tileId);\r\n this.pushRegTile(tileId, visImg, channel);\r\n }\r\n } else {\r\n // colored images cache\r\n if (!this.props.tiles.getColoredImage(tileId) && visImg.width > 0) {\r\n let colImg = colorInImage(visImg, channel);\r\n this.props.tiles.pushColoredImages(colImg, tileId);\r\n this.pushRegTile(tileId, visImg, channel);\r\n }\r\n }\r\n };\r\n\r\n loadAllTiles = () => {\r\n for (let lv = 0; lv < Math.min(2, this.props.ome.maxLevel + 1); lv++) {\r\n // calculate the number of grid columns for this level\r\n let cols = Math.pow(2, lv);\r\n for (let x = 0; x < cols; x++) {\r\n for (let y = 0; y < cols; y++) {\r\n for (let c = 0; c < this.props.ome.channels.length; c++) {\r\n let page = this.getPageForChannel(c);\r\n // load image first if missing\r\n let tileId =\r\n page + \",\" + lv + \",\" + x + \",\" + y + \",\" + this.props.fileId;\r\n if (!this.props.tiles.getVisibleImage(tileId)) {\r\n let visImg = new Image();\r\n visImg.src = Backend.renderRegion({\r\n id: this.props.fileId,\r\n page: page,\r\n lv: lv,\r\n x: x,\r\n y: y,\r\n });\r\n visImg.onload = () => {\r\n this.pushColoredImage(c, tileId, visImg);\r\n this.props.tiles.pushVisibleImage(visImg, tileId);\r\n // set context width and height\r\n this.props.tiles.setImgWidth(visImg.width);\r\n this.props.tiles.setImgHeight(visImg.height);\r\n };\r\n } else if (this.props.tiles.getVisibleImage(tileId).complete) {\r\n // set context width and height\r\n let img = this.props.tiles.getVisibleImage(tileId);\r\n this.props.tiles.setImgWidth(img.width);\r\n this.props.tiles.setImgHeight(img.height);\r\n this.pushColoredImage(\r\n c,\r\n tileId,\r\n this.props.tiles.getVisibleImage(tileId)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.preloadNextFrames();\r\n\r\n this.props.changeHiConfig(true);\r\n this.props.tiles.setHistogramConfig(this.props.histogramConfig);\r\n };\r\n\r\n preloadNextFrames = () => {\r\n if (this.state.playDirection > 0) {\r\n for (\r\n let t = this.state.t;\r\n t <\r\n Math.min(\r\n this.props.ome.sizeT - 1,\r\n this.state.t + this.state.bufferSize\r\n );\r\n t++\r\n ) {\r\n this.preloadFrame(this.state.z, t);\r\n }\r\n } else {\r\n for (\r\n let t = this.state.t;\r\n t >= Math.max(0, this.state.t - this.state.bufferSize);\r\n t--\r\n ) {\r\n this.preloadFrame(this.state.z, t);\r\n }\r\n }\r\n };\r\n\r\n preloadNextZFrames = () => {\r\n if (this.state.playDirectionZ > 0) {\r\n for (\r\n let z = this.state.z;\r\n z <\r\n Math.min(\r\n this.props.ome.sizeZ - 1,\r\n this.state.z + this.state.bufferSize\r\n );\r\n z++\r\n ) {\r\n this.preloadFrame(z, this.state.t);\r\n }\r\n } else {\r\n for (\r\n let z = this.state.z;\r\n z >= Math.max(0, this.state.z - this.state.bufferSize);\r\n z--\r\n ) {\r\n this.preloadFrame(z, this.state.t);\r\n }\r\n }\r\n };\r\n\r\n preloadFrame = (z, t) => {\r\n for (let lv = 0; lv < 1; lv++) {\r\n // calculate the number of grid columns for this level\r\n let cols = Math.pow(2, lv);\r\n for (let x = 0; x < cols; x++) {\r\n for (let y = 0; y < cols; y++) {\r\n for (let c = 0; c < this.props.ome.channels.length; c++) {\r\n let page = this.getPage(c, z, t);\r\n // load image first if missing\r\n let tileId =\r\n page + \",\" + lv + \",\" + x + \",\" + y + \",\" + this.props.fileId;\r\n if (!this.props.tiles.getVisibleImage(tileId)) {\r\n let visImg = new Image();\r\n visImg.src = Backend.renderRegion({\r\n id: this.props.fileId,\r\n page: page,\r\n lv: lv,\r\n x: x,\r\n y: y,\r\n });\r\n visImg.onload = () => {\r\n this.pushColoredImage(c, tileId, visImg);\r\n };\r\n } else if (this.props.tiles.getVisibleImage(tileId).complete) {\r\n this.pushColoredImage(\r\n c,\r\n tileId,\r\n this.props.tiles.getVisibleImage(tileId)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n zoomToFactor = (factor) => {\r\n let scaleTarget = this.state.initialScale * factor;\r\n this.zoomTo = scaleTarget;\r\n this.zoomPoint = { x: this.canvas.width / 2, y: this.canvas.height / 2 };\r\n this.zoomDirection =\r\n this.getScale() < scaleTarget ? scaleTarget : -scaleTarget;\r\n\r\n setTimeout(() => this.forceUpdate(), 10);\r\n };\r\n\r\n zoomOriginal = () => {\r\n // no zooming enabled\r\n if (\r\n this.props.resultTab.getZoomLevelFixed() &&\r\n this.props.resultTabActive()\r\n ) {\r\n return;\r\n }\r\n\r\n this.zoomOneToN(1);\r\n };\r\n\r\n zoomOneToN = (x) => {\r\n // no zooming enabled\r\n if (\r\n this.props.resultTab.getZoomLevelFixed() &&\r\n this.props.resultTabActive()\r\n ) {\r\n return;\r\n }\r\n\r\n this.zoomTo = x;\r\n this.zoomPoint = { x: this.canvas.width / 2, y: this.canvas.height / 2 };\r\n this.zoomDirection = this.getScale() < x ? 1 : -1;\r\n\r\n setTimeout(() => this.forceUpdate(), 10);\r\n };\r\n\r\n zoomDelta = (delta) => {\r\n // no zooming enabled\r\n if (\r\n this.props.resultTab.getZoomLevelFixed() &&\r\n this.props.resultTabActive()\r\n ) {\r\n return;\r\n }\r\n\r\n // zoom middle\r\n this.zoomPoint = { x: this.canvas.width / 2, y: this.canvas.height / 2 };\r\n // zoom in (1) or out (-1)\r\n this.zoomDirection = delta < 0 ? 1 : -1;\r\n\r\n // set destination scale value\r\n let newZoom = this.getScale() * Math.pow(1.2, this.zoomDirection);\r\n\r\n // max zoom out value\r\n if (newZoom < (0.75 * this.canvas.height) / this.vh) {\r\n newZoom = (0.75 * this.canvas.height) / this.vh;\r\n }\r\n\r\n // max zoom in value\r\n if (newZoom > (2 * this.vh) / this.canvas.height) {\r\n newZoom = (2 * this.vh) / this.canvas.height;\r\n }\r\n\r\n this.zoomTo = newZoom;\r\n\r\n // redraw ui\r\n this.forceUpdate();\r\n };\r\n\r\n zoomFit = () => {\r\n // no zooming enabled\r\n if (\r\n this.props.resultTab.getZoomLevelFixed() &&\r\n this.props.resultTabActive()\r\n ) {\r\n return;\r\n }\r\n\r\n this.canvasTranform(1, 0, 0, 1, 0, 0);\r\n this.zoomOut();\r\n this.zoomMoveActionDebounced(); //to save zoomObject\r\n };\r\n\r\n /**\r\n * Performs a context.setTransform, whilst ensuring that the pixel\r\n * representation is according to zoomlevel\r\n * @param {*} a Horizontal scaling. A value of 1 results in no scaling.\r\n * @param {*} b Vertical skewing.\r\n * @param {*} c Horizontal skewing.\r\n * @param {*} d Vertical scaling. A value of 1 results in no scaling.\r\n * @param {*} e Horizontal translation (moving).\r\n * @param {*} f Vertical translation (moving).\r\n */\r\n canvasTranform = (a, b, c, d, e, f) => {\r\n // disable smoothing to see pixels of image\r\n if (this.getScale() > 5) {\r\n this.ctx.imageSmoothingEnabled = false;\r\n } else {\r\n this.ctx.imageSmoothingEnabled = true;\r\n }\r\n // console.debug(this.getScale());\r\n // Actual transformation\r\n this.ctx.setTransform(a, b, c, d, e, f);\r\n };\r\n\r\n centerRoi = (rect) => {\r\n const { roiLayers, selectedLayer, project } = this.props;\r\n // make roi/rect in center of screen\r\n if (this.state.initialized) {\r\n // if change file in histo classification or point counting module\r\n if (!rect) {\r\n let selRoi = this.props.resultTab.getSelectedRoi();\r\n rect = roiLayers[selectedLayer].layer.regionRois[selRoi].bounds;\r\n let toolName = \"none\";\r\n if (project.type.includes(\"HistoClassification\")) {\r\n toolName = \"selectiontile\";\r\n } else if (project.type.includes(\"HistoPointCounting\")) {\r\n toolName = \"pointcountingtile\";\r\n }\r\n this.props.onChangeTool(toolName);\r\n\r\n let roiItem = {\r\n maxX: roiLayers[selectedLayer].layer.regionRois[selRoi].bounds.left,\r\n maxY: roiLayers[selectedLayer].layer.regionRois[selRoi].bounds.top,\r\n minX: roiLayers[selectedLayer].layer.regionRois[selRoi].bounds.right,\r\n minY: roiLayers[selectedLayer].layer.regionRois[selRoi].bounds.bottom,\r\n roi: roiLayers[selectedLayer].layer.regionRois[selRoi],\r\n };\r\n\r\n this.props.tools[toolName].setNextTile(roiItem);\r\n\r\n // zoom to corresponding zoom level\r\n if (\r\n project.type.includes(\"HistoClassification\") ||\r\n project.type.includes(\"HistoPointCounting\")\r\n ) {\r\n let gridSize = Math.sqrt(\r\n roiLayers[selectedLayer].layer.regionRois.length\r\n );\r\n this.setZoomLevelForGridSize(gridSize);\r\n }\r\n }\r\n\r\n let xKoord = (rect.left + rect.right) / 2; // x- and y-coordinate for zoomPoint\r\n let yKoord = (rect.top + rect.bottom) / 2;\r\n let pt1 = { x: xKoord, y: yKoord };\r\n\r\n // make roi in center of screen:\r\n let pt2 = pt1;\r\n this.ctx.translate(\r\n this.getPositionInImage(2).x - pt2.x,\r\n this.getPositionInImage(2).y - pt2.y\r\n );\r\n } else {\r\n setTimeout(() => this.centerRoi(rect), 400);\r\n }\r\n this.zoomMoveActionDebounced();\r\n };\r\n\r\n zoomInRoi = () => {\r\n // make roi in center of screen\r\n if (this.props.zoomROI && this.state.initialized) {\r\n let xKoord = (this.props.zoomLeft + this.props.zoomRight) / 2; // x- and y-coordinate for zoomPoint\r\n let yKoord = (this.props.zoomTop + this.props.zoomBottom) / 2;\r\n let pt1 = {\r\n x: xKoord,\r\n y: yKoord,\r\n };\r\n\r\n // make roi in center of screen:\r\n let pt2 = pt1;\r\n this.ctx.translate(\r\n this.getPositionInImage(2).x - pt2.x,\r\n this.getPositionInImage(2).y - pt2.y\r\n );\r\n\r\n // zoom to roi:\r\n while (\r\n this.getPositionInImage(0).x < this.props.zoomLeft &&\r\n this.getPositionInImage(1).x > this.props.zoomRight &&\r\n this.getPositionInImage(0).y < this.props.zoomTop &&\r\n this.getPositionInImage(1).y > this.props.zoomBottom\r\n ) {\r\n // as long as roi is completely inside\r\n this.ctx.translate(pt1.x, pt1.y);\r\n let factor = Math.pow(20, 40 / 1000);\r\n this.ctx.scale(factor, factor);\r\n this.ctx.translate(-pt1.x, -pt1.y);\r\n }\r\n\r\n //this.props.zoomROI1(1);\r\n this.props.tzoomROI1(this.props.fileId);\r\n this.zoomMoveActionDebounced();\r\n }\r\n };\r\n\r\n //set structureIds if not set in first roi of\r\n setStructureIds = () => {\r\n for (let i = 1; i < this.props.roiLayers.length; i++) {\r\n let regionRois = this.props.roiLayers[i].layer.regionRois;\r\n let structure = this.props.structures[i];\r\n if (regionRois.length > 0 && regionRois[0].structureId === 0) {\r\n this.props.roiLayers[i].layer.regionRois = regionRois.map((roi) => {\r\n roi.structureId = structure.id;\r\n return roi;\r\n });\r\n }\r\n }\r\n };\r\n\r\n setSubtypeRois = () => {\r\n // check if rois are in subtype roilayer (e.g. opening project or run iam) --> put in parent roilayer\r\n // get all childstructures\r\n let childStructures = [];\r\n for (let i = 0; i < this.props.structures.length; i++) {\r\n if (\r\n this.props.structures[i].isSubtype &&\r\n this.props.structures[i].classificationSubtype\r\n ) {\r\n childStructures.push(i);\r\n }\r\n }\r\n\r\n // make childrois in parentlayer\r\n for (let i = 0; i < this.props.structures.length; i++) {\r\n if (\r\n this.props.roiLayers &&\r\n this.findRoiLayer(this.props.roiLayers, this.props.structures[i]).layer\r\n .regionRois.length !== 0 &&\r\n childStructures.includes(i)\r\n ) {\r\n let layer = [];\r\n let strs = this.props.structures;\r\n\r\n // get parentlayer rois\r\n let parentIndex = getParentIndexLayer(\r\n this.props.structures[i],\r\n this.props.structures\r\n );\r\n let parentLayerRois =\r\n this.props.roiLayers[parentIndex].layer.regionRois;\r\n\r\n this.props.roiLayers[i].layer.regionRois.forEach(function (element) {\r\n // check if object exists in parent layer\r\n let doubleObject = false;\r\n let doubleObjectIndex = 0;\r\n parentLayerRois.forEach(function (parentRoi, idx) {\r\n if (\r\n parentRoi.bounds.left === element.bounds.left &&\r\n parentRoi.bounds.top === element.bounds.top &&\r\n parentRoi.bounds.right === element.bounds.right &&\r\n parentRoi.bounds.bottom === element.bounds.bottom\r\n ) {\r\n doubleObject = true;\r\n doubleObjectIndex = idx;\r\n }\r\n });\r\n\r\n // set element properties\r\n element.subtypeName = strs[i].label;\r\n element.color = strs[i].color;\r\n element.structureId = strs[i].id;\r\n element.isSubtype = true;\r\n\r\n if (!doubleObject) {\r\n // add to new layer that gets appended at end of parent\r\n layer.push(element);\r\n } else {\r\n // replace element in parent layer with this element\r\n parentLayerRois.splice(doubleObjectIndex, 1, element);\r\n }\r\n });\r\n\r\n // make childlayer empty and put child rois in parentlayer\r\n let arrayA = parentLayerRois;\r\n let newArray = arrayA.concat(layer);\r\n this.props.roiLayers[parentIndex].layer.regionRois = newArray;\r\n this.props.roiLayers[i].layer.regionRois = [];\r\n // build tree for parent\r\n this.props.roiLayers[parentIndex].tree = new RBush();\r\n for (let regionRoi of newArray) {\r\n this.props.roiLayers[parentIndex].tree.insert(regionRoi.treeItem);\r\n }\r\n this.props.roiLayers[i].tree = new RBush();\r\n }\r\n }\r\n };\r\n\r\n // triggered by moving or zooming\r\n zoomMoveAction = () => {\r\n const p1 = this.getPointInCanvas({ x: 0, y: 0 });\r\n const p2 = this.getPointInCanvas({\r\n x: this.canvas.width,\r\n y: this.canvas.height,\r\n });\r\n // save current zoom and position for reload\r\n const zoomObject = {\r\n zoomRoi: true,\r\n zoomLeft: p1.x,\r\n zoomRight: p1.x + p2.x - p1.x,\r\n zoomTop: p1.y,\r\n zoomBottom: p1.y + p2.y - p1.y,\r\n };\r\n if (!this.props.showFullscreen) {\r\n this.props.persistentStorage.save(\r\n \"zoomObject\" + this.props.fileId,\r\n zoomObject\r\n );\r\n }\r\n };\r\n\r\n zoomMoveActionDebounced = debounce(this.zoomMoveAction, 100);\r\n\r\n moveAnnotations = () => {\r\n for (let struct of this.props.roiLayers) {\r\n let newRegionList = [];\r\n if (struct.layer.regionRois.length > 0) {\r\n for (let roi of struct.layer.regionRois) {\r\n let newRegion = [];\r\n for (let region of roi.regions[0]) {\r\n let point = [region[0] + 1, region[1] - 0.5];\r\n newRegion.push(point);\r\n }\r\n let newRoi = new RegionROI(newRegion);\r\n newRegionList.push(newRoi);\r\n }\r\n struct.tree.clear();\r\n struct.layer.regionRois = newRegionList;\r\n struct.tree.load(newRegionList.map((item) => item.treeItem));\r\n }\r\n }\r\n };\r\n\r\n updateZ = (z, minZ = this.state.minZ, maxZ = this.state.maxZ) => {\r\n this.setMountedState({ z: z, minZ: minZ, maxZ: maxZ });\r\n this.props.updateGlobalZ(z, minZ, maxZ);\r\n };\r\n\r\n updateT = (t) => {\r\n this.setMountedState({ t: t });\r\n this.props.updateGlobalT(t);\r\n };\r\n\r\n drawVisibleImage = () => {\r\n this.zoomInRoi(); // zoom to roi if middle mouse button clicked on gallery image\r\n this.setStructureIds(); //set structureIds if first one is 0 and not base roi\r\n this.setSubtypeRois(); // set subtypes if iam is finished\r\n\r\n // calc deltatime for animations and fps\r\n let t1 = performance.now();\r\n let dt = t1 - this.t0;\r\n this.t0 = t1;\r\n\r\n // calc smoothed fps\r\n this.lastFps.pop();\r\n this.lastFps = [1000 / dt, ...this.lastFps];\r\n this.fps = Math.round(\r\n this.lastFps.reduce((acc, val) => (acc += val)) / this.lastFps.length\r\n );\r\n if (FPS) {\r\n this.setMountedState({\r\n fps: this.fps,\r\n });\r\n }\r\n\r\n // time playback\r\n if (this.state.playing) {\r\n let newT =\r\n this.state.t + (dt / 60000) * this.state.sr * this.state.playDirection;\r\n if (newT >= this.props.ome.sizeT) {\r\n newT = 0;\r\n } else if (newT < 0) {\r\n newT = this.props.ome.sizeT - 0.001;\r\n }\r\n this.updateT(newT);\r\n this.preloadNextFrames();\r\n }\r\n\r\n // time playback\r\n if (this.state.playingZ) {\r\n let newZ =\r\n this.state.z +\r\n (dt / 60000) * this.state.zsr * this.state.playDirectionZ;\r\n if (newZ > this.props.ome.sizeZ - 1) {\r\n newZ = 0;\r\n } else if (newZ < 0) {\r\n newZ = this.props.ome.sizeZ - 1;\r\n } else {\r\n newZ = newZ < 0 ? this.props.ome.sizeZ - 1 : newZ;\r\n }\r\n this.updateZ(newZ);\r\n this.preloadNextZFrames();\r\n }\r\n\r\n // nothing to draw if we haven't loaded our meta data yet\r\n if ((!this.props.ome || !this.canvas) && this.keepRendering) {\r\n // request next animation frame\r\n requestAnimationFrame(() => this.draw());\r\n return;\r\n }\r\n\r\n // call the initialization if the viewer is not initalized yet\r\n if (!this.state.initialized) {\r\n // do we have our top region already loaded? (then -> this.vw is greater 0)\r\n if (this.imgLoaded && this.imgRegistered) {\r\n // do initial placement\r\n this.zoomOut();\r\n } else {\r\n this.loadAllTiles();\r\n }\r\n }\r\n\r\n // only set z once\r\n if (!this.state.initializedZ) {\r\n let z = this.props.persistentStorage.load(\"z\");\r\n if (typeof z === \"undefined\") {\r\n z = Math.floor(this.props.ome.sizeZ / 2);\r\n }\r\n let minZ = this.props.persistentStorage.load(\"minZ\");\r\n if (typeof minZ === \"undefined\") {\r\n minZ = 0;\r\n }\r\n let maxZ = this.props.persistentStorage.load(\"maxZ\");\r\n if (typeof maxZ === \"undefined\") {\r\n maxZ = this.props.ome.sizeZ - 1;\r\n }\r\n this.updateZ(z, minZ, maxZ);\r\n this.props.tiles.setZLevel(Math.floor(this.props.ome.sizeZ / 2));\r\n this.setMountedState({\r\n minZ,\r\n maxZ,\r\n initializedZ: true,\r\n });\r\n }\r\n\r\n if (this.zoomTo) {\r\n if (typeof this.zoomPoint === \"undefined\") {\r\n this.zoomPoint = { x: this.lastX, y: this.lastY };\r\n }\r\n if (this.zoomDirection > 0 && this.getScale() < this.zoomTo) {\r\n // zoom in\r\n // calc our transformation offset\r\n let pt = this.getPointInCanvas({\r\n x: this.zoomPoint.x,\r\n y: this.zoomPoint.y,\r\n });\r\n\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc scale factor (zoom per second)\r\n let factor = Math.pow(20, 40 / 1000);\r\n // perform scaling\r\n this.ctx.scale(factor, factor);\r\n if (this.getScale() > this.zoomTo) {\r\n this.canvasTranform(\r\n this.zoomTo,\r\n this.ctx.getTransform().b,\r\n this.ctx.getTransform().c,\r\n this.zoomTo,\r\n this.ctx.getTransform().e,\r\n this.ctx.getTransform().f\r\n );\r\n }\r\n // restore our offset\r\n this.ctx.translate(-pt.x, -pt.y);\r\n // update screen, update scalebar etc\r\n this.updatePreviewRect(this.props.activeTool);\r\n this.zoomMoveActionDebounced();\r\n } else if (this.zoomDirection < 0 && this.getScale() > this.zoomTo) {\r\n // zoom out\r\n // calc our transformation offset\r\n let pt = this.getPointInCanvas({\r\n x: this.zoomPoint.x,\r\n y: this.zoomPoint.y,\r\n });\r\n this.ctx.translate(pt.x, pt.y);\r\n // calc scale factor (zoom per second)\r\n let factor = Math.pow(20, -40 / 1000);\r\n // perform scaling\r\n this.ctx.scale(factor, factor);\r\n\r\n if (this.getScale() < this.zoomTo) {\r\n this.canvasTranform(\r\n this.zoomTo,\r\n this.ctx.getTransform().b,\r\n this.ctx.getTransform().c,\r\n this.zoomTo,\r\n this.ctx.getTransform().e,\r\n this.ctx.getTransform().f\r\n );\r\n }\r\n // restore our offset\r\n this.ctx.translate(-pt.x, -pt.y);\r\n // update screen, update scalebar etc\r\n\r\n this.updatePreviewRect(this.props.activeTool);\r\n this.zoomMoveActionDebounced();\r\n } else {\r\n // we reached the destination zoom level\r\n this.zoomTo = null;\r\n }\r\n }\r\n\r\n // get world size from ome metadata\r\n this.vw = this.props.ome.sizeX;\r\n this.vh = this.props.ome.sizeY;\r\n\r\n // Clear the entire canvas\r\n let p1 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p2 = this.getPointInCanvas({\r\n x: this.canvas.width,\r\n y: this.canvas.height,\r\n });\r\n this.ctx.clearRect(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y);\r\n this.ctx.save();\r\n this.canvasTranform(1, 0, 0, 1, 0, 0);\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n this.ctx.restore();\r\n\r\n this.ctx.fillStyle = \"#000\";\r\n this.ctx.fillRect(0, 0, this.vw, this.vh);\r\n\r\n // get pyramid level based on scaling\r\n this.level = getBaseLog(2, (this.getScale() / this.state.initialScale) * 2);\r\n // clip our level at lower bound\r\n if (this.level < 0 || this.level === Infinity) {\r\n this.level = 0;\r\n }\r\n // clip our level at upper bound\r\n if (this.level > this.props.ome.maxLevel) {\r\n this.level = this.props.ome.maxLevel;\r\n }\r\n\r\n let lv = Math.floor(this.level);\r\n\r\n // calculate the number of grid columns for this level\r\n let cols = Math.pow(2, lv);\r\n\r\n // get visbile column indices\r\n let visX = [];\r\n for (let i = 0; i < cols; i++) {\r\n if (\r\n this.getPosition().x / this.getScale() < this.vw * ((i + 1) / cols) &&\r\n (this.getPosition().x + this.canvas.width) / this.getScale() >\r\n this.vw * (i / cols)\r\n ) {\r\n visX.push(i);\r\n }\r\n }\r\n // out of bounds, add first region\r\n if (visX.length === 0) visX.push(0);\r\n\r\n // get visbile row indices\r\n let visY = [];\r\n for (let i = 0; i < cols; i++) {\r\n if (\r\n this.getPosition().y / this.getScale() < this.vh * ((i + 1) / cols) &&\r\n (this.getPosition().y + this.canvas.height) / this.getScale() >\r\n this.vh * (i / cols)\r\n ) {\r\n visY.push(i);\r\n }\r\n }\r\n // out of bounds, add first region\r\n if (visY.length === 0) visY.push(0);\r\n\r\n for (let x of visX) {\r\n for (let y of visY) {\r\n //let page = this.getPage();\r\n //for(let page = 0; page < this.props.histogramConfig.channels.length; page++) {\r\n for (let c = 0; c < this.props.histogramConfig.channels.length; c++) {\r\n let page = this.getPageForChannel(c);\r\n let channel = this.props.histogramConfig.channels[c];\r\n\r\n // skip disabled channels\r\n if (!channel.enabled) continue;\r\n // file +tile id im string\r\n // load image first if missing\r\n let tileId =\r\n page + \",\" + lv + \",\" + x + \",\" + y + \",\" + this.props.fileId;\r\n if (\r\n this.zoomTo == null &&\r\n !this.props.tiles.getVisibleImage(tileId) &&\r\n !this.state.isLoadingTiles &&\r\n !this.props.changingFile\r\n /// TODO: Commented out to fix splitscreen, why has it been added originally?\r\n //&& this.props.tiles.getFileId() === this.props.fileId\r\n ) {\r\n let visImg = new Image();\r\n visImg.src = Backend.renderRegion({\r\n id: this.props.fileId,\r\n page: page,\r\n lv: lv,\r\n x: x,\r\n y: y,\r\n });\r\n this.props.tiles.pushVisibleImage(visImg, tileId);\r\n }\r\n\r\n let img = this.props.tiles.getVisibleImage(tileId);\r\n this.imgLoaded = img && img.complete;\r\n // see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\r\n const compositionModeFluor = \"screen\";\r\n const compositionModeBrightfield = \"lighter\";\r\n if (this.imgLoaded && this.imgRegistered) {\r\n // image is loaded -> draw it\r\n this.pushColoredImage(c, tileId, img);\r\n\r\n if (\r\n tileId.includes(this.props.activeFileId) &&\r\n (this.props.tiles.getImgWidth() !== img.width ||\r\n this.props.tiles.getImgHeight() !== img.height)\r\n ) {\r\n // set context width and height (for splitscreen and gallery)\r\n this.props.tiles.setImgWidth(img.width);\r\n this.props.tiles.setImgHeight(img.height);\r\n }\r\n\r\n // composition should be screen for fluorescence\r\n if (this.props.ome.channels[c].type === \"fluorescence\") {\r\n this.ctx.globalCompositeOperation = compositionModeFluor;\r\n } else {\r\n this.ctx.globalCompositeOperation = compositionModeBrightfield;\r\n }\r\n if (\r\n Object.prototype.toString.call(\r\n this.props.tiles.getColoredImage(tileId)\r\n ) === \"[object HTMLCanvasElement]\" &&\r\n this.props.tiles.getColoredImage(tileId)\r\n ) {\r\n // draw colored image layer\r\n this.ctx.drawImage(\r\n this.props.tiles.getColoredImage(tileId),\r\n (x * this.vw) / cols,\r\n (y * this.vh) / cols,\r\n this.vw / cols,\r\n this.vh / cols\r\n );\r\n }\r\n } else {\r\n // draw image of previus pyramid level instead\r\n let factor = 1;\r\n let parentlv = lv;\r\n while (parentlv > 0) {\r\n parentlv--;\r\n factor *= 2;\r\n // get id of that image\r\n tileId =\r\n page +\r\n \",\" +\r\n parentlv +\r\n \",\" +\r\n Math.floor(x / factor) +\r\n \",\" +\r\n Math.floor(y / factor) +\r\n \",\" +\r\n this.props.fileId;\r\n\r\n // image is loaded -> draw it\r\n let imgOld = this.props.tiles.getVisibleImage(tileId);\r\n\r\n if (imgOld && imgOld.complete) {\r\n this.pushColoredImage(c, tileId, imgOld);\r\n\r\n // composition should be screen for fluorescence\r\n // see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\r\n this.ctx.globalCompositeOperation = compositionModeFluor;\r\n // draw colored image layer\r\n if (this.props.tiles.getColoredImage(tileId)) {\r\n this.ctx.drawImage(\r\n this.props.tiles.getColoredImage(tileId),\r\n ((x % factor) * imgOld.width) / factor,\r\n ((y % factor) * imgOld.height) / factor,\r\n imgOld.width / factor,\r\n imgOld.height / factor,\r\n (x * this.vw) / cols,\r\n (y * this.vh) / cols,\r\n this.vw / cols,\r\n this.vh / cols\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // back to default overlay composition operation\r\n // see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\r\n this.ctx.globalCompositeOperation = \"source-over\";\r\n };\r\n\r\n draw = () => {\r\n if (this.objectMode && this.props.activeTool !== \"rectangle\") {\r\n //deactivate if tool not active anymore\r\n this.objectMode = false;\r\n }\r\n const opacity = this.props.opacity;\r\n // let roiIdx = 1;\r\n if (this.state.previewRectChanged) {\r\n this.updatePreviewRect(this.props.activeTool);\r\n }\r\n\r\n this.drawVisibleImage();\r\n\r\n let p1 = this.getPointInCanvas({ x: 0, y: 0 });\r\n let p2 = this.getPointInCanvas({\r\n x: this.canvas.width,\r\n y: this.canvas.height,\r\n });\r\n\r\n // draw pixel annotation layer\r\n this.ctx.globalAlpha = 0.5;\r\n this.ctx.lineWidth = 1 / this.ctx.getTransform().a;\r\n const scaleFactor = 1 / this.ctx.getTransform().a;\r\n let drawLayer = this.props.drawLayer;\r\n let commentLayer = this.props.commentLayer;\r\n let landmarkLayer = this.props.landmarkLayer;\r\n const maxGeometries = 15000;\r\n if (!this.state.limitVisibleRegions) {\r\n const roiCount = this.props.roiLayers.reduce(\r\n (a, b) => a + b.layer.regionRois.length,\r\n 0\r\n );\r\n if (roiCount > maxGeometries) {\r\n this.setMountedState({ limitVisibleRegions: true });\r\n }\r\n }\r\n\r\n for (let l = 0; l < this.props.structures.length; l++) {\r\n let structure = this.props.structures[l];\r\n const roiLayer = this.props.roiLayers.find((c) => c.id === structure.id);\r\n if (typeof roiLayer === \"undefined\") {\r\n console.log(\"undefined layer found for roiLayer id\", structure.id);\r\n continue;\r\n }\r\n\r\n let parentIndex = getParentIndexLayer(structure, this.props.structures);\r\n\r\n let rr = roiLayer.layer;\r\n let rRoi = {\r\n regionRois: [],\r\n inverted: false,\r\n };\r\n\r\n let centerX = p1.x + (p2.x - p1.x) / 2;\r\n let centerY = p1.y + (p2.y - p1.y) / 2;\r\n\r\n let visibleRegions = [];\r\n if (this.state.limitVisibleRegions) {\r\n if (this.updateCounter > 5) {\r\n if (this.fps < 10) {\r\n this.visibleRegionsRadius = this.visibleRegionsRadius * 0.98;\r\n } else if (this.fps > 20) {\r\n this.visibleRegionsRadius += 10;\r\n }\r\n this.updateCounter = 0;\r\n }\r\n this.updateCounter += 1;\r\n let serachParams = {\r\n minX: centerX - this.visibleRegionsRadius,\r\n minY: centerY - this.visibleRegionsRadius,\r\n maxX: centerX + this.visibleRegionsRadius,\r\n maxY: centerY + this.visibleRegionsRadius,\r\n };\r\n let sarchLayer = structure.isSubtype\r\n ? this.props.roiLayers[parentIndex]\r\n : roiLayer;\r\n visibleRegions = sarchLayer.tree\r\n .search(serachParams)\r\n .map((treeItem) => treeItem.roi);\r\n } else {\r\n visibleRegions = structure.isSubtype\r\n ? this.props.roiLayers[parentIndex].layer.regionRois\r\n : roiLayer.layer.regionRois;\r\n }\r\n\r\n let structureHasRois = false;\r\n if (!structure.isSubtype || !structure.classificationSubtype) {\r\n structureHasRois = visibleRegions.length > 0 ? true : structureHasRois;\r\n if (structureHasRois) {\r\n // get rois for parent or substructure\r\n rr = visibleRegions.filter(\r\n (element) => !element.isSubtype && !element.aiAnnotated\r\n );\r\n rRoi.regionRois = rr;\r\n }\r\n } else if (structure.isSubtype) {\r\n // get subtype rois from parent layer\r\n structureHasRois = visibleRegions.length > 0 ? true : structureHasRois;\r\n\r\n if (structureHasRois) {\r\n //console.log(\"color1: \" + structure.color);\r\n rr = visibleRegions.filter(\r\n (element) =>\r\n element.subtypeName === structure.label &&\r\n element.color === structure.color // check color because of same structure names\r\n );\r\n rRoi.regionRois = rr;\r\n }\r\n }\r\n\r\n // check if parent of substructure shows subtype\r\n let showSubstructure = true;\r\n if (structure.isSubtype && !structure.classificationSubtype) {\r\n parentIndex = getParentIndex(structure, this.props.structures);\r\n if (parentIndex >= 0) {\r\n showSubstructure = this.props.structures[parentIndex].showSubtypes;\r\n }\r\n }\r\n\r\n // check if parent of subtype is substructure and not unfolded\r\n if (structure.isSubtype && structure.classificationSubtype) {\r\n let obj = this.subtypeHasSubstructureParent(structure);\r\n if (obj.hasStrParent) {\r\n // if parent is substructure --> check if it is visible\r\n let parentIdx = getParentIndex(\r\n this.props.structures[obj.index],\r\n this.props.structures\r\n );\r\n if (parentIdx >= 0) {\r\n showSubstructure = this.props.structures[parentIdx].showSubtypes;\r\n }\r\n }\r\n }\r\n if (structure.visible && showSubstructure && structureHasRois) {\r\n let fillstyle = \"\";\r\n // This color is the one of the filled shape\r\n if (!structure.classificationSubtype) {\r\n // draw parent always in parent color\r\n if (\r\n this.props.structures.length > 3 &&\r\n this.props.structures[3] === structure\r\n ) {\r\n //console.log(\"color2: \" + structure.color);\r\n }\r\n this.ctx.fillStyle = structure.color;\r\n fillstyle = structure.color;\r\n } else {\r\n // find color for subtypeStructure\r\n //console.log(\"color3: \" + this.findColor(structure));\r\n fillstyle = this.findColor(structure);\r\n this.ctx.fillStyle = fillstyle;\r\n }\r\n\r\n if (l === 0) {\r\n let ptrn = this.ctx.createPattern(this.backgroundPattern, \"repeat\");\r\n let patternScale = 1 / this.getScale();\r\n ptrn.setTransform({\r\n a: patternScale,\r\n b: 0,\r\n c: 0,\r\n d: patternScale,\r\n e: 0,\r\n f: 0,\r\n });\r\n this.ctx.fillStyle = ptrn;\r\n }\r\n\r\n // draw base roi\r\n this.ctx.strokeStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n if (structure.inversed && rRoi.regionRois.length > 0) {\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n this.ctx.globalAlpha = 1.0;\r\n this.ctx.strokeStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n // Draw the shape you want to take out\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(0, 0);\r\n this.ctx.lineTo(this.vw, 0);\r\n this.ctx.lineTo(this.vw, this.vh);\r\n this.ctx.lineTo(0, this.vh);\r\n this.ctx.lineTo(0, 0);\r\n\r\n for (let roi of rRoi.regionRois) {\r\n for (let region of roi.regions) {\r\n if (region[region.length - 1]) {\r\n this.ctx.moveTo(\r\n region[region.length - 1][0],\r\n region[region.length - 1][1]\r\n );\r\n for (let i = 0; i < region.length; i++) {\r\n this.ctx.lineTo(region[i][0], region[i][1]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.ctx.closePath();\r\n this.ctx.fill(\"evenodd\");\r\n this.ctx.stroke();\r\n } else {\r\n this.ctx.lineWidth = 1 / this.ctx.getTransform().a;\r\n this.ctx.globalAlpha = opacity / 2;\r\n this.ctx.beginPath();\r\n\r\n visibleRegions = rRoi.regionRois.filter((roi) => {\r\n return roi.intersects(p1, p2);\r\n });\r\n\r\n // Draw visible, non-object regions\r\n for (const roi of visibleRegions.filter((roi) => !roi.isObject)) {\r\n let comp = roi.boundsAreaCompare(p1, p2);\r\n let regions = [];\r\n regions = roi.getDynamicRegions(comp, visibleRegions.length);\r\n\r\n for (let points of regions) {\r\n // //roi.regions,) {\r\n let region = {\r\n points: points,\r\n bounds: roi.bounds,\r\n };\r\n\r\n this.ctx.moveTo(points.x, points.y);\r\n if (points[points.length - 2]) {\r\n this.ctx.moveTo(\r\n points[points.length - 2][0],\r\n points[points.length - 2][1]\r\n );\r\n for (let i = 0; i < points.length; i++) {\r\n this.ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n\r\n if (region[0]) {\r\n this.ctx.moveTo(\r\n region[region.length - 1][0],\r\n region[region.length - 1][1]\r\n );\r\n for (let i = 0; i < region.length; i++) {\r\n this.ctx.lineTo(region[i][0], region[i][1]);\r\n }\r\n }\r\n // show grid labels and tile names\r\n if (this.props.showGridLabels) {\r\n // draw tile name of roi / tile in upper right corner\r\n this.ctx.fillStyle = \"#ff0000\";\r\n this.ctx.font = \"90px Arial\";\r\n this.ctx.globalAlpha = 0.8;\r\n this.ctx.textAlign = \"right\";\r\n if (roi.bounds.right === this.props.ome.sizeX) {\r\n this.ctx.textAlign = \"center\";\r\n }\r\n this.ctx.textBaseline = \"top\";\r\n this.ctx.fillText(\r\n roi.tileName,\r\n points[points.length - 2][0] +\r\n (roi.bounds.right - roi.bounds.left),\r\n points[points.length - 2][1] -\r\n (roi.bounds.bottom - roi.bounds.top)\r\n );\r\n\r\n // if roi / tile is on edge draw col / row name\r\n this.ctx.fillStyle = \"#ff0000\";\r\n this.ctx.font = \"300px Arial\";\r\n this.ctx.globalAlpha = 1;\r\n // left edge\r\n if (roi.bounds.left === 0) {\r\n let txt = roi.tileName.replace(/[^0-9]/g, \"\");\r\n this.ctx.textAlign = \"end\";\r\n this.ctx.textBaseline = \"middle\";\r\n this.ctx.fillText(\r\n txt,\r\n points[points.length - 2][0] - 30,\r\n points[points.length - 2][1] -\r\n (roi.bounds.bottom - roi.bounds.top) / 2\r\n );\r\n }\r\n // top edge\r\n if (roi.bounds.top === 0) {\r\n let txt = roi.tileName.replace(/[^A-Z]/g, \"\");\r\n this.ctx.textAlign = \"center\";\r\n if (roi.bounds.right === this.props.ome.sizeX) {\r\n this.ctx.textAlign = \"left\";\r\n }\r\n this.ctx.textBaseline = \"bottom\";\r\n this.ctx.fillText(\r\n txt,\r\n points[points.length - 2][0] +\r\n (roi.bounds.right - roi.bounds.left) / 2,\r\n points[points.length - 2][1] -\r\n (roi.bounds.bottom - roi.bounds.top)\r\n );\r\n }\r\n }\r\n this.ctx.globalAlpha = opacity / 2;\r\n this.ctx.fillStyle = fillstyle;\r\n }\r\n }\r\n this.ctx.closePath();\r\n this.ctx.fill(\"evenodd\");\r\n if (opacity === 0) {\r\n this.ctx.strokeStyle = structure.color;\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n }\r\n this.ctx.globalAlpha = 1.0;\r\n this.ctx.stroke();\r\n\r\n let tempStrokeStyle = this.ctx.strokeStyle;\r\n let tempLineWidth = this.ctx.lineWidth;\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n this.ctx.strokeStyle = structure.color;\r\n\r\n this.ctx.beginPath();\r\n\r\n // Draw non-area objects\r\n for (const roi of visibleRegions.filter((roi) => roi.isObject)) {\r\n let regions = roi.getRectRegions();\r\n\r\n for (let points of regions) {\r\n if (points[points.length - 2]) {\r\n this.ctx.moveTo(\r\n points[points.length - 2][0],\r\n points[points.length - 2][1]\r\n );\r\n for (let i = 0; i < points.length; i++) {\r\n this.ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n }\r\n }\r\n this.ctx.stroke();\r\n\r\n if (opacity !== 0) {\r\n this.ctx.strokeStyle = tempStrokeStyle;\r\n this.ctx.lineWidth = tempLineWidth;\r\n }\r\n\r\n if (this.state.showObjectIdx) {\r\n let layerRois = structure.isSubtype\r\n ? this.props.roiLayers[parentIndex].layer.regionRois\r\n : roiLayer.layer.regionRois;\r\n this.ctx.beginPath();\r\n // show number for big annotations\r\n for (const roi of visibleRegions) {\r\n let comp = roi.boundsAreaCompare(p1, p2);\r\n // uncomment for showing text in middle of visibly big polys\r\n if (comp > 0.001) {\r\n //console.log(\"big poly:\", comp);\r\n const fontSize = 24 * scaleFactor;\r\n //const fontMargin = 6 * scaleFactor;\r\n this.ctx.fillStyle = this.state.isBrightfield\r\n ? \"black\"\r\n : \"white\";\r\n this.ctx.font = \"bold \" + fontSize + \"px Arial\";\r\n this.ctx.globalAlpha = 1.0;\r\n this.ctx.textAlign = \"center\";\r\n this.ctx.textBaseline = \"bottom\";\r\n let center = roi.getPointOnPoly();\r\n center.y += fontSize / 2;\r\n let textToShow = layerRois.findIndex(\r\n (regionRoi) => regionRoi.uuid === roi.uuid\r\n );\r\n\r\n this.ctx.fillText(textToShow.toBase(62), center.x, center.y);\r\n }\r\n }\r\n this.ctx.stroke();\r\n }\r\n //this.ctx.strokeStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n //this.ctx.globalAlpha = opacity / 2;\r\n //this.ctx.lineWidth = 1 / this.ctx.getTransform().a;\r\n }\r\n }\r\n }\r\n // if deleting with right click, draw drawing inversed\r\n if (drawLayer.clear) {\r\n this.ctx.fillStyle = this.props.structures[this.props.selectedLayer]\r\n .inversed\r\n ? this.props.structures[this.props.selectedLayer].color\r\n : \"black\";\r\n } else {\r\n if (this.props.structures[this.props.selectedLayer].isSubtype) {\r\n this.ctx.fillStyle = this.props.structures[this.props.selectedLayer]\r\n .inversed\r\n ? \"black\"\r\n : this.props.structures[this.props.selectedLayer].color;\r\n } else {\r\n this.ctx.fillStyle = this.props.structures[this.props.selectedLayer]\r\n .inversed\r\n ? \"black\"\r\n : this.props.structures[this.props.selectedLayer].color;\r\n }\r\n }\r\n\r\n //draw only colored outline, if drawing objects\r\n if (this.objectMode) {\r\n this.ctx.globalAlpha = 1;\r\n this.ctx.fillStyle = \"transparent\";\r\n this.ctx.strokeStyle =\r\n this.props.structures[this.props.selectedLayer].color;\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n } else {\r\n //draw black outline with filled outline\r\n this.ctx.globalAlpha = opacity / 2;\r\n this.ctx.strokeStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n }\r\n\r\n this.ctx.beginPath();\r\n for (let roi of drawLayer.regionRois) {\r\n for (let points of roi.regions) {\r\n if (points.length > 0) {\r\n this.ctx.moveTo(\r\n points[points.length - 1][0],\r\n points[points.length - 1][1]\r\n );\r\n for (let i = 0; i < points.length; i++) {\r\n this.ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n }\r\n }\r\n this.ctx.closePath();\r\n this.ctx.fill(\"evenodd\");\r\n\r\n this.ctx.globalAlpha = 1;\r\n if (opacity === 0) {\r\n this.ctx.strokeStyle =\r\n this.props.structures[this.props.selectedLayer].color;\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n }\r\n this.ctx.stroke();\r\n\r\n this.ctx.strokeStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n this.ctx.globalAlpha = opacity / 2;\r\n this.ctx.lineWidth = 1 / this.ctx.getTransform().a;\r\n if (\r\n commentLayer &&\r\n commentLayer.commentRois &&\r\n this.props.activeTool === \"comment\"\r\n ) {\r\n this.ctx.globalAlpha = 1;\r\n this.ctx.fillStyle = \"transparent\";\r\n this.ctx.lineWidth = 4 / this.ctx.getTransform().a;\r\n\r\n for (let roi of commentLayer.commentRois) {\r\n this.ctx.beginPath();\r\n this.ctx.strokeStyle = roi.type === \"commentBox\" ? \"black\" : roi.color;\r\n let points = roi.regions;\r\n if (points && points.length > 1) {\r\n for (let i = 0; i < points.length; i++) {\r\n this.ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n if (\r\n roi.type === \"rectangle\" ||\r\n roi.type === \"region\" ||\r\n roi.type === \"commentBox\"\r\n ) {\r\n this.ctx.closePath();\r\n }\r\n this.ctx.stroke();\r\n\r\n this.ctx.globalAlpha = 0.85;\r\n this.ctx.fillStyle =\r\n roi.type === \"commentBox\" ? \"white\" : \"transparent\";\r\n this.ctx.fill();\r\n this.ctx.globalAlpha = 1;\r\n\r\n if (roi.commentValue !== \"\" && roi.regions.length > 1) {\r\n let angle = 0;\r\n this.ctx.save();\r\n\r\n // Translate Text Positions\r\n if (roi.type === \"rectangle\" || roi.type === \"region\") {\r\n this.ctx.translate(roi.bounds.right, roi.bounds.bottom + 20);\r\n } else if (roi.type === \"commentBox\") {\r\n this.ctx.translate(\r\n roi.bounds.left + Math.round(5 * scaleFactor),\r\n roi.bounds.top + Math.round(5 * scaleFactor)\r\n );\r\n } else if (roi.type === \"arrow\" || roi.type === \"distance\") {\r\n let p1 = { x: roi.regions[0][0], y: roi.regions[0][1] };\r\n let p2 = { x: roi.regions[1][0], y: roi.regions[1][1] };\r\n let vector = {\r\n x: p2.x - p1.x,\r\n y: p2.y - p1.y,\r\n };\r\n if (roi.type === \"distance\") {\r\n this.ctx.translate(\r\n (roi.bounds.left + roi.bounds.right) / 2,\r\n (roi.bounds.top + roi.bounds.bottom) / 2\r\n );\r\n vector.x /= 20;\r\n vector.y /= 20;\r\n if (vector.x < 0) {\r\n this.ctx.translate(-vector.y, vector.x);\r\n } else {\r\n this.ctx.translate(vector.y, -vector.x);\r\n }\r\n angle = Math.atan2(p2.y - p1.y, p2.x - p1.x);\r\n if (angle > Math.PI / 2 || angle < -Math.PI / 2) angle -= Math.PI;\r\n } else {\r\n this.ctx.translate(roi.bounds.left, roi.bounds.top);\r\n if (p1.x > p2.x) {\r\n this.ctx.translate(-vector.x, 0);\r\n }\r\n if (p1.y > p2.y) {\r\n this.ctx.translate(0, -vector.y);\r\n }\r\n }\r\n }\r\n\r\n // Do Text Formating\r\n this.ctx.rotate(angle);\r\n this.ctx.fillStyle = roi.type === \"commentBox\" ? \"black\" : roi.color;\r\n let fontSize = Math.round(\r\n 20 * roi.fontScaleFactor * Math.min(scaleFactor, 14)\r\n );\r\n // comment back in if old behaviour is wanted -> Font-Size depends on Boxlength and not the scaleFactor in the Scene\r\n // roi.type === \"commentBox\"\r\n // ? Math.round(20 * roi.fontScaleFactor * Math.min(scaleFactor, 14))\r\n // : Math.round(length / 10 * roi.fontScaleFactor);\r\n this.ctx.font = fontSize + \"px Arial\";\r\n\r\n if (roi.type === \"arrow\") {\r\n let p1 = { x: roi.regions[0][0], y: roi.regions[0][1] };\r\n let p2 = { x: roi.regions[1][0], y: roi.regions[1][1] };\r\n\r\n this.ctx.textAlign = \"right\";\r\n this.ctx.textBaseline = \"bottom\";\r\n if (p1.x > p2.x) {\r\n this.ctx.textAlign = \"left\";\r\n }\r\n if (p1.y > p2.y) {\r\n this.ctx.textBaseline = \"top\";\r\n }\r\n } else {\r\n this.ctx.textAlign = \"center\";\r\n this.ctx.textAlign =\r\n roi.type === \"rectangle\" || roi.type === \"region\"\r\n ? \"right\"\r\n : \"center\";\r\n this.ctx.textAlign = roi.type === \"commentBox\" ? \"left\" : \"center\";\r\n this.ctx.textBaseline =\r\n roi.type === \"rectangle\" ||\r\n roi.type === \"region\" ||\r\n roi.type === \"commentBox\"\r\n ? \"top\"\r\n : \"middle\";\r\n }\r\n this.wrapText(\r\n this.ctx,\r\n roi.commentValue,\r\n 0,\r\n 0,\r\n roi.width,\r\n fontSize + 5\r\n );\r\n this.ctx.restore();\r\n }\r\n }\r\n }\r\n if (landmarkLayer && landmarkLayer.landmarkRois && this.props.showMarks) {\r\n this.ctx.globalAlpha = 1;\r\n this.ctx.lineWidth = 2 / this.ctx.getTransform().a;\r\n let linelength = 15 / this.getScale();\r\n for (let roi of landmarkLayer.landmarkRois) {\r\n if (typeof roi.regions !== \"undefined\") {\r\n this.ctx.beginPath();\r\n this.ctx.strokeStyle = roi.color;\r\n let points = roi.regions;\r\n\r\n let x = points[0];\r\n let y = points[1];\r\n this.ctx.lineTo(x, y);\r\n this.ctx.lineTo(x, y - linelength);\r\n this.ctx.lineTo(x, y + linelength);\r\n this.ctx.lineTo(x, y);\r\n this.ctx.lineTo(x - linelength, y);\r\n this.ctx.lineTo(x + linelength, y);\r\n this.ctx.lineTo(x, y);\r\n\r\n this.ctx.closePath();\r\n this.ctx.stroke();\r\n\r\n this.ctx.save();\r\n this.ctx.translate(x + linelength, y - linelength);\r\n\r\n const scaleFactor = 1 / this.ctx.getTransform().a;\r\n let fontSize = Math.round(20 * roi.fontScaleFactor * scaleFactor);\r\n //* Math.min(scaleFactor, 14)\r\n this.ctx.globalAlpha = 1;\r\n this.ctx.font = fontSize + \"px Arial\";\r\n this.ctx.textAlign = \"center\";\r\n this.ctx.textBaseline = \"middle\";\r\n this.ctx.fillStyle = roi.color;\r\n let val = roi.commentValue;\r\n this.wrapText(this.ctx, String(val), 0, 0, linelength, linelength);\r\n this.ctx.restore();\r\n }\r\n }\r\n }\r\n\r\n //show heatmap while tool is active\r\n if (this.props.activeTool !== \"heatmap\" && this.showHeatmap) {\r\n this.showHeatmap = false;\r\n this.heatmap.setData({ max: 100, data: [] });\r\n }\r\n\r\n // let p1 = this.getPointInCanvas({ x: 0, y: 0 });\r\n // let p2 = this.getPointInCanvas({\r\n // x: this.canvas.width,\r\n // y: this.canvas.height,\r\n // });\r\n\r\n this.ctx.globalAlpha = 1.0;\r\n // draw scale bar\r\n if (this.state.showScaleBar && this.state.scaleBarData) {\r\n this.ctx.beginPath();\r\n this.ctx.strokeStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n const scaleFactor = 1 / this.ctx.getTransform().a;\r\n this.ctx.lineWidth = 3 * scaleFactor;\r\n const marginRight = 5 * scaleFactor;\r\n const marginBottom = 14 * scaleFactor;\r\n const scaleWidth = (this.state.scaleBarData.width - 2) * scaleFactor;\r\n const stopLineHeight = 16 * scaleFactor;\r\n const maxScaleWidth = this.state.scaleBarData.maxScaleWidth * scaleFactor;\r\n const delta = {\r\n x: this.state.scaleBarData.x * scaleFactor,\r\n y: this.state.scaleBarData.y * scaleFactor,\r\n };\r\n const center = {\r\n x: p2.x - marginRight - maxScaleWidth / 2 + delta.x,\r\n y: p2.y - marginBottom + delta.y,\r\n };\r\n this.ctx.moveTo(center.x - scaleWidth / 2, center.y);\r\n this.ctx.lineTo(center.x - scaleWidth / 2, center.y - stopLineHeight / 2);\r\n this.ctx.lineTo(center.x - scaleWidth / 2, center.y + stopLineHeight / 2);\r\n this.ctx.lineTo(center.x - scaleWidth / 2, center.y);\r\n this.ctx.lineTo(center.x + scaleWidth / 2, center.y);\r\n this.ctx.lineTo(center.x + scaleWidth / 2, center.y - stopLineHeight / 2);\r\n this.ctx.lineTo(center.x + scaleWidth / 2, center.y + stopLineHeight / 2);\r\n this.ctx.stroke();\r\n\r\n const fontSize = 14 * scaleFactor;\r\n const fontMargin = 6 * scaleFactor;\r\n this.ctx.fillStyle = this.state.isBrightfield ? \"black\" : \"white\";\r\n this.ctx.font = \"bold \" + fontSize + \"px Arial\";\r\n this.ctx.globalAlpha = 1.0;\r\n this.ctx.textAlign = \"center\";\r\n this.ctx.textBaseline = \"bottom\";\r\n this.ctx.fillText(\r\n this.state.scaleBarData.label,\r\n center.x,\r\n center.y - fontMargin\r\n );\r\n }\r\n\r\n // uncomment to debug pixal annotaion regions\r\n /*let rects = calcBoundingBoxes(this.layer);\r\n for(let rect of rects) {\r\n this.ctx.strokeStyle = \"black\"; \r\n this.ctx.beginPath();\r\n this.ctx.rect(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top)\r\n this.ctx.closePath();\r\n this.ctx.stroke();\r\n }*/\r\n\r\n // draw rois\r\n for (let roi of this.props.rois.filter((c) => !c.hovered)) {\r\n roi.draw({\r\n selected: roi === this.props.selectedROI,\r\n });\r\n }\r\n for (let roi of this.props.rois.filter((c) => c.hovered)) {\r\n roi.draw({\r\n selected: roi === this.props.selectedROI,\r\n });\r\n }\r\n\r\n // draw custom mouse cursor for pen tool\r\n if (this.props.tools[this.props.activeTool]) {\r\n this.ctx.lineWidth = 1 / this.ctx.getTransform().a;\r\n let centerX = p1.x + (p2.x - p1.x) / 2;\r\n let centerY = p1.y + (p2.y - p1.y) / 2;\r\n this.props.tools[this.props.activeTool].drawCustomCursor(\r\n this.ctx,\r\n this.mousePos,\r\n this.getScale(),\r\n this.canvas,\r\n { x: centerX, y: centerY },\r\n this.state.mouseOnCanvas\r\n );\r\n }\r\n\r\n // check if tiles are still loading from server\r\n let isLoadingTiles = false;\r\n for (let tileId in this.props.tiles.getVisibleImages()) {\r\n if (this.props.tiles.getVisibleImage(tileId).complete === false) {\r\n isLoadingTiles = true;\r\n break;\r\n }\r\n }\r\n if (isLoadingTiles !== this.state.isLoadingTiles) {\r\n let nowTime = performance.now();\r\n this.setMountedState(\r\n {\r\n isLoadingTiles: isLoadingTiles,\r\n nowTime: nowTime,\r\n },\r\n () => {\r\n if (!isLoadingTiles) {\r\n // console.log(\r\n // \"loading tiles took \",\r\n // performance.now() - this.state.nowTime,\r\n // \"ms,\"\r\n // );\r\n }\r\n }\r\n );\r\n }\r\n if (this.props.showWindowTool && this.props.isActive) {\r\n if (this.props.windowToolRef) {\r\n this.props.windowToolRef.updateCanvas();\r\n }\r\n }\r\n\r\n // request next animation frame\r\n if (this.keepRendering) {\r\n requestAnimationFrame(() => this.draw());\r\n }\r\n };\r\n\r\n wrapText = (context, text, x, y, maxWidth, lineHeight, maxHeight) => {\r\n if (text.split(\"\\n\").length > 1) {\r\n for (let line of text.split(\"\\n\")) {\r\n this.wrapText(\r\n context,\r\n line,\r\n x,\r\n y + this.lineIdx * lineHeight,\r\n maxWidth,\r\n lineHeight,\r\n maxHeight\r\n );\r\n this.lineIdx += 1;\r\n }\r\n this.lineIdx = 0;\r\n } else {\r\n let words = text.split(\" \");\r\n let line = \"\";\r\n\r\n for (let n = 0; n < words.length; n++) {\r\n let testLine = line + words[n] + \" \";\r\n let metrics = context.measureText(testLine);\r\n let testWidth = metrics.width;\r\n if (testWidth > maxWidth && n > 0) {\r\n context.fillText(line, x, y);\r\n line = words[n] + \" \";\r\n y += lineHeight;\r\n this.lineIdx += 1;\r\n } else {\r\n line = testLine;\r\n }\r\n }\r\n context.fillText(line, x, y);\r\n }\r\n };\r\n\r\n subtypeHasSubstructureParent = (structure) => {\r\n // check if subtype has substructure as parent\r\n let obj = {\r\n hasStrParent: false,\r\n index: -1,\r\n };\r\n\r\n let index = this.props.structures.findIndex(\r\n (element) => element === structure\r\n );\r\n while (\r\n this.props.structures[index].subtypeLevel !== 0 &&\r\n !obj.hasStrParent\r\n ) {\r\n index = getParentIndex(\r\n this.props.structures[index],\r\n this.props.structures\r\n );\r\n obj.index = index;\r\n // if not classification subtype --> substructure\r\n if (\r\n !this.props.structures[index].classificationSubtype &&\r\n this.props.structures[index].isSubtype\r\n ) {\r\n obj.hasStrParent = true;\r\n }\r\n }\r\n return obj;\r\n };\r\n\r\n findColor = (structure) => {\r\n // get color for subtype depending on if structure is unfolded (if not unfolded color of parent)\r\n let parentIndex = this.props.structures.findIndex(\r\n (element) => element === structure\r\n );\r\n while (!this.props.structures[parentIndex].isUnfolded) {\r\n parentIndex = getParentIndex(\r\n this.props.structures[parentIndex],\r\n this.props.structures\r\n );\r\n }\r\n return this.props.structures[parentIndex].color;\r\n };\r\n\r\n getChildsofStructure = (parentStructure) => {\r\n // return direct classification subtypes\r\n return this.props.structures.filter(\r\n (element) =>\r\n element.parentId === parentStructure.id && element.classificationSubtype\r\n );\r\n };\r\n\r\n setNewSelRoi = (roi) => {\r\n this.selROI = roi;\r\n };\r\n\r\n setZoomLevelForGridSize = (gridSize) => {\r\n // make initial zoomlevel\r\n this.zoomFit();\r\n // zoom in that tile is size of viewer\r\n this.ctx.scale(gridSize, gridSize);\r\n };\r\n\r\n classifySelectedRoi = (classId, withMouse) => {\r\n const { selectedLayer, roiLayers, structures } = this.props;\r\n // classify selected roi with key shortcut\r\n\r\n // change getChildsofStructure for multiple subtypelvels\r\n let childs = this.getChildsofStructure(structures[selectedLayer]);\r\n\r\n // get parent layer\r\n let parentIndexLayer = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n\r\n let idxRoi = roiLayers[parentIndexLayer].layer.regionRois.findIndex(\r\n (element) =>\r\n element.bounds.left === this.selROI.r.bounds.left &&\r\n element.bounds.top === this.selROI.r.bounds.top &&\r\n element.bounds.bottom === this.selROI.r.bounds.bottom &&\r\n element.bounds.right === this.selROI.r.bounds.right\r\n );\r\n\r\n let idxStr = structures.findIndex(\r\n (element) =>\r\n element.color === this.selROI.colors &&\r\n element.parentId === structures[selectedLayer].id\r\n );\r\n\r\n let parentStructure = false;\r\n let strToUse = null;\r\n if (withMouse) {\r\n // with mouse\r\n // parent structure\r\n if (idxStr === -1) {\r\n parentStructure = true;\r\n idxStr = selectedLayer;\r\n }\r\n strToUse = structures[idxStr];\r\n } else {\r\n // with keys\r\n strToUse = childs[classId - 1];\r\n }\r\n\r\n let selectedRoi = roiLayers[parentIndexLayer].layer.regionRois[idxRoi];\r\n let historyItem = [];\r\n let histId = structures[parentIndexLayer].id;\r\n if (\r\n !parentStructure &&\r\n idxRoi !== -1 &&\r\n (childs[classId - 1] || strToUse) &&\r\n selectedRoi\r\n ) {\r\n historyItem.push({ add: false, id: histId, roi: selectedRoi.copy() });\r\n // set properties of roi for classification\r\n selectedRoi.color = strToUse.color;\r\n selectedRoi.isSubtype = true;\r\n selectedRoi.isAnnotated = true;\r\n selectedRoi.subtypeName = strToUse.label;\r\n selectedRoi.structureId = strToUse.id;\r\n selectedRoi.isLabeled = true;\r\n selectedRoi.isSelObj = false;\r\n selectedRoi.aiAnnotated = false;\r\n historyItem.push({ add: true, id: histId, roi: selectedRoi.copy() });\r\n window.projectHistory.add(historyItem);\r\n }\r\n\r\n if ((classId === 0 || parentStructure) && selectedRoi) {\r\n historyItem.push({ add: false, id: histId, roi: selectedRoi.copy() });\r\n selectedRoi.color = structures[selectedLayer].color;\r\n selectedRoi.isSubtype = false;\r\n selectedRoi.isAnnotated = false;\r\n selectedRoi.subtypeName = structures[selectedLayer].label;\r\n selectedRoi.structureId = structures[selectedLayer].id;\r\n selectedRoi.isLabeled = false;\r\n selectedRoi.isSelObj = false;\r\n selectedRoi.aiAnnotated = false;\r\n historyItem.push({ add: true, id: histId, roi: selectedRoi.copy() });\r\n window.projectHistory.add(historyItem);\r\n }\r\n\r\n // if changeFile is true --> change file after classification\r\n setTimeout(() => {\r\n let nextFileId = this.getNextFileId();\r\n if (\r\n this.selROI.changeFile === true &&\r\n this.selROI.automaticFileChange === true &&\r\n nextFileId\r\n ) {\r\n this.props.onSelectFile(nextFileId);\r\n }\r\n }, 1000);\r\n };\r\n\r\n getNextFileId = () => {\r\n const { project, fileId } = this.props;\r\n let inxCurrentFile = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n if (project.files[inxCurrentFile + 1]) {\r\n return project.files[inxCurrentFile + 1].id;\r\n } else {\r\n if (\r\n this.props.project.type.includes(\"HistoClassification\") ||\r\n this.props.project.type.includes(\"HistoPointCounting\")\r\n ) {\r\n // if last file\r\n window.showWarningSnackbar(\"Last file.\");\r\n }\r\n return null;\r\n }\r\n };\r\n\r\n checkToolInConfig = (toolName) => {\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n };\r\n\r\n keyDown = (event) => {\r\n if (\r\n this.props.tools[this.props.activeTool] &&\r\n this.props.tools[this.props.activeTool].rendererKeyDown\r\n ) {\r\n this.props.tools[this.props.activeTool].rendererKeyDown(event);\r\n }\r\n };\r\n\r\n keyDownSelection = (event) => {\r\n // change selected roi with arrow keys\r\n let selection = this.props.tools[this.props.activeTool].onKeyDown(\r\n event,\r\n true,\r\n this.isTilesToolUsed()\r\n );\r\n\r\n if (selection) {\r\n this.selROI = selection;\r\n this.props.setSelectedRoi(selection);\r\n }\r\n };\r\n\r\n isTilesToolUsed = () => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // check if tiles tool was used to create rois\r\n let hasLayerTileNames = false;\r\n if (roiLayers[selectedLayer].layer.regionRois[0]) {\r\n hasLayerTileNames =\r\n roiLayers[selectedLayer].layer.regionRois[0].tileName !== \"\";\r\n }\r\n\r\n if (this.checkToolInConfig(\"TilesTool\") && hasLayerTileNames) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n updateFLChannels = (e) => {\r\n this.props.tiles.setHistogramConfig(e);\r\n\r\n this.setMountedState({ histogramConfig: e });\r\n\r\n // invalidate all cached coloring images\r\n //this.coloredImages = [];\r\n this.props.tiles.setColoredImages([]);\r\n for (let i = 0; i < this.props.structures.length; i++) {\r\n if (this.props.roiLayers.length > 1) {\r\n this.props.roiLayers[1].layer.regionRois.forEach(function (point) {\r\n point.firstTimeGallery = true;\r\n });\r\n }\r\n }\r\n //this.props.tiles.setColoredImages([]);\r\n\r\n this.loadAllTiles();\r\n };\r\n\r\n onPlayPause = (e, dir) => {\r\n this.setMountedState({ playing: e, playingZ: false, playDirection: dir });\r\n };\r\n\r\n onPlayPauseZ = (e, dir) => {\r\n this.setMountedState({ playingZ: e, playing: false, playDirectionZ: dir });\r\n };\r\n\r\n onSeek = (e, v) => {\r\n this.updateT(v);\r\n };\r\n\r\n onChangeT = (e) => {\r\n this.updateT(e);\r\n };\r\n\r\n onChangeZValue = (z, minZ = this.state.minZ, maxZ = this.state.maxZ) => {\r\n this.updateZ(z, minZ, maxZ);\r\n this.props.tiles.setZLevel(z);\r\n this.props.persistentStorage.save(\"z\", z); //remember for use after project reload or reopen\r\n this.props.persistentStorage.save(\"minZ\", minZ); //remember for use after project reload or reopen\r\n this.props.persistentStorage.save(\"maxZ\", maxZ); //remember for use after project reload or reopen\r\n };\r\n\r\n onChangeZ = (e, v) => {\r\n let minZ = v[0];\r\n let z = v[1];\r\n let maxZ = v[2];\r\n this.onChangeZValue(z, minZ, maxZ);\r\n };\r\n\r\n onChangeSr = (e) => {\r\n this.setMountedState({ sr: e });\r\n };\r\n\r\n onChangeZSr = (e) => {\r\n this.setMountedState({ zsr: e });\r\n };\r\n\r\n onStep = (e) => {\r\n this.updateT(\r\n Math.min(this.props.ome.sizeT - 1, Math.max(0, this.state.t + e))\r\n );\r\n };\r\n\r\n onStepZ = (e) => {\r\n let zLevel = Math.min(\r\n this.props.ome.sizeZ - 1,\r\n Math.max(0, this.state.z + e)\r\n );\r\n this.onChangeZValue(zLevel);\r\n };\r\n\r\n updatePreviewRectSize = (size) => {\r\n let scaledWidth = size.width * this.getScale();\r\n let scaledHeight = size.height * this.getScale();\r\n\r\n if (\r\n this.state.previewWidth !== scaledWidth ||\r\n this.state.previewHeight !== scaledHeight\r\n ) {\r\n this.setMountedState({\r\n previewWidth: scaledWidth,\r\n previewHeight: scaledHeight,\r\n previewRectChanged: false,\r\n });\r\n }\r\n };\r\n\r\n onResize = (event, { size }) => {\r\n size.width = size.width / this.getScale();\r\n size.height = size.height / this.getScale();\r\n\r\n let minSize = 500;\r\n let maxSize = 2000;\r\n //let maxSize = 14000;\r\n size.width = size.width < minSize ? minSize : size.width;\r\n size.width = size.width > maxSize ? maxSize : size.width;\r\n size.height = size.height < minSize ? minSize : size.height;\r\n size.height = size.height > maxSize ? maxSize : size.height;\r\n\r\n this.props.tools[this.props.activeTool].setPreviewSize(\r\n size.width,\r\n size.height\r\n );\r\n let newSize = {\r\n width: this.props.tools[this.props.activeTool].state.prevW,\r\n height: this.props.tools[this.props.activeTool].state.prevH,\r\n };\r\n this.updatePreviewRectSize(newSize);\r\n };\r\n\r\n onToggle = (key) => {\r\n let keyExtender = key.startsWith(\"show\") ? \"\" : this.props.fileId;\r\n //e.g. \"showMiniMap\", true\r\n if (this.props.showFullscreen) {\r\n this.props.persistentStorage.save(\r\n key + \"Full\" + keyExtender,\r\n !this.state[key]\r\n );\r\n } else {\r\n this.props.persistentStorage.save(key + keyExtender, !this.state[key]);\r\n }\r\n\r\n this.setMountedState({ [key]: !this.state[key] });\r\n };\r\n\r\n getLayoutElement = (key) => {\r\n //used to get e.g. \"showMiniMap\" via rendererRef\r\n return this.state[key];\r\n };\r\n\r\n checkMiniMapVisivility = () => {\r\n const { hideMiniMap, showMiniMap } = this.state;\r\n const hideMiniMapThresholdWidth = 600;\r\n const hideMiniMapThresholdHeight = 400;\r\n const hideRestrictions =\r\n this.canvas.width < hideMiniMapThresholdWidth ||\r\n this.canvas.height < hideMiniMapThresholdHeight;\r\n let saveString = \"hideMiniMap\" + this.props.fileId;\r\n if (this.props.showFullscreen) {\r\n saveString = \"hideMiniMapFull\" + this.props.fileId;\r\n }\r\n if (hideRestrictions && !hideMiniMap && showMiniMap) {\r\n this.props.persistentStorage.save(saveString, true);\r\n this.onToggle(\"showMiniMap\");\r\n this.setMountedState({ hideMiniMap: true });\r\n } else if (!hideRestrictions && hideMiniMap && !showMiniMap) {\r\n this.props.persistentStorage.save(saveString, false);\r\n this.onToggle(\"showMiniMap\");\r\n this.setMountedState({ hideMiniMap: false });\r\n } else if (!hideRestrictions && hideMiniMap && showMiniMap) {\r\n this.props.persistentStorage.save(saveString, false);\r\n this.setMountedState({ hideMiniMap: false });\r\n }\r\n };\r\n\r\n render = () => {\r\n const { classes, fileId, project, ome, showTimeBar } = this.props;\r\n\r\n const {\r\n miniMapKey,\r\n scaleBarData,\r\n open,\r\n anchorEl,\r\n displayTimeBar,\r\n displayZStackBar,\r\n showMiniMap,\r\n showScaleBar,\r\n showZStackBar,\r\n showImageInfo,\r\n showZoomBar,\r\n showResultTable,\r\n showFileNavButtons,\r\n } = this.state;\r\n\r\n return (\r\n
(this.container = el)}>\r\n \r\n {({ TransitionProps }) => (\r\n \r\n \r\n \r\n {ome && typeof ome.physicalSizeX !== \"undefined\" && (\r\n \r\n )}\r\n {displayTimeBar && (\r\n \r\n )}\r\n {displayZStackBar && (\r\n \r\n )}\r\n \r\n {!(\r\n this.props.project.type.includes(\"HistoClassification\") ||\r\n this.props.project.type.includes(\"HistoPointCounting\")\r\n ) && (\r\n \r\n )}\r\n \r\n \r\n \r\n )}\r\n \r\n\r\n {this.props.splitscreenCount !== 1 && !this.props.showFullscreen && (\r\n \r\n \r\n this.setMountedState({\r\n open: !this.state.open,\r\n anchorEl: e.target,\r\n })\r\n }\r\n >\r\n \r\n \r\n \r\n )}\r\n
\r\n event.preventDefault()}\r\n onMouseDown={this.mousedown}\r\n //onMouseMove={this.mousemove}\r\n onMouseEnter={this.mouseEnter}\r\n onMouseLeave={this.mouseLeave}\r\n />\r\n {this.state.isLoadingTiles && (\r\n \r\n )}\r\n {FPS && (\r\n

\r\n {this.state.fps + \" FPS\"}\r\n

\r\n )}\r\n {!this.state.initialized && (\r\n \r\n )}\r\n {this.props.tools[this.props.activeTool] &&\r\n this.props.tools[this.props.activeTool].previewRect &&\r\n this.props.tools[this.props.activeTool].state.preview && (\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n )}\r\n {this.state.initialized &&\r\n showMiniMap &&\r\n !this.props.resultTab.getZoomLevelFixed() && (\r\n (this.miniMapRef = c)}\r\n fileId={fileId}\r\n key={miniMapKey}\r\n pointerEvents={\r\n !(\r\n this.canvas.style.cursor !== \"default\" ||\r\n this.props.drawLayer.regionRois.length > 0\r\n )\r\n }\r\n ome={this.props.ome}\r\n histogramConfig={this.props.histogramConfig}\r\n visibleImage={this.props.tiles.getVisibleImages()}\r\n coloredImages={this.props.tiles.getColoredImages()}\r\n position={this.getPosition()}\r\n zoom={this.getScale()}\r\n canvas={this.canvas}\r\n canvasId={this.props.canvasId}\r\n onMoveTo={this.moveTo}\r\n onScaleOnly={this.onScaleOnly}\r\n getPageForChannel={this.getPageForChannel}\r\n chainMouseMove={this.chainMouseMove}\r\n zoomMouseWheel={this.miniMapZoom}\r\n />\r\n )}\r\n\r\n {this.state.initialized && showZoomBar && (\r\n this.zoomToFactor(v)}\r\n clickable={\r\n !(\r\n project.type.includes(\"HistoClassification\") ||\r\n project.type.includes(\"HistoPointCounting\")\r\n )\r\n }\r\n />\r\n )}\r\n {this.state.initialized && showScaleBar && (\r\n 0\r\n )\r\n }\r\n zoom={this.getScale()}\r\n ome={this.props.ome}\r\n setScaleBarData={(data) => {\r\n if (\r\n scaleBarData === null ||\r\n scaleBarData.width !== data.width ||\r\n scaleBarData.label !== data.label ||\r\n scaleBarData.x !== data.x ||\r\n scaleBarData.y !== data.y\r\n ) {\r\n this.setMountedState({ scaleBarData: data });\r\n }\r\n // else if (scaleBarData.data && scaleBarData.x !== data.x) {\r\n // this.setMountedState({ scaleBarData: data });\r\n // }\r\n }}\r\n />\r\n )}\r\n {/* {this.state.initialized && showTimeBar && false && (\r\n 0\r\n )\r\n }\r\n time={this.state.t}\r\n playing={this.state.playing}\r\n onPlayPause={this.onPlayPause}\r\n onSeek={this.onSeek}\r\n onChangeT={this.onChangeT}\r\n ome={this.props.ome}\r\n sr={this.state.sr}\r\n onChangeSr={this.onChangeSr}\r\n playDirection={this.state.playDirection}\r\n onStep={this.onStep}\r\n />\r\n )} */}\r\n {this.state.initialized && showTimeBar && (\r\n \r\n )}\r\n {this.state.initialized &&\r\n showZStackBar &&\r\n this.props.ome.sizeZ > 1 && (\r\n 0\r\n )\r\n }\r\n z={this.state.z}\r\n minZ={this.state.minZ}\r\n maxZ={this.state.maxZ}\r\n playing={this.state.playingZ}\r\n onPlayPause={this.onPlayPauseZ}\r\n zsr={this.state.zsr}\r\n onChangeZ={this.onChangeZ}\r\n onChangeZValue={this.onChangeZValue}\r\n onChangeZSr={this.onChangeZSr}\r\n playDirection={this.state.playDirectionZ}\r\n ome={this.props.ome}\r\n onStep={this.onStepZ}\r\n />\r\n )}\r\n {this.state.initialized && showImageInfo && (\r\n \r\n )}\r\n {this.state.initialized && showResultTable && (\r\n \r\n )}\r\n\r\n {showFileNavButtons && (\r\n \r\n
\r\n \r\n \r\n {\r\n this.props.openPrevFile();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n ]\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n \r\n );\r\n };\r\n}\r\n\r\n// define the component's interface\r\nRenderer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n tools: PropTypes.array,\r\n allRoiLayers: PropTypes.object,\r\n viewerConfig: PropTypes.object,\r\n structures: PropTypes.array,\r\n rightSpace: PropTypes.number,\r\n updateProject: PropTypes.func,\r\n setSelectedRoi: PropTypes.func,\r\n fsChain: PropTypes.func,\r\n onChangeChain: PropTypes.func,\r\n onSelectFile: PropTypes.func,\r\n // to access the componenents ref through withStyles\r\n componentRef: PropTypes.func,\r\n // meta data stuff\r\n id: PropTypes.string,\r\n ome: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n // roi draing\r\n rois: PropTypes.array,\r\n onChangeROIs: PropTypes.func,\r\n // tool stuff\r\n activeTool: PropTypes.string,\r\n // view layout stuff\r\n //showMiniMap: PropTypes.bool,\r\n //showScaleBar: PropTypes.bool,\r\n showGallery: PropTypes.bool,\r\n showZStackBar: PropTypes.bool,\r\n showTimeBar: PropTypes.bool,\r\n //showImageInfo: PropTypes.bool,\r\n // showZoomBar: PropTypes.bool,\r\n //showResultTable: PropTypes.bool,\r\n resultTabActive: PropTypes.func,\r\n // roiLayers\r\n roiLayers: PropTypes.array,\r\n drawLayer: PropTypes.object,\r\n commentLayer: PropTypes.object,\r\n landmarkLayers: PropTypes.object,\r\n landmarkLayer: PropTypes.object,\r\n selectedLayer: PropTypes.number,\r\n opacity: PropTypes.number,\r\n // from withTiles\r\n tiles: PropTypes.object,\r\n dimensionsUpdated: PropTypes.bool,\r\n updateGlobalZ: PropTypes.func,\r\n updateGlobalT: PropTypes.func,\r\n //splitscreen stuff\r\n splitscreenCount: PropTypes.number,\r\n splitscreenFileIds: PropTypes.array,\r\n isChained: PropTypes.bool,\r\n chainListFileIds: PropTypes.object,\r\n isActive: PropTypes.bool,\r\n canvasId: PropTypes.string,\r\n rendererDict: PropTypes.object,\r\n fileId: PropTypes.string,\r\n projectId: PropTypes.string,\r\n activeFileId: PropTypes.string,\r\n displayTimeBar: PropTypes.bool,\r\n displayZStackBar: PropTypes.bool,\r\n loadedAnnotationsCounter: PropTypes.number,\r\n frameArrayDict: PropTypes.object,\r\n resultTab: PropTypes.object,\r\n persistentStorage: PropTypes.object,\r\n showFullscreen: PropTypes.bool,\r\n setChangingFile: PropTypes.func,\r\n //not ordered\r\n splitscreenIdx: PropTypes.number,\r\n changeHiConfig: PropTypes.func,\r\n onChangeTool: PropTypes.func,\r\n zoomROI: PropTypes.bool,\r\n zoomLeft: PropTypes.number,\r\n zoomRight: PropTypes.number,\r\n zoomTop: PropTypes.number,\r\n zoomBottom: PropTypes.number,\r\n tzoomROI1: PropTypes.func,\r\n changingFile: PropTypes.bool,\r\n showGridLabels: PropTypes.bool,\r\n showMarks: PropTypes.bool,\r\n selectedROI: PropTypes.object,\r\n showWindowTool: PropTypes.bool,\r\n windowToolRef: PropTypes.object,\r\n timeLineHeight: PropTypes.number,\r\n resizeTimeLine: PropTypes.func,\r\n openNextFile: PropTypes.func,\r\n openPrevFile: PropTypes.func,\r\n};\r\n\r\nexport default withPersistentStorage(\r\n withTiles(withResultTab(withStyles(styles)(Renderer)))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport Slider from \"@mui/material/Slider\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport Select from \"@mui/material/Select\";\r\nimport Radio from \"@mui/material/Radio\";\r\nimport RadioGroup from \"@mui/material/RadioGroup\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport { IconButton } from \"@mui/material\";\r\n\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\r\nimport LinkIcon from \"@mui/icons-material/Link\";\r\nimport LinkOffIcon from \"@mui/icons-material/LinkOff\";\r\n\r\nconst styles = {\r\n root: {\r\n display: \"flex\",\r\n height: \"400px\",\r\n position: \"absolute\",\r\n top: \"33%\",\r\n right: \"40px\",\r\n width: \"150px\",\r\n zIndex: 100,\r\n },\r\n formControl: {\r\n minWidth: 100,\r\n maxWidth: 100,\r\n },\r\n sliderDiv: {\r\n right: \"3.5%\",\r\n top: \"25%\",\r\n width: \"80%\",\r\n height: \"50%\",\r\n position: \"inherit\",\r\n textAlign: \"center\",\r\n },\r\n upperArea: {\r\n top: \"0%\",\r\n width: \"100%\",\r\n height: \"25%\",\r\n position: \"inherit\",\r\n },\r\n upperList: {\r\n position: \"inherit\",\r\n bottom: \"10%\",\r\n right: \"3%\",\r\n width: \"70%\",\r\n },\r\n lowerArea: {\r\n top: \"75%\",\r\n width: \"100%\",\r\n height: \"25%\",\r\n position: \"inherit\",\r\n },\r\n lowerList: {\r\n position: \"inherit\",\r\n top: \"10%\",\r\n right: \"3%\",\r\n width: \"70%\",\r\n },\r\n upFormcontrol: {\r\n position: \"absolute\",\r\n top: \"-10px\",\r\n left: \"-27px\",\r\n },\r\n lowFormcontrol: {\r\n position: \"absolute\",\r\n top: \"168px\",\r\n left: \"-27px\",\r\n },\r\n upButton: {\r\n position: \"absolute\",\r\n top: \"-4px\",\r\n left: \"50px\",\r\n color: \"#0673C1\",\r\n },\r\n lowButton: {\r\n position: \"absolute\",\r\n top: \"174px\",\r\n left: \"50px\",\r\n color: \"#0673C1\",\r\n },\r\n slider: {\r\n float: \"right\",\r\n color: \"#0673C1\",\r\n },\r\n chainButton: {\r\n position: \"absolute\",\r\n top: \"244px\",\r\n left: \"14px\",\r\n },\r\n};\r\n\r\nclass OverlaySlider extends Component {\r\n constructor(props) {\r\n super(props);\r\n if (props.componentRef) props.componentRef(this);\r\n this.state = {\r\n value: 100,\r\n upperListValue: \"\",\r\n lowerListValue: \"\",\r\n checkedUp: false,\r\n checkedLow: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const {\r\n activeFileId,\r\n splitscreenFileIds,\r\n fullscreenFileIds,\r\n addFile,\r\n setOpacity,\r\n } = this.props;\r\n let lowValue;\r\n\r\n activeFileId === splitscreenFileIds[0]\r\n ? (lowValue = splitscreenFileIds[1])\r\n : (lowValue = splitscreenFileIds[0]);\r\n\r\n if (fullscreenFileIds.length === 1) {\r\n addFile(lowValue, 1);\r\n } else {\r\n addFile(activeFileId, 0);\r\n addFile(lowValue, 1);\r\n }\r\n\r\n setOpacity(0, this.state.value);\r\n setOpacity(1, 100 - this.state.value);\r\n\r\n this.setState({\r\n upperListValue: activeFileId,\r\n lowerListValue: lowValue,\r\n checkedUp: true,\r\n init: false,\r\n });\r\n }\r\n\r\n componentDidUpdate() {\r\n const { activeFileId } = this.props;\r\n const { checkedUp, checkedLow, upperListValue, lowerListValue } =\r\n this.state;\r\n\r\n if (\r\n (checkedUp && upperListValue !== activeFileId) ||\r\n (checkedLow && lowerListValue !== activeFileId)\r\n ) {\r\n this.update();\r\n }\r\n }\r\n\r\n update = () => {\r\n const { activeFileId } = this.props;\r\n if (this.state.checkedUp) {\r\n this.setState({\r\n upperListValue: activeFileId,\r\n });\r\n this.props.addFile(activeFileId, 0);\r\n } else {\r\n this.setState({\r\n lowerListValue: activeFileId,\r\n });\r\n this.props.addFile(activeFileId, 1);\r\n }\r\n };\r\n\r\n fileCheck = (fileId, callback) => {\r\n if (\r\n fileId === this.state.lowerListValue ||\r\n fileId === this.state.upperListValue\r\n ) {\r\n this.setState({\r\n checkedUp: !this.state.checkedUp,\r\n checkedLow: !this.state.checkedLow,\r\n });\r\n this.state.checkedLow\r\n ? this.handleUpVisChange()\r\n : this.handleLowVisChange();\r\n }\r\n callback();\r\n };\r\n\r\n handleChange = (event, value) => {\r\n this.setState({ value });\r\n this.props.setOpacity(0, value);\r\n this.props.setOpacity(1, 100 - value);\r\n };\r\n\r\n handleUpMenuChange = (event) => {\r\n this.setState({ upperListValue: event.target.value });\r\n this.props.addFile(event.target.value, 0);\r\n if (this.state.checkedUp) this.props.setActive(event.target.value);\r\n this.setState({ init: false });\r\n };\r\n\r\n handleLowMenuChange = (event) => {\r\n this.setState({ lowerListValue: event.target.value });\r\n this.props.addFile(event.target.value, 1);\r\n if (this.state.checkedLow) this.props.setActive(event.target.value);\r\n this.setState({ init: false });\r\n };\r\n\r\n handleCheck = () => {\r\n !this.state.checkedUp\r\n ? this.props.setActive(this.state.upperListValue)\r\n : this.props.setActive(this.state.lowerListValue);\r\n\r\n this.setState({\r\n checkedUp: !this.state.checkedUp,\r\n checkedLow: !this.state.checkedLow,\r\n });\r\n };\r\n\r\n handleUpVisChange = () => {\r\n if (this.state.value !== 100) {\r\n this.setState({ value: 100 });\r\n this.props.setOpacity(0, 100);\r\n this.props.setOpacity(1, 0);\r\n } else {\r\n this.handleLowVisChange();\r\n }\r\n };\r\n\r\n handleLowVisChange = () => {\r\n if (this.state.value !== 0) {\r\n this.setState({ value: 0 });\r\n this.props.setOpacity(0, 0);\r\n this.props.setOpacity(1, 100);\r\n } else {\r\n this.handleUpVisChange();\r\n }\r\n };\r\n\r\n render() {\r\n const { classes, omeDict, fsChain, splitscreenFileIds } = this.props;\r\n const { upperListValue, lowerListValue, value, checkedUp, checkedLow } =\r\n this.state;\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n {splitscreenFileIds.map(\r\n (id, index) =>\r\n id !== lowerListValue &&\r\n omeDict[id] && (\r\n \r\n {omeDict[id].fileName} {omeDict[id].scene + 1}\r\n \r\n )\r\n )}\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n {splitscreenFileIds.map(\r\n (id, index) =>\r\n id !== upperListValue &&\r\n omeDict[id] && (\r\n \r\n {omeDict[id].fileName} {omeDict[id].scene + 1}\r\n \r\n )\r\n )}\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n }\r\n />\r\n \r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {this.props.isChained ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n value}\r\n aria-labelledby=\"discrete-slider-custom\"\r\n valueLabelDisplay=\"auto\"\r\n orientation=\"vertical\"\r\n value={value}\r\n onChange={this.handleChange}\r\n >\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nOverlaySlider.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n componentRef: PropTypes.func,\r\n setOpacity: PropTypes.func,\r\n activeFileId: PropTypes.string,\r\n splitscreenFileIds: PropTypes.array,\r\n omeDict: PropTypes.object,\r\n addFile: PropTypes.func,\r\n setActive: PropTypes.func,\r\n fullscreenFileIds: PropTypes.array,\r\n fsChain: PropTypes.func,\r\n isChained: PropTypes.bool,\r\n rendererdict: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(OverlaySlider);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = {\r\n canvasComp: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n CompContainer: {\r\n position: \"absolute\",\r\n zIndex: 100,\r\n display: \"inline-flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"200px\",\r\n height: \"200px\",\r\n // resize: \"both\", // TODO: Add listener to allow window resizing that executes handleSizeChanged()\r\n overflow: \"hidden\",\r\n background: \"#D3D3D3\",\r\n border: \"1px solid black\",\r\n },\r\n};\r\n\r\nclass WindowTool extends Component {\r\n constructor(props) {\r\n super(props);\r\n if (props.componentRef) props.componentRef(this);\r\n this.state = {\r\n pos: { x: 0, y: 0 },\r\n dragging: false,\r\n fileId: null,\r\n size: { height: 200, width: 200 },\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.canvas = document.getElementById(\"WindowToolCanvas\");\r\n this.ctx = this.canvas.getContext(\"2d\");\r\n this.ctx.canvas.width = this.state.size.width;\r\n this.ctx.canvas.height = this.state.size.height;\r\n let r = this.props.rendererDict[\"Full\" + this.props.activeFileId];\r\n let idx =\r\n this.props.fullscreenFileIds.indexOf(this.props.activeFileId) === 0\r\n ? 1\r\n : 0;\r\n this.setState({\r\n pos: {\r\n x: r.canvas.width / 2 - this.ctx.canvas.width / 2,\r\n y: r.canvas.height / 2 - this.ctx.canvas.height / 2,\r\n },\r\n fileId: this.props.fullscreenFileIds[idx],\r\n });\r\n this.ctx.canvas.style.cursor = \"pointer\";\r\n }\r\n\r\n componentWillUnmount() {\r\n document.removeEventListener(\"mousemove\", this.onMouseMove);\r\n document.removeEventListener(\"mouseup\", this.onMouseUp);\r\n }\r\n\r\n componentDidUpdate() {\r\n if (this.state.dragging) {\r\n document.addEventListener(\"mousemove\", this.onMouseMove);\r\n document.addEventListener(\"mouseup\", this.onMouseUp);\r\n } else if (!this.state.dragging) {\r\n document.removeEventListener(\"mousemove\", this.onMouseMove);\r\n document.removeEventListener(\"mouseup\", this.onMouseUp);\r\n }\r\n\r\n let idx =\r\n this.props.fullscreenFileIds.indexOf(this.props.activeFileId) === 0\r\n ? 1\r\n : 0;\r\n let id = this.props.fullscreenFileIds[idx];\r\n if (id !== this.state.fileId) {\r\n this.setState({\r\n fileId: id,\r\n });\r\n }\r\n }\r\n\r\n onMouseDown = (e) => {\r\n if (e.button !== 0) return;\r\n this.ctx.canvas.style.cursor = \"grab\";\r\n this.setState({\r\n dragging: true,\r\n });\r\n e.stopPropagation();\r\n e.preventDefault();\r\n };\r\n\r\n onMouseUp = (e) => {\r\n this.setState({ dragging: false });\r\n this.ctx.canvas.style.cursor = \"pointer\";\r\n e.stopPropagation();\r\n e.preventDefault();\r\n };\r\n\r\n onMouseMove = (e) => {\r\n if (!this.state.dragging) return;\r\n let x = e.pageX - this.canvas.offsetWidth / 2;\r\n let y = e.pageY - 64 - this.canvas.offsetHeight / 2;\r\n let r = this.props.rendererDict[\"Full\" + this.state.fileId];\r\n if (x > r.canvas.width - this.canvas.width)\r\n x = r.canvas.width - this.canvas.width;\r\n if (y > r.canvas.height - this.canvas.height)\r\n y = r.canvas.height - this.canvas.height;\r\n if (x < 0) x = 0;\r\n if (y < 0) y = 0;\r\n this.setState({\r\n pos: {\r\n x: x,\r\n y: y,\r\n },\r\n });\r\n e.stopPropagation();\r\n e.preventDefault();\r\n };\r\n\r\n updateCanvas = () => {\r\n this.ctx.canvas.width = this.state.size.width;\r\n this.ctx.canvas.height = this.state.size.height;\r\n let r = this.props.rendererDict[\"Full\" + this.state.fileId];\r\n if (r) {\r\n if (r.ctx) {\r\n this.ctx.putImageData(\r\n r.ctx.getImageData(\r\n this.state.pos.x,\r\n this.state.pos.y,\r\n this.state.size.width,\r\n this.state.size.height\r\n ),\r\n 0,\r\n 0\r\n );\r\n }\r\n }\r\n };\r\n\r\n handleSizeChanged = (size) => {\r\n this.setState({ size });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n \r\n event.preventDefault()}\r\n onMouseDown={this.onMouseDown}\r\n />\r\n \r\n );\r\n }\r\n}\r\n\r\nWindowTool.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n componentRef: PropTypes.func,\r\n rendererDict: PropTypes.object,\r\n activeFileId: PropTypes.string,\r\n fullscreenFileIds: PropTypes.array,\r\n};\r\n\r\nexport default withStyles(styles)(WindowTool);\r\n","import React, { Component } from \"react\";\r\n\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport * as THREE from \"three\";\r\n\r\nclass ViewHelper extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n scene: new THREE.Scene(),\r\n renderer: new THREE.WebGLRenderer({ antialias: true, alpha: true }),\r\n camera: new THREE.PerspectiveCamera(75, 800 / 800, 0.1, 1000),\r\n propsCam: this.props.camera,\r\n cameraPosition: new THREE.Vector3(0, 0, 1),\r\n focusPoint: new THREE.Vector3(0, 0, 0),\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n let width = this.props.viewHelperSize;\r\n let height = this.props.viewHelperSize;\r\n //Config Renderer\r\n this.state.renderer.setClearColor(0x000000, 0);\r\n this.state.renderer.setSize(width, height);\r\n this.mount.appendChild(this.state.renderer.domElement);\r\n //Config Camera\r\n let cameraPosition = new THREE.Vector3(0, 0, 1);\r\n let focusPoint = new THREE.Vector3(0, 0, 0);\r\n this.setState({\r\n cameraPosition,\r\n focusPoint,\r\n });\r\n this.state.camera.position.set(\r\n cameraPosition.x,\r\n cameraPosition.y,\r\n cameraPosition.z\r\n );\r\n this.state.camera.lookAt(focusPoint);\r\n // Custom Axes\r\n let color1 = new THREE.Color(\"#ff3653\");\r\n let color2 = new THREE.Color(\"#8adb00\");\r\n let color3 = new THREE.Color(\"#2c8fff\");\r\n let geometry = new THREE.BoxGeometry(0.4, 0.01, 0.01).translate(0.2, 0, 0);\r\n let xAxis = new THREE.Mesh(geometry, this.getAxisMaterial(color1));\r\n let yAxis = new THREE.Mesh(geometry, this.getAxisMaterial(color2));\r\n let zAxis = new THREE.Mesh(geometry, this.getAxisMaterial(color3));\r\n yAxis.rotation.z = Math.PI / 2;\r\n zAxis.rotation.y = -Math.PI / 2;\r\n this.state.scene.add(xAxis);\r\n this.state.scene.add(zAxis);\r\n this.state.scene.add(yAxis);\r\n let posXAxisHelper = new THREE.Sprite(this.getSpriteMaterial(color1, \"X\"));\r\n posXAxisHelper.userData.type = \"posX\";\r\n let posYAxisHelper = new THREE.Sprite(this.getSpriteMaterial(color2, \"Z\"));\r\n posYAxisHelper.userData.type = \"posY\";\r\n let posZAxisHelper = new THREE.Sprite(this.getSpriteMaterial(color3, \"Y\"));\r\n posZAxisHelper.userData.type = \"posZ\";\r\n let negXAxisHelper = new THREE.Sprite(this.getSpriteMaterial(color1));\r\n negXAxisHelper.userData.type = \"negX\";\r\n let negYAxisHelper = new THREE.Sprite(this.getSpriteMaterial(color2));\r\n negYAxisHelper.userData.type = \"negY\";\r\n let negZAxisHelper = new THREE.Sprite(this.getSpriteMaterial(color3));\r\n negZAxisHelper.userData.type = \"negZ\";\r\n posXAxisHelper.position.x = 0.4;\r\n posYAxisHelper.position.y = 0.4;\r\n posZAxisHelper.position.z = 0.4;\r\n negXAxisHelper.position.x = -0.4;\r\n negYAxisHelper.position.y = -0.4;\r\n negZAxisHelper.position.z = -0.4;\r\n posXAxisHelper.scale.setScalar(0.3);\r\n negXAxisHelper.scale.setScalar(0.2);\r\n posYAxisHelper.scale.setScalar(0.3);\r\n negYAxisHelper.scale.setScalar(0.2);\r\n posZAxisHelper.scale.setScalar(0.3);\r\n negZAxisHelper.scale.setScalar(0.2);\r\n this.state.scene.add(posXAxisHelper);\r\n this.state.scene.add(posYAxisHelper);\r\n this.state.scene.add(posZAxisHelper);\r\n this.state.scene.add(negXAxisHelper);\r\n this.state.scene.add(negYAxisHelper);\r\n this.state.scene.add(negZAxisHelper);\r\n this.renderScene();\r\n //start animation\r\n this.start();\r\n };\r\n\r\n getAxisMaterial = (color) => {\r\n return new THREE.MeshBasicMaterial({ color: color, toneMapped: false });\r\n };\r\n\r\n getSpriteMaterial = (color, text = null) => {\r\n let canvas = document.createElement(\"canvas\");\r\n canvas.width = 64;\r\n canvas.height = 64;\r\n\r\n let context = canvas.getContext(\"2d\");\r\n context.beginPath();\r\n context.arc(32, 32, 16, 0, 2 * Math.PI);\r\n context.closePath();\r\n context.fillStyle = color.getStyle();\r\n context.fill();\r\n\r\n if (text !== null) {\r\n context.font = \"24px Arial\";\r\n context.textAlign = \"center\";\r\n context.fillStyle = \"#000000\";\r\n context.fillText(text, 32, 41);\r\n }\r\n let texture = new THREE.CanvasTexture(canvas);\r\n\r\n return new THREE.SpriteMaterial({ map: texture, toneMapped: false });\r\n };\r\n\r\n renderScene = () => {\r\n if (this.state.renderer) {\r\n let cameraPosition = new THREE.Vector3(0, 0, 1).applyQuaternion(\r\n this.props.camera.quaternion\r\n );\r\n // let cube = this.state.scene.children[2];\r\n let posXAxisHelper = this.state.scene.children[3];\r\n let posYAxisHelper = this.state.scene.children[4];\r\n let posZAxisHelper = this.state.scene.children[5];\r\n let negXAxisHelper = this.state.scene.children[6];\r\n let negYAxisHelper = this.state.scene.children[7];\r\n let negZAxisHelper = this.state.scene.children[8];\r\n\r\n if (cameraPosition.x >= 0) {\r\n posXAxisHelper.material.opacity = 1;\r\n negXAxisHelper.material.opacity = 0.5;\r\n } else {\r\n posXAxisHelper.material.opacity = 0.5;\r\n negXAxisHelper.material.opacity = 1;\r\n }\r\n if (cameraPosition.y >= 0) {\r\n posYAxisHelper.material.opacity = 1;\r\n negYAxisHelper.material.opacity = 0.5;\r\n } else {\r\n posYAxisHelper.material.opacity = 0.5;\r\n negYAxisHelper.material.opacity = 1;\r\n }\r\n if (cameraPosition.z >= 0) {\r\n posZAxisHelper.material.opacity = 1;\r\n negZAxisHelper.material.opacity = 0.5;\r\n } else {\r\n posZAxisHelper.material.opacity = 0.5;\r\n negZAxisHelper.material.opacity = 1;\r\n }\r\n\r\n this.state.camera.position.set(\r\n cameraPosition.x,\r\n cameraPosition.y,\r\n cameraPosition.z\r\n );\r\n this.state.camera.position.set(\r\n cameraPosition.x,\r\n cameraPosition.y,\r\n cameraPosition.z\r\n );\r\n this.state.camera.lookAt(this.state.focusPoint);\r\n this.state.renderer.render(this.state.scene, this.state.camera);\r\n }\r\n };\r\n\r\n start = () => {\r\n if (!this.frameId) {\r\n this.frameId = requestAnimationFrame(this.animate);\r\n }\r\n };\r\n\r\n stop = () => {\r\n cancelAnimationFrame(this.frameId);\r\n };\r\n\r\n animate = () => {\r\n //Animate Models Here\r\n //ReDraw Scene with Camera and Scene Object\r\n this.renderScene();\r\n this.frameId = window.requestAnimationFrame(this.animate);\r\n };\r\n\r\n render() {\r\n return (\r\n (this.mount = ref)}\r\n style={{ position: \"absolute\", right: 0, bottom: 0 }}\r\n />\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nViewHelper.propTypes = {\r\n viewHelperSize: PropTypes.number,\r\n camera: PropTypes.object,\r\n};\r\n\r\nexport default ViewHelper;\r\n","// ... App.js\r\n\r\nimport React, { Component } from \"react\";\r\n\r\nimport PropTypes from \"prop-types\";\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\n\r\n// 3D-Viewer Libraries\r\nimport * as THREE from \"three\";\r\nimport { GLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader\";\r\nimport { OrbitControls } from \"three/examples/jsm/controls/OrbitControls\";\r\nimport ViewHelper from \"./3DViewHelper\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faInfo } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\n// Custom Components\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst styles = {\r\n root: {\r\n pointerEvents: \"none\",\r\n width: \"auto\",\r\n maxWidth: \"600px\",\r\n height: 46,\r\n\r\n position: \"absolute\",\r\n top: 10,\r\n left: 5,\r\n color: \"#ffffff\",\r\n\r\n padding: 0,\r\n \"& :active\": {\r\n outline: \"\",\r\n },\r\n background: \"#000000AA\",\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n borderRadius: 10,\r\n },\r\n barIcon: {\r\n position: \"absolute\",\r\n top: 2,\r\n left: 0,\r\n height: 36,\r\n width: \"36px!important\",\r\n padding: 8,\r\n color: \"#ffffff\",\r\n },\r\n infoArea: {\r\n paddingLeft: \"40px\",\r\n paddingRight: \"10px\",\r\n right: 0,\r\n top: 0,\r\n bottom: 0,\r\n color: \"#fff\",\r\n },\r\n};\r\n\r\nclass Viewer3D extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n if (props.componentRef) props.componentRef(this);\r\n this.state = {\r\n width: 800,\r\n height: 800,\r\n viewHelperSize: 128,\r\n mode: \"Loading\",\r\n status: \"Loading\",\r\n };\r\n this.scene = new THREE.Scene();\r\n this.renderer3D = new THREE.WebGLRenderer({ antialias: true });\r\n this.camera = new THREE.PerspectiveCamera(75, 800 / 800, 0.1, 1000);\r\n }\r\n\r\n componentDidMount = () => {\r\n const container = document.getElementById(\"3dViewerContainer\");\r\n let width = container.offsetWidth;\r\n let height = container.offsetHeight;\r\n this.setState({ width });\r\n this.setState({ height });\r\n\r\n this.props.spinloader.show(20);\r\n\r\n //Config Renderer\r\n this.renderer3D.setClearColor(\"#263238\");\r\n this.renderer3D.setSize(width, height);\r\n this.renderer3D.outputEncoding = THREE.sRGBEncoding;\r\n this.renderer3D.toneMappingExposure = 1.0;\r\n this.mount.appendChild(this.renderer3D.domElement);\r\n //Config Camera\r\n this.camera.position.set(0, 0, 500);\r\n this.camera.lookAt(0, 0, 0);\r\n this.camera.aspect = width / height;\r\n this.camera.updateProjectionMatrix();\r\n // add Light to camera and scene\r\n let color = 0xffffff;\r\n let intensity = 1;\r\n let light = new THREE.DirectionalLight(color, intensity);\r\n light.position.set(0.5, 0, 0.866);\r\n this.camera.add(light);\r\n this.scene.add(this.camera);\r\n\r\n color = 0x222222;\r\n light = new THREE.AmbientLight(color, intensity);\r\n this.scene.add(light);\r\n\r\n //Camera Controls\r\n this.controls = new OrbitControls(this.camera, this.renderer3D.domElement);\r\n //LIGHTS\r\n\r\n // add GridHelper\r\n // const size = 100;\r\n // const divisions = 20;\r\n // const gridHelper = new THREE.GridHelper(size, divisions);\r\n // this.scene.add(gridHelper);\r\n\r\n // Get variables for analysis\r\n const fileId = this.props.fileId;\r\n const projectId = this.props.projectId;\r\n const minZ = this.props.minZ;\r\n const maxZ = this.props.maxZ;\r\n const zRange = minZ + \",\" + maxZ;\r\n const showPointCloud = this.props.showPointCloud;\r\n\r\n const data = {\r\n fileId,\r\n projectId,\r\n zRange,\r\n showPointCloud,\r\n };\r\n\r\n // Render Scene\r\n this.renderScene();\r\n //start animation\r\n this.start();\r\n\r\n // Adding 3D-Models\r\n let res = Backend.get3dObjects(data);\r\n const gltfLoader = new GLTFLoader();\r\n\r\n gltfLoader.load(\r\n // \"./assets3d/Horse.glb\",\r\n res,\r\n (gltf) => {\r\n const box = new THREE.Box3().setFromObject(gltf.scene);\r\n const center = box.getCenter(new THREE.Vector3());\r\n\r\n gltf.scene.position.x += gltf.scene.position.x - center.x;\r\n gltf.scene.position.y += gltf.scene.position.y - center.y;\r\n gltf.scene.position.z += gltf.scene.position.z - center.z;\r\n\r\n gltf.scene.name = \"object_scene\";\r\n\r\n this.scene.add(gltf.scene);\r\n this.renderScene();\r\n this.setState({ status: \"\" });\r\n this.props.spinloader.hide();\r\n },\r\n // called while loading is progressing\r\n () => {},\r\n // called when loading has errors\r\n (error) => {\r\n console.log(\"An error happened\");\r\n console.log(error);\r\n this.setState({ status: \"ERROR\", mode: \"ERROR\" });\r\n this.props.spinloader.hide();\r\n }\r\n );\r\n\r\n Backend.get3DAllObjectsExists(data, (res) => {\r\n if (res === \"True\") {\r\n this.setState({ mode: \"Job results\" });\r\n } else {\r\n this.setState({ mode: \"Histogram Preview\" });\r\n }\r\n });\r\n };\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.showPointCloud !== this.props.showPointCloud) {\r\n this.load3DObject(this.props.showPointCloud);\r\n }\r\n }\r\n\r\n load3DObject = (showPointCloud) => {\r\n this.props.spinloader.show(20);\r\n\r\n let selectedObject = this.scene.getObjectByName(\"object_scene\");\r\n this.scene.remove(selectedObject);\r\n console.log(\"showProintCloud\", showPointCloud);\r\n\r\n // Get variables for analysis\r\n const fileId = this.props.fileId;\r\n const projectId = this.props.projectId;\r\n const minZ = this.props.minZ;\r\n const maxZ = this.props.maxZ;\r\n const zRange = minZ + \",\" + maxZ;\r\n\r\n const data = {\r\n fileId,\r\n projectId,\r\n zRange,\r\n showPointCloud,\r\n };\r\n\r\n // Adding 3D-Models\r\n let res = Backend.get3dObjects(data);\r\n const gltfLoader = new GLTFLoader();\r\n\r\n gltfLoader.load(\r\n // \"./assets3d/Horse.glb\",\r\n res,\r\n (gltf) => {\r\n const box = new THREE.Box3().setFromObject(gltf.scene);\r\n const center = box.getCenter(new THREE.Vector3());\r\n\r\n gltf.scene.position.x += gltf.scene.position.x - center.x;\r\n gltf.scene.position.y += gltf.scene.position.y - center.y;\r\n gltf.scene.position.z += gltf.scene.position.z - center.z;\r\n\r\n gltf.scene.name = \"object_scene\";\r\n\r\n this.scene.add(gltf.scene);\r\n this.renderScene();\r\n this.setState({ status: \"\" });\r\n this.props.spinloader.hide();\r\n },\r\n // called while loading is progressing\r\n () => {},\r\n // called when loading has errors\r\n (error) => {\r\n console.log(\"An error happened\");\r\n console.log(error);\r\n this.setState({ status: \"ERROR\", mode: \"ERROR\" });\r\n this.props.spinloader.hide();\r\n }\r\n );\r\n };\r\n\r\n start = () => {\r\n if (!this.frameId) {\r\n this.frameId = requestAnimationFrame(this.animate);\r\n }\r\n };\r\n\r\n stop = () => {\r\n cancelAnimationFrame(this.frameId);\r\n };\r\n\r\n animate = () => {\r\n //Animate Models Here\r\n //ReDraw Scene with Camera and Scene Object\r\n this.renderScene();\r\n this.frameId = window.requestAnimationFrame(this.animate);\r\n };\r\n\r\n renderScene = () => {\r\n if (this.renderer3D) {\r\n this.renderer3D.render(this.scene, this.camera);\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n
\r\n \r\n\r\n
\r\n \r\n
\r\n \r\n {this.state.mode}\r\n \r\n \r\n {this.state.status}\r\n \r\n
\r\n
\r\n\r\n
(this.mount = ref)} />\r\n
\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nViewer3D.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n fileId: PropTypes.string,\r\n ome: PropTypes.object,\r\n projectId: PropTypes.string,\r\n minZ: PropTypes.number,\r\n maxZ: PropTypes.number,\r\n showPointCloud: PropTypes.bool,\r\n componentRef: PropTypes.object,\r\n spinloader: PropTypes.object,\r\n};\r\n\r\n// const rootElement = document.getElementById(\"root\")\r\n// ReactDOM.render(, rootElement);\r\nexport default withSpinloader(withStyles(styles)(Viewer3D));\r\n","class Tool {\r\n name = \"Tool Display Name\";\r\n flag = false;\r\n prevX = 0;\r\n currX = 0;\r\n prevY = 0;\r\n currY = 0;\r\n downScale = 2;\r\n\r\n setLayer() {}\r\n\r\n setPreviewRect() {}\r\n\r\n initDrawing() {}\r\n\r\n updateDrawing() {}\r\n\r\n mouse() {}\r\n\r\n drawCustomCursor() {}\r\n\r\n renderConfiguration() {}\r\n\r\n exit() {}\r\n}\r\n\r\nexport default Tool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { FormControl, FormControlLabel, Checkbox } from \"@mui/material\";\r\n\r\nclass OverlapConfigForm extends Component {\r\n state = {\r\n removeOverlap: this.props.removeOverlap ? true : false,\r\n removeOverlapSame: this.props.removeOverlapSame ? true : false,\r\n useNodeDrawingMode: this.props.useNodeDrawingMode ? true : false,\r\n };\r\n\r\n render() {\r\n const {\r\n onChangeRemoveOverlap,\r\n onChangeRemoveOverlapSame,\r\n onChangeUseNodeDrawingMode,\r\n } = this.props;\r\n const { removeOverlap, removeOverlapSame, useNodeDrawingMode } = this.state;\r\n return (\r\n
\r\n \r\n
\r\n {\r\n onChangeRemoveOverlapSame(e.target.checked);\r\n this.setState({ removeOverlapSame: e.target.checked });\r\n }}\r\n value=\"remove overlaps of same structure\"\r\n />\r\n }\r\n label=\"remove overlaps of same structure\"\r\n />\r\n
\r\n
\r\n {\r\n onChangeRemoveOverlap(e.target.checked);\r\n this.setState({ removeOverlap: e.target.checked });\r\n }}\r\n value=\"remove overlaps of same level\"\r\n />\r\n }\r\n label=\"remove overlaps of same visible level\"\r\n />\r\n
\r\n {typeof this.props.useNodeDrawingMode !== \"undefined\" && (\r\n
\r\n {\r\n onChangeUseNodeDrawingMode(e.target.checked);\r\n this.setState({ useNodeDrawingMode: e.target.checked });\r\n }}\r\n value=\"Use Node drawing mode!\"\r\n />\r\n }\r\n label=\"Use Node drawing mode (apply with other mouse button)!\"\r\n />\r\n
\r\n )}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nOverlapConfigForm.propTypes = {\r\n removeOverlap: PropTypes.bool,\r\n removeOverlapSame: PropTypes.bool,\r\n useNodeDrawingMode: PropTypes.bool,\r\n onChangeUseNodeDrawingMode: PropTypes.func,\r\n onChangeRemoveOverlap: PropTypes.func,\r\n onChangeRemoveOverlapSame: PropTypes.func,\r\n};\r\n\r\nexport default OverlapConfigForm;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport Tool from \"./Tool\";\r\n\r\nimport {\r\n lineArrayBuffer,\r\n updateDrawLayer,\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n checkIfStructureHidden,\r\n findClickedRoi,\r\n createRegionRoi,\r\n distance,\r\n} from \"../../utils/PolygonUtil\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\nimport { FormLabel, FormControl, Slider, Typography } from \"@mui/material\";\r\n\r\nclass PenTool extends Tool {\r\n name = \"Pen\";\r\n flag = false;\r\n downScale = 2;\r\n penRadius = 10;\r\n minPenRadius = 1;\r\n maxPenRadius = 200;\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n lastP = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n useNodeDrawingMode = null;\r\n tempUseNodeDrawingMode = null;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n if (this.useNodeDrawingMode === null) {\r\n this.useNodeDrawingMode = project.projectProperties[\"NodeDrawingMode\"]\r\n ? true\r\n : false;\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.tempRemoveOverlapSame = this.removeOverlapSame;\r\n this.removeOverlap = false;\r\n this.removeOverlapSame = false;\r\n this.tempUseNodeDrawingMode = this.useNodeDrawingMode;\r\n this.useNodeDrawingMode = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n this.removeOverlapSame = this.tempRemoveOverlapSame;\r\n this.useNodeDrawingMode = this.tempUseNodeDrawingMode;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n onKeyDown(e) {\r\n let delta = Math.max(1, parseInt(this.penRadius * 0.05, 10));\r\n if (e.code === \"KeyS\") {\r\n this.penRadius -= delta;\r\n } else if (e.code === \"KeyW\") {\r\n this.penRadius += delta;\r\n }\r\n if (this.penRadius < this.minPenRadius) {\r\n this.penRadius = this.minPenRadius;\r\n }\r\n if (this.penRadius > this.maxPenRadius) {\r\n this.penRadius = this.maxPenRadius;\r\n }\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n addPoint = (event, p) => {\r\n let eventPoint = { x: event.clientX, y: event.clientY };\r\n if (this.line.length < 3 || this.useNodeDrawingMode) {\r\n this.line.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n } else {\r\n const dist = distance(this.lastEventPoint, eventPoint);\r\n if (dist < 10) {\r\n this.line[this.line.length - 1] = [p.x, p.y];\r\n } else {\r\n this.line.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n }\r\n }\r\n };\r\n\r\n mouse(params) {\r\n let { event, p, color, subtype, name, positionInRoiLayer, fullyLoaded } =\r\n params;\r\n if (typeof p === \"undefined\") {\r\n this.line = [];\r\n return;\r\n }\r\n // mouse middle button\r\n if (event.button === 1) {\r\n return;\r\n }\r\n if (this.useNodeDrawingMode) {\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n if (this.flag) {\r\n if (\r\n (this.clear && event.button === 2) ||\r\n (!this.clear && event.button === 0)\r\n ) {\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n } else {\r\n this.applyDrawLayer(\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n event,\r\n p\r\n );\r\n }\r\n } else {\r\n this.initDrawing(subtype, name, color, event, p);\r\n }\r\n }\r\n return;\r\n }\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n this.initDrawing(subtype, name, color, event, p);\r\n } else if (event.type === \"mouseup\") {\r\n this.applyDrawLayer(\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded\r\n );\r\n this.drawLayer.regionRois = [];\r\n } else if (event.type === \"mousemove\") {\r\n if (this.flag) {\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n }\r\n }\r\n this.lastP = p;\r\n }\r\n\r\n initDrawing = (subtype, name, color, event, p) => {\r\n checkIfStructureHidden(\r\n this.structures,\r\n this.selectedLayer,\r\n subtype,\r\n name,\r\n color\r\n );\r\n this.clear = event.button === 2;\r\n this.drawLayer.clear = this.clear;\r\n this.line = [[p.x, p.y]];\r\n this.flag = true;\r\n if (this.removeOverlapSame) {\r\n this.clickedOnRoi = findClickedRoi(\r\n p,\r\n this.selectedLayer,\r\n this.structures,\r\n this.roiLayers,\r\n this.includeBaseROI\r\n );\r\n }\r\n };\r\n\r\n replaceLastPointInDrawLayer = (event, p, color, subtype) => {\r\n if (this.line.length === 1) {\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n return;\r\n }\r\n if (this.line.length > 1) {\r\n this.line.pop();\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n }\r\n };\r\n\r\n applyDrawLayer = (color, subtype, name, positionInRoiLayer, fullyLoaded) => {\r\n this.flag = false;\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n let linePoly = lineArrayBuffer(\r\n this.line,\r\n this.penRadius,\r\n this.ome.sizeX,\r\n this.ome.sizeY\r\n );\r\n let lineRegions = {\r\n regions:\r\n linePoly !== null\r\n ? [\r\n createRegionRoi(\r\n [linePoly.geometry.coordinates],\r\n color,\r\n subtype,\r\n name,\r\n fullyLoaded,\r\n this.structures[this.originalSelectedLayer].id,\r\n false\r\n ),\r\n ]\r\n : [],\r\n inverted: false,\r\n };\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n updateLayer(\r\n this.layer,\r\n lineRegions,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi\r\n );\r\n this.drawLayer.regionRois = [];\r\n this.line = [];\r\n };\r\n\r\n addPointToDrawLayer = (event, p, color, subtype) => {\r\n // update position history\r\n this.addPoint(event, p);\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n let linePoly = lineArrayBuffer(\r\n this.line,\r\n this.penRadius,\r\n this.ome.sizeX,\r\n this.ome.sizeY\r\n );\r\n\r\n let lineRegions = {\r\n regions: linePoly !== null ? [linePoly.geometry.coordinates] : [],\r\n inverted: false,\r\n };\r\n updateDrawLayer(this.drawLayer, lineRegions, false, color, subtype, name);\r\n };\r\n\r\n drawCustomCursor(ctx, mousePosition, fkt, fromGallery) {\r\n let p = mousePosition;\r\n fromGallery = fromGallery && fromGallery === true ? true : false;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n if (this.useNodeDrawingMode && this.line?.length > 0) {\r\n const lineEnd = this.line[this.line.length - 1];\r\n let previewLine = [lineEnd, [p.x, p.y]];\r\n let linePoly = lineArrayBuffer(\r\n previewLine,\r\n this.penRadius,\r\n this.ome.sizeX,\r\n this.ome.sizeY\r\n );\r\n let points = linePoly.geometry.coordinates[0];\r\n ctx.lineWidth = 2 / fkt;\r\n ctx.strokeStyle = \"#000000\";\r\n ctx.moveTo(points[0][0], points[0][1]);\r\n for (let p of points) {\r\n ctx.lineTo(p[0], p[1]);\r\n }\r\n } else {\r\n let penRad =\r\n fkt && fromGallery && fromGallery === true\r\n ? this.penRadius * fkt\r\n : this.penRadius;\r\n ctx.arc(p.x, p.y, penRad, 0, 2 * Math.PI);\r\n }\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
\r\n {this.name}:\r\n {\r\n this.penRadius = e;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeRemoveOverlap={(e) => (this.removeOverlap = e)}\r\n />\r\n (this.useNodeDrawingMode = e)}\r\n onChangeRemoveOverlap={(e) => (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n state = {\r\n removeOverlap: this.props.removeOverlap,\r\n };\r\n\r\n render() {\r\n let { onChangePenRadius, penRadius, minPenRadius, maxPenRadius } =\r\n this.props;\r\n\r\n return (\r\n
\r\n \r\n \r\n {\"Line thickness = \" + penRadius + \" (smaller: S, wider: W)\"}\r\n \r\n {\r\n onChangePenRadius(v);\r\n this.setState({ penRadius: v });\r\n }}\r\n />\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n removeOverlap: PropTypes.bool,\r\n onChangePenRadius: PropTypes.func,\r\n penRadius: PropTypes.number,\r\n minPenRadius: PropTypes.number,\r\n maxPenRadius: PropTypes.number,\r\n};\r\n\r\nexport default PenTool;\r\n","import { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { FormLabel, FormControl, Slider, Typography } from \"@mui/material\";\r\nimport {\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n createRegionRoi,\r\n} from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\nimport MagicWandToolLib from \"magic-wand-tool\";\r\n\r\nlet hatchOffset = 0;\r\n\r\nclass MagicWandTool extends Tool {\r\n name = \"MagicWand\";\r\n noConfig = false;\r\n flag = false;\r\n downScale = 2;\r\n removeOverlap = null;\r\n tempRemoveOverlap = null;\r\n threshold = 15; //default threshold value with best result\r\n shiftflag = false;\r\n points = [];\r\n drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n lastp = null;\r\n\r\n setLayer(obj) {\r\n this.ctx = obj.ctx; //context\r\n this.canvas = obj.ctx.canvas; //canvas\r\n this.layer = obj.layer; //layer\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.removeOverlap = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n getScale = () => {\r\n return this.ctx ? this.ctx.getTransform().a : 1;\r\n };\r\n\r\n getPosition = () => {\r\n return {\r\n x: -this.ctx.getTransform().e,\r\n y: -this.ctx.getTransform().f,\r\n };\r\n };\r\n\r\n useMagicWand(p, color, subtype, name, positionInRoiLayer, fullyLoaded) {\r\n this.lastp = p;\r\n let position = {\r\n x: parseInt(p.x * this.getScale() - this.getPosition().x, 10),\r\n y: parseInt(p.y * this.getScale() - this.getPosition().y, 10),\r\n };\r\n\r\n let ctx = this.canvas.getContext(\"2d\");\r\n //let points = [];\r\n //this.startPoint = position;\r\n let imageData = ctx.getImageData(\r\n 0,\r\n 0,\r\n this.canvas.width,\r\n this.canvas.height\r\n );\r\n\r\n // let len = imageData.data.length;\r\n // for (j = 0; j < len; j++){\r\n // imageData.data[j] = 255 - imageData.data[j];\r\n // }\r\n\r\n let image = {\r\n data: imageData.data,\r\n width: this.canvas.width,\r\n height: this.canvas.height,\r\n bytes: 4,\r\n };\r\n\r\n let wandMask = MagicWandToolLib.floodFill(\r\n image,\r\n position.x,\r\n position.y,\r\n this.threshold,\r\n null,\r\n true\r\n );\r\n\r\n let len = wandMask.data.length;\r\n for (let j = 0; j < len; j++) {\r\n if (wandMask.data[j] === 1) {\r\n wandMask.data[j] = 0;\r\n } else {\r\n wandMask.data[j] = 1;\r\n }\r\n }\r\n\r\n if (wandMask) {\r\n wandMask = MagicWandToolLib.gaussBlurOnlyBorder(wandMask, 2, null);\r\n }\r\n\r\n //let nonzeromask = wandMask.data.filter(number=>number>0);\r\n //console.log(\"nonzeromask:\",nonzeromask.length);\r\n //console.log(this.wandMask.data);\r\n\r\n //wandMask = MagicWandToolLib.gaussBlurOnlyBorder(wandMask, 5, null);\r\n let cacheInd = MagicWandToolLib.getBorderIndices(wandMask);\r\n //console.log(cacheInd.length);\r\n //this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n\r\n let w = this.canvas.width;\r\n let h = this.canvas.height;\r\n let x,\r\n j,\r\n i = null;\r\n let y = null;\r\n let hatchLength = 4;\r\n hatchOffset = (hatchOffset + 1) % (hatchLength * 2);\r\n\r\n ctx.clearRect(0, 0, w, h);\r\n\r\n len = cacheInd.length;\r\n for (j = 0; j < len; j++) {\r\n i = cacheInd[j];\r\n x = i % w; // calc x by index\r\n y = (i - x) / w; // calc y by index\r\n //let k = (y * w + x) * 4;\r\n if ((x + y + hatchOffset) % (hatchLength * 2) < hatchLength) {\r\n // detect hatch color\r\n this.points.push([\r\n (x + this.getPosition().x) / this.getScale(),\r\n (y + this.getPosition().y) / this.getScale(),\r\n ]);\r\n } else {\r\n this.points.push([\r\n (x + this.getPosition().x) / this.getScale(),\r\n (y + this.getPosition().y) / this.getScale(),\r\n ]);\r\n }\r\n }\r\n\r\n this.points = this.trace(wandMask);\r\n if (this.points.length > 2) {\r\n let drawRegion = {\r\n regions: [\r\n createRegionRoi([this.points], 0, null, null, null, 0, false),\r\n ],\r\n inverted: false,\r\n };\r\n updateLayer(\r\n this.layer,\r\n drawRegion,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n false,\r\n this.clickedOnRoi,\r\n this.activeTab === 1 // defines if it should be treated as an object\r\n );\r\n }\r\n }\r\n\r\n trace(wandMask) {\r\n let simplifyTolerant = 0;\r\n let simplifyCount = 50;\r\n let cs = MagicWandToolLib.traceContours(wandMask);\r\n cs = MagicWandToolLib.simplifyContours(cs, simplifyTolerant, simplifyCount);\r\n\r\n wandMask = null;\r\n\r\n //draw contours\r\n this.points = [];\r\n for (var i = 0; i < cs.length; i++) {\r\n if (!cs[i].inner) continue;\r\n var ps = cs[i].points;\r\n this.points.push([\r\n (ps[0].x + this.getPosition().x) / this.getScale(),\r\n (ps[0].y + this.getPosition().y) / this.getScale(),\r\n ]);\r\n for (var j = 1; j < ps.length; j++) {\r\n this.points.push([\r\n (ps[j].x + this.getPosition().x) / this.getScale(),\r\n (ps[j].y + this.getPosition().y) / this.getScale(),\r\n ]);\r\n }\r\n }\r\n return this.points;\r\n }\r\n\r\n mouseWheelEvent = (e) => {\r\n if (e.shiftKey) {\r\n if (e.deltaY > 0 && this.threshold > 0) {\r\n this.threshold--;\r\n updateLayer(this.layer, this.drawRegion, true, 0);\r\n this.useMagicWand(this.lastp);\r\n window.forceSidebarUpdate();\r\n } else if (e.deltaY < 0 && this.threshold < 250) {\r\n this.threshold++;\r\n updateLayer(this.layer, this.drawRegion, true, 0);\r\n this.useMagicWand(this.lastp);\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n };\r\n\r\n mouse(params) {\r\n let {\r\n event,\r\n p,\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n parentIdx,\r\n } = params;\r\n let parentLayer = parentIdx;\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n this.drawLayer.regionRois = [];\r\n this.drawLayer.inverted = false;\r\n // right mouse button -> clear\r\n this.clear = event.button === 2;\r\n this.drawLayer.clear = this.clear;\r\n\r\n // update position history\r\n this.startPoint = p;\r\n this.points = [];\r\n this.points.push([p.x, p.y]);\r\n\r\n // set drawing flag\r\n this.flag = true;\r\n } else if (\r\n event.type === \"mouseup\" ||\r\n (this.flag && event.type === \"mouseleave\")\r\n ) {\r\n this.useMagicWand(\r\n p,\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded\r\n ); //func goes here\r\n\r\n // release drawing flag\r\n this.flag = false;\r\n\r\n if (this.drawLayer.regionRois.length > 0) {\r\n //if not empty update drawing\r\n this.drawRegion.regions = [this.drawLayer.regionRois[0]];\r\n //updateLayer(this.layer, drawRegion, this.clear);\r\n let overlapRoiLayers = this.removeOverlap\r\n ? findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n )\r\n : [];\r\n\r\n updateLayer(\r\n this.layer,\r\n this.drawRegion,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[parentLayer],\r\n this.structures[this.selectedLayer].id,\r\n overlapRoiLayers\r\n );\r\n this.drawLayer.regionRois = [];\r\n }\r\n } else if (event.type === \"mousemove\") {\r\n // if (this.flag) {\r\n // let points = [];\r\n // points.push([this.startPoint.x, this.startPoint.y]);\r\n // points.push([p.x, this.startPoint.y]);\r\n // points.push([p.x, p.y]);\r\n // points.push([this.startPoint.x, p.y]);\r\n // console.log(typeof layer)\r\n // let drawRegion = {\r\n // regions: [createRegionRoi([points], 0, null, null, null, 0, false)],\r\n // inverted: false,\r\n // };\r\n // this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n // updateLayer(this.drawLayer, drawRegion, false, color, subtype, name);\r\n // }\r\n //do nothing\r\n }\r\n }\r\n\r\n drawCustomCursor() {\r\n // no custom cursor\r\n if (this.ctx) {\r\n //this.ctx.fillStyle = \"red\";\r\n //this.ctx.fillRect(10, 10, 50, 50);\r\n //let imgData = this.ctx.getImageData(10, 10, 50, 50);\r\n //this.ctx.putImageData(imgData, 10, 70,0,0,5000,5000);\r\n //this.useMagicWand(ctx, mousePosition);\r\n //this.ctx.clearRect(5000, 5000, this.canvas.width, this.canvas.height);\r\n }\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
\r\n {this.name}:\r\n {\r\n this.threshold = e;\r\n window.forceSidebarUpdate();\r\n }}\r\n />\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n render() {\r\n let { onChangeThreshold, threshold } = this.props;\r\n return (\r\n
\r\n \r\n {\"Threshold = \" + threshold}\r\n {\r\n onChangeThreshold(v);\r\n }}\r\n />\r\n \r\n {\"use shift + mouse wheel for region growth and decrease\"}\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n onChangeThreshold: PropTypes.func,\r\n threshold: PropTypes.number,\r\n};\r\n\r\nexport default MagicWandTool;\r\n","import {\r\n updateDrawLayer,\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n} from \"../../utils/PolygonUtil\";\r\n\r\nimport {\r\n Typography,\r\n FormControl,\r\n FormLabel,\r\n Slider,\r\n Checkbox,\r\n FormControlLabel,\r\n Button,\r\n} from \"@mui/material\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\n\r\nclass RegionGrowingTool extends Tool {\r\n toolName = \"Region Growing\";\r\n noConfig = false;\r\n flag = false;\r\n removeOverlap = true;\r\n tempRemoveOverlap = true;\r\n threshold = 30;\r\n\r\n setLayer(obj) {\r\n this.ctx = obj.ctx; //context\r\n this.canvas = obj.ctx.canvas; //canvas\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n this.scale = this.ctx ? this.ctx.getTransform().a : 1;\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.removeOverlap = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n next4Edges(edge) {\r\n const x = edge[0];\r\n const y = edge[1];\r\n return [\r\n [x + 1, y],\r\n [x - 1, y],\r\n [x, y + 1],\r\n [x, y - 1],\r\n ];\r\n }\r\n\r\n growRegion = (image, x, y) => {\r\n let seed = [parseInt(x, 10), parseInt(y, 10)];\r\n // seed = [10, 10];\r\n const delta = parseInt(this.threshold); //delta = threshold slider\r\n const width = image.width;\r\n const height = image.height;\r\n const inputData = image.data;\r\n const outputData = new Uint8ClampedArray(new ImageData(width, height).data);\r\n const seedIdx = (seed[1] * width + seed[0]) * 4;\r\n const seedR = inputData[seedIdx];\r\n const seedG = inputData[seedIdx + 1];\r\n const seedB = inputData[seedIdx + 2];\r\n let edge = [seed];\r\n while (edge.length) {\r\n const newedge = [];\r\n for (let i = 0, ii = edge.length; i < ii; i++) {\r\n // As noted in the Raster source constructor, this function is provided\r\n // using the `lib` option. Other functions will NOT be visible unless\r\n // provided using the `lib` option.\r\n const next = this.next4Edges(edge[i]);\r\n for (let j = 0, jj = next.length; j < jj; j++) {\r\n const s = next[j][0];\r\n const t = next[j][1];\r\n if (s >= 0 && s < width && t >= 0 && t < height) {\r\n const ci = (t * width + s) * 4;\r\n const cr = inputData[ci];\r\n const cg = inputData[ci + 1];\r\n const cb = inputData[ci + 2];\r\n const ca = inputData[ci + 3];\r\n // if alpha is zero, carry on\r\n if (ca === 0) {\r\n continue;\r\n }\r\n if (\r\n Math.abs(seedR - cr) < delta &&\r\n Math.abs(seedG - cg) < delta &&\r\n Math.abs(seedB - cb) < delta\r\n ) {\r\n outputData[ci] = 255;\r\n outputData[ci + 1] = 0;\r\n outputData[ci + 2] = 0;\r\n outputData[ci + 3] = 255;\r\n newedge.push([s, t]);\r\n }\r\n // mark as visited\r\n inputData[ci + 3] = 0;\r\n }\r\n }\r\n }\r\n edge = newedge;\r\n }\r\n return { data: outputData, width: width, height: height };\r\n };\r\n\r\n getPosition = () => {\r\n return {\r\n x: -this.ctx.getTransform().e,\r\n y: -this.ctx.getTransform().f,\r\n };\r\n };\r\n\r\n getPolygonsWithOpenCV = (p) => {\r\n const cv = window.cv;\r\n let ctx = this.canvas.getContext(\"2d\");\r\n let imageData = ctx.getImageData(\r\n 0,\r\n 0,\r\n this.canvas.width,\r\n this.canvas.height\r\n );\r\n\r\n // // for debugging, make sure canvas is also not commented out\r\n // let src_orig = cv.matFromImageData(imageData);\r\n // cv.imshow(\"outputCanvas\", src_orig);\r\n // let cp = new cv.Point(p.x, p.y);\r\n // cv.circle(src_orig, cp, 5, [0, 255, 0, 255], -1);\r\n\r\n let growResult = this.growRegion(imageData, p.x, p.y);\r\n let resultImageData = new ImageData(\r\n growResult.data,\r\n this.canvas.width,\r\n this.canvas.height\r\n );\r\n let src = cv.matFromImageData(resultImageData);\r\n // let testmask = cv.Mat.zeros(\r\n // this.canvas.height,\r\n // this.canvas.width,\r\n // cv.CV_8U\r\n // );\r\n // let color = new cv.Scalar(255, 255, 255, 255);\r\n\r\n // let dst = new cv.Mat();\r\n let rgbaPlanes = new cv.MatVector();\r\n cv.split(src, rgbaPlanes);\r\n let R = rgbaPlanes.get(0);\r\n cv.threshold(R, R, 0, 200, cv.THRESH_BINARY);\r\n let contours = new cv.MatVector();\r\n let hierarchy = new cv.Mat();\r\n\r\n cv.findContours(\r\n R,\r\n contours,\r\n hierarchy,\r\n cv.RETR_CCOMP,\r\n cv.CHAIN_APPROX_SIMPLE\r\n );\r\n let polygons = [];\r\n for (let i = 0; i < contours.size(); ++i) {\r\n let cnt = contours.get(i);\r\n if (cv.contourArea(cnt) < 100) continue;\r\n let polygon = [];\r\n // let counter = 0;\r\n for (let i = 0; i < cnt.rows; i++) {\r\n let point = new cv.Point(cnt.data32S[i * 2], cnt.data32S[i * 2 + 1]);\r\n polygon.push([\r\n (point.x + this.getPosition().x) / this.scale,\r\n (point.y + this.getPosition().y) / this.scale,\r\n ]);\r\n }\r\n polygons.push(polygon);\r\n }\r\n\r\n // cleanup\r\n hierarchy.delete();\r\n src.delete();\r\n\r\n return polygons;\r\n };\r\n\r\n updateDrawing = (p) => {\r\n this.renderer.drawVisibleImage();\r\n const scale = this.scale;\r\n\r\n // map point to image fit corresponding pixel in visible image\r\n p = {\r\n x: parseInt(p.x * scale - this.getPosition().x, 10),\r\n y: parseInt(p.y * scale - this.getPosition().y, 10),\r\n };\r\n\r\n let polygons = this.getPolygonsWithOpenCV(p);\r\n\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n let drawRegion = {\r\n regions: polygons.map((polygon) => {\r\n return polygon;\r\n }),\r\n inverted: false,\r\n };\r\n this.drawLayer.clear = this.clear;\r\n updateDrawLayer(\r\n this.drawLayer,\r\n drawRegion,\r\n this.clear,\r\n this.color,\r\n this.subtype,\r\n this.name\r\n );\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n onApply = () => {\r\n // release drawing flag\r\n this.flag = false;\r\n let drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n if (this.drawLayer.regionRois.length > 0) {\r\n drawRegion.regions = this.drawLayer.regionRois;\r\n\r\n // soll der selected layer sein\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n\r\n updateLayer(\r\n this.layer,\r\n drawRegion,\r\n this.clear,\r\n this.color,\r\n this.subtype,\r\n this.name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n this.positionInRoiLayer,\r\n this.fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi\r\n );\r\n this.drawLayer.regionRois = [];\r\n window.forceSidebarUpdate();\r\n }\r\n };\r\n\r\n // triggered from Renderer, but usable from tool as well\r\n onKeyDown(event) {\r\n // enter key\r\n if (event.code === \"Enter\") {\r\n this.onApply();\r\n }\r\n }\r\n\r\n mouse(params) {\r\n try {\r\n let {\r\n event,\r\n p,\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n renderer,\r\n } = params;\r\n this.color = color;\r\n this.subtype = subtype;\r\n this.name = name;\r\n this.positionInRoiLayer = positionInRoiLayer;\r\n this.fullyLoaded = fullyLoaded;\r\n this.renderer = renderer;\r\n if (\r\n event.type === \"mouseup\" ||\r\n (this.flag && event.type === \"mouseleave\")\r\n ) {\r\n this.clear = event.button === 2;\r\n this.point = p;\r\n this.updateDrawing(p);\r\n }\r\n } catch (e) {\r\n console.log(\"error:\", e);\r\n window.showErrorSnackbar(\"Error, try again!\");\r\n }\r\n }\r\n\r\n drawCustomCursor() {\r\n const ctx = this.ctx;\r\n if (this.ctx && this.point) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.lineWidth = 2 / this.scale;\r\n ctx.arc(this.point.x, this.point.y, 5 / this.scale, 0, 2 * Math.PI);\r\n ctx.fillStyle = \"#0673C1\";\r\n ctx.stroke();\r\n ctx.fill();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
\r\n {/* canvas for debugging */}\r\n \r\n {this.toolName}:\r\n \r\n \r\n {\"Threshold: \" + this.threshold}\r\n \r\n {\r\n this.threshold = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeCommitted={() => {\r\n this.updateDrawing(this.point);\r\n }}\r\n onKeyDown={(e) => this.onKeyDown(e)} //onKeyDown also triggered from Renderer\r\n />\r\n \r\n \r\n {\r\n this.removeOverlap = !this.removeOverlap;\r\n window.forceSidebarUpdate();\r\n }}\r\n value=\"remove overlaps of same level\"\r\n />\r\n }\r\n label=\"remove overlaps of same visible level\"\r\n />\r\n \r\n \r\n Apply [Enter]\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default RegionGrowingTool;\r\n","import {\r\n updateDrawLayer,\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n findClickedRoi,\r\n lineArrayBuffer,\r\n distance,\r\n} from \"../../utils/PolygonUtil\";\r\nimport { Button } from \"@mui/material\";\r\nimport { Typography, FormControl, FormLabel, Slider } from \"@mui/material\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\n\r\nclass RegionGrabCutTool extends Tool {\r\n toolName = \"Region Grab Cut\";\r\n noConfig = false;\r\n flag = false;\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n threshold = 30;\r\n penRadius = 5;\r\n penOpacity = 1;\r\n minPenRadius = 1;\r\n maxPenRadius = 50;\r\n line = [];\r\n lines = [];\r\n linePoly = {};\r\n matline = [];\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.ctx = obj.ctx; //context\r\n this.canvas = obj.ctx.canvas; //canvas\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.tempRemoveOverlapSame = this.removeOverlapSame;\r\n this.removeOverlap = false;\r\n this.removeOverlapSame = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n this.removeOverlapSame = this.tempRemoveOverlapSame;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n getPosition = () => {\r\n return {\r\n x: -this.ctx.getTransform().e,\r\n y: -this.ctx.getTransform().f,\r\n };\r\n };\r\n\r\n fitPointToImage = (p) => {\r\n if (this.ctx) {\r\n this.scale = this.ctx.getTransform().a;\r\n }\r\n return {\r\n x: parseInt(p.x * this.scale - this.getPosition().x, 10),\r\n y: parseInt(p.y * this.scale - this.getPosition().y, 10),\r\n };\r\n };\r\n\r\n getPolygonsWithOpenCV = () => {\r\n let p1 = this.fitPointToImage(this.startPoint);\r\n let p2 = this.fitPointToImage(this.endPoint);\r\n let tlp = { x: Math.min(p1.x, p2.x), y: Math.min(p1.y, p2.y) };\r\n\r\n let w = Math.abs(p1.x - p2.x);\r\n let h = Math.abs(p1.y - p2.y);\r\n\r\n const cv = window.cv;\r\n let ctx = this.canvas.getContext(\"2d\");\r\n let imageData = ctx.getImageData(\r\n 0,\r\n 0,\r\n this.canvas.width,\r\n this.canvas.height\r\n );\r\n\r\n let resultImageData = imageData;\r\n let src = cv.matFromImageData(resultImageData);\r\n let rect1 = new cv.Rect(tlp.x, tlp.y, w, h);\r\n src = src.roi(rect1);\r\n let resizeMultiplier = 200 / w;\r\n if (resizeMultiplier > 1) {\r\n resizeMultiplier = 1;\r\n }\r\n let originalSize = new cv.Size(w, h);\r\n w = parseInt(w * resizeMultiplier, 10);\r\n h = parseInt(h * resizeMultiplier, 10);\r\n let workingSize = new cv.Size(w, h);\r\n cv.resize(src, src, workingSize, 0, 0, cv.INTER_AREA);\r\n\r\n let rect = new cv.Rect(2, 2, w - 4, h - 4);\r\n let point1 = new cv.Point(rect.x, rect.y);\r\n let point2 = new cv.Point(rect.x + rect.width, rect.y + rect.height);\r\n\r\n cv.cvtColor(src, src, cv.COLOR_RGBA2RGB, 0);\r\n let mask = cv.Mat.zeros(h, w, cv.CV_8U);\r\n let obvFgColor = new cv.Scalar(cv.GC_FGD);\r\n let obvBgColor = new cv.Scalar(cv.GC_BGD);\r\n let posFgColor = new cv.Scalar(cv.GC_PR_FGD);\r\n let fgP1 = new cv.Point(parseInt(w / 2, 10) - 10, parseInt(h / 2, 10) - 10);\r\n let fgP2 = new cv.Point(parseInt(w / 2, 10) + 10, parseInt(h / 2, 10) + 10);\r\n //todo: another rect with obv bg - spectated rect\r\n cv.rectangle(mask, point1, point2, posFgColor, -1); // whole image (todo: drawn rect)\r\n cv.rectangle(mask, fgP1, fgP2, obvFgColor, -1); //small rectangle in the middle\r\n //todo draw obv bg / draw obv fg\r\n\r\n let wDrawn = Math.abs(this.startPoint.x - this.endPoint.x);\r\n let scale = wDrawn / w;\r\n\r\n for (let p of this.matline) {\r\n let point = this.fitPointToImage({ x: p.x, y: p.y });\r\n let center = new cv.Point(\r\n (point.x - tlp.x) * resizeMultiplier,\r\n (point.y - tlp.y) * resizeMultiplier\r\n );\r\n let color = p.color == \"#ff0000\" ? obvBgColor : obvFgColor;\r\n cv.circle(mask, center, parseInt(this.penRadius / scale, 10), color, -1);\r\n }\r\n\r\n let bgdModel = new cv.Mat();\r\n let fgdModel = new cv.Mat();\r\n cv.grabCut(src, mask, rect, bgdModel, fgdModel, 1, cv.GC_INIT_WITH_MASK);\r\n // // draw foreground\r\n for (let i = 0; i < src.rows; i++) {\r\n for (let j = 0; j < src.cols; j++) {\r\n if (mask.ucharPtr(i, j)[0] == 0 || mask.ucharPtr(i, j)[0] == 2) {\r\n src.ucharPtr(i, j)[0] = 0;\r\n src.ucharPtr(i, j)[1] = 0;\r\n src.ucharPtr(i, j)[2] = 0;\r\n } else {\r\n src.ucharPtr(i, j)[0] = 255;\r\n src.ucharPtr(i, j)[1] = 255;\r\n src.ucharPtr(i, j)[2] = 255;\r\n }\r\n }\r\n }\r\n\r\n // // show mask for debuggins\r\n // cv.imshow(\"outputCanvas\", testmask);\r\n\r\n cv.resize(src, src, originalSize, 0, 0, cv.INTER_AREA);\r\n cv.cvtColor(src, src, cv.COLOR_RGBA2GRAY, 0);\r\n\r\n cv.threshold(src, src, 0, 200, cv.THRESH_BINARY);\r\n let contours = new cv.MatVector();\r\n let hierarchy = new cv.Mat();\r\n\r\n cv.findContours(\r\n src,\r\n contours,\r\n hierarchy,\r\n cv.RETR_CCOMP,\r\n cv.CHAIN_APPROX_SIMPLE\r\n );\r\n\r\n let polygons = [];\r\n if (this.ctx) {\r\n this.scale = this.ctx.getTransform().a;\r\n }\r\n for (let i = 0; i < contours.size(); ++i) {\r\n let cnt = contours.get(i);\r\n if (cv.contourArea(cnt) < 100) continue;\r\n let polygon = [];\r\n // console.log(cnt);\r\n // let counter = 0;\r\n for (let i = 0; i < cnt.rows; i++) {\r\n let point = new cv.Point(cnt.data32S[i * 2], cnt.data32S[i * 2 + 1]);\r\n polygon.push([\r\n (tlp.x + point.x + this.getPosition().x) / this.scale,\r\n (tlp.y + point.y + this.getPosition().y) / this.scale,\r\n ]);\r\n }\r\n polygons.push(polygon);\r\n }\r\n\r\n // cleanup\r\n mask.delete();\r\n bgdModel.delete();\r\n fgdModel.delete();\r\n src.delete();\r\n\r\n return polygons;\r\n // return [];\r\n };\r\n\r\n removeCenteredObject = () => {\r\n if (this.startPoint === null || this.endPoint === null) return;\r\n let centerPoint = {\r\n x: parseInt((this.startPoint.x + this.endPoint.x) / 2),\r\n y: parseInt((this.startPoint.y + this.endPoint.y) / 2),\r\n };\r\n let centeredRoi = findClickedRoi(\r\n centerPoint,\r\n this.selectedLayer,\r\n this.structures,\r\n this.roiLayers,\r\n this.includeBaseROI\r\n );\r\n let roiIdx = this.roiLayers[this.selectedLayer].layer.regionRois.findIndex(\r\n (roi) => roi.uuid === centeredRoi.uuid\r\n );\r\n if (roiIdx >= 0) {\r\n this.roiLayers[this.selectedLayer].layer.regionRois.splice(roiIdx, 1);\r\n this.roiLayers[this.selectedLayer].tree.clear();\r\n this.roiLayers[this.selectedLayer].tree.load(\r\n this.roiLayers[this.selectedLayer].layer.regionRois.map(\r\n (item) => item.treeItem\r\n )\r\n );\r\n }\r\n };\r\n\r\n addPoint = (event, p) => {\r\n let eventPoint = { x: event.clientX, y: event.clientY };\r\n if (this.line.length < 3) {\r\n this.line.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n } else {\r\n const dist = distance(this.lastEventPoint, eventPoint);\r\n if (dist < 10) {\r\n this.line[this.line.length - 1] = [p.x, p.y];\r\n } else {\r\n this.line.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n }\r\n }\r\n };\r\n\r\n updateDrawing = () => {\r\n this.renderer.drawVisibleImage();\r\n\r\n this.polygons = this.getPolygonsWithOpenCV();\r\n\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n this.drawRegion = {\r\n regions: this.polygons.map((polygon) => {\r\n return polygon;\r\n }),\r\n inverted: false,\r\n };\r\n this.drawLayer.clear = this.clear;\r\n updateDrawLayer(\r\n this.drawLayer,\r\n this.drawRegion,\r\n false,\r\n this.color,\r\n this.subtype,\r\n this.name\r\n );\r\n };\r\n\r\n getTopLeftPoint = () => {\r\n return {\r\n x: Math.min(this.startPoint.x, this.endPoint.x),\r\n y: Math.min(this.startPoint.y, this.endPoint.y),\r\n };\r\n };\r\n\r\n getBottomRightPoint = () => {\r\n return {\r\n x: Math.max(this.startPoint.x, this.endPoint.x),\r\n y: Math.max(this.startPoint.y, this.endPoint.y),\r\n };\r\n };\r\n\r\n mouse(params) {\r\n try {\r\n let {\r\n event,\r\n p,\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n renderer,\r\n } = params;\r\n this.color = color;\r\n this.subtype = subtype;\r\n this.name = name;\r\n this.positionInRoiLayer = positionInRoiLayer;\r\n this.fullyLoaded = fullyLoaded;\r\n this.renderer = renderer;\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n if (this.isPointOutsideRect(p)) {\r\n this.flag = true;\r\n this.startPoint = p;\r\n this.endPoint = p;\r\n this.lines = [];\r\n } else if (!this.flag) {\r\n this.lineFlag = true;\r\n this.obvColor = event.button === 0 ? \"#00ff00\" : \"#ff0000\";\r\n this.line = [[p.x, p.y]];\r\n }\r\n } else if (event.type === \"mousemove\" && (this.flag || this.lineFlag)) {\r\n if (this.isDrawingpointInsideRect(p) && this.lineFlag) {\r\n this.matline.push({\r\n x: p.x,\r\n y: p.y,\r\n color: this.obvColor,\r\n rad: this.penRadius,\r\n });\r\n this.addPoint(event, p);\r\n this.linePoly = {\r\n l: lineArrayBuffer(\r\n this.line,\r\n this.penRadius,\r\n this.ome.sizeX,\r\n this.ome.sizeY\r\n ),\r\n color: this.obvColor,\r\n };\r\n } else if (!this.lineFlag) {\r\n this.endPoint = p;\r\n }\r\n } else if (\r\n event.type === \"mouseup\" ||\r\n ((this.flag || this.lineFlag) && event.type === \"mouseleave\")\r\n ) {\r\n if (this.isPointOutsideRect(p) && this.lineFlag) {\r\n this.lineFlag = false;\r\n this.linePoly = {};\r\n } else if (this.isDrawingpointInsideRect(p)) {\r\n this.lineFlag = false;\r\n this.addPoint(event, p);\r\n this.linePoly = {\r\n l: lineArrayBuffer(\r\n this.line,\r\n this.penRadius,\r\n this.ome.sizeX,\r\n this.ome.sizeY\r\n ),\r\n color: this.obvColor,\r\n };\r\n this.lines.push(this.linePoly);\r\n this.linePoly = {};\r\n this.line = [];\r\n try {\r\n this.updateDrawing();\r\n } catch (e) {\r\n console.log(\"error:\", e);\r\n window.showWarningSnackbar(\r\n \"Error, To Close! Rectangle Not Visible\"\r\n );\r\n let tlp = this.getTopLeftPoint();\r\n let w = Math.abs(this.startPoint.x - this.endPoint.x);\r\n let h = Math.abs(this.startPoint.y - this.endPoint.y);\r\n let rect = {\r\n left: tlp.x + w * 0.25,\r\n top: tlp.y + h * 0.25,\r\n right: tlp.x + w - w * 0.25,\r\n bottom: tlp.y + h - h * 0.25,\r\n };\r\n window.zoomToRect(rect);\r\n window.forceSidebarUpdate();\r\n }\r\n } else if (this.flag) {\r\n this.clear = event.button === 2;\r\n this.endPoint = p;\r\n this.flag = false;\r\n try {\r\n this.updateDrawing();\r\n } catch (e) {\r\n console.log(\"error:\", e);\r\n window.showWarningSnackbar(\"Error, Rectangle To Small\");\r\n this.drawLayer.regionRois = [];\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n console.log(\"error:\", e);\r\n window.showWarningSnackbar(\"Error, try again!\");\r\n }\r\n }\r\n\r\n isPointOutsideRect = (p) => {\r\n let isOutside = true;\r\n if (this.startPoint && this.endPoint) {\r\n let tlp = this.getTopLeftPoint();\r\n let brp = this.getBottomRightPoint();\r\n isOutside = p.x < tlp.x || p.x > brp.x || p.y < tlp.y || p.y > brp.y;\r\n }\r\n return isOutside;\r\n };\r\n\r\n isDrawingpointInsideRect = (p) => {\r\n let isInside = false;\r\n if (this.startPoint && this.endPoint) {\r\n let tlp = this.getTopLeftPoint();\r\n let brp = this.getBottomRightPoint();\r\n isInside =\r\n p.x - this.penRadius > tlp.x &&\r\n p.x + this.penRadius < brp.x &&\r\n p.y - this.penRadius > tlp.y &&\r\n p.y + this.penRadius < brp.y;\r\n }\r\n return isInside;\r\n };\r\n\r\n drawCustomCursor(ctx, mousePosition) {\r\n if (this.startPoint && this.endPoint) {\r\n const ctx = this.ctx;\r\n let topLeftPoint = this.getTopLeftPoint();\r\n let w = Math.abs(this.startPoint.x - this.endPoint.x);\r\n let h = Math.abs(this.startPoint.y - this.endPoint.y);\r\n if (ctx) {\r\n let scale = ctx.getTransform().a;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#0673C1\";\r\n ctx.lineWidth = 4 / scale;\r\n ctx.rect(topLeftPoint.x, topLeftPoint.y, w, h);\r\n ctx.stroke();\r\n ctx.strokeStyle = \"#ffffff\";\r\n ctx.lineWidth = 2 / scale;\r\n ctx.rect(topLeftPoint.x, topLeftPoint.y, w, h);\r\n ctx.stroke();\r\n ctx.closePath();\r\n\r\n ctx.beginPath();\r\n if (Object.keys(this.linePoly).length > 0) {\r\n for (let points of this.linePoly.l.geometry.coordinates) {\r\n ctx.fillStyle = this.linePoly.color;\r\n ctx.globalAlpha = 1.0;\r\n if (points[points.length - 1]) {\r\n ctx.moveTo(\r\n points[points.length - 1][0],\r\n points[points.length - 1][1]\r\n );\r\n for (let i = 0; i < points.length; i++) {\r\n ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n }\r\n }\r\n ctx.fill();\r\n ctx.closePath();\r\n\r\n if (this.lines.length > 0) {\r\n for (let line of this.lines) {\r\n ctx.beginPath();\r\n for (let points of line.l.geometry.coordinates) {\r\n ctx.fillStyle = line.color;\r\n ctx.globalAlpha = this.penOpacity;\r\n if (points[points.length - 1]) {\r\n ctx.moveTo(\r\n points[points.length - 1][0],\r\n points[points.length - 1][1]\r\n );\r\n for (let i = 0; i < points.length; i++) {\r\n ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n }\r\n ctx.fill(\"evenodd\");\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n ctx.globalAlpha = 1.0;\r\n }\r\n }\r\n\r\n if (this.isPointOutsideRect(mousePosition)) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.beginPath();\r\n ctx.moveTo(mousePosition.x, 0);\r\n ctx.lineTo(mousePosition.x, 1000000);\r\n ctx.moveTo(0, mousePosition.y);\r\n ctx.lineTo(1000000, mousePosition.y);\r\n ctx.stroke();\r\n ctx.closePath();\r\n } else if (this.isDrawingpointInsideRect(mousePosition)) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.beginPath();\r\n ctx.arc(mousePosition.x, mousePosition.y, this.penRadius, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n onKeyDown(e) {\r\n // enter key\r\n if (e.code === \"Enter\") {\r\n this.onApply();\r\n }\r\n let delta = Math.max(1, parseInt(this.penRadius * 0.05, 10));\r\n if (e.code === \"KeyS\") {\r\n this.penRadius -= delta;\r\n } else if (e.code === \"KeyW\") {\r\n this.penRadius += delta;\r\n }\r\n if (this.penRadius < this.minPenRadius) {\r\n this.penRadius = this.minPenRadius;\r\n }\r\n if (this.penRadius > this.maxPenRadius) {\r\n this.penRadius = this.maxPenRadius;\r\n }\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n onApply = () => {\r\n if (!this.clear) {\r\n this.removeCenteredObject();\r\n }\r\n\r\n this.drawRegion.regions = [];\r\n if (this.drawLayer.regionRois.length > 0) {\r\n this.drawRegion.regions = this.drawLayer.regionRois;\r\n\r\n // soll der selected layer sein\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n\r\n updateLayer(\r\n this.layer,\r\n this.drawRegion,\r\n this.clear,\r\n this.color,\r\n this.subtype,\r\n this.name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n this.positionInRoiLayer,\r\n this.fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi\r\n );\r\n this.drawLayer.regionRois = [];\r\n }\r\n this.resetViuals();\r\n };\r\n\r\n resetViuals = () => {\r\n this.lines = [];\r\n this.linePoly = {};\r\n this.matline = [];\r\n this.startPoint = null;\r\n this.endPoint = null;\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
\r\n {/* canvas for debugging */}\r\n {/* */}\r\n {this.toolName}:\r\n \r\n \r\n {\"Threshold: \" + this.threshold}\r\n \r\n {\r\n this.threshold = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeCommitted={() => {\r\n this.updateDrawing();\r\n }}\r\n />\r\n \r\n \r\n \r\n {\"Line thickness = \" + this.penRadius + \" (smaller: S, wider: W)\"}\r\n \r\n {\r\n this.penRadius = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n />\r\n \r\n \r\n \r\n {\"Line opacity = \" + this.penOpacity}\r\n \r\n {\r\n this.penOpacity = v / 10;\r\n window.forceSidebarUpdate();\r\n }}\r\n />\r\n \r\n (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n \r\n Apply [Enter]\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default RegionGrabCutTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n FormGroup,\r\n FormControl,\r\n FormControlLabel,\r\n Checkbox,\r\n Radio,\r\n RadioGroup,\r\n Typography,\r\n} from \"@mui/material\";\r\n\r\nimport {\r\n updateLayer,\r\n findSameLayer,\r\n getIntersections,\r\n findRoi,\r\n createRegionRoi,\r\n} from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\n\r\nclass CopyTool extends Tool {\r\n name = \"Copy\";\r\n includeBaseROI = false;\r\n mode = \"copy\";\r\n\r\n setLayer(obj) {\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedSameLayer = layerResults[0];\r\n this.structures = obj.structures;\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n /** Handeling of mouse events.\r\n *\r\n * @param {MouseEvent} event\r\n * @param {Object} p x and y of cursor {x:, y: }\r\n * @param {String} color Color of the currently selected structure (#012DEF)\r\n * @param {Bool} subtype Is the mouse over a subtype or not?\r\n * @param {String} name Name of the structure the cursor is above.\r\n * @param {Bool} positionInRoiLayer (Not used) Is the cursor currently in a ROI Layer?\r\n * @param {Bool} fullyLoaded (Not used)\r\n * @param {Int} parentLayer (Not used) The id of the parentlayer of the structure the curson is above.\r\n */\r\n mouse(params) {\r\n let { event, p, color, subtype, name } = params;\r\n // mouse middle button\r\n if (event.button === 1) {\r\n return;\r\n }\r\n // right mouse button -> clear\r\n this.clear = event.button === 2;\r\n\r\n // Click on something\r\n if (event.type === \"mouseup\") {\r\n const historyLength = window.projectHistory.getHistoryLength();\r\n let historyItem = [];\r\n let histId = this.structures[this.selectedLayer].id;\r\n\r\n let drawRegions = []; // Coordinates of the new structures\r\n let foundRoiResults = findRoi(\r\n p,\r\n this.roiLayers,\r\n this.structures,\r\n this.includeBaseROI\r\n );\r\n let foundRegionIndex = foundRoiResults[0];\r\n let foundRoi = foundRoiResults[1];\r\n\r\n // No Results: do nothing.\r\n if (foundRegionIndex < 0) return;\r\n\r\n // Same (parent) layer: do nothing.\r\n if (\r\n foundRegionIndex === this.selectedLayer &&\r\n !this.clear &&\r\n !foundRoi.isSubtype\r\n ) {\r\n return;\r\n }\r\n\r\n // Singular operations:\r\n if (\r\n this.mode === \"copy\" ||\r\n this.mode === \"convert\" ||\r\n this.mode === \"overlap\"\r\n ) {\r\n // Add found ROI to the new ROIs\r\n if (foundRoi !== null) drawRegions.push(foundRoi);\r\n }\r\n\r\n // Full-layer operations:\r\n else if (\r\n this.mode === \"copyAll\" ||\r\n this.mode === \"convertAll\" ||\r\n this.mode === \"overlapAll\"\r\n ) {\r\n let allRegions = this.roiLayers[\r\n foundRegionIndex\r\n ].layer.regionRois.filter(\r\n (regionroi) => regionroi.subtypeName === foundRoi.subtypeName // Only look at the same subtype\r\n );\r\n // Overlap all:\r\n if (this.mode === \"overlapAll\") {\r\n let intersection = getIntersections(\r\n this.layer.regionRois.filter((roi) => !roi.isObject), // Overlapping items cannot be objects\r\n allRegions\r\n );\r\n if (\r\n intersection !== null &&\r\n intersection.geometry.coordinates.length > 0\r\n ) {\r\n drawRegions = intersection.geometry.coordinates.map((roi_region) =>\r\n createRegionRoi(\r\n roi_region,\r\n this.structures[this.selectedLayer].color,\r\n this.structures[this.selectedLayer].isSubtype,\r\n false, // Not fully loaded\r\n this.structures[this.selectedLayer].id,\r\n false // Overlapping items cannot be objects\r\n )\r\n );\r\n }\r\n if (!this.clear) {\r\n for (let roi of this.layer.regionRois) {\r\n historyItem.push({ add: false, id: histId, roi: roi });\r\n }\r\n this.layer.regionRois = [];\r\n this.roiLayers[this.selectedLayer].tree.clear();\r\n }\r\n }\r\n // Convert or copy all: add all found ROIs to the new ROIs\r\n else {\r\n drawRegions = allRegions;\r\n }\r\n }\r\n\r\n //For convert, delete the ROIs from structure A before writing them to B\r\n if (\r\n !this.clear &&\r\n (this.mode === \"convert\" || this.mode === \"convertAll\")\r\n ) {\r\n if (typeof drawRegions !== \"undefined\") {\r\n updateLayer(\r\n this.roiLayers[foundRegionIndex].layer,\r\n { regions: drawRegions, inverted: false },\r\n true, // delete old poly\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[foundRegionIndex].tree,\r\n null,\r\n null,\r\n false,\r\n null,\r\n this.structures[foundRegionIndex].id,\r\n null,\r\n null,\r\n foundRoi.isObject\r\n );\r\n }\r\n }\r\n\r\n // Write the new regions to the selected layer\r\n if (typeof drawRegions !== \"undefined\") {\r\n updateLayer(\r\n this.layer,\r\n { regions: drawRegions, inverted: false },\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedSameLayer].tree,\r\n -1,\r\n false,\r\n this.mode === \"overlap\",\r\n null,\r\n this.structures[this.selectedLayer].id,\r\n null,\r\n null,\r\n foundRoi.isObject\r\n );\r\n }\r\n\r\n window.projectHistory.add(historyItem);\r\n\r\n const historyLength2 = window.projectHistory.getHistoryLength();\r\n window.projectHistory.mergePastItems(historyLength2 - historyLength);\r\n }\r\n }\r\n\r\n drawCustomCursor() {}\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
\r\n {this.name}:\r\n {\r\n this.includeBaseROI = e;\r\n }}\r\n onChangeMode={(e) => {\r\n this.mode = e;\r\n }}\r\n />\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n state = { mode: \"copy\" };\r\n render() {\r\n let { onChange, onChangeMode } = this.props;\r\n let { mode, includeBaseROI } = this.state;\r\n return (\r\n
\r\n \r\n {\r\n onChangeMode(e.target.value);\r\n this.setState({ mode: e.target.value });\r\n }}\r\n >\r\n \r\n }\r\n label=\"Copy\"\r\n style={{ width: \"150px\" }}\r\n />\r\n }\r\n label=\"Copy all\"\r\n />\r\n \r\n\r\n \r\n }\r\n label=\"Convert\"\r\n style={{ width: \"150px\" }}\r\n />\r\n }\r\n label=\"Convert all\"\r\n />\r\n \r\n \r\n }\r\n label=\"Overlap\"\r\n style={{ width: \"150px\" }}\r\n />\r\n }\r\n label=\"Overlap all\"\r\n />\r\n \r\n \r\n \r\n \r\n {\r\n {\r\n onChange(e.target.checked);\r\n this.setState({ includeBaseROI: e.target.checked });\r\n }}\r\n />\r\n }\r\n label=\"Include Base ROI\"\r\n />\r\n }\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n onChange: PropTypes.func,\r\n onChangeMode: PropTypes.func,\r\n};\r\n\r\nexport default CopyTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n FormControl,\r\n FormControlLabel,\r\n List,\r\n ListItem,\r\n ListItemText,\r\n Tooltip,\r\n Typography,\r\n Checkbox,\r\n IconButton,\r\n FormGroup,\r\n} from \"@mui/material\";\r\n\r\nimport {\r\n Keyboard,\r\n Mouse,\r\n NavigateBefore,\r\n NavigateNext,\r\n} from \"@mui/icons-material\";\r\n\r\nimport { pointInside } from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\n\r\nimport {\r\n getContainedRegionRois,\r\n getParentIndexLayer,\r\n} from \"../../utils/StructuresUtils\";\r\n\r\nclass SelectionTool extends Tool {\r\n name = \"Selection\";\r\n selection = null;\r\n foundLayer = -1;\r\n classify = true;\r\n borderColor = [\"#FFFFFF\", \"\", \"\"];\r\n classificationId = [0, 0, 0];\r\n automaticFileChange = true;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.structures = obj.structures;\r\n this.structure = obj.structures[obj.selectedLayer];\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.classifyFullSceneImage =\r\n obj.viewerConfig_project.projectProperties.ClassifySceneAsOneImage;\r\n this.project = obj.project;\r\n this.fileId = obj.fileId;\r\n if (this.borderColor[1] === \"\") {\r\n this.setCol();\r\n }\r\n if (this.classificationId[1] === 0) {\r\n this.setIds();\r\n }\r\n this.regionRois = getContainedRegionRois(\r\n this.structure,\r\n this.structures,\r\n this.roiLayers\r\n );\r\n this.parentIndex = getParentIndexLayer(this.structure, this.structures);\r\n }\r\n\r\n setCol = () => {\r\n let childs = this.findChilds(this.structures[this.selectedLayer]);\r\n\r\n if (childs.length > 1) {\r\n if (this.borderColor[1] === \"\") {\r\n this.borderColor[1] = childs[0].color;\r\n }\r\n\r\n if (this.borderColor[2] === \"\") {\r\n this.borderColor[2] = childs[1].color;\r\n }\r\n }\r\n };\r\n\r\n setIds = () => {\r\n let childs = this.findChilds(this.structures[this.selectedLayer]);\r\n\r\n if (childs.length > 1) {\r\n if (this.classificationId[1] === 0) {\r\n this.classificationId[1] = childs[0].id;\r\n }\r\n\r\n if (this.classificationId[2] === 0) {\r\n this.classificationId[2] = childs[1].id;\r\n }\r\n }\r\n };\r\n\r\n findChilds = (subType) => {\r\n return this.structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n setBorderColor = (c) => {\r\n this.borderColor = c;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n setClassificationId = (c) => {\r\n this.classificationId = c;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n setClassification = (e) => {\r\n this.classify = e.target.checked ? true : false;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n setAutomaticFileChange = (e) => {\r\n this.automaticFileChange = e.target.checked ? true : false;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n setPreviewRect() {}\r\n\r\n findSmallestTreeItem(p) {\r\n let minArea = Number.MAX_SAFE_INTEGER;\r\n let resultItem;\r\n for (let i = 0; i < this.roiLayers.length; i++) {\r\n if (this.structures[i].visible) {\r\n let treeItems = this.roiLayers[i].tree.search({\r\n minX: p.x,\r\n minY: p.y,\r\n maxX: p.x,\r\n maxY: p.y,\r\n });\r\n for (let treeItem of treeItems) {\r\n let b = treeItem.roi.bounds;\r\n\r\n if (pointInside(p, treeItem.roi)) {\r\n let bArea = (b.right - b.left) * (b.bottom - b.top);\r\n if (bArea < minArea) {\r\n minArea = bArea;\r\n resultItem = treeItem;\r\n this.selectedLayer = i;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return resultItem;\r\n }\r\n\r\n changeItem = (e, fromButton, dir) => {\r\n if (this.selection) {\r\n let p = {\r\n x: 0,\r\n y: 0,\r\n };\r\n\r\n let direction = 0;\r\n if (fromButton) {\r\n if (dir === \"next\") {\r\n direction = 1;\r\n }\r\n if (dir === \"before\") {\r\n direction = 2;\r\n }\r\n } else {\r\n if (e.key === \"ArrowRight\") {\r\n direction = 1;\r\n }\r\n if (e.key === \"ArrowLeft\") {\r\n direction = 2;\r\n }\r\n }\r\n\r\n // if not classification structure\r\n if (!this.structures[this.selectedLayer].classificationSubtype) {\r\n let idx = this.roiLayers[this.selectedLayer].layer.regionRois.findIndex(\r\n (element) =>\r\n element.bounds.left === this.selection.roi.bounds.left &&\r\n element.bounds.top === this.selection.roi.bounds.top &&\r\n element.bounds.bottom === this.selection.roi.bounds.bottom &&\r\n element.bounds.right === this.selection.roi.bounds.right\r\n );\r\n\r\n if (\r\n typeof this.roiLayers[this.selectedLayer].layer.regionRois[idx] ===\r\n \"undefined\"\r\n )\r\n return;\r\n // get middlepoint of selected roi\r\n let boundsSelection =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[idx].bounds;\r\n p = {\r\n x:\r\n boundsSelection.right -\r\n (boundsSelection.right - boundsSelection.left) * 0.5,\r\n y:\r\n boundsSelection.bottom -\r\n (boundsSelection.bottom - boundsSelection.top) * 0.5,\r\n };\r\n\r\n switch (direction) {\r\n case 1: //right\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois[idx + 1]) {\r\n let bounds =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[idx + 1]\r\n .bounds;\r\n p.x = bounds.right - (bounds.right - bounds.left) * 0.5;\r\n p.y = bounds.bottom - (bounds.bottom - bounds.top) * 0.5;\r\n }\r\n break;\r\n case 2: // left\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois[idx - 1]) {\r\n let bounds =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[idx - 1]\r\n .bounds;\r\n p.x = bounds.right - (bounds.right - bounds.left) * 0.5;\r\n p.y = bounds.bottom - (bounds.bottom - bounds.top) * 0.5;\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n this.selection = this.findSmallestTreeItem(p);\r\n\r\n if (this.selection !== null && this.selection) {\r\n window.moveToRect(this.selection.roi.bounds);\r\n let obj = {\r\n r: this.selection.roi,\r\n colors: \"\",\r\n classify: this.classify,\r\n };\r\n if (fromButton) {\r\n window.setNewSelRoi(obj);\r\n }\r\n\r\n return obj;\r\n }\r\n }\r\n };\r\n\r\n changeTile = (e) => {\r\n if (this.selection) {\r\n let p = {\r\n x:\r\n this.selection.roi.bounds.left +\r\n (this.selection.roi.bounds.right - this.selection.roi.bounds.left) /\r\n 2,\r\n y:\r\n this.selection.roi.bounds.top +\r\n (this.selection.roi.bounds.bottom - this.selection.roi.bounds.top) /\r\n 2,\r\n };\r\n\r\n // if no regions in this layer return\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois.length === 0) {\r\n return;\r\n }\r\n\r\n // width ist width of roi in top left because top left is always a square\r\n let width =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[0].bounds.right;\r\n\r\n switch (e.key) {\r\n case \"ArrowRight\":\r\n if (p.x + width <= this.ome.sizeX) {\r\n p.x = p.x + width;\r\n } else {\r\n p.x = this.ome.sizeX - 1;\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowLeft\":\r\n if (p.x - width >= 0) {\r\n p.x = p.x - width;\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowUp\":\r\n if (p.y - width >= 0) {\r\n p.y = p.y - width;\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowDown\":\r\n if (p.y + width <= this.ome.sizeY) {\r\n p.y = p.y + width;\r\n } else {\r\n p.y = this.ome.sizeY - 1;\r\n }\r\n e.preventDefault();\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n this.selection = this.findSmallestTreeItem(p);\r\n\r\n if (this.selection !== null && this.selection) {\r\n window.moveToRect(this.selection.roi.bounds);\r\n let obj = {\r\n r: this.selection.roi,\r\n colors: \"\",\r\n classify: this.classify,\r\n };\r\n return obj;\r\n }\r\n }\r\n };\r\n\r\n deleteSelectedRoi = () => {\r\n let historyItem = [];\r\n let histId = this.structures[this.parentIndex].id;\r\n\r\n historyItem.push({ add: false, id: histId, roi: this.selection });\r\n this.roiLayers[this.parentIndex].tree.remove(this.selection);\r\n this.roiLayers[this.parentIndex].layer.regionRois = this.roiLayers[\r\n this.parentIndex\r\n ].tree\r\n .all()\r\n .map((treeItem) => treeItem.roi);\r\n this.selection = null;\r\n window.projectHistory.add(historyItem);\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n onKeyDown(e, fromRenderer, tilesProject) {\r\n // delete item\r\n if (!tilesProject && e.key === \"Delete\") {\r\n this.deleteSelectedRoi();\r\n }\r\n\r\n if (!fromRenderer) {\r\n return;\r\n }\r\n if (!tilesProject) {\r\n return this.changeItem(e);\r\n } else {\r\n return this.changeTile(e);\r\n }\r\n }\r\n\r\n mouse(params) {\r\n let { event, p } = params;\r\n if (!p) {\r\n return;\r\n }\r\n\r\n this.curX = p.x;\r\n this.curY = p.y;\r\n\r\n let color = \"\";\r\n let id = 0;\r\n\r\n // mouse middle button\r\n if (event.button === 1) {\r\n return;\r\n }\r\n // left button\r\n if (event.button === 0) {\r\n color = this.borderColor[1];\r\n id = this.classificationId[1];\r\n }\r\n // right button\r\n if (event.button === 2) {\r\n color = this.borderColor[2];\r\n id = this.classificationId[2];\r\n }\r\n\r\n if (event.type === \"mousedown\") {\r\n this.selection = this.findSmallestTreeItem(p);\r\n }\r\n\r\n if (this.selection !== null && this.selection) {\r\n let obj = {\r\n r: this.selection.roi,\r\n colors: color,\r\n classify: this.classify,\r\n id: id,\r\n changeFile: this.classifyFullSceneImage,\r\n automaticFileChange: this.automaticFileChange,\r\n };\r\n return obj;\r\n }\r\n }\r\n\r\n /**\r\n * Draw a custom cursor\r\n */\r\n drawCustomCursor(ctx, mousePosition, fkt) {\r\n if (this.selection && !this.classifyFullSceneImage) {\r\n const dashLength = 15 / fkt;\r\n ctx.beginPath();\r\n ctx.setLineDash([dashLength, dashLength]);\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#FF0000\";\r\n ctx.lineWidth = 2 / fkt;\r\n let b = this.selection.roi.bounds;\r\n // no custom cursor\r\n ctx.rect(b.left, b.top, b.right - b.left, b.bottom - b.top);\r\n ctx.stroke();\r\n ctx.closePath();\r\n ctx.setLineDash([]);\r\n }\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
\r\n {this.name}:\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n findChilds = (subType) => {\r\n return this.props.structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n handleChangeClassification = (e) => {\r\n this.props.setClassification(e);\r\n };\r\n\r\n handleAutomaticFileChange = (e) => {\r\n this.props.setAutomaticFileChange(e);\r\n };\r\n\r\n getNextFileId = () => {\r\n const { project, fileId } = this.props;\r\n let inxCurrentFile = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n if (project.files[inxCurrentFile + 1]) {\r\n return project.files[inxCurrentFile + 1].id;\r\n } else {\r\n // if last file\r\n window.showWarningSnackbar(\"Last file.\");\r\n return null;\r\n }\r\n };\r\n\r\n getPrevFileId = () => {\r\n const { project, fileId } = this.props;\r\n let inxCurrentFile = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n if (project.files[inxCurrentFile - 1]) {\r\n return project.files[inxCurrentFile - 1].id;\r\n } else {\r\n // if last file\r\n window.showWarningSnackbar(\"First file.\");\r\n return null;\r\n }\r\n };\r\n\r\n getCurrentFileInx = () => {\r\n const { project, fileId } = this.props;\r\n return project.files.findIndex((element) => element.id === fileId) + 1;\r\n };\r\n\r\n render() {\r\n let childs = this.findChilds(\r\n this.props.structures[this.props.selectedLayer]\r\n );\r\n childs.unshift(this.props.structures[this.props.selectedLayer]);\r\n\r\n return (\r\n
\r\n \r\n \r\n }\r\n />\r\n \r\n {\r\n e.preventDefault();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {childs.map((child, index) => (\r\n {\r\n e.preventDefault();\r\n }}\r\n onMouseUp={(e) => {\r\n if (\r\n e.nativeEvent.which === 3 &&\r\n this.props.borderColor[1] !== child.color &&\r\n this.props.classificationId[1] !== child.id\r\n ) {\r\n // right click\r\n this.props.borderColor[2] = child.color;\r\n this.props.classificationId[2] = child.id;\r\n } else if (\r\n e.nativeEvent.which === 1 &&\r\n this.props.borderColor[2] !== child.color &&\r\n this.props.classificationId[2] !== child.id\r\n ) {\r\n // left click\r\n this.props.borderColor[1] = child.color;\r\n this.props.classificationId[1] = child.id;\r\n }\r\n this.props.setBorderColor(this.props.borderColor);\r\n this.props.setClassificationId(this.props.classificationId);\r\n e.preventDefault();\r\n this.forceUpdate();\r\n }}\r\n >\r\n \r\n {child.color === this.props.borderColor[1] &&\r\n child.id === this.props.classificationId[1] &&\r\n this.props.classify && (\r\n L\r\n )}\r\n {child.color === this.props.borderColor[2] &&\r\n child.id === this.props.classificationId[2] &&\r\n this.props.classify && (\r\n R\r\n )}\r\n \r\n {index}\r\n \r\n \r\n ))}\r\n \r\n
\r\n \r\n {!this.props.classifyFullSceneImage && (\r\n
\r\n \r\n Change selected item:\r\n \r\n \r\n \r\n {\r\n this.props.changeSelRoi(null, true, \"before\");\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n {\r\n this.props.changeSelRoi(null, true, \"next\");\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n
\r\n )}\r\n {this.props.classifyFullSceneImage && (\r\n
\r\n \r\n }\r\n />\r\n Change file:\r\n \r\n \r\n {\r\n let fileId = this.getPrevFileId();\r\n if (fileId !== null) {\r\n window.onSelectFile(fileId);\r\n }\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n {\r\n let fileId = this.getNextFileId();\r\n if (fileId !== null) {\r\n window.onSelectFile(fileId);\r\n }\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n File {this.getCurrentFileInx()} /{\" \"}\r\n {this.props.project.files.length}\r\n \r\n \r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n structures: PropTypes.array,\r\n setClassification: PropTypes.func,\r\n setAutomaticFileChange: PropTypes.func,\r\n selectedLayer: PropTypes.number,\r\n classify: PropTypes.bool,\r\n automaticFileChange: PropTypes.bool,\r\n classifyFullSceneImage: PropTypes.bool,\r\n borderColor: PropTypes.array,\r\n classificationId: PropTypes.array,\r\n setBorderColor: PropTypes.func,\r\n setClassificationId: PropTypes.func,\r\n changeSelRoi: PropTypes.func,\r\n project: PropTypes.object,\r\n fileId: PropTypes.string,\r\n};\r\n\r\nexport default SelectionTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n Button,\r\n FormControl,\r\n TextField,\r\n LinearProgress,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport Backend from \"../../../common/utils/Backend\";\r\nimport { withSpinloader } from \"../../../common/components/Spinloader\";\r\nimport Tool from \"./Tool\";\r\nimport PlayArrowRoundedIcon from \"@mui/icons-material/PlayArrowRounded\";\r\nimport ReplayRoundedIcon from \"@mui/icons-material/ReplayRounded\";\r\nimport AIModelDialog from \"../../../home/dialogs/AIModelDialog\";\r\n\r\nclass AITrainingTool extends Tool {\r\n constructor(viewer) {\r\n super();\r\n this.name = \"AI Training\";\r\n this.state = {\r\n preview: false,\r\n hideStartTraining: false,\r\n errorEpochs: false,\r\n errorAIName: false,\r\n epochs: \"\",\r\n openTrainExistingDialog: false,\r\n selectedExistingModel: \"\",\r\n selectedExistingModelSourcepath: \"\",\r\n existingAIModels: [],\r\n stepsProgress: \"-\",\r\n epochsProgress: \"-\",\r\n lossProgress: \"-\",\r\n meanIoUProgress: \"-\",\r\n vallossProgress: \"-\",\r\n valmeanIoUProgress: \"-\",\r\n buildingModelText: \"-\",\r\n showTrainingProgress: false,\r\n showOptimizationProgress: false,\r\n };\r\n this.viewer = viewer;\r\n // Backend.getAIModelRepository(false, (existingAIModels) => {\r\n // this.state.existingAIModels = existingAIModels;\r\n // });\r\n }\r\n\r\n updateTrainingProgress = (line) => {\r\n if (line.includes(\"Epoch\")) {\r\n this.state.buildingModel = false;\r\n this.state.showDownloadProgress = false;\r\n this.state.showTrainingProgress = true;\r\n this.state.epochsProgress = line.split(\"Epoch\")[1];\r\n } else if (line.includes(\"creating dataset...\")) {\r\n this.state.showDownloadProgress = false;\r\n this.state.hideStartTraining = true;\r\n this.state.buildingModelText = \"Creating dataset...\";\r\n this.state.buildingModel = true;\r\n } else if (line.includes(\"loading dataset\")) {\r\n this.state.hideStartTraining = true;\r\n this.state.buildingModelText = \"Creating dataset...\";\r\n this.state.buildingModel = true;\r\n } else if (line.includes(\"start training\")) {\r\n this.state.hideStartTraining = true;\r\n this.state.buildingModel = false;\r\n this.state.showDownloadProgress = false;\r\n this.state.showTrainingProgress = true;\r\n } else if (line.includes(\"loss:\")) {\r\n this.state.buildingModel = false;\r\n this.state.stepsProgress = line.split(\"[\")[0];\r\n this.state.lossProgress = parseFloat(\r\n line.split(\"loss:\")[1].split(\" \")[1],\r\n 10\r\n ).toString();\r\n this.state.meanIoUProgress = line.split(\"loss:\")[1].split(\" \")[4];\r\n } else if (line.includes(\"training done!!!\")) {\r\n this.state.trainingFinished = true;\r\n this.state.showOptimizationProgress = false;\r\n } else if (line.includes(\"training failed!!!\"))\r\n this.state.trainingFailed = true;\r\n else if (line.includes(\"time elapsed:\"))\r\n this.state.elapsedTime = line.substring(0, line.indexOf(\".\")) + \"s\";\r\n else if (line.includes(\"optimization progress:\")) {\r\n this.state.modelOptimizeProgress = line\r\n .split(\"optimization progress:\")[1]\r\n .split(\"%\")[0];\r\n this.state.showOptimizationProgress = true;\r\n } else if (line.includes(\"Downloading model from:\")) {\r\n this.state.hideStartTraining = true;\r\n this.state.modelDownloadProgress = 0;\r\n this.state.buildingModel = false;\r\n this.state.showDownloadProgress = true;\r\n } else if (line.includes(\"[DownloadProgress]\")) {\r\n this.state.modelDownloadProgress = line\r\n .split(\"[DownloadProgress]\")[1]\r\n .split(\"%\")[0];\r\n } else if (line.includes(\"building model ...\")) {\r\n this.state.buildingModelText = \"Building model...\";\r\n } else if (\r\n line.includes(\"No trainingdata, please annotate at least 15+ objects\")\r\n ) {\r\n this.state.buildingModel = false;\r\n this.state.showTrainingProgress = false;\r\n this.state.hideStartTraining = false;\r\n this.state.trainingFinished = false;\r\n this.state.trainingFailed = false;\r\n this.state.epochsProgress = \"\";\r\n this.state.stepsProgress = \"\";\r\n this.state.meanIoUProgress = \"\";\r\n this.state.lossProgress = \"\";\r\n this.state.valmeanIoUProgress = \"\";\r\n this.state.vallossProgress = \"\";\r\n }\r\n if (line.includes(\"val_loss:\")) {\r\n this.state.vallossProgress = parseFloat(\r\n line.split(\"val_loss:\")[1].split(\" \")[1],\r\n 10\r\n ).toString();\r\n this.state.valmeanIoUProgress = line.split(\"val_loss:\")[1].split(\" \")[4];\r\n }\r\n this.configForm.setState(this.state);\r\n };\r\n\r\n /**\r\n * Update File Specific information\r\n * @param {Object} layer\r\n * @param {Object} ome\r\n * @param {String} fileId\r\n * @param {String} projectId\r\n * @param {Object[]} roiLayers\r\n */\r\n setLayer(obj) {\r\n this.id = obj.fileId;\r\n this.layer = obj.layer;\r\n this.ome = obj.ome;\r\n this.projectId = obj.projectId;\r\n this.roiLayers = obj.roiLayers;\r\n this.structures = obj.structures;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.updateProject = obj.updateProject;\r\n\r\n if (obj.structures[obj.selectedLayer]) {\r\n this.toolLayerConfig = obj.structures[obj.selectedLayer].tools.find(\r\n (c) => c.name === \"ai_Training\"\r\n );\r\n }\r\n\r\n if (typeof this.toolLayerConfig !== \"undefined\") {\r\n Object.assign(this.state, this.toolLayerConfig.parameters);\r\n }\r\n }\r\n\r\n mouse() {}\r\n\r\n /**\r\n * AITraining for the entire project\r\n * @param {Component} component\r\n */\r\n calcFull(component) {\r\n // reset previous training stats\r\n this.state.trainingFinished = false;\r\n this.state.trainingFailed = false;\r\n this.state.showTrainingProgress = false;\r\n\r\n this.state.stepsProgress = \"-\";\r\n this.state.epochsProgress = \"-\";\r\n this.state.lossProgress = \"-\";\r\n this.state.meanIoUProgress = \"-\";\r\n this.state.vallossProgress = \"-\";\r\n this.state.valmeanIoUProgress = \"-\";\r\n\r\n if (this.state.epochs === \"\" || this.state.epochs.length < 1) {\r\n this.state.errorEpochs = true;\r\n } else if (this.state.errorEpochs !== \"undefined\")\r\n this.state.errorEpochs = false;\r\n this.configForm.setState(this.state);\r\n if (this.state.errorEpochs || this.state.errorAIName) return;\r\n component.props.spinloader.show();\r\n const project = this.viewer.createProjectModel(\"none\");\r\n\r\n let data = {\r\n parameters: this.state,\r\n project: project,\r\n };\r\n const projectModel = this.viewer.createProjectModel(\"all\");\r\n Backend.saveProject(projectModel, () => {});\r\n\r\n setTimeout(() => {\r\n Backend.aiTrainingSignalR(\r\n data,\r\n (progress) => {\r\n console.log(progress);\r\n },\r\n () => {\r\n console.log(\"finished!\");\r\n component.props.spinloader.hide();\r\n },\r\n (error) => {\r\n component.props.spinloader.hide();\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n }, 1000);\r\n }\r\n\r\n /**\r\n * Draw a custom cursor\r\n */\r\n drawCustomCursor() {}\r\n\r\n onParameterChange = (e) => {\r\n Object.assign(this.state, e);\r\n };\r\n\r\n setSelectedExistingModel = (value) => {\r\n this.state.selectedExistingModel = value;\r\n };\r\n\r\n exit() {}\r\n\r\n /**\r\n * Renders the Tool Configuration Inputs\r\n */\r\n renderConfiguration() {\r\n return (\r\n
\r\n {this.name}:\r\n {\r\n return this.state.preview\r\n ? this.calcPreview(component)\r\n : this.calcFull(component);\r\n }}\r\n onApplyAll={(component) => {\r\n return this.calcFull(component, true);\r\n }}\r\n componentRef={(c) => (this.configForm = c)}\r\n />\r\n
\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Configuration Component to render the parameter inputs dynamically\r\n */\r\nclass ConfigFormRaw extends Component {\r\n constructor(props) {\r\n super(props);\r\n if (props.componentRef) props.componentRef(this);\r\n this.state = props.state;\r\n }\r\n\r\n /**\r\n * Update tool state\r\n */\r\n onParameterChange(key, value, e) {\r\n let stateObject = {};\r\n stateObject[key] = value;\r\n setTimeout(() => this.props.onParameterChange(stateObject), 10);\r\n if (value !== \"\" && e.target.name === \"epochs\") {\r\n stateObject[\"errorEpochs\"] = false;\r\n }\r\n this.setState(stateObject);\r\n this.forceUpdate();\r\n }\r\n\r\n handleClickOpen = () => {\r\n this.setState({ openTrainExistingDialog: true });\r\n };\r\n\r\n render() {\r\n let { onApply, selectedLayer } = this.props;\r\n return (\r\n
\r\n {this.props.structures[selectedLayer].label}\r\n {!this.state.hideStartTraining && (\r\n
\r\n \r\n \r\n this.onParameterChange(\"epochs\", e.target.value, e)\r\n }\r\n variant=\"outlined\"\r\n helperText={\r\n this.state.errorEpochs ? \"Enter number of epochs.\" : \" \"\r\n }\r\n InputProps={{ inputProps: { min: 2, max: 10000 } }}\r\n />\r\n \r\n {\r\n this.props.setSelectedExistingModel(value);\r\n }}\r\n existingAIModels={this.state.existingAIModels}\r\n />\r\n onApply(this)}\r\n startIcon={}\r\n >\r\n Start Training\r\n \r\n
\r\n )}\r\n\r\n {this.state.showDownloadProgress && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n\r\n {this.state.buildingModel && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n\r\n {this.state.showTrainingProgress && (\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n {this.state.showOptimizationProgress && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n\r\n {this.state.trainingFinished && (\r\n
\r\n \r\n Successful\r\n \r\n }\r\n onClick={() => {\r\n this.setState({\r\n buildingModel: false,\r\n showTrainingProgress: false,\r\n hideStartTraining: false,\r\n trainingFinished: false,\r\n epochsProgress: \"\",\r\n stepsProgress: \"\",\r\n meanIoUProgress: \"\",\r\n lossProgress: \"\",\r\n valmeanIoUProgress: \"\",\r\n vallossProgress: \"\",\r\n });\r\n }}\r\n >\r\n Restart Training\r\n \r\n
\r\n )}\r\n {this.state.trainingFailed && (\r\n
\r\n \r\n Failed\r\n \r\n }\r\n onClick={() => {\r\n this.setState({\r\n buildingModel: false,\r\n showTrainingProgress: false,\r\n hideStartTraining: false,\r\n trainingFinished: false,\r\n epochsProgress: \"\",\r\n stepsProgress: \"\",\r\n meanIoUProgress: \"\",\r\n lossProgress: \"\",\r\n valmeanIoUProgress: \"\",\r\n vallossProgress: \"\",\r\n });\r\n }}\r\n >\r\n Restart Training\r\n \r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nConfigFormRaw.propTypes = {\r\n componentRef: PropTypes.object,\r\n state: PropTypes.object,\r\n onParameterChange: PropTypes.func,\r\n onApply: PropTypes.func,\r\n selectedLayer: PropTypes.number,\r\n structures: PropTypes.array,\r\n setSelectedExistingModel: PropTypes.func,\r\n};\r\n\r\nconst ConfigForm = withSpinloader(ConfigFormRaw);\r\n\r\nexport default AITrainingTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport Pagination from \"@mui/material/Pagination\";\r\n\r\nimport {\r\n getContainedRegionRois,\r\n getParentIndexLayer,\r\n} from \"../../utils/StructuresUtils\";\r\nimport { pointInside } from \"../../utils/PolygonUtil\";\r\n\r\nimport {\r\n Tooltip,\r\n IconButton,\r\n TextField,\r\n FormControlLabel,\r\n Checkbox,\r\n Typography,\r\n} from \"@mui/material\";\r\n\r\nimport { Delete } from \"@mui/icons-material\";\r\nimport Tool from \"./Tool\";\r\nimport RBush from \"rbush\";\r\n\r\nclass FindSmallestROITool extends Tool {\r\n name = \"FindSmallestROITool\";\r\n selection = null;\r\n selectionIdx = 0;\r\n sortedTreeItems = [];\r\n checkJumps = true;\r\n regionRois = [];\r\n tree = new RBush();\r\n structure = null;\r\n parentIndex = 0;\r\n\r\n setLayer(obj) {\r\n this.structures = obj.structures;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.structure = obj.structures[obj.selectedLayer];\r\n this.regionRois = getContainedRegionRois(\r\n this.structure,\r\n this.structures,\r\n this.roiLayers\r\n );\r\n this.parentIndex = getParentIndexLayer(this.structure, this.structures);\r\n this.tree.clear();\r\n this.tree.load(this.regionRois.map((item) => item.treeItem));\r\n this.updateSortedTreeItems();\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n findSmallestTreeItem(p) {\r\n let minArea = Number.MAX_SAFE_INTEGER;\r\n let resultItem;\r\n if (this.structures[this.selectedLayer].visible) {\r\n let treeItems = this.tree.search({\r\n minX: p.x,\r\n minY: p.y,\r\n maxX: p.x,\r\n maxY: p.y,\r\n });\r\n for (let treeItem of treeItems) {\r\n let b = treeItem.roi.bounds;\r\n\r\n if (pointInside(p, treeItem.roi)) {\r\n let bArea = (b.right - b.left) * (b.bottom - b.top);\r\n if (bArea < minArea) {\r\n minArea = bArea;\r\n resultItem = treeItem;\r\n }\r\n }\r\n }\r\n }\r\n return resultItem;\r\n }\r\n\r\n deleteSelection() {\r\n let historyItem = [];\r\n let histId = this.structures[this.parentIndex].id;\r\n this.roiLayers[this.parentIndex].tree.remove(this.selection);\r\n this.tree.remove(this.selection);\r\n historyItem.push({ add: false, id: histId, roi: this.selection.roi });\r\n this.regionRois = this.tree.all().map((treeItem) => treeItem.roi);\r\n this.roiLayers[this.parentIndex].layer.regionRois = this.roiLayers[\r\n this.parentIndex\r\n ].tree\r\n .all()\r\n .map((treeItem) => treeItem.roi);\r\n\r\n this.updateSortedTreeItems();\r\n\r\n if (this.selectionIdx < this.sortedTreeItems.length) {\r\n this.selection = this.sortedTreeItems[this.selectionIdx];\r\n if (this.checkJumps) window.zoomToRect(this.selection.roi.bounds);\r\n } else if (this.sortedTreeItems.length > 0) {\r\n this.selectionIdx = this.sortedTreeItems.length - 1;\r\n this.selection = this.sortedTreeItems[this.selectionIdx];\r\n if (this.checkJumps) window.zoomToRect(this.selection.roi.bounds);\r\n } else {\r\n this.selection = null;\r\n }\r\n window.forceSidebarUpdate();\r\n window.projectHistory.add(historyItem);\r\n }\r\n /**\r\n * handle shortcuts\r\n * @param {ActionEvent} event Event when keyboard button is pressed\r\n */\r\n onKeyDown(event) {\r\n if (event.key === \"Delete\" && this.selection) {\r\n this.deleteSelection();\r\n }\r\n }\r\n\r\n mouse(params) {\r\n let { event, p } = params;\r\n this.curX = p.x;\r\n this.curY = p.y;\r\n\r\n // mouse middle button\r\n if (event.button === 1) {\r\n return;\r\n }\r\n\r\n if (event.type === \"mousedown\") {\r\n let treeItem = this.findSmallestTreeItem(p);\r\n this.selection = treeItem;\r\n this.updateSortedTreeItems();\r\n if (this.selection) {\r\n this.selectionIdx = this.selection.sortIdx;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Draw a custom cursor\r\n */\r\n drawCustomCursor(ctx) {\r\n if (this.selection) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#ffffff\";\r\n let b = this.selection.roi.bounds;\r\n // no custom cursor\r\n ctx.rect(b.left, b.top, b.right - b.left, b.bottom - b.top);\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n /**\r\n * Sorts all rois of the selected structure by area, should they not already be sorted.\r\n */\r\n updateSortedTreeItems = () => {\r\n if (this.sortedTreeItems !== this.regionRois) {\r\n this.sortedTreeItems = this.tree.all().sort((treeItem1, treeItem2) => {\r\n return treeItem1.roi.area - treeItem2.roi.area;\r\n });\r\n for (let i = 0; i < this.sortedTreeItems.length; i++) {\r\n this.sortedTreeItems[i][\"sortIdx\"] = i;\r\n }\r\n }\r\n };\r\n\r\n selectRegion = (v) => {\r\n this.updateSortedTreeItems();\r\n this.selectionIdx = v - 1;\r\n this.selection = this.sortedTreeItems[this.selectionIdx];\r\n if (this.selection && this.selection.roi) {\r\n if (this.checkJumps) window.zoomToRect(this.selection.roi.bounds);\r\n window.forceSidebarUpdate();\r\n }\r\n };\r\n\r\n toggleJumps = () => {\r\n this.checkJumps = !this.checkJumps;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration = () => {\r\n return (\r\n
\r\n {this.name}:\r\n this.selectRegion(v)}\r\n delete={() => this.deleteSelection()}\r\n regionRois={this.regionRois}\r\n selection={this.selection}\r\n checkJumps={this.checkJumps}\r\n toggleJumps={() => this.toggleJumps()}\r\n />\r\n
\r\n );\r\n };\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n render() {\r\n return (\r\n
\r\n {\r\n this.props.toggleJumps();\r\n }}\r\n value={this.props.checkJumps}\r\n />\r\n }\r\n label=\"Jump to selection\"\r\n />\r\n
\r\n {\r\n this.props.selectRegion(e.target.value);\r\n }}\r\n variant=\"outlined\"\r\n InputProps={{\r\n inputProps: { min: 1, max: this.props.regionRois.length },\r\n }}\r\n />\r\n
\r\n {\r\n this.props.selectRegion(v);\r\n }}\r\n count={this.props.regionRois.length}\r\n />\r\n \r\n {\r\n this.props.delete();\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n checkJumps: PropTypes.bool,\r\n toggleJumps: PropTypes.func,\r\n selectionIdx: PropTypes.number,\r\n selectRegion: PropTypes.func,\r\n regionRois: PropTypes.array,\r\n delete: PropTypes.func,\r\n};\r\n\r\nexport default FindSmallestROITool;\r\n","import React from \"react\";\r\n\r\nimport { RegionROI } from \"../../utils/ROI\";\r\nimport RBush from \"rbush\";\r\n\r\nimport { Tooltip, IconButton, Typography } from \"@mui/material\";\r\n\r\nimport Tool from \"./Tool\";\r\n\r\nclass GridTool extends Tool {\r\n name = \"GridTool\";\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.structures = obj.structures;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.allRoiLayers = obj.allRoiLayers;\r\n this.project = obj.viewerConfig_project;\r\n this.projectNoViewConfig = obj.project;\r\n }\r\n\r\n findChilds = (subType) => {\r\n return this.structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id\r\n );\r\n };\r\n\r\n createGrid = (x, noGridForChilds, fromFileChange) => {\r\n // if Tobacco Analysis set BaseRoi over hole scene if not set yet\r\n if (\r\n this.projectNoViewConfig.type.includes(\"TobaccoAnalysis\") ||\r\n this.projectNoViewConfig.type.includes(\"BrainIpsc\")\r\n ) {\r\n this.selectedLayer = 0;\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois.length !== 0) {\r\n return;\r\n }\r\n }\r\n // if fileChange and grid already exists in this file do not draw new grid\r\n if (\r\n fromFileChange &&\r\n this.roiLayers[this.selectedLayer].layer.regionRois.length !== 0\r\n ) {\r\n return;\r\n }\r\n // make all tiles\r\n let regions = [];\r\n let tileWidth = this.ome.sizeX / x;\r\n let tileHeight = this.ome.sizeY / x;\r\n\r\n // make tiles for each structure\r\n let lenChilds = this.findChilds(this.structures[this.selectedLayer]).length;\r\n if (noGridForChilds) {\r\n lenChilds = 0;\r\n }\r\n\r\n // check if new gridSize\r\n let tiles = this.roiLayers[this.selectedLayer].layer.regionRois.length;\r\n let numberTilesNewGrid = x * x;\r\n let newGridSize = tiles !== numberTilesNewGrid && tiles !== 0;\r\n\r\n for (\r\n let str = this.selectedLayer;\r\n str <= this.selectedLayer + lenChilds;\r\n str++\r\n ) {\r\n // reset structure if new grid with different grid size\r\n if (newGridSize) {\r\n this.resetStructure(str);\r\n }\r\n\r\n // delete all rois\r\n this.roiLayers[str].layer.regionRois = [];\r\n this.roiLayers[str].tree = new RBush();\r\n\r\n // make x*x tiles\r\n for (let i = 0; i < x * x; i++) {\r\n regions = [];\r\n // make four corners of tile\r\n let c_1 = [(i % x) * tileWidth, Math.floor(i / x) * tileHeight];\r\n regions.push(c_1);\r\n let c_2 = [((i % x) + 1) * tileWidth, Math.floor(i / x) * tileHeight];\r\n regions.push(c_2);\r\n let c_3 = [\r\n ((i % x) + 1) * tileWidth,\r\n (Math.floor(i / x) + 1) * tileHeight,\r\n ];\r\n regions.push(c_3);\r\n let c_4 = [(i % x) * tileWidth, (Math.floor(i / x) + 1) * tileHeight];\r\n regions.push(c_4);\r\n let roi = new RegionROI({ regions: [regions] });\r\n this.roiLayers[str].layer.regionRois.push(roi);\r\n this.roiLayers[str].tree.insert(roi.treeItem);\r\n }\r\n }\r\n window.setGridSize(x);\r\n };\r\n\r\n resetStructure = (str) => {\r\n // reset properties of structure\r\n this.structures[str].avgClassFrequency = 0;\r\n for (const key of Object.keys(this.structures[str].classFrequencies)) {\r\n this.structures[str].classFrequencies[key] = 0;\r\n }\r\n };\r\n\r\n create1mmGrid = () => {};\r\n\r\n exit() {}\r\n\r\n renderConfiguration = () => {\r\n return (\r\n
\r\n {this.name}:\r\n \r\n Create grid:\r\n \r\n\r\n {!this.projectNoViewConfig.type.includes(\"HistoClassification\") &&\r\n !this.projectNoViewConfig.type.includes(\"HistoPointCounting\") && (\r\n
\r\n \r\n this.createGrid(2, true)}\r\n size=\"large\"\r\n >\r\n
2x2
\r\n \r\n
\r\n\r\n \r\n this.createGrid(5, true)}\r\n size=\"large\"\r\n >\r\n
5x5
\r\n \r\n
\r\n\r\n \r\n this.createGrid(20, true)}\r\n size=\"large\"\r\n >\r\n
20x20
\r\n \r\n
\r\n
\r\n )}\r\n\r\n {this.projectNoViewConfig.type.includes(\"HistoClassification\") && (\r\n \r\n this.createGrid(1)} size=\"large\">\r\n
(1x1)
\r\n
\r\n
\r\n )}\r\n\r\n {this.projectNoViewConfig.type.includes(\"HistoClassification\") && (\r\n \r\n this.createGrid(2)} size=\"large\">\r\n
1:10 (2x2)
\r\n
\r\n
\r\n )}\r\n\r\n {this.projectNoViewConfig.type.includes(\"HistoClassification\") && (\r\n \r\n this.createGrid(5)} size=\"large\">\r\n
1:4 (5x5)
\r\n
\r\n
\r\n )}\r\n\r\n {this.projectNoViewConfig.type.includes(\"HistoPointCounting\") && (\r\n \r\n this.createGrid(20, true)}\r\n size=\"large\"\r\n >\r\n
20 x 20
\r\n \r\n
\r\n )}\r\n
\r\n );\r\n };\r\n}\r\n\r\nexport default GridTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { RegionROI } from \"../../utils/ROI\";\r\nimport RBush from \"rbush\";\r\nimport { updateDrawLayer } from \"../../utils/PolygonUtil\";\r\nimport Backend from \"../../../common/utils/Backend\";\r\n\r\nimport {\r\n TextField,\r\n Button,\r\n Checkbox,\r\n FormControlLabel,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { hasIntersection } from \"../../utils/PolygonUtil\";\r\n\r\nimport Tool from \"./Tool\";\r\nimport Grid from \"@mui/material/Grid\";\r\n\r\nclass GridAnnotationTool extends Tool {\r\n name = \"GridAnnotationTool\";\r\n gridSize = 512;\r\n overlap = 0;\r\n startPoint = null;\r\n endPoint = null;\r\n pointTL = { x: 0, y: 0 };\r\n pointBR = { x: 0, y: 0 };\r\n tiles = [];\r\n rightClick = false;\r\n n = 9;\r\n gridOffsetX = 0;\r\n gridOffsetY = 0;\r\n progressText = \"make a selection\";\r\n exportClasses = true;\r\n baseROIOnly = true;\r\n currentFileId = null;\r\n init = false;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.fileId = obj.fileId;\r\n this.structures = obj.structures;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.allRoiLayers = obj.allRoiLayers;\r\n this.project = obj.viewerConfig_project;\r\n this.projectNoViewConfig = obj.project;\r\n this.drawLayer = obj.drawLayer;\r\n this.rendererDict = obj.rendererDict;\r\n this.gridLayer = this.structures.findIndex((s) => s.label === \"Grid\");\r\n this.gridLayer = this.gridLayer > 0 ? this.gridLayer : 0;\r\n window.tileExportProgress = this.printFunction;\r\n this.disableExport =\r\n this.structures.findIndex((s) => s.label === \"Grid\") > -1 ? false : true;\r\n if (this.currentFileId !== this.fileId) {\r\n this.tiles = [];\r\n this.currentFileId = this.fileId;\r\n }\r\n if (!this.init) {\r\n let rendererObj = this.rendererDict[\r\n this.fileId\r\n ].props.persistentStorage.load(\"gridConfig\" + this.fileId);\r\n if (rendererObj) {\r\n this.gridSize = rendererObj.gridSize;\r\n this.overlap = rendererObj.overlap;\r\n this.gridOffsetX = rendererObj.gridOffsetX;\r\n this.gridOffsetY = rendererObj.gridOffsetY;\r\n this.rendererDict[this.fileId].gridTileCount = rendererObj.tileCount;\r\n }\r\n this.init = true;\r\n }\r\n if (\r\n this.rendererDict[this.fileId].gridTileCount !==\r\n this.roiLayers[this.gridLayer].layer.regionRois.length\r\n ) {\r\n this.tiles = [];\r\n }\r\n }\r\n\r\n mouse(params) {\r\n let { event, p } = params;\r\n if (event.type === \"mousedown\") {\r\n if (this.startPoint === null && event.button !== 1) {\r\n this.startPoint = p;\r\n }\r\n if (event.button === 2) {\r\n this.rightClick = true;\r\n }\r\n } else if (event.type === \"mouseup\") {\r\n if (this.startPoint !== null) {\r\n this.endPoint = p;\r\n this.createSelectionArea(this.startPoint, this.endPoint);\r\n if (this.structures[this.gridLayer].label === \"Grid\") {\r\n this.treeSelection();\r\n }\r\n\r\n this.startPoint = null;\r\n this.drawLayer.regionRois = [];\r\n this.rightClick = false;\r\n }\r\n } else if (event.type === \"mousemove\" && this.startPoint) {\r\n this.endPoint = p;\r\n this.createSelectionArea(this.startPoint, this.endPoint);\r\n if (this.structures[this.gridLayer].label === \"Grid\") {\r\n this.treeSelection();\r\n }\r\n }\r\n }\r\n\r\n //mark tiles\r\n drawCustomCursor(ctx, mp, f) {\r\n if (this.tiles.length > 0 && this.gridLayer !== 0) {\r\n for (let tile of this.tiles) {\r\n if (tile.roi.comment !== \"export flagged\") {\r\n let idx = this.tiles.indexOf(tile);\r\n if (idx >= 0) {\r\n this.tiles.splice(idx, 1);\r\n }\r\n }\r\n }\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#03FF00\";\r\n ctx.lineWidth = 3 / f;\r\n this.tiles.forEach((e) => {\r\n ctx.rect(e.minX, e.minY, e.maxX - e.minX, e.maxY - e.minY);\r\n });\r\n\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n createSelectionArea = (sP, eP) => {\r\n if (sP.x <= eP.x) {\r\n this.pointTL.x = sP.x;\r\n this.pointBR.x = eP.x;\r\n } else if (sP.x > eP.x) {\r\n this.pointTL.x = eP.x;\r\n this.pointBR.x = sP.x;\r\n }\r\n\r\n if (sP.y <= eP.y) {\r\n this.pointTL.y = sP.y;\r\n this.pointBR.y = eP.y;\r\n } else if (sP.y > eP.y) {\r\n this.pointTL.y = eP.y;\r\n this.pointBR.y = sP.y;\r\n }\r\n\r\n let points = [];\r\n points.push([this.pointTL.x, this.pointTL.y]);\r\n points.push([this.pointBR.x, this.pointTL.y]);\r\n points.push([this.pointBR.x, this.pointBR.y]);\r\n points.push([this.pointTL.x, this.pointBR.y]);\r\n\r\n let drawRegion = {\r\n regions: [points],\r\n inverted: false,\r\n };\r\n\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n updateDrawLayer(this.drawLayer, drawRegion, false, \"#FF0000\", 0, \"zero\");\r\n };\r\n\r\n treeSelection = () => {\r\n let treeItems = this.roiLayers[this.gridLayer].tree.search({\r\n minX: this.pointTL.x,\r\n minY: this.pointTL.y,\r\n maxX: this.pointBR.x,\r\n maxY: this.pointBR.y,\r\n });\r\n for (let treeItem of treeItems) {\r\n if (treeItem.roi.comment === \"\" && !this.rightClick) {\r\n treeItem.roi.comment = \"export flagged\";\r\n this.tiles.push(treeItem);\r\n } else if (treeItem.roi.comment === \"export flagged\" && this.rightClick) {\r\n if (this.tiles.includes(treeItem)) {\r\n treeItem.roi.comment = \"\";\r\n let idx = this.tiles.indexOf(treeItem);\r\n if (idx >= 0) {\r\n this.tiles.splice(idx, 1);\r\n }\r\n }\r\n } else if (\r\n treeItem.roi.comment === \"export flagged\" &&\r\n !this.rightClick\r\n ) {\r\n if (!this.tiles.includes(treeItem)) {\r\n this.tiles.push(treeItem);\r\n }\r\n }\r\n }\r\n };\r\n\r\n createGrid = () => {\r\n let baseRois = [];\r\n if (this.baseROIOnly) {\r\n baseRois = this.roiLayers[0].layer.regionRois;\r\n if (baseRois.length === 0) {\r\n window.showWarningSnackbar(\"No Base ROI set!\");\r\n return;\r\n }\r\n } else {\r\n let maxX = this.ome.sizeX;\r\n let maxY = this.ome.sizeY;\r\n let wholeSceneRoi = new RegionROI({\r\n regions: [\r\n [\r\n [0, 0],\r\n [maxX, 0],\r\n [maxX, maxY],\r\n [0, maxY],\r\n [0, 0],\r\n ],\r\n ],\r\n });\r\n baseRois = [wholeSceneRoi];\r\n }\r\n this.tiles = [];\r\n let idx = this.structures.findIndex((s) => s.label === \"Grid\");\r\n let r = this.rendererDict[this.fileId];\r\n if (idx === -1) {\r\n r.props.projectContext.addStructure(\"Grid\", true);\r\n idx = this.structures.findIndex((s) => s.label === \"Grid\");\r\n }\r\n if (idx === -1) {\r\n this.printFunction(\"TE;Can't create grid\");\r\n window.showErrorSnackbar(\"Can't create grid\");\r\n return;\r\n }\r\n r.props.setSelectedLayer(idx);\r\n\r\n // remove for loop if it is sure that we only need one color\r\n let str = idx;\r\n // delete all rois\r\n this.roiLayers[str].layer.regionRois = [];\r\n this.roiLayers[str].tree = new RBush();\r\n\r\n for (let baseRoi of baseRois) {\r\n // make all tiles\r\n let regions = [];\r\n\r\n // make x*y tiles\r\n for (\r\n let x = baseRoi.bounds.left + this.gridOffsetX;\r\n x < baseRoi.bounds.right;\r\n x += this.gridSize - this.overlap\r\n ) {\r\n for (\r\n let y = baseRoi.bounds.top + this.gridOffsetY;\r\n y < baseRoi.bounds.bottom;\r\n y += this.gridSize - this.overlap\r\n ) {\r\n regions = [];\r\n // make four corners of tile\r\n let c_1 = [x, y];\r\n regions.push(c_1);\r\n let c_2 = [x + this.gridSize, y];\r\n regions.push(c_2);\r\n let c_3 = [x + this.gridSize, y + this.gridSize];\r\n regions.push(c_3);\r\n let c_4 = [x, y + this.gridSize];\r\n regions.push(c_4);\r\n regions.push(c_1);\r\n\r\n let roi = new RegionROI({ regions: [regions] });\r\n if (hasIntersection(roi, baseRoi)) {\r\n this.roiLayers[str].layer.regionRois.push(roi);\r\n this.roiLayers[str].tree.insert(roi.treeItem);\r\n }\r\n }\r\n }\r\n }\r\n\r\n r.gridTileCount = this.roiLayers[str].layer.regionRois.length;\r\n\r\n this.saveGridConfig(r.gridTileCount);\r\n };\r\n\r\n onClickExport = () => {\r\n let tiles = [];\r\n for (let tile in this.tiles) {\r\n tiles.push({ x: this.tiles[tile].minX, y: this.tiles[tile].minY });\r\n }\r\n if (tiles.length < 1) {\r\n this.printFunction(\"TE;No tiles selected\");\r\n window.showWarningSnackbar(\"No tiles selected\");\r\n return;\r\n }\r\n if (\r\n this.structures[this.selectedLayer].label === \"Grid\" ||\r\n this.structures[this.selectedLayer].label === \"Base ROI\"\r\n ) {\r\n this.printFunction(\"TE;Select a structure\");\r\n window.showWarningSnackbar(\"Select a structure\");\r\n return;\r\n }\r\n this.printFunction(\"TE;Creating Dataset...\");\r\n let pconfig = this.projectNoViewConfig.files;\r\n let fileIndex = pconfig.findIndex((s) => s.id === this.fileId);\r\n\r\n window.showSuccessSnackbar(\r\n \"Selected structure: \" + this.structures[this.selectedLayer].label\r\n );\r\n\r\n let exportObject = {\r\n size: this.gridSize,\r\n overlap: this.overlap,\r\n classes: this.exportClasses,\r\n baseROIOnly: this.baseROIOnly,\r\n tiles: tiles,\r\n selectedStructure: this.structures[this.selectedLayer].label,\r\n selectedStructureId: this.structures[this.selectedLayer].id,\r\n fileConfig: pconfig[fileIndex],\r\n projectId: this.projectNoViewConfig.id,\r\n };\r\n Backend.tileExport(exportObject);\r\n };\r\n\r\n printFunction = (line) => {\r\n console.debug(line);\r\n if (line.includes(\"TE;\")) {\r\n let newLine = line.split(\";\");\r\n newLine = newLine[1];\r\n if (!newLine.includes(\"ERROR\")) {\r\n this.progressText = newLine;\r\n if (newLine.includes(\"Dataset created\")) {\r\n window.showSuccessSnackbar(newLine);\r\n }\r\n } else {\r\n this.progressText = \"Dataset could not be created\";\r\n }\r\n\r\n window.forceSidebarUpdate();\r\n }\r\n };\r\n\r\n saveGridConfig = (tileCount) => {\r\n let saveObject = {\r\n gridSize: this.gridSize,\r\n overlap: this.overlap,\r\n gridOffsetX: this.gridOffsetX,\r\n gridOffsetY: this.gridOffsetY,\r\n tileCount: tileCount,\r\n };\r\n this.rendererDict[this.fileId].props.persistentStorage.save(\r\n \"gridConfig\" + this.fileId,\r\n saveObject\r\n );\r\n };\r\n\r\n moveAnnotations = () => {\r\n this.rendererDict[this.fileId].moveAnnotations();\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
\r\n {this.name}:\r\n {\r\n this.n =\r\n parseInt(e.target.value) > this.gridSize\r\n ? this.n + 1\r\n : this.n - 1;\r\n this.n = this.n > 6 ? this.n : 6;\r\n this.gridSize = Math.pow(2, this.n);\r\n this.gridOffsetX = 0;\r\n this.gridOffsetY = 0;\r\n\r\n if (this.overlap * 2 > this.gridSize) {\r\n this.overlap = parseInt(this.gridSize / 2, 10);\r\n }\r\n\r\n window.forceSidebarUpdate();\r\n }}\r\n overlap={this.overlap}\r\n onChangeOverlap={(e) => {\r\n let value =\r\n parseInt(e.target.value) < 0 ? 0 : parseInt(e.target.value);\r\n this.overlap = value > this.gridSize ? this.overlap : value;\r\n window.forceSidebarUpdate();\r\n }}\r\n createGrid={this.createGrid}\r\n onClickExport={this.onClickExport}\r\n gridOffsetX={this.gridOffsetX}\r\n gridOffsetY={this.gridOffsetY}\r\n onChangeGridOffsetX={(e) => {\r\n let v =\r\n parseInt(e.target.value) > -this.gridSize &&\r\n parseInt(e.target.value) < this.gridSize\r\n ? parseInt(e.target.value)\r\n : this.gridOffsetX;\r\n this.gridOffsetX = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeGridOffsetY={(e) => {\r\n let v =\r\n parseInt(e.target.value) > -this.gridSize &&\r\n parseInt(e.target.value) < this.gridSize\r\n ? parseInt(e.target.value)\r\n : this.gridOffsetY;\r\n this.gridOffsetY = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeExportClasses={(e) => {\r\n this.exportClasses = !e;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeBaseROIOnly={(e) => {\r\n this.baseROIOnly = !e;\r\n window.forceSidebarUpdate();\r\n }}\r\n disableExport={this.disableExport}\r\n />\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n state = { mode: \"copy\" };\r\n render() {\r\n let {\r\n gridSize,\r\n overlap,\r\n createGrid,\r\n onClickExport,\r\n gridOffsetX,\r\n gridOffsetY,\r\n progressText,\r\n exportClasses,\r\n baseROIOnly,\r\n disableExport,\r\n } = this.props;\r\n return (\r\n
\r\n
{progressText}
\r\n
\r\n {\r\n this.props.onChangeExportClasses(exportClasses);\r\n }}\r\n />\r\n }\r\n label=\"Export with Subtypes\"\r\n />\r\n {\r\n this.props.onChangeBaseROIOnly(baseROIOnly);\r\n }}\r\n />\r\n }\r\n label=\"Consider Base ROI\"\r\n />\r\n
\r\n \r\n \r\n this.props.onChangeGridOffsetX(e)}\r\n variant=\"outlined\"\r\n />\r\n \r\n \r\n this.props.onChangeGridOffsetY(e)}\r\n variant=\"outlined\"\r\n />\r\n \r\n \r\n this.props.onChangeGridSize(e)}\r\n variant=\"outlined\"\r\n />\r\n \r\n \r\n this.props.onChangeOverlap(e)}\r\n variant=\"outlined\"\r\n />\r\n \r\n \r\n createGrid()}\r\n >\r\n Create Grid\r\n \r\n onClickExport()}\r\n disabled={disableExport}\r\n >\r\n Export Selection\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n gridSize: PropTypes.number,\r\n overlap: PropTypes.number,\r\n createGrid: PropTypes.func,\r\n onClickExport: PropTypes.func,\r\n gridOffsetX: PropTypes.number,\r\n gridOffsetY: PropTypes.number,\r\n progressText: PropTypes.string,\r\n exportClasses: PropTypes.bool,\r\n baseROIOnly: PropTypes.bool,\r\n disableExport: PropTypes.bool,\r\n onChangeExportClasses: PropTypes.func,\r\n onChangeBaseROIOnly: PropTypes.func,\r\n onChangeGridOffsetX: PropTypes.func,\r\n onChangeGridOffsetY: PropTypes.func,\r\n onChangeGridSize: PropTypes.func,\r\n onChangeOverlap: PropTypes.func,\r\n};\r\n\r\nexport default GridAnnotationTool;\r\n","import { pointInside } from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\n\r\nclass TilesClassificationTool extends Tool {\r\n name = \"TilesClassificationTool\";\r\n selection = null;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.structures = obj.structures;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n }\r\n\r\n setNextTile = (roiItem) => {\r\n if (roiItem) {\r\n this.selection = roiItem;\r\n window.moveToRect(this.selection.roi.bounds);\r\n }\r\n };\r\n\r\n findSmallestTreeItem(p) {\r\n let minArea = Number.MAX_SAFE_INTEGER;\r\n let resultItem;\r\n for (let i = 0; i < this.roiLayers.length; i++) {\r\n if (this.structures[i].visible) {\r\n let treeItems = this.roiLayers[i].tree.search({\r\n minX: p.x,\r\n minY: p.y,\r\n maxX: p.x,\r\n maxY: p.y,\r\n });\r\n for (let treeItem of treeItems) {\r\n let b = treeItem.roi.bounds;\r\n\r\n if (pointInside(p, treeItem.roi)) {\r\n let bArea = (b.right - b.left) * (b.bottom - b.top);\r\n if (bArea < minArea) {\r\n minArea = bArea;\r\n resultItem = treeItem;\r\n this.selectedLayer = i;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return resultItem;\r\n }\r\n\r\n changeItem = (e, fromButton, dir) => {\r\n if (this.selection) {\r\n let p = {\r\n x: 0,\r\n y: 0,\r\n };\r\n\r\n let direction = 0;\r\n if (fromButton) {\r\n if (dir === \"next\") {\r\n direction = 1;\r\n }\r\n if (dir === \"before\") {\r\n direction = 2;\r\n }\r\n } else {\r\n if (e.key === \"ArrowRight\") {\r\n //e.key not tested, because not in use\r\n direction = 1;\r\n }\r\n if (e.key === \"ArrowLeft\") {\r\n //e.key not tested, because not in use\r\n direction = 2;\r\n }\r\n }\r\n\r\n // if not classification structure\r\n if (!this.structures[this.selectedLayer].classificationSubtype) {\r\n let idx = this.roiLayers[this.selectedLayer].layer.regionRois.findIndex(\r\n (element) => element === this.selection.roi\r\n );\r\n\r\n // get middlepoint of selected roi\r\n let boundsSelection =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[idx].bounds;\r\n p = {\r\n x:\r\n boundsSelection.right -\r\n (boundsSelection.right - boundsSelection.left) * 0.5,\r\n y:\r\n boundsSelection.bottom -\r\n (boundsSelection.bottom - boundsSelection.top) * 0.5,\r\n };\r\n\r\n switch (direction) {\r\n case 1: //right\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois[idx + 1]) {\r\n let bounds =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[idx + 1]\r\n .bounds;\r\n p.x = bounds.right - (bounds.right - bounds.left) * 0.5;\r\n p.y = bounds.bottom - (bounds.bottom - bounds.top) * 0.5;\r\n }\r\n break;\r\n case 2: // left\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois[idx - 1]) {\r\n let bounds =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[idx - 1]\r\n .bounds;\r\n p.x = bounds.right - (bounds.right - bounds.left) * 0.5;\r\n p.y = bounds.bottom - (bounds.bottom - bounds.top) * 0.5;\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n this.selection = this.findSmallestTreeItem(p);\r\n\r\n if (this.selection !== null && this.selection) {\r\n window.moveToRect(this.selection.roi.bounds);\r\n }\r\n }\r\n };\r\n\r\n changeTile = (e) => {\r\n if (this.selection) {\r\n let p = {\r\n x:\r\n this.selection.roi.bounds.left +\r\n (this.selection.roi.bounds.right - this.selection.roi.bounds.left) /\r\n 2,\r\n y:\r\n this.selection.roi.bounds.top +\r\n (this.selection.roi.bounds.bottom - this.selection.roi.bounds.top) /\r\n 2,\r\n };\r\n\r\n // if no regions in this layer return\r\n if (this.roiLayers[this.selectedLayer].layer.regionRois.length === 0) {\r\n return;\r\n }\r\n\r\n // width ist width of roi in top left because top left is always a square\r\n let width =\r\n this.roiLayers[this.selectedLayer].layer.regionRois[0].bounds.right;\r\n\r\n switch (e.key) {\r\n case \"ArrowRight\": //e.key not tested, because not in use\r\n if (p.x + width <= this.ome.sizeX) {\r\n p.x = p.x + width;\r\n } else {\r\n p.x = this.ome.sizeX - 1;\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowLeft\": //e.key not tested, because not in use\r\n if (p.x - width >= 0) {\r\n p.x = p.x - width;\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowUp\": //e.key not tested, because not in use\r\n if (p.y - width >= 0) {\r\n p.y = p.y - width;\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowDown\": //e.key not tested, because not in use\r\n if (p.y + width <= this.ome.sizeY) {\r\n p.y = p.y + width;\r\n } else {\r\n p.y = this.ome.sizeY - 1;\r\n }\r\n e.preventDefault();\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n this.selection = this.findSmallestTreeItem(p);\r\n\r\n if (this.selection !== null && this.selection) {\r\n window.moveToRect(this.selection.roi.bounds);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Draw a custom cursor\r\n */\r\n drawCustomCursor(ctx, mousePosition, fkt) {\r\n if (this.selection) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#FF0000\";\r\n ctx.lineWidth = 2 / fkt;\r\n let b = this.selection.roi.bounds;\r\n ctx.rect(b.left, b.top, b.right - b.left, b.bottom - b.top);\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return null;\r\n }\r\n}\r\n\r\nexport default TilesClassificationTool;\r\n","import React from \"react\";\r\n\r\nimport { pointInside } from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\n\r\nimport { Typography, TextField, FormGroup } from \"@mui/material\";\r\n\r\nimport SketchColorPicker from \"../SketchColorPicker\";\r\n\r\nclass TilesHistoPointCountingTool extends Tool {\r\n name = \"TilesHistoPointCountingTool\";\r\n selection = null;\r\n crosshairColor = \"#000000\";\r\n crosshairLineWidth = 2;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.structures = obj.structures;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n }\r\n\r\n setNextTile = (roiItem) => {\r\n if (roiItem) {\r\n this.selection = roiItem;\r\n window.moveToRect(this.selection.roi.bounds);\r\n }\r\n };\r\n\r\n findSmallestTreeItem(p) {\r\n let minArea = Number.MAX_SAFE_INTEGER;\r\n let resultItem;\r\n for (let i = 0; i < this.roiLayers.length; i++) {\r\n if (this.structures[i].visible) {\r\n let treeItems = this.roiLayers[i].tree.search({\r\n minX: p.x,\r\n minY: p.y,\r\n maxX: p.x,\r\n maxY: p.y,\r\n });\r\n for (let treeItem of treeItems) {\r\n let b = treeItem.roi.bounds;\r\n\r\n if (pointInside(p, treeItem.roi)) {\r\n let bArea = (b.right - b.left) * (b.bottom - b.top);\r\n if (bArea < minArea) {\r\n minArea = bArea;\r\n resultItem = treeItem;\r\n this.selectedLayer = i;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return resultItem;\r\n }\r\n\r\n /**\r\n * Draw a custom cursor\r\n */\r\n drawCustomCursor(ctx, mousePosition, fkt) {\r\n if (this.selection) {\r\n // draw outer red rect that defines tile\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#FF0000\";\r\n ctx.lineWidth = 2 / fkt;\r\n let b = this.selection.roi.bounds;\r\n ctx.rect(b.left, b.top, b.right - b.left, b.bottom - b.top);\r\n ctx.stroke();\r\n ctx.closePath();\r\n\r\n // draw crosshair\r\n ctx.lineWidth = this.crosshairLineWidth / fkt;\r\n let tileWidth = b.right - b.left;\r\n let tileHeight = b.bottom - b.top;\r\n let lineLengthWidth = (tileWidth / 2) * 0.9;\r\n let lineLengthHeight = (tileHeight / 2) * 0.9;\r\n\r\n // horizontal line left\r\n ctx.beginPath();\r\n ctx.strokeStyle = this.crosshairColor;\r\n ctx.moveTo(b.left, b.top + tileHeight / 2);\r\n ctx.lineTo(b.left + lineLengthWidth, b.top + tileHeight / 2);\r\n ctx.closePath();\r\n ctx.globalAlpha = this.crosshairOpacity;\r\n ctx.stroke();\r\n\r\n // horizontal line right\r\n ctx.beginPath();\r\n ctx.strokeStyle = this.crosshairColor;\r\n ctx.moveTo(b.right, b.top + tileHeight / 2);\r\n ctx.lineTo(b.right - lineLengthWidth, b.top + tileHeight / 2);\r\n ctx.closePath();\r\n ctx.globalAlpha = this.crosshairOpacity;\r\n ctx.stroke();\r\n\r\n // vertical line top\r\n ctx.beginPath();\r\n ctx.strokeStyle = this.crosshairColor;\r\n ctx.moveTo(b.left + tileWidth / 2, b.top);\r\n ctx.lineTo(b.left + tileWidth / 2, b.top + lineLengthHeight);\r\n ctx.closePath();\r\n ctx.globalAlpha = this.crosshairOpacity;\r\n ctx.stroke();\r\n\r\n // vertical line bottom\r\n ctx.beginPath();\r\n ctx.strokeStyle = this.crosshairColor;\r\n ctx.moveTo(b.left + tileWidth / 2, b.bottom);\r\n ctx.lineTo(b.left + tileWidth / 2, b.bottom - lineLengthHeight);\r\n ctx.closePath();\r\n ctx.globalAlpha = this.crosshairOpacity;\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
\r\n {this.name}:\r\n \r\n \r\n Crosshair color:\r\n \r\n {\r\n this.crosshairColor = color;\r\n window.forceSidebarUpdate();\r\n }}\r\n />\r\n \r\n\r\n
\r\n\r\n \r\n \r\n Crosshair linewidth:\r\n \r\n {\r\n this.crosshairLineWidth = Number(e.target.value);\r\n window.forceSidebarUpdate();\r\n }}\r\n inputProps={{\r\n step: 1,\r\n min: 1,\r\n max: 30,\r\n type: \"number\",\r\n }}\r\n />\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default TilesHistoPointCountingTool;\r\n","export class TinyQueue {\r\n constructor(data = [], compare = defaultCompare) {\r\n this.data = data;\r\n this.length = this.data.length;\r\n this.compare = compare;\r\n\r\n if (this.length > 0) {\r\n for (let i = (this.length >> 1) - 1; i >= 0; i--) this._down(i);\r\n }\r\n }\r\n\r\n push(item) {\r\n this.data.push(item);\r\n this.length++;\r\n this._up(this.length - 1);\r\n }\r\n\r\n pop() {\r\n if (this.length === 0) return undefined;\r\n\r\n const top = this.data[0];\r\n const bottom = this.data.pop();\r\n this.length--;\r\n\r\n if (this.length > 0) {\r\n this.data[0] = bottom;\r\n this._down(0);\r\n }\r\n\r\n return top;\r\n }\r\n\r\n peek() {\r\n return this.data[0];\r\n }\r\n\r\n _up(pos) {\r\n const { data, compare } = this;\r\n const item = data[pos];\r\n\r\n while (pos > 0) {\r\n const parent = (pos - 1) >> 1;\r\n const current = data[parent];\r\n if (compare(item, current) >= 0) break;\r\n data[pos] = current;\r\n pos = parent;\r\n }\r\n\r\n data[pos] = item;\r\n }\r\n\r\n _down(pos) {\r\n const { data, compare } = this;\r\n const halfLength = this.length >> 1;\r\n const item = data[pos];\r\n\r\n while (pos < halfLength) {\r\n let left = (pos << 1) + 1;\r\n let best = data[left];\r\n const right = left + 1;\r\n\r\n if (right < this.length && compare(data[right], best) < 0) {\r\n left = right;\r\n best = data[right];\r\n }\r\n if (compare(best, item) >= 0) break;\r\n\r\n data[pos] = best;\r\n pos = left;\r\n }\r\n\r\n data[pos] = item;\r\n }\r\n}\r\n\r\nfunction defaultCompare(a, b) {\r\n return a < b ? -1 : a > b ? 1 : 0;\r\n}\r\n","import { TinyQueue } from \"./TinyQueue\";\r\n\r\nexport function knn(tree, x, y, n, predicate, maxDistance) {\r\n var node = tree.data,\r\n result = [],\r\n toBBox = tree.toBBox,\r\n i,\r\n child,\r\n dist,\r\n candidate;\r\n\r\n var queue = new TinyQueue(undefined, compareDist);\r\n\r\n while (node) {\r\n for (i = 0; i < node.children.length; i++) {\r\n child = node.children[i];\r\n dist = boxDist(x, y, node.leaf ? toBBox(child) : child);\r\n if (!maxDistance || dist <= maxDistance * maxDistance) {\r\n queue.push({\r\n node: child,\r\n isItem: node.leaf,\r\n dist: dist,\r\n });\r\n }\r\n }\r\n\r\n while (queue.length && queue.peek().isItem) {\r\n candidate = queue.pop().node;\r\n if (!predicate || predicate(candidate)) result.push(candidate);\r\n if (n && result.length === n) return result;\r\n }\r\n\r\n node = queue.pop();\r\n if (node) node = node.node;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction compareDist(a, b) {\r\n return a.dist - b.dist;\r\n}\r\n\r\nfunction boxDist(x, y, box) {\r\n var dx = axisDist(x, box.minX, box.maxX),\r\n dy = axisDist(y, box.minY, box.maxY);\r\n return dx * dx + dy * dy;\r\n}\r\n\r\nfunction axisDist(k, min, max) {\r\n return k < min ? min - k : k <= max ? 0 : k - max;\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport RBush from \"rbush\";\r\nimport { knn } from \"../../utils/rbush-knn\";\r\nimport Tool from \"./Tool\";\r\n\r\nimport {\r\n FormControl,\r\n MenuItem,\r\n Table,\r\n TableRow,\r\n TableCell,\r\n TableBody,\r\n TextField,\r\n IconButton,\r\n Tooltip,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { VisibilityOff, Visibility } from \"@mui/icons-material\";\r\nimport SketchColorPicker from \"../SketchColorPicker\";\r\n\r\nclass PlotNearestRoiTool extends Tool {\r\n name = \"Plot nearest objects\";\r\n nearestLayer = null;\r\n colors = {\r\n main: \"red\",\r\n nearest: \"green\",\r\n connection: \"blue\",\r\n maxDistance: \"red\",\r\n };\r\n config = {\r\n mainRadius: 80,\r\n nearestRadius: 50,\r\n connectionLineWidth: 1,\r\n maxDistance: 1000,\r\n mainVisibility: true,\r\n nearestVisibility: true,\r\n connectionVisibility: true,\r\n maxDistanceVisibility: true,\r\n nearestLayerId: null,\r\n };\r\n\r\n setLayer(obj) {\r\n this.structures = obj.structures;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n mouse(params) {\r\n let { event, p } = params;\r\n this.curX = p.x;\r\n this.curY = p.y;\r\n\r\n // mouse middle button\r\n if (event.button === 1) {\r\n return;\r\n }\r\n }\r\n\r\n drawDistanceCircles(ctx, regionRois, color, radius) {\r\n for (let regionRoi of regionRois) {\r\n let center = regionRoi.center;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = color;\r\n ctx.arc(center.x, center.y, radius, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n drawLayerCircles(ctx, fkt, regionRois, color, radius) {\r\n for (let regionRoi of regionRois) {\r\n let center = regionRoi.center;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.fillStyle = color;\r\n ctx.arc(center.x, center.y, radius, 0, 2 * Math.PI);\r\n ctx.fill();\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n drawNearestConnections(ctx, regionRois, tree, color) {\r\n for (let regionRoi of regionRois) {\r\n let center = regionRoi.center;\r\n let nearestCenters = knn(\r\n tree,\r\n center.x,\r\n center.y,\r\n 1,\r\n null,\r\n this.config.maxDistance\r\n ).map((item) => item.center);\r\n if (nearestCenters.length > 0) {\r\n let center2 = nearestCenters[0];\r\n ctx.beginPath();\r\n ctx.strokeStyle = color;\r\n ctx.moveTo(center.x, center.y);\r\n ctx.lineTo(center2.x, center2.y);\r\n ctx.stroke();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Draw a custom cursor\r\n */\r\n drawCustomCursor(ctx, mousePosition, fkt) {\r\n if (this.config.maxDistanceVisibility) {\r\n this.drawDistanceCircles(\r\n ctx,\r\n this.roiLayers[this.selectedLayer].layer.regionRois,\r\n this.colors.maxDistance,\r\n this.config.maxDistance\r\n );\r\n }\r\n\r\n ctx.lineWidth = this.config.connectionLineWidth / fkt;\r\n if (\r\n this.roiLayers[this.nearestLayer] &&\r\n this.selectedLayer !== this.nearestLayer\r\n ) {\r\n if (this.config.connectionVisibility) {\r\n let selectedTree = new RBush();\r\n for (let regionRoi of this.roiLayers[this.selectedLayer].layer\r\n .regionRois) {\r\n selectedTree.insert(regionRoi.treeItem);\r\n }\r\n this.drawNearestConnections(\r\n ctx,\r\n this.roiLayers[this.nearestLayer].layer.regionRois,\r\n selectedTree,\r\n this.colors.connection,\r\n 1\r\n );\r\n }\r\n\r\n if (this.config.nearestVisibility) {\r\n this.drawLayerCircles(\r\n ctx,\r\n fkt,\r\n this.roiLayers[this.nearestLayer].layer.regionRois,\r\n this.colors.nearest,\r\n this.config.nearestRadius\r\n );\r\n }\r\n }\r\n\r\n if (this.config.mainVisibility) {\r\n this.drawLayerCircles(\r\n ctx,\r\n fkt,\r\n this.roiLayers[this.selectedLayer].layer.regionRois,\r\n this.colors.main,\r\n this.config.mainRadius\r\n );\r\n }\r\n }\r\n\r\n setSelectedRoiLayer = (id) => {\r\n for (let i = 0; i < this.structures.length; i++) {\r\n if (this.structures[i].id === id) {\r\n this.nearestLayer = i;\r\n }\r\n }\r\n };\r\n\r\n onChangeColors = (colors) => {\r\n this.colors = colors;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n onChangeConfig = (config) => {\r\n this.config = config;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration = () => {\r\n return (\r\n
\r\n {this.name}:\r\n this.onChangeColors(colors)}\r\n onChangeConfig={(config) => this.onChangeConfig(config)}\r\n roiLayers={this.roiLayers}\r\n selectedLayer={this.selectedLayer}\r\n structures={this.structures}\r\n onChangeSelection={(id) => {\r\n this.setSelectedRoiLayer(id);\r\n }}\r\n />\r\n
\r\n );\r\n };\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n onChangeColor = (color, type) => {\r\n let colorObject = this.props.colors;\r\n colorObject[type] = color;\r\n this.props.onChangeColors(colorObject);\r\n };\r\n onChangeConfig = (value, type) => {\r\n let configObject = this.props.config;\r\n configObject[type] = value;\r\n this.props.onChangeConfig(configObject);\r\n };\r\n render() {\r\n const { structures, roiLayers, selectedLayer, config, colors } = this.props;\r\n const styles = {\r\n numberInput: {\r\n width: 60,\r\n },\r\n };\r\n\r\n const filteredStructures = structures.filter(\r\n (val, i) =>\r\n i !== selectedLayer && roiLayers[i].layer.regionRois.length > 0\r\n );\r\n if (config.nearestLayerId === null && filteredStructures.length > 0) {\r\n this.props.onChangeSelection(filteredStructures[0].id);\r\n this.onChangeConfig(filteredStructures[0].id, \"nearestLayerId\");\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Main\r\n \r\n \r\n {\r\n let value = Math.max(1, e.target.value);\r\n this.onChangeConfig(value, \"mainRadius\");\r\n }}\r\n />\r\n \r\n \r\n \r\n {\r\n this.onChangeConfig(\r\n !config.mainVisibility,\r\n \"mainVisibility\"\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n {config.mainVisibility ? : }\r\n \r\n \r\n \r\n \r\n {\r\n this.onChangeColor(color, \"main\");\r\n this.onChangeColor(color, \"maxDistance\");\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {\r\n this.props.onChangeSelection(e.target.value);\r\n this.onChangeConfig(e.target.value, \"nearestLayerId\");\r\n }}\r\n >\r\n {filteredStructures.map((structure, idx) => {\r\n return (\r\n \r\n {structure.label} {idx}\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n {\r\n let value = Math.max(1, e.target.value);\r\n this.onChangeConfig(value, \"nearestRadius\");\r\n }}\r\n />\r\n \r\n \r\n \r\n {\r\n this.onChangeConfig(\r\n !config.nearestVisibility,\r\n \"nearestVisibility\"\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n {config.nearestVisibility ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n this.onChangeColor(color, \"nearest\")}\r\n />\r\n \r\n \r\n \r\n \r\n Connection\r\n \r\n \r\n {\r\n let value = Math.max(1, e.target.value);\r\n this.onChangeConfig(value, \"connectionLineWidth\");\r\n }}\r\n />\r\n \r\n \r\n \r\n {\r\n this.onChangeConfig(\r\n !config.connectionVisibility,\r\n \"connectionVisibility\"\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n {config.connectionVisibility ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n this.onChangeColor(color, \"connection\")\r\n }\r\n />\r\n \r\n \r\n\r\n \r\n \r\n Maximum Distance\r\n \r\n \r\n {\r\n let value = Math.max(1, e.target.value);\r\n this.onChangeConfig(value, \"maxDistance\");\r\n }}\r\n />\r\n \r\n \r\n \r\n {\r\n this.onChangeConfig(\r\n !config.maxDistanceVisibility,\r\n \"maxDistanceVisibility\"\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n {config.maxDistanceVisibility ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n this.onChangeColor(color, \"maxDistance\")\r\n }\r\n />\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n colors: PropTypes.object,\r\n onChangeColors: PropTypes.func,\r\n config: PropTypes.object,\r\n onChangeConfig: PropTypes.func,\r\n structures: PropTypes.array,\r\n roiLayers: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n onChangeSelection: PropTypes.func,\r\n};\r\n\r\nexport default PlotNearestRoiTool;\r\n","import React from \"react\";\r\nimport {\r\n updateDrawLayer,\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n findClickedRoi,\r\n getExterior,\r\n checkIfStructureHidden,\r\n distance,\r\n} from \"../../utils/PolygonUtil\";\r\nimport { Typography } from \"@mui/material\";\r\nimport Tool from \"./Tool\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\n\r\nclass RegionTool extends Tool {\r\n name = \"Region\";\r\n noConfig = false;\r\n flag = false;\r\n downScale = 2;\r\n points = [];\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n useNodeDrawingMode = null;\r\n tempUseNodeDrawingMode = null;\r\n\r\n setLayer(obj) {\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n if (this.useNodeDrawingMode === null) {\r\n this.useNodeDrawingMode = project.projectProperties[\"NodeDrawingMode\"]\r\n ? true\r\n : false;\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.tempRemoveOverlapSame = this.removeOverlapSame;\r\n this.removeOverlap = false;\r\n this.removeOverlapSame = false;\r\n this.tempUseNodeDrawingMode = this.useNodeDrawingMode;\r\n this.useNodeDrawingMode = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n this.removeOverlapSame = this.tempRemoveOverlapSame;\r\n this.useNodeDrawingMode = this.tempUseNodeDrawingMode;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n updateDrawing(color, subtype, name, positionInRoiLayer, fullyLoaded) {\r\n let drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n if (this.drawLayer.regionRois.length > 0) {\r\n drawRegion.regions = this.drawLayer.regionRois;\r\n\r\n // soll der selected layer sein\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n\r\n updateLayer(\r\n this.layer,\r\n drawRegion,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi\r\n );\r\n this.drawLayer.regionRois = [];\r\n }\r\n }\r\n\r\n addPoint = (event, p) => {\r\n let eventPoint = { x: event.clientX, y: event.clientY };\r\n if (this.points.length < 3 || this.useNodeDrawingMode) {\r\n this.points.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n } else {\r\n const dist = distance(this.lastEventPoint, eventPoint);\r\n if (dist < 10) {\r\n this.points[this.points.length - 1] = [p.x, p.y];\r\n } else {\r\n this.points.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n }\r\n }\r\n };\r\n\r\n mouse(params) {\r\n let {\r\n event,\r\n p,\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n parentIdx,\r\n } = params;\r\n let parentLayer = parentIdx;\r\n if (this.useNodeDrawingMode) {\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n if (this.flag) {\r\n if (\r\n (this.clear && event.button === 2) ||\r\n (!this.clear && event.button === 0)\r\n ) {\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n } else {\r\n this.applyDrawLayer(\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n parentLayer\r\n );\r\n }\r\n } else {\r\n this.initDrawing(subtype, name, color, event, p);\r\n }\r\n }\r\n return;\r\n }\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n this.initDrawing(subtype, name, color, event, p);\r\n return;\r\n }\r\n\r\n if (event.type === \"mouseup\") {\r\n this.applyDrawLayer(\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n parentLayer\r\n );\r\n return;\r\n }\r\n if (this.flag && event.buttons !== 1 && event.buttons !== 2) {\r\n this.flag = false;\r\n this.drawLayer.regionRois = [];\r\n // this.drawLayer.coordinates = [];\r\n return;\r\n }\r\n if (event.type === \"mousemove\") {\r\n if (this.flag) {\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n }\r\n }\r\n }\r\n\r\n initDrawing = (subtype, name, color, event, p) => {\r\n checkIfStructureHidden(\r\n this.structures,\r\n this.selectedLayer,\r\n subtype,\r\n name,\r\n color\r\n );\r\n this.drawLayer.regionRois = [];\r\n this.drawLayer.inverted = false;\r\n // right mouse button -> clear\r\n this.clear = event.button === 2;\r\n this.drawLayer.clear = this.clear;\r\n\r\n // update position history\r\n this.points = [];\r\n this.points.push([p.x, p.y]);\r\n\r\n // set drawing flag\r\n this.flag = true;\r\n\r\n // check if mouse down is inside region? => exapand region\r\n if (this.removeOverlapSame) {\r\n this.clickedOnRoi = findClickedRoi(\r\n p,\r\n this.selectedLayer,\r\n this.structures,\r\n this.roiLayers,\r\n this.includeBaseROI\r\n );\r\n }\r\n };\r\n\r\n addPointToDrawLayer = (event, p, color, subtype) => {\r\n this.addPoint(event, p);\r\n\r\n let drawRegion = {\r\n regions: [this.points],\r\n inverted: false,\r\n };\r\n drawRegion = getExterior(drawRegion);\r\n\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n updateDrawLayer(this.drawLayer, drawRegion, false, color, subtype, name);\r\n };\r\n\r\n replaceLastPointInDrawLayer = (event, p, color, subtype) => {\r\n if (this.points.length === 1) {\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n return;\r\n }\r\n if (this.points.length > 1) {\r\n this.points.pop();\r\n this.addPointToDrawLayer(event, p, color, subtype);\r\n }\r\n };\r\n\r\n applyDrawLayer = (\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n parentLayer\r\n ) => {\r\n // release drawing flag\r\n this.flag = false;\r\n this.points = [];\r\n this.updateDrawing(\r\n color,\r\n subtype,\r\n name,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n parentLayer\r\n );\r\n };\r\n\r\n drawCustomCursor(ctx, mousePosition, scale) {\r\n // no custom cursor\r\n if (ctx) {\r\n if (this.useNodeDrawingMode && this.points.length > 0) {\r\n const p1 = this.points[this.points.length - 1];\r\n const p2 = [mousePosition.x, mousePosition.y];\r\n const p3 = this.points[0];\r\n ctx.lineWidth = 2 / scale;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = \"#000000\";\r\n ctx.moveTo(p1[0], p1[1]);\r\n ctx.lineTo(p2[0], p2[1]);\r\n ctx.lineTo(p3[0], p3[1]);\r\n if (this.points.length == 2) {\r\n ctx.lineTo(p1[0], p1[1]);\r\n }\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
\r\n {this.name}:\r\n (this.useNodeDrawingMode = e)}\r\n onChangeRemoveOverlap={(e) => (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default RegionTool;\r\n","import {\r\n updateLayer,\r\n updateDrawLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n findClickedRoi,\r\n checkIfStructureHidden,\r\n createRegionRoi,\r\n findRoi,\r\n} from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\nimport {\r\n Tabs,\r\n Tab,\r\n FormControl,\r\n FormControlLabel,\r\n RadioGroup,\r\n Radio,\r\n Typography,\r\n} from \"@mui/material\";\r\n\r\nclass RectangleTool extends Tool {\r\n name = \"Rectangle\";\r\n noConfig = false;\r\n includeBaseROI = false;\r\n flag = false;\r\n downScale = 2;\r\n points = [];\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n activeTab = 0;\r\n drawMode = \"draw\";\r\n selectedRoi = null;\r\n selectedIndex = null;\r\n resizeMode = \"\";\r\n resizingStarted = \"\";\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.updateObjectMode = obj.updateObjectMode;\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n this.activeTab = 0;\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.tempRemoveOverlapSame = this.removeOverlapSame;\r\n this.removeOverlap = false;\r\n this.removeOverlapSame = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n this.removeOverlapSame = this.tempRemoveOverlapSame;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n if (this.activeTab === 1) {\r\n if (typeof this.updateObjectMode === \"function\") {\r\n this.updateObjectMode(true);\r\n }\r\n }\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n getValidatedRegions(regions) {\r\n let validatedRegions = regions.map((p) => {\r\n return [\r\n Math.max(0, Math.min(this.ome.sizeX, p[0])),\r\n Math.max(0, Math.min(this.ome.sizeY, p[1])),\r\n ];\r\n });\r\n return validatedRegions;\r\n }\r\n\r\n /** Edits the position and size of a ROI using its new coordinates.\r\n *\r\n * @param {Array} regions Array of coordninate arrays: [[x,y], ..., [x,y]]\r\n */\r\n editRoi(regions) {\r\n if (this.selectedRoi === null) return;\r\n let newRoi = null;\r\n\r\n let historyItem = [];\r\n let histId = this.structures[this.selectedIndex].id;\r\n if (regions !== null) {\r\n regions = regions.map((p) => {\r\n return [\r\n Math.max(0, Math.min(this.ome.sizeX, p[0])),\r\n Math.max(0, Math.min(this.ome.sizeY, p[1])),\r\n ];\r\n });\r\n\r\n newRoi = createRegionRoi(\r\n this.getValidatedRegions(regions),\r\n this.selectedRoi.color,\r\n this.selectedRoi.isSubtype,\r\n this.selectedRoi.subtypeName,\r\n this.selectedRoi.fullyLoaded,\r\n this.structures[this.selectedIndex].id,\r\n true // isObject = true\r\n );\r\n }\r\n if (newRoi !== null) {\r\n this.lastRoi = newRoi;\r\n this.roiLayers[this.selectedIndex].tree.insert(newRoi.treeItem);\r\n historyItem.push({ add: true, id: histId, roi: newRoi });\r\n }\r\n if (typeof this.roiLayers[this.selectedIndex] === \"undefined\") return;\r\n\r\n let layerIndex = this.roiLayers[\r\n this.selectedIndex\r\n ].layer.regionRois.findIndex((roi) => roi.uuid === this.selectedRoi.uuid);\r\n this.roiLayers[this.selectedIndex].tree.remove(this.selectedRoi.treeItem);\r\n historyItem.push({ add: false, id: histId, roi: this.selectedRoi });\r\n\r\n if (layerIndex >= 0) {\r\n if (newRoi === null) {\r\n this.roiLayers[this.selectedIndex].layer.regionRois.splice(\r\n layerIndex,\r\n 1\r\n );\r\n } else {\r\n this.roiLayers[this.selectedIndex].layer.regionRois[layerIndex] =\r\n newRoi;\r\n }\r\n }\r\n\r\n this.lastRoi = newRoi;\r\n this.selectedRoi = newRoi;\r\n this.hoveredRoi = newRoi;\r\n\r\n if (newRoi === null) {\r\n this.selectedIndex = null;\r\n }\r\n window.projectHistory.add(historyItem);\r\n }\r\n\r\n selectNexRoi = () => {\r\n const regionRois = this.roiLayers[this.selectedIndex].layer.regionRois;\r\n let roiIdx = regionRois.findIndex(\r\n (roi) => roi.uuid === this.selectedRoi.uuid\r\n );\r\n roiIdx = roiIdx + 1 >= regionRois.length ? 0 : roiIdx + 1;\r\n this.selectedRoi = regionRois[roiIdx];\r\n window.zoomToRect(this.selectedRoi.bounds);\r\n };\r\n\r\n rendererKeyDown(e) {\r\n if (this.drawMode === \"edit\" && this.selectedRoi) {\r\n let bounds = Object.assign({}, this.selectedRoi.bounds);\r\n let editRoi = false;\r\n let deleteRoi = false;\r\n switch (e.key) {\r\n case \"Tab\":\r\n this.selectNexRoi();\r\n e.preventDefault();\r\n break;\r\n case \"ArrowRight\":\r\n if (!e.shiftKey) bounds.left++;\r\n bounds.right++;\r\n editRoi = true;\r\n break;\r\n case \"ArrowLeft\":\r\n if (!e.shiftKey) bounds.left--;\r\n bounds.right--;\r\n editRoi = true;\r\n break;\r\n case \"ArrowUp\":\r\n if (!e.shiftKey) bounds.top--;\r\n bounds.bottom--;\r\n editRoi = true;\r\n break;\r\n case \"ArrowDown\":\r\n if (!e.shiftKey) bounds.top++;\r\n bounds.bottom++;\r\n editRoi = true;\r\n break;\r\n case \"Delete\":\r\n editRoi = true;\r\n deleteRoi = true;\r\n break;\r\n default:\r\n break;\r\n }\r\n if (editRoi) {\r\n let regions = null;\r\n if (\r\n bounds.left > 0 &&\r\n bounds.top > 0 &&\r\n bounds.right < this.ome.sizeX &&\r\n bounds.bottom < this.ome.sizeY\r\n ) {\r\n if (!deleteRoi) {\r\n regions = [\r\n [bounds.left, bounds.top],\r\n [bounds.right, bounds.top],\r\n [bounds.right, bounds.bottom],\r\n [bounds.left, bounds.bottom],\r\n [bounds.left, bounds.top],\r\n ];\r\n }\r\n\r\n this.editRoi(regions);\r\n }\r\n }\r\n }\r\n }\r\n\r\n setClickedRoiSelected(p, event) {\r\n let foundRoiResults = findRoi(\r\n p,\r\n this.roiLayers,\r\n this.structures,\r\n this.includeBaseROI\r\n );\r\n this.selectedIndex = foundRoiResults[0];\r\n let roi = foundRoiResults[1];\r\n if (roi && !roi.isObject) {\r\n window.showWarningSnackbar(\"Can not be edited! (no object annotation)\");\r\n this.selectedRoi = null;\r\n } else {\r\n this.selectedRoi = roi;\r\n this.lastRoi = roi;\r\n if (event.button === 2) {\r\n this.editRoi(null); //delete roi\r\n } else {\r\n this.mouseDownPosition = p;\r\n if (roi) {\r\n if (this.resizeMode !== \"\") {\r\n this.resizingStarted = this.resizeMode;\r\n }\r\n this.mouseDownRoi = roi;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Checks whether the cursor is hovering over an object.\r\n *\r\n * @param {Object} p x and y of cursor {x:, y: }\r\n */\r\n setHoveredRoi(p) {\r\n let foundRoiResults = findRoi(\r\n p,\r\n this.roiLayers,\r\n this.structures,\r\n this.includeBaseROI\r\n );\r\n this.hoveredIndex = foundRoiResults[0];\r\n let roi = foundRoiResults[1];\r\n this.hoveredRoi = roi;\r\n }\r\n\r\n /** Handeling of mouse events.\r\n *\r\n * @param {MouseEvent} event\r\n * @param {Object} p x and y of cursor {x:, y: }\r\n * @param {String} color #012DEF\r\n * @param {Bool} subtype Is the mouse over a subtype or not?\r\n * @param {String} name Name of the structure the cursor is above.\r\n * @param {Bool} positionInRoiLayer Is the cursor currently in a ROI Layer?\r\n * @param {Bool} fullyLoaded\r\n * @param {Int} parentLayer The id of the parentlayer of the structure the curson is above.\r\n */\r\n mouse(params) {\r\n let { event, p, color, subtype, name, positionInRoiLayer, fullyLoaded } =\r\n params;\r\n // Rectangle tool in object mode, selected option duplicate.\r\n if (this.activeTab === 1 && this.drawMode === \"duplicate\") {\r\n if (event.type === \"mousedown\" && event.button === 0 && this.lastRoi) {\r\n let rw = (this.lastRoi.bounds.right - this.lastRoi.bounds.left) / 2;\r\n let rh = (this.lastRoi.bounds.bottom - this.lastRoi.bounds.top) / 2;\r\n let regions = [\r\n [p.x - rw, p.y - rh],\r\n [p.x + rw, p.y - rh],\r\n [p.x + rw, p.y + rh],\r\n [p.x + rw, p.y + rh],\r\n [p.x - rw, p.y - rh],\r\n ];\r\n\r\n let drawRegion = {\r\n regions: [\r\n createRegionRoi(\r\n regions,\r\n color,\r\n subtype,\r\n name,\r\n fullyLoaded,\r\n this.structures[this.originalSelectedLayer].id,\r\n true\r\n ),\r\n ],\r\n inverted: false,\r\n };\r\n\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n updateLayer(\r\n this.layer,\r\n drawRegion,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi,\r\n true\r\n );\r\n }\r\n }\r\n // Rectangle tool in object mode, selected option edit or draw-while-hovering-over-an-object.\r\n else if (\r\n this.activeTab === 1 &&\r\n (this.drawMode === \"edit\" ||\r\n (this.drawMode === \"draw\" && this.hoveredRoi !== null))\r\n ) {\r\n // Click on hovered-over object\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n this.setClickedRoiSelected(p, event);\r\n }\r\n // Move hovered-over object\r\n else if (event.type === \"mousemove\") {\r\n this.setHoveredRoi(p);\r\n\r\n // move roi\r\n if (this.mouseDownPosition && this.mouseDownRoi) {\r\n let deltaP = {\r\n x: this.mouseDownPosition.x - p.x,\r\n y: this.mouseDownPosition.y - p.y,\r\n };\r\n\r\n let regions = [];\r\n\r\n // Resize Object\r\n if (this.resizingStarted !== \"\") {\r\n let bounds = {\r\n left: this.resizingStarted.includes(\"left\")\r\n ? this.mouseDownRoi.bounds.left - deltaP.x\r\n : this.mouseDownRoi.bounds.left,\r\n top: this.resizingStarted.includes(\"top\")\r\n ? this.mouseDownRoi.bounds.top - deltaP.y\r\n : this.mouseDownRoi.bounds.top,\r\n right: this.resizingStarted.includes(\"right\")\r\n ? this.mouseDownRoi.bounds.right - deltaP.x\r\n : this.mouseDownRoi.bounds.right,\r\n bottom: this.resizingStarted.includes(\"bottom\")\r\n ? this.mouseDownRoi.bounds.bottom - deltaP.y\r\n : this.mouseDownRoi.bounds.bottom,\r\n };\r\n bounds.left = Math.max(0, bounds.left);\r\n bounds.top = Math.max(0, bounds.top);\r\n bounds.right = Math.min(this.ome.sizeX, bounds.right);\r\n bounds.bottom = Math.min(this.ome.sizeY, bounds.bottom);\r\n regions = [\r\n [bounds.left, bounds.top],\r\n [bounds.right, bounds.top],\r\n [bounds.right, bounds.bottom],\r\n [bounds.left, bounds.bottom],\r\n [bounds.left, bounds.top],\r\n ];\r\n }\r\n // Move object\r\n else {\r\n regions = this.mouseDownRoi.regions[0].map((point) => {\r\n return [point[0] - deltaP.x, point[1] - deltaP.y];\r\n });\r\n }\r\n // Save changes to object\r\n this.editRoi(regions);\r\n }\r\n }\r\n // Release hovered-over object\r\n if (event.type === \"mouseup\") {\r\n this.mouseDownPosition = null;\r\n this.resizingStarted = \"\";\r\n }\r\n }\r\n // Rectangle tool in area or object mode, set starting point.\r\n else if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n checkIfStructureHidden(\r\n this.structures,\r\n this.selectedLayer,\r\n subtype,\r\n name,\r\n color\r\n );\r\n this.drawLayer.regionRois = [];\r\n this.drawLayer.inverted = false;\r\n // right mouse button -> clear\r\n this.clear = event.button === 2;\r\n this.drawLayer.clear = this.clear;\r\n\r\n // update position history\r\n this.startPoint = p;\r\n this.points = [];\r\n this.points.push([p.x, p.y]);\r\n\r\n // set drawing flag\r\n this.flag = true;\r\n\r\n // check if mouse down is inside region? => exapand region\r\n if (this.removeOverlapSame) {\r\n this.clickedOnRoi = findClickedRoi(\r\n p,\r\n this.selectedLayer,\r\n this.structures,\r\n this.roiLayers,\r\n this.includeBaseROI\r\n );\r\n }\r\n }\r\n // Rectangle tool in area or object mode, set end point.\r\n else if (\r\n event.type === \"mouseup\" ||\r\n (this.flag && event.type === \"mouseleave\")\r\n ) {\r\n // release drawing flag\r\n this.flag = false;\r\n let drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n if (this.drawLayer.regionRois.length > 0) {\r\n drawRegion.regions = [this.drawLayer.regionRois[0]];\r\n\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n\r\n // Save last ROI for duplication\r\n if (this.activeTab === 1) {\r\n this.lastRoi =\r\n this.drawLayer.regionRois[this.drawLayer.regionRois.length - 1];\r\n }\r\n updateLayer(\r\n this.layer,\r\n drawRegion,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi,\r\n this.activeTab === 1 // defines if it should be treated as an object\r\n );\r\n\r\n this.drawLayer.regionRois = [];\r\n }\r\n }\r\n // Rectangle tool in area or object mode, create rectangle by dragging.\r\n else if (event.type === \"mousemove\") {\r\n if (this.flag) {\r\n let points = [];\r\n points.push([this.startPoint.x, this.startPoint.y]);\r\n points.push([p.x, this.startPoint.y]);\r\n points.push([p.x, p.y]);\r\n points.push([this.startPoint.x, p.y]);\r\n points.push([this.startPoint.x, this.startPoint.y]);\r\n\r\n let drawRegion = {\r\n regions: [points],\r\n inverted: false,\r\n };\r\n\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n updateDrawLayer(\r\n this.drawLayer,\r\n drawRegion,\r\n false,\r\n color,\r\n subtype,\r\n name\r\n );\r\n }\r\n // Check if currently hovering over an object.\r\n else {\r\n this.setHoveredRoi(p);\r\n }\r\n }\r\n }\r\n\r\n highlightRoi(ctx, roi) {\r\n if (roi) {\r\n ctx.globalAlpha = 0.2;\r\n ctx.fillStyle = roi.isObject ? \"#000000\" : \"#ff0000\";\r\n ctx.beginPath();\r\n for (let points of roi.getRectRegions()) {\r\n if (points[points.length - 2]) {\r\n ctx.moveTo(\r\n points[points.length - 2][0],\r\n points[points.length - 2][1]\r\n );\r\n for (let i = 0; i < points.length; i++) {\r\n ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n }\r\n }\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.globalAlpha = 1.0;\r\n }\r\n }\r\n\r\n highlightResizeCorner(ctx, roi, p) {\r\n if (roi && roi.isObject) {\r\n ctx.globalAlpha = 1.0;\r\n ctx.fillStyle = \"#0000ff\";\r\n let rb = roi.bounds;\r\n let scaleFactor = 1 / ctx.getTransform().a;\r\n let cornerSize = 20 * scaleFactor;\r\n let roiWidth = roi.bounds.right - roi.bounds.left;\r\n let roiHeight = roi.bounds.bottom - roi.bounds.top;\r\n let x = roi.bounds.left;\r\n let y = roi.bounds.top;\r\n\r\n //no resizing if corners would hinder translation\r\n if (cornerSize * 2.5 > roiWidth || cornerSize * 2.5 > roiHeight) {\r\n this.resizeMode = \"\";\r\n return;\r\n }\r\n\r\n //if mouse in bottom right corner\r\n if (\r\n !(\r\n p.x < rb.left ||\r\n p.x > rb.left + cornerSize ||\r\n p.y < rb.top ||\r\n p.y > rb.top + cornerSize\r\n )\r\n ) {\r\n this.resizeMode = \"top_left\";\r\n } else if (\r\n !(\r\n p.x < rb.right - cornerSize ||\r\n p.x > rb.right ||\r\n p.y < rb.top ||\r\n p.y > rb.top + cornerSize\r\n )\r\n ) {\r\n this.resizeMode = \"top_right\";\r\n x = rb.right - cornerSize;\r\n } else if (\r\n !(\r\n p.x < rb.right - cornerSize ||\r\n p.x > rb.right ||\r\n p.y < rb.bottom - cornerSize ||\r\n p.y > rb.bottom\r\n )\r\n ) {\r\n this.resizeMode = \"bottom_right\";\r\n x = rb.right - cornerSize;\r\n y = rb.bottom - cornerSize;\r\n } else if (\r\n !(\r\n p.x < rb.left ||\r\n p.x > rb.left + cornerSize ||\r\n p.y < rb.bottom - cornerSize ||\r\n p.y > rb.bottom\r\n )\r\n ) {\r\n this.resizeMode = \"bottom_left\";\r\n y = rb.bottom - cornerSize;\r\n } else {\r\n //mouse in right bottom corner\r\n this.resizeMode = \"\";\r\n return;\r\n }\r\n let points = [\r\n [x, y],\r\n [x + cornerSize, y],\r\n [x + cornerSize, y + cornerSize],\r\n [x, y + cornerSize],\r\n [x, y],\r\n ];\r\n ctx.beginPath();\r\n ctx.moveTo(points[0], points[1]);\r\n for (let i = 0; i < points.length; i++) {\r\n ctx.lineTo(points[i][0], points[i][1]);\r\n }\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.globalAlpha = 1.0;\r\n }\r\n }\r\n\r\n drawCustomCursor(ctx, mousePosition) {\r\n if (\r\n (this.drawMode === \"draw\" && this.hoveredRoi === null) ||\r\n this.activeTab === 0\r\n ) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.beginPath();\r\n ctx.moveTo(mousePosition.x, 0);\r\n ctx.lineTo(mousePosition.x, 1000000);\r\n ctx.moveTo(0, mousePosition.y);\r\n ctx.lineTo(1000000, mousePosition.y);\r\n ctx.stroke();\r\n ctx.closePath();\r\n } else if (this.lastRoi && this.drawMode === \"duplicate\") {\r\n let p = mousePosition;\r\n let rw = (this.lastRoi.bounds.right - this.lastRoi.bounds.left) / 2;\r\n let rh = (this.lastRoi.bounds.bottom - this.lastRoi.bounds.top) / 2;\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.moveTo(\r\n Math.max(0, Math.min(this.ome.sizeX, p.x - rw)),\r\n Math.max(0, Math.min(this.ome.sizeY, p.y - rh))\r\n );\r\n ctx.lineTo(\r\n Math.max(0, Math.min(this.ome.sizeX, p.x + rw)),\r\n Math.max(0, Math.min(this.ome.sizeY, p.y - rh))\r\n );\r\n ctx.lineTo(\r\n Math.max(0, Math.min(this.ome.sizeX, p.x + rw)),\r\n Math.max(0, Math.min(this.ome.sizeY, p.y + rh))\r\n );\r\n ctx.lineTo(\r\n Math.max(0, Math.min(this.ome.sizeX, p.x - rw)),\r\n Math.max(0, Math.min(this.ome.sizeY, p.y + rh))\r\n );\r\n //ctx.lineTo(p.x + rw, p.y - rh);\r\n ctx.closePath();\r\n ctx.stroke();\r\n }\r\n\r\n if (this.activeTab === 1) {\r\n this.highlightRoi(ctx, this.selectedRoi);\r\n this.highlightRoi(ctx, this.hoveredRoi);\r\n this.highlightResizeCorner(ctx, this.hoveredRoi, mousePosition);\r\n }\r\n }\r\n\r\n handleChange = () => {\r\n this.activeTab = this.activeTab === 0 ? 1 : 0;\r\n if (typeof this.updateObjectMode === \"function\") {\r\n this.updateObjectMode(this.activeTab === 1);\r\n }\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
\r\n {this.name}:\r\n \r\n \r\n \r\n \r\n \r\n {this.activeTab === 0 && (\r\n (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n )}\r\n {this.activeTab === 1 && (\r\n \r\n \r\n {\r\n this.drawMode = e.target.value;\r\n window.forceSidebarUpdate();\r\n }}\r\n >\r\n }\r\n label=\"Draw Object\"\r\n />\r\n }\r\n label=\"Edit Object (arrows, arrows+Shift, Tab)\"\r\n />\r\n }\r\n label=\"Duplicate last object size\"\r\n disabled={typeof this.lastRoi === \"undefined\"}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default RectangleTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n TextField,\r\n Button,\r\n List,\r\n ListItem,\r\n ListItemAvatar,\r\n Avatar,\r\n ListItemSecondaryAction,\r\n IconButton,\r\n Typography,\r\n} from \"@mui/material\";\r\n\r\nimport { distance } from \"../../utils/PolygonUtil\";\r\n\r\nimport Crop169Icon from \"@mui/icons-material/Crop169\";\r\nimport CommentIcon from \"@mui/icons-material/Comment\";\r\nimport ArrowForwardOutlinedIcon from \"@mui/icons-material/ArrowForwardOutlined\";\r\nimport FormatSizeIcon from \"@mui/icons-material/FormatSize\";\r\n\r\nimport { faDrawPolygon, faRuler } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\n\r\nimport { CommentROI } from \"../../utils/ROI\";\r\nimport SketchColorPicker from \"../SketchColorPicker\";\r\n\r\nimport Tool from \"./Tool\";\r\n\r\nconst scaleUnitLabels = [\"km\", \"m\", \"mm\", \"µm\", \"nm\", \"pm\", \"fm\", \"am\", \"zm\"];\r\nconst scaleUnits = [3, 1, -3, -6, -9, -12, -15, -18, -21];\r\n\r\nconst styles = {\r\n buttonStyle: { marginRight: 10, marginBottom: 10, minWidth: 195 },\r\n listButtonStyle: { marginRight: 5, marginBottom: 5 },\r\n};\r\n\r\nclass CommentTool extends Tool {\r\n name = \"Comment\";\r\n noConfig = false;\r\n mouseActionState = \"free\";\r\n downScale = 2;\r\n points = [];\r\n commentState = {\r\n commentValue: \"\",\r\n color: \"#D0021B\",\r\n selectedTool: \"rectangle\",\r\n };\r\n selectedCommentIdx = 0;\r\n lastP = null;\r\n gripData = null;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.lineColor = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n this.selectionColor = this.lineColor;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n this.commentLayer = obj.commentLayer\r\n ? obj.commentLayer\r\n : { commentRois: [] };\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n distance(p1, p2) {\r\n let deltaX = p1.x - p2.x;\r\n let deltaY = p1.y - p2.y;\r\n return Math.sqrt(deltaX * deltaX + deltaY * deltaY);\r\n }\r\n\r\n generateDistancePoints = (p1, p2) => {\r\n let vector = {\r\n x: p1.x - p2.x,\r\n y: p1.y - p2.y,\r\n };\r\n let length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);\r\n let dl = length / 20;\r\n vector.x /= length;\r\n vector.y /= length;\r\n return [\r\n [p1.x, p1.y],\r\n [p2.x, p2.y],\r\n [p2.x - (dl * vector.y) / 2, p2.y + (dl * vector.x) / 2],\r\n [p2.x + (dl * vector.y) / 2, p2.y - (dl * vector.x) / 2],\r\n [p2.x, p2.y],\r\n [p1.x, p1.y],\r\n [p1.x - (dl * vector.y) / 2, p1.y + (dl * vector.x) / 2],\r\n [p1.x + (dl * vector.y) / 2, p1.y - (dl * vector.x) / 2],\r\n ];\r\n };\r\n\r\n generateArrowPoints = (p1, p2) => {\r\n let vector = {\r\n x: p1.x - p2.x,\r\n y: p1.y - p2.y,\r\n };\r\n let length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);\r\n let dl = length / 20;\r\n vector.x /= length;\r\n vector.y /= length;\r\n return [\r\n [p1.x, p1.y],\r\n [p2.x + vector.x * dl, p2.y + vector.y * dl],\r\n [\r\n p2.x + vector.x * dl - (dl * vector.y) / 2,\r\n p2.y + vector.y * dl + (dl * vector.x) / 2,\r\n ],\r\n [p2.x, p2.y],\r\n [\r\n p2.x + vector.x * dl + (dl * vector.y) / 2,\r\n p2.y + vector.y * dl - (dl * vector.x) / 2,\r\n ],\r\n [p2.x + vector.x * dl, p2.y + vector.y * dl],\r\n ];\r\n };\r\n\r\n deleteCommentRoi(idx) {\r\n this.commentLayer.commentRois.splice(idx, 1);\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n changeRoiFontSize(idx) {\r\n if (this.commentLayer.commentRois[idx].fontScaleFactor === 2 / 3) {\r\n this.commentLayer.commentRois[idx].fontScaleFactor = 1;\r\n } else if (this.commentLayer.commentRois[idx].fontScaleFactor === 1) {\r\n this.commentLayer.commentRois[idx].fontScaleFactor = 4 / 3;\r\n } else {\r\n this.commentLayer.commentRois[idx].fontScaleFactor = 2 / 3;\r\n }\r\n }\r\n\r\n changeSelectedColor(idx, color) {\r\n this.commentLayer.commentRois[idx].color = color;\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n changeSelectedCommentValue(idx, commentValue) {\r\n this.commentLayer.commentRois[idx].commentValue = commentValue;\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n changeSelectedCommentIdx(idx) {\r\n // provides bad user-experience when using for documentation purposes\r\n // window.zoomToRect(this.commentLayer.commentRois[idx].bounds);\r\n this.selectedCommentIdx = idx;\r\n window.forceSidebarUpdate();\r\n }\r\n\r\n computePolygonArea(points) {\r\n let X = [];\r\n let Y = [];\r\n let numPoints = points.length;\r\n for (let p of points) {\r\n X.push(p[0]);\r\n Y.push(p[1]);\r\n }\r\n let area = 0; // Accumulates area\r\n let j = numPoints - 1;\r\n\r\n for (let i = 0; i < numPoints; i++) {\r\n area += (X[j] + X[i]) * (Y[j] - Y[i]);\r\n j = i; //j is previous vertex to i\r\n }\r\n return area / 2;\r\n }\r\n\r\n computLengthValue(physicalLength, area) {\r\n physicalLength = Math.abs(physicalLength);\r\n let computedValue = 0;\r\n // display pixel if no unit is set\r\n if (!this.ome.physicalSizeX) {\r\n return Math.round(physicalLength) + \" px\";\r\n }\r\n let unitLength = physicalLength;\r\n\r\n // find best fitting exponennt\r\n let unitExponent = 1;\r\n let unitExponentIndex = 1;\r\n for (\r\n unitExponentIndex = 0;\r\n unitExponentIndex < scaleUnits.length;\r\n unitExponentIndex++\r\n ) {\r\n unitExponent = area\r\n ? scaleUnits[unitExponentIndex] * 2\r\n : scaleUnits[unitExponentIndex];\r\n unitLength = physicalLength / Math.pow(10, unitExponent);\r\n if (unitLength > 1) {\r\n break;\r\n }\r\n }\r\n if (area) {\r\n computedValue =\r\n Math.round(unitLength * 100) / 100 +\r\n \" \" +\r\n scaleUnitLabels[unitExponentIndex] +\r\n \"²\";\r\n } else {\r\n computedValue =\r\n Math.round(unitLength * 100) / 100 +\r\n \" \" +\r\n scaleUnitLabels[unitExponentIndex];\r\n }\r\n return computedValue;\r\n }\r\n\r\n pointInsideBounds(p, bounds) {\r\n return !(\r\n p.x < bounds.left ||\r\n p.x > bounds.right ||\r\n p.y < bounds.top ||\r\n p.y > bounds.bottom\r\n );\r\n }\r\n\r\n addPoint = (event, p) => {\r\n let eventPoint = { x: event.clientX, y: event.clientY };\r\n if (this.points.length < 3) {\r\n this.points.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n } else {\r\n const dist = distance(this.lastEventPoint, eventPoint);\r\n if (dist < 10) {\r\n this.points[this.points.length - 1] = [p.x, p.y];\r\n } else {\r\n this.points.push([p.x, p.y]);\r\n this.lastEventPoint = eventPoint;\r\n }\r\n }\r\n };\r\n\r\n mouse(params) {\r\n let { event, p } = params;\r\n let mouseP = p;\r\n if (\r\n this.mouseActionState !== \"draw\" &&\r\n this.commentLayer[\"commentRois\"].length > 0 &&\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx]\r\n ) {\r\n let selectedCommentRoi =\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx];\r\n if (this.mouseActionState === \"free\") {\r\n let minArea = Number.MAX_SAFE_INTEGER;\r\n for (let i = 0; i < this.commentLayer.commentRois.length; i++) {\r\n if (this.commentLayer.commentRois[i].containsPoint(mouseP)) {\r\n let commentRoiArea =\r\n this.commentLayer.commentRois[i].width *\r\n this.commentLayer.commentRois[i].height;\r\n if (commentRoiArea < minArea) {\r\n this.selectedCommentIdx = i;\r\n minArea = commentRoiArea;\r\n }\r\n }\r\n }\r\n } else {\r\n if (event.type === \"mouseup\" || event.type === \"mouseleave\") {\r\n this.mouseActionState = \"free\";\r\n } else if (event.type === \"mousemove\") {\r\n if (this.mouseActionState === \"move\") {\r\n let deltaX = mouseP.x - this.lastP.x;\r\n let deltaY = mouseP.y - this.lastP.y;\r\n let selectedCommentRoi =\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx];\r\n let regions = [];\r\n for (let region of selectedCommentRoi.regions) {\r\n regions.push([region[0] + deltaX, region[1] + deltaY]);\r\n }\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx].regions =\r\n regions;\r\n this.commentLayer[\"commentRois\"][\r\n this.selectedCommentIdx\r\n ].updateBounds();\r\n this.lastP = mouseP;\r\n } else if (this.mouseActionState === \"resize\") {\r\n let deltaX = mouseP.x - this.lastP.x;\r\n let deltaY = mouseP.y - this.lastP.y;\r\n if (\r\n selectedCommentRoi.type === \"rectangle\" ||\r\n selectedCommentRoi.type === \"region\" ||\r\n selectedCommentRoi.type === \"commentBox\"\r\n ) {\r\n let deltaXProc =\r\n (selectedCommentRoi.width + deltaX) / selectedCommentRoi.width;\r\n let deltaYProc =\r\n (selectedCommentRoi.height + deltaY) /\r\n selectedCommentRoi.height;\r\n let regions = [];\r\n for (let region of selectedCommentRoi.regions) {\r\n let x = selectedCommentRoi.bounds.left;\r\n let y = selectedCommentRoi.bounds.top;\r\n let w = region[0] - x;\r\n let h = region[1] - y;\r\n regions.push([x + w * deltaXProc, y + h * deltaYProc]);\r\n }\r\n this.commentLayer[\"commentRois\"][\r\n this.selectedCommentIdx\r\n ].regions = regions;\r\n this.commentLayer[\"commentRois\"][\r\n this.selectedCommentIdx\r\n ].updateBounds();\r\n let length = this.computePolygonArea(selectedCommentRoi.regions);\r\n let unitLength =\r\n length * this.ome.physicalSizeX * this.ome.physicalSizeY;\r\n if (!this.ome.physicalSizeX) {\r\n unitLength = length;\r\n }\r\n let computedValue = this.computLengthValue(unitLength, true);\r\n this.commentLayer[\"commentRois\"][\r\n this.selectedCommentIdx\r\n ].computedValue = computedValue;\r\n if (\r\n this.commentLayer[\"commentRois\"][\r\n this.selectedCommentIdx\r\n ].commentValue.endsWith(\"m²\")\r\n ) {\r\n this.commentLayer[\"commentRois\"][\r\n this.selectedCommentIdx\r\n ].commentValue = computedValue;\r\n }\r\n } else if (\r\n selectedCommentRoi.type === \"distance\" ||\r\n selectedCommentRoi.type === \"arrow\"\r\n ) {\r\n let regions = selectedCommentRoi.regions;\r\n let p1 = {\r\n x: regions[0][0],\r\n y: regions[0][1],\r\n };\r\n let p2 = {\r\n x: regions[1][0],\r\n y: regions[1][1],\r\n };\r\n\r\n if (selectedCommentRoi.type === \"arrow\") {\r\n p2.x = regions[3][0];\r\n p2.y = regions[3][1];\r\n }\r\n\r\n //to do: smaller distance p1, p1 to mouseP, then new distance roi\r\n if (this.distance(mouseP, p1) < this.distance(mouseP, p2)) {\r\n p1.x += deltaX;\r\n p1.y += deltaY;\r\n } else {\r\n p2.x += deltaX;\r\n p2.y += deltaY;\r\n }\r\n if (selectedCommentRoi.type === \"arrow\") {\r\n regions = this.generateArrowPoints(p1, p2);\r\n } else {\r\n regions = this.generateDistancePoints(p1, p2);\r\n }\r\n\r\n let length = this.distance(p1, p2);\r\n let computedValue = this.computLengthValue(\r\n this.ome.physicalSizeX * length,\r\n false\r\n );\r\n if (!this.ome.physicalSizeX) {\r\n computedValue = this.computLengthValue(length, false);\r\n }\r\n let commentValue = selectedCommentRoi.commentValue;\r\n if (commentValue.endsWith(\"m\")) {\r\n commentValue = computedValue;\r\n }\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx] =\r\n new CommentROI(\r\n regions,\r\n selectedCommentRoi.color,\r\n selectedCommentRoi.type,\r\n commentValue,\r\n computedValue\r\n );\r\n }\r\n\r\n this.lastP = mouseP;\r\n }\r\n }\r\n }\r\n if (event.type === \"mousedown\" && event.button === 0) {\r\n if (\r\n this.gripData !== null &&\r\n this.pointInsideBounds(mouseP, this.gripData.b)\r\n ) {\r\n this.mouseActionState = \"resize\";\r\n } else if (selectedCommentRoi.containsPoint(mouseP)) {\r\n this.mouseActionState = \"move\";\r\n } else {\r\n this.mouseActionState = \"draw\";\r\n }\r\n this.lastP = mouseP;\r\n }\r\n }\r\n let computedValue = \"\";\r\n let commentValue = this.commentState.commentValue;\r\n if (event.button !== 0) return;\r\n if (event.type === \"mousedown\") {\r\n if (\r\n this.commentLayer[\"commentRois\"].length > 0 &&\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx]\r\n ) {\r\n let selectedCommentRoi =\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx];\r\n if (\r\n this.gripData !== null &&\r\n this.pointInsideBounds(mouseP, this.gripData.b)\r\n ) {\r\n this.mouseActionState = \"resize\";\r\n this.lastP = mouseP;\r\n return;\r\n } else if (selectedCommentRoi.containsPoint(mouseP)) {\r\n this.mouseActionState = \"move\";\r\n this.lastP = mouseP;\r\n return;\r\n }\r\n } else {\r\n this.mouseActionState = \"draw\";\r\n }\r\n // update position history\r\n this.startPoint = mouseP;\r\n this.points = [];\r\n this.addPoint(event, mouseP);\r\n if (this.commentLayer.commentRois) {\r\n this.commentLayer.commentRois.push(\r\n new CommentROI(\r\n this.points,\r\n this.commentState.color,\r\n this.commentState.selectedTool,\r\n this.commentState.commentValue,\r\n computedValue\r\n )\r\n );\r\n this.selectedCommentIdx = this.commentLayer[\"commentRois\"].length - 1;\r\n window.forceSidebarUpdate();\r\n } else {\r\n this.commentLayer[\"commentRois\"] = [\r\n new CommentROI(\r\n this.points,\r\n this.commentState.color,\r\n this.commentState.selectedTool,\r\n this.commentState.commentValue,\r\n computedValue\r\n ),\r\n ];\r\n }\r\n\r\n // set drawing flag\r\n this.mouseActionState = \"draw\";\r\n } else if (event.type === \"mouseup\") {\r\n let lastRoi =\r\n this.commentLayer.commentRois[this.commentLayer.commentRois.length - 1];\r\n if (!lastRoi) {\r\n console.log(\"LAST ROI WAS EMPTY\");\r\n } else if (\r\n lastRoi.regions.length < 4 ||\r\n lastRoi.width === 0 ||\r\n lastRoi.height === 0\r\n ) {\r\n console.log(\"last roi :\", lastRoi);\r\n window.showWarningSnackbar(\"Comment could not be created!\");\r\n this.commentLayer.commentRois.pop();\r\n window.forceSidebarUpdate();\r\n }\r\n // release drawing flag\r\n this.mouseActionState = \"free\";\r\n } else if (event.type === \"mousemove\") {\r\n if (this.mouseActionState === \"draw\") {\r\n if (\r\n this.commentState.selectedTool === \"rectangle\" ||\r\n this.commentState.selectedTool === \"commentBox\"\r\n ) {\r\n this.points = [\r\n [this.startPoint.x, this.startPoint.y],\r\n [mouseP.x, this.startPoint.y],\r\n [mouseP.x, mouseP.y],\r\n [this.startPoint.x, mouseP.y],\r\n ];\r\n let width =\r\n Math.abs(this.startPoint.x - mouseP.x) * this.ome.physicalSizeX;\r\n let height =\r\n Math.abs(this.startPoint.y - mouseP.y) * this.ome.physicalSizeY;\r\n if (!this.ome.physicalSizeX) {\r\n width = Math.abs(this.startPoint.x - mouseP.x);\r\n height = Math.abs(this.startPoint.y - mouseP.y);\r\n }\r\n let unitLength = width * height;\r\n computedValue = this.computLengthValue(unitLength, true);\r\n if (\r\n this.commentState.commentValue === \"\" &&\r\n this.commentState.selectedTool !== \"commentBox\"\r\n )\r\n commentValue = computedValue;\r\n } else if (this.commentState.selectedTool === \"region\") {\r\n this.addPoint(event, mouseP);\r\n let length = this.computePolygonArea(this.points);\r\n let unitLength =\r\n length * this.ome.physicalSizeX * this.ome.physicalSizeY;\r\n if (!this.ome.physicalSizeX) {\r\n unitLength = length;\r\n }\r\n computedValue = this.computLengthValue(unitLength, true);\r\n if (\r\n this.commentState.commentValue === \"\" &&\r\n this.commentState.selectedTool !== \"commentBox\"\r\n )\r\n commentValue = computedValue;\r\n } else if (this.commentState.selectedTool === \"arrow\") {\r\n let vector = {\r\n x: this.startPoint.x - mouseP.x,\r\n y: this.startPoint.y - mouseP.y,\r\n };\r\n let length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);\r\n this.points = this.generateArrowPoints(this.startPoint, mouseP);\r\n\r\n if (!this.ome.physicalSizeX) {\r\n computedValue = this.computLengthValue(length, false);\r\n } else {\r\n computedValue = this.computLengthValue(\r\n this.ome.physicalSizeX * length,\r\n false\r\n );\r\n }\r\n } else if (this.commentState.selectedTool === \"distance\") {\r\n let vector = {\r\n x: this.startPoint.x - mouseP.x,\r\n y: this.startPoint.y - mouseP.y,\r\n };\r\n let length = Math.sqrt(vector.x * vector.x + vector.y * vector.y);\r\n this.points = this.generateDistancePoints(this.startPoint, mouseP);\r\n\r\n if (!this.ome.physicalSizeX) {\r\n computedValue = this.computLengthValue(length, false);\r\n } else {\r\n computedValue = this.computLengthValue(\r\n this.ome.physicalSizeX * length,\r\n false\r\n );\r\n }\r\n if (\r\n this.commentState.commentValue === \"\" &&\r\n this.commentState.selectedTool !== \"commentBox\"\r\n )\r\n commentValue = computedValue;\r\n } else {\r\n return;\r\n }\r\n\r\n this.commentLayer[\"commentRois\"][\r\n this.commentLayer[\"commentRois\"].length - 1\r\n ] = new CommentROI(\r\n this.points,\r\n this.commentState.color,\r\n this.commentState.selectedTool,\r\n commentValue,\r\n computedValue\r\n );\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n drawCustomCursor(ctx, mousePosition, fct, canvas) {\r\n if (\r\n this.mouseActionState === \"free\" &&\r\n this.commentLayer[\"commentRois\"].length > 0 &&\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx]\r\n ) {\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n let selectedCommentRoi =\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx];\r\n\r\n let pointInsideSelection =\r\n selectedCommentRoi.containsPoint(mousePosition);\r\n\r\n ctx.strokeStyle = pointInsideSelection ? \"red\" : this.selectionColor;\r\n let b = selectedCommentRoi.bounds;\r\n // no custom cursor\r\n ctx.rect(b.left, b.top, b.right - b.left, b.bottom - b.top);\r\n ctx.stroke();\r\n ctx.closePath();\r\n\r\n let cursor = pointInsideSelection ? \"move\" : \"default\";\r\n let gripPoints = [];\r\n if (\r\n selectedCommentRoi.type === \"rectangle\" ||\r\n selectedCommentRoi.type === \"region\" ||\r\n selectedCommentRoi.type === \"commentBox\"\r\n ) {\r\n gripPoints = [\r\n {\r\n x: b.right,\r\n y: b.bottom,\r\n },\r\n ];\r\n } else if (selectedCommentRoi.type === \"distance\") {\r\n gripPoints = [\r\n {\r\n x: selectedCommentRoi.regions[0][0],\r\n y: selectedCommentRoi.regions[0][1],\r\n },\r\n {\r\n x: selectedCommentRoi.regions[1][0],\r\n y: selectedCommentRoi.regions[1][1],\r\n },\r\n ];\r\n } else if (selectedCommentRoi.type === \"arrow\") {\r\n gripPoints = [\r\n {\r\n x: selectedCommentRoi.regions[0][0],\r\n y: selectedCommentRoi.regions[0][1],\r\n },\r\n {\r\n x: selectedCommentRoi.regions[3][0],\r\n y: selectedCommentRoi.regions[3][1],\r\n },\r\n ];\r\n }\r\n for (let gripPoint of gripPoints) {\r\n let gripSize = 14 / fct;\r\n let gripSizeInner = 10 / fct;\r\n this.gripData = {\r\n p: {\r\n x: gripPoint.x,\r\n y: gripPoint.y,\r\n },\r\n b: {\r\n left: gripPoint.x - gripSize / 2,\r\n right: gripPoint.x + gripSize / 2,\r\n top: gripPoint.y - gripSize / 2,\r\n bottom: gripPoint.y + gripSize / 2,\r\n },\r\n bInner: {\r\n left: gripPoint.x - gripSizeInner / 2,\r\n right: gripPoint.x + gripSizeInner / 2,\r\n top: gripPoint.y - gripSizeInner / 2,\r\n bottom: gripPoint.y + gripSizeInner / 2,\r\n },\r\n };\r\n\r\n ctx.fillStyle = \"black\";\r\n ctx.fillRect(\r\n this.gripData.b.left,\r\n this.gripData.b.top,\r\n gripSize,\r\n gripSize\r\n );\r\n ctx.fillStyle = \"white\";\r\n ctx.fillRect(\r\n this.gripData.bInner.left,\r\n this.gripData.bInner.top,\r\n gripSizeInner,\r\n gripSizeInner\r\n );\r\n\r\n if (this.pointInsideBounds(mousePosition, this.gripData.b)) {\r\n if (\r\n selectedCommentRoi.type === \"arrow\" ||\r\n selectedCommentRoi.type === \"distance\"\r\n ) {\r\n cursor = \"pointer\";\r\n } else {\r\n cursor = \"nw-resize\";\r\n }\r\n break;\r\n }\r\n }\r\n\r\n canvas.style.cursor = cursor;\r\n }\r\n }\r\n\r\n updateCommentRoi = () => {\r\n let computedValue = 0;\r\n if (this.commentLayer[\"commentRois\"].length > 0) {\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx] =\r\n new CommentROI(\r\n this.commentLayer[\"commentRois\"][this.selectedCommentIdx].regions,\r\n this.commentState.color,\r\n this.commentState.selectedTool,\r\n this.commentState.commentValue,\r\n computedValue\r\n );\r\n }\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration = () => {\r\n return (\r\n
\r\n {this.name}:\r\n {\r\n this.changeSelectedCommentIdx(idx);\r\n }}\r\n commentRois={this.commentLayer[\"commentRois\"]}\r\n commentState={this.commentState}\r\n changeCommentState={(commentState) => {\r\n this.commentState = commentState;\r\n window.forceSidebarUpdate();\r\n }}\r\n updateCommentRoi={() => {\r\n this.updateCommentRoi(this.commentState);\r\n }}\r\n deleteCommentRoi={(idx) => {\r\n this.deleteCommentRoi(idx);\r\n }}\r\n changeSelectedColor={(idx, color) => {\r\n this.changeSelectedColor(idx, color);\r\n }}\r\n changeSelectedCommentValue={(idx, commentValue) => {\r\n this.changeSelectedCommentValue(idx, commentValue);\r\n }}\r\n changeRoiFontSize={(idx) => {\r\n this.changeRoiFontSize(idx);\r\n }}\r\n />\r\n
\r\n );\r\n };\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n changeCommentType = (type) => {\r\n let commentState = this.props.commentState;\r\n commentState[\"selectedTool\"] = type;\r\n commentState[\"commentValue\"] = \"\";\r\n this.props.changeCommentState(commentState);\r\n };\r\n render() {\r\n const { commentValue, color, selectedTool } = this.props.commentState;\r\n return (\r\n
\r\n
\r\n
\r\n {\r\n let commentState = this.props.commentState;\r\n commentState[\"commentValue\"] = e.target.value;\r\n this.props.changeCommentState(commentState);\r\n }}\r\n />\r\n {\r\n let commentState = this.props.commentState;\r\n commentState[\"color\"] = color;\r\n this.props.changeCommentState(commentState);\r\n }}\r\n />\r\n
\r\n
\r\n
\r\n {\r\n this.changeCommentType(\"rectangle\");\r\n }}\r\n color={selectedTool === \"rectangle\" ? \"primary\" : \"default\"}\r\n startIcon={}\r\n >\r\n Rectangle\r\n \r\n {\r\n this.changeCommentType(\"arrow\");\r\n }}\r\n color={selectedTool === \"arrow\" ? \"primary\" : \"default\"}\r\n startIcon={}\r\n >\r\n Arrow\r\n \r\n
\r\n
\r\n {\r\n this.changeCommentType(\"region\");\r\n }}\r\n color={selectedTool === \"region\" ? \"primary\" : \"default\"}\r\n startIcon={}\r\n >\r\n Region\r\n \r\n {\r\n this.changeCommentType(\"distance\");\r\n }}\r\n color={selectedTool === \"distance\" ? \"primary\" : \"default\"}\r\n startIcon={}\r\n >\r\n Distance\r\n \r\n
\r\n
\r\n {\r\n this.changeCommentType(\"commentBox\");\r\n }}\r\n color={selectedTool === \"commentBox\" ? \"primary\" : \"default\"}\r\n startIcon={}\r\n >\r\n COMMENT\r\n \r\n
\r\n
\r\n \r\n \r\n {this.props.commentRois\r\n .map((commentRoi, i) => {\r\n return (\r\n this.props.changeSelectedCommentIdx(i)}\r\n >\r\n \r\n \r\n {commentRoi.type === \"rectangle\" && }\r\n {commentRoi.type === \"arrow\" && (\r\n \r\n )}\r\n {commentRoi.type === \"region\" && (\r\n \r\n )}\r\n {commentRoi.type === \"distance\" && (\r\n \r\n )}\r\n {commentRoi.type === \"commentBox\" && }\r\n \r\n \r\n 0 &&\r\n commentRoi.type !== \"commentBox\"\r\n ? \"Comment, Size: \" + commentRoi.computedValue\r\n : \"Comment\"\r\n : \"Comment\"\r\n }\r\n style={{ marginRight: \"36px\" }}\r\n fullWidth\r\n multiline\r\n margin=\"normal\"\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n value={commentRoi.commentValue}\r\n onChange={(e) => {\r\n this.props.changeSelectedCommentValue(\r\n i,\r\n e.target.value\r\n );\r\n }}\r\n />\r\n
\r\n {commentRoi.type !== \"commentBox\" && (\r\n {\r\n this.props.changeSelectedColor(i, color);\r\n }}\r\n />\r\n )}\r\n
\r\n \r\n \r\n {\r\n this.props.changeRoiFontSize(i);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n this.props.deleteCommentRoi(i)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n );\r\n })\r\n .reverse()}\r\n
\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nConfigForm.propTypes = {\r\n commentState: PropTypes.object,\r\n changeCommentState: PropTypes.func,\r\n commentRois: PropTypes.array,\r\n selectedCommentIdx: PropTypes.number,\r\n changeSelectedCommentIdx: PropTypes.func,\r\n changeSelectedCommentValue: PropTypes.func,\r\n changeSelectedColor: PropTypes.func,\r\n changeRoiFontSize: PropTypes.func,\r\n deleteCommentRoi: PropTypes.func,\r\n};\r\n\r\nexport default CommentTool;\r\n","import {\r\n updateDrawLayer,\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n findClickedRoi,\r\n checkIfStructureHidden,\r\n} from \"../../utils/PolygonUtil\";\r\n\r\nimport { Typography } from \"@mui/material\";\r\nimport { pointsToCirclePolygon } from \"../../utils/PolygonUtil\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\n\r\nclass EllipseTool extends Tool {\r\n name = \"Ellipse\";\r\n noConfig = false;\r\n flag = false;\r\n downScale = 2;\r\n points = [];\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.tempRemoveOverlapSame = this.removeOverlapSame;\r\n this.removeOverlap = false;\r\n this.removeOverlapSame = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n this.removeOverlapSame = this.tempRemoveOverlapSame;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n mouse(params) {\r\n let { event, p, color, subtype, name, positionInRoiLayer, fullyLoaded } =\r\n params;\r\n if (\r\n event.type === \"mousedown\" &&\r\n (event.button === 0 || event.button === 2)\r\n ) {\r\n checkIfStructureHidden(\r\n this.structures,\r\n this.selectedLayer,\r\n subtype,\r\n name,\r\n color\r\n );\r\n this.drawLayer.regionRois = [];\r\n this.drawLayer.inverted = false;\r\n // right mouse button -> clear\r\n this.clear = event.button === 2;\r\n this.drawLayer.clear = this.clear;\r\n\r\n // update position history\r\n this.startPoint = p;\r\n\r\n // set drawing flag\r\n this.flag = true;\r\n\r\n // check if mouse down is inside region? => exapand region\r\n if (this.removeOverlapSame) {\r\n this.clickedOnRoi = findClickedRoi(\r\n p,\r\n this.selectedLayer,\r\n this.structures,\r\n this.roiLayers,\r\n this.includeBaseROI\r\n );\r\n }\r\n } else if (\r\n event.type === \"mouseup\" ||\r\n (this.flag && event.type === \"mouseleave\")\r\n ) {\r\n // release drawing flag\r\n this.flag = false;\r\n let drawRegion = {\r\n regions: [],\r\n inverted: false,\r\n };\r\n if (this.drawLayer.regionRois.length > 0) {\r\n drawRegion.regions = [this.drawLayer.regionRois[0]];\r\n\r\n // soll der selected layer sein\r\n let overlapRoiLayers = [];\r\n if (this.removeOverlapSame) {\r\n overlapRoiLayers.push(this.roiLayers[this.selectedLayer]);\r\n }\r\n if (this.removeOverlap) {\r\n let siblingRoiLayers = findSiblingRoiLayers(\r\n this.structures,\r\n this.selectedLayer,\r\n this.roiLayers\r\n );\r\n siblingRoiLayers.map((layer) => overlapRoiLayers.push(layer));\r\n }\r\n\r\n updateLayer(\r\n this.layer,\r\n drawRegion,\r\n this.clear,\r\n color,\r\n subtype,\r\n name,\r\n this.roiLayers[this.selectedLayer].tree,\r\n positionInRoiLayer,\r\n fullyLoaded,\r\n false,\r\n this.roiLayers[this.parentLayer],\r\n this.structures[this.originalSelectedLayer].id,\r\n overlapRoiLayers,\r\n this.clickedOnRoi\r\n );\r\n this.drawLayer.regionRois = [];\r\n }\r\n } else if (event.type === \"mousemove\") {\r\n if (this.flag) {\r\n //draw Circle\r\n let drawRegion = pointsToCirclePolygon(\r\n this.startPoint,\r\n p,\r\n 32,\r\n this.ome.sizeX,\r\n this.ome.sizeY\r\n );\r\n\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\r\n updateDrawLayer(\r\n this.drawLayer,\r\n drawRegion,\r\n false,\r\n color,\r\n subtype,\r\n name\r\n );\r\n }\r\n }\r\n }\r\n\r\n drawCustomCursor() {\r\n // no custom cursor\r\n }\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
\r\n {this.name}:\r\n (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default EllipseTool;\r\n","import { findClickedRoi, pointInsideRegion } from \"../../utils/PolygonUtil\";\r\nimport { RegionROI } from \"../../utils/ROI\";\r\nimport Tool from \"./Tool\";\r\n\r\nclass FillTool extends Tool {\r\n name = \"Fill\";\r\n noConfig = true;\r\n includeBaseROI = false;\r\n\r\n setLayer(obj) {\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n }\r\n\r\n setPreviewRect() {}\r\n\r\n fillHole(p) {\r\n let historyItem = [];\r\n let histId = this.structures[this.selectedLayer].id;\r\n\r\n let tree = this.roiLayers[this.selectedLayer].tree;\r\n let layer = this.roiLayers[this.selectedLayer].layer;\r\n\r\n let regionRois = tree\r\n .search({\r\n minX: p.x,\r\n minY: p.y,\r\n maxX: p.x,\r\n maxY: p.y,\r\n })\r\n .sort((a, b) => a.roi.area - b.roi.area); //sorted rois, that are intersecting with clicked point\r\n\r\n for (let idx = 0; idx < regionRois.length; idx++) {\r\n let mainRoi = regionRois[idx].roi;\r\n if (mainRoi.regions.length > 1) {\r\n let mainRoiCopy = new RegionROI(mainRoi);\r\n mainRoiCopy.regions = [...mainRoi.regions];\r\n historyItem.push({ add: false, id: histId, roi: mainRoi.copy() });\r\n\r\n // if has holes\r\n for (let i = 1; i < mainRoi.regions.length; i++) {\r\n let hole = mainRoi.regions[i];\r\n let tempHoleRoi = new RegionROI({ regions: [hole] });\r\n if (pointInsideRegion(p, hole)) {\r\n //roi has clicked hole\r\n mainRoi.regions.splice(i, 1); //delete hole of affected polygon\r\n mainRoi.intRegions = undefined;\r\n let overlappingRegionRoiTreeItems = tree\r\n .search(tempHoleRoi.treeItem)\r\n .filter((treeItem) => {\r\n let p = {\r\n x: treeItem.roi.regions[0][0][0],\r\n y: treeItem.roi.regions[0][0][1],\r\n };\r\n return pointInsideRegion(p, hole);\r\n });\r\n let possibleRoiCandidates = [];\r\n if (overlappingRegionRoiTreeItems.length > 0) {\r\n for (let overlapTreeItem of overlappingRegionRoiTreeItems) {\r\n let oRoi = overlapTreeItem.roi;\r\n if (oRoi.uuid === mainRoi.uuid || oRoi.area > tempHoleRoi.area)\r\n continue;\r\n\r\n possibleRoiCandidates.push(oRoi);\r\n }\r\n }\r\n\r\n let finalPossibleRoiCandidates = [...possibleRoiCandidates];\r\n\r\n let roisToExclude = [];\r\n\r\n //todo: handle holes\r\n for (let possibleOverlapRoi of possibleRoiCandidates) {\r\n let excludedOverlapRoi = null;\r\n let p = {\r\n x: possibleOverlapRoi.regions[0][0][0],\r\n y: possibleOverlapRoi.regions[0][0][1],\r\n };\r\n for (let fRoi of finalPossibleRoiCandidates) {\r\n if (\r\n fRoi.regions.length > 1 &&\r\n possibleOverlapRoi.area < fRoi.area &&\r\n pointInsideRegion(p, fRoi.regions[0])\r\n ) {\r\n excludedOverlapRoi = possibleOverlapRoi;\r\n break;\r\n }\r\n }\r\n if (excludedOverlapRoi !== null) {\r\n roisToExclude.push(excludedOverlapRoi);\r\n finalPossibleRoiCandidates.filter(\r\n (item) => item.uuid !== excludedOverlapRoi.uuid\r\n );\r\n }\r\n }\r\n finalPossibleRoiCandidates = finalPossibleRoiCandidates.filter(\r\n (item) => {\r\n let index = roisToExclude.findIndex(\r\n (r) => r.uuid === item.uuid\r\n );\r\n return index < 0;\r\n }\r\n );\r\n\r\n for (let fRoi of finalPossibleRoiCandidates) {\r\n if (fRoi.regions.length > 1) {\r\n for (let h = 1; h < fRoi.regions.length; h++) {\r\n mainRoi.regions.push(fRoi.regions[h]);\r\n }\r\n mainRoi.intRegions = undefined;\r\n }\r\n tree.remove(fRoi.treeItem);\r\n historyItem.push({ add: false, id: histId, roi: fRoi.copy() });\r\n }\r\n break;\r\n }\r\n }\r\n historyItem.push({ add: true, id: histId, roi: mainRoi });\r\n if (layer.regionRois.length !== tree.all().length) {\r\n layer.regionRois = tree.all().map((treeItem) => treeItem.roi);\r\n }\r\n window.projectHistory.add(historyItem);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n mouse(params) {\r\n let { event, p } = params;\r\n // mouse middle button\r\n if (event.button === 1) {\r\n return;\r\n }\r\n\r\n if (event.type === \"mousedown\" && event.button === 0) {\r\n let clickedOnRoi = findClickedRoi(\r\n p,\r\n this.selectedLayer,\r\n this.structures,\r\n this.roiLayers,\r\n this.includeBaseROI\r\n );\r\n if (!clickedOnRoi) {\r\n //only try finding hole, if not clicked on roi\r\n this.fillHole(p);\r\n }\r\n }\r\n }\r\n\r\n drawCustomCursor() {}\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return null;\r\n }\r\n}\r\n\r\nexport default FillTool;\r\n","import React, { Component } from \"react\";\r\n\r\nimport { FormLabel, FormControl, Button, Typography } from \"@mui/material\";\r\nimport Tool from \"./Tool\";\r\n\r\nclass ActiveLearningTool extends Tool {\r\n name = \"Active Learning\";\r\n\r\n setLayer(obj) {\r\n this.id = obj.fileId;\r\n this.layer = obj.layer;\r\n this.ome = obj.ome;\r\n this.projectId = obj.projectId;\r\n this.roiLayers = obj.roiLayers;\r\n this.structures = obj.structures;\r\n this.selectedLayer = obj.selectedLayer;\r\n\r\n if (obj.structures[obj.selectedLayer]) {\r\n this.toolLayerConfig = obj.structures[obj.selectedLayer].tools.find(\r\n (c) => c.name === this.toolConfig.name\r\n );\r\n }\r\n\r\n if (typeof this.toolLayerConfig !== \"undefined\")\r\n Object.assign(this.state, this.toolLayerConfig.parameters);\r\n }\r\n setPreviewRect() {}\r\n\r\n exit() {}\r\n\r\n renderConfiguration() {\r\n return (\r\n
\r\n {this.name}:\r\n {\r\n return this.state.preview\r\n ? this.calcPreview(component)\r\n : this.calcFull(component);\r\n }}\r\n />\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n render() {\r\n return (\r\n
\r\n \r\n \r\n onApply(this)}*/\r\n >\r\n Start\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default ActiveLearningTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n Grid,\r\n Button,\r\n FormControl,\r\n TextField,\r\n FormHelperText,\r\n Select,\r\n InputLabel,\r\n MenuItem,\r\n Checkbox,\r\n FormControlLabel,\r\n Slider,\r\n Tooltip,\r\n LinearProgress,\r\n Typography,\r\n IconButton,\r\n} from \"@mui/material\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport Backend from \"../../../common/utils/Backend\";\r\nimport { withSpinloader } from \"../../../common/components/Spinloader\";\r\nimport { RegionROI, createRoisFromAnno } from \"../../utils/ROI\";\r\nimport MuiAccordion from \"@mui/material/Accordion\";\r\nimport MuiAccordionSummary from \"@mui/material/AccordionSummary\";\r\nimport MuiAccordionDetails from \"@mui/material/AccordionDetails\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport {\r\n generateParentList,\r\n getParentIndexLayer,\r\n} from \"../../utils/StructuresUtils\";\r\nimport SettingsBackupRestoreIcon from \"@mui/icons-material/SettingsBackupRestore\";\r\n\r\nimport Tool from \"./Tool\";\r\n\r\nconst Accordion = withStyles({\r\n root: {\r\n border: \"1px solid rgba(0, 0, 0, .125)\",\r\n boxShadow: \"none\",\r\n \"&:not(:last-child)\": {\r\n borderBottom: 0,\r\n },\r\n \"&:before\": {\r\n display: \"none\",\r\n },\r\n \"&$expanded\": {\r\n margin: \"auto\",\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordion);\r\n\r\nconst AccordionSummary = withStyles({\r\n root: {\r\n backgroundColor: \"rgba(0, 0, 0, .03)\",\r\n borderBottom: \"1px solid rgba(0, 0, 0, .125)\",\r\n marginBottom: -1,\r\n minHeight: 56,\r\n \"&$expanded\": {\r\n minHeight: 56,\r\n },\r\n },\r\n content: {\r\n \"&$expanded\": {\r\n margin: \"12px 0\",\r\n },\r\n },\r\n expanded: {},\r\n})(MuiAccordionSummary);\r\n\r\nconst AccordionDetails = withStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2),\r\n },\r\n}))(MuiAccordionDetails);\r\n\r\n/**\r\n * Counts number of decimals of a number\r\n * @param {Number} x\r\n */\r\nfunction countDecimals(x) {\r\n if (Math.floor(x.valueOf()) === x.valueOf()) return 0;\r\n return x.toString().split(\".\")[1].length || 0;\r\n}\r\n\r\nconst styles = {\r\n input: {\r\n width: 55,\r\n },\r\n};\r\n\r\nclass InstantAnalysisTool extends Tool {\r\n constructor(toolConfig, viewer) {\r\n super();\r\n this.toolConfig = toolConfig;\r\n this.name = toolConfig.tooltip;\r\n this.state = {\r\n preview: toolConfig.preview,\r\n prevW: 512,\r\n prevH: 512,\r\n showDownloadProgress: false,\r\n modelDownloadProgress: false,\r\n };\r\n this.viewer = viewer;\r\n }\r\n\r\n /**\r\n * Update File Specific information\r\n * @param {Object} layer\r\n * @param {Object} ome\r\n * @param {String} fileId\r\n * @param {String} projectId\r\n * @param {Object[]} roiLayers\r\n */\r\n setLayer(obj) {\r\n this.id = obj.fileId;\r\n this.layer = obj.layer;\r\n this.ome = obj.ome;\r\n this.pixelLengthX = obj.ome.physicalSizeX * Math.pow(10, 6); //pixel x length in µm\r\n this.pixelLengthY = obj.ome.physicalSizeY * Math.pow(10, 6);\r\n this.pixelArea = this.pixelLengthX * this.pixelLengthY; //pixel area in µm\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.projectId = obj.projectId;\r\n this.roiLayers = obj.roiLayers;\r\n this.structures = obj.structures;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.updateProject = obj.updateProject;\r\n this.updateFileClasses = obj.updateFileClasses;\r\n this.ctx = obj.ctx;\r\n this.histogramConfig = obj.histogramConfig;\r\n\r\n if (obj.structures[obj.selectedLayer]) {\r\n this.toolLayerConfig = obj.structures[obj.selectedLayer].tools.find(\r\n (c) => c.name === this.toolConfig.name\r\n );\r\n }\r\n\r\n if (typeof this.toolLayerConfig !== \"undefined\") {\r\n Object.assign(this.state, this.toolLayerConfig.parameters);\r\n }\r\n }\r\n\r\n /**\r\n * Update Preview Area (e.g. on move)\r\n * @param {Number} x\r\n * @param {Number} y\r\n * @param {Number} w\r\n * @param {Number} h\r\n */\r\n setPreviewRect(x, y) {\r\n this.previewRect = {\r\n x: x - this.state.prevW / 2,\r\n y: y - this.state.prevH / 2,\r\n w: this.state.prevW,\r\n h: this.state.prevH,\r\n };\r\n }\r\n\r\n setPreviewSize(w, h) {\r\n let newState = {\r\n prevW: w,\r\n prevH: h,\r\n };\r\n Object.assign(this.state, newState);\r\n }\r\n\r\n updateTrainingProgress = (line) => {\r\n if (line.includes(\"Downloading model from:\")) {\r\n this.state.modelDownloadProgress = 0;\r\n this.state.showDownloadProgress = true;\r\n } else if (line.includes(\"[DownloadProgress]\")) {\r\n // Extract progress number\r\n this.state.modelDownloadProgress = line\r\n .split(\"[DownloadProgress]\")[1]\r\n .split(\"%\")[0];\r\n } else if (line.includes(\"Download complete\")) {\r\n this.state.showDownloadProgress = false;\r\n }\r\n };\r\n\r\n mouse() {}\r\n\r\n /**\r\n * Calculates the parent structure, grandparent if selection is subtype\r\n * @param {number} selectedLayer\r\n * @param {object} structures\r\n */\r\n findOuterParentIdx(selectedLayer, structures) {\r\n let selectedStructure = structures[selectedLayer];\r\n while (\r\n selectedStructure.classificationSubtype &&\r\n selectedStructure.parentId !== 0\r\n ) {\r\n selectedStructure = this.findParentStructure(\r\n structures,\r\n selectedStructure\r\n );\r\n }\r\n return structures.findIndex((s) => s.id === selectedStructure.parentId);\r\n }\r\n\r\n findParentStructure(structures, selectedStructure) {\r\n return structures.find((s) => s.id === selectedStructure.parentId);\r\n }\r\n\r\n /**\r\n * Calculates Instant analysis on a smaller preview area\r\n * @param {Component} component\r\n */\r\n calcPreview(component) {\r\n // add viewer values to parameter to use in tool iams\r\n component.props.state.z = this.viewer.state.z; //self.config.Parameters[\"z\"]\r\n component.props.state.t = this.viewer.state.t; //self.config.Parameters[\"t\"]\r\n component.props.state.selectedLayer = component.props.selectedLayer; //self.config.Parameters[\"selectedLayer\"]\r\n\r\n let fileClassification =\r\n this.viewer.state.viewerConfig.project.projectStringProperties[\r\n \"ViewerType\"\r\n ] == \"FilesGallery\";\r\n\r\n // Check for presence of BaseROI\r\n if (\r\n component.props.selectedLayer > 0 &&\r\n this.roiLayers[0].layer.regionRois.length === 0 &&\r\n !fileClassification\r\n ) {\r\n window.showWarningSnackbar(\"No Base ROI set!\");\r\n return;\r\n }\r\n\r\n // warning if channel is not selected and also aborting analysis\r\n if (\r\n component.props.state.toolParams &&\r\n component.props.state.channel &&\r\n component.props.state.channel < 0\r\n ) {\r\n window.showWarningSnackbar(\"No channel selected!\");\r\n return;\r\n }\r\n\r\n // Check for missing preview rectangle\r\n if (typeof this.previewRect === \"undefined\" && !fileClassification) return;\r\n\r\n // get outerParentIndex (for classification models use other function)\r\n let formDataAICockpit = this.viewer.state.formDataAICockpit;\r\n let selLayerStructureId =\r\n component.props.structures[component.props.selectedLayer].id;\r\n\r\n let modelName = null;\r\n let modelType = null;\r\n if (formDataAICockpit !== null) {\r\n modelName = formDataAICockpit[selLayerStructureId]\r\n ? formDataAICockpit[selLayerStructureId].selectedModel\r\n : null;\r\n\r\n modelType =\r\n modelName && formDataAICockpit[selLayerStructureId].models[modelName]\r\n ? formDataAICockpit[selLayerStructureId].models[modelName].modelType\r\n : null;\r\n }\r\n\r\n const outerParentidx =\r\n modelType === \"classification\"\r\n ? getParentIndexLayer(\r\n component.props.structures[component.props.selectedLayer],\r\n component.props.structures\r\n )\r\n : this.findOuterParentIdx(\r\n component.props.selectedLayer,\r\n component.props.structures\r\n );\r\n\r\n let stateObject = this.state;\r\n stateObject[\"parentIdx\"] = outerParentidx;\r\n\r\n let start = new Date().getTime();\r\n\r\n component.props.spinloader.showWithTimeout(1, 10);\r\n\r\n let layersToSave = [0];\r\n if (outerParentidx > 0) {\r\n layersToSave.push(outerParentidx);\r\n }\r\n if (this.state.depending_structure > 0) {\r\n if (!layersToSave.includes(this.state.depending_structure))\r\n layersToSave.push(this.state.depending_structure);\r\n }\r\n if (this.state.depending_channel) {\r\n layersToSave.push(this.state.depending_channel);\r\n } else {\r\n for (let parameter of this.toolConfig.parameters) {\r\n if (parameter.name === \"required_structures\") {\r\n let required_structures = parameter.ui.default;\r\n if (Array.isArray(required_structures)) {\r\n for (let required_struture of required_structures) {\r\n if (!layersToSave.includes(required_struture)) {\r\n layersToSave.push(required_struture);\r\n }\r\n }\r\n } else {\r\n layersToSave.push(parameter.ui.default);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let previewRect = {};\r\n if (!fileClassification) {\r\n previewRect = {\r\n x: Math.floor(this.previewRect.x),\r\n y: Math.floor(this.previewRect.y),\r\n w: Math.floor(this.previewRect.w),\r\n h: Math.floor(this.previewRect.h),\r\n };\r\n }\r\n\r\n // Check if the preview rectangle is inside a valid parent region.\r\n if (outerParentidx > 0 && !fileClassification) {\r\n let treeItems = this.roiLayers[outerParentidx].tree.search({\r\n minX: previewRect.x,\r\n minY: previewRect.y,\r\n maxX: previewRect.x + previewRect.w,\r\n maxY: previewRect.y + previewRect.h,\r\n });\r\n if (treeItems.length === 0) {\r\n window.showWarningSnackbar(\r\n \"No parent structures overlapping preview rectangle!\"\r\n );\r\n component.props.spinloader.hide();\r\n return;\r\n }\r\n }\r\n\r\n // In case of multilayered image, set z-Layer\r\n if (!fileClassification && this.viewer.rendererdict[this.id].state.z) {\r\n stateObject.z = this.viewer.rendererdict[this.id].state.z;\r\n }\r\n\r\n // In case of video, set time\r\n if (!fileClassification && this.viewer.rendererdict[this.id].state.t) {\r\n stateObject.t = this.viewer.rendererdict[this.id].state.t;\r\n }\r\n\r\n // Data sent to Backend request\r\n const data = {\r\n name: this.toolConfig.name,\r\n projectId: this.projectId,\r\n fileIds: [this.id],\r\n parameters: stateObject,\r\n preview: true,\r\n rect: previewRect,\r\n project: this.viewer.createProjectModel(layersToSave, previewRect),\r\n };\r\n\r\n // ALMs\r\n if (this.toolConfig.name.includes(\"alm_\")) {\r\n Backend.activeLearningSignalR(\r\n data,\r\n () => {\r\n component.props.spinloader.hide();\r\n },\r\n (error) => {\r\n component.props.spinloader.hide();\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n }\r\n\r\n // IAMS\r\n else {\r\n const selectedLayer = this.selectedLayer;\r\n\r\n // Get the layer where the annotations are saved\r\n const parentlist = generateParentList(this.structures);\r\n\r\n // Send Backend request\r\n Backend.instantAnalysisSignalR(\r\n data,\r\n component.props.spinloader,\r\n (project) => {\r\n // this.updateProject(project);\r\n // update last used tool for the structure\r\n this.structures[this.selectedLayer].selectedToolName =\r\n this.toolConfig.name;\r\n\r\n // Iterate through all annotations of the currently open file/scene\r\n for (let anno of project.files.find((c) => c.id === this.id)\r\n .annotations) {\r\n // Get index of currently selected structure/subtype\r\n // NOTE: .id in annotations is named wrong. It's supposed to be names .index >:(\r\n const layerIndex = anno.id === -1 ? selectedLayer : anno.id;\r\n\r\n // Skip Base ROI\r\n if (layerIndex === 0) {\r\n continue;\r\n }\r\n\r\n // Get id of structure, where the current annotations are saved\r\n const annotationSaveStructureId =\r\n parentlist[layerIndex][parentlist[layerIndex].length - 1].id;\r\n\r\n // Get index of said structure in all structures\r\n const annotationSaveStructureIndex = this.roiLayers.findIndex(\r\n (roiLayer) => roiLayer.id === annotationSaveStructureId\r\n );\r\n\r\n if (anno.geoJSON === null) anno.geoJSON = { coordinates: [] };\r\n let newRois = createRoisFromAnno(anno);\r\n\r\n // Find and remove all items currently present inside the preview area.\r\n if (\r\n \"x\" in previewRect &&\r\n // Check if there are any old annotations present.\r\n this.roiLayers[annotationSaveStructureIndex].tree.collides({\r\n minX: previewRect.x,\r\n minY: previewRect.y,\r\n maxX: previewRect.x + previewRect.w,\r\n maxY: previewRect.y + previewRect.h,\r\n })\r\n ) {\r\n // Then find all items in the area.\r\n let itemsToRemove = this.roiLayers[\r\n annotationSaveStructureIndex\r\n ].tree.search({\r\n minX: previewRect.x,\r\n minY: previewRect.y,\r\n maxX: previewRect.x + previewRect.w,\r\n maxY: previewRect.y + previewRect.h,\r\n });\r\n // Then remove them.\r\n for (let itemToRemove of itemsToRemove) {\r\n this.roiLayers[annotationSaveStructureIndex].tree.remove(\r\n itemToRemove\r\n );\r\n }\r\n }\r\n\r\n // Add new ROIs to selected structure\r\n for (let roi of newRois) {\r\n this.roiLayers[layerIndex].tree.insert(roi.treeItem);\r\n }\r\n\r\n // Diplay the newly generated ROIs in the layers\r\n this.roiLayers[layerIndex].layer.regionRois = this.roiLayers[\r\n layerIndex\r\n ].tree\r\n .all()\r\n .map((item) => item.roi);\r\n\r\n // Update the saved layer\r\n this.roiLayers[annotationSaveStructureIndex].layer.regionRois =\r\n this.roiLayers[annotationSaveStructureIndex].tree\r\n .all()\r\n .map((item) => item.roi);\r\n }\r\n\r\n // if classification model to classify full files --> assign classIds\r\n if (fileClassification) {\r\n this.updateFileClasses(project);\r\n }\r\n\r\n console.debug(\r\n `IAM Frontend Execution time: ${new Date().getTime() - start} ms`\r\n );\r\n component.props.spinloader.hide();\r\n },\r\n (error) => {\r\n component.props.spinloader.hide();\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Calculates Instant analysis on the full image\r\n * @param {Component} component\r\n * @param {Boolean} applyToAll apply on all images of project?\r\n */\r\n calcFull(component, applyToAll = false) {\r\n component.props.state.z = this.viewer.state.z; //self.config.Parameters[\"z\"]\r\n component.props.state.t = this.viewer.state.t; //self.config.Parameters[\"t\"]\r\n const outerParentidx = this.findOuterParentIdx(\r\n component.props.selectedLayer,\r\n component.props.structures\r\n );\r\n let stateObject = this.state;\r\n stateObject[\"parentIdx\"] = outerParentidx;\r\n let layersToSave = [0, outerParentidx];\r\n if (this.state.depending_channel) {\r\n layersToSave.push(this.state.depending_channel);\r\n }\r\n if (this.state.depending_structure) {\r\n layersToSave.push(this.state.depending_structure);\r\n }\r\n var start = new Date().getTime();\r\n component.props.spinloader.show();\r\n const project = this.viewer.createProjectModel(layersToSave);\r\n let fileIds = applyToAll\r\n ? project.files\r\n .filter((file) => !file.excludeScene)\r\n .map((file) => file.id)\r\n : [this.id];\r\n\r\n let scenesLeft = fileIds.length;\r\n component.props.spinloader.showWithTimeout(scenesLeft);\r\n\r\n let data = {\r\n name: this.toolConfig.name,\r\n projectId: this.projectId,\r\n fileIds: fileIds,\r\n parameters: this.state,\r\n preview: false,\r\n rect: null,\r\n project: project,\r\n };\r\n\r\n if (this.toolConfig.name.includes(\"alm_\")) {\r\n // save project before classify images\r\n const projectModel = this.viewer.createProjectModel(\"all\");\r\n Backend.saveProject(projectModel, () => {});\r\n Backend.activeLearningSignalR(\r\n data,\r\n (alModel) => {\r\n component.props.spinloader.hide();\r\n this.viewer.getSelectedObjects(alModel);\r\n },\r\n (error) => {\r\n component.props.spinloader.hide();\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n } else {\r\n let selectedLayer = this.selectedLayer;\r\n let resultProject = null;\r\n let callbackFunction = (project, fileId) => {\r\n scenesLeft -= 1;\r\n if (resultProject === null) {\r\n resultProject = project;\r\n } else {\r\n resultProject.files = resultProject.files.map((file) => {\r\n if (file.id === fileId) {\r\n return project.files.find((pFile) => pFile.id === fileId);\r\n } else return file;\r\n });\r\n }\r\n this.updateProject(project, fileId);\r\n\r\n if (fileId === this.id) {\r\n // load annotation layers\r\n for (let anno of project.files.find((c) => c.id === this.id)\r\n .annotations) {\r\n let layerIndex = anno.id === -1 ? selectedLayer : anno.id;\r\n if (anno.geoJSON === null) continue;\r\n anno.geoJSON.coordinates = anno.geoJSON.coordinates.filter(\r\n (coord) => coord.length > 0\r\n );\r\n this.roiLayers[layerIndex].layer.regionRois =\r\n anno.geoJSON.coordinates.map((c, idx) => {\r\n return new RegionROI({\r\n regions: typeof c[0][0][0] === \"number\" ? c : c[0],\r\n tileName:\r\n component.props.toolConfig.name === \"iam_tiler\"\r\n ? this.calcTileName(component, idx)\r\n : null,\r\n structureId: this.structures[selectedLayer].id,\r\n });\r\n });\r\n this.roiLayers[layerIndex].tree.clear();\r\n for (let roi of this.roiLayers[layerIndex].layer.regionRois) {\r\n this.roiLayers[layerIndex].tree.insert(roi.treeItem);\r\n }\r\n }\r\n }\r\n\r\n console.debug(\r\n `IAM Frontend Execution time: ${new Date().getTime() - start} ms`\r\n );\r\n component.props.spinloader.resetTimer(scenesLeft, 5);\r\n if (scenesLeft > 0) {\r\n this.runAnalysis(\r\n data,\r\n callbackFunction,\r\n fileIds,\r\n fileIds.length - scenesLeft,\r\n component\r\n );\r\n } else {\r\n component.props.spinloader.hide();\r\n }\r\n };\r\n this.runAnalysis(data, callbackFunction, fileIds, 0, component);\r\n }\r\n }\r\n\r\n runAnalysis = (data, callbackFunction, fileIds, idx, component) => {\r\n if (fileIds.length > 1) {\r\n component.props.spinloader.showWithProgress({\r\n message: `Running Analysis ${idx + 1} of ${fileIds.length}`,\r\n progress: (((idx + 1) / fileIds.length) * 100).toFixed(0),\r\n });\r\n } else {\r\n component.props.spinloader.show();\r\n }\r\n const fileId = fileIds[idx];\r\n data.fileIds = [fileId];\r\n Backend.instantAnalysisSignalR(\r\n data,\r\n component.props.spinloader,\r\n (project) => callbackFunction(project, fileId),\r\n (error) => {\r\n if (fileId === this.id) {\r\n component.props.spinloader.hide();\r\n window.openErrorDialog(error);\r\n } else {\r\n window.showWarningSnackbar(\r\n \"Apply Process failed for file: \" +\r\n data.project.files.find((file) => file.id === fileId).fileName\r\n );\r\n }\r\n }\r\n );\r\n };\r\n\r\n calcTileName = (component, idx) => {\r\n let letters = [\r\n \"A\",\r\n \"B\",\r\n \"C\",\r\n \"D\",\r\n \"E\",\r\n \"F\",\r\n \"G\",\r\n \"H\",\r\n \"I\",\r\n \"J\",\r\n \"K\",\r\n \"L\",\r\n \"M\",\r\n \"N\",\r\n \"O\",\r\n \"P\",\r\n \"Q\",\r\n \"R\",\r\n \"S\",\r\n \"T\",\r\n \"U\",\r\n \"V\",\r\n \"W\",\r\n \"X\",\r\n \"Y\",\r\n \"Z\",\r\n ];\r\n\r\n let numberRows = Math.ceil(\r\n component.props.ome.sizeY / component.props.state.size\r\n );\r\n let numberCellsAlphabet = 26 * numberRows;\r\n\r\n let firstLetter = \"\";\r\n if (Math.floor(idx / numberCellsAlphabet) > 0) {\r\n firstLetter = letters[Math.floor(idx / numberCellsAlphabet) - 1];\r\n }\r\n\r\n let secondLetter = \"\";\r\n idx = idx - Math.floor(idx / numberCellsAlphabet) * numberCellsAlphabet;\r\n let lettersIdx = Math.floor(idx / numberRows);\r\n secondLetter = letters[lettersIdx];\r\n let numberTile = idx - lettersIdx * numberRows;\r\n\r\n return firstLetter + secondLetter + String(numberTile + 1);\r\n };\r\n\r\n /**\r\n * Draw a custom cursor\r\n * ctx: canvas context, e.g. circle, rectangle, ...\r\n */\r\n drawCustomCursor(ctx, mousePosition, scale, canvas, center) {\r\n const sizeSliderParams = [\r\n \"area_min\",\r\n \"min_area\",\r\n \"area_max\",\r\n \"max_area\",\r\n \"cell_radius\",\r\n \"min_area_cells\",\r\n \"nuclei_cell_radius_cell_488\",\r\n \"min_area_647\",\r\n \"area_range_555\",\r\n \"lumen_size\",\r\n ];\r\n if (this.state.formControlInUse) {\r\n if (\r\n sizeSliderParams.includes(this.state.formControlInUse) ||\r\n this.state.formControlInUse.includes(\"area_min\")\r\n ) {\r\n let area = this.state[this.state.formControlInUse] / this.pixelArea;\r\n let radius = Math.abs(Math.sqrt(area / Math.PI));\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.arc(center.x, center.y, radius, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n ctx.closePath();\r\n } else if (this.state.formControlInUse.includes(\"area_range\")) {\r\n for (let range_value of this.state[this.state.formControlInUse]) {\r\n let area = range_value / this.pixelArea;\r\n let radius = Math.abs(Math.sqrt(area / Math.PI));\r\n ctx.beginPath();\r\n ctx.globalAlpha = 1.0;\r\n ctx.strokeStyle = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n ctx.arc(center.x, center.y, radius, 0, 2 * Math.PI);\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n }\r\n }\r\n }\r\n\r\n onParameterChange = (e) => {\r\n if (typeof e === \"undefined\") return;\r\n Object.assign(this.state, e);\r\n if (this.toolLayerConfig) {\r\n this.toolLayerConfig.parameters = Object.assign(\r\n this.toolLayerConfig.parameters,\r\n e\r\n );\r\n }\r\n };\r\n\r\n resetParameters = () => {\r\n let stateObject = this.configFormRef.state;\r\n for (let parameter of this.configFormRef.props.toolConfig.parameters) {\r\n stateObject[parameter.name] = parameter.ui.default;\r\n }\r\n this.configFormRef.setState(stateObject);\r\n setTimeout(() => {\r\n this.configFormRef.props.onParameterChange(stateObject);\r\n this.configFormRef.props.onApply(this.configFormRef);\r\n }, 10);\r\n };\r\n\r\n exit() {}\r\n\r\n /**\r\n * Renders the Tool Configuration Inputs\r\n */\r\n renderConfiguration() {\r\n return (\r\n
\r\n
\r\n \r\n {this.name}\r\n \r\n this.resetParameters()}\r\n >\r\n \r\n \r\n \r\n \r\n
\r\n\r\n {\r\n return this.state.preview\r\n ? this.calcPreview(component)\r\n : this.calcFull(component);\r\n }}\r\n onApplyAll={(component) => {\r\n return this.calcFull(component, true);\r\n }}\r\n componentRef={(c) => {\r\n this.configFormRef = c;\r\n }}\r\n />\r\n
\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Configuration Component to render the parameter inputs dynamically\r\n */\r\nclass ConfigFormRaw extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = props.state;\r\n this.accordionExpanded = false;\r\n if (props.componentRef) props.componentRef(this);\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps) {\r\n this.setState(nextProps.state);\r\n }\r\n\r\n validateParameters = () => {\r\n for (let parameter of this.props.toolConfig.parameters) {\r\n if (parameter.ui.component === \"flselect\") {\r\n let nChannels = this.props.ome.channels.length;\r\n let cIndex = this.state[parameter.name];\r\n if (cIndex >= nChannels) {\r\n this.onParameterChange(\r\n parameter.name,\r\n this.props.ome.channels.length - 1\r\n );\r\n } else if (cIndex < 0) {\r\n if (this.props.structures[this.props.selectedLayer].toolParams) {\r\n for (let toolParam of this.props.structures[\r\n this.props.selectedLayer\r\n ].toolParams) {\r\n let tempCIndex = this.props.ome.channels.findIndex(\r\n (c) => c.name === toolParam\r\n );\r\n if (tempCIndex >= 0) {\r\n cIndex = tempCIndex;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n this.onParameterChange(parameter.name, cIndex);\r\n }\r\n }\r\n };\r\n\r\n componentDidMount = () => {\r\n this.validateParameters();\r\n };\r\n\r\n componentDidUpdate = (prevProps) => {\r\n if (prevProps.selectedLayer !== this.props.selectedLayer) {\r\n this.validateParameters();\r\n }\r\n };\r\n\r\n /**\r\n * Update tool state\r\n */\r\n onParameterChange(key, value) {\r\n let stateObject = { formControlInUse: key };\r\n stateObject[key] = value;\r\n if (this.state[key] !== value) {\r\n this.setState(stateObject);\r\n setTimeout(() => this.props.onParameterChange(stateObject), 10);\r\n }\r\n }\r\n\r\n transformExponential(v, exponent) {\r\n let result = v ** (1 / exponent);\r\n return result;\r\n }\r\n\r\n render() {\r\n let { onApply, onApplyAll, toolConfig, selectedLayer } = this.props;\r\n let formControls = [];\r\n let optionalFormControls = [];\r\n\r\n for (let parameter of toolConfig.parameters) {\r\n const digits = parameter.ui.step ? countDecimals(parameter.ui.step) : 0;\r\n let formControl = null;\r\n // hide parameter on unwanted structures\r\n if (\r\n (parameter.ui.hiddenStructures &&\r\n parameter.ui.hiddenStructures.includes(selectedLayer)) ||\r\n !(parameter.name in this.state)\r\n ) {\r\n continue;\r\n }\r\n const component_type = parameter.ui.component;\r\n\r\n switch (component_type) {\r\n case \"required_structures\":\r\n break;\r\n /* Range Slider */\r\n case \"range\":\r\n case \"exp_range\":\r\n formControl = (\r\n \r\n \r\n {parameter.ui.label +\r\n \" = \" +\r\n this.state[parameter.name][0].toFixed(digits) +\r\n \" ... \" +\r\n this.state[parameter.name][1].toFixed(digits)}\r\n \r\n \r\n \r\n \r\n this.onParameterChange(parameter.name, [\r\n e.target.value === \"\" ? 0 : Number(e.target.value),\r\n this.state[parameter.name][1],\r\n ])\r\n }\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.onParameterChange(\"formControlInUse\", false);\r\n onApply(this);\r\n }\r\n }}\r\n inputProps={{\r\n step: parameter.ui.step,\r\n min: parameter.ui.min,\r\n max: parameter.ui.max,\r\n type: \"number\",\r\n \"aria-labelledby\": \"input-slider\",\r\n }}\r\n />\r\n \r\n \r\n {\r\n if (component_type === \"exp_range\") {\r\n v = [v[0] ** 2, v[1] ** 2];\r\n } else {\r\n v = [\r\n v[0] * (parameter.ui.step ? parameter.ui.step : 1),\r\n v[1] * (parameter.ui.step ? parameter.ui.step : 1),\r\n ];\r\n }\r\n this.onParameterChange(parameter.name, v);\r\n }}\r\n onChangeCommitted={() => {\r\n this.onParameterChange(\"formControlInUse\", false);\r\n onApply(this);\r\n }}\r\n />\r\n \r\n \r\n \r\n this.onParameterChange(parameter.name, [\r\n this.state[parameter.name][0],\r\n e.target.value === \"\" ? 0 : Number(e.target.value),\r\n ])\r\n }\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n onApply(this);\r\n }\r\n }}\r\n inputProps={{\r\n step: parameter.ui.step,\r\n min: parameter.ui.min,\r\n max: parameter.ui.max,\r\n type: \"number\",\r\n \"aria-labelledby\": \"input-slider\",\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n break;\r\n /* Normal Slider */\r\n case \"slider\":\r\n case \"exp_slider\":\r\n formControl = (\r\n \r\n \r\n {parameter.ui.label +\r\n \" = \" +\r\n (typeof this.state[parameter.name] !== \"undefined\"\r\n ? this.state[parameter.name].toFixed(digits)\r\n : \"\")}\r\n \r\n \r\n \r\n {\r\n if (e.type === \"mouseup\") {\r\n this.onParameterChange(\"formControlInUse\", false);\r\n onApply(this);\r\n }\r\n }}\r\n onChange={(e, v) => {\r\n if (component_type === \"exp_slider\") v = v ** 2;\r\n this.onParameterChange(\r\n parameter.name,\r\n v * (parameter.ui.step ? parameter.ui.step : 1)\r\n );\r\n }}\r\n />\r\n \r\n \r\n {\r\n this.onParameterChange(\r\n parameter.name,\r\n e.target.value === \"\" ? 0 : Number(e.target.value)\r\n );\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.onParameterChange(\"formControlInUse\", false);\r\n onApply(this);\r\n }\r\n }}\r\n //onBlur={handleBlur}\r\n inputProps={{\r\n step: parameter.ui.step,\r\n min: parameter.ui.min,\r\n max: parameter.ui.max,\r\n type: \"number\",\r\n \"aria-labelledby\": \"input-slider\",\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n break;\r\n /* Slider without update when release slider */\r\n case \"staticSlider\":\r\n formControl = (\r\n \r\n \r\n {parameter.ui.label +\r\n \" = \" +\r\n (typeof this.state[parameter.name] !== \"undefined\"\r\n ? this.state[parameter.name].toFixed(digits)\r\n : \"\")}\r\n \r\n \r\n \r\n {\r\n this.onParameterChange(\"formControlInUse\", false);\r\n }}\r\n onChange={(e, v) => {\r\n this.onParameterChange(\r\n parameter.name,\r\n v * (parameter.ui.step ? parameter.ui.step : 1)\r\n );\r\n }}\r\n />\r\n \r\n \r\n {\r\n this.onParameterChange(\r\n parameter.name,\r\n e.target.value === \"\" ? 0 : Number(e.target.value)\r\n );\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n onApply(this);\r\n }\r\n }}\r\n //onBlur={handleBlur}\r\n inputProps={{\r\n step: parameter.ui.step,\r\n min: parameter.ui.min,\r\n max: parameter.ui.max,\r\n type: \"number\",\r\n \"aria-labelledby\": \"input-slider\",\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n break;\r\n /* Selector */\r\n case \"select\":\r\n formControl = (\r\n \r\n \r\n {parameter.ui.label}\r\n \r\n \r\n this.onParameterChange(parameter.name, e.target.value)\r\n }\r\n inputProps={{\r\n name: parameter.name,\r\n id: parameter.name,\r\n }}\r\n >\r\n {parameter.ui.options.map((c) => (\r\n \r\n {c.label}\r\n \r\n ))}\r\n \r\n \r\n );\r\n break;\r\n /* Fluorescence Channel Selector */\r\n case \"flselect\":\r\n formControl = (\r\n \r\n \r\n {parameter.ui.label}\r\n \r\n {\r\n this.onParameterChange(parameter.name, e.target.value);\r\n }}\r\n inputProps={{\r\n name: parameter.name,\r\n id: parameter.name,\r\n }}\r\n >\r\n \r\n Select a Channel to use\r\n \r\n {this.props.ome.channels.map((c, index) => (\r\n \r\n \r\n {c.name}\r\n \r\n ))}\r\n {this.props.structures[this.props.selectedLayer].toolParams &&\r\n this.props.structures[this.props.selectedLayer].toolParams\r\n .length === 1 &&\r\n this.props.ome.channels.length < 4 &&\r\n this.state[parameter.name] > 2 && (\r\n \r\n {\r\n this.props.structures[this.props.selectedLayer]\r\n .toolParams[0]\r\n }\r\n \r\n )}\r\n \r\n \r\n );\r\n break;\r\n /* Layer Dependency Selector */\r\n case \"structureselect\":\r\n // validation\r\n if (this.state[parameter.name] >= this.props.structures.length) {\r\n this.onParameterChange(\r\n parameter.name,\r\n this.props.structures.length - 1\r\n );\r\n }\r\n formControl = (\r\n \r\n \r\n {parameter.ui.label}\r\n \r\n \r\n this.onParameterChange(parameter.name, e.target.value)\r\n }\r\n inputProps={{\r\n name: parameter.name,\r\n id: parameter.name,\r\n }}\r\n >\r\n {this.props.structures &&\r\n this.props.structures.map((c, index) => (\r\n \r\n {c.label}\r\n \r\n ))}\r\n \r\n \r\n );\r\n break;\r\n /* Numeric Input */\r\n case \"number\":\r\n formControl = (\r\n \r\n \r\n this.onParameterChange(parameter.name, e.target.value)\r\n }\r\n type=\"number\"\r\n margin=\"normal\"\r\n inputProps={{\r\n min: parameter.ui.min,\r\n max: parameter.ui.max,\r\n step: \"1\",\r\n }}\r\n />\r\n \r\n );\r\n break;\r\n /* Checkbox, Boolean Input */\r\n case \"checkbox\":\r\n formControl = (\r\n \r\n \r\n
\r\n {\r\n this.onParameterChange(\r\n parameter.name,\r\n e.target.checked\r\n );\r\n //setTimeout(() => onApply(this), 10);\r\n }}\r\n value={parameter.ui.label}\r\n />\r\n }\r\n label={parameter.ui.label}\r\n />\r\n
\r\n \r\n \r\n );\r\n break;\r\n /* Text Input */\r\n default:\r\n formControl = (\r\n \r\n \r\n this.onParameterChange(parameter.name, e.target.value)\r\n }\r\n margin=\"normal\"\r\n />\r\n \r\n );\r\n }\r\n if (parameter.ui.optional) {\r\n optionalFormControls.push(formControl);\r\n } else {\r\n formControls.push(formControl);\r\n }\r\n }\r\n\r\n return (\r\n
\r\n {formControls}\r\n {optionalFormControls.length > 0 && (\r\n {\r\n this.accordionExpanded = !this.accordionExpanded;\r\n this.forceUpdate();\r\n }}\r\n >\r\n }\r\n aria-controls=\"panel2d-content\"\r\n id=\"panel2d-header\"\r\n >\r\n \r\n Optional parameters: {this.state.selectedModel}\r\n \r\n \r\n {optionalFormControls}\r\n \r\n )}\r\n {!this.state.preview && this.props.selectedLayer === 0 && (\r\n // Detect Base ROI for all files\r\n onApplyAll(this)}\r\n >\r\n Apply to all files\r\n \r\n )}\r\n onApply(this)}\r\n >\r\n Apply\r\n \r\n {this.state.showDownloadProgress && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nConfigFormRaw.propTypes = {\r\n state: PropTypes.object,\r\n toolConfig: PropTypes.object,\r\n ome: PropTypes.object,\r\n structures: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n onParameterChange: PropTypes.func,\r\n onApply: PropTypes.func,\r\n onApplyAll: PropTypes.func,\r\n histogramConfig: PropTypes.object,\r\n componentRef: PropTypes.func,\r\n};\r\n\r\nconst ConfigForm = withSpinloader(ConfigFormRaw);\r\n\r\nexport default InstantAnalysisTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport ListItemAvatar from \"@mui/material/ListItemAvatar\";\r\nimport Avatar from \"@mui/material/Avatar\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\n// define the component's styling\r\nconst styles = () => ({\r\n root: {\r\n background: \"white\",\r\n height: \"100%\",\r\n marginLeft: 5,\r\n },\r\n headline: {\r\n padding: 16,\r\n paddingBottom: 8,\r\n },\r\n inline: {\r\n display: \"inline\",\r\n },\r\n});\r\n\r\nconst students = [\r\n {\r\n primary: \"\",\r\n name: \"Ali Conners\",\r\n avatar: \"/static/images/avatar/1.jpg\",\r\n comment: \" — UKE\",\r\n },\r\n {\r\n primary: \"\",\r\n name: \"Scott\",\r\n avatar: \"/static/images/avatar/1.jpg\",\r\n comment: \" — KIT\",\r\n },\r\n {\r\n primary: \"\",\r\n name: \"Jennifer\",\r\n avatar: \"/static/images/avatar/1.jpg\",\r\n comment: \" — KIT\",\r\n },\r\n {\r\n primary: \"\",\r\n name: \"Alex\",\r\n avatar: \"/static/images/avatar/1.jpg\",\r\n comment: \" — KIT\",\r\n },\r\n {\r\n primary: \"\",\r\n name: \"Sandra Adams\",\r\n avatar: \"/static/images/avatar/1.jpg\",\r\n comment: \" — Tübingen\",\r\n },\r\n];\r\n\r\nclass ClassroomChat extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n render() {\r\n const { classes, classRoomChatWidth } = this.props;\r\n return (\r\n 0 ? \"block\" : \"none\",\r\n }}\r\n className={classes.root}\r\n >\r\n \r\n Classroom\r\n \r\n \r\n {students.map((student, idx) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {student.name}\r\n \r\n {student.comment}\r\n \r\n }\r\n />\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nClassroomChat.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n classRoomChatWidth: PropTypes.number,\r\n};\r\n\r\nexport default withStyles(styles)(ClassroomChat);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { configureImage, colorInImage } from \"../utils/RendererUtils\";\r\nimport { getParentIndexLayer } from \"../utils/StructuresUtils\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport withTheme from \"@mui/styles/withTheme\";\r\nimport { Tooltip, IconButton } from \"@mui/material\";\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport { faLayerGroup } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { ArrowDropUp, ArrowDropDown } from \"@mui/icons-material\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\n\r\nconst styles = {\r\n root: {\r\n position: \"absolute\",\r\n bottom: 5,\r\n left: 5,\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n opacity: 0.8,\r\n },\r\n canvas: {\r\n position: \"relative\",\r\n },\r\n zBar: {\r\n position: \"absolute\",\r\n top: 10,\r\n bottom: 16,\r\n left: 10,\r\n width: 30,\r\n transition: \"opacity 0.15s ease-in-out\",\r\n },\r\n zStepUp: {\r\n color: \"#ffffff\",\r\n position: \"absolute\",\r\n top: 28,\r\n left: 0,\r\n width: 30,\r\n height: 30,\r\n padding: 0,\r\n },\r\n zStepDown: {\r\n color: \"#ffffff\",\r\n position: \"absolute\",\r\n top: 76,\r\n left: 0,\r\n width: 30,\r\n height: 30,\r\n padding: 0,\r\n },\r\n zStackIcon: {\r\n color: \"#ffffff\",\r\n position: \"absolute\",\r\n left: 6,\r\n top: 6,\r\n },\r\n zIndex: {\r\n color: \"#ffffff\",\r\n position: \"absolute\",\r\n top: 54,\r\n left: 0,\r\n width: 30,\r\n height: 30,\r\n textAlign: \"center\",\r\n },\r\n};\r\n\r\nclass CroppedImage extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n pd: 10,\r\n zoomSpeed: 10,\r\n };\r\n\r\n this.drawingEnabled = false;\r\n this.canvasFactor1 = 1;\r\n this.left = 1;\r\n this.top = 1;\r\n this.mousepos = {\r\n x: 0,\r\n y: 0,\r\n };\r\n this.mouseOnCanvas = false;\r\n this.positionInLayer = -1;\r\n this.previousPageIndex = 0;\r\n this.loadedCount = 0;\r\n this.fullyLoadedCount = 0;\r\n this.imgs = [];\r\n this.imgs1 = [];\r\n this.visibleRegions = [];\r\n this.r = null;\r\n }\r\n\r\n componentDidMount = () => {\r\n // set index for roi\r\n this.props.roI.galleryIndex = this.props.index;\r\n\r\n // load focus Z-Stack\r\n if (this.props.roI.z) {\r\n this.props.roI.firstTimeGallery = true;\r\n this.validateZ();\r\n }\r\n\r\n // bind mouse wheel events\r\n this.canvas.addEventListener(\r\n \"DOMMouseScroll\",\r\n (e) => this.mousewheel(e),\r\n true\r\n );\r\n this.canvas.addEventListener(\"mousewheel\", (e) => this.mousewheel(e), {\r\n passive: false,\r\n });\r\n\r\n // get drawing context from canvas\r\n this.ctx = this.canvas.getContext(\"2d\");\r\n\r\n // converts the relative size css information into an absolute size which we can access\r\n this.width = this.canvas.width = this.canvas.offsetWidth;\r\n this.height = this.canvas.height = this.canvas.offsetHeight;\r\n };\r\n\r\n componentWillUnmount() {\r\n this.canvas.removeEventListener(\r\n \"DOMMouseScroll\",\r\n (e) => this.mousewheel(e),\r\n true\r\n );\r\n this.canvas.removeEventListener(\"mousewheel\", (e) => this.mousewheel(e), {\r\n passive: false,\r\n });\r\n }\r\n\r\n componentDidUpdate() {\r\n const { roI, selectedWithKey } = this.props;\r\n // if roi was selected with key --> scroll that roi is on top of screen\r\n if (roI.selected && roI.selectedWithKey && selectedWithKey) {\r\n this.props.scroll(this.canvas.getBoundingClientRect().top);\r\n }\r\n // redraw image when the component updates\r\n this.draw();\r\n }\r\n\r\n UNSAFE_componentWillUpdate() {\r\n const { roI } = this.props;\r\n // check if new page\r\n if (this.previousPageIndex !== this.props.tiles.getPageIndex()) {\r\n this.previousPageIndex = this.props.tiles.getPageIndex();\r\n // calculate zoomspeed depending on width or height of roi\r\n let imgBoundWidth = roI.bounds.right - roI.bounds.left;\r\n let imgBoundHeight = roI.bounds.bottom - roI.bounds.top;\r\n let zoomSp;\r\n if (imgBoundWidth >= imgBoundHeight) {\r\n zoomSp = imgBoundWidth * 0.1;\r\n this.setState({ zoomSpeed: zoomSp }); // 10%\r\n } else {\r\n zoomSp = imgBoundHeight * 0.1;\r\n this.setState({ zoomSpeed: zoomSp }); // 10%\r\n }\r\n // reset variables\r\n this.loadedCount = 0;\r\n this.imgs = [];\r\n this.imgs1 = [];\r\n this.setState({ pd: 10 });\r\n }\r\n this.validateZ();\r\n // reset\r\n this.loadedCount = 0;\r\n }\r\n\r\n UNSAFE_componentWillMount() {\r\n const { roI } = this.props;\r\n // calculate zoomspeed depending on width or height of roi\r\n let imgBoundWidth = roI.bounds.right - roI.bounds.left;\r\n let imgBoundHeight = roI.bounds.bottom - roI.bounds.top;\r\n let zoomSp;\r\n if (imgBoundWidth >= imgBoundHeight) {\r\n zoomSp = imgBoundWidth * 0.1; // 10%\r\n this.setState({ zoomSpeed: zoomSp });\r\n } else {\r\n zoomSp = imgBoundHeight * 0.1; // 10%\r\n this.setState({ zoomSpeed: zoomSp });\r\n }\r\n this.validateZ();\r\n }\r\n\r\n // if no z level is set --> use middle z level\r\n validateZ = () => {\r\n if (this.props.roI.z === -1) {\r\n this.props.roI.z = this.props.globalZ;\r\n }\r\n };\r\n\r\n findVisibleRois = (pd) => {\r\n const { roI, structures, selectedLayer } = this.props;\r\n // only return rois that are visible with given padding / zoom --> use tree\r\n let parentLayerIndex = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n return this.props.tools[this.props.activeTool].roiLayers[\r\n parentLayerIndex\r\n ].tree.search({\r\n minX: roI.bounds.left - pd,\r\n minY: roI.bounds.top - pd,\r\n maxX: roI.bounds.right + pd,\r\n maxY: roI.bounds.bottom + pd,\r\n });\r\n };\r\n\r\n getPageForChannel(c) {\r\n // calculate page index for tile\r\n return (\r\n Math.round(this.props.t) *\r\n this.props.ome.channels.length *\r\n this.props.ome.sizeZ +\r\n Math.round(this.props.roI.z) * this.props.ome.channels.length +\r\n c\r\n );\r\n }\r\n\r\n areAllImagesComplete = (imgs) => {\r\n // check if given images are completely loaded\r\n let allComplete = true;\r\n imgs.forEach((element) => {\r\n if (!element.complete) {\r\n allComplete = false;\r\n }\r\n });\r\n return allComplete;\r\n };\r\n\r\n drawRoi = (ctx, roi, imgLeft, imgTop, canvasFactor) => {\r\n const opacity = roi.isObject ? 0 : this.props.opacity;\r\n ctx.globalAlpha = opacity / 2;\r\n ctx.fillStyle = roi.color;\r\n ctx.beginPath();\r\n for (let regions of roi.regions) {\r\n ctx.moveTo(\r\n (regions[0][0] - imgLeft) * canvasFactor,\r\n (regions[0][1] - imgTop) * canvasFactor\r\n );\r\n let left = imgLeft;\r\n let top = imgTop;\r\n regions.forEach(function (point) {\r\n ctx.lineTo(\r\n (point[0] - left) * canvasFactor,\r\n (point[1] - top) * canvasFactor\r\n );\r\n });\r\n }\r\n this.ctx.closePath();\r\n this.ctx.fill(\"evenodd\");\r\n if (opacity === 0) {\r\n ctx.strokeStyle = roi.color;\r\n }\r\n ctx.globalAlpha = 1;\r\n ctx.stroke();\r\n };\r\n\r\n draw() {\r\n const { roI, ome, tools, activeTool, drawLayer } = this.props;\r\n // draw image, contour, crosshair, ... in image\r\n\r\n this.canvas.height = this.props.canvasWidth;\r\n this.canvas.width = this.props.canvasWidth;\r\n\r\n // set padding (depends on zooming)\r\n let pd = 0;\r\n // check if new padding is still in whole image\r\n let boInsideImage =\r\n roI.bounds.left - this.state.pd > 0 &&\r\n roI.bounds.right + this.state.pd < ome.sizeX &&\r\n roI.bounds.top - this.state.pd > 0 &&\r\n roI.bounds.bottom + this.state.pd < ome.sizeY;\r\n if (boInsideImage) {\r\n pd = this.state.pd;\r\n } else {\r\n pd = this.state.pd - this.state.zoomSpeed; // if max. zoomed out --> do not change padding\r\n }\r\n\r\n // set image properties (dimensions) with padding\r\n let imgBottom = roI.bounds.bottom + pd;\r\n let imgTop = roI.bounds.top - pd;\r\n let imgLeft = roI.bounds.left - pd;\r\n let imgRight = roI.bounds.right + pd;\r\n let imgBoundWidth = roI.bounds.right - roI.bounds.left;\r\n let imgBoundHeight = roI.bounds.bottom - roI.bounds.top;\r\n\r\n // make bounding box to square and edge protection (that image is in whole image)\r\n if (imgBoundWidth > imgBoundHeight) {\r\n let d = (imgBoundWidth - imgBoundHeight) / 2;\r\n if (imgTop - d < 0) {\r\n // if too high\r\n imgBottom = imgBottom + d + (d - imgTop);\r\n imgTop = 0;\r\n } else if (imgBottom + d > ome.sizeY - 1) {\r\n // if too low\r\n imgTop = imgTop - d - (d - (ome.sizeY - imgBottom));\r\n imgBottom = ome.sizeY - 1;\r\n } else {\r\n imgTop = imgTop - d;\r\n imgBottom = imgBottom + d;\r\n }\r\n } else if (imgBoundWidth < imgBoundHeight) {\r\n let d = (imgBoundHeight - imgBoundWidth) / 2;\r\n if (imgLeft - d < 0) {\r\n // too far left\r\n imgRight = imgRight + d + (d - imgLeft);\r\n imgLeft = 0;\r\n } else if (imgRight + d > ome.sizeX - 1) {\r\n // too far right\r\n imgLeft = imgLeft - d - (d - (ome.sizeX - imgRight));\r\n imgRight = ome.sizeX - 1;\r\n } else {\r\n imgLeft = imgLeft - d;\r\n imgRight = imgRight + d;\r\n }\r\n }\r\n\r\n // calculate pyramid level to display roi\r\n let factorPyramidLevel =\r\n (this.props.canvasWidth * ome.sizeY) /\r\n ((imgBottom - imgTop) * this.props.tiles.getImgHeight());\r\n let level = Math.floor(this.getBaseLog(2, factorPyramidLevel));\r\n if (level < 0) {\r\n level = 0;\r\n } else if (level > ome.maxLevel) {\r\n level = ome.maxLevel;\r\n }\r\n\r\n let ctx = this.canvas.getContext(\"2d\");\r\n this.imgs = [];\r\n this.imgs1 = [];\r\n // get number of tiles in calculated level\r\n let rows = Math.pow(2, level);\r\n\r\n // get factor for width and height\r\n let factor_w =\r\n (this.props.tiles.getImgWidth() * rows) / this.props.ome.sizeX;\r\n let factor_h =\r\n (this.props.tiles.getImgHeight() * rows) / this.props.ome.sizeY;\r\n let xBound = imgLeft * factor_w;\r\n let yBound = imgTop * factor_h;\r\n let boundWidth = (imgRight - imgLeft) * factor_w;\r\n let boundHeight = (imgBottom - imgTop) * factor_h;\r\n\r\n // x- and y-Tile upper left\r\n let xTile = Math.floor(xBound / this.props.tiles.getImgWidth());\r\n let yTile = Math.floor(yBound / this.props.tiles.getImgHeight());\r\n\r\n xTile = Math.max(xTile, 0);\r\n yTile = Math.max(yTile, 0);\r\n\r\n // assume 4 tiles\r\n let rows1 = 2;\r\n let cols1 = 2;\r\n if (\r\n Math.floor(xBound / this.props.tiles.getImgWidth()) ===\r\n Math.floor((xBound + boundWidth) / this.props.tiles.getImgWidth())\r\n ) {\r\n // if left and right corner in same tile only one column\r\n cols1 = 1;\r\n }\r\n if (\r\n Math.floor(yBound / this.props.tiles.getImgHeight()) ===\r\n Math.floor((yBound + boundHeight) / this.props.tiles.getImgHeight())\r\n ) {\r\n // if upper and lower corner in same tile one row\r\n rows1 = 1;\r\n }\r\n if (xTile === Math.pow(2, level) - 1) {\r\n cols1 = 1;\r\n }\r\n if (yTile === Math.pow(2, level) - 1) {\r\n rows1 = 1;\r\n }\r\n\r\n // calculate and load tiles for roi depending on pyramide level\r\n for (let x = xTile; x < xTile + cols1; x++) {\r\n for (let y = yTile; y < yTile + rows1; y++) {\r\n for (let i = 0; i < ome.channels.length; i++) {\r\n let page = this.getPageForChannel(i);\r\n if (page === -1) {\r\n return;\r\n }\r\n let tileId =\r\n page + \",\" + level + \",\" + x + \",\" + y + \",\" + this.props.fileId;\r\n if (\r\n (!this.props.tiles.getVisibleImage(tileId) ||\r\n !this.props.tiles.getVisibleImage(tileId).complete ||\r\n roI.firstTimeGallery) &&\r\n this.props.objectToLoad.rois.includes(this.props.roI)\r\n ) {\r\n // if is not in cache and needs to get loaded in backend\r\n let vImg = new Image();\r\n vImg.src = Backend.renderRegion({\r\n id: this.props.fileId,\r\n page: page,\r\n lv: level,\r\n x: x,\r\n y: y,\r\n });\r\n this.imgs.push(vImg);\r\n this.imgs1.push([vImg, tileId]);\r\n this.props.tiles.pushVisibleImage(vImg, tileId);\r\n } else {\r\n // load tile from cache\r\n if (this.props.tiles.getVisibleImage(tileId)) {\r\n this.imgs.push(this.props.tiles.getVisibleImage(tileId));\r\n this.imgs1.push([\r\n this.props.tiles.getVisibleImage(tileId),\r\n tileId,\r\n ]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // clear canvas\r\n ctx.clearRect(0, 0, this.props.canvasWidth, this.props.canvasWidth);\r\n ctx.save();\r\n ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n ctx.clearRect(0, 0, this.props.canvasWidth, this.props.canvasWidth);\r\n ctx.restore();\r\n\r\n // put images in canvas\r\n for (let y = 0; y < this.imgs.length; y++) {\r\n if (\r\n this.imgs[y].complete &&\r\n this.props.tiles.getColoredImage(this.imgs1[y][1])\r\n ) {\r\n // if image is finished loading --> draw\r\n let channel;\r\n let nChannels = ome.channels.length;\r\n for (let i = 0; i < nChannels; i++) {\r\n if (y % nChannels === i) {\r\n channel = this.props.tiles.getHistogramConfig().channels[i];\r\n }\r\n }\r\n\r\n if (channel.enabled) {\r\n // composition should be screen for fluorescence\r\n const compositionModeFluor = \"screen\";\r\n ctx.globalCompositeOperation = compositionModeFluor;\r\n\r\n // draw image with different channels\r\n let imageForCanvas = this.props.tiles.getColoredImage(\r\n this.imgs1[y][1]\r\n );\r\n\r\n // variables for destionation and source image\r\n let sX; // source x\r\n let sY; // source y\r\n let sWidth; // source width\r\n let sHeight; // source height\r\n let x1D; // destination x\r\n let y1D; // destination y\r\n let wD; // destination width\r\n let hD; // destination height\r\n let imgWidth = this.props.tiles.getImgWidth();\r\n let imgHeight = this.props.tiles.getImgHeight();\r\n let fktWidth = (imgWidth * (xTile + 1) - xBound) / boundWidth;\r\n let fktHeight = (imgHeight * (yTile + 1) - yBound) / boundHeight;\r\n\r\n // calculate values for destination and source image (for cropping)\r\n if (this.imgs.length === this.props.ome.channels.length) {\r\n // if roi is in 1 tile\r\n sX = xBound - xTile * imgWidth;\r\n sY = yBound - yTile * imgHeight;\r\n sWidth = boundWidth;\r\n sHeight = boundHeight;\r\n x1D = 0;\r\n y1D = 0;\r\n wD = this.props.canvasWidth;\r\n hD = this.props.canvasWidth;\r\n } else if (rows1 === 1 && y >= this.props.ome.channels.length) {\r\n // if roi is in two horizontal tiles\r\n sX = 0;\r\n sY = yBound - yTile * imgHeight;\r\n sWidth = boundWidth + xBound - imgWidth * (xTile + 1);\r\n sHeight = imgHeight * (yTile + 1) - yBound;\r\n x1D = this.props.canvasWidth * fktWidth;\r\n y1D = 0;\r\n wD = this.props.canvasWidth * (1 - fktWidth);\r\n hD = this.props.canvasWidth * fktHeight;\r\n } else if (rows1 === 1 && y < this.props.ome.channels.length) {\r\n // if roi is in two horizontal tiles\r\n sX = xBound - xTile * imgWidth;\r\n sY = yBound - yTile * imgHeight;\r\n sWidth = imgWidth * (xTile + 1) - xBound;\r\n sHeight = imgHeight * (yTile + 1) - yBound;\r\n x1D = 0;\r\n y1D = 0;\r\n wD = this.props.canvasWidth * fktWidth;\r\n hD = this.props.canvasWidth * fktHeight;\r\n } else if (y >= 0 && y < this.props.ome.channels.length) {\r\n // upper left\r\n sX = xBound - xTile * imgWidth;\r\n sY = yBound - yTile * imgHeight;\r\n sWidth = imgWidth * (xTile + 1) - xBound;\r\n sHeight = imgHeight * (yTile + 1) - yBound;\r\n x1D = 0;\r\n y1D = 0;\r\n wD = this.props.canvasWidth * fktWidth;\r\n hD = this.props.canvasWidth * fktHeight;\r\n } else if (\r\n y >= this.props.ome.channels.length &&\r\n y < this.props.ome.channels.length * 2\r\n ) {\r\n // lower left\r\n sX = xBound - xTile * imgWidth;\r\n sY = 0;\r\n sWidth = imgWidth * (xTile + 1) - xBound;\r\n sHeight = boundHeight - (imgHeight * (yTile + 1) - yBound);\r\n x1D = 0;\r\n y1D = this.props.canvasWidth * fktHeight;\r\n wD = this.props.canvasWidth * fktWidth;\r\n hD = this.props.canvasWidth * (1 - fktHeight);\r\n } else if (\r\n y >= this.props.ome.channels.length * 2 &&\r\n y < this.props.ome.channels.length * 3\r\n ) {\r\n // upper right\r\n sX = 0;\r\n sY = yBound - yTile * imgHeight;\r\n sWidth = boundWidth + xBound - imgWidth * (xTile + 1);\r\n sHeight = imgHeight * (yTile + 1) - yBound;\r\n x1D = this.props.canvasWidth * fktWidth;\r\n y1D = 0;\r\n wD = this.props.canvasWidth * (1 - fktWidth);\r\n hD = this.props.canvasWidth * fktHeight;\r\n } else {\r\n // lower right\r\n sX = 0;\r\n sY = 0;\r\n sWidth = boundWidth + xBound - imgWidth * (xTile + 1);\r\n sHeight = boundHeight - (imgHeight * (yTile + 1) - yBound);\r\n x1D = this.props.canvasWidth * fktWidth;\r\n y1D = this.props.canvasWidth * fktHeight;\r\n wD = this.props.canvasWidth * (1 - fktWidth);\r\n hD = this.props.canvasWidth * (1 - fktHeight);\r\n }\r\n\r\n ctx.imageSmoothingEnabled = true;\r\n if (imageForCanvas) {\r\n // draw loaded image canvas\r\n ctx.drawImage(\r\n imageForCanvas,\r\n sX,\r\n sY,\r\n sWidth,\r\n sHeight,\r\n x1D,\r\n y1D,\r\n wD,\r\n hD\r\n );\r\n }\r\n\r\n this.fullyLoadedCount = this.fullyLoadedCount + 1;\r\n if (this.areAllImagesComplete(this.imgs)) {\r\n this.props.roI.fullyLoaded = true;\r\n this.fullyLoadedCount = 0;\r\n if (this.props.roI === this.props.objectToLoad.roi) {\r\n // set image/roi that should be loaded next\r\n this.props.setObjectToLoad();\r\n }\r\n }\r\n roI.firstTimeGallery = false;\r\n }\r\n } else if (this.props.objectToLoad.rois.includes(this.props.roI)) {\r\n // if image is not finished loading from backend and roi is the object to load next --> load image\r\n this.imgs[y].onload = () => {\r\n let channel;\r\n let nChannels = this.props.ome.channels.length;\r\n for (let i = 0; i < nChannels; i++) {\r\n if (y % nChannels === i) {\r\n channel = this.props.tiles.getHistogramConfig().channels[i];\r\n }\r\n }\r\n\r\n if (channel.enabled) {\r\n // composition should be screen for fluorescence\r\n const compositionModeFluor = \"screen\";\r\n ctx.globalCompositeOperation = compositionModeFluor;\r\n\r\n if (channel.color === \"#ffffff\" || channel.color === -1) {\r\n // rgb channel\r\n if (\r\n this.imgs1[y] &&\r\n !this.props.tiles.getColoredImage(this.imgs1[y][1])\r\n ) {\r\n let imageForCanvas = configureImage(this.imgs[y], channel);\r\n this.props.tiles.pushColoredImages(\r\n imageForCanvas,\r\n this.imgs1[y][1]\r\n );\r\n }\r\n } else {\r\n // colored images cache\r\n if (\r\n this.imgs1[y] &&\r\n !this.props.tiles.getColoredImage(this.imgs1[y][1])\r\n ) {\r\n let imageForCanvas = colorInImage(this.imgs[y], channel);\r\n this.props.tiles.pushColoredImages(\r\n imageForCanvas,\r\n this.imgs1[y][1]\r\n );\r\n }\r\n }\r\n }\r\n\r\n this.loadedCount = this.loadedCount + 1;\r\n if (this.areAllImagesComplete(this.imgs)) {\r\n // if all images loaded --> reset images\r\n this.imgs = [];\r\n this.imgs1 = [];\r\n this.props.roI.firstTimeGallery = false;\r\n this.loadedCount = 0;\r\n this.props.roI.fullyLoaded = true;\r\n this.forceUpdate();\r\n }\r\n };\r\n }\r\n }\r\n\r\n // draw contour of roi\r\n if (this.props.contour) {\r\n this.ctx.globalCompositeOperation = \"source-over\";\r\n this.ctx.strokeStyle = this.props.isBrightfield ? \"black\" : \"white\";\r\n ctx.lineWidth = 2;\r\n let canvasFactor = this.props.canvasWidth / (imgBottom - imgTop);\r\n this.canvasFactor1 = canvasFactor;\r\n this.left = imgLeft;\r\n this.top = imgTop;\r\n\r\n if (\r\n !tools[activeTool] ||\r\n (tools[activeTool] &&\r\n tools[activeTool].name !== \"Pen\" &&\r\n tools[activeTool].name !== \"Region\" &&\r\n tools[activeTool].name !== \"Rectangle\" &&\r\n tools[activeTool].name !== \"Ellipse\") ||\r\n !tools[activeTool].layer\r\n ) {\r\n // no drawing tool enabled\r\n // only draw main roi\r\n this.drawRoi(ctx, roI, imgLeft, imgTop, canvasFactor);\r\n ctx.beginPath();\r\n } else {\r\n // drawing tool enabled\r\n if (\r\n tools[activeTool].layer.regionRois[this.props.index] &&\r\n !this.mouseOnCanvas\r\n ) {\r\n // drawing tool enabled but mouse not on canvas --> only draw main roi\r\n let r = tools[activeTool].layer.regionRois.filter(\r\n (element) => element.bounds === roI.bounds\r\n )[0];\r\n if (r) {\r\n this.r = r;\r\n // only draw main roi\r\n this.drawRoi(ctx, r, imgLeft, imgTop, canvasFactor);\r\n }\r\n }\r\n\r\n if (this.mouseOnCanvas) {\r\n // draw other contours if mouse is on canvas and tool is activated\r\n // only draw contours that are visible in image (use tree)\r\n this.visibleRegions = [];\r\n this.visibleRegions = this.findVisibleRois(this.state.pd); // also icludes main roi\r\n\r\n // draw visible regions in canvas\r\n for (let i = 0; i < this.visibleRegions.length; i++) {\r\n this.drawRoi(\r\n ctx,\r\n this.visibleRegions[i].roi,\r\n imgLeft,\r\n imgTop,\r\n canvasFactor\r\n );\r\n }\r\n\r\n // draw drawlayer\r\n if (drawLayer.regionRois.length > 0) {\r\n this.drawRoi(\r\n ctx,\r\n drawLayer.regionRois[0],\r\n imgLeft,\r\n imgTop,\r\n canvasFactor\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n // draw custom mouse cursor for pen tool\r\n if (tools[activeTool] && this.mousepos.x !== 0) {\r\n tools[activeTool].drawCustomCursor(\r\n ctx,\r\n this.mousepos,\r\n this.canvasFactor1,\r\n true\r\n );\r\n }\r\n\r\n // draw crosshair\r\n // clear overlayCanvas\r\n let ctxOv = null;\r\n if (this.canvasOverlay !== null && this.canvasOverlay) {\r\n ctxOv = this.canvasOverlay.getContext(\"2d\");\r\n this.canvasOverlay.height = this.props.canvasWidth;\r\n this.canvasOverlay.width = this.props.canvasWidth;\r\n ctxOv.clearRect(0, 0, this.props.canvasWidth, this.props.canvasWidth);\r\n ctxOv.save();\r\n ctxOv.setTransform(1, 0, 0, 1, 0, 0);\r\n ctxOv.clearRect(0, 0, this.props.canvasWidth, this.props.canvasWidth);\r\n ctxOv.restore();\r\n }\r\n if (this.props.drawCrosshair) {\r\n ctxOv.lineWidth = this.props.crosshairLineWidth;\r\n let lineLength = (this.props.canvasWidth / 2) * 0.9;\r\n let linePostion = this.props.canvasWidth / 2;\r\n let widthHeight = this.props.canvasWidth;\r\n\r\n // horizontal line left\r\n ctxOv.beginPath();\r\n ctxOv.moveTo(4, this.props.canvasWidth / 2);\r\n ctxOv.lineTo(lineLength, linePostion);\r\n ctxOv.closePath();\r\n ctxOv.strokeStyle = this.props.crosshairColor;\r\n ctxOv.globalAlpha = this.props.crosshairOpacity;\r\n ctxOv.stroke();\r\n\r\n // horizontal line right\r\n ctxOv.beginPath();\r\n ctxOv.moveTo(widthHeight - 4, linePostion);\r\n ctxOv.lineTo(widthHeight - lineLength, linePostion);\r\n ctxOv.closePath();\r\n ctxOv.strokeStyle = this.props.crosshairColor;\r\n ctxOv.globalAlpha = this.props.crosshairOpacity;\r\n ctxOv.stroke();\r\n\r\n // vertical line top\r\n ctxOv.beginPath();\r\n ctxOv.moveTo(linePostion, 4);\r\n ctxOv.lineTo(linePostion, lineLength);\r\n ctxOv.closePath();\r\n ctxOv.strokeStyle = this.props.crosshairColor;\r\n ctxOv.globalAlpha = this.props.crosshairOpacity;\r\n ctxOv.stroke();\r\n\r\n // vertical line bottom\r\n ctxOv.beginPath();\r\n ctxOv.moveTo(linePostion, widthHeight - 4);\r\n ctxOv.lineTo(linePostion, widthHeight - lineLength);\r\n ctxOv.closePath();\r\n ctxOv.strokeStyle = this.props.crosshairColor;\r\n ctxOv.globalAlpha = this.props.crosshairOpacity;\r\n ctxOv.stroke();\r\n }\r\n }\r\n\r\n getRoiStructureId = (roi) => {\r\n const { structures, selectedLayer } = this.props;\r\n // return structureId of roi\r\n if (roi.structureId === 0 && roi.subtypeName === \"\") {\r\n // run job parent elements\r\n return structures[selectedLayer].id;\r\n } else if (roi.structureId === 0) {\r\n // for old projects with no ids or after run job (structureId === 0)\r\n let idx = structures.findIndex(\r\n (element) =>\r\n element.color === roi.color && element.label === roi.subtypeName\r\n );\r\n return structures[idx].id;\r\n } else {\r\n // if new project --> just return structureId property\r\n return roi.structureId;\r\n }\r\n };\r\n\r\n getClassificationStructure = (id) => {\r\n const { structures } = this.props;\r\n // return structure for classification with given id\r\n return structures.filter((element) => element.id === id)[0];\r\n };\r\n\r\n handleCanvasClick = (e) => {\r\n const {\r\n roI,\r\n tools,\r\n structures,\r\n selectedLayer,\r\n roiLayers,\r\n activeTool,\r\n automaticTraining,\r\n classificationId,\r\n project,\r\n } = this.props;\r\n // classify and select roi\r\n\r\n // return if roi is not loaded --> return\r\n if (this.props.roI.firstTimeGallery) {\r\n if (!this.props.roI.aiAnnotated) {\r\n return;\r\n }\r\n }\r\n\r\n if (!project.type.includes(\"Histo\") && selectedLayer === 0) return; //dont allow subtype marking for baseroi\r\n\r\n // only classify and select roi if no drawing tool is activated\r\n if (\r\n !tools[activeTool] ||\r\n (tools[activeTool] &&\r\n tools[activeTool].name !== \"Pen\" &&\r\n tools[activeTool].name !== \"Region\" &&\r\n tools[activeTool].name !== \"Rectangle\" &&\r\n tools[activeTool].name !== \"Ellipse\")\r\n ) {\r\n // set clicked roi to selected = true\r\n roiLayers[selectedLayer].layer.regionRois.forEach((element) => {\r\n element.selected = false;\r\n element.selectedWithKey = false;\r\n });\r\n this.props.roI.selected = true;\r\n this.props.roI.selectedWithKey = false;\r\n if (this.props.selectedWithKey) {\r\n // set false --> no automatic scrolling\r\n this.props.setSelectedWithKey(false);\r\n }\r\n\r\n // return here in histo-point-counting module --> only select but not classify\r\n if (project.type.includes(\"HistoPointCounting\")) {\r\n this.props.updateGallery();\r\n return;\r\n }\r\n\r\n // classify roi\r\n let roiWasSubtype = roI.isSubtype && !roI.aiAnnotated;\r\n let bufferRoiId = this.getRoiStructureId(roI);\r\n\r\n let classificationStructure;\r\n if (e.nativeEvent.which === 3) {\r\n // right click\r\n classificationStructure = this.getClassificationStructure(\r\n classificationId[2]\r\n );\r\n }\r\n if (e.nativeEvent.which === 1) {\r\n // left click\r\n classificationStructure = this.getClassificationStructure(\r\n classificationId[1]\r\n );\r\n }\r\n\r\n if (typeof classificationStructure === \"undefined\") return;\r\n\r\n // set properties\r\n roI.color = classificationStructure.color;\r\n roI.isSubtype = classificationStructure.classificationSubtype\r\n ? true\r\n : false;\r\n roI.isAnnotated = classificationStructure.classificationSubtype\r\n ? true\r\n : false;\r\n roI.isLabeled = classificationStructure.classificationSubtype\r\n ? true\r\n : false;\r\n roI.subtypeName = classificationStructure.label;\r\n roI.structureId = classificationStructure.id;\r\n roI.isSelObj = false;\r\n roI.aiAnnotated = false;\r\n\r\n // increase annotationCount\r\n if (\r\n automaticTraining &&\r\n !structures[selectedLayer].classificationSubtype\r\n ) {\r\n if (roI.isSubtype && !roiWasSubtype) {\r\n // if classify unlabeled to labeled\r\n this.props.tiles.setStrAnnoCount(this.getRoiStructureId(roI), 1);\r\n } else if (roI.isSubtype && roiWasSubtype) {\r\n // if classify labeled to labeled\r\n this.props.tiles.setStrAnnoCount(this.getRoiStructureId(roI), 1);\r\n this.props.tiles.setStrAnnoCount(bufferRoiId, -1);\r\n } else if (roiWasSubtype) {\r\n // if classify labeled to unlabeled\r\n this.props.tiles.setStrAnnoCount(bufferRoiId, -1);\r\n }\r\n }\r\n\r\n // check if all images in scene are labeled\r\n //this.allImgsAnnotated();\r\n\r\n // check if start training automatically\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n let structureId = structures[selectedLayer].id;\r\n let annotations =\r\n this.getNuberChildRois(childs) -\r\n this.props.tiles.getStrAnnoCountElement(structureId);\r\n if (\r\n annotations >= this.props.startData &&\r\n automaticTraining &&\r\n !this.props.alruns\r\n ) {\r\n let enoughAnnos = this.enoughAnnotations(childs);\r\n if (enoughAnnos) {\r\n this.props.tiles.setAnnotationCount(0);\r\n this.props.tiles.setParentAnnoCount(\r\n structures[selectedLayer].id,\r\n annotations\r\n );\r\n this.props.startAutomaticTraining();\r\n } else {\r\n // give warning if too less annotations\r\n this.props.giveWarning();\r\n }\r\n }\r\n // update gallery\r\n this.props.updateGallery();\r\n }\r\n };\r\n\r\n allImgsAnnotated = () => {\r\n const { selectedLayer, roiLayers } = this.props;\r\n // check if all images in scene are labeled\r\n let allImagesLabeled = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (element) => !element.isLabeled\r\n );\r\n if (allImagesLabeled.length === 0) {\r\n // set property that scene is fully annotated\r\n this.props.setFUllyAnnotated();\r\n } else if (allImagesLabeled.length > 0) {\r\n // set property that scene is annotated\r\n this.props.setAnnotated();\r\n }\r\n };\r\n\r\n getNuberChildRois = (childs) => {\r\n // get number of rois for each child\r\n let n = 0;\r\n childs.forEach((element) => {\r\n n = n + this.props.tiles.getStrAnnoCountElement(element.id);\r\n });\r\n return n;\r\n };\r\n\r\n findChilds = (structure) => {\r\n const { structures } = this.props;\r\n // return all direct classificationsubtypes\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === structure.subtypeLevel + 1 &&\r\n element.parentId === structure.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n enoughAnnotations = (childs) => {\r\n // check if enough annotations for training of dl model (at least one class with 5 annotations and one other class with 1 annotation)\r\n let minFive = false;\r\n let twoAnnotated = 0;\r\n childs.forEach((element) => {\r\n // check if minimum of five in one class\r\n if (this.props.tiles.getStrAnnoCountElement(element.id) >= 5) {\r\n minFive = true;\r\n }\r\n // check if two classes with at least one element\r\n if (this.props.tiles.getStrAnnoCountElement(element.id) >= 1) {\r\n twoAnnotated = twoAnnotated + 1;\r\n }\r\n });\r\n\r\n // if one class with at least five and one other class with at least one annotation --> enough annotations for training\r\n let enough = false;\r\n if (minFive && twoAnnotated >= 2) {\r\n enough = true;\r\n }\r\n return enough;\r\n };\r\n\r\n handleCanvasMouseDown = (e) => {\r\n const { roI, tools, activeTool, project } = this.props;\r\n // no mouse down if roi is still loading\r\n if (this.props.roI.firstTimeGallery) {\r\n return;\r\n }\r\n // set property that mouse is down\r\n this.props.tiles.setIsMousedown(true);\r\n\r\n if (this.drawingEnabled) {\r\n // get position, ... for drawing event of tool\r\n var rect = this.canvas.getBoundingClientRect();\r\n var mouseX = e.clientX - rect.left;\r\n var mouseY = e.clientY - rect.top;\r\n let p = {\r\n x: mouseX / this.canvasFactor1 + this.left,\r\n y: mouseY / this.canvasFactor1 + this.top,\r\n };\r\n if (tools[activeTool]) {\r\n tools[activeTool].mouse({\r\n event: e,\r\n p: p,\r\n color: roI.color,\r\n subtype: roI.isSubtype,\r\n name: roI.subtypeName,\r\n });\r\n }\r\n // update\r\n this.forceUpdate();\r\n }\r\n // mouse wheel click not possible in point counting module\r\n if (!project.type.includes(\"HistoPointCounting\")) {\r\n // zoom to roi in viewer when mouse wheel click\r\n if (e.nativeEvent.which === 2) {\r\n this.props.gallery(\r\n false,\r\n roI.bounds.left,\r\n roI.bounds.right,\r\n roI.bounds.top,\r\n roI.bounds.bottom\r\n );\r\n }\r\n }\r\n };\r\n\r\n handleMouseMove = (e) => {\r\n const { roI, tools, activeTool } = this.props;\r\n // no mouse move if roi is still loading\r\n if (roI.firstTimeGallery) {\r\n return;\r\n }\r\n if (this.drawingEnabled) {\r\n // set property that mouse is on canvas\r\n this.mouseOnCanvas = true;\r\n // get position, ... for drawing event of tool\r\n var rect = this.canvas.getBoundingClientRect();\r\n var mouseX = e.clientX - rect.left;\r\n var mouseY = e.clientY - rect.top;\r\n let p = {\r\n x: mouseX / this.canvasFactor1 + this.left,\r\n y: mouseY / this.canvasFactor1 + this.top,\r\n };\r\n if (\r\n (tools[activeTool] && tools.region.points.length !== 0) ||\r\n (tools[activeTool] && tools[activeTool].name === \"Pen\") ||\r\n (tools[activeTool] && tools[activeTool].name === \"Rectangle\") ||\r\n (tools[activeTool] && tools[activeTool].name === \"Ellipse\")\r\n ) {\r\n tools[activeTool].mouse({\r\n event: e,\r\n p: p,\r\n color: roI.color,\r\n subtype: roI.isSubtype,\r\n name: roI.subtypeName,\r\n });\r\n // update\r\n this.forceUpdate();\r\n }\r\n // update mouse position\r\n this.mousepos.x = e.clientX - rect.left;\r\n this.mousepos.y = e.clientY - rect.top;\r\n }\r\n };\r\n\r\n handleMouseUp = (e) => {\r\n const { roI, tools, activeTool, roiLayers, selectedLayer, structures } =\r\n this.props;\r\n // no mouse up if roi is still loading\r\n if (roI.firstTimeGallery) {\r\n return;\r\n }\r\n // set property that mouse is not down anymore\r\n this.props.tiles.setIsMousedown(false);\r\n\r\n if (\r\n this.drawingEnabled &&\r\n tools[activeTool] &&\r\n (tools[activeTool].name === \"Pen\" ||\r\n tools[activeTool].name === \"Region\" ||\r\n tools[activeTool].name === \"Rectangle\" ||\r\n tools[activeTool].name === \"Ellipse\")\r\n ) {\r\n // get position, ... for drawing event of tool\r\n var rect = this.canvas.getBoundingClientRect();\r\n var mouseX = e.clientX - rect.left;\r\n var mouseY = e.clientY - rect.top;\r\n let p = {\r\n x: mouseX / this.canvasFactor1 + this.left,\r\n y: mouseY / this.canvasFactor1 + this.top,\r\n };\r\n\r\n // get position of roi --> insert if at correct position after update\r\n // get layer which contains roi\r\n let parentLayer = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n // get position of roi in roilayer\r\n let posInRoiLayer = roiLayers[parentLayer].layer.regionRois.findIndex(\r\n (roi) => roi === roI\r\n );\r\n if (posInRoiLayer !== -1) {\r\n this.positionInLayer = posInRoiLayer;\r\n }\r\n if (tools[activeTool]) {\r\n tools[activeTool].mouse({\r\n event: e,\r\n p: p,\r\n color: roI.color,\r\n subtype: roI.isSubtype,\r\n name: roI.subtypeName,\r\n positionInRoiLayer: this.positionInLayer,\r\n fullyLoaded: true,\r\n });\r\n }\r\n // reset object to load --> reload after drawing\r\n this.props.setObjectToLoad(false, true);\r\n // update\r\n this.forceUpdate();\r\n }\r\n };\r\n\r\n handleMouseLeave = () => {\r\n const { roI, tools, activeTool } = this.props;\r\n // no mouse leave if roi is still loading\r\n if (roI.firstTimeGallery) {\r\n return;\r\n }\r\n // set property that mouse is not on image anymore\r\n this.props.tiles.setIsOnImage(false);\r\n\r\n // if mouse is not down when leaving image --> end drawing mode\r\n if (!this.props.tiles.getIsMousedown()) {\r\n this.drawingEnabled = false;\r\n }\r\n\r\n // reset mouseposition\r\n this.mousepos.x = 0;\r\n this.mousepos.y = 0;\r\n this.mouseOnCanvas = false;\r\n if (\r\n tools[activeTool] &&\r\n (tools[activeTool].name === \"Pen\" ||\r\n tools[activeTool].name === \"Region\" ||\r\n tools[activeTool].name === \"Rectangle\" ||\r\n tools[activeTool].name === \"Ellipse\")\r\n ) {\r\n // update gallery\r\n this.props.updateGallery();\r\n }\r\n // update\r\n this.forceUpdate();\r\n };\r\n\r\n handleMouseEnter = () => {\r\n const { roI, roiLayers, selectedLayer } = this.props;\r\n if (!this.props.tiles.getIsMousedown()) {\r\n // if mouse is not down when entering image --> start drawing mode\r\n this.drawingEnabled = true;\r\n // set position and props of roi in context --> to fix stop drawing outside of image\r\n this.props.tiles.setRoiProps(this.props.roI);\r\n let posInRoiLayer = roiLayers[selectedLayer].layer.regionRois.findIndex(\r\n (roi) => roi === roI\r\n );\r\n this.props.tiles.setPositionRoi(posInRoiLayer);\r\n } else {\r\n // if mouse is already down when entering image --> do not start drawing mode becaus drawing is enabled on other image\r\n this.props.tiles.setIsInOtherImage(true);\r\n }\r\n // set property that mouse is on image\r\n this.props.tiles.setIsOnImage(true);\r\n };\r\n\r\n mousewheel = (event) => {\r\n const { roI, tools, activeTool, ome } = this.props;\r\n // only zoom if drawing / tool is activated\r\n if (\r\n tools[activeTool] &&\r\n (tools[activeTool].name === \"Pen\" ||\r\n tools[activeTool].name === \"Region\" ||\r\n tools[activeTool].name === \"Rectangle\" ||\r\n tools[activeTool].name === \"Ellipse\")\r\n ) {\r\n // check if zooming would result in zoom outside of whole image\r\n let insideImage =\r\n roI.bounds.left - this.state.pd > 0 &&\r\n roI.bounds.right + this.state.pd < ome.sizeX &&\r\n roI.bounds.top - this.state.pd > 0 &&\r\n roI.bounds.bottom + this.state.pd < ome.sizeY;\r\n\r\n if (insideImage) {\r\n if (event.deltaY < 0) {\r\n // zoom in if possible\r\n if (this.state.pd >= this.state.zoomSpeed) {\r\n this.setState({ pd: this.state.pd - this.state.zoomSpeed });\r\n } else {\r\n this.setState({ pd: 0 });\r\n }\r\n } else {\r\n // zoom out\r\n this.setState({ pd: this.state.pd + this.state.zoomSpeed });\r\n }\r\n } else {\r\n if (event.deltaY < 0) {\r\n // zoom in if possible\r\n if (this.state.pd >= this.state.zoomSpeed) {\r\n this.setState({ pd: this.state.pd - this.state.zoomSpeed });\r\n } else {\r\n this.setState({ pd: 0 });\r\n }\r\n }\r\n }\r\n\r\n // increase zoomspeed by 10%\r\n let imgBoundWidth =\r\n this.props.roI.bounds.right - this.props.roI.bounds.left;\r\n this.setState({ zoomSpeed: (imgBoundWidth + this.state.pd * 2) * 0.1 }); // 10%\r\n } else {\r\n // increase / decrease z level\r\n if (this.props.showZStackBar) {\r\n this.onZStep(event.deltaY < 0 ? 1 : -1);\r\n }\r\n }\r\n\r\n // prevent other scroll actions if there is a zstack\r\n let actTool =\r\n tools[activeTool] &&\r\n (tools[activeTool].name === \"Pen\" ||\r\n tools[activeTool].name === \"Region\" ||\r\n tools[activeTool].name === \"Rectangle\" ||\r\n tools[activeTool].name === \"Ellipse\");\r\n if (this.props.showZStackBar || actTool) {\r\n this.props.roI.firstTimeGallery = true;\r\n event.preventDefault();\r\n this.forceUpdate();\r\n }\r\n };\r\n\r\n getBaseLog(x, y) {\r\n return Math.log(y) / Math.log(x);\r\n }\r\n\r\n onZStep(deltaZ) {\r\n // change z level for roi\r\n let newZ = this.props.roI.z + deltaZ;\r\n if (newZ < 0) newZ = 0;\r\n if (newZ > this.props.ome.sizeZ - 1) newZ = this.props.ome.sizeZ - 1;\r\n if (newZ !== this.props.roI.z) {\r\n this.props.roI.firstTimeGallery = true;\r\n this.props.roI.fullyLoaded = false;\r\n this.props.roI.z = newZ;\r\n }\r\n this.forceUpdate();\r\n }\r\n\r\n render() {\r\n const { classes, ome, tools, activeTool, roI, isBrightfield } = this.props;\r\n\r\n // do not show z-stack bar in upper left while drawing\r\n const drawMode =\r\n tools[activeTool] &&\r\n (tools[activeTool].name === \"Pen\" ||\r\n tools[activeTool].name === \"Region\" ||\r\n tools[activeTool].name === \"Rectangle\" ||\r\n tools[activeTool].name === \"Ellipse\");\r\n\r\n let pixelSize = ome.physicalSizeX / Math.pow(10, -6);\r\n let unit = ome.physicalSizeXUnit;\r\n\r\n return (\r\n
(this.root = c)}>\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n (this.canvas = c)}\r\n className={classes.canvas}\r\n onClick={this.handleCanvasClick}\r\n onMouseDown={this.handleCanvasMouseDown}\r\n onContextMenu={(e) => {\r\n this.handleCanvasClick(e);\r\n e.preventDefault();\r\n }}\r\n onMouseMove={this.handleMouseMove}\r\n onMouseUp={this.handleMouseUp}\r\n onMouseLeave={this.handleMouseLeave}\r\n onMouseEnter={(e) => {\r\n this.handleMouseEnter(e);\r\n }}\r\n />\r\n {this.props.drawCrosshair && (\r\n (this.canvasOverlay = c)}\r\n />\r\n )}\r\n
\r\n {ome.sizeZ > 1 && !drawMode && (\r\n
\r\n \r\n \r\n this.onZStep(1)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n {this.props.roI.z}\r\n \r\n this.onZStep(-1)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n
\r\n )}\r\n
\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nCroppedImage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n componentRef: PropTypes.func,\r\n onRefresh: PropTypes.func,\r\n ome: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n visibleImage: PropTypes.array,\r\n coloredImages: PropTypes.array,\r\n roI: PropTypes.object,\r\n structures: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n canvasWidth: PropTypes.number,\r\n canvasWidthString: PropTypes.string,\r\n gallery: PropTypes.func,\r\n contour: PropTypes.bool,\r\n activeTool: PropTypes.string,\r\n tools: PropTypes.array,\r\n fileId: PropTypes.string,\r\n index: PropTypes.number,\r\n indexOffset: PropTypes.number,\r\n page: PropTypes.number,\r\n roiLayers: PropTypes.array,\r\n fromAI: PropTypes.bool,\r\n drawLayer: PropTypes.object,\r\n updateGallery: PropTypes.func,\r\n startData: PropTypes.number,\r\n alruns: PropTypes.bool,\r\n setAlruns: PropTypes.func,\r\n globalZ: PropTypes.number,\r\n z: PropTypes.number,\r\n t: PropTypes.number,\r\n tiles: PropTypes.object,\r\n opacity: PropTypes.number,\r\n selectedWithKey: PropTypes.bool,\r\n scroll: PropTypes.func,\r\n objectToLoad: PropTypes.object,\r\n setObjectToLoad: PropTypes.func,\r\n isBrightfield: PropTypes.bool,\r\n drawCrosshair: PropTypes.func,\r\n crosshairLineWidth: PropTypes.number,\r\n crosshairColor: PropTypes.string,\r\n crosshairOpacity: PropTypes.number,\r\n automaticTraining: PropTypes.bool,\r\n classificationId: PropTypes.string,\r\n project: PropTypes.object,\r\n setSelectedWithKey: PropTypes.func,\r\n startAutomaticTraining: PropTypes.func,\r\n giveWarning: PropTypes.func,\r\n setFUllyAnnotated: PropTypes.func,\r\n setAnnotated: PropTypes.func,\r\n showZStackBar: PropTypes.func,\r\n};\r\n\r\nexport default withTiles(withTheme(withStyles(styles)(CroppedImage)));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport withTheme from \"@mui/styles/withTheme\";\r\n\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst styles = {};\r\n\r\nclass SceneImage extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n componentDidMount = () => {};\r\n\r\n componentDidUpdate() {\r\n const { file, scroll, selectedWithKey, galleryMounted } = this.props;\r\n // if file is selected scroll to top\r\n if (file.selectedInGallery && (selectedWithKey || !galleryMounted)) {\r\n scroll(this.image.getBoundingClientRect().top);\r\n }\r\n }\r\n\r\n handleImageClick = (e) => {\r\n const { classificationId, files, file } = this.props;\r\n\r\n if (e.nativeEvent.which === 3) {\r\n // right click\r\n file.classId = classificationId[2];\r\n }\r\n if (e.nativeEvent.which === 1) {\r\n // left click\r\n file.classId = classificationId[1];\r\n }\r\n\r\n // make file selectedIngallery true and other files false\r\n files.forEach((f) => {\r\n f.selectedInGallery = false;\r\n });\r\n file.selectedInGallery = true;\r\n this.props.setSelectedWithKey(false);\r\n\r\n this.props.updateGallery();\r\n };\r\n\r\n getColorFromId = (classId) => {\r\n const { structures } = this.props;\r\n return structures.find((element) => element.id == classId).color;\r\n };\r\n\r\n getParentColor = () => {\r\n const { structures, selectedLayer } = this.props;\r\n return structures[selectedLayer].color;\r\n };\r\n\r\n render() {\r\n const { file, showFileNames } = this.props;\r\n\r\n return (\r\n \r\n \r\n {showFileNames ? file.fileName : \"\"}\r\n \r\n (this.image = i)}\r\n src={Backend.renderOriginalImage(file.sourcePath)}\r\n alt=\"\"\r\n onClick={this.handleImageClick}\r\n onContextMenu={(e) => {\r\n this.handleImageClick(e);\r\n e.preventDefault();\r\n }}\r\n />\r\n \r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nSceneImage.propTypes = {\r\n file: PropTypes.object,\r\n structures: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n imageSize: PropTypes.number,\r\n classificationId: PropTypes.array,\r\n scroll: PropTypes.func,\r\n files: PropTypes.array,\r\n updateGallery: PropTypes.func,\r\n setSelectedWithKey: PropTypes.func,\r\n selectedWithKey: PropTypes.bool,\r\n showFileNames: PropTypes.bool,\r\n galleryMounted: PropTypes.bool,\r\n};\r\n\r\nexport default withTheme(withStyles(styles)(SceneImage));\r\n","import React, { Component } from \"react\";\r\n\r\nimport PropTypes from \"prop-types\";\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\n\r\nclass AccuracyGraph extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n componentDidMount() {\r\n // draw graph with accuracy of single training iterations\r\n // draw horizontal lines with accuracy values (y-axis)\r\n const max = 255;\r\n let ctx = this.canvas.getContext(\"2d\");\r\n let w = this.canvas.width;\r\n let h = this.canvas.height;\r\n ctx.clearRect(0, 0, w, h);\r\n ctx.beginPath();\r\n let step = (50 * w) / max;\r\n ctx.font = \"10px Arial\";\r\n ctx.fillStyle = \"#ddd\";\r\n step = h / 5;\r\n for (let s = step, i = 1; s < h; s += step, i++) {\r\n ctx.moveTo(0, s);\r\n ctx.lineTo(w, s);\r\n ctx.fillText(100 - i * 20, 2, s - 2);\r\n }\r\n ctx.strokeStyle = \"#ddd\";\r\n ctx.closePath();\r\n ctx.stroke();\r\n\r\n // draw graph with accuracy points from training iterations\r\n if (this.props.tiles.getGraphAcc()[0]) {\r\n let ctx = this.canvas.getContext(\"2d\");\r\n\r\n let height = this.canvas.height;\r\n let y = this.props.tiles.getGraphAcc()[0];\r\n let factor = height / 100;\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(0, parseInt(-y * factor + height, 10));\r\n\r\n let arr = [];\r\n if (this.props.tiles.getGraphAcc().length <= 10) {\r\n arr = this.props.tiles.getGraphAcc();\r\n } else {\r\n let start = this.props.tiles.getGraphAcc().length - 10;\r\n arr = this.props.tiles.getGraphAcc().slice(start - 1);\r\n }\r\n\r\n // only show last 10 iterations\r\n let x = this.canvas.width / 10;\r\n let cWdt = this.canvas.width;\r\n arr.forEach(function (point) {\r\n ctx.lineTo(x, parseInt(-point * factor + height, 10));\r\n x = x + cWdt / 10;\r\n });\r\n\r\n ctx.strokeStyle = \"#FF0000\";\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n componentDidUpdate() {}\r\n\r\n UNSAFE_componentWillUpdate() {\r\n // draw graph with accuracy of single training iterations\r\n if (this.props.tiles.getGraphAcc()[0]) {\r\n // draw horizontal lines with accuracy values (y-axis)\r\n const max = 255;\r\n let ctx = this.canvas.getContext(\"2d\");\r\n let w = this.canvas.width;\r\n let h = this.canvas.height;\r\n ctx.clearRect(0, 0, w, h);\r\n ctx.beginPath();\r\n let step = (50 * w) / max;\r\n ctx.font = \"10px Arial\";\r\n ctx.fillStyle = \"#ddd\";\r\n step = h / 5;\r\n for (let s = step, i = 1; s < h; s += step, i++) {\r\n ctx.moveTo(0, s);\r\n ctx.lineTo(w, s);\r\n ctx.fillText(100 - i * 20, 2, s - 2);\r\n }\r\n ctx.strokeStyle = \"#ddd\";\r\n ctx.closePath();\r\n ctx.stroke();\r\n\r\n // draw graph with accuracy points from training iterations\r\n let height = this.canvas.height;\r\n let y = this.props.tiles.getGraphAcc()[0];\r\n let factor = height / 100;\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(0, parseInt(-y * factor + height, 10));\r\n\r\n let arr = [];\r\n if (this.props.tiles.getGraphAcc().length <= 10) {\r\n arr = this.props.tiles.getGraphAcc();\r\n } else {\r\n let start = this.props.tiles.getGraphAcc().length - 10;\r\n arr = this.props.tiles.getGraphAcc().slice(start - 1);\r\n }\r\n\r\n // only show last 10 iterations\r\n let x = this.canvas.width / 10;\r\n let cWdt = this.canvas.width;\r\n arr.forEach(function (point) {\r\n ctx.lineTo(x, parseInt(-point * factor + height, 10));\r\n x = x + cWdt / 10;\r\n });\r\n\r\n ctx.strokeStyle = \"#FF0000\";\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
(this.root = c)}>\r\n
\r\n Overall model progress:\r\n
\r\n (this.canvas = c)}\r\n />\r\n
\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nAccuracyGraph.propTypes = {\r\n ome: PropTypes.object,\r\n histogramConfig: PropTypes.object,\r\n visibleImage: PropTypes.array,\r\n coloredImages: PropTypes.array,\r\n bounds: PropTypes.object,\r\n // from withTiles\r\n tiles: PropTypes.object,\r\n};\r\n\r\n//export default withTheme(withStyles(styles)(AccuracyGraph));\r\nexport default withTiles(AccuracyGraph);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport Draggable from \"react-draggable\";\r\nimport { Resizable } from \"react-resizable\";\r\nimport classNames from \"classnames\";\r\n\r\nimport {\r\n Typography,\r\n Checkbox,\r\n Select,\r\n MenuItem,\r\n Tooltip,\r\n TextField,\r\n Card,\r\n Slider,\r\n List,\r\n ListItem,\r\n ListItemText,\r\n FormGroup,\r\n FormControlLabel,\r\n CircularProgress,\r\n Tabs,\r\n Tab,\r\n Button,\r\n} from \"@mui/material\";\r\n\r\nimport {\r\n ChatBubbleOutline,\r\n DragIndicator,\r\n Build,\r\n Keyboard,\r\n Mouse,\r\n} from \"@mui/icons-material\";\r\n\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faBrain } from \"@fortawesome/free-solid-svg-icons\";\r\n\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport { withPersistentStorage } from \"../contexts/PersistentStorageContext\";\r\nimport { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\r\nimport AccuracyGraph from \"./AccuracyGraph\";\r\nimport SketchColorPicker from \"./SketchColorPicker\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = () => ({\r\n tabsContainer: {\r\n width: \"100%\",\r\n },\r\n tab: {\r\n \"& *\": {\r\n display: \"inline-block\",\r\n fontSize: \"12px\",\r\n },\r\n \"& svg\": {\r\n marginRight: \"5px\",\r\n position: \"relative\",\r\n top: \"2px\",\r\n },\r\n },\r\n flexVerticalContainer: {\r\n display: \"flex\",\r\n flexFlow: \"column\",\r\n height: \"100%\",\r\n },\r\n flexRowContentHeight: {\r\n flex: \"0 1 auto\",\r\n padding: \"10px\",\r\n },\r\n flexRowRemainingHeight: {\r\n flex: \"1 1 auto\",\r\n overflowY: \"auto\",\r\n },\r\n spacing: {\r\n padding: \"10px\",\r\n paddingBottom: 0,\r\n },\r\n dragIndicator: {\r\n position: \"absolute\",\r\n color: \"#000000\",\r\n cursor: \"grab\",\r\n bottom: 5,\r\n right: 5,\r\n },\r\n grabbing: {\r\n cursor: \"grabbing\",\r\n },\r\n toolBox: {\r\n marginLeft: \"5px\",\r\n marginRight: \"10px\",\r\n marginTop: \"7px\",\r\n display: \"inline-block\",\r\n },\r\n aiLabel: {\r\n display: \"block\",\r\n position: \"absolute\",\r\n bottom: \"11px\",\r\n right: \"4px\",\r\n background: \"black\",\r\n color: \"white\",\r\n zIndex: 99999,\r\n padding: \"0 5px\",\r\n margin: 0,\r\n },\r\n imgOuter: {\r\n \"&:hover .aiLabel\": {\r\n display: \"none\",\r\n },\r\n },\r\n});\r\n\r\nclass GalleryToolBoxes extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n grabbing: false,\r\n toolbarSize: {\r\n width: 300,\r\n height:\r\n this.props.project &&\r\n !this.props.project.type.includes(\"HistoPointCounting\")\r\n ? 355\r\n : 525,\r\n },\r\n originalToolbarHeight: 355,\r\n comboBoxSizeOptions: [\r\n \"small (200px)\",\r\n \"medium (300px)\",\r\n \"large (600px)\",\r\n \"full width\",\r\n ],\r\n showContour: this.getShowContour(),\r\n showFileNames: true,\r\n drawCrosshair: this.props.showGallery ? false : true,\r\n crosshairColor: \"#FF0000\",\r\n crosshairOpacity: 1.0,\r\n crosshairLineWidth: 1,\r\n activeTab: 0,\r\n automaticTraining: false,\r\n };\r\n }\r\n\r\n getShowContour = () => {\r\n // checks default value for draw contour checkbox for specific modules\r\n const { setDrawContour } = this.props;\r\n if (this.props.showGallery) {\r\n if (this.getProjectLabel() === \"Polarity - Gallery\") {\r\n setDrawContour(false);\r\n return false;\r\n } else if (this.getProjectLabel() === \"Active Learning - Gallery\") {\r\n setDrawContour(false);\r\n return false;\r\n } else if (this.props.project.type.includes(\"HistoPointCounting\")) {\r\n setDrawContour(false);\r\n return false;\r\n } else {\r\n setDrawContour(true);\r\n return true;\r\n }\r\n } else {\r\n setDrawContour(false);\r\n return false;\r\n }\r\n };\r\n\r\n getProjectLabel = () => {\r\n // returns project label form viewerconfig\r\n if (this.props.viewerConfig) {\r\n return this.props.viewerConfig.project.label;\r\n }\r\n };\r\n\r\n isScrollbarVisible = () => {\r\n let el = document.getElementById(\"subtypesDiv\");\r\n if (el !== null) {\r\n return el.scrollHeight > el.clientHeight;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n onResize = (event, { size }) => {\r\n let minSizeHeight = 200;\r\n size.height = size.height < minSizeHeight ? minSizeHeight : size.height;\r\n this.setState({ toolbarSize: size });\r\n };\r\n\r\n handleChangeContour = (e) => {\r\n const { setDrawContour } = this.props;\r\n setDrawContour(e.target.checked ? true : false);\r\n this.setState({ showContour: e.target.checked ? true : false });\r\n };\r\n\r\n handleChangeShowFileNames = (e) => {\r\n const { setShowFileNames } = this.props;\r\n setShowFileNames(e.target.checked ? true : false);\r\n this.setState({ showFileNames: e.target.checked ? true : false });\r\n };\r\n\r\n handleChangeCombo = (e) => {\r\n // change canvas size\r\n if (e.target.value === 1) {\r\n this.props.projectContext.setState({ galleryImageSize: 200 });\r\n } else if (e.target.value === 2) {\r\n this.props.projectContext.setState({ galleryImageSize: 300 });\r\n } else if (e.target.value === 3) {\r\n this.props.projectContext.setState({ galleryImageSize: 600 });\r\n } else {\r\n this.props.projectContext.setState({ galleryImageSize: -1 });\r\n }\r\n this.setFirstTimeGallery();\r\n this.forceUpdate();\r\n };\r\n\r\n setFirstTimeGallery = () => {\r\n // firstTimeGallery = true --> load new tiles\r\n this.props.roiLayers[this.props.selectedLayer].layer.regionRois.forEach(\r\n function (element) {\r\n element.firstTimeGallery = true;\r\n }\r\n );\r\n };\r\n\r\n getStructuresForDropDown = () => {\r\n const { structures, selectedLayer } = this.props;\r\n\r\n let parentIndex = selectedLayer;\r\n if (structures[selectedLayer].classificationSubtype) {\r\n parentIndex = this.findParentIndex();\r\n }\r\n\r\n let childs = structures.filter(\r\n (element) =>\r\n element.parentId === structures[parentIndex].id &&\r\n element.label !== \"leer [leer]\"\r\n );\r\n childs.unshift(structures[parentIndex]);\r\n return childs;\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return direct classification subtypes of selected structure\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n findParentIndex = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // returns index of parentstructure in all structures\r\n let parentIndex = structures.findIndex(\r\n (element) => element.id === structures[selectedLayer].parentId\r\n );\r\n return parentIndex;\r\n };\r\n\r\n handleChangeFilteredStructure = (e) => {\r\n const { structures, selectedLayer } = this.props;\r\n\r\n let parentIndex = selectedLayer;\r\n if (structures[selectedLayer].classificationSubtype) {\r\n parentIndex = this.findParentIndex();\r\n }\r\n\r\n // find index of leer --> add 1 of all childs after leer\r\n // get index of class leer in childs\r\n let childs = this.findChilds(structures[parentIndex]);\r\n let emptyIdx = childs.findIndex(\r\n (element) => element.label === \"leer [leer]\"\r\n );\r\n let idx = e.target.value;\r\n if (emptyIdx >= 0 && e.target.value >= emptyIdx + 1) {\r\n idx = idx + 1;\r\n }\r\n\r\n this.props.onSelectLayer(parentIndex + idx);\r\n this.props.tiles.setStructure(structures[parentIndex + idx]);\r\n };\r\n\r\n handleChangeCrosshair = (e, fromKeyPress) => {\r\n const { setDrawCrosshair } = this.props;\r\n if (fromKeyPress) {\r\n this.setState({ drawCrosshair: this.state.drawCrosshair ? false : true });\r\n setDrawCrosshair(this.state.drawCrosshair ? false : true);\r\n } else {\r\n this.setState({ drawCrosshair: e.target.checked ? true : false });\r\n setDrawCrosshair(e.target.checked ? true : false);\r\n }\r\n };\r\n\r\n handleChangeActiveTab = (event, value) => {\r\n const { setAutomaticTraining } = this.props;\r\n this.setState({ activeTab: value });\r\n setAutomaticTraining(value === 1 ? true : false);\r\n };\r\n\r\n startTraining = (activeLearning) => {\r\n const { structures, selectedLayer } = this.props;\r\n // start training for dl model\r\n\r\n // check if selectedLayer is parent\r\n if (structures[selectedLayer].classificationSubtype) {\r\n this.props.trainingWarning(\"subtype\");\r\n return;\r\n }\r\n\r\n // check if structure has childs\r\n // check if selectedLayer is parent\r\n if (!structures[selectedLayer].hasChild) {\r\n this.props.trainingWarning(\"hasNoChilds\");\r\n return;\r\n }\r\n\r\n // check if enough objects per class\r\n let childs = this.findClassificationChilds();\r\n let enoughAnnos = this.enoughAnnotations(childs);\r\n if (!enoughAnnos) {\r\n this.props.trainingWarning(\"tooFewAnnotations\");\r\n return;\r\n }\r\n\r\n this.props.saveChangesGallery();\r\n this.props.setAlruns(true);\r\n let passiveLearning = activeLearning ? false : true;\r\n this.props.applyDL(\r\n this.props.tools[\"alm_gallery_tool\"],\r\n this.props.projectId,\r\n this.props.fileId,\r\n passiveLearning\r\n );\r\n };\r\n\r\n findClassificationChilds = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // return direct classification subtypes\r\n return structures.filter(\r\n (element) =>\r\n element.parentId === structures[selectedLayer].id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n enoughAnnotations = (childs) => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n // check if enough annotations for training of dl model (at least one class with 5 annotations and one other class with 1 annotation)\r\n let minFive = false;\r\n let twoAnnotated = 0;\r\n childs.forEach((element) => {\r\n // get number of elements for child\r\n let numberElements = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (roi) => roi.structureId === element.id\r\n ).length;\r\n\r\n // check if minimum of five in one class\r\n if (numberElements >= 5) {\r\n minFive = true;\r\n }\r\n // check if two classes with at least one element\r\n if (numberElements >= 1) {\r\n twoAnnotated = twoAnnotated + 1;\r\n }\r\n });\r\n\r\n // if one class with at least five and one other class with at least one annotation --> enough annotations for training\r\n let enough = false;\r\n if (minFive && twoAnnotated >= 2) {\r\n enough = true;\r\n }\r\n return enough;\r\n };\r\n\r\n applyModel = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // apply trained dl model to selected structure unlabeled images\r\n\r\n // check if selectedLayer is parent\r\n if (structures[selectedLayer].classificationSubtype) {\r\n this.props.trainingWarning(\"subtype\");\r\n return;\r\n }\r\n\r\n // check if structure has childs\r\n // check if selectedLayer is parent\r\n if (!structures[selectedLayer].hasChild) {\r\n this.props.trainingWarning(\"hasNoChilds\");\r\n return;\r\n }\r\n\r\n // make warning that not changing layer while applying model\r\n window.showWarningSnackbar(\r\n \"Please do not change structure while applying the model.\"\r\n );\r\n\r\n this.props.saveChangesGallery();\r\n this.props.setAlruns(true);\r\n let passiveLearning = true;\r\n let applyModel = true;\r\n this.props.applyDL(\r\n this.props.tools[\"alm_gallery_tool\"],\r\n this.props.projectId,\r\n this.props.fileId,\r\n passiveLearning,\r\n applyModel\r\n );\r\n };\r\n\r\n handleChangeMakePredictions = (e) => {\r\n const { setApplyModelAfterTraining } = this.props;\r\n // change state of make predictions after training\r\n setApplyModelAfterTraining(e.target.checked ? true : false);\r\n };\r\n\r\n checkToolInConfig = (toolName) => {\r\n // checks if tool exists in viewerconfig\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n };\r\n\r\n render() {\r\n const {\r\n classes,\r\n selectedLayer,\r\n structures,\r\n roiLayers,\r\n childsGallery,\r\n childs,\r\n classificationId,\r\n showGallery,\r\n page,\r\n setCrosshairColor,\r\n setCrosshairOpacity,\r\n setCrosshairLineWidth,\r\n isFilesGallery,\r\n } = this.props;\r\n const { grabbing, activeTab, comboBoxSizeOptions } = this.state;\r\n\r\n let comboBoxSizeValue = comboBoxSizeOptions.filter((option) =>\r\n option.includes(String(this.props.projectContext.galleryImageSize))\r\n )[0];\r\n\r\n if (this.props.projectContext.galleryImageSize == -1) {\r\n comboBoxSizeValue = \"full width\";\r\n }\r\n\r\n return (\r\n
\r\n {showGallery && (\r\n this.setState({ grabbing: true })}\r\n onStop={() => this.setState({ grabbing: false })}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n Preview size\r\n \r\n \r\n \r\n {comboBoxSizeValue}\r\n \r\n small (200px)\r\n medium (300px)\r\n large (600px)\r\n {isFilesGallery && (\r\n full width\r\n )}\r\n \r\n \r\n\r\n {this.props.project.type.includes(\"HistoPointCounting\") && (\r\n \r\n Filter structure:\r\n element.id === structures[selectedLayer].id\r\n )}\r\n onChange={this.handleChangeFilteredStructure}\r\n >\r\n {this.getStructuresForDropDown().map((structure, idx) => (\r\n \r\n {structure.label}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n\r\n {!this.props.project.type.includes(\"HistoPointCounting\") &&\r\n !isFilesGallery && (\r\n \r\n }\r\n />\r\n )}\r\n\r\n \r\n \r\n \r\n {!this.props.project.type.includes(\r\n \"HistoPointCounting\"\r\n ) && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {childsGallery.map((child, index) => (\r\n {\r\n let x = {\r\n name: child.label,\r\n color: child.color,\r\n id: child.id,\r\n };\r\n let structureId = structures[selectedLayer].id;\r\n if (\r\n e.nativeEvent.which === 3 &&\r\n classificationId[1] !== child.id\r\n ) {\r\n // right click\r\n this.props.tiles.setSingleSubtype(\r\n structureId,\r\n x,\r\n 1\r\n );\r\n classificationId[2] = child.id;\r\n } else if (\r\n e.nativeEvent.which === 1 &&\r\n classificationId[2] !== child.id\r\n ) {\r\n // left click\r\n this.props.tiles.setSingleSubtype(\r\n structureId,\r\n x,\r\n 0\r\n );\r\n classificationId[1] = child.id;\r\n }\r\n this.forceUpdate();\r\n }}\r\n >\r\n \r\n {!this.props.project.type.includes(\r\n \"HistoPointCounting\"\r\n ) &&\r\n child.id === classificationId[1] && (\r\n \r\n L\r\n \r\n )}\r\n {!this.props.project.type.includes(\r\n \"HistoPointCounting\"\r\n ) &&\r\n child.id === classificationId[2] && (\r\n \r\n R\r\n \r\n )}\r\n \r\n {!this.props.project.type.includes(\r\n \"HistoPointCounting\"\r\n )\r\n ? index\r\n : index + 1}\r\n \r\n \r\n ))}\r\n \r\n
\r\n\r\n {!this.props.project.type.includes(\"HistoPointCounting\") &&\r\n isFilesGallery && (\r\n \r\n }\r\n />\r\n )}\r\n\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {showGallery && this.checkToolInConfig(\"GalleryTrainingTool\") && (\r\n this.setState({ grabbing: true })}\r\n onStop={() => this.setState({ grabbing: false })}\r\n >\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n Training information:\r\n \r\n\r\n
\r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n {\"Epochs: \" + this.props.progressText}\r\n \r\n\r\n
\r\n\r\n \r\n {\"Accuracy: \" +\r\n Math.round(parseFloat(this.props.trainingAcc) * 100) +\r\n \"%\"}\r\n \r\n\r\n
\r\n\r\n {activeTab === 1 && (\r\n
\r\n \r\n \r\n Annotations for next training:\r\n \r\n \r\n {\r\n this.props.setStartData(Number(e.target.value));\r\n }}\r\n onMouseEnter={() => {\r\n document.getElementById(\"nAnnos\").disabled = false;\r\n this.props.tiles.setOnPageInput(true);\r\n }}\r\n onMouseLeave={() => {\r\n this.props.tiles.setOnPageInput(false);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n //not tested, because not in use\r\n this.props.tiles.setOnPageInput(false);\r\n document.getElementById(\"nAnnos\").disabled = true;\r\n }\r\n }}\r\n />\r\n
\r\n
\r\n )}\r\n\r\n \r\n\r\n {activeTab === 0 && (\r\n
\r\n \r\n }\r\n />\r\n\r\n this.startTraining()}\r\n >\r\n Train model\r\n \r\n\r\n this.applyModel()}\r\n >\r\n Apply model\r\n \r\n
\r\n )}\r\n\r\n {activeTab === 1 && (\r\n this.startTraining(true)}\r\n >\r\n Train and apply model\r\n \r\n )}\r\n\r\n {this.props.alruns && activeTab === 1 && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n )}\r\n\r\n {!this.props.showGallery && (\r\n this.setState({ grabbing: true })}\r\n onStop={() => this.setState({ grabbing: false })}\r\n >\r\n \r\n \r\n \r\n \r\n\r\n \r\n Show crosshair:\r\n \r\n \r\n
\r\n \r\n Crosshair color:\r\n \r\n
\r\n {\r\n this.setState({ crosshairColor: color });\r\n setCrosshairColor(color);\r\n }}\r\n />\r\n
\r\n
\r\n \r\n Opacity crosshair:\r\n \r\n {\r\n this.setState({ crosshairOpacity: newValue / 100 });\r\n setCrosshairOpacity(newValue / 100);\r\n }}\r\n />\r\n
\r\n \r\n Crosshair linewidth:\r\n \r\n {\r\n this.setState({ crosshairLineWidth: Number(e.target.value) });\r\n setCrosshairLineWidth(Number(e.target.value));\r\n }}\r\n inputProps={{\r\n step: 1,\r\n min: 0,\r\n max: 30,\r\n type: \"number\",\r\n }}\r\n />\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n {childs.map((child, index) => (\r\n {\r\n if (\r\n e.nativeEvent.which === 3 &&\r\n classificationId[1] !== child.id\r\n ) {\r\n // right click\r\n classificationId[2] = child.id;\r\n } else if (\r\n e.nativeEvent.which === 1 &&\r\n classificationId[2] !== child.id\r\n ) {\r\n // left click\r\n classificationId[1] = child.id;\r\n }\r\n this.forceUpdate();\r\n }}\r\n >\r\n \r\n {child.id === classificationId[1] && (\r\n \r\n L\r\n \r\n )}\r\n {child.id === classificationId[2].id && (\r\n \r\n R\r\n \r\n )}\r\n \r\n {index + 1}\r\n \r\n \r\n ))}\r\n \r\n \r\n\r\n \r\n \r\n \r\n )}\r\n\r\n {!this.props.showGallery && (\r\n this.setState({ grabbing: true })}\r\n onStop={() => this.setState({ grabbing: false })}\r\n >\r\n \r\n \r\n \r\n \r\n\r\n {\r\n roiLayers[selectedLayer].layer.regionRois[page].comment =\r\n e.target.value;\r\n this.forceUpdate();\r\n }}\r\n onMouseEnter={() => {\r\n document.getElementById(\"roiComment\").disabled = false;\r\n this.props.tiles.setOnPageInput(true);\r\n }}\r\n onMouseLeave={() => {\r\n this.props.tiles.setOnPageInput(false);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n // not tested, because not in use\r\n this.props.tiles.setOnPageInput(false);\r\n document.getElementById(\"roiComment\").disabled = true;\r\n }\r\n }}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n }\r\n}\r\n\r\nGalleryToolBoxes.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n roiLayers: PropTypes.array,\r\n structures: PropTypes.array,\r\n showGallery: PropTypes.bool,\r\n setDrawContour: PropTypes.func,\r\n setShowFileNames: PropTypes.func,\r\n viewerConfig: PropTypes.object,\r\n tiles: PropTypes.object,\r\n tools: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n page: PropTypes.number,\r\n projectId: PropTypes.string,\r\n fileId: PropTypes.string,\r\n classificationId: PropTypes.array,\r\n onSelectLayer: PropTypes.func,\r\n setDrawCrosshair: PropTypes.func,\r\n setAutomaticTraining: PropTypes.func,\r\n trainingWarning: PropTypes.func,\r\n saveChangesGallery: PropTypes.func,\r\n setAlruns: PropTypes.func,\r\n applyDL: PropTypes.func,\r\n setApplyModelAfterTraining: PropTypes.func,\r\n setCrosshairColor: PropTypes.func,\r\n setCrosshairOpacity: PropTypes.func,\r\n setCrosshairLineWidth: PropTypes.func,\r\n childsGallery: PropTypes.array,\r\n childs: PropTypes.array,\r\n progressText: PropTypes.string,\r\n trainingAcc: PropTypes.string,\r\n startData: PropTypes.number,\r\n setStartData: PropTypes.func,\r\n makePredictions: PropTypes.bool,\r\n alruns: PropTypes.bool,\r\n isFilesGallery: PropTypes.bool,\r\n projectContext: PropTypes.object,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withPersistentStorage(withTiles(withStyles(styles)(GalleryToolBoxes)))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n Grid,\r\n TablePagination,\r\n Tooltip,\r\n //TextField,\r\n CircularProgress,\r\n} from \"@mui/material\";\r\n\r\nimport { withTiles } from \"../contexts/TilesContext\";\r\nimport { withPersistentStorage } from \"../contexts/PersistentStorageContext\";\r\nimport { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\r\nimport CroppedImage from \"./CroppedImage\";\r\nimport SceneImage from \"./SceneImage\";\r\nimport GalleryToolBoxes from \"./GalleryToolBoxes\";\r\nimport { getParentIndexLayer } from \"../utils/StructuresUtils\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = () => ({\r\n tabsContainer: {\r\n width: \"100%\",\r\n },\r\n tab: {\r\n minWidth: 345 / 3,\r\n \"& *\": {\r\n display: \"inline-block\",\r\n fontSize: \"20px\",\r\n lineHeight: \"18px\",\r\n },\r\n \"& svg\": {\r\n marginRight: \"5px\",\r\n position: \"relative\",\r\n top: \"2px\",\r\n },\r\n },\r\n flexVerticalContainer: {\r\n display: \"flex\",\r\n flexFlow: \"column\",\r\n height: \"100%\",\r\n },\r\n flexRowContentHeight: {\r\n flex: \"0 1 auto\",\r\n padding: \"10px\",\r\n },\r\n flexRowRemainingHeight: {\r\n flex: \"1 1 auto\",\r\n overflowY: \"auto\",\r\n },\r\n spacing: {\r\n padding: \"10px\",\r\n paddingBottom: 0,\r\n },\r\n dragIndicator: {\r\n position: \"absolute\",\r\n color: \"#000000\",\r\n cursor: \"grab\",\r\n bottom: 5,\r\n right: 5,\r\n },\r\n grabbing: {\r\n cursor: \"grabbing\",\r\n },\r\n toolBox: {\r\n marginLeft: \"5px\",\r\n marginRight: \"10px\",\r\n marginTop: \"7px\",\r\n display: \"inline-block\",\r\n },\r\n aiLabel: {\r\n display: \"block\",\r\n position: \"absolute\",\r\n bottom: \"11px\",\r\n right: \"4px\",\r\n background: \"black\",\r\n color: \"white\",\r\n zIndex: 99999,\r\n padding: \"0 5px\",\r\n margin: 0,\r\n },\r\n imgOuter: {\r\n \"&:hover .aiLabel\": {\r\n display: \"none\",\r\n },\r\n },\r\n});\r\n\r\nclass Gallery extends Component {\r\n constructor(props) {\r\n super(props);\r\n // transmit context to componentRef\r\n if (props.componentRef) props.componentRef(this);\r\n\r\n this.state = {\r\n page: 0,\r\n rowsPerPage: this.getRowsPerPageForProject(),\r\n drawContour: false,\r\n showFileNames: true,\r\n galleryMounted: false,\r\n drawCrosshair: this.props.showGallery ? false : true,\r\n crosshairColor: \"#FF0000\",\r\n crosshairOpacity: 1.0,\r\n crosshairLineWidth: 1,\r\n canvasSize: this.props.showGallery ? 300 : 750,\r\n startData: 50,\r\n automaticTraining: false,\r\n elementCount: 0,\r\n z: 0,\r\n t: 0,\r\n playingZ: false,\r\n zsr: 60,\r\n playDirectionZ: 1,\r\n selectedWithKey: false,\r\n isBrightfield:\r\n this.props.ome &&\r\n this.props.ome.channels.length === 1 &&\r\n this.props.ome.channels[0].type === \"brightfield\",\r\n objectToLoad: {\r\n index: 0,\r\n roi: null,\r\n rois: [],\r\n },\r\n progressText: \"0/50\",\r\n trainingAcc: \"0\",\r\n };\r\n\r\n this.enoughAnnosCount = 0;\r\n this.tile = [];\r\n this.pageIndex = 0;\r\n this.classificationId = [0, 0, 0];\r\n this.pageInput = \"\";\r\n this.validationAcc = 0;\r\n }\r\n\r\n setDrawContour = (e) => {\r\n // set value from toolbox component\r\n this.setState({ drawContour: e });\r\n };\r\n\r\n setShowFileNames = (e) => {\r\n // set value from toolbox component\r\n this.setState({ showFileNames: e });\r\n };\r\n\r\n setAutomaticTraining = (e) => {\r\n // set value from toolbox component\r\n this.setState({ automaticTraining: e });\r\n };\r\n\r\n setDrawCrosshair = (e) => {\r\n // set value from toolbox component\r\n this.setState({ drawCrosshair: e });\r\n };\r\n\r\n setCrosshairColor = (e) => {\r\n // set value from toolbox component\r\n this.setState({ crosshairColor: e });\r\n };\r\n\r\n setCrosshairOpacity = (e) => {\r\n // set value from toolbox component\r\n this.setState({ crosshairOpacity: e });\r\n };\r\n\r\n setCrosshairLineWidth = (e) => {\r\n // set value from toolbox component\r\n this.setState({ crosshairLineWidth: e });\r\n };\r\n\r\n setStartData = (e) => {\r\n // set value from toolbox component\r\n this.setState({ startData: e });\r\n };\r\n\r\n componentDidMount() {\r\n this.setElementCount();\r\n setTimeout(() => {\r\n this.setState({ galleryMounted: true });\r\n }, 1000);\r\n }\r\n\r\n allImagesLoaded = () => {\r\n const { tiles } = this.props;\r\n // check if all images finished loading\r\n let allImagesComplete = true;\r\n for (let value of Object.values(tiles.getVisibleImages())) {\r\n if (!value.complete) {\r\n allImagesComplete = false;\r\n }\r\n }\r\n return allImagesComplete;\r\n };\r\n\r\n setObjectToLoad = (fromChangePage, fromMount) => {\r\n const { structures, roiLayers, selectedLayer } = this.props;\r\n // set next roi for loading its images from backend or cache\r\n\r\n let idx = 0;\r\n let loadedRois;\r\n if (fromMount) {\r\n // if component mounts\r\n if (this.props.showGallery) {\r\n idx =\r\n this.props.tiles.getPage(structures[selectedLayer].id) *\r\n this.state.rowsPerPage;\r\n } else {\r\n idx =\r\n this.props.tiles.getTilePage(structures[selectedLayer].id) *\r\n this.state.rowsPerPage;\r\n }\r\n loadedRois = [];\r\n } else {\r\n // if objectToLoad was already set\r\n let pg;\r\n if (this.props.showGallery) {\r\n pg = this.props.tiles.getPage(structures[selectedLayer].id);\r\n } else {\r\n pg = this.props.tiles.getTilePage(structures[selectedLayer].id);\r\n }\r\n idx = fromChangePage\r\n ? pg * this.state.rowsPerPage\r\n : this.state.objectToLoad.index + 1;\r\n // get rois that are already loaded\r\n loadedRois = this.state.objectToLoad.rois;\r\n }\r\n\r\n // get next roi\r\n let roi;\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n if (this.props.project.type.includes(\"HistoPointCounting\")) {\r\n roi = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (element) =>\r\n element.isSubtype && element.subtypeName !== \"leer [leer]\"\r\n )[idx];\r\n } else {\r\n roi = roiLayers[selectedLayer].layer.regionRois[idx];\r\n }\r\n } else {\r\n // get subtypeRois\r\n let parentIdx = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n let subtypeRois = roiLayers[parentIdx].layer.regionRois.filter(\r\n (element) => this.isRoiSubtype(element)\r\n );\r\n roi = subtypeRois[idx];\r\n }\r\n\r\n // push new roi to loaded rois\r\n if (!loadedRois.includes(roi) && roi) {\r\n loadedRois.push(roi);\r\n }\r\n\r\n // new objectToLoad\r\n let x = {\r\n index: idx,\r\n roi: roi,\r\n rois: loadedRois,\r\n };\r\n this.setState({ objectToLoad: x });\r\n };\r\n\r\n getRowsPerPageForProject() {\r\n // checks default value for rows per page for specific modules\r\n if (this.props.showGallery) {\r\n if (this.getProjectLabel() === \"Polarity - Gallery\") {\r\n return 10;\r\n } else if (this.getProjectLabel() === \"Tiles Tool\") {\r\n return 18;\r\n } else {\r\n return 10;\r\n }\r\n } else {\r\n return 1;\r\n }\r\n }\r\n\r\n getRowsPerPageOptionsForProject() {\r\n // checks default value for rows per page options for specific modules\r\n if (this.props.showGallery) {\r\n if (this.getProjectLabel() === \"Polarity - Gallery\") {\r\n return [10, 15];\r\n } else if (this.getProjectLabel() === \"Tiles Tool\") {\r\n return [18];\r\n } else {\r\n return [10, 20];\r\n }\r\n } else {\r\n return [1];\r\n }\r\n }\r\n\r\n getProjectLabel = () => {\r\n // returns project label from viewerconfig\r\n if (this.props.viewerConfig) {\r\n return this.props.viewerConfig.project.label;\r\n }\r\n };\r\n\r\n findParentIndex = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // returns index of parentstructure in all structures\r\n let parentIndex = structures.findIndex(\r\n (element) => element.id === structures[selectedLayer].parentId\r\n );\r\n return parentIndex;\r\n };\r\n\r\n checkToolInConfig = (toolName) => {\r\n // checks if tool exists in viewerconfig\r\n if (this.props.viewerConfig) {\r\n if (this.props.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n };\r\n\r\n setElementCount = () => {\r\n const { structures, selectedLayer, roiLayers, project } = this.props;\r\n\r\n let elCnt = 0;\r\n let structure = structures[selectedLayer];\r\n if (\r\n this.props.viewerConfig.project.projectStringProperties[\"ViewerType\"] !==\r\n \"FilesGallery\"\r\n ) {\r\n // calculate number of elements in selected layer\r\n if (structure.isSubtype && structure.classificationSubtype) {\r\n // get all childNames to find rois\r\n let childNames = [];\r\n this.findAllSubtypes(true).forEach((element) => {\r\n childNames.push(element.label);\r\n });\r\n // get number of rois of subtypes in parent layer\r\n let parentIndex = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n elCnt = roiLayers[parentIndex].layer.regionRois.filter(\r\n (element) =>\r\n element.isSubtype &&\r\n (childNames.includes(element.subtypeName) ||\r\n element.subtypeName === structure.label)\r\n ).length;\r\n } else {\r\n if (project.type.includes(\"HistoPointCounting\")) {\r\n // count only subtype objects\r\n elCnt = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (element) =>\r\n element.isSubtype && element.subtypeName !== \"leer [leer]\"\r\n ).length;\r\n } else {\r\n // count all objects in parent layer\r\n elCnt = roiLayers[selectedLayer].layer.regionRois.length;\r\n }\r\n }\r\n this.state.elementCount !== elCnt &&\r\n this.setState({ elementCount: elCnt });\r\n } else {\r\n // calculate number of files that belong to selected class\r\n if (structure.classificationSubtype) {\r\n // get all childNames to find rois\r\n let childIds = [];\r\n this.findAllSubtypes(true).forEach((element) => {\r\n childIds.push(element.id);\r\n });\r\n childIds.push(structure.id); // add selected structure\r\n elCnt = project.files.filter(\r\n (element) => element.classId && childIds.includes(element.classId)\r\n ).length;\r\n } else {\r\n elCnt = project.files.length;\r\n }\r\n\r\n this.state.elementCount !== elCnt &&\r\n this.setState({ elementCount: elCnt });\r\n }\r\n };\r\n\r\n componentDidUpdate() {\r\n const { structures, selectedLayer } = this.props;\r\n // get subtypes for selected structure\r\n let subtypes = this.props.tiles.getSubtypes(structures[selectedLayer].id);\r\n // set colors for subtypes\r\n if (subtypes[0]) {\r\n this.classificationId[1] = subtypes[0].id;\r\n }\r\n if (subtypes[1]) {\r\n this.classificationId[2] = subtypes[1].id;\r\n }\r\n this.classificationId[0] = structures[selectedLayer].id;\r\n }\r\n\r\n updateGallery = () => {\r\n // update gallery (from cropped image)\r\n this.forceUpdate();\r\n };\r\n\r\n UNSAFE_componentWillMount() {\r\n const { selectedObjects, structures, selectedLayer } = this.props;\r\n\r\n // push saved acc points to context\r\n if (this.props.tiles.getAccPoints().length === 0) {\r\n for (let i = 0; i < selectedObjects.coordinates.length; i++) {\r\n let acc = selectedObjects.coordinates[i][\"acc\"];\r\n if (Math.round(selectedObjects.coordinates[i][\"acc\"]) !== -1) {\r\n this.props.tiles.pushAccPoint(acc * 100);\r\n }\r\n }\r\n // set first iteration false if there were AL iteratoins before\r\n if (selectedObjects.coordinates.length > 1) {\r\n this.props.tiles.setFirstIteration(false);\r\n }\r\n }\r\n\r\n // set context annotations count\r\n if (this.props.tiles.getStrAnnoCount().length === 0) {\r\n let object = this.props.persistentStorage.load(\"contextObject\");\r\n if (object && object.length === this.props.structures.length) {\r\n this.props.tiles.setAnnoCount(object);\r\n } else {\r\n this.setAnnotationsContext();\r\n }\r\n }\r\n\r\n // set context slected subtypes and pages\r\n if (this.props.tiles.getSubtypesPages().length === 0) {\r\n let object = this.props.persistentStorage.load(\"subtypesPagesObject\");\r\n if (object && object.length === this.props.structures.length) {\r\n this.props.tiles.setSubtypesPages(object);\r\n } else {\r\n this.setSubtypesPagesContext();\r\n }\r\n }\r\n\r\n // set context for accuracy graph\r\n if (this.props.tiles.getGraphAcc().length === 0) {\r\n let object = this.props.persistentStorage.load(\"accGraphObject\");\r\n if (object) {\r\n this.props.tiles.setGraphAcc(object);\r\n }\r\n }\r\n\r\n // check if new dynamic structure\r\n if (this.props.tiles.getSubtypesPages().length !== structures.length) {\r\n this.setDynamicStructure();\r\n }\r\n\r\n // set page in context\r\n let page = 0;\r\n if (this.props.showGallery) {\r\n page = this.props.tiles.getPage(structures[selectedLayer].id);\r\n } else {\r\n page = this.props.tiles.getTilePage(structures[selectedLayer].id);\r\n }\r\n\r\n if (this.state.page !== page) {\r\n this.setState({ page: page });\r\n }\r\n\r\n this.setSubtypeValues();\r\n\r\n // set objectToLoad\r\n this.setObjectToLoad(false, true);\r\n\r\n // set special image size for tiles project module\r\n if (!this.props.showGallery) {\r\n this.props.projectContext.setState({ galleryImageSize: 750 });\r\n }\r\n }\r\n\r\n setDynamicStructure = () => {\r\n const { structures } = this.props;\r\n // put new dynamic structure to context\r\n\r\n // get index of new dynamic structure\r\n let dynamicIndex = 0;\r\n structures.forEach((element, idx) => {\r\n let sameId = this.props.tiles\r\n .getSubtypesPages()\r\n .filter((str) => str.id === element.id);\r\n if (sameId > -1) {\r\n dynamicIndex = idx;\r\n }\r\n });\r\n\r\n // put dynamic structure to context object\r\n this.props.tiles.pushDynamicStructureSP(\r\n structures[dynamicIndex],\r\n dynamicIndex\r\n );\r\n this.props.tiles.pushDynamicStructureAC(\r\n structures[dynamicIndex].id,\r\n dynamicIndex\r\n );\r\n };\r\n\r\n setAnnotationsContext = () => {\r\n const { structures } = this.props;\r\n // create context for annotationCount\r\n let lenStructures = structures.length;\r\n for (let i = 0; i < lenStructures; i++) {\r\n this.props.tiles.pushStrAnnoCount(structures[i].id);\r\n }\r\n };\r\n\r\n setSubtypesPagesContext = () => {\r\n const { structures } = this.props;\r\n // create context selected subtypes an pages\r\n let lenStructures = structures.length;\r\n for (let i = 0; i < lenStructures; i++) {\r\n this.props.tiles.pushSubtypesPages(structures[i].label, structures[i].id);\r\n }\r\n };\r\n\r\n findAllSubtypes = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // get all subtypes of selectedLayer (also subsubtypes)\r\n\r\n // first get all direct childs\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n let allChilds = [];\r\n\r\n // search for childs of childa until no childs are checked for childs\r\n while (childs.length !== 0) {\r\n // code block to be executed\r\n childs = childs.concat(this.findChilds(childs[0]));\r\n if (!allChilds.includes(childs[0]) && childs[0].classificationSubtype) {\r\n allChilds.push(childs[0]);\r\n }\r\n childs.shift();\r\n }\r\n return allChilds;\r\n };\r\n\r\n setSubtypeValues = () => {\r\n const { structures, selectedLayer } = this.props;\r\n\r\n // get selected subtypes for classification\r\n let subtypesInContext =\r\n this.props.tiles.getSubtypes(structures[selectedLayer].id).length !== 0;\r\n\r\n if (subtypesInContext) {\r\n // set classificationIds\r\n let subtypes = this.props.tiles.getSubtypes(structures[selectedLayer].id);\r\n\r\n // set ida for subtypes\r\n if (subtypes[0]) {\r\n this.classificationId[1] = subtypes[0].id;\r\n }\r\n if (subtypes[1]) {\r\n this.classificationId[2] = subtypes[1].id;\r\n }\r\n this.classificationId[0] = structures[selectedLayer].id;\r\n } else {\r\n // put subtypes to context if not in context yet\r\n let subtype_1;\r\n subtype_1 = this.findChilds(structures[selectedLayer]);\r\n let twoSubtypes = subtype_1.slice(0, 2);\r\n this.props.tiles.setSubtypes(structures[selectedLayer].id, twoSubtypes);\r\n }\r\n };\r\n\r\n getSubtypes = () => {\r\n const { structures, selectedLayer } = this.props;\r\n // get direct classification subtypes of selected structure\r\n let subtypes;\r\n subtypes = structures.filter(\r\n (element) =>\r\n element.classificationSubtype &&\r\n element.parentId === structures[selectedLayer].id\r\n );\r\n return subtypes;\r\n };\r\n\r\n UNSAFE_componentWillUpdate(nextProps) {\r\n const { selectedObjects, structures, selectedLayer, roiLayers } =\r\n this.props;\r\n\r\n // set isBrightfield if ome is null\r\n if (this.props.ome === null && nextProps.ome !== null) {\r\n this.setState({\r\n isBrightfield:\r\n nextProps.ome &&\r\n nextProps.ome.channels.length === 1 &&\r\n nextProps.ome.channels[0].type === \"brightfield\",\r\n });\r\n }\r\n\r\n // set subtypes for classification\r\n this.setSubtypeValues();\r\n\r\n // if parent color is white --> change it\r\n if (!structures[selectedLayer].isSubtype) {\r\n let clr = structures[selectedLayer].color;\r\n roiLayers[selectedLayer].layer.regionRois.forEach(function (element) {\r\n if (element.color === \"#FFFFFF\") {\r\n element.color = clr;\r\n }\r\n });\r\n }\r\n\r\n // find selectedObjects in roiLayers and set properties\r\n let selObjCord = selectedObjects.coordinates;\r\n if (\r\n (selObjCord &&\r\n selObjCord.length > 0 &&\r\n structures[selectedLayer].isSubtype === false) ||\r\n this.props.selObjs === true\r\n ) {\r\n if (selObjCord[0] !== null) {\r\n // set properties for selectedObjects\r\n selectedObjects.coordinates\r\n .map(\r\n (x) =>\r\n roiLayers[selectedLayer].layer.regionRois.filter(\r\n (element) =>\r\n parseInt(element.bounds.left, 10) === x.x &&\r\n parseInt(element.bounds.top, 10) === x.y &&\r\n element.isSubtype\r\n )[0]\r\n )\r\n .filter((element) => element && !element.isLabeled)\r\n .map((roi) => {\r\n roi.isSelObj = true;\r\n roi.aiAnnotated = true;\r\n return true;\r\n });\r\n }\r\n }\r\n\r\n // set layer for subtype- or parent structure i active tool\r\n let indexLayer = 0;\r\n if (\r\n structures[selectedLayer] &&\r\n structures[selectedLayer].isSubtype &&\r\n structures[selectedLayer].classificationSubtype\r\n ) {\r\n indexLayer = getParentIndexLayer(structures[selectedLayer], structures);\r\n } else {\r\n indexLayer = nextProps.selectedLayer;\r\n }\r\n if (nextProps.tools[nextProps.activeTool]) {\r\n nextProps.tools[nextProps.activeTool].setLayer({\r\n layer: nextProps.roiLayers[indexLayer].layer,\r\n ome: nextProps.ome,\r\n fileId: nextProps.fileId,\r\n projectId: nextProps.projectId,\r\n structures: nextProps.structures,\r\n roiLayers: nextProps.roiLayers,\r\n drawLayer: nextProps.drawLayer,\r\n selectedLayer: nextProps.selectedLayer,\r\n updateProject: nextProps.updateProject,\r\n commentLayer: nextProps.commentLayer,\r\n allRoiLayers: nextProps.allRoiLayers,\r\n viewerConfig_project: nextProps.viewerConfig.project,\r\n project: nextProps.project,\r\n ctx: this.ctx,\r\n histogramConfig: nextProps.histogramConfig,\r\n updateFileClasses: nextProps.updateFileClasses,\r\n });\r\n }\r\n\r\n // update elementCount\r\n this.setElementCount();\r\n\r\n // set page from context\r\n let page = 0;\r\n if (this.props.showGallery) {\r\n page = this.props.tiles.getPage(structures[selectedLayer].id);\r\n } else {\r\n page = this.props.tiles.getTilePage(structures[selectedLayer].id);\r\n }\r\n\r\n if (this.state.page !== page) {\r\n this.setState({ page: page });\r\n }\r\n\r\n // if selected structure changed --> reset object/roi to load next\r\n if (\r\n this.props.tiles.getStructure() !== this.props.tiles.getStructureBefore()\r\n ) {\r\n this.setObjectToLoad(false, true);\r\n this.props.tiles.setStructure(structures[selectedLayer]);\r\n }\r\n\r\n // check if new dynamic structure\r\n if (this.props.tiles.getSubtypesPages().length !== structures.length) {\r\n this.setDynamicStructure();\r\n }\r\n }\r\n\r\n scroll = (top) => {\r\n // scrolls that cropped image that calls function (selected image) is on top in gallery\r\n var el = document.getElementById(\"galleryWindow\");\r\n el.scrollTo({ top: el.scrollTop + top - 90, behavior: \"smooth\" });\r\n };\r\n\r\n setSelectedWithKey = (b) => {\r\n // sets variable if classifying with keys (automatic srolling) or with mouse (no automatic scrolling)\r\n this.setState({ selectedWithKey: b });\r\n };\r\n\r\n selectNewImage = (dir) => {\r\n const { viewerConfig } = this.props;\r\n // select next or previous roi with right or left arrow key\r\n if (!this.state.selectedWithKey) {\r\n // set selectedWith key true --> automatic scrolling enabled\r\n this.setSelectedWithKey(true);\r\n }\r\n\r\n if (\r\n viewerConfig.project.projectStringProperties[\"ViewerType\"] !==\r\n \"FilesGallery\"\r\n ) {\r\n this.selectNewRoi(dir);\r\n } else {\r\n this.selectNewFile(dir);\r\n }\r\n\r\n this.forceUpdate();\r\n };\r\n\r\n selectNewRoi = (dir) => {\r\n const { selectedLayer, roiLayers, structures, project } = this.props;\r\n\r\n // if not classification structure (parent)\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n let roiLay = [];\r\n if (project.type.includes(\"HistoPointCounting\")) {\r\n roiLay = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (element) =>\r\n element.isSubtype && element.subtypeName !== \"leer [leer]\"\r\n );\r\n } else {\r\n roiLay = roiLayers[selectedLayer].layer.regionRois;\r\n }\r\n\r\n // get index of currently selected roi\r\n let idx = roiLay.findIndex((element) => element.selected);\r\n\r\n if (dir === \"right\") {\r\n // right key\r\n if (roiLay[idx + 1] && roiLay[idx]) {\r\n // make next roi selected\r\n roiLay[idx + 1].selected = true;\r\n roiLay[idx + 1].selectedWithKey = true;\r\n roiLay[idx].selected = false;\r\n roiLay[idx].selectedWithKey = false;\r\n // check if change page\r\n if (idx === (this.state.page + 1) * this.state.rowsPerPage - 1) {\r\n this.setPage(this.state.page + 2);\r\n }\r\n }\r\n } else {\r\n // left key\r\n if (roiLay[idx - 1] && roiLay[idx]) {\r\n //make previous roi selected\r\n roiLay[idx - 1].selected = true;\r\n roiLay[idx - 1].selectedWithKey = true;\r\n roiLay[idx].selected = false;\r\n roiLay[idx].selectedWithKey = false;\r\n // check if change page\r\n if (idx % this.state.rowsPerPage === 0) {\r\n this.setPage(this.state.page);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // if classification structure\r\n if (structures[selectedLayer].classificationSubtype) {\r\n let parentLayer = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n\r\n // get index of selRoi in all rois\r\n let idxSelRoi = roiLayers[parentLayer].layer.regionRois.findIndex(\r\n (element) => element.selected\r\n );\r\n\r\n // get all rois of subtype\r\n let childLabels = [];\r\n this.findChilds(structures[selectedLayer]).forEach((element) => {\r\n childLabels.push(element.label);\r\n });\r\n let subtypeRois = roiLayers[parentLayer].layer.regionRois.filter(\r\n (element) =>\r\n element.subtypeName === structures[selectedLayer].label ||\r\n childLabels.includes(element.subtypeName)\r\n );\r\n\r\n // get index of selRoi in subtype rois\r\n let idxInSubtypes = subtypeRois.findIndex((element) => element.selected);\r\n\r\n // get next or previous roi\r\n let nextRoi = subtypeRois[idxInSubtypes];\r\n if (dir === \"right\") {\r\n if (subtypeRois[idxInSubtypes + 1]) {\r\n nextRoi = subtypeRois[idxInSubtypes + 1];\r\n }\r\n } else {\r\n if (subtypeRois[idxInSubtypes - 1]) {\r\n nextRoi = subtypeRois[idxInSubtypes - 1];\r\n }\r\n }\r\n\r\n // get index of next roi\r\n let idxNextRoi = roiLayers[parentLayer].layer.regionRois.findIndex(\r\n (element) => element === nextRoi\r\n );\r\n if (idxNextRoi === -1) {\r\n return;\r\n }\r\n\r\n // set next roi selected\r\n roiLayers[parentLayer].layer.regionRois[idxNextRoi].selected = true;\r\n roiLayers[parentLayer].layer.regionRois[\r\n idxNextRoi\r\n ].selectedWithKey = true;\r\n\r\n // set selected roi to not selected\r\n if (idxNextRoi !== idxSelRoi) {\r\n roiLayers[parentLayer].layer.regionRois[idxSelRoi].selected = false;\r\n roiLayers[parentLayer].layer.regionRois[\r\n idxSelRoi\r\n ].selectedWithKey = false;\r\n }\r\n }\r\n };\r\n\r\n selectNewFile = (dir) => {\r\n const { project, structures, selectedLayer } = this.props;\r\n\r\n let visibleFiles = project.files;\r\n if (structures[selectedLayer].classificationSubtype) {\r\n visibleFiles = project.files.filter(\r\n (element) => element.classId === structures[selectedLayer].id\r\n );\r\n }\r\n\r\n // get index of currently selected file\r\n let idx = visibleFiles.findIndex((element) => element.selectedInGallery);\r\n // make file selectedIngallery true and other files false\r\n visibleFiles.forEach((f) => {\r\n f.selectedInGallery = false;\r\n });\r\n if (dir === \"right\" && project.files[idx + 1]) {\r\n visibleFiles[idx + 1].selectedInGallery = true;\r\n // check if change page\r\n if (idx === (this.state.page + 1) * this.state.rowsPerPage - 1) {\r\n this.setPage(this.state.page + 2);\r\n }\r\n } else if (dir === \"left\" && project.files[idx - 1]) {\r\n visibleFiles[idx - 1].selectedInGallery = true;\r\n // check if change page\r\n if (idx % this.state.rowsPerPage === 0) {\r\n this.setPage(this.state.page);\r\n }\r\n }\r\n };\r\n\r\n deleteSelectedRoi = () => {\r\n const { selectedLayer, roiLayers, structures } = this.props;\r\n // remove selected roi from roilayer\r\n\r\n // if not classification structure\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n // get index of selected roi\r\n let idx = roiLayers[selectedLayer].layer.regionRois.findIndex(\r\n (element) => element.selected\r\n );\r\n // adjust annotation count\r\n if (\r\n this.state.automaticTraining &&\r\n roiLayers[selectedLayer].layer.regionRois[idx].isSubtype &&\r\n !roiLayers[selectedLayer].layer.regionRois[idx].aiAnnotated\r\n ) {\r\n this.props.tiles.setStrAnnoCount(\r\n roiLayers[selectedLayer].layer.regionRois[idx].structureId,\r\n -1\r\n );\r\n }\r\n // delete selected roi\r\n roiLayers[selectedLayer].layer.regionRois.splice(idx, 1);\r\n // make next roi selected true\r\n if (roiLayers[selectedLayer].layer.regionRois[idx]) {\r\n roiLayers[selectedLayer].layer.regionRois[idx].selected = true;\r\n roiLayers[selectedLayer].layer.regionRois[idx].selectedWithKey = true;\r\n }\r\n }\r\n\r\n // if classification structure\r\n if (structures[selectedLayer].classificationSubtype) {\r\n let parentLayer = getParentIndexLayer(\r\n structures[selectedLayer],\r\n structures\r\n );\r\n // get index of selected roi\r\n let idx = roiLayers[parentLayer].layer.regionRois.findIndex(\r\n (element) => element.selected\r\n );\r\n // delete selected roi\r\n roiLayers[parentLayer].layer.regionRois.splice(idx, 1);\r\n // get index of next subtype roi\r\n let childLabels = []; // all subtypenames\r\n this.findChilds(structures[selectedLayer]).forEach((element) => {\r\n childLabels.push(element.label);\r\n });\r\n let idxNext = 0; // index of next subtype\r\n // search for next roi that has is same subtype or subsubtype, ...\r\n for (\r\n let i = idx;\r\n i < roiLayers[parentLayer].layer.regionRois.length;\r\n i++\r\n ) {\r\n if (\r\n childLabels.includes(\r\n roiLayers[parentLayer].layer.regionRois[i].subtypeName\r\n ) ||\r\n roiLayers[parentLayer].layer.regionRois[i].subtypeName ===\r\n structures[selectedLayer].label\r\n ) {\r\n idxNext = i;\r\n break;\r\n }\r\n }\r\n // make next roi of subtype selected true\r\n if (roiLayers[parentLayer].layer.regionRois[idxNext]) {\r\n roiLayers[parentLayer].layer.regionRois[idxNext].selected = true;\r\n roiLayers[parentLayer].layer.regionRois[idxNext].selectedWithKey = true;\r\n }\r\n }\r\n\r\n this.forceUpdate();\r\n };\r\n\r\n handleChangePage = (page, direction) => {\r\n const { selectedLayer, structures } = this.props;\r\n // change page\r\n\r\n // change page with key shortcuts\r\n if (direction === \"down\") {\r\n page = this.state.page + 1;\r\n } else if (direction === \"up\") {\r\n page = this.state.page - 1;\r\n page = page < 0 ? 0 : page;\r\n } else {\r\n page = direction;\r\n }\r\n\r\n // set context page\r\n if (this.props.showGallery) {\r\n this.props.tiles.setPage(structures[selectedLayer].id, page);\r\n } else {\r\n this.props.tiles.setTilePage(structures[selectedLayer].id, page);\r\n }\r\n\r\n this.props.onGallerychangePage();\r\n this.setState({ page });\r\n this.props.tiles.setPageIndex(page);\r\n\r\n // prevent loading first roi on each page if changing multiple pages fast\r\n if (this.allImagesLoaded()) {\r\n this.setObjectToLoad(true);\r\n } else {\r\n let structureId = structures[selectedLayer].id;\r\n setTimeout(this.checkIfLoadNewObject, 2000, page, structureId);\r\n }\r\n\r\n // scroll to top after change page\r\n this.scrollToTop();\r\n this.forceUpdate();\r\n };\r\n\r\n checkIfLoadNewObject = (pg, prevStr) => {\r\n const { selectedLayer, structures } = this.props;\r\n let structureId = structures[selectedLayer].id;\r\n if (pg === this.state.page && prevStr === structureId) {\r\n // load object if not changed page for 2 seconds\r\n this.setObjectToLoad(true);\r\n } else {\r\n // do not load object from skipped pages\r\n }\r\n };\r\n\r\n scrollToTop = () => {\r\n // scroll to top --> eg. if change page\r\n var el = document.getElementById(\"galleryWindow\");\r\n el.scrollTop = 0;\r\n };\r\n\r\n handleChangeRowsPerPage = (event) => {\r\n // change number of elements on one page\r\n this.setState({ rowsPerPage: event.target.value });\r\n };\r\n\r\n setPage = (p) => {\r\n const { selectedLayer, structures } = this.props;\r\n // set page specific page p\r\n\r\n this.pageInput = \"\";\r\n // if p is not a number\r\n if (!p) {\r\n this.forceUpdate();\r\n return;\r\n }\r\n\r\n // if pg is negative\r\n let pg = p - 1;\r\n if (pg < 0) {\r\n this.forceUpdate();\r\n return;\r\n }\r\n\r\n // if pg is out of range --> go to last page\r\n let numObjsInLayer = this.getNumberOfElements();\r\n if (this.state.rowsPerPage * pg > numObjsInLayer) {\r\n pg = Math.ceil(numObjsInLayer / this.state.rowsPerPage) - 1;\r\n }\r\n\r\n // set context page\r\n if (this.props.showGallery) {\r\n this.props.tiles.setPage(structures[selectedLayer].id, pg);\r\n } else {\r\n this.props.tiles.setTilePage(structures[selectedLayer].id, pg);\r\n }\r\n\r\n this.props.onGallerychangePage();\r\n this.setState({ page: pg });\r\n this.props.tiles.setPageIndex(pg);\r\n this.setObjectToLoad(true);\r\n this.scrollToTop();\r\n this.forceUpdate();\r\n };\r\n\r\n getNumberOfElements = () => {\r\n const { selectedLayer, roiLayers, structures, project } = this.props;\r\n // return number of objects of selected structure\r\n let numEls = 0;\r\n if (\r\n this.props.viewerConfig.project.projectStringProperties[\"ViewerType\"] !==\r\n \"FilesGallery\"\r\n ) {\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n numEls = roiLayers[selectedLayer].layer.regionRois.length;\r\n } else {\r\n let idx = this.findParentIndex();\r\n numEls = roiLayers[idx].layer.regionRois.filter(\r\n (element) => element.subtypeName === structures[idx].label\r\n ).length;\r\n }\r\n } else {\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n numEls = project.files.length;\r\n } else {\r\n numEls = project.files.filter(\r\n (element) =>\r\n element.classId && element.classId == structures[selectedLayer].id\r\n ).length;\r\n }\r\n }\r\n return numEls;\r\n };\r\n\r\n classifyImageWithKey = (classId) => {\r\n const { viewerConfig } = this.props;\r\n // classify roi / file\r\n if (\r\n viewerConfig.project.projectStringProperties[\"ViewerType\"] !==\r\n \"FilesGallery\"\r\n ) {\r\n this.classifyRoiWithKey(classId);\r\n } else {\r\n this.classifyFileWithKey(classId);\r\n }\r\n\r\n // update\r\n this.forceUpdate();\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n classifyRoiWithKey = (classId) => {\r\n const { roiLayers, selectedLayer, structures } = this.props;\r\n // classify roi with key shortcut (0 is parent, 1 is first subtype, ...)\r\n\r\n let layer = selectedLayer;\r\n if (structures[selectedLayer].classificationSubtype) {\r\n layer = getParentIndexLayer(structures[selectedLayer], structures);\r\n }\r\n // get all subtypes / childs\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n // get index of selected roi that gets classified\r\n let idx = roiLayers[layer].layer.regionRois.findIndex(\r\n (element) => element.selected\r\n );\r\n\r\n // make adjustments for point-counting module\r\n if (this.props.project.type.includes(\"HistoPointCounting\")) {\r\n // if classify tile to parent --> return\r\n if (classId === 0) {\r\n return;\r\n }\r\n }\r\n\r\n // classify roi\r\n let roiWasSubtype =\r\n roiLayers[layer].layer.regionRois[idx].isSubtype &&\r\n !roiLayers[layer].layer.regionRois[idx].aiAnnotated;\r\n let bufferRoiId = roiLayers[layer].layer.regionRois[idx].structureId;\r\n\r\n // set properties of roi for classification if classifying to subtype\r\n if (childs[classId - 1]) {\r\n roiLayers[layer].layer.regionRois[idx].color = childs[classId - 1].color;\r\n roiLayers[layer].layer.regionRois[idx].isSubtype = true;\r\n roiLayers[layer].layer.regionRois[idx].isAnnotated = true;\r\n roiLayers[layer].layer.regionRois[idx].isLabeled = true;\r\n roiLayers[layer].layer.regionRois[idx].subtypeName =\r\n childs[classId - 1].label;\r\n roiLayers[layer].layer.regionRois[idx].structureId =\r\n childs[classId - 1].id;\r\n roiLayers[layer].layer.regionRois[idx].isSelObj = false;\r\n roiLayers[layer].layer.regionRois[idx].aiAnnotated = false;\r\n }\r\n\r\n // set properties of roi for classification if classifying to parent\r\n if (classId === 0) {\r\n roiLayers[layer].layer.regionRois[idx].color =\r\n structures[selectedLayer].color;\r\n roiLayers[layer].layer.regionRois[idx].isSubtype = false;\r\n roiLayers[layer].layer.regionRois[idx].isAnnotated = false;\r\n roiLayers[layer].layer.regionRois[idx].isLabeled = false;\r\n roiLayers[layer].layer.regionRois[idx].subtypeName =\r\n structures[selectedLayer].label;\r\n roiLayers[layer].layer.regionRois[idx].structureId =\r\n structures[selectedLayer].id;\r\n roiLayers[layer].layer.regionRois[idx].isSelObj = false;\r\n roiLayers[layer].layer.regionRois[idx].aiAnnotated = false;\r\n }\r\n\r\n // increase annotationCount\r\n let currentRoi = roiLayers[layer].layer.regionRois[idx];\r\n if (\r\n this.state.automaticTraining &&\r\n !structures[selectedLayer].classificationSubtype\r\n ) {\r\n if (currentRoi.isSubtype && !roiWasSubtype) {\r\n // if classify unlabeled to labeled\r\n this.props.tiles.setStrAnnoCount(currentRoi.structureId, 1);\r\n } else if (currentRoi.isSubtype && roiWasSubtype) {\r\n // if classify labeled to labeled\r\n this.props.tiles.setStrAnnoCount(currentRoi.structureId, 1);\r\n this.props.tiles.setStrAnnoCount(bufferRoiId, -1);\r\n } else if (roiWasSubtype) {\r\n // if classify labeled to unlabeled\r\n this.props.tiles.setStrAnnoCount(bufferRoiId, -1);\r\n }\r\n }\r\n\r\n // start training automatically if enough annotations\r\n if (this.state.automaticTraining) {\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n let structureId = structures[selectedLayer].id;\r\n let annotations =\r\n this.getNuberChildRois(childs) -\r\n this.props.tiles.getStrAnnoCountElement(structureId);\r\n if (annotations >= this.state.startData && !this.props.alruns) {\r\n let enoughAnnos = this.enoughAnnotations(childs);\r\n\r\n if (enoughAnnos) {\r\n this.props.tiles.setAnnotationCount(0);\r\n this.props.tiles.setParentAnnoCount(\r\n structures[selectedLayer].id,\r\n annotations\r\n );\r\n this.props.startAutomaticTraining();\r\n } else {\r\n // give warning if too less annotations\r\n this.giveWarning();\r\n }\r\n }\r\n }\r\n };\r\n\r\n classifyFileWithKey = (classId) => {\r\n const { selectedLayer, structures, project } = this.props;\r\n // classify file with key shortcut (0 is parent, 1 is first subtype, ...)\r\n\r\n // get all subtypes / childs\r\n let parentStructure = structures[selectedLayer];\r\n if (structures[selectedLayer].classificationSubtype) {\r\n parentStructure = structures.filter(\r\n (element) => element.id === structures[selectedLayer].parentId\r\n )[0];\r\n }\r\n let childs = this.findChilds(parentStructure);\r\n // get index of selected roi that gets classified\r\n let idx = project.files.findIndex((element) => element.selectedInGallery);\r\n // assign classId\r\n if (childs[classId - 1]) {\r\n project.files[idx].classId = childs[classId - 1].id;\r\n }\r\n };\r\n\r\n classifyTilesGalleryWithKey = (classId) => {\r\n const { roiLayers, selectedLayer, structures } = this.props;\r\n const { page } = this.state;\r\n // classify tile with key shortcut --> function was made for project tilestool\r\n\r\n // get all subtypes / childs\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n\r\n // set properties of roi for classification\r\n if (childs[classId - 1]) {\r\n roiLayers[selectedLayer].layer.regionRois[page].color =\r\n childs[classId - 1].color;\r\n roiLayers[selectedLayer].layer.regionRois[page].isSubtype = true;\r\n roiLayers[selectedLayer].layer.regionRois[page].isAnnotated = true;\r\n roiLayers[selectedLayer].layer.regionRois[page].subtypeName =\r\n childs[classId - 1].label;\r\n roiLayers[selectedLayer].layer.regionRois[page].structureId =\r\n childs[classId - 1].id;\r\n }\r\n\r\n // update\r\n this.forceUpdate();\r\n };\r\n\r\n setPageSelectedRoi = (roi) => {\r\n const { roiLayers, selectedLayer, structures } = this.props;\r\n // select correct page after shortcut from viewer in project tilestool\r\n\r\n // index of element will be page to select (beacuse only one image per page)\r\n let p = roiLayers[selectedLayer].layer.regionRois.findIndex(\r\n (element) => element === roi\r\n );\r\n // set context page\r\n if (this.props.showGallery) {\r\n this.props.tiles.setPage(structures[selectedLayer].id, p);\r\n } else {\r\n this.props.tiles.setTilePage(structures[selectedLayer].id, p);\r\n }\r\n\r\n this.setObjectToLoad(false, true);\r\n this.setState({ page: p });\r\n };\r\n\r\n giveWarning = () => {\r\n // show warning snackbar if not enought annotations for training\r\n if (this.enoughAnnosCount < 2) {\r\n this.props.trainingWarning(\"tooFewAnnotations\");\r\n this.enoughAnnosCount = this.enoughAnnosCount + 1;\r\n }\r\n };\r\n\r\n handleDivMouseDown = (e) => {\r\n // set that mouse is down\r\n this.props.tiles.setIsMousedown(true);\r\n if (this.props.tiles.getOnPageInput()) {\r\n return;\r\n } else {\r\n // // disable page input textfield\r\n // document.getElementById(\"pageInput\").disabled = true;\r\n if (document.getElementById(\"nAnnos\") !== null) {\r\n document.getElementById(\"nAnnos\").disabled = true;\r\n }\r\n if (document.getElementById(\"roiComment\") !== null) {\r\n document.getElementById(\"roiComment\").disabled = true;\r\n }\r\n }\r\n if (!this.props.showGallery) {\r\n return;\r\n }\r\n e.preventDefault();\r\n };\r\n\r\n handleDivMouseUp = (e) => {\r\n const { tools, activeTool } = this.props;\r\n // set that mouse is up\r\n this.props.tiles.setIsMousedown(false);\r\n if (\r\n !this.props.tiles.getIsOnImage() ||\r\n this.props.tiles.getIsInOtherImage()\r\n ) {\r\n // if finish drawing on other image or outside of image\r\n if (tools[activeTool]) {\r\n let p1;\r\n let prps = this.props.tiles.getRoiProps();\r\n tools[activeTool].mouse({\r\n event: e,\r\n p: p1,\r\n color: prps.color,\r\n subtype: prps.isSubtype,\r\n name: prps.subtypeName,\r\n positionInRoiLayer: -2,\r\n fullyLoaded: true,\r\n });\r\n this.props.tiles.setIsInOtherImage(false);\r\n this.forceUpdate();\r\n }\r\n }\r\n };\r\n\r\n getNuberChildRois = (childs) => {\r\n // get number of annotations of all childs (from context)\r\n let n = 0;\r\n childs.forEach((element) => {\r\n n = n + this.props.tiles.getStrAnnoCountElement(element.id);\r\n });\r\n return n;\r\n };\r\n\r\n enoughAnnotations = (childs) => {\r\n // check if enough annotations for training of dl model (at least one class with 5 annotations and one other class with 1 annotation)\r\n let minFive = false;\r\n let twoAnnotated = 0;\r\n childs.forEach((element) => {\r\n // check if minimum of five in one class\r\n if (this.props.tiles.getStrAnnoCountElement(element.id) >= 5) {\r\n minFive = true;\r\n }\r\n // check if two classes with at least one element\r\n if (this.props.tiles.getStrAnnoCountElement(element.id) >= 1) {\r\n twoAnnotated = twoAnnotated + 1;\r\n }\r\n });\r\n\r\n // if one class with at least five and one other class with at least one annotation --> enough annotations for training\r\n let enough = false;\r\n if (minFive && twoAnnotated >= 2) {\r\n enough = true;\r\n }\r\n return enough;\r\n };\r\n\r\n isRoiSubtype = (roi) => {\r\n const { structures, selectedLayer } = this.props;\r\n if (\r\n roi.subtypeName === structures[selectedLayer].label &&\r\n roi.color === structures[selectedLayer].color\r\n ) {\r\n // roi is element of selected structure\r\n return true;\r\n }\r\n\r\n // calculate childs of structure and check labels of childs\r\n let childLabels = [];\r\n let childColors = [];\r\n this.findChilds(structures[selectedLayer]).forEach((element) => {\r\n childLabels.push(element.label);\r\n childColors.push(element.color);\r\n });\r\n\r\n if (\r\n roi.isSubtype &&\r\n childLabels.includes(roi.subtypeName) &&\r\n childColors.includes(roi.color)\r\n ) {\r\n // roi is child of selected structure\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n isFileSubtype = (fileClassId) => {\r\n const { structures, selectedLayer } = this.props;\r\n if (fileClassId == structures[selectedLayer].id) {\r\n // roi is element of selected structure\r\n return true;\r\n }\r\n };\r\n\r\n findChilds = (subType) => {\r\n const { structures } = this.props;\r\n // return direct classification subtypes of selected structure\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === subType.subtypeLevel + 1 &&\r\n element.parentId === subType.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n setProgress = (line) => {\r\n // get acc and epochs of training from backend messages\r\n let epochs = \"\";\r\n let acc = \"\";\r\n // get epoch in training\r\n if (line.includes(\"Epoch\")) {\r\n epochs = line.split(\"Epoch\")[1];\r\n if (epochs.includes(\"early stopping\")) {\r\n // if early stopping save accuracy of training in local storage and graph\r\n epochs = \"50/50\";\r\n this.props.tiles.pushGraphAcc(this.validationAcc);\r\n this.props.persistentStorage.save(\r\n \"accGraphObject\",\r\n this.props.tiles.getGraphAcc()\r\n );\r\n } else if (epochs.includes(\"50/50\")) {\r\n // if training finished save accuracy of training in local storage and graph\r\n epochs = \"50/50\";\r\n this.props.tiles.pushGraphAcc(this.validationAcc);\r\n this.props.persistentStorage.save(\r\n \"accGraphObject\",\r\n this.props.tiles.getGraphAcc()\r\n );\r\n }\r\n // set epochs for frontend text\r\n this.setState({ progressText: epochs });\r\n }\r\n // get acc in training\r\n if (line.includes(\"val_accuracy\")) {\r\n acc = line.split(\"val_accuracy: \")[1];\r\n this.validationAcc = parseFloat(acc) * 100;\r\n this.setState({ trainingAcc: acc });\r\n }\r\n };\r\n\r\n filterObjects = (element) => {\r\n if (!this.props.project.type.includes(\"HistoPointCounting\")) {\r\n return true;\r\n } else {\r\n // only show classified tiles and tiles that are not classified as \"leer\" in point counting module\r\n return element.isSubtype && element.subtypeName !== \"leer [leer]\";\r\n }\r\n };\r\n\r\n renderCroppedImage = (roi, context, id) => {\r\n const { galleryImageSize } = this.props.projectContext;\r\n return (\r\n (this.tile[id] = c)}\r\n onRefresh={() => this.forceUpdate()}\r\n ome={this.props.ome}\r\n histogramConfig={this.props.histogramConfig}\r\n visibleImage={this.visibleImage}\r\n coloredImages={this.coloredImages}\r\n roI={roi}\r\n structures={this.props.structures}\r\n selectedLayer={this.props.selectedLayer}\r\n canvasWidth={galleryImageSize}\r\n gallery={this.props.gallery}\r\n contour={this.state.drawContour}\r\n activeTool={this.props.activeTool}\r\n tools={this.props.tools}\r\n number={context.state.number}\r\n fileId={this.props.fileId}\r\n //contx={this.props.contx}\r\n visImgs={this.props.visImgs}\r\n index={id}\r\n indexOffset={this.state.page * this.state.rowsPerPage}\r\n page={this.pageIndex}\r\n roiLayers={this.props.roiLayers}\r\n classificationId={this.classificationId}\r\n fromAI={true}\r\n drawLayer={this.props.drawLayer}\r\n updateGallery={this.updateGallery}\r\n startData={this.state.startData}\r\n alruns={this.props.alruns}\r\n setAlruns={this.props.setAlruns}\r\n z={this.state.z}\r\n t={this.state.t}\r\n showZStackBar={this.props.showZStackBar}\r\n automaticTraining={this.state.automaticTraining}\r\n startAutomaticTraining={this.props.startAutomaticTraining}\r\n trainingWarning={this.props.trainingWarning}\r\n setFUllyAnnotated={this.props.setFUllyAnnotated}\r\n setAnnotated={this.props.setAnnotated}\r\n showGallery={this.props.showGallery}\r\n drawCrosshair={this.state.drawCrosshair}\r\n crosshairColor={this.state.crosshairColor}\r\n crosshairOpacity={this.state.crosshairOpacity}\r\n crosshairLineWidth={this.state.crosshairLineWidth}\r\n scroll={this.scroll}\r\n setSelectedWithKey={this.setSelectedWithKey}\r\n selectedWithKey={this.state.selectedWithKey}\r\n isBrightfield={this.state.isBrightfield}\r\n objectToLoad={this.state.objectToLoad}\r\n setObjectToLoad={this.setObjectToLoad}\r\n giveWarning={this.giveWarning}\r\n project={this.props.project}\r\n globalZ={this.props.globalZ}\r\n opacity={this.props.opacity}\r\n />\r\n );\r\n };\r\n\r\n renderSceneImage = (file) => {\r\n const { galleryImageSize } = this.props.projectContext;\r\n return (\r\n \r\n );\r\n };\r\n\r\n render() {\r\n const { structures, selectedLayer, roiLayers, project, tools } = this.props;\r\n const { classes, ...propsWithoutClasses } = this.props;\r\n const { page, rowsPerPage } = this.state;\r\n const { galleryImageSize } = this.props.projectContext;\r\n\r\n let params = {\r\n classificationFiles: project.files.slice(\r\n page * rowsPerPage,\r\n page * rowsPerPage + rowsPerPage\r\n ),\r\n };\r\n tools.iam_ai_inference?.onParameterChange(params);\r\n\r\n // tooltip describes how many annotations it takes for automatic start of training\r\n let toolTipCircularProgress =\r\n \"if (\" +\r\n this.state.startData +\r\n \"/\" +\r\n this.state.startData +\r\n \") training starts automatically\";\r\n\r\n // calculate number of annotations for progess in bottom right (circular progress)\r\n let childs = this.findChilds(structures[selectedLayer]);\r\n let structureId = structures[selectedLayer].id;\r\n let annotations =\r\n this.getNuberChildRois(childs) -\r\n this.props.tiles.getStrAnnoCountElement(structureId);\r\n let progress = (annotations / this.state.startData) * 100;\r\n if (annotations > this.state.startData) {\r\n progress = 100;\r\n }\r\n\r\n // get subtypes / childs of selected structure for classification\r\n let childsGallery = this.findChilds(structures[selectedLayer]);\r\n if (!this.props.project.type.includes(\"HistoPointCounting\")) {\r\n // add parent / selected layer to childs / subtypes\r\n childsGallery.unshift(structures[selectedLayer]);\r\n }\r\n\r\n // calculate rois that will be displayed in gallery depending on selected structure\r\n let roisForImages = [];\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n // show all rois if parent structure (exception --> point counting module (look at filterObjects function))\r\n roisForImages = roiLayers[selectedLayer].layer.regionRois.filter(\r\n (element) => this.filterObjects(element)\r\n );\r\n } else {\r\n // only show subtype rois if subtype structure\r\n roisForImages = roiLayers[\r\n getParentIndexLayer(structures[selectedLayer], structures)\r\n ].layer.regionRois.filter((element) => this.isRoiSubtype(element));\r\n }\r\n\r\n // calculate files that will be displayed in gallery depending on selected structure\r\n let displayedFiles = [];\r\n if (!structures[selectedLayer].classificationSubtype) {\r\n // show all files if parent structure\r\n displayedFiles = project.files;\r\n } else {\r\n // only show subtype rois if subtype structure\r\n displayedFiles = project.files.filter((element) =>\r\n this.isFileSubtype(element.classId)\r\n );\r\n }\r\n\r\n return (\r\n {\r\n e.preventDefault();\r\n }}\r\n >\r\n \r\n\r\n {this.props.viewerConfig.project.projectStringProperties[\r\n \"ViewerType\"\r\n ] == \"FilesGallery\" && (\r\n {\r\n // if scrolling manually set selected with key to false --> no more automatic scrolling\r\n if (this.state.selectedWithKey) {\r\n this.setState({ selectedWithKey: false });\r\n }\r\n }}\r\n >\r\n {displayedFiles\r\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\r\n .map((file, id) => {\r\n return (\r\n \r\n {this.renderSceneImage(file)}\r\n \r\n );\r\n })}\r\n \r\n )}\r\n\r\n {this.props.viewerConfig.project.projectStringProperties[\r\n \"ViewerType\"\r\n ] !== \"FilesGallery\" && (\r\n {\r\n // if scrolling manually set selected with key to false --> no more automatic scrolling\r\n if (this.state.selectedWithKey) {\r\n this.setState({ selectedWithKey: false });\r\n }\r\n }}\r\n >\r\n \r\n {roisForImages\r\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\r\n .map((roi, id) => {\r\n // give roi correct color\r\n let clr = structures[selectedLayer].color;\r\n if (roi.color === \"#FFFFFF\") {\r\n roi.color = clr;\r\n }\r\n\r\n return (\r\n \r\n \r\n {roi.isLabeled || !roi.isSelObj ? (\r\n \r\n ) : (\r\n \r\n AI\r\n \r\n )}\r\n {!this.props.showGallery && (\r\n \r\n {roi.tileName}\r\n \r\n )}\r\n {this.renderCroppedImage(roi, this.props.tiles, id, 4)}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n )}\r\n\r\n
\r\n \r\n `Page ${this.state.page + 1} of ${Math.ceil(\r\n this.state.elementCount / this.state.rowsPerPage\r\n )} (${this.state.elementCount} objects)`\r\n }\r\n />\r\n\r\n {this.state.automaticTraining &&\r\n !this.props.structures[this.props.selectedLayer]\r\n .classificationSubtype && (\r\n \r\n \r\n {annotations + \"/\" + this.state.startData}\r\n \r\n
\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nGallery.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n componentRef: PropTypes.func,\r\n roiLayers: PropTypes.array,\r\n ome: PropTypes.object,\r\n fileId: PropTypes.string,\r\n projectId: PropTypes.string,\r\n structures: PropTypes.array,\r\n selectedLayer: PropTypes.number,\r\n visibleImage: PropTypes.array,\r\n coloredImages: PropTypes.array,\r\n histogramConfig: PropTypes.object,\r\n gallery: PropTypes.func,\r\n activeTool: PropTypes.string,\r\n tools: PropTypes.array,\r\n visImgs: PropTypes.array,\r\n selectedObjects: PropTypes.object,\r\n drawLayer: PropTypes.object,\r\n saveChangesGallery: PropTypes.func,\r\n applyDL: PropTypes.func,\r\n test: PropTypes.bool,\r\n updateCount: PropTypes.number,\r\n alruns: PropTypes.bool,\r\n setAlruns: PropTypes.func,\r\n graphData: PropTypes.number,\r\n updateViewer: PropTypes.func,\r\n onGallerychangePage: PropTypes.func,\r\n showZStackBar: PropTypes.bool,\r\n // from withTiles\r\n tiles: PropTypes.object,\r\n globalZ: PropTypes.number,\r\n opacity: PropTypes.number,\r\n project: PropTypes.object,\r\n viewerConfig: PropTypes.object,\r\n persistentStorage: PropTypes.object,\r\n showGallery: PropTypes.bool,\r\n selObjs: PropTypes.bool,\r\n updateProject: PropTypes.func,\r\n commentLayer: PropTypes.object,\r\n allRoiLayers: PropTypes.array,\r\n startAutomaticTraining: PropTypes.func,\r\n trainingWarning: PropTypes.func,\r\n setFUllyAnnotated: PropTypes.func,\r\n setAnnotated: PropTypes.func,\r\n updateFileClasses: PropTypes.func,\r\n projectContext: PropTypes.object,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withPersistentStorage(withTiles(withStyles(styles)(Gallery)))\r\n);\r\n","import React from \"react\";\r\n\r\nimport {\r\n Button,\r\n FormControl,\r\n RadioGroup,\r\n FormControlLabel,\r\n Radio,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { inv } from \"mathjs\";\r\nimport { CommentROI } from \"../../utils/ROI\";\r\nimport Tool from \"./Tool\";\r\n\r\nclass LandmarkTool extends Tool {\r\n name = \"Landmark registration\";\r\n noConfig = false;\r\n mouseActionState = \"free\";\r\n commentState = {\r\n commentValue: \"\",\r\n color: \"#D0021B\",\r\n selectedTool: \"rectangle\",\r\n };\r\n selectedLandmarkIdx = 0;\r\n gripIdx = null;\r\n radioValue = \"#00FF00\";\r\n deletedNumberQ = {};\r\n baseId = null;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.lineColor = this.isBrightfield ? \"#000000\" : \"#ffffff\";\r\n this.selectionColor = this.lineColor;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n this.selectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n this.commentLayer = obj.commentLayer\r\n ? obj.commentLayer\r\n : { commentRois: [] };\r\n this.landmarkLayer = obj.landmarkLayer\r\n ? obj.landmarkLayer\r\n : { landmarkRois: [] };\r\n this.fileId = obj.fileId;\r\n this.landmarkLayers = obj.landmarkLayers;\r\n this.rendererDict = obj.rendererDict;\r\n this.splitscreenFileIds = obj.splitscreenFileIds;\r\n }\r\n\r\n //return index if mousepoint is inside a mark\r\n checkBoundingBox(layer, scale, mousePoint) {\r\n let linelength = 15 / scale;\r\n let p = mousePoint;\r\n for (let i = 0; i < layer.length; i++) {\r\n let point = layer[i].regions;\r\n let topLeft = [point[0] - linelength, point[1] - linelength];\r\n let bottomRight = [point[0] + linelength, point[1] + linelength];\r\n if (\r\n p.x > topLeft[0] &&\r\n p.x < bottomRight[0] &&\r\n p.y > topLeft[1] &&\r\n p.y < bottomRight[1]\r\n ) {\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n mouse(params) {\r\n let { event, p, scale } = params;\r\n let mouseP = p;\r\n let roiColor = this.radioValue === \"#00FF00\" ? \"#00FF00\" : \"#FF0000\";\r\n let selectedLandmarkIdx = this.landmarkLayer[\"landmarkRois\"].length;\r\n let markNumber = selectedLandmarkIdx;\r\n\r\n if (typeof this.deletedNumberQ[this.fileId] === \"undefined\") {\r\n this.deletedNumberQ[this.fileId] = [];\r\n }\r\n\r\n if (event.type === \"mousedown\") {\r\n this.mouseActionState = \"down\";\r\n if (selectedLandmarkIdx > 0 && event.button === 0) {\r\n let tag = this.landmarkLayer[\"landmarkRois\"][0].color;\r\n if (tag === \"#00FF00\") {\r\n this.baseId = this.fileId;\r\n console.log(\"tagged as base\");\r\n }\r\n if (tag !== this.radioValue) {\r\n this.radioValue = tag;\r\n return;\r\n }\r\n roiColor = tag;\r\n } else if (selectedLandmarkIdx === 0 && event.button === 0) {\r\n for (const value of Object.values(this.splitscreenFileIds)) {\r\n if (this.landmarkLayers[value][\"landmarkRois\"].length > 0) {\r\n if (\r\n this.landmarkLayers[value][\"landmarkRois\"][0].color === \"#00FF00\"\r\n ) {\r\n this.radioValue = \"#FF0000\";\r\n roiColor = \"#FF0000\";\r\n this.baseId = value;\r\n }\r\n }\r\n }\r\n if (this.radioValue === \"#00FF00\") {\r\n this.baseId = this.fileId;\r\n roiColor = \"#00FF00\";\r\n }\r\n }\r\n } else if (event.type === \"mousemove\" && this.mouseActionState === \"down\") {\r\n this.mouseActionState = \"drag\";\r\n } else if (event.type === \"mouseup\") {\r\n this.mouseActionState = \"free\";\r\n }\r\n\r\n if (this.mouseActionState === \"down\" && event.button === 0) {\r\n if (\r\n this.radioValue === \"#00FF00\" &&\r\n this.splitscreenFileIds.includes(this.baseId) &&\r\n this.fileId !== this.baseId\r\n ) {\r\n console.log(\"this file is not tagged as base\");\r\n this.radioValue = \"#FF0000\";\r\n return;\r\n }\r\n if (selectedLandmarkIdx > 0) {\r\n let idx = this.checkBoundingBox(\r\n this.landmarkLayer[\"landmarkRois\"],\r\n scale,\r\n mouseP\r\n );\r\n if (!idx && idx !== 0) {\r\n if (this.deletedNumberQ[this.fileId].length !== 0) {\r\n markNumber = this.deletedNumberQ[this.fileId].pop() - 1;\r\n }\r\n this.landmarkLayer[\"landmarkRois\"][selectedLandmarkIdx] =\r\n new CommentROI(\r\n [mouseP.x, mouseP.y],\r\n roiColor,\r\n \"landmark\",\r\n markNumber + 1,\r\n 0\r\n );\r\n } else if (typeof idx === \"number\") {\r\n this.gripIdx = idx;\r\n }\r\n } else if (selectedLandmarkIdx === 0) {\r\n this.landmarkLayer[\"landmarkRois\"][selectedLandmarkIdx] =\r\n new CommentROI(\r\n [mouseP.x, mouseP.y],\r\n roiColor,\r\n \"landmark\",\r\n markNumber + 1,\r\n 0\r\n );\r\n }\r\n } else if (this.mouseActionState === \"free\" && event.type === \"mouseup\") {\r\n //set new location of landmark after dragging it\r\n if (typeof this.gripIdx === \"number\") {\r\n this.landmarkLayer[\"landmarkRois\"][this.gripIdx].regions = [\r\n mouseP.x,\r\n mouseP.y,\r\n ];\r\n this.gripIdx = null;\r\n }\r\n }\r\n\r\n // delete specific mark\r\n if (this.mouseActionState === \"down\" && event.button === 2) {\r\n let idx = this.checkBoundingBox(\r\n this.landmarkLayer[\"landmarkRois\"],\r\n scale,\r\n mouseP\r\n );\r\n if (!idx && idx !== 0) {\r\n return;\r\n } else if (typeof idx === \"number\") {\r\n let number = this.landmarkLayer[\"landmarkRois\"][idx].commentValue;\r\n this.landmarkLayer.landmarkRois.splice(idx, 1);\r\n this.deletedNumberQ[this.fileId].push(number);\r\n if (this.landmarkLayer.landmarkRois.length === 0) {\r\n this.deletedNumberQ[this.fileId] = [];\r\n this.baseId = null;\r\n }\r\n }\r\n }\r\n\r\n //disable custom mouse cursor when dragging with middle mouse button\r\n if (event.button === 1) {\r\n this.mouseActionState = \"dragImage\";\r\n } else if (event.button === 0 && this.mouseActionState === \"dragImage\") {\r\n this.mouseActionState = \"free\";\r\n }\r\n }\r\n\r\n drawCustomCursor() {}\r\n\r\n onClickRemoveTransformation = () => {\r\n let r = this.rendererDict[this.fileId];\r\n let a = r.props.tiles.getTransformationMatrix(this.fileId);\r\n if (Array.isArray(a)) {\r\n let m = [\r\n [a[0], a[1], a[2]],\r\n [a[3], a[4], a[5]],\r\n [a[6], a[7], a[8]],\r\n ];\r\n let h = inv(m);\r\n let matrix = [\r\n h[0][0],\r\n h[0][1],\r\n h[0][2],\r\n h[1][0],\r\n h[1][1],\r\n h[1][2],\r\n h[2][0],\r\n h[2][1],\r\n h[2][2],\r\n ];\r\n r.transformLandmark(matrix, 1);\r\n r.transformAnnotation(matrix, 1);\r\n r.props.tiles.removeTransformationMatrix(this.fileId);\r\n r.reset();\r\n this.rendererDict[this.fileId].props.onChangeChain(\r\n false,\r\n this.rendererDict[this.fileId].props.splitscreenIdx,\r\n this.fileId\r\n );\r\n window.showWarningSnackbar(\"Alignment removed\");\r\n }\r\n };\r\n\r\n reallocateLandmarkNumbers = (bMarks) => {\r\n for (let [id, layer] of Object.entries(this.landmarkLayers)) {\r\n let l = layer.landmarkRois;\r\n if (bMarks.length === l.length) {\r\n for (let i = 0; i < l.length; i++) {\r\n if (i + 1 !== l[i].commentValue) {\r\n if (l.length > 0) {\r\n l.sort((a, b) => (a.commentValue > b.commentValue ? 1 : -1));\r\n for (let i = 0; i < l.length; i++) {\r\n l[i].commentValue = i + 1;\r\n }\r\n this.deletedNumberQ[id] = [];\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n onClickApplyTransformation = () => {\r\n if (this.splitscreenFileIds.length < 2) {\r\n window.showWarningSnackbar(\"No base is present\");\r\n return;\r\n }\r\n let baseMarks = [];\r\n let targetMarks = {};\r\n this.baseId = null;\r\n for (let [id, layer] of Object.entries(this.landmarkLayers)) {\r\n if (layer.landmarkRois.length > 0) {\r\n let l = layer.landmarkRois;\r\n if (l[0].color === \"#00FF00\") {\r\n //sort computed value\r\n if (\r\n this.rendererDict[this.fileId].props.splitscreenFileIds.includes(id)\r\n ) {\r\n if (this.baseId !== null) {\r\n window.showWarningSnackbar(\"More than one base is present\");\r\n return;\r\n }\r\n this.baseId = id;\r\n let j = 1;\r\n while (baseMarks.length < l.length) {\r\n for (let i = 0; i < l.length; i++) {\r\n if (Number(l[i].commentValue) === j) {\r\n baseMarks.push(l[i].regions);\r\n }\r\n }\r\n j++;\r\n }\r\n }\r\n } else if (l[0].color === \"#FF0000\") {\r\n if (\r\n this.rendererDict[this.fileId].props.splitscreenFileIds.includes(id)\r\n ) {\r\n //sort computed Value\r\n targetMarks[id] = [];\r\n let j = 1;\r\n while (targetMarks[id].length < l.length) {\r\n for (let i = 0; i < l.length; i++) {\r\n if (Number(l[i].commentValue) === j) {\r\n targetMarks[id].push(l[i].regions);\r\n }\r\n }\r\n j++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this.reallocateLandmarkNumbers(baseMarks);\r\n this.rendererDict[this.baseId].props.onChangeChain(\r\n true,\r\n this.rendererDict[this.baseId].props.splitscreenIdx,\r\n this.baseId\r\n );\r\n for (let [id, points] of Object.entries(targetMarks)) {\r\n let a = this.rendererDict[id].props.tiles.getTransformationMatrix(\r\n this.fileId\r\n );\r\n if (baseMarks.length !== points.length && baseMarks.length < 4) {\r\n window.showWarningSnackbar(\"Unequal amount of base and target marks\");\r\n window.showWarningSnackbar(\"Please set at least 4 base marks\");\r\n break;\r\n } else if (baseMarks.length < 4) {\r\n window.showWarningSnackbar(\"Please set at least 4 base marks\");\r\n break;\r\n } else if (baseMarks.length !== points.length) {\r\n window.showWarningSnackbar(\"Unequal amount of base and target marks\");\r\n break;\r\n } else if (Array.isArray(a)) {\r\n window.showWarningSnackbar(\r\n \"Target already aligned. Remove alignment first\"\r\n );\r\n break;\r\n } else {\r\n this.rendererDict[id].props.onChangeChain(\r\n true,\r\n this.rendererDict[id].props.splitscreenIdx,\r\n id\r\n );\r\n this.rendererDict[id].generateLandmarkTransformation(\r\n baseMarks,\r\n targetMarks[id],\r\n this.baseId,\r\n id,\r\n this.rendererDict[this.baseId].props.ome\r\n );\r\n }\r\n }\r\n };\r\n\r\n handleRadioChange = (event) => {\r\n this.radioValue = event.target.value;\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n onClickRemoveAllMarks = () => {\r\n this.landmarkLayer.landmarkRois = [];\r\n this.deletedNumberQ[this.fileId] = [];\r\n if (this.fileId === this.baseId) {\r\n this.baseId = null;\r\n }\r\n };\r\n\r\n exit() {}\r\n\r\n renderConfiguration = () => {\r\n return (\r\n
\r\n {this.name}:\r\n \r\n \r\n }\r\n label=\"Set landmarks on base\"\r\n />\r\n }\r\n label=\"Set landmarks on target\"\r\n />\r\n \r\n \r\n {\r\n this.onClickApplyTransformation();\r\n }}\r\n >\r\n Align Image\r\n \r\n\r\n {\r\n this.onClickRemoveTransformation();\r\n }}\r\n >\r\n Remove Alignment\r\n \r\n {\r\n this.onClickRemoveAllMarks();\r\n }}\r\n >\r\n Remove landmarks\r\n \r\n
\r\n );\r\n };\r\n}\r\n\r\nexport default LandmarkTool;\r\n","import { findSameLayer } from \"../../utils/PolygonUtil\";\r\nimport { Typography, FormControl, FormLabel, Slider } from \"@mui/material\";\r\nimport Tool from \"./Tool\";\r\nimport React from \"react\";\r\nimport KDBush from \"kdbush\";\r\n\r\nclass HeatmapTool extends Tool {\r\n toolName = \"Heatmap Tool\";\r\n noConfig = false;\r\n removeOverlap = null;\r\n removeOverlapSame = null;\r\n tempRemoveOverlap = null;\r\n tempRemoveOverlapSame = null;\r\n threshold = 30;\r\n init = false;\r\n maxValue = 1;\r\n searchRadius = 20;\r\n labels = [];\r\n prevSelectedLayer = 0;\r\n rois = [];\r\n activeGrid = 0;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n this.isBrightfield = obj.ome.channels[0].type === \"brightfield\";\r\n this.ctx = obj.ctx; //context\r\n this.canvas = obj.ctx.canvas; //canvas\r\n this.canvasWidth = this.canvas.width;\r\n this.canvasHeight = this.canvas.height;\r\n this.layer = obj.layer;\r\n this.roiLayers = obj.roiLayers;\r\n let layerResults = findSameLayer(obj.structures, obj.selectedLayer);\r\n this.selectedLayer = layerResults[0];\r\n this.parentLayer = layerResults[1];\r\n this.originalSelectedLayer = obj.selectedLayer;\r\n this.structures = obj.structures;\r\n this.drawLayer = obj.drawLayer;\r\n\r\n this.fileId = obj.fileId;\r\n this.rendererDict = obj.rendererDict;\r\n this.rendererRef = this.rendererDict[this.fileId];\r\n\r\n const project = obj.viewerConfig_project;\r\n if (this.removeOverlap === null) {\r\n this.removeOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.tempRemoveOverlap === null) {\r\n this.tempRemoveOverlap = project.projectProperties[\"PreventOverlap\"];\r\n }\r\n if (this.removeOverlapSame === null) {\r\n this.removeOverlapSame = project.projectProperties[\"PreventOverlapSame\"];\r\n }\r\n\r\n // set removeOverlap\r\n // save current settings (in tempRemoveOverlap) if structure gets changed\r\n if (obj.selectedLayer === 0) {\r\n if (!this.noConfig) {\r\n this.noConfig = true;\r\n this.tempRemoveOverlap = this.removeOverlap;\r\n this.tempRemoveOverlapSame = this.removeOverlapSame;\r\n this.removeOverlap = false;\r\n this.removeOverlapSame = false;\r\n window.forceSidebarUpdate();\r\n }\r\n } else {\r\n if (this.noConfig) {\r\n this.noConfig = false;\r\n this.removeOverlap = this.tempRemoveOverlap;\r\n this.removeOverlapSame = this.tempRemoveOverlapSame;\r\n window.forceSidebarUpdate();\r\n }\r\n }\r\n\r\n this.initTool();\r\n }\r\n\r\n initTool = () => {\r\n if (!this.init) {\r\n this.visibilityState = [];\r\n for (let s of this.structures) {\r\n this.visibilityState.push({\r\n id: s.id,\r\n visible: s.visible,\r\n });\r\n s.visible = false;\r\n }\r\n this.init = true;\r\n }\r\n };\r\n\r\n getPointInCanvas = (point) => {\r\n let pt = {\r\n x: Math.round(\r\n point.center.x * this.ctx.getTransform().a + this.ctx.getTransform().e\r\n ),\r\n y: Math.round(\r\n point.center.y * this.ctx.getTransform().d + this.ctx.getTransform().f\r\n ),\r\n };\r\n return pt;\r\n };\r\n\r\n getSubtypeLabels = (idx) => {\r\n if (!this.labels.includes(this.structures[idx].label)) {\r\n if (\r\n this.structures[idx].parentId === 0 ||\r\n !this.structures[idx].classificationSubtype\r\n ) {\r\n this.labels.push(\"\");\r\n } else {\r\n this.labels.push(this.structures[idx].label);\r\n }\r\n }\r\n if (this.structures[idx].hasChild) {\r\n let structs = this.structures.filter(\r\n (s) => this.structures[idx].id === s.parentId\r\n );\r\n for (let s of structs) {\r\n let index = this.structures.indexOf(s);\r\n if (index > -1) this.getSubtypeLabels(index);\r\n }\r\n }\r\n };\r\n\r\n getRois = () => {\r\n if (this.originalSelectedLayer !== 0) {\r\n if (this.prevSelectedLayer !== this.originalSelectedLayer) {\r\n this.rois = [];\r\n this.prevSelectedLayer = this.originalSelectedLayer;\r\n this.labels = [];\r\n let id = this.roiLayers[this.originalSelectedLayer].id;\r\n let idx = this.structures.findIndex((s) => s.id === id);\r\n this.getSubtypeLabels(idx);\r\n let rois = this.roiLayers[this.selectedLayer].layer.regionRois;\r\n if (rois.length > 0) {\r\n this.rois = rois.filter((roi) =>\r\n this.labels.includes(roi.subtypeName)\r\n );\r\n }\r\n }\r\n }\r\n };\r\n\r\n checkRTree = () => {\r\n this.getRois();\r\n if (!this.rtree) {\r\n this.rtree = new KDBush([]);\r\n }\r\n if (this.rtree && this.rtree.points.length !== this.rois.length) {\r\n this.treePoints = [];\r\n for (let point of this.rois) {\r\n this.treePoints.push([point.center.x, point.center.y]);\r\n }\r\n this.rtree = new KDBush(this.treePoints);\r\n }\r\n };\r\n\r\n worldToCanvas = (x, y) => {\r\n let pt = {\r\n x: Math.round(x * this.ctx.getTransform().a + this.ctx.getTransform().e),\r\n y: Math.round(y * this.ctx.getTransform().d + this.ctx.getTransform().f),\r\n };\r\n return pt;\r\n };\r\n\r\n yToWorld = (y) => {\r\n let p1 = this.rendererRef.getPointInCanvas({\r\n x: 0,\r\n y: y,\r\n });\r\n let p2 = this.rendererRef.getPointInCanvas({ x: 0, y: 0 });\r\n let p3 = this.rendererRef.getPosition();\r\n p1.y += p2.y - p3.y / this.rendererRef.getScale();\r\n return p1.y;\r\n };\r\n\r\n xToWorld = (x) => {\r\n let p1 = this.rendererRef.getPointInCanvas({\r\n x: x,\r\n y: 0,\r\n });\r\n let p2 = this.rendererRef.getPointInCanvas({ x: 0, y: 0 });\r\n let p3 = this.rendererRef.getPosition();\r\n p1.x += p2.x - p3.x / this.rendererRef.getScale();\r\n return p1.x;\r\n };\r\n\r\n worldDistance = (d) => {\r\n let dStart = 0;\r\n let dEnd = Math.abs(d);\r\n dStart = this.xToWorld(dStart);\r\n dEnd = this.xToWorld(dEnd);\r\n return parseInt(Math.abs(dEnd - dStart));\r\n };\r\n\r\n makeTiles = () => {\r\n let tileSizeX = 20;\r\n let tileSizeY = 20;\r\n let tiles = [];\r\n\r\n for (let x = 0; x < this.canvasWidth; x = x + tileSizeX) {\r\n for (let y = 0; y < this.canvasHeight; y = y + tileSizeY) {\r\n if (\r\n y > this.canvasHeight - tileSizeY &&\r\n x > this.canvasWidth - tileSizeX\r\n ) {\r\n tiles.push({\r\n TLx: this.xToWorld(x),\r\n TLy: this.yToWorld(y),\r\n BRx: this.xToWorld(this.canvasWidth),\r\n BRy: this.yToWorld(this.canvasHeight),\r\n });\r\n } else if (\r\n y > this.canvasHeight - tileSizeY &&\r\n x < this.canvasWidth - tileSizeX\r\n ) {\r\n tiles.push({\r\n TLx: this.xToWorld(x),\r\n TLy: this.yToWorld(y),\r\n BRx: this.xToWorld(x + tileSizeX),\r\n BRy: this.yToWorld(this.canvasHeight),\r\n });\r\n } else if (\r\n y < this.canvasHeight - tileSizeY &&\r\n x > this.canvasWidth - tileSizeX\r\n ) {\r\n tiles.push({\r\n TLx: this.xToWorld(x),\r\n TLy: this.yToWorld(y),\r\n BRx: this.xToWorld(this.canvasWidth),\r\n BRy: this.yToWorld(y + tileSizeY),\r\n });\r\n } else {\r\n tiles.push({\r\n TLx: this.xToWorld(x),\r\n TLy: this.yToWorld(y),\r\n BRx: this.xToWorld(x + tileSizeX),\r\n BRy: this.yToWorld(y + tileSizeY),\r\n });\r\n }\r\n }\r\n }\r\n this.searchRadius = tileSizeX;\r\n return tiles;\r\n };\r\n\r\n setHeatmapWithGrid = () => {\r\n let tiles = this.makeTiles();\r\n let results = [];\r\n let gridMaxValue = 0;\r\n\r\n for (let tile of tiles) {\r\n let result = this.rtree\r\n .range(tile.TLx, tile.TLy, tile.BRx, tile.BRy)\r\n .map((id) => this.treePoints[id]);\r\n if (result.length > gridMaxValue) gridMaxValue = result.length;\r\n if (result.length > 0) {\r\n let avgX = 0;\r\n let avgY = 0;\r\n for (let point of result) {\r\n avgX += point[0];\r\n avgY += point[1];\r\n }\r\n avgX = parseInt(avgX / result.length);\r\n avgY = parseInt(avgY / result.length);\r\n let center = this.worldToCanvas(avgX, avgY);\r\n results.push({\r\n x: center.x,\r\n y: center.y,\r\n value: result.length,\r\n radius: this.threshold, // this.rendererRef.getScale();,\r\n });\r\n }\r\n }\r\n this.maxValue = gridMaxValue * parseInt(this.threshold / 12);\r\n this.rendererRef.setHeatmapData(results, gridMaxValue);\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n setHeatmapWithoutGrid = (res) => {\r\n let data = res;\r\n let noGridMaxValue = 0;\r\n let searchRadius = this.threshold; /// this.rendererRef.getScale();\r\n this.searchRadius = parseInt(searchRadius);\r\n let results = [];\r\n for (let i = 0; i < data.length; i++) {\r\n const result = this.rtree\r\n .within(data[i][0], data[i][1], searchRadius)\r\n .map((id) => this.treePoints[id]);\r\n let center = this.worldToCanvas(data[i][0], data[i][1]);\r\n\r\n results.push({\r\n x: center.x,\r\n y: center.y,\r\n value: result.length,\r\n radius: this.threshold * this.rendererRef.getScale(),\r\n });\r\n if (result.length > noGridMaxValue) noGridMaxValue = result.length;\r\n }\r\n this.maxValue = noGridMaxValue;\r\n this.rendererRef.setHeatmapData(results, noGridMaxValue);\r\n window.forceSidebarUpdate();\r\n };\r\n\r\n checkVisibleObjects = () => {\r\n this.checkRTree();\r\n let TLx = this.xToWorld(0);\r\n let TLy = this.yToWorld(0);\r\n let BRx = this.xToWorld(this.canvasWidth);\r\n let BRy = this.yToWorld(this.canvasHeight);\r\n let result = this.rtree\r\n .range(TLx, TLy, BRx, BRy)\r\n .map((id) => this.treePoints[id]);\r\n return result;\r\n };\r\n\r\n drawCustomCursor(ctx, mousePosition) {\r\n this.mousePosition = mousePosition;\r\n if (ctx) {\r\n let result = this.checkVisibleObjects();\r\n let visiblePoints = 2500;\r\n if (result.length > 0 && result.length < visiblePoints) {\r\n this.activeGrid = 0;\r\n this.setHeatmapWithoutGrid(result);\r\n } else if (result.length > 0 && result.length > visiblePoints) {\r\n this.activeGrid = 1;\r\n this.setHeatmapWithGrid();\r\n } else if (result.length === 0) {\r\n this.rendererRef.setHeatmapData([], 100);\r\n }\r\n }\r\n }\r\n\r\n exit() {\r\n for (let s of this.visibilityState) {\r\n let i = this.structures.findIndex((item) => item.id === s.id);\r\n this.structures[i].visible = s.visible;\r\n }\r\n this.init = false;\r\n this.rois = [];\r\n this.prevSelectedLayer = 0;\r\n }\r\n\r\n renderConfiguration() {\r\n const pxlValue =\r\n this.activeGrid === 0\r\n ? this.searchRadius\r\n : this.worldDistance(this.threshold);\r\n return (\r\n
\r\n {/* canvas for debugging */}\r\n {/* */}\r\n {this.toolName}:\r\n \r\n {this.maxValue}\r\n
\r\n \r\n 1\r\n \r\n \r\n
\r\n Objects within {pxlValue}px\r\n
\r\n \r\n \r\n {\"Color Distribution Radius: \" + pxlValue + \"px\"}\r\n \r\n {\r\n this.threshold = v;\r\n window.forceSidebarUpdate();\r\n }}\r\n onChangeCommitted={() => {\r\n this.updateDrawing();\r\n }}\r\n />\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default HeatmapTool;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n Grid,\r\n DialogTitle,\r\n Dialog,\r\n LinearProgress,\r\n Tooltip,\r\n IconButton,\r\n} from \"@mui/material\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport { ChannelsConfig } from \"./components/Histogram\";\r\nimport VerticalToolBar, { Tools } from \"./components/VerticalToolBar\";\r\nimport SideBar from \"./components/SideBar\";\r\nimport Renderer from \"./components/Renderer\";\r\nimport OverlaySlider from \"./components/OverlaySlider\";\r\nimport WindowTool from \"./components/WindowTool\";\r\n\r\nimport Viewer3D from \"./components/3D-Viewer\";\r\nimport PenTool from \"./components/tools/PenTool\";\r\nimport MagicWandTool from \"./components/tools/MagicWandTool\";\r\nimport RegionGrowingTool from \"./components/tools/RegionGrowingTool\";\r\nimport RegionGrabCutTool from \"./components/tools/RegionGrabCutTool\";\r\nimport CopyTool from \"./components/tools/CopyTool\";\r\nimport SelectionTool from \"./components/tools/SelectionTool\";\r\nimport AITrainingTool from \"./components/tools/AITrainingTool\";\r\nimport FindSmallestROITool from \"./components/tools/FindSmallestROITool\";\r\nimport GridTool from \"./components/tools/GridTool\";\r\nimport GridAnnotationTool from \"./components/tools/GridAnnotationTool\";\r\nimport TilesClassificationTool from \"./components/tools/TilesClassificationTool\";\r\nimport TilesHistoPointCountingTool from \"./components/tools/TilesHistoPointCountingTool\";\r\nimport PlotNearestRoiTool from \"./components/tools/PlotNearestRoiTool\";\r\nimport RegionTool from \"./components/tools/RegionTool\";\r\nimport RectangleTool from \"./components/tools/RectangleTool\";\r\nimport CommentTool from \"./components/tools/CommentTool\";\r\nimport EllipseTool from \"./components/tools/EllipseTool\";\r\nimport FillTool from \"./components/tools/FillTool\";\r\nimport ActiveLearningTool from \"./components/tools/ActiveLearningTool\";\r\nimport InstantAnalysisTool from \"./components/tools/InstantAnalysisTool\";\r\nimport ClassroomChat from \"./components/ClassroomChat\";\r\nimport Gallery from \"./components/Gallery\";\r\nimport RBush from \"rbush\";\r\n// import * as turf from \"@turf/turf\";\r\n// use old turf library, since new turf lib breaks GeoJSON coordinates when buffering\r\n// import { buffer } from \"turf\";\r\n\r\nimport { RegionROI, CommentROI, createRoisFromAnno } from \"./utils/ROI\";\r\nimport { withAllViewerContexts } from \"./contexts/AllViewerContexts\";\r\nimport { withTiles } from \"./contexts/TilesContext\";\r\nimport { withResultTab } from \"./contexts/ResultTabContext\";\r\n\r\nimport RemoveCircleIcon from \"@mui/icons-material/RemoveCircle\";\r\nimport LinkIcon from \"@mui/icons-material/Link\";\r\nimport LinkOffIcon from \"@mui/icons-material/LinkOff\";\r\nimport {\r\n updateLayer,\r\n calcBoundingBox,\r\n createRegionRoi,\r\n} from \"./utils/PolygonUtil\";\r\n\r\nimport LandmarkTool from \"./components/tools/LandmarkTool\";\r\nimport HeatmapTool from \"./components/tools/HeatmapTool\";\r\n\r\nconst styles = {\r\n root: {\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"calc(100% - 64px)\",\r\n background: \"#EBEBEB\",\r\n },\r\n mainContainer: {\r\n flexGrow: 0,\r\n margin: 0,\r\n },\r\n excludeButton: {\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n zIndex: 100,\r\n },\r\n attachButton: {\r\n position: \"absolute\",\r\n top: 5,\r\n right: 40,\r\n zIndex: 100,\r\n color: \"#666\",\r\n },\r\n dropfieldRoot: {\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n background: \"rgba(0, 0, 0, 0.514)\",\r\n color: \"rgb(255, 255, 255)\",\r\n zIndex: 100,\r\n pointerEvents: \"none\",\r\n border: \"dashed white 4px\",\r\n textAlign: \"center\",\r\n paddingTop: \"calc(50vh - 74px)\",\r\n fontSize: \"20px\",\r\n },\r\n activeIndicatorBorder: {\r\n position: \"absolute\",\r\n pointerEvents: \"none\",\r\n zIndex: 100,\r\n height: \"100%\",\r\n width: \"100%\",\r\n border: \"solid #0673C1 4px\",\r\n },\r\n};\r\n\r\nclass Viewer extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this._isMounted = false;\r\n let sideBarWidthObject = this.props.persistentStorage.load(\"sideBarWidth\");\r\n let timeLineHeightObject =\r\n this.props.persistentStorage.load(\"timeLineHeight\");\r\n\r\n this.state = {\r\n minSideBarWidth: 455,\r\n minTimeLineHeight: 90,\r\n minRendererWidth: 600,\r\n minCanvasHeight: 100,\r\n sideBarWidth: sideBarWidthObject ? sideBarWidthObject : 455,\r\n timeLineHeight: timeLineHeightObject ? timeLineHeightObject : 170,\r\n classRoomChatWidth: 0,\r\n verticalToolBarWidth: 45,\r\n verticalToolBarIconsHeight: 0,\r\n project: null,\r\n user: null,\r\n //fileId: 0,\r\n viewerConfig: null,\r\n ome: null,\r\n omeDict: {},\r\n splitscreenFileIds: [],\r\n fullscreenFileIds: [],\r\n showSplitscreenDropzone: false,\r\n activeFileId: 0,\r\n importProgress: -1,\r\n //\r\n t: 0,\r\n c: 0,\r\n z: 0,\r\n minZ: 0,\r\n maxZ: 0,\r\n rois: [],\r\n selRoi: null,\r\n histogramConfig: {},\r\n activeTool: Tools.NONE,\r\n showGallery: false,\r\n show3DViewer: false,\r\n showPointCloud: false,\r\n showTilesGallery: false,\r\n updateStructure: true,\r\n showTimeBar: false,\r\n displayTimeBar: false,\r\n showZStackBar: false,\r\n showFileTreeView: true,\r\n commentLayers: {},\r\n landmarkLayers: {},\r\n drawLayer: {\r\n regionRois: [],\r\n inverted: false,\r\n clear: false,\r\n },\r\n containerKey: 0,\r\n opacity: 1.2,\r\n hC: null,\r\n\r\n zoomRoi: false,\r\n zoomLeft: 0,\r\n zoomRight: 0,\r\n zoomTop: 0,\r\n zoomBottom: 0,\r\n scrollGallery: \"auto\",\r\n alruns: false,\r\n exportSubstructures: false,\r\n formDataAICockpit: null,\r\n dimensionsUpdated: false,\r\n gridSize: null,\r\n annotatedFileIds: [],\r\n showFullscreen: false,\r\n showOverlay: false,\r\n showWindowTool: false,\r\n firstFullscreenOpacity: 100,\r\n secFullscreenOpacity: 0,\r\n fullscreenChain: true,\r\n loadedAnnotationsCounter: 0,\r\n frameArrayDict: {},\r\n showFirstAccordion: true,\r\n aiUsedStructures: [],\r\n refreshState: false,\r\n };\r\n this.mousePosition = {\r\n mouseX: 0,\r\n mouseY: 0,\r\n };\r\n // frontend cached images\r\n this.visibleImage = [];\r\n // necessary splitscreen vars\r\n this.rendererdict = {};\r\n this.chainList = {};\r\n this.chainListFileIds = {};\r\n this.zoomObjectDict = {};\r\n this.zoomObject = {\r\n zoomRoi: false,\r\n zoomBottom: 0,\r\n zoomTop: 0,\r\n zoomRight: 0,\r\n zoomLeft: 0,\r\n };\r\n\r\n // apply model after training\r\n this.applyModelAfterTraining = false;\r\n\r\n // check if automatic training\r\n this.automaticTraining = false;\r\n\r\n // selected objects for active learning\r\n this.selObjects = {\r\n coordinates: [],\r\n };\r\n\r\n this.selObjs = false;\r\n this.updateCount = 0;\r\n this.graphData = 0;\r\n this.changingFile = false;\r\n\r\n // initialize tools\r\n this.tools = [];\r\n this.tools[Tools.PEN_ROI] = new PenTool();\r\n this.tools[Tools.MAGICWAND_ROI] = new MagicWandTool();\r\n this.tools[Tools.REGIONGROWING_ROI] = new RegionGrowingTool();\r\n this.tools[Tools.REGIONGRABCUT_ROI] = new RegionGrabCutTool();\r\n this.tools[Tools.REGION_ROI] = new RegionTool();\r\n this.tools[Tools.RECTANGLE_ROI] = new RectangleTool();\r\n this.tools[Tools.COMMENT_ROI] = new CommentTool();\r\n this.tools[Tools.ELLIPSE_ROI] = new EllipseTool();\r\n this.tools[Tools.FILL] = new FillTool();\r\n this.tools[Tools.COPY_ROI] = new CopyTool();\r\n this.tools[Tools.FILL] = new FillTool();\r\n this.tools[Tools.SELECTION_ROI] = new SelectionTool();\r\n this.tools[Tools.FINDSMALLESTROI_ROI] = new FindSmallestROITool();\r\n this.tools[Tools.PLOTNEAREST_ROI] = new PlotNearestRoiTool();\r\n this.tools[Tools.AL] = new ActiveLearningTool();\r\n this.tools[Tools.AITRAINING] = new AITrainingTool(this);\r\n this.tools[Tools.GRIDTOOL] = new GridTool();\r\n this.tools[Tools.GRIDANNOTATIONTOOL] = new GridAnnotationTool();\r\n this.tools[Tools.SELECTION_Tile] = new TilesClassificationTool();\r\n this.tools[Tools.POINTCOUNTING_Tile] = new TilesHistoPointCountingTool();\r\n this.tools[Tools.LANDMARK] = new LandmarkTool();\r\n this.tools[Tools.HEATMAP] = new HeatmapTool();\r\n\r\n window.sharedToolParameters = {};\r\n\r\n //initialize roi specific tools\r\n this.structureTools = [];\r\n\r\n // new indices of Layers (for old projects)\r\n this.newLayerIndices = [];\r\n\r\n this.setHistogramConfig = this.setHistogramConfig.bind(this);\r\n this.createZoomObjectForRect = this.createZoomObjectForRect.bind(this);\r\n this.resetRoiZoom = this.resetRoiZoom.bind(this);\r\n\r\n this.saveChangesGallery = this.saveChangesGallery.bind(this);\r\n this.applyDL = this.applyDL.bind(this);\r\n this.setAlruns = this.setAlruns.bind(this);\r\n\r\n this.updateViewer = this.updateViewer.bind(this);\r\n\r\n this.galleryChangeTool = this.galleryChangeTool.bind(this);\r\n this.onGallerychangePage = this.onGallerychangePage.bind(this);\r\n\r\n this.resetRoiZoomInDict = this.resetRoiZoomInDict.bind(this);\r\n\r\n window.getMousePosition = this.getMousePosition;\r\n window.zoomToRect = this.zoomToRect;\r\n window.moveToRect = this.moveToRect;\r\n\r\n window.trainingProgress = this.trainingProgress;\r\n window.galleryTrainingProgress = this.galleryTrainingProgress;\r\n window.toggleClassRoomChat = this.toggleClassRoomChat;\r\n window.setGridSize = this.setGridSize;\r\n window.onSelectFile = this.onSelectFile;\r\n\r\n document.onmousedown = () => {\r\n if (this._isMounted) {\r\n this.forceUpdate();\r\n }\r\n };\r\n\r\n document.onmouseup = () => {\r\n if (this._isMounted) {\r\n this.forceUpdate();\r\n }\r\n };\r\n\r\n document.onmousemove = (e) => {\r\n this.mousePosition = {\r\n mouseX: e.pageX,\r\n mouseY: e.pageY,\r\n };\r\n };\r\n\r\n // document.onwheel = () => {\r\n // // TODO: [HWB-911] Find solution that only updates on first load of renderer\r\n // const { showGallery, show3DViewer, showTilesGallery } = this.state;\r\n // if (!showGallery && !show3DViewer && !showTilesGallery) {\r\n // this.forceUpdate();\r\n // }\r\n // };\r\n\r\n // initialize ProjectContext with Viewer Component Parameter\r\n this.props.projectContext.init(this);\r\n\r\n Backend.loadProject(\r\n {\r\n id: this.props.id,\r\n },\r\n (project) => {\r\n if (project.projectData) {\r\n try {\r\n project.projectData.files = project.projectData.files.map(\r\n (file) => {\r\n file.id = project.files.find(\r\n (f) =>\r\n f.sourcePath === file.sourcePath && f.scene === file.scene\r\n ).id;\r\n return file;\r\n }\r\n );\r\n } catch {\r\n console.log(\"error, id mapping failed, new Slides path?\");\r\n }\r\n\r\n this.setMountedState({\r\n formDataAICockpit: JSON.parse(\r\n project.projectData.formDataAICockpit\r\n ),\r\n });\r\n } else {\r\n for (let structure of project.viewerConfig.project.structures) {\r\n if (structure.toolPresets) {\r\n for (const toolName of Object.keys(structure.toolPresets)) {\r\n const tool = structure.tools.find(\r\n (tool) => tool.name === toolName\r\n );\r\n if (tool) {\r\n for (const [paramName, value] of Object.entries(\r\n structure.toolPresets[toolName]\r\n )) {\r\n const parameter = tool.parameters.find(\r\n (parameter) => parameter.name === paramName\r\n );\r\n if (parameter) {\r\n parameter.ui.default = value.default;\r\n if (parameter.ui.default[0] === \"[\") {\r\n // if e.g. range slider\r\n parameter.ui.default = JSON.parse(parameter.ui.default);\r\n } else if (parameter.type === \"int\") {\r\n parameter.ui.default = parseInt(\r\n parameter.ui.default,\r\n 10\r\n );\r\n } else if (parameter.type === \"float\") {\r\n parameter.ui.default = parseFloat(parameter.ui.default);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n // display project name in navigationBar\r\n window.setNavigationbarTitle(\r\n `${project.name} (${project.viewerConfig.project.label})`\r\n );\r\n let commentLayersObject = {};\r\n let landmarkLayersObject = {};\r\n let frameArrayDict = {};\r\n\r\n for (let file of project.files) {\r\n frameArrayDict[file.id] = {};\r\n commentLayersObject[file.id] = { commentRois: [] };\r\n landmarkLayersObject[file.id] = { landmarkRois: [] };\r\n\r\n if (!(file.id in this.rendererdict)) this.rendererdict[file.id] = {};\r\n if (project.projectData) {\r\n if (\"tMatrices\" in project.projectData) {\r\n if (project.projectData.tMatrices !== null) {\r\n if (file.id in project.projectData.tMatrices) {\r\n this.props.tiles.setTransformationMatnFactnOff(\r\n project.projectData.tMatrices[file.id],\r\n file.id,\r\n project.projectData.tFactors[file.id],\r\n project.projectData.tOffsets[file.id]\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (project.projectData) {\r\n let projectDataFiles = project.projectData.files;\r\n for (let j = 0; j < project.files.length; j++) {\r\n frameArrayDict[projectDataFiles[j].id] = {};\r\n // in case of old projects => create empty commentLayersObject\r\n if (!commentLayersObject[projectDataFiles[j].id]) {\r\n commentLayersObject[projectDataFiles[j].id] = { commentRois: [] };\r\n }\r\n\r\n if (!landmarkLayersObject[projectDataFiles[j].id]) {\r\n landmarkLayersObject[projectDataFiles[j].id] = {\r\n landmarkRois: [],\r\n };\r\n }\r\n\r\n if (projectDataFiles[j].commentRois) {\r\n commentLayersObject[projectDataFiles[j].id].commentRois =\r\n projectDataFiles[j].commentRois.map((e) => {\r\n return new CommentROI(\r\n e.regions,\r\n e.color,\r\n e.type,\r\n e.commentValue,\r\n e.computedValue\r\n );\r\n });\r\n }\r\n if (projectDataFiles[j].landmarkRois) {\r\n landmarkLayersObject[projectDataFiles[j].id].landmarkRois =\r\n projectDataFiles[j].landmarkRois.map((e) => {\r\n return new CommentROI(\r\n e.regions,\r\n e.color,\r\n e.type,\r\n e.commentValue,\r\n e.computedValue\r\n );\r\n });\r\n }\r\n for (let i = 0; i < projectDataFiles.length; i++) {\r\n if (projectDataFiles[i].id === project.files[j].id) {\r\n project.files[j].excludeScene =\r\n projectDataFiles[i].excludeScene;\r\n project.files[j].fullyAnnotated =\r\n projectDataFiles[i].fullyAnnotated;\r\n project.files[j].annotated = projectDataFiles[i].annotated;\r\n project.files[j].saved = projectDataFiles[i].saved;\r\n project.files[j].classId = projectDataFiles[i].classId;\r\n }\r\n }\r\n }\r\n }\r\n\r\n Backend.getCurrentUser((user) => {\r\n this.setMountedState({ user: user.fullName });\r\n this.props.projectContext.setState({ user: user.fullName });\r\n });\r\n\r\n this.migrateTools(project);\r\n\r\n this.setMountedState({\r\n project,\r\n frameArrayDict: frameArrayDict,\r\n commentLayers: commentLayersObject,\r\n landmarkLayers: landmarkLayersObject,\r\n });\r\n\r\n // ensuring that old files (old structure config) also work\r\n // check if new structures added\r\n let newStructures =\r\n project.projectData &&\r\n project.viewerConfig.project.structures.length >\r\n project.projectData.structures.length;\r\n\r\n // if newStructures make project compatible\r\n if (newStructures) {\r\n // this.makeProjectCompatible(project); // needs to be fixed\r\n }\r\n\r\n this.initLayersAndStructures();\r\n\r\n let openedFileId = this.props.persistentStorage.load(\"opened_file_id\");\r\n openedFileId = openedFileId ? openedFileId : project.files[0].id;\r\n //Set correct aFileID\r\n if (this.props.persistentStorage.load(\"ActiveFileId\")) {\r\n this.setMountedState({\r\n activeFileId: this.props.persistentStorage.load(\"ActiveFileId\"),\r\n });\r\n } else {\r\n this.setMountedState({ activeFileId: openedFileId });\r\n }\r\n //Set active FileID as first splitscreenFileID - needed if new project\r\n if (!this.props.persistentStorage.load(\"SplitscreenFileIds\")) {\r\n let sFileIds = this.state.splitscreenFileIds;\r\n sFileIds.push(this.state.activeFileId);\r\n this.setMountedState({\r\n splitscreenFileIds: sFileIds,\r\n });\r\n }\r\n\r\n let fsFileIds = this.state.fullscreenFileIds;\r\n fsFileIds.push(this.state.activeFileId);\r\n this.setMountedState({\r\n fullscreenFileIds: fsFileIds,\r\n });\r\n\r\n if (this.state.splitscreenFileIds) {\r\n if (\r\n !this.state.splitscreenFileIds.includes(this.state.activeFileId)\r\n ) {\r\n // make sure that activeFileId is in SplitscreenFileIds\r\n let sFileIds = this.state.splitscreenFileIds;\r\n sFileIds.push(this.state.activeFileId);\r\n this.setMountedState({\r\n splitscreenFileIds: sFileIds,\r\n });\r\n }\r\n let zoom = null;\r\n let newZoomObjectDict = null;\r\n for (const value of Object.values(this.state.splitscreenFileIds)) {\r\n //load file with needed information\r\n this.openFile(value, this.props.id, false);\r\n //load zoomstate\r\n zoom = this.props.persistentStorage.load(\"zoomObject\" + value);\r\n\r\n newZoomObjectDict = this.zoomObjectDict;\r\n if (zoom) {\r\n newZoomObjectDict[value] = JSON.parse(JSON.stringify(zoom));\r\n } else {\r\n newZoomObjectDict[value] = {\r\n zoomRoi: false,\r\n zoomLeft: 0,\r\n zoomRight: 0,\r\n zoomTop: 0,\r\n zoomBottom: 0,\r\n };\r\n }\r\n }\r\n this.zoomObjectDict = newZoomObjectDict;\r\n } else {\r\n //this.props.tiles.setFileId(openedFileId); //not needed anymore?\r\n this.openFile(openedFileId, this.props.id);\r\n }\r\n\r\n //this.props.tiles.setFileId(openedFileId); //not needed anymore?\r\n this.setMountedState({\r\n showGallery:\r\n this.state.viewerConfig.project.projectStringProperties[\r\n \"ViewerType\"\r\n ] == \"FilesGallery\",\r\n });\r\n this.setSideBarWidth();\r\n this.props.projectHistory.init(this);\r\n this.props.projectContext.setState({\r\n project: project,\r\n });\r\n }\r\n );\r\n }\r\n\r\n setSelLayerConfig = () => {\r\n // set selected layer defined in config\r\n let idx = this.props.projectContext.structures.findIndex(\r\n (element) => element.defaultSelected\r\n );\r\n if (idx !== -1) {\r\n this.setSelectedLayer(idx);\r\n }\r\n };\r\n\r\n //take tool structure from viewerconfig and set saved tool parameters if same type\r\n migrateTools = (project) => {\r\n if (project.projectData) {\r\n for (let [\r\n structureIndex,\r\n structure,\r\n ] of project.projectData.structures.entries()) {\r\n for (let [toolIndex, tool] of structure.tools.entries()) {\r\n let viewerConfigTool = project.viewerConfig.tools.find(\r\n (vTool) => vTool.name === tool.name\r\n );\r\n if (\r\n typeof viewerConfigTool === \"undefined\" &&\r\n project.viewerConfig.project.structures[structureIndex]\r\n ) {\r\n //if tool was changed in project config\r\n tool =\r\n project.viewerConfig.project.structures[structureIndex].tools[\r\n toolIndex\r\n ];\r\n if (tool) {\r\n viewerConfigTool = project.viewerConfig.tools.find(\r\n (vTool) => vTool.name === tool.name\r\n );\r\n }\r\n }\r\n if (viewerConfigTool) {\r\n let transformedVParameters = this.generateToolParameterDict(\r\n viewerConfigTool.parameters\r\n );\r\n for (const [key, value] of Object.entries(transformedVParameters)) {\r\n if (key in tool.parameters) {\r\n if (typeof tool.parameters[key] === typeof value) {\r\n transformedVParameters[key] = tool.parameters[key];\r\n }\r\n }\r\n }\r\n tool.parameters = transformedVParameters;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n makeProjectCompatible = (project) => {\r\n // does not work in all cases --> needs to get fixed\r\n window.showWarningSnackbar(\r\n \"Please wait. Project was created with old version. Adjusting project for new version ...\"\r\n );\r\n\r\n let sructuresWithNoId = [];\r\n if (project.projectData) {\r\n sructuresWithNoId = project.projectData.structures.filter(\r\n (element) => element.id !== 0\r\n );\r\n }\r\n\r\n if (sructuresWithNoId.length === 0 && project.projectData) {\r\n project.projectData.structures.forEach((projDataStr) => {\r\n let idx = project.viewerConfig.project.structures.findIndex(\r\n (viewerConfStr) => viewerConfStr.label === projDataStr.label\r\n );\r\n // get indices of old structures to adjust roiLayers (annotations)\r\n if (!this.newLayerIndices.includes(idx)) {\r\n this.newLayerIndices.push(idx);\r\n }\r\n });\r\n project.projectData.structures = project.viewerConfig.project.structures;\r\n }\r\n\r\n // load all files and change id of annotations to new position\r\n this.loadAllFiles();\r\n };\r\n\r\n loadAllFiles = () => {\r\n const { project } = this.state;\r\n\r\n let allRoiLayers = {};\r\n for (let file of this.state.project.files) {\r\n allRoiLayers[file.id] = [];\r\n if (project.viewerConfig.project.structures.length > 0) {\r\n allRoiLayers[file.id] = project.viewerConfig.project.structures.map(\r\n () => {\r\n return {\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n }\r\n );\r\n }\r\n }\r\n\r\n let newProjectObject = project;\r\n let newRoiLayers = [];\r\n let files = project.files;\r\n let projId = project.id;\r\n if (newProjectObject.projectData !== null) {\r\n let i = 0;\r\n let fileAnnotationsLoaded = 0;\r\n let loadAnnotationsFunction = () => {\r\n newRoiLayers = allRoiLayers;\r\n // if all annotations of files loaded save annotations with adjusted id\r\n if (fileAnnotationsLoaded === newProjectObject.files.length - 1) {\r\n this.createAnnotationsProjectModel(newRoiLayers);\r\n }\r\n fileAnnotationsLoaded = fileAnnotationsLoaded + 1;\r\n };\r\n for (let file of newProjectObject.files) {\r\n this.loadAnnotations(\r\n file,\r\n files[i].id,\r\n projId,\r\n allRoiLayers,\r\n loadAnnotationsFunction\r\n );\r\n i = i + 1;\r\n }\r\n }\r\n };\r\n\r\n createAnnotationsProjectModel = (newRoiLayers) => {\r\n const { project } = this.state;\r\n\r\n const projectModel = {\r\n id: project.id,\r\n files: project.files.map((e) => ({\r\n id: e.id,\r\n annotations: newRoiLayers[e.id].reduce((acc, e, i) => {\r\n if (e.layer.regionRois.length > 0) {\r\n acc.push({\r\n id: i,\r\n geoJSON: {\r\n type: \"MultiPolygon\",\r\n coordinates: e.layer.regionRois.map((c) => c.regions),\r\n withHoles: true,\r\n color1: e.layer.regionRois.map((c) => [c.color]),\r\n subtype: e.layer.regionRois.map((c) => [c.isSubtype]),\r\n name: e.layer.regionRois.map((c) => [c.subtypeName]),\r\n aiAnnotated: e.layer.regionRois.map((c) => [c.aiAnnotated]),\r\n isAnnotated: e.layer.regionRois.map((c) => [c.isAnnotated]),\r\n isLabeled: e.layer.regionRois.map((c) => [c.isLabeled]),\r\n isSelObj: e.layer.regionRois.map((c) => [c.isSelObj]),\r\n isSaved: e.layer.regionRois.map((c) => [c.isSaved]),\r\n z: e.layer.regionRois.map((c) => [c.z]),\r\n comment: e.layer.regionRois.map((c) => [c.comment]),\r\n tileName: e.layer.regionRois.map((c) => [c.tileName]),\r\n structureId: e.layer.regionRois.map((c) => [c.structureId]),\r\n isObject: e.layer.regionRois.map((c) => [c.isObject]),\r\n frequencyClass: e.layer.regionRois.map((c) => [\r\n c.frequencyClass,\r\n ]),\r\n },\r\n });\r\n }\r\n return acc;\r\n }, []),\r\n })),\r\n onlyAnnotations: true,\r\n };\r\n\r\n // save only annotations of project with adjusted id\r\n this.saveWithSpinloader(projectModel);\r\n };\r\n\r\n setAIFormData = (formDataAICockpit) => {\r\n this.setMountedState({ formDataAICockpit: formDataAICockpit });\r\n };\r\n\r\n alterStructure = (c) => {\r\n let project = this.state.project;\r\n // load svg's text into blob so we can access it\r\n for (let tool of project.viewerConfig.tools) {\r\n if (!this.tools[tool.name]) {\r\n this.tools[tool.name] = new InstantAnalysisTool(tool, this);\r\n }\r\n }\r\n // load viewer configuration\r\n let allToolNames = Object.values(project.viewerConfig.tools).map(\r\n (v) => v.name\r\n );\r\n let toolParameters = [];\r\n for (let t of c.tools) {\r\n if (!window.sharedToolParameters[t.name]) {\r\n window.sharedToolParameters[t.name] = this.generateToolParameterDict(\r\n t.parameters\r\n );\r\n }\r\n if (!toolParameters[t.name]) {\r\n if (t.shared) {\r\n toolParameters[t.name] = window.sharedToolParameters[t.name];\r\n } else {\r\n toolParameters[t.name] = this.generateToolParameterDict(t.parameters);\r\n }\r\n }\r\n }\r\n\r\n return Object.assign(c, {\r\n isSubtype: c.parentId > 0 ? true : false,\r\n hasChild: this.structureHasChild(c.id),\r\n subtypeLevel: this.findStructureSubtypeLevel(c.parentId),\r\n tools: c.tools.map((t) => ({\r\n name: t.name,\r\n parameters: toolParameters[t.name],\r\n })),\r\n classFrequencies: {\r\n class_0: 0,\r\n class_1: 0,\r\n class_2: 0,\r\n class_3: 0,\r\n class_4: 0,\r\n class_5: 0,\r\n class_6: 0,\r\n },\r\n allToolNames: allToolNames,\r\n visible: true,\r\n isUnfolded: c.parentId > 0 ? false : true,\r\n showSubtypes: false,\r\n addSubtypeText: \"\",\r\n });\r\n };\r\n\r\n updateGlobalZ = (z, minZ, maxZ) => {\r\n this.setMountedState({ z, minZ, maxZ });\r\n };\r\n\r\n updateGlobalT = (t) => {\r\n this.setMountedState({ t: t });\r\n };\r\n\r\n structureHasChild = (id) => {\r\n // check if structure (id) has child --> check if other structure has parentId of structure\r\n let hasChild = false;\r\n this.state.project.viewerConfig.project.structures.forEach((element) => {\r\n if (element.parentId === id) {\r\n hasChild = true;\r\n }\r\n });\r\n return hasChild;\r\n };\r\n\r\n findStructureSubtypeLevel = (parentId, subtypeLevelCount = 0) => {\r\n // return subtype level of structure --> calculate number of parent structures recursively\r\n let parentIndex = this.getParentIndex(parentId);\r\n if (parentIndex !== -1) {\r\n return this.findStructureSubtypeLevel(\r\n this.state.project.viewerConfig.project.structures[parentIndex]\r\n .parentId,\r\n subtypeLevelCount + 1\r\n );\r\n } else {\r\n return subtypeLevelCount;\r\n }\r\n };\r\n\r\n getParentIndex = (parentId) => {\r\n let { structures } = this.props.projectContext;\r\n if (structures.length < 1) {\r\n structures = this.state.project.viewerConfig.project.structures;\r\n }\r\n // return index of parent structures in all structures\r\n let parentIndex = structures.findIndex(\r\n (element) => element.id === parentId\r\n );\r\n return parentIndex;\r\n };\r\n\r\n getParentIndexLayer = (structure) => {\r\n const { structures } = this.props.projectContext;\r\n // get index of parent roilayer\r\n let index = structures.findIndex((element) => element.id === structure.id);\r\n while (\r\n structures[index].subtypeLevel !== 0 &&\r\n structures[index].classificationSubtype\r\n ) {\r\n let pIndex = this.getParentIndex(structures[index].parentId);\r\n if (pIndex >= 0) index = pIndex;\r\n else break;\r\n }\r\n return structures.findIndex((element) => element === structures[index]);\r\n };\r\n\r\n clearOtherLayers = () => {\r\n const currentFileId = this.props.projectContext.fileId;\r\n let project = this.state.project;\r\n if (project.projectData) {\r\n let roiLayers = this.props.projectContext.roiLayers;\r\n for (let file of project.files) {\r\n if (file.id === currentFileId) {\r\n continue;\r\n }\r\n roiLayers[file.id] = [];\r\n roiLayers[file.id] = project.projectData.structures.map((c) => {\r\n return {\r\n id: c.id,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n });\r\n }\r\n this.props.projectContext.setState({ roiLayers });\r\n }\r\n };\r\n\r\n initLayersAndStructures = () => {\r\n let project = this.state.project;\r\n\r\n // load svg's text into blob so we can access it\r\n for (let tool of project.viewerConfig.tools) {\r\n this.tools[tool.name] = new InstantAnalysisTool(tool, this);\r\n }\r\n this.setMountedState({ viewerConfig: project.viewerConfig });\r\n let roiLayers = {};\r\n let commentLayers = {};\r\n let landmarkLayers = {};\r\n let structures = project.viewerConfig.project.structures.map((c) => {\r\n return this.alterStructure(c);\r\n });\r\n\r\n for (let file of project.files) {\r\n roiLayers[file.id] = [];\r\n commentLayers[file.id] = { commentRois: [] };\r\n landmarkLayers[file.id] = { landmarkRois: [] };\r\n if (project.viewerConfig.project.structures.length > 0) {\r\n if (\r\n project.projectData &&\r\n project.projectData.structures &&\r\n project.projectData.structures[0].id !== 0\r\n ) {\r\n roiLayers[file.id] = project.projectData.structures.map((c) => {\r\n return {\r\n id: c.id,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n });\r\n } else {\r\n roiLayers[file.id] = project.viewerConfig.project.structures.map(\r\n (c) => {\r\n return {\r\n id: c.id,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n }\r\n );\r\n }\r\n }\r\n }\r\n\r\n // load data from project.json\r\n if (project.projectData) {\r\n let histogramConfig = this.state.histogramConfig;\r\n for (let file of project.projectData.files) {\r\n histogramConfig[file.id] = file.histogram;\r\n for (let i = 0; i < project.projectData.structures.length; i++) {\r\n // if structure from config is not same as saved one --> add dynamic structure\r\n if (\r\n !structures[i] ||\r\n structures[i].id !== project.projectData.structures[i].id\r\n ) {\r\n // add additional dynamic structure at index\r\n structures.splice(\r\n i,\r\n 0,\r\n this.alterStructure({\r\n dynamic: true,\r\n visible: true,\r\n isUnfolded: true,\r\n classificationSubtype: false,\r\n parentId: 0,\r\n showSubtypes: false,\r\n subtypeLevel: 0,\r\n allToolNames: structures[0].allToolNames,\r\n tools: project.viewerConfig.project.dynamicStructure.tools,\r\n })\r\n );\r\n const structure = project.projectData.structures[i];\r\n // make correct value for unfolded\r\n if (structure.parentId) {\r\n structures[i].isUnfolded = false;\r\n }\r\n structures[i] = Object.assign(structures[i], structure);\r\n\r\n // merge stored parameters into the toolsconfig\r\n for (let t of structures[i].tools) {\r\n let storedParams = structure.tools.find((c) => c.name === t.name);\r\n if (storedParams) {\r\n Object.assign(t.parameters, storedParams.parameters);\r\n }\r\n }\r\n } else {\r\n const structure = project.projectData.structures[i];\r\n if (structure.id === 0) {\r\n // for old projects\r\n // do nothing\r\n } else {\r\n // merge stored parameters into the toolsconfig\r\n for (const toolIndex in structure.tools) {\r\n let t = structure.tools[toolIndex];\r\n let storedParams = structure.tools.find(\r\n (c) => c.name === t.name\r\n );\r\n if (storedParams) {\r\n Object.assign(t.parameters, storedParams.parameters);\r\n }\r\n if (\r\n project.viewerConfig.project.structures[i] &&\r\n !(t.name in this.tools)\r\n ) {\r\n //happens when tool changed in config\r\n t =\r\n project.viewerConfig.project.structures[i].tools[toolIndex];\r\n }\r\n if (t) {\r\n if (\r\n this.tools[t.name] &&\r\n this.tools[t.name].toolConfig.shared\r\n ) {\r\n Object.assign(\r\n window.sharedToolParameters[t.name],\r\n t.parameters\r\n );\r\n t.parameters = window.sharedToolParameters[t.name];\r\n }\r\n structure.tools[toolIndex] = t;\r\n }\r\n }\r\n\r\n structures[i] = Object.assign(structures[i], structure);\r\n\r\n if (this.checkIfErrorInProjectData(structures[i])) {\r\n structures[i].hasChild = this.structureHasChild(\r\n structures[i].id\r\n );\r\n structures[i].isSubtype =\r\n structures[i].parentId > 0 ? true : false;\r\n structures[i].subtypeLevel = this.findStructureSubtypeLevel(\r\n structures[i].parentId\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n // load annotation layers\r\n for (let anno of file.annotations) {\r\n let newRegionRois = createRoisFromAnno(anno);\r\n roiLayers[file.id][anno.id].layer.regionRois = newRegionRois;\r\n roiLayers[file.id][anno.id].tree.clear();\r\n roiLayers[file.id][anno.id].tree.load(\r\n newRegionRois.map((item) => item.treeItem)\r\n );\r\n }\r\n }\r\n\r\n this.selObjects.coordinates = project.projectData.selectedObjects;\r\n this.graphData = project.projectData.selectedObjects\r\n ? this.selObjects.coordinates.length\r\n : 0;\r\n this.setMountedState({ histogramConfig: histogramConfig });\r\n }\r\n\r\n if (this._isMounted) this.forceUpdate();\r\n this.props.projectContext.setState({\r\n roiLayers,\r\n structures,\r\n viewerConfig: project.viewerConfig,\r\n });\r\n };\r\n\r\n checkIfErrorInProjectData = (str) => {\r\n if (!str.classificationSubtype && str.parentId === 0 && !str.hasChild) {\r\n // if parent\r\n return true;\r\n } else if (str.classificationSubtype && str.subtypeLevel === 0) {\r\n // if classification subtype error\r\n return true;\r\n } else if (\r\n !str.classificationSubtype &&\r\n str.parentId > 0 &&\r\n !str.isSubtype\r\n ) {\r\n // if substructure error\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n //zoomToRoi - creates zoom object with given coordinates and\r\n createZoomObjectForRect(gl, left, right, top, bottom) {\r\n // set state that viewer/rendererdict[this.state.activeFileId] zooms to roi thath was clicked in gallery with mouse wheel\r\n\r\n this.X1 = 0;\r\n this.Y1 = 0;\r\n\r\n let newZoomObjectDict = this.zoomObjectDict;\r\n newZoomObjectDict[this.state.activeFileId] = {\r\n zoomRoi: true,\r\n zoomLeft: left,\r\n zoomRight: right,\r\n zoomTop: top,\r\n zoomBottom: bottom,\r\n };\r\n this.setMountedState({\r\n showGallery: gl,\r\n showTilesGallery: gl,\r\n });\r\n this.zoomObjectDict = newZoomObjectDict;\r\n\r\n /*if (this.state.sideBarWidth === 0) {\r\n this.toggleSideBar();\r\n }*/\r\n }\r\n\r\n setGalleryTool = () => {\r\n this.setMountedState({ activeTool: Tools.NONE });\r\n };\r\n\r\n changeToSelectedFile = () => {\r\n const { project } = this.state;\r\n\r\n let selectedFileId = null;\r\n // find id of file that is selected in gallery\r\n project.files.forEach((f) => {\r\n if (f.selectedInGallery === true) {\r\n selectedFileId = f.id;\r\n }\r\n });\r\n\r\n if (selectedFileId) {\r\n this.onSelectFile(selectedFileId);\r\n }\r\n };\r\n\r\n resetRoiZoom() {\r\n this.zoomObject.zoomRoi = false;\r\n }\r\n\r\n resetRoiZoomInDict(fileId) {\r\n let newZoomObjectDict = this.zoomObjectDict;\r\n if (newZoomObjectDict) {\r\n newZoomObjectDict[fileId].zoomRoi = false;\r\n this.zoomObjectDict = newZoomObjectDict;\r\n this.setMountedState({ refreshState: true });\r\n }\r\n }\r\n\r\n setHistogramConfig(hConfig) {\r\n this.setMountedState({ hC: hConfig });\r\n }\r\n\r\n generateToolParameterDict(parameters) {\r\n if (\"paramLabels\" in parameters) return parameters;\r\n //if (parameters.name) return parameters;\r\n let paramDict = {};\r\n let paramLabelDict = {};\r\n for (let parameter of parameters) {\r\n paramDict[parameter.name] = parameter.ui.default;\r\n paramLabelDict[parameter.name] = parameter.ui.label;\r\n }\r\n paramDict[\"paramLabels\"] = paramLabelDict;\r\n return paramDict;\r\n }\r\n\r\n processGeoJSONArray = (anno, frameArray) => {\r\n const { selectedLayer, structures } = this.props.projectContext;\r\n if (anno.geoJSONArray) {\r\n let layerID = anno.id === -1 ? selectedLayer : structures[anno.id].id;\r\n for (let item of anno.geoJSONArray) {\r\n const frame = item.i;\r\n if (item.geoJSON == null) continue;\r\n let newRegionRoisObject = item.geoJSON.coordinates.map(\r\n (c) => new RegionROI({ regions: c })\r\n );\r\n let layerObject = {\r\n id: layerID,\r\n isKeyFrame: true,\r\n layer: {\r\n regionRois: newRegionRoisObject,\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n };\r\n layerObject.tree.load(newRegionRoisObject.map((item) => item.treeItem));\r\n\r\n if (frame in frameArray) {\r\n const tIdx = frameArray[frame].findIndex(\r\n (item) => item && item.id === layerID\r\n );\r\n if (tIdx >= 0) {\r\n frameArray[frame][tIdx] = layerObject;\r\n } else {\r\n frameArray[frame].push(layerObject);\r\n }\r\n } else {\r\n frameArray[frame] = [layerObject];\r\n }\r\n if (frame === this.state.t || frame === this.state.z) {\r\n anno.geoJSON = item.geoJSON;\r\n }\r\n }\r\n }\r\n };\r\n\r\n updateProject = (project, fileId = this.props.projectContext.fileId) => {\r\n const { roiLayers, selectedLayer } = this.props.projectContext;\r\n let frameArray = this.state.frameArrayDict[this.state.activeFileId];\r\n\r\n // load annotation layers\r\n for (let anno of project.files.find((c) => c.id === fileId).annotations) {\r\n this.processGeoJSONArray(anno, frameArray);\r\n if (anno.geoJSON === null) continue;\r\n let newRegionRois = createRoisFromAnno(anno);\r\n let idx = 0;\r\n if (anno.id === -1) {\r\n idx = selectedLayer;\r\n }\r\n roiLayers[fileId][idx].layer.regionRois = newRegionRois;\r\n roiLayers[fileId][idx].tree.load(\r\n newRegionRois.map((item) => item.treeItem)\r\n );\r\n }\r\n\r\n this.props.projectContext.setState({ roiLayers: roiLayers });\r\n };\r\n\r\n updateFileClasses = (projectWithClasses) => {\r\n const { project } = this.props.projectContext;\r\n projectWithClasses.files.forEach((file, fileIndex) => {\r\n project.files[fileIndex].classId = file.classId;\r\n });\r\n };\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n window.addEventListener(\"resize\", () => this.updateDimensions());\r\n window.addEventListener(\"keydown\", this.keyDown);\r\n\r\n let ids = this.props.persistentStorage.load(\"SplitscreenFileIds\");\r\n if (ids) {\r\n this.setMountedState({ splitscreenFileIds: ids });\r\n }\r\n\r\n let activeId = this.props.persistentStorage.load(\"ActiveFileId\");\r\n if (activeId) {\r\n this.setMountedState({ activeFileId: activeId });\r\n }\r\n\r\n let chainList = this.props.persistentStorage.load(\"chainList\");\r\n if (chainList) this.chainList = chainList;\r\n let chainListFileIds =\r\n this.props.persistentStorage.load(\"chainListFileIds\");\r\n if (chainListFileIds) this.chainListFileIds = chainListFileIds;\r\n\r\n if (ids) {\r\n let newZoomObjectDict = this.zoomObjectDict;\r\n let zoom;\r\n for (const value of Object.values(ids)) {\r\n zoom = this.props.persistentStorage.load(\"zoomObject\" + value);\r\n if (zoom) {\r\n zoom.zoomRoi = true;\r\n }\r\n if (zoom) {\r\n newZoomObjectDict[value] = JSON.parse(JSON.stringify(zoom));\r\n } else {\r\n newZoomObjectDict[value] = {\r\n zoomRoi: false,\r\n zoomLeft: 0,\r\n zoomRight: 0,\r\n zoomTop: 0,\r\n zoomBottom: 0,\r\n };\r\n }\r\n }\r\n this.zoomObjectDict = newZoomObjectDict;\r\n }\r\n\r\n this.props.spinloader.setRightWidth(\r\n this.state.sideBarWidth +\r\n this.state.verticalToolBarWidth +\r\n this.state.classRoomChatWidth\r\n );\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n window.removeEventListener(\"resize\", () => this.updateDimensions());\r\n window.removeEventListener(\"keydown\", this.keyDown);\r\n window.setNavigationbarTitle(undefined);\r\n this.props.spinloader.hide();\r\n }\r\n\r\n /**\r\n * handle shortcuts\r\n * @param {ActionEvent} e Event when keyboard button is pressed\r\n */\r\n keyDown = (e) => {\r\n let elem = null;\r\n if (\r\n this.rendererdict[this.state.activeFileId] &&\r\n this.rendererdict[this.state.activeFileId].keyDown\r\n )\r\n this.rendererdict[this.state.activeFileId].keyDown(e);\r\n if (\r\n document.activeElement.localName !== \"input\" &&\r\n document.activeElement.localName !== \"textarea\"\r\n ) {\r\n if (e.key === \"Insert\") {\r\n // [shift] + [Numpad 0]\r\n elem = document.getElementById(\"toolZoomFitBtn\");\r\n } else if (e.key === \"End\") {\r\n // [shift] + [Numpad 1]\r\n elem = document.getElementById(\"toolZoomOriginalBtn\");\r\n } else if (e.shiftKey) {\r\n switch (e.key) {\r\n case \"*\":\r\n case \"+\": // [shift] + [+]\r\n elem = document.getElementById(\"toolZoomInBtn\");\r\n break;\r\n case \"_\":\r\n case \"-\": // [shift] + [-]\r\n elem = document.getElementById(\"toolZoomOutBtn\");\r\n break;\r\n case \"=\": // [shift] + [0]\r\n elem = document.getElementById(\"toolZoomFitBtn\");\r\n break;\r\n case \"!\": // [shift] + [1]\r\n elem = document.getElementById(\"toolZoomOriginalBtn\");\r\n break;\r\n case \"R\": // [shift] + [r]\r\n elem = document.getElementById(\"toggleAllStructuresBtn\");\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n if (e.ctrlKey) {\r\n switch (e.key) {\r\n case \"ArrowRight\":\r\n this.openNextFile();\r\n break;\r\n case \"ArrowLeft\":\r\n this.openPrevFile();\r\n break;\r\n case \"s\": // [ctrl] + [s]\r\n this.onSaveClick();\r\n e.preventDefault();\r\n break;\r\n case \"1\": // [ctrl] + [1]\r\n elem = document.getElementById(\"toolPenBtn\");\r\n break;\r\n case \"2\": // [ctrl] + [2]\r\n elem = document.getElementById(\"toolRegionBtn\");\r\n break;\r\n case \"3\": // [ctrl] + [3]\r\n elem = document.getElementById(\"toolSelectBtn\");\r\n break;\r\n case \"4\": // [ctrl] + [4]\r\n elem = document.getElementById(\"toolCopyBtn\");\r\n break;\r\n case \"g\": // [ctrl] + [g]\r\n this.setMountedState({\r\n showTilesGallery: this.state.showTilesGallery ? false : true,\r\n });\r\n this.toggleSideBar();\r\n this.setGalleryTool();\r\n this.gallery.setPageSelectedRoi(this.state.selRoi);\r\n e.preventDefault();\r\n break;\r\n case \"5\": // [ctrl] + [5]\r\n elem = document.getElementById(\"toolFillBtn\");\r\n break;\r\n case \"p\": //[ctrl] + [p]\r\n elem = document.getElementById(\"toolPrintBtn\");\r\n break;\r\n\r\n case \"z\": //[ctrl] + [z]\r\n if (!this.state.showGallery && !this.state.showTilesGallery) {\r\n this.props.projectHistory.undo();\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"y\": //[ctrl] + [y]\r\n if (!this.state.showGallery && !this.state.showTilesGallery) {\r\n this.props.projectHistory.redo();\r\n }\r\n e.preventDefault();\r\n break;\r\n default:\r\n break;\r\n }\r\n } else {\r\n switch (e.key) {\r\n case \" \": // space\r\n if (this.state.showTilesGallery) {\r\n this.gallery.handleChangeCrosshair(null, true);\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"Delete\":\r\n if (\r\n typeof this.state.showTilesGallery === \"undefined\" &&\r\n this.state.showGallery\r\n ) {\r\n this.gallery.deleteSelectedRoi();\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowUp\":\r\n if (this.state.showTilesGallery) {\r\n this.gallery.handleChangePage(null, \"up\");\r\n } else if (\r\n typeof this.state.showTilesGallery === \"undefined\" ||\r\n this.state.showTilesGallery === false\r\n ) {\r\n if (this.state.activeTool === \"selection\") {\r\n // select roi next to selected roi\r\n this.rendererdict[this.state.activeFileId].keyDownSelection(e);\r\n } else if (this.state.activeTool !== \"rectangle\") {\r\n // translate by the offset to the destination point if not in result tab\r\n if (!this.props.resultTab.getZoomLevelFixed()) {\r\n this.rendererdict[this.state.activeFileId].ctx.translate(\r\n 0,\r\n 50\r\n );\r\n }\r\n }\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowDown\":\r\n if (this.state.showTilesGallery) {\r\n this.gallery.handleChangePage(null, \"down\");\r\n } else if (\r\n typeof this.state.showTilesGallery === \"undefined\" ||\r\n this.state.showTilesGallery === false\r\n ) {\r\n if (this.state.activeTool === \"selection\") {\r\n // select roi next to selected roi\r\n this.rendererdict[this.state.activeFileId].keyDownSelection(e);\r\n } else if (this.state.activeTool !== \"rectangle\") {\r\n // translate by the offset to the destination point if not in result tab\r\n if (!this.props.resultTab.getZoomLevelFixed()) {\r\n this.rendererdict[this.state.activeFileId].ctx.translate(\r\n 0,\r\n -50\r\n );\r\n }\r\n }\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowLeft\":\r\n if (\r\n typeof this.state.showTilesGallery === \"undefined\" ||\r\n this.state.showTilesGallery === false\r\n ) {\r\n if (this.state.showGallery) {\r\n this.gallery.selectNewImage(\"left\");\r\n } else {\r\n if (this.state.activeTool === \"selection\") {\r\n // select roi next to selected roi\r\n this.rendererdict[this.state.activeFileId].keyDownSelection(\r\n e\r\n );\r\n } else if (this.state.activeTool !== \"rectangle\") {\r\n // translate by the offset to the destination point if not in result tab\r\n if (!this.props.resultTab.getZoomLevelFixed()) {\r\n this.rendererdict[this.state.activeFileId].ctx.translate(\r\n 50,\r\n 0\r\n );\r\n }\r\n }\r\n }\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"ArrowRight\":\r\n if (\r\n typeof this.state.showTilesGallery === \"undefined\" ||\r\n this.state.showTilesGallery === false\r\n ) {\r\n if (this.state.showGallery) {\r\n this.gallery.selectNewImage(\"right\");\r\n } else {\r\n if (this.state.activeTool === \"selection\") {\r\n // select roi next to selected roi\r\n this.rendererdict[this.state.activeFileId].keyDownSelection(\r\n e\r\n );\r\n } else if (this.state.activeTool !== \"rectangle\") {\r\n // translate by the offset to the destination point if not in result tab\r\n if (!this.props.resultTab.getZoomLevelFixed()) {\r\n this.rendererdict[this.state.activeFileId].ctx.translate(\r\n -50,\r\n 0\r\n );\r\n }\r\n }\r\n }\r\n }\r\n e.preventDefault();\r\n break;\r\n case \"0\":\r\n case \"1\":\r\n case \"2\":\r\n case \"3\":\r\n case \"4\":\r\n case \"5\":\r\n case \"6\":\r\n case \"7\":\r\n case \"8\":\r\n case \"9\":\r\n {\r\n let pressedNumber = parseInt(e.key);\r\n if (this.state.showTilesGallery) {\r\n this.gallery.classifyTilesGalleryWithKey(pressedNumber);\r\n } else if (this.state.showGallery) {\r\n this.gallery.classifyImageWithKey(pressedNumber);\r\n } else {\r\n if (this.state.activeTool === \"selection\") {\r\n this.rendererdict[\r\n this.state.activeFileId\r\n ].classifySelectedRoi(pressedNumber);\r\n } else if (\r\n this.resultTabActive() &&\r\n this.state.project.type.includes(\"HistoClassification\")\r\n ) {\r\n window.addFrequencyClass(pressedNumber);\r\n } else if (\r\n this.resultTabActive() &&\r\n this.state.project.type.includes(\"HistoPointCounting\")\r\n ) {\r\n window.classifyTileWithkey(pressedNumber);\r\n }\r\n }\r\n e.preventDefault();\r\n }\r\n break;\r\n case \"+\":\r\n this.rendererdict[this.state.activeFileId].onScaleOnly({\r\n wheelDelta: 120,\r\n });\r\n e.preventDefault();\r\n break;\r\n case \"-\":\r\n this.rendererdict[this.state.activeFileId].onScaleOnly({\r\n wheelDelta: -120,\r\n });\r\n e.preventDefault();\r\n break;\r\n case \"r\":\r\n document.getElementById(\"roiTabBtn\").click();\r\n e.preventDefault();\r\n break;\r\n case \"v\":\r\n document.getElementById(\"viewTabBtn\").click();\r\n e.preventDefault();\r\n break;\r\n default:\r\n break;\r\n }\r\n if (\r\n typeof this.tools[this.state.activeTool] !== \"undefined\" &&\r\n this.tools[this.state.activeTool].onKeyDown\r\n )\r\n this.tools[this.state.activeTool].onKeyDown(\r\n e,\r\n false,\r\n this.checkToolInConfig(\"TilesTool\")\r\n );\r\n }\r\n }\r\n if (elem !== null) {\r\n elem.click();\r\n e.preventDefault();\r\n }\r\n if (\r\n this.rendererdict[this.state.activeFileId] &&\r\n this.rendererdict[this.state.activeFileId].showResultTable\r\n ) {\r\n window.updateResultTable();\r\n }\r\n };\r\n\r\n setSelectedRoi = (roi) => {\r\n this.setMountedState({ selRoi: roi.r });\r\n };\r\n\r\n updateDimensions() {\r\n let savedT = 0;\r\n if (\r\n this.rendererdict[this.state.activeFileId] &&\r\n this.rendererdict[this.state.activeFileId].state\r\n ) {\r\n savedT = this.rendererdict[this.state.activeFileId].state.t;\r\n }\r\n // reset all child components\r\n this.setMountedState({\r\n dimensionsUpdated: true,\r\n containerKey: new Date().getTime(),\r\n });\r\n if (this.rendererdict[this.state.activeFileId] && savedT > 0) {\r\n this.rendererdict[this.state.activeFileId].updateT(savedT);\r\n }\r\n let zoom;\r\n let newZoomObjectDict;\r\n for (const value of Object.values(this.state.splitscreenFileIds)) {\r\n zoom = this.props.persistentStorage.load(\"zoomObject\" + value);\r\n //if (zoom) zoom.zoomRoi = true;\r\n newZoomObjectDict = this.zoomObjectDict;\r\n if (zoom) {\r\n newZoomObjectDict[value] = JSON.parse(JSON.stringify(zoom));\r\n } else {\r\n newZoomObjectDict[value] = {\r\n zoomRoi: false,\r\n zoomLeft: 0,\r\n zoomRight: 0,\r\n zoomTop: 0,\r\n zoomBottom: 0,\r\n };\r\n }\r\n this.zoomObjectDict = newZoomObjectDict;\r\n }\r\n }\r\n\r\n getArrayDepth = (depthArray) => {\r\n let depth = 0;\r\n let child = depthArray[0];\r\n while (typeof child !== \"undefined\") {\r\n depth++;\r\n child = child[0];\r\n }\r\n return depth;\r\n };\r\n\r\n /**\r\n * Check if polygon corresponds to the given treeItem\r\n * @param {*} polygon Polygon that should be compared\r\n * @param {*} treeItem treeItem that should be compared\r\n * @returns True/False\r\n */\r\n isCorrespondingPolygon = (polygon, treeItem) => {\r\n for (let contour of polygon) {\r\n // check if contour has one common point with treeItem\r\n if (\r\n contour.find(\r\n (point) =>\r\n point[0] === treeItem.regions[0][0] &&\r\n point[1] === treeItem.regions[0][1]\r\n )\r\n ) {\r\n // check if contour has second common point with treeItem\r\n if (\r\n contour.find(\r\n (point) =>\r\n point[0] === treeItem.regions[1][0] &&\r\n point[1] === treeItem.regions[1][1]\r\n )\r\n ) {\r\n // assume to be same object and discard other polygons\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n createNewRois = (frameGeoJson) => {\r\n // *** needed for convert part\r\n // convert to actual GeoJSON format with holes\r\n // let index = 0;\r\n // let tmpFrameGeoJson = {\r\n // aiAnnotated: null,\r\n // color1: \"\",\r\n // comment: \"\",\r\n // coordinates: [],\r\n // frequencyClass: -1,\r\n // isAnnotated: null,\r\n // isKeyFrame: frameGeoJson.isKeyFrame,\r\n // isLabeled: null,\r\n // isObject: null,\r\n // isSaved: null,\r\n // isSelObj: null,\r\n // name: \"\",\r\n // structureId: null,\r\n // subtype: null,\r\n // tileName: \"\",\r\n // type: \"MultiPolygon\",\r\n // withHoles: true,\r\n // z: -1,\r\n // };\r\n // let mustConvert = frameGeoJson.withHoles ? false : true;\r\n\r\n if (\r\n this.getArrayDepth(frameGeoJson.coordinates) === 5 &&\r\n frameGeoJson.coordinates.length === 1\r\n )\r\n frameGeoJson.coordinates = frameGeoJson.coordinates[0];\r\n\r\n // *** old convert code\r\n // * objects that are holes will be detected\r\n // * holes will be added to corresponding outer objects\r\n // * => number of objects should reduce or stay the same\r\n\r\n // let t0 = performance.now();\r\n // //fill rTree with all plygons\r\n // if (mustConvert) {\r\n // let rTree = new RBush();\r\n // for (let i in frameGeoJson.coordinates) {\r\n // let region = frameGeoJson.coordinates[i];\r\n // let line = turf.lineString(region[0]);\r\n // let poly = turf.lineToPolygon(line);\r\n // let bbox = turf.bbox(poly);\r\n // let item = {\r\n // minX: bbox[0],\r\n // minY: bbox[1],\r\n // maxX: bbox[2],\r\n // maxY: bbox[3],\r\n // id: i,\r\n // area: turf.area(poly),\r\n // used: false,\r\n // poly: poly,\r\n // };\r\n // rTree.insert(item);\r\n // }\r\n\r\n // let counter = 0;\r\n // let percCounter = 0;\r\n\r\n // const counterRange = rTree.all().length;\r\n // for (let treeItem of rTree.all()) {\r\n // index = treeItem.id;\r\n // counter++;\r\n // let perc = parseInt((100 * counter) / counterRange);\r\n // if (percCounter < perc) {\r\n // percCounter = perc;\r\n // this.props.spinloader.showWithProgress({\r\n // message: \"Progress\",\r\n // progress: percCounter,\r\n // });\r\n // }\r\n // // console.log(\"treeItem.used\", treeItem.used);\r\n\r\n // let possibleOverlapRois = rTree.search(treeItem); //search all overlaps including own\r\n\r\n // let treeItemHoleCounter = 0;\r\n\r\n // // holes can only be not the same, must intersect and be smaller\r\n // let possibleHoles = possibleOverlapRois.filter((item) => {\r\n // if (item.id === treeItem.id) return false;\r\n // //remove poly itself\r\n // else {\r\n // if (turf.booleanWithin(treeItem.poly, item.poly)) {\r\n // //if poly inside outer poly\r\n // treeItemHoleCounter++;\r\n // return false;\r\n // } else {\r\n // return turf.booleanWithin(item.poly, treeItem.poly); //add if overlap is within current poly\r\n // }\r\n // }\r\n // });\r\n\r\n // // current item is a hole, so it will be added as hole in other parent roi\r\n // if (treeItemHoleCounter % 2 > 0) {\r\n // continue;\r\n // }\r\n // let poly = turf.clone(treeItem.poly);\r\n\r\n // for (let possibleHole of possibleHoles) {\r\n // poly = turf.difference(poly, possibleHole.poly);\r\n // }\r\n // try {\r\n // poly = turf.simplify(buffer(poly, -5), {\r\n // tolerance: 0.05,\r\n // highQuality: false,\r\n // });\r\n // } catch (e) {\r\n // console.log(\"error with poly:\", poly, e);\r\n\r\n // continue;\r\n // }\r\n\r\n // let tmpGeoJson = poly.geometry;\r\n\r\n // if (tmpGeoJson.type === \"Polygon\") {\r\n // tmpFrameGeoJson.coordinates.push(tmpGeoJson.coordinates);\r\n // if (frameGeoJson.aiAnnotated && frameGeoJson.aiAnnotated.length > 0) {\r\n // tmpFrameGeoJson.aiAnnotated = frameGeoJson.aiAnnotated[index][0];\r\n // tmpFrameGeoJson.color1 = frameGeoJson.color1[index][0];\r\n // tmpFrameGeoJson.comment = frameGeoJson.comment[index][0];\r\n // tmpFrameGeoJson.frequencyClass = frameGeoJson.frequencyClass\r\n // ? frameGeoJson.frequencyClass[index][0]\r\n // : \"\";\r\n // tmpFrameGeoJson.isAnnotated = frameGeoJson.isAnnotated[index][0];\r\n // tmpFrameGeoJson.isLabeled = frameGeoJson.isLabeled[index][0];\r\n // tmpFrameGeoJson.isSaved = frameGeoJson.isSaved[index][0];\r\n // tmpFrameGeoJson.isSelObj = frameGeoJson.isSelObj[index];\r\n // tmpFrameGeoJson.name = frameGeoJson.name[index][0];\r\n // tmpFrameGeoJson.structureId = frameGeoJson.structureId[index][0];\r\n // tmpFrameGeoJson.subtype = frameGeoJson.subtype[index][0];\r\n // tmpFrameGeoJson.tileName = frameGeoJson.tileName[index][0];\r\n // tmpFrameGeoJson.z = frameGeoJson.z[index][0];\r\n // tmpFrameGeoJson.isObject = false; // never object in old versions\r\n // }\r\n // } else {\r\n // for (let polygon of tmpGeoJson.coordinates) {\r\n // tmpFrameGeoJson.coordinates.push(polygon);\r\n // if (\r\n // frameGeoJson.aiAnnotated &&\r\n // frameGeoJson.aiAnnotated.length > 0\r\n // ) {\r\n // tmpFrameGeoJson.aiAnnotated = frameGeoJson.aiAnnotated[0];\r\n // tmpFrameGeoJson.color1 = frameGeoJson.color1[0];\r\n // tmpFrameGeoJson.comment = frameGeoJson.comment[0];\r\n // tmpFrameGeoJson.frequencyClass = frameGeoJson.frequencyClass\r\n // ? frameGeoJson.frequencyClass[index]\r\n // : \"\";\r\n // tmpFrameGeoJson.isAnnotated = frameGeoJson.isAnnotated[0];\r\n // tmpFrameGeoJson.isLabeled = frameGeoJson.isLabeled[0];\r\n // tmpFrameGeoJson.isSaved = frameGeoJson.isSaved[0];\r\n // tmpFrameGeoJson.isSelObj = frameGeoJson.isSelObj[0];\r\n // tmpFrameGeoJson.name = frameGeoJson.name[0];\r\n // tmpFrameGeoJson.structureId = frameGeoJson.structureId[0];\r\n // tmpFrameGeoJson.subtype = frameGeoJson.subtype[0];\r\n // tmpFrameGeoJson.tileName = frameGeoJson.tileName[0];\r\n // tmpFrameGeoJson.z = frameGeoJson.z[0];\r\n // tmpFrameGeoJson.isObject = [false]; // never object in old versions\r\n // }\r\n // }\r\n // }\r\n // }\r\n\r\n // frameGeoJson = tmpFrameGeoJson;\r\n // }\r\n\r\n // let t1 = performance.now();\r\n // let timeSeconds = parseInt((t1 - t0) / 1000, 10);\r\n // if (mustConvert)\r\n // console.log(\"Call to convert took \" + timeSeconds + \" seconds.\");\r\n\r\n //let newRois = [];\r\n let tree = new RBush();\r\n let newRois = createRoisFromAnno({ geoJSON: frameGeoJson });\r\n tree.load(newRois.map((item) => item.treeItem)); //load tree to new data\r\n return [newRois, tree];\r\n };\r\n\r\n loadAnnotations(file, id, projectId, newroiLayers, callback) {\r\n const { structures } = this.props.projectContext;\r\n this.props.spinloader.show();\r\n Backend.loadAnnotations({ id: projectId, fileId: id }, (result) => {\r\n if (!callback) {\r\n file.annotations = result;\r\n }\r\n\r\n // part of video annotation. Start\r\n\r\n let keys = [];\r\n let emptyIdxs = [0];\r\n for (let i = 1; i < result.length; i++) {\r\n let idframeArray =\r\n result[i].geoJSON.idframeArray || result[i].geoJSON.idTimeArray;\r\n if (\r\n typeof idframeArray === \"undefined\" ||\r\n Object.keys(idframeArray).length === 0\r\n ) {\r\n emptyIdxs.push(i);\r\n continue;\r\n }\r\n\r\n keys.push(\r\n ...Object.keys(\r\n result[i].geoJSON.idframeArray || result[i].geoJSON.idTimeArray\r\n )\r\n );\r\n }\r\n keys = [...new Set(keys)];\r\n function objectframeArray(keys) {\r\n return keys.reduce(function (result, key) {\r\n result[key] = [];\r\n return result;\r\n }, {});\r\n }\r\n let loadedframeArray = objectframeArray(keys, function (value) {\r\n return value;\r\n });\r\n Object.keys(loadedframeArray).forEach((key) => {\r\n for (let i = 1; i < result.length; i++) {\r\n let anno = result[i];\r\n let frameGeoJson =\r\n anno.geoJSON.idframeArray && anno.geoJSON.idframeArray[key]\r\n ? anno.geoJSON.idframeArray[key]\r\n : anno.geoJSON; //take default annotations, if no frame found\r\n\r\n if (!frameGeoJson) {\r\n continue;\r\n }\r\n const [newRois, tree] = this.createNewRois(frameGeoJson);\r\n let structROIs = {\r\n id: anno.geoJSON.structID\r\n ? anno.geoJSON.structID\r\n : structures[i].id,\r\n layer: {\r\n inverted: false,\r\n regionRois: newRois,\r\n },\r\n tree: tree,\r\n };\r\n if (frameGeoJson.isKeyFrame && frameGeoJson.isKeyFrame === true) {\r\n structROIs.isKeyFrame = true;\r\n }\r\n loadedframeArray[key].push(structROIs);\r\n }\r\n });\r\n\r\n // add annotations from job\r\n for (let i = 0; i < result.length; i++) {\r\n this.processGeoJSONArray(result[i], loadedframeArray);\r\n }\r\n\r\n let frameArrayDict = this.state.frameArrayDict;\r\n frameArrayDict[this.state.activeFileId] = loadedframeArray;\r\n\r\n this.setMountedState({\r\n frameArrayDict: frameArrayDict,\r\n loadedAnnotationsCounter: this.state.loadedAnnotationsCounter + 1,\r\n });\r\n\r\n // part of video annotation. End\r\n\r\n // part of frame annotation. Start\r\n // for (let i of emptyIdxs) {\r\n for (let i = 0; i < result.length; i++) {\r\n if (i >= result.length) break;\r\n let anno = result[i];\r\n // ensuring that old files also work\r\n const newRois = this.createNewRois(anno.geoJSON)[0];\r\n let idx = 0;\r\n if (this.newLayerIndices.length !== 0) {\r\n idx = this.newLayerIndices[i];\r\n } else {\r\n idx = anno.id;\r\n }\r\n\r\n if (newroiLayers[file.id][idx]) {\r\n // create an Id if not set\r\n if (!newroiLayers[file.id][idx].id)\r\n newroiLayers[file.id][idx].id = idx + 1;\r\n\r\n newroiLayers[file.id][idx].layer.regionRois = newRois;\r\n newroiLayers[file.id][idx].tree = new RBush();\r\n newroiLayers[file.id][idx].tree.load(\r\n newRois.map((item) => item.treeItem)\r\n ); //load tree to new data\r\n }\r\n }\r\n\r\n // part of frame annotation. End\r\n this.props.spinloader.hide();\r\n if (!this.state.annotatedFileIds.includes(file.id)) {\r\n this.setMountedState((prevState) => ({\r\n annotatedFileIds: [...prevState.annotatedFileIds, file.id],\r\n }));\r\n }\r\n if (typeof callback === \"function\") {\r\n callback();\r\n }\r\n });\r\n // result = result.json();\r\n }\r\n\r\n devtoolsOpen() {\r\n const threshold = 160;\r\n const widthThreshold = window.outerWidth - window.innerWidth > threshold;\r\n const heightThreshold = window.outerHeight - window.innerHeight > threshold;\r\n //const orientation = widthThreshold ? \"vertical\" : \"horizontal\";\r\n\r\n if (\r\n !(heightThreshold && widthThreshold) &&\r\n ((window.Firebug &&\r\n window.Firebug.chrome &&\r\n window.Firebug.chrome.isInitialized) ||\r\n widthThreshold ||\r\n heightThreshold)\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n openNextFile = () => {\r\n const { fileId, project } = this.props.projectContext;\r\n const files = project.files;\r\n const fileIdx = files.findIndex((file) => file.id === fileId);\r\n if (fileIdx >= 0 && files.length > fileIdx + 1) {\r\n this.onSelectFile(files[fileIdx + 1].id);\r\n }\r\n };\r\n\r\n openPrevFile = () => {\r\n const { fileId, project } = this.props.projectContext;\r\n const files = project.files;\r\n const fileIdx = files.findIndex((file) => file.id === fileId);\r\n if (fileIdx > 0) {\r\n this.onSelectFile(files[fileIdx - 1].id);\r\n }\r\n };\r\n\r\n openFile(id, projectId, fileChange = false) {\r\n if (this.lastFileId === id) return; //prevent loading File twice\r\n this.lastFileId = id;\r\n const { roiLayers, structures } = this.props.projectContext;\r\n // create empty roilayers for dynamic structures\r\n if (roiLayers[id]) {\r\n for (let structure of structures) {\r\n const roiLayer = roiLayers[id].find((c) => c.id === structure.id);\r\n if (!roiLayer) {\r\n roiLayers[id].push({\r\n id: structure.id,\r\n layer: {\r\n regionRois: [],\r\n inverted: false,\r\n },\r\n tree: new RBush(),\r\n });\r\n }\r\n }\r\n this.props.projectContext.setState({ roiLayers });\r\n }\r\n\r\n // load image meta data\r\n Backend.loadImage(\r\n {\r\n id: id,\r\n },\r\n (ome) => {\r\n if (ome.fileName) {\r\n let newOme = { ...this.state.omeDict };\r\n newOme[id] = ome;\r\n this.props.persistentStorage.save(\"opened_file_id\", id);\r\n let newStateObject = {\r\n omeDict: newOme,\r\n fileId: id,\r\n showTimeBar: ome.sizeT > 1,\r\n showZStackBar: ome.sizeZ > 1,\r\n displayTimeBar: ome.sizeT > 1,\r\n displayZStackBar: ome.sizeZ > 1,\r\n histogramConfig: this.state.histogramConfig,\r\n ome,\r\n importProgress: -1,\r\n };\r\n if (\r\n !fileChange &&\r\n !this.props.persistentStorage.load(\"SplitscreenFileIds\")\r\n ) {\r\n newStateObject.splitscreenFileIds = [id];\r\n }\r\n\r\n if (!fileChange) newStateObject.containerKey = new Date().getTime();\r\n\r\n if (!newStateObject.histogramConfig[id]) {\r\n // write loaded data in to component state\r\n newStateObject.histogramConfig[id] = new ChannelsConfig(\r\n ome.channels.map((c, i) => {\r\n //set general name, if none in metadata\r\n if (c.name === null) {\r\n c.name = \"Ch \" + i;\r\n }\r\n return c;\r\n })\r\n );\r\n }\r\n Object.assign(this.state, newStateObject);\r\n this.props.projectContext.setState(newStateObject);\r\n } else {\r\n let failedFilePath = this.state.project.files.find(\r\n (file) => file.id === id\r\n ).sourcePath;\r\n window.openErrorDialog(\r\n \"Error: Most likely the original file could not be found:\\n\" +\r\n failedFilePath\r\n );\r\n }\r\n\r\n // if histo classification project draw grid for next file\r\n if (\r\n this.state.project.type.includes(\"HistoClassification\") &&\r\n this.state.gridSize &&\r\n this.rendererdict[this.state.activeFileId]\r\n ) {\r\n setTimeout(() => {\r\n this.onChangeTool(\"gridtool\");\r\n this.tools[\"gridtool\"].createGrid(this.state.gridSize, false, true);\r\n }, 400);\r\n setTimeout(\r\n () => this.rendererdict[this.state.activeFileId].centerRoi(),\r\n 600\r\n );\r\n }\r\n\r\n // if point counting project draw grid for next file\r\n if (\r\n this.state.project.type.includes(\"HistoPointCounting\") &&\r\n this.state.gridSize &&\r\n this.rendererdict[this.state.activeFileId]\r\n ) {\r\n setTimeout(() => {\r\n this.onChangeTool(\"gridtool\");\r\n this.tools[\"gridtool\"].createGrid(this.state.gridSize, true, true);\r\n }, 400);\r\n setTimeout(\r\n () => this.rendererdict[this.state.activeFileId].centerRoi(),\r\n 600\r\n );\r\n }\r\n\r\n if (!fileChange) {\r\n // set default selected layer\r\n this.setSelLayerConfig();\r\n }\r\n\r\n // if e.g. Tobacco Analysis and no Base-Roi set, set whole Scene as Base-Roi\r\n if (this.checkPropertyInConfig(\"AutomaticBaseRoiWholeImage\")) {\r\n let idx = 0;\r\n if (this.props.projectContext.selectedLayer != null) {\r\n idx = this.props.projectContext.selectedLayer;\r\n }\r\n setTimeout(() => {\r\n this.setSelectedLayer(0);\r\n this.onChangeTool(\"gridtool\");\r\n this.tools[\"gridtool\"].createGrid(1, true, false);\r\n this.onChangeTool(\"none\");\r\n this.setSelectedLayer(idx);\r\n }, 1000);\r\n }\r\n\r\n // set full image as structure\r\n let automaticFullImageRoiLayer =\r\n this.state.viewerConfig.project.projectStringProperties[\r\n \"AutomaticFullImageRoiLayer\"\r\n ];\r\n if (automaticFullImageRoiLayer) {\r\n this.setMountedState({\r\n opacity: 0,\r\n });\r\n let idx = 0;\r\n if (this.props.projectContext.selectedLayer != null) {\r\n idx = this.props.projectContext.selectedLayer;\r\n }\r\n setTimeout(() => {\r\n this.setSelectedLayer(parseInt(automaticFullImageRoiLayer, 10));\r\n let gridExists =\r\n roiLayers[id][parseInt(automaticFullImageRoiLayer, 10)].layer\r\n .regionRois.length > 0;\r\n if (!gridExists) {\r\n this.onChangeTool(\"gridtool\");\r\n this.tools[\"gridtool\"].createGrid(1, true, false);\r\n this.onChangeTool(\"none\");\r\n }\r\n this.onChangeTool(\"selection\");\r\n this.setSelectedLayer(idx);\r\n }, 2000);\r\n }\r\n\r\n // set file change false\r\n setTimeout(() => {\r\n this.props.resultTab.setFileChange(false);\r\n if (this._isMounted) this.forceUpdate();\r\n }, 1);\r\n },\r\n (error) => {\r\n let failedFilePath = this.state.project.files.find(\r\n (file) => file.id === id\r\n ).sourcePath;\r\n let msg = `Error importing file ${failedFilePath}:\\n${error}`;\r\n console.log(msg);\r\n window.openErrorDialog(msg);\r\n },\r\n (e) => {\r\n console.log(\"Import progress:\", e);\r\n this.setMountedState({ importProgress: e.progress });\r\n }\r\n );\r\n\r\n if (this.state.showGallery) {\r\n this.setMountedState({ showGallery: false });\r\n }\r\n\r\n let newProjectObject = this.state.project;\r\n if (newProjectObject.projectData !== null) {\r\n let currentFile = newProjectObject.files.find((file) => file.id === id);\r\n if (currentFile) {\r\n // if (!droppedFile && this.state.splitscreenFileIds.length === 1) {\r\n // this.deleteRoiLayersForScene(); // make roiLayers of current scene empty\r\n // }\r\n this.loadAnnotations(currentFile, id, projectId, roiLayers, () => {\r\n this.setMountedState({ project: newProjectObject });\r\n this.props.projectContext.setState({\r\n project: newProjectObject,\r\n roiLayers,\r\n });\r\n this.props.projectHistory.init(this);\r\n });\r\n }\r\n }\r\n }\r\n\r\n deleteRoiLayersForScene = () => {\r\n const { roiLayers, structures } = this.props.projectContext;\r\n const { activeFileId } = this.state;\r\n\r\n for (let i = 0; i < structures.length; i++) {\r\n if (roiLayers[activeFileId][i]) {\r\n roiLayers[activeFileId][i].layer.regionRois = [];\r\n roiLayers[activeFileId][i].tree.clear();\r\n }\r\n }\r\n this.props.projectContext.setState({ roiLayers });\r\n\r\n // remove file from annotated files\r\n const index = this.state.annotatedFileIds.indexOf(activeFileId);\r\n if (index > -1) {\r\n this.state.annotatedFileIds.splice(index, 1);\r\n }\r\n };\r\n\r\n // change the active tool\r\n onChangeTool = (activeTool, params) => {\r\n if (\r\n activeTool === \"iam_ai_inference\" &&\r\n this.props.projectContext.activeTab === 1 &&\r\n !this.state.aiUsedStructures.filter(\r\n (e) =>\r\n e.id ===\r\n this.props.projectContext.structures[\r\n this.props.projectContext.selectedLayer\r\n ].id\r\n ).length > 0\r\n ) {\r\n activeTool = \"none\";\r\n }\r\n if (this.state.showGallery) {\r\n setTimeout(() => this.galleryChangeTool(activeTool, params), 100);\r\n } else {\r\n if (\r\n this.rendererdict[this.state.activeFileId] &&\r\n this.rendererdict[this.state.activeFileId].updatePreviewRect &&\r\n this.checkTool(activeTool)\r\n ) {\r\n if (\r\n this.tools[this.state.activeTool] &&\r\n typeof this.tools[this.state.activeTool].exit === \"function\"\r\n ) {\r\n this.tools[this.state.activeTool].exit();\r\n }\r\n\r\n this.setMountedState({ activeTool }, () => {\r\n this.rendererdict[this.state.activeFileId].updatePreviewRect(\r\n activeTool\r\n );\r\n\r\n this.rendererdict[\r\n this.state.activeFileId\r\n ].props.drawLayer.regionRois = [];\r\n\r\n let tool = this.tools[activeTool];\r\n if (tool && tool.onParameterChange) {\r\n tool.onParameterChange(params);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n checkTool = (e) => {\r\n const { structures, selectedLayer } = this.props.projectContext;\r\n // check if tool can be selected with selected structure\r\n switch (e) {\r\n case \"selection\":\r\n if (!structures[selectedLayer].hasChild) {\r\n window.showWarningSnackbar(\"Structure has no children.\");\r\n return false;\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n return true;\r\n };\r\n\r\n checkToolInConfig = (toolName) => {\r\n if (this.state.viewerConfig) {\r\n if (this.state.viewerConfig.project.toolsInProject[toolName]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n };\r\n\r\n checkPropertyInConfig = (property) => {\r\n if (this.state.viewerConfig) {\r\n if (this.state.viewerConfig.project.projectProperties[property]) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n };\r\n\r\n resultTabActive = () => {\r\n // check if active tab is result tab\r\n if (!this.checkToolInConfig(\"ResultTab\")) {\r\n return false;\r\n }\r\n\r\n // check which tabs exist in module --> then decide which index result tab has\r\n let persisObj = this.props.persistentStorage.load(\"activeTab\");\r\n let activeTab = persisObj ? persisObj : 0;\r\n if (\r\n this.checkToolInConfig(\"AICockpit\") &&\r\n this.checkToolInConfig(\"RoiTab\")\r\n ) {\r\n // resultTab = 3\r\n return activeTab === 3;\r\n } else if (\r\n this.checkToolInConfig(\"AICockpit\") ||\r\n this.checkToolInConfig(\"RoiTab\")\r\n ) {\r\n // resultTab = 2\r\n return activeTab === 2;\r\n } else {\r\n // resultTab = 1\r\n return activeTab === 1;\r\n }\r\n };\r\n\r\n updateStructureChange = () => {\r\n setTimeout(() => this.setMountedState({ updateStructure: true }), 100);\r\n };\r\n\r\n onGallerychangePage() {\r\n this.setMountedState({ activeTool: Tools.NONE });\r\n }\r\n\r\n galleryChangeTool(activeTool, params) {\r\n if (this.checkTool(activeTool)) {\r\n this.setMountedState({ activeTool: activeTool });\r\n let tool = this.tools[activeTool];\r\n if (tool && tool.onParameterChange) {\r\n tool.onParameterChange(params);\r\n }\r\n }\r\n }\r\n\r\n onSelectFile = (e) => {\r\n let { activeFileId, splitscreenFileIds } = this.state;\r\n if (splitscreenFileIds.includes(e)) {\r\n if (this.state.showFullscreen) {\r\n if (this.sliderRef && this.state.showOverlay) {\r\n this.sliderRef.fileCheck(e, () => {\r\n this.addFileToFullscreen(e, this.sliderRef.state.checkedUp ? 1 : 0);\r\n });\r\n } else {\r\n this.addFileToFullscreen(e, 0);\r\n }\r\n } else {\r\n this.addFileToFullscreen(e, 0);\r\n }\r\n activeFileId = e;\r\n this.props.persistentStorage.save(\"ActiveFileId\", activeFileId);\r\n this.setMountedState({\r\n activeFileId,\r\n });\r\n } else {\r\n this.props.tiles.resetVisibleImages(); //prevent ram issue\r\n this.props.tiles.resetColoredImages(); //prevent ram issue\r\n //this.props.tiles.setFileId(e);\r\n //this.props.projectContext.setChangingFile(true);\r\n // save annotations when changing file\r\n\r\n // TODO: [BP-34] Use same general save function as other projects (fix hot fix correctly)\r\n if (\r\n this.state.project.type.includes(\"HistoPointCounting\") ||\r\n this.state.project.type.includes(\"HistoClassification\")\r\n ) {\r\n this.onSwitchFileSplitscreen(e);\r\n if (this.sliderRef && this.state.showOverlay) {\r\n this.addFileToFullscreen(e, this.sliderRef.state.checkedUp ? 0 : 1);\r\n } else {\r\n this.addFileToFullscreen(e, 0);\r\n }\r\n } else {\r\n this.saveFunction(null, () => {\r\n this.onSwitchFileSplitscreen(e);\r\n if (this.sliderRef && this.state.showOverlay) {\r\n this.addFileToFullscreen(e, this.sliderRef.state.checkedUp ? 0 : 1);\r\n } else {\r\n this.addFileToFullscreen(e, 0);\r\n }\r\n this.clearOtherLayers();\r\n });\r\n }\r\n }\r\n };\r\n\r\n onExcludeFilesToggle = (files, value) => {\r\n let projectObject = this.state.project;\r\n for (let file of files) {\r\n for (let f of projectObject.files) {\r\n if (file.id === f.id) {\r\n file.excludeScene = value;\r\n }\r\n }\r\n }\r\n this.setMountedState(projectObject);\r\n };\r\n\r\n toggleFileTreeView = () => {\r\n this.setMountedState({\r\n showFileTreeView: !this.state.showFileTreeView,\r\n containerKey: new Date().getTime(),\r\n });\r\n };\r\n\r\n onExportParameters = () => {\r\n const { structures } = this.props.projectContext;\r\n\r\n let dataStr =\r\n \"data:text/json;charset=utf-8,\" +\r\n encodeURIComponent(JSON.stringify(structures));\r\n let dlAnchorElem = document.createElement(\"a\");\r\n dlAnchorElem.setAttribute(\"href\", dataStr);\r\n const strData = this.props.projectContext.getProjectStringInfos();\r\n dlAnchorElem.setAttribute(\r\n \"download\",\r\n strData.name + \"_\" + strData.type + \"_\" + strData.fileName + \".strhsa\"\r\n );\r\n dlAnchorElem.click();\r\n dlAnchorElem.remove();\r\n };\r\n\r\n //TODO: [HWB-910] to fix because probably broken because of turf integration\r\n loadSCNXMLAnnotations(docstr) {\r\n var parser = new DOMParser();\r\n var doc = parser.parseFromString(docstr, \"application/xml\");\r\n window.annodoc = doc;\r\n\r\n const annotations = doc.getElementsByTagName(\"Annotation\");\r\n for (let i = 0; i < annotations.length; i++) {\r\n console.log(i, \"=>\", annotations[i]);\r\n const regions = annotations[i].children[1];\r\n for (let region of regions.children) {\r\n if (region.tagName !== \"Region\") continue;\r\n const vertices = region.children[1];\r\n const points = [];\r\n for (let vertex of vertices.children) {\r\n points.push([\r\n parseInt(vertex.getAttribute(\"X\")),\r\n parseInt(vertex.getAttribute(\"Y\")),\r\n ]);\r\n }\r\n let drawRegion = {\r\n regions: [\r\n // NOTE: the last two parameters might have to be adjusted in case of bugs.\r\n createRegionRoi([points], \"#ff0000\", false, \"Tumor\", null, null),\r\n ],\r\n inverted: false,\r\n bounds: calcBoundingBox([points]),\r\n };\r\n const { roiLayers } = this.props.projectContext;\r\n // roiLayers[this.state.activeFileId][1].layer.regionRois.push(\r\n // drawRegion\r\n // );\r\n const selRoiLayer = roiLayers[this.state.activeFileId][i + 1]; // skip base roi\r\n updateLayer(\r\n selRoiLayer.layer,\r\n drawRegion,\r\n false,\r\n \"#ff0000\",\r\n false,\r\n \"Tumor\",\r\n selRoiLayer.tree\r\n );\r\n }\r\n }\r\n }\r\n\r\n onImportParameters = (e) => {\r\n let files = e.target.files;\r\n if (files.length <= 0) return false;\r\n\r\n let fr = new FileReader();\r\n fr.onload = (e) => {\r\n try {\r\n if (e.target.result.startsWith(\" 0 && structures[0].label) {\r\n this.props.projectContext.importStructures(structures);\r\n } else {\r\n window.showErrorSnackbar(\"File not supported!\");\r\n }\r\n }\r\n } catch (e) {\r\n console.log(\"import errror:\", e);\r\n window.showErrorSnackbar(\"File not supported!\");\r\n }\r\n };\r\n fr.readAsText(files.item(0));\r\n };\r\n\r\n deleteforAllScenes = (selectedLayer) => {\r\n const { roiLayers } = this.props.projectContext;\r\n Object.keys(roiLayers).forEach((e) => {\r\n roiLayers[e][selectedLayer].layer.regionRois = [];\r\n roiLayers[e][selectedLayer].tree.clear();\r\n });\r\n this.props.projectContext.setState({ roiLayers });\r\n };\r\n\r\n getNumberSubstructuresWithRois = () => {\r\n const { activeFileId } = this.state;\r\n const { selectedLayer, structures, roiLayers } = this.props.projectContext;\r\n // calculate number of substructures that have rois (for export)\r\n let parentLayer = this.getParentIndexLayer(structures[selectedLayer]);\r\n let nextParentLayer = parentLayer + 1;\r\n // calculate next substructure or parentlayer on same subtypelevel\r\n for (let i = parentLayer; i < structures.length; i++) {\r\n if (\r\n !structures[i].classificationSubtype &&\r\n structures[i].subtypeLevel === structures[parentLayer].subtypeLevel\r\n ) {\r\n nextParentLayer = i;\r\n }\r\n }\r\n\r\n // count substructures with rois between parentlayer and nextparentlayer\r\n let count = 0;\r\n for (let i = parentLayer + 1; i < nextParentLayer; i++) {\r\n if (\r\n structures[i].isSubtype &&\r\n !structures[i].classificationSubtype &&\r\n roiLayers[activeFileId][i].layer.regionRois.length !== 0\r\n ) {\r\n count = count + 1;\r\n }\r\n }\r\n return count;\r\n };\r\n\r\n createProjectModel = (layersToSave, previewRect) => {\r\n const {\r\n project,\r\n histogramConfig,\r\n viewerConfig,\r\n formDataAICockpit,\r\n commentLayers,\r\n landmarkLayers,\r\n user,\r\n } = this.state;\r\n const { selectedLayer, structures, roiLayers } = this.props.projectContext;\r\n\r\n //this.adjustRoiLayers();\r\n let parentLayer = this.getParentIndexLayer(structures[selectedLayer]);\r\n const projectModel = {\r\n name: project.name,\r\n user: user,\r\n id: project.id,\r\n readableId: project.readableId,\r\n metaData: JSON.parse(project.metaData),\r\n type: project.type,\r\n tools: viewerConfig.project.tools,\r\n job: viewerConfig.project.job,\r\n structures: structures,\r\n formDataAICockpit: JSON.stringify(formDataAICockpit),\r\n tMatrices: this.props.tiles.getAllTransformationMatrices(),\r\n tFactors: this.props.tiles.getAllTransformationFactors(),\r\n tOffsets: this.props.tiles.getAllTransformationOffsets(),\r\n files: project.files.map((file) => {\r\n let frameArray = this.state.frameArrayDict[file.id];\r\n\r\n return {\r\n id: file.id,\r\n fileName: file.fileName,\r\n sourcePath: file.sourcePath,\r\n histogram: histogramConfig[file.id],\r\n scene: file.scene,\r\n excludeScene: file.excludeScene,\r\n fullyAnnotated: file.fullyAnnotated,\r\n annotated: file.annotated,\r\n saved: file.saved,\r\n classId: file.classId,\r\n commentRois: commentLayers[file.id].commentRois.map((roi, i) => {\r\n return {\r\n id: i,\r\n regions: roi.regions,\r\n color: roi.color,\r\n type: roi.type,\r\n commentValue: roi.commentValue,\r\n };\r\n }),\r\n landmarkRois: landmarkLayers[file.id].landmarkRois.map((roi, i) => {\r\n return {\r\n id: i,\r\n regions: roi.regions,\r\n color: roi.color,\r\n type: roi.type,\r\n commentValue: roi.commentValue,\r\n };\r\n }),\r\n annotations: roiLayers[file.id].reduce((acc, roiLayer, i) => {\r\n if (\r\n (roiLayer.layer.regionRois ||\r\n this.state.annotatedFileIds.includes(file.id)) &&\r\n layersToSave !== \"none\"\r\n ) {\r\n if (layersToSave === \"all\" || layersToSave.includes(i)) {\r\n let rois;\r\n let current_id = roiLayer.id;\r\n let idTimeArr = {};\r\n\r\n for (let key in frameArray) {\r\n if (key in frameArray) {\r\n for (\r\n let idLayer = 0;\r\n idLayer < frameArray[key].length;\r\n idLayer++\r\n ) {\r\n if (frameArray[key][idLayer].id === current_id) {\r\n let tArrRois =\r\n frameArray[key][idLayer].layer.regionRois;\r\n let frameIdTimeArr = {\r\n type: \"MultiPolygon\",\r\n coordinates: tArrRois.map((c) => c.regions),\r\n withHoles: true,\r\n color1: tArrRois.map((c) => [c.color]),\r\n subtype: tArrRois.map((c) => [c.isSubtype]),\r\n name: tArrRois.map((c) => [c.subtypeName]),\r\n aiAnnotated: tArrRois.map((c) => [c.aiAnnotated]),\r\n isAnnotated: tArrRois.map((c) => [c.isAnnotated]),\r\n isLabeled: tArrRois.map((c) => [c.isLabeled]),\r\n isSelObj: tArrRois.map((c) => [c.isSelObj]),\r\n isSaved: tArrRois.map((c) => [c.isSaved]),\r\n z: tArrRois.map((c) => [c.z]),\r\n comment: tArrRois.map((c) => [c.comment]),\r\n tileName: tArrRois.map((c) => [c.tileName]),\r\n structureId: tArrRois.map((c) => [c.structureId]),\r\n isObject: tArrRois.map((c) => [c.isObject]),\r\n frequencyClass: tArrRois.map((c) => [\r\n c.frequencyClass,\r\n ]),\r\n };\r\n if (\r\n frameArray[key][idLayer].isKeyFrame &&\r\n frameArray[key][idLayer].isKeyFrame === true\r\n ) {\r\n frameIdTimeArr.isKeyFrame = true;\r\n }\r\n idTimeArr[key] = frameIdTimeArr;\r\n }\r\n }\r\n }\r\n }\r\n if (previewRect) {\r\n rois = roiLayer.tree\r\n .search({\r\n minX: previewRect.x,\r\n minY: previewRect.y,\r\n maxX: previewRect.x + previewRect.w,\r\n maxY: previewRect.y + previewRect.h,\r\n })\r\n .map((treeItem) => treeItem.roi);\r\n } else {\r\n rois = roiLayer.layer.regionRois;\r\n }\r\n acc.push({\r\n id: i,\r\n geoJSON: {\r\n structID: current_id,\r\n idframeArray: idTimeArr,\r\n type: \"MultiPolygon\",\r\n coordinates: rois.map((c) => c.regions),\r\n withHoles: true,\r\n color1: rois.map((c) => [c.color]),\r\n subtype: rois.map((c) => [c.isSubtype]),\r\n name: rois.map((c) => [c.subtypeName]),\r\n aiAnnotated: rois.map((c) => [c.aiAnnotated]),\r\n isAnnotated: rois.map((c) => [c.isAnnotated]),\r\n isLabeled: rois.map((c) => [c.isLabeled]),\r\n isSelObj: rois.map((c) => [c.isSelObj]),\r\n isSaved: rois.map((c) => [c.isSaved]),\r\n z: rois.map((c) => [c.z]),\r\n comment: rois.map((c) => [c.comment]),\r\n tileName: rois.map((c) => [c.tileName]),\r\n structureId: rois.map((c) => [c.structureId]),\r\n isObject: rois.map((c) => [c.isObject]),\r\n frequencyClass: rois.map((c) => [c.frequencyClass]),\r\n },\r\n });\r\n }\r\n }\r\n return acc;\r\n }, []),\r\n };\r\n }),\r\n\r\n selectedObjects: this.selObjects.coordinates,\r\n selLayer: selectedLayer,\r\n selStructure: structures[selectedLayer].label,\r\n selStructureId: structures[parentLayer].id,\r\n exportSubstructures: this.state.exportSubstructures, // not used at the moment (always export substructures)\r\n onlyAnnotations: false,\r\n zLevelClassification: this.props.tiles.getZLevel(),\r\n numberSubstructuresWithRois: this.getNumberSubstructuresWithRois(),\r\n };\r\n return projectModel;\r\n };\r\n\r\n getSelectedObjects = (x, fileID, fromActiveLearning) => {\r\n const { activeFileId } = this.state;\r\n //const { selectedLayer, roiLayers } = this.props.projectContext;\r\n // get classified objects from backend/training/classificaton and assign class and new properties\r\n\r\n this.selObjects = x;\r\n this.selObjs = true;\r\n this.updateCount = this.updateCount + 1;\r\n\r\n // isSaved property removed --> because with isSaved labeled images can not be classified by ai\r\n /*if (roiLayers[fileID] && roiLayers[fileID][selectedLayer]) {\r\n // set isSaved property true for all labeled images (by user) --> do not save twice (in next iterations)\r\n roiLayers[fileID][selectedLayer].layer.regionRois.forEach(function (\r\n element\r\n ) {\r\n if (!element.aiAnnotated && element.isSubtype) {\r\n // if roi is subtype but not annotated by ai\r\n element.isSaved = true;\r\n } else if (element.aiAnnotated && element.isLabeled) {\r\n // if roi annotated by ai but classified by user afterwards\r\n element.isSaved = true;\r\n }\r\n });\r\n }*/\r\n\r\n // if in current file --> set properties for objects/rois\r\n if (fileID === activeFileId) {\r\n this.setAIObjects(fromActiveLearning);\r\n }\r\n\r\n // set training finished and update\r\n this.setAlruns(false);\r\n if (this._isMounted) this.forceUpdate();\r\n };\r\n\r\n setAIObjects = (fromActiveLearning) => {\r\n const { activeFileId } = this.state;\r\n const { selectedLayer, structures, roiLayers } = this.props.projectContext;\r\n\r\n // set properties for rois (classification result)\r\n let fileID = activeFileId;\r\n let Objs = this.selObjects;\r\n\r\n if (Objs && Objs.coordinates.length > 0 && Objs.coordinates[0] !== null) {\r\n roiLayers[fileID][selectedLayer].layer.regionRois.forEach(function (roi) {\r\n // get same element from backend results\r\n let r = Objs.coordinates.filter(\r\n (element) =>\r\n parseInt(roi.bounds.left, 10) === element.x &&\r\n parseInt(roi.bounds.top, 10) === element.y\r\n )[0];\r\n // only set new properties if roi is not already classified by user\r\n if (r && !roi.isLabeled) {\r\n let subtypeStructureIdx = structures.findIndex(\r\n (element) => element.id === r.id && element.isSubtype\r\n );\r\n roi.structureId = structures[subtypeStructureIdx].id;\r\n roi.color = structures[subtypeStructureIdx].color;\r\n roi.subtypeColor = structures[subtypeStructureIdx].color;\r\n roi.subtypeName = structures[subtypeStructureIdx].label;\r\n roi.aiAnnotated = true;\r\n roi.isSelObj = true;\r\n }\r\n });\r\n }\r\n\r\n // if fromActiveLearning --> sort rois by uncertainty\r\n if (fromActiveLearning) {\r\n // get index of last unlabeled element in roiLayer\r\n let idxLastLabeled = 0;\r\n roiLayers[fileID][selectedLayer].layer.regionRois.forEach(\r\n (element, idx) => {\r\n if (element.isLabeled) {\r\n idxLastLabeled = idx;\r\n }\r\n }\r\n );\r\n\r\n // get array with labeled rois\r\n let labeled = roiLayers[fileID][selectedLayer].layer.regionRois.slice(\r\n 0,\r\n idxLastLabeled + 1\r\n );\r\n // get array with unlabeled rois\r\n let unlabeled = roiLayers[fileID][selectedLayer].layer.regionRois.slice(\r\n idxLastLabeled + 1\r\n );\r\n\r\n let sortedObjects = this.selObjects;\r\n let newSortedArray = [];\r\n sortedObjects.coordinates.forEach((element) => {\r\n // check if element exists in array with unlabeled data\r\n // get same element from backend results\r\n let r = unlabeled.filter(\r\n (roi) =>\r\n parseInt(roi.bounds.left, 10) === element.x &&\r\n parseInt(roi.bounds.top, 10) === element.y\r\n );\r\n // if element is in array --> put in new sorted array\r\n if (r[0]) {\r\n newSortedArray.push(r[0]);\r\n }\r\n });\r\n let updatedRoiLayer = labeled.concat(newSortedArray);\r\n roiLayers[fileID][selectedLayer].layer.regionRois = updatedRoiLayer;\r\n }\r\n\r\n this.selObjects = {\r\n coordinates: [],\r\n };\r\n\r\n // set firstTimeGallery true after scene switch\r\n this.setFirstTimeGallery();\r\n };\r\n\r\n setFirstTimeGallery = () => {\r\n // firstTimeGallery = true --> load new tiles\r\n const { activeFileId } = this.state;\r\n const { selectedLayer, roiLayers } = this.props.projectContext;\r\n\r\n roiLayers[activeFileId][selectedLayer].layer.regionRois.forEach(function (\r\n element\r\n ) {\r\n element.firstTimeGallery = true;\r\n });\r\n };\r\n\r\n setSelectedLayer = (x) => {\r\n if (this.state.selLayer !== x) {\r\n this.props.projectContext.setState({ selectedLayer: x });\r\n }\r\n };\r\n\r\n saveChangesGallery(fromExport) {\r\n this.saveFunction(fromExport);\r\n }\r\n\r\n updateViewer() {\r\n if (this._isMounted) this.forceUpdate();\r\n }\r\n\r\n setFUllyAnnotated = () => {\r\n let projectObject = this.state.project;\r\n projectObject.files[this.findFileIndex()].fullyAnnotated = true;\r\n this.setMountedState({ project: projectObject });\r\n };\r\n\r\n setAnnotated = () => {\r\n let projectObject = this.state.project;\r\n projectObject.files[this.findFileIndex()].annotated = true;\r\n this.setMountedState({ project: projectObject });\r\n };\r\n\r\n findFileIndex = () => {\r\n let idx = 0;\r\n this.state.project.files.forEach((element, i) => {\r\n if (element.id === this.state.activeFileId) {\r\n idx = i;\r\n }\r\n });\r\n return idx;\r\n };\r\n\r\n setApplyModelAfterTraining = (e) => {\r\n // set if apply model after training to unlabeled images\r\n this.applyModelAfterTraining = e;\r\n if (this._isMounted) this.forceUpdate();\r\n };\r\n\r\n startAutomaticTraining = () => {\r\n // start taining of dl model after x annotations automatically\r\n this.saveFunction();\r\n this.automaticTraining = true;\r\n\r\n // first do training with all annotated objects\r\n this.applyDL(\r\n this.tools[\"alm_gallery_tool\"],\r\n this.props.id,\r\n this.state.activeFileId,\r\n false\r\n );\r\n\r\n this.setAlruns(true);\r\n // then do classification for all unlabeled objects\r\n this.applyModelAfterTraining = true;\r\n };\r\n\r\n startPassiveLearningTraining = (tool, projectId, fileId) => {\r\n let previewRect = {\r\n // rect parameters for train model\r\n x: 2,\r\n y: 2,\r\n w: 2,\r\n h: 2,\r\n };\r\n if (tool.toolConfig.name.includes(\"alm_\")) {\r\n if (!this.automaticTraining) {\r\n // show loading spinner\r\n this.props.spinloader.show();\r\n }\r\n window.showSuccessSnackbar(\"Start training\");\r\n Backend.activeLearningSignalR(\r\n {\r\n name: tool.toolConfig.name,\r\n projectId: projectId,\r\n fileIds: [fileId],\r\n parameters: previewRect,\r\n preview: false,\r\n rect: null,\r\n project: this.createProjectModel(\"none\"),\r\n },\r\n (alModel) => {\r\n this.setAlruns(false);\r\n this.props.spinloader.hide();\r\n if (this.applyModelAfterTraining) {\r\n // apply model to all unlabeled rois after training\r\n this.applyDL(\r\n this.tools[\"alm_gallery_tool\"],\r\n this.props.id,\r\n this.state.activeFileId,\r\n true,\r\n true\r\n );\r\n } else {\r\n // put results from backend to frontend\r\n this.getSelectedObjects(alModel, fileId);\r\n this.saveFunction();\r\n if (this._isMounted) this.forceUpdate();\r\n }\r\n },\r\n (error) => {\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n }\r\n };\r\n\r\n prepareImagesForTraining = (idx, tool, projectId, previewRect) => {\r\n // save/crop all labeled images of all files before training\r\n // if end of files --> stop\r\n if (idx >= this.state.project.files.length) {\r\n // when all images are saved --> start training\r\n this.startPassiveLearningTraining(\r\n tool,\r\n projectId,\r\n this.state.project.files[0].id\r\n );\r\n return;\r\n }\r\n // if saved --> images of secene already prepared --> TODO: fix this\r\n // if (false /*this.state.project.files[idx].saved*/) {\r\n // this.prepareImagesForTraining(idx + 1, tool, projectId, previewRect);\r\n // return;\r\n // }\r\n // if not annotated --> no classified images for training in this file --> TODO: fix this\r\n // else if (false /*!this.state.project.files[idx].annotated*/) {\r\n // this.prepareImagesForTraining(idx + 1, tool, projectId, previewRect);\r\n // return;\r\n // }\r\n else {\r\n if (!this.automaticTraining) {\r\n // show loading spinner\r\n this.props.spinloader.show();\r\n }\r\n let fileIDs = this.state.project.files;\r\n let x = this.createProjectModel(\"none\");\r\n Backend.activeLearningSignalR(\r\n {\r\n name: tool.toolConfig.name,\r\n projectId: projectId,\r\n fileIDs: [fileIDs[idx].id],\r\n parameters: previewRect,\r\n preview: false,\r\n rect: null,\r\n project: x,\r\n },\r\n () => {\r\n // set file saved true if all rois are annotated\r\n if (fileIDs[idx].fullyAnnotated === true) {\r\n let projectObject = this.state.project;\r\n projectObject.files[idx].saved = true;\r\n this.setMountedState({\r\n project: projectObject,\r\n });\r\n }\r\n\r\n // saves images for training recursively for each scene\r\n if (idx + 1 < this.state.project.files.length) {\r\n this.prepareImagesForTraining(\r\n idx + 1,\r\n tool,\r\n projectId,\r\n previewRect\r\n );\r\n } else {\r\n // when all images are saved --> start training\r\n this.startPassiveLearningTraining(tool, projectId, fileIDs[0].id);\r\n }\r\n },\r\n (error) => {\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n }\r\n };\r\n\r\n startClassification = (idx, tool, projectId, previewRect) => {\r\n // start classification of rois with dl model\r\n // if end of files --> stop\r\n if (idx >= this.state.project.files.length) {\r\n this.setAlruns(false);\r\n this.props.spinloader.hide();\r\n return;\r\n }\r\n // if fullyAnnotated --> no unlabeled images ( --> fix this: when fully annotated apply model does not work because fullyannotated can be set wrong)\r\n // if (false /*this.state.project.files[idx].fullyAnnotated*/) {\r\n // this.startClassification(idx + 1, tool, projectId, previewRect);\r\n // } else {\r\n if (!this.automaticTraining) {\r\n // show loading spinner\r\n this.props.spinloader.show();\r\n }\r\n let fileIDs = this.state.project.files;\r\n let projModel = this.createProjectModel(\"none\");\r\n Backend.activeLearningSignalR(\r\n {\r\n name: tool.toolConfig.name,\r\n projectId: projectId,\r\n fileIDs: [fileIDs[idx].id],\r\n parameters: previewRect,\r\n preview: false,\r\n rect: null,\r\n project: projModel,\r\n },\r\n (alModel) => {\r\n // do classification recursively for each scene\r\n if (idx + 1 < this.state.project.files.length) {\r\n this.getSelectedObjects(alModel, fileIDs[idx].id);\r\n this.startClassification(idx + 1, tool, projectId, previewRect);\r\n } else {\r\n // put results from backend to frontend\r\n this.getSelectedObjects(alModel, fileIDs[idx].id);\r\n this.setAlruns(false);\r\n this.props.spinloader.hide();\r\n }\r\n },\r\n (error) => {\r\n window.openErrorDialog(error);\r\n this.props.spinloader.hide();\r\n }\r\n );\r\n // }\r\n };\r\n\r\n applyDL(tool, projectId, fileId, passiveLearning, applyModel) {\r\n let previewRect;\r\n if (passiveLearning) {\r\n // start passive learning\r\n if (!applyModel) {\r\n // start training\r\n previewRect = {\r\n // rect parameters for train model\r\n x: 1,\r\n y: 1,\r\n w: 2,\r\n h: 2,\r\n };\r\n if (tool.toolConfig.name.includes(\"alm_\")) {\r\n window.showSuccessSnackbar(\"Preparing data for training\");\r\n this.prepareImagesForTraining(0, tool, projectId, previewRect);\r\n }\r\n } else {\r\n // Apply Model (classify unlabeled images)\r\n previewRect = {\r\n // rect parameters for apply model\r\n x: 1,\r\n y: 1,\r\n w: 5,\r\n h: 5,\r\n };\r\n if (tool.toolConfig.name.includes(\"alm_\")) {\r\n window.showSuccessSnackbar(\"classify unlabeled images\");\r\n this.startClassification(0, tool, projectId, previewRect);\r\n }\r\n }\r\n } else {\r\n // start active learning\r\n previewRect = {\r\n // rect parameters for al\r\n x: 0,\r\n y: 0,\r\n w: 10,\r\n h: 10,\r\n };\r\n window.showSuccessSnackbar(\"Start Active Learning ...\");\r\n if (tool.toolConfig.name.includes(\"alm_\")) {\r\n Backend.activeLearningSignalR(\r\n {\r\n name: tool.toolConfig.name,\r\n projectId: projectId,\r\n fileIds: [fileId],\r\n parameters: previewRect,\r\n preview: false,\r\n rect: null,\r\n project: this.createProjectModel(\"none\"),\r\n },\r\n (alModel) => {\r\n // after active learning --> rois are sorted by uncertainty\r\n this.getSelectedObjects(alModel, fileId, true);\r\n this.saveFunction();\r\n if (this._isMounted) this.forceUpdate();\r\n },\r\n (error) => {\r\n window.openErrorDialog(error);\r\n }\r\n );\r\n }\r\n }\r\n }\r\n\r\n setAlruns(x) {\r\n this.setMountedState({ alruns: x, activeTool: Tools.NONE });\r\n }\r\n\r\n trainingWarning = (warning) => {\r\n // give snackbar warnings\r\n if (warning === \"subtype\") {\r\n window.showWarningSnackbar(\"Please switch to parent.\");\r\n } else if (warning === \"tooFewAnnotations\") {\r\n window.showWarningSnackbar(\r\n \"One subtype needs at least 5 objects to start training. And one other subtype needs at least one object.\"\r\n );\r\n } else if (warning === \"hasNoChilds\") {\r\n window.showWarningSnackbar(\"This structure has no classes.\");\r\n }\r\n };\r\n\r\n trainingProgress = (message) => {\r\n if (\r\n this.tools[this.state.activeTool] &&\r\n (this.tools[this.state.activeTool][\"name\"] === \"AI Training\" ||\r\n this.tools[this.state.activeTool][\"name\"] === \"Instance Segmentation\" ||\r\n this.tools[this.state.activeTool][\"name\"] === \"Classification\")\r\n ) {\r\n this.tools[this.state.activeTool].updateTrainingProgress(message);\r\n if (message.includes(\"training done!!!\")) this.props.spinloader.hide();\r\n else if (message.includes(\"No annotations in\")) {\r\n window.showWarningSnackbar(message);\r\n } else if (message.includes(\"Continue training with\")) {\r\n window.showSuccessSnackbar(message);\r\n } else if (message.includes(\"Train model from scratch\")) {\r\n window.showSuccessSnackbar(message);\r\n } else if (message.includes(\"time elapsed\")) this.props.spinloader.hide();\r\n else if (\r\n message.includes(\r\n \"No trainingdata, please annotate at least 15+ objects\"\r\n )\r\n ) {\r\n window.showErrorSnackbar(message);\r\n this.props.spinloader.hide();\r\n }\r\n }\r\n };\r\n\r\n galleryTrainingProgress = (message) => {\r\n // get training progress for gallery from backend messages\r\n if (this.gallery) {\r\n this.gallery.setProgress(message);\r\n }\r\n };\r\n\r\n setGridSize = (x) => {\r\n this.setMountedState({ gridSize: x });\r\n };\r\n\r\n /**\r\n * Writes all ROIs into both the parent (sub-) structure (as usual) as well\r\n * as the corresponding subtypes.\r\n * This causes a considerable overhead for the filesize, but removing it can\r\n * cause issues when training.\r\n */\r\n adjustRoiLayers = () => {\r\n // make all subtype rois in subtype roilayers\r\n const { structures, roiLayers } = this.props.projectContext;\r\n\r\n for (let file of this.state.project.files) {\r\n let fileId = file.id;\r\n if (typeof roiLayers[fileId] === \"undefined\") {\r\n continue;\r\n }\r\n // make subtype rois in subtype layers\r\n structures.forEach((element, idx) => {\r\n if (structures[idx].classificationSubtype) {\r\n let childIds = [];\r\n let childLabels = [];\r\n this.findAllSubtypes(structures[idx]).forEach((element) => {\r\n childIds.push(element.id);\r\n childLabels.push(element.label);\r\n });\r\n\r\n let parentLayer = this.getParentIndexLayer(structures[idx]);\r\n let subtypeLayer = structures.findIndex(\r\n (element) => element.id === structures[idx].id\r\n );\r\n\r\n if (\r\n roiLayers[fileId][parentLayer] &&\r\n roiLayers[fileId][subtypeLayer]\r\n ) {\r\n roiLayers[fileId][parentLayer].layer.regionRois.forEach((roi) => {\r\n if (\r\n roi.structureId === element.id ||\r\n childIds.includes(roi.structureId) ||\r\n childLabels.includes(roi.subtypeName)\r\n ) {\r\n roiLayers[fileId][subtypeLayer].layer.regionRois.push(roi);\r\n }\r\n });\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n findChilds = (str) => {\r\n const { structures } = this.props.projectContext;\r\n // return direct classification subtypes\r\n return structures.filter(\r\n (element) =>\r\n element.subtypeLevel === str.subtypeLevel + 1 &&\r\n element.parentId === str.id &&\r\n element.classificationSubtype\r\n );\r\n };\r\n\r\n findAllSubtypes = (structure) => {\r\n // get all subtypes of selectedLayer (also subsubtypes)\r\n\r\n // first get all direct childs\r\n let childs = this.findChilds(structure);\r\n let allChilds = [];\r\n\r\n // search for childs of childs until no childs are checked for childs\r\n while (childs.length !== 0) {\r\n // code block to be executed\r\n childs = childs.concat(this.findChilds(childs[0]));\r\n if (!allChilds.includes(childs[0]) && childs[0].classificationSubtype) {\r\n allChilds.push(childs[0]);\r\n }\r\n childs.shift();\r\n }\r\n return allChilds;\r\n };\r\n\r\n /**\r\n * Add object key and value to string\r\n * @param {*} string tmp string that is used to store parts of a large object\r\n * @param {*} key object key that should be added\r\n * @param {*} value object value(s) that should be added\r\n * @param {*} filesByteArray array of string parts\r\n * @returns [string, filesByteArray] after updating\r\n */\r\n addStuff = (string, key, value, filesByteArray) => {\r\n string += '\"' + key + '\":' + JSON.stringify(value);\r\n let res = this.checkStringLength(string, filesByteArray);\r\n return res;\r\n };\r\n\r\n /**\r\n * check string Length and if larger then 10000 chars, update filesByteArray\r\n * @param {*} string tmp string that is used to store parts of a large object\r\n * @param {*} filesByteArray array of string parts\r\n * @returns [string, filesByteArray] after updating\r\n */\r\n checkStringLength = (string, filesByteArray) => {\r\n // if more then 10000 chars add current string part to filesByteArray\r\n // clear string\r\n if (string.length > 10000) {\r\n filesByteArray.push(string);\r\n string = \"\";\r\n }\r\n return [string, filesByteArray];\r\n };\r\n\r\n /**\r\n * finalize filesByteArray by adding the last string part\r\n * @param {*} string tmp string that is used to store parts of a large object\r\n * @param {*} filesByteArray array of string parts\r\n * @returns [string, filesByteArray] after updating\r\n */\r\n finalizeByteArray(string, filesByteArray) {\r\n filesByteArray.push(string);\r\n string = \"\";\r\n return [string, filesByteArray];\r\n }\r\n\r\n /**\r\n * convert JSON files object, that's to large for JSON.stringify() manually\r\n * @param {*} files JSON object\r\n * @returns blob\r\n */\r\n largeFilesJSONtoBlobConverter = (files) => {\r\n let filesByteArray = [];\r\n let res;\r\n // Manually decompose the files object, save to string, split and convert parts to byteArray\r\n // Issue! ByteArray get's to big at some point -> blob has to be created and updated on the go\r\n let tmpString = \"[\";\r\n for (let fileIdx in files) {\r\n let file = files[fileIdx];\r\n let keys = Object.keys(files[fileIdx]);\r\n tmpString += \"{\";\r\n for (let keyIdx in keys) {\r\n let key = keys[keyIdx];\r\n let value = file[key];\r\n if (key !== \"annotations\") {\r\n res = this.addStuff(tmpString, key, value, filesByteArray);\r\n tmpString = res[0];\r\n filesByteArray = res[1];\r\n } else {\r\n let annotations = value;\r\n // Array of Objects\r\n tmpString += '\"annotations\":[';\r\n for (let annoIdx in annotations) {\r\n // new Object\r\n tmpString += \"{\";\r\n let anno = annotations[annoIdx];\r\n let annoKeys = Object.keys(anno);\r\n for (let annoKeyIdx in annoKeys) {\r\n let annoKey = annoKeys[annoKeyIdx];\r\n let annoValue = anno[annoKey];\r\n if (annoKey !== \"geoJSON\") {\r\n res = this.addStuff(\r\n tmpString,\r\n annoKey,\r\n annoValue,\r\n filesByteArray\r\n );\r\n tmpString = res[0];\r\n filesByteArray = res[1];\r\n } else {\r\n tmpString += '\"geoJSON\":{';\r\n let geoJSON = annoValue;\r\n let geoJSONKeys = Object.keys(geoJSON);\r\n for (let geoJSONKeyIdx in geoJSONKeys) {\r\n let paramKey = geoJSONKeys[geoJSONKeyIdx];\r\n let paramValue = geoJSON[paramKey];\r\n if (paramKey !== \"coordinates\") {\r\n res = this.addStuff(\r\n tmpString,\r\n paramKey,\r\n paramValue,\r\n filesByteArray\r\n );\r\n tmpString = res[0];\r\n filesByteArray = res[1];\r\n } else {\r\n tmpString += '\"coordinates\":[';\r\n for (let polyIdx in paramValue) {\r\n let poly = paramValue[polyIdx];\r\n tmpString += JSON.stringify(poly);\r\n if (polyIdx < paramValue.length - 1) tmpString += \",\";\r\n let res = this.checkStringLength(\r\n tmpString,\r\n filesByteArray\r\n );\r\n tmpString = res[0];\r\n filesByteArray = res[1];\r\n }\r\n tmpString += \"]\";\r\n }\r\n if (geoJSONKeyIdx < geoJSONKeys.length - 1) tmpString += \",\";\r\n }\r\n tmpString += \"}\";\r\n }\r\n if (annoKeyIdx < annoKeys.length - 1) tmpString += \",\";\r\n }\r\n tmpString += \"}\";\r\n if (annoIdx < annotations.length - 1) tmpString += \",\";\r\n }\r\n tmpString += \"]\";\r\n }\r\n if (keyIdx < keys.length - 1) tmpString += \",\";\r\n }\r\n tmpString += \"}\";\r\n if (fileIdx < files.length - 1) tmpString += \",\";\r\n }\r\n tmpString += \"]\";\r\n res = this.finalizeByteArray(tmpString, filesByteArray);\r\n tmpString = \"\";\r\n filesByteArray = res[1];\r\n\r\n // create blob from filesByteArray\r\n let blob = new Blob(filesByteArray, {\r\n type: \"application/octet-stream\",\r\n });\r\n filesByteArray = [];\r\n console.log(\"blob\", blob);\r\n\r\n return blob;\r\n };\r\n\r\n saveWithSpinloader(projectModel, callback = this.defaultSaveCallback) {\r\n this.props.spinloader.show();\r\n setTimeout(() => {\r\n let files = projectModel.files.slice();\r\n\r\n let blob;\r\n try {\r\n blob = new Blob([JSON.stringify(files)]);\r\n } catch {\r\n console.log(\r\n \"Files to large for JSON.stringify(). Continuing with custom function.\"\r\n );\r\n blob = this.largeFilesJSONtoBlobConverter(files);\r\n }\r\n\r\n let projectId = projectModel.id;\r\n let fileId = this.state.activeFileId;\r\n // empty annotations, to save only project\r\n for (let file of projectModel.files) {\r\n file.annotations = null;\r\n }\r\n Backend.saveProject(projectModel, (data) => {\r\n if (data.success) {\r\n Backend.saveAnnotations(projectId, fileId, blob, (data) => {\r\n this.props.spinloader.hide();\r\n if (data.success) {\r\n window.showSuccessSnackbar(\"Project saved succesfully!\");\r\n if (typeof callback === \"function\") {\r\n callback();\r\n }\r\n } else {\r\n window.showErrorSnackbar(\r\n \"Project couldn't be saved! Failed while saving annotations!\"\r\n );\r\n }\r\n });\r\n } else {\r\n this.props.spinloader.hide();\r\n window.showErrorSnackbar(\"Project couldn't be saved!\");\r\n }\r\n });\r\n }, 0);\r\n }\r\n\r\n defaultSaveCallback() {\r\n console.log(\"Saved successfully\");\r\n }\r\n\r\n saveFunction(fromExport, callback = this.defaultSaveCallback) {\r\n // this.props.persistentStorage.save(\"ActiveFileId\", this.state.activeFileId);\r\n //Backend.saveProject(projectModel, () => { });\r\n this.props.persistentStorage.save(\r\n \"SplitscreenFileIds\",\r\n this.state.splitscreenFileIds\r\n );\r\n this.props.persistentStorage.save(\"ActiveFileId\", this.state.activeFileId);\r\n const projectModel = this.createProjectModel(\"all\", null, fromExport);\r\n this.saveWithSpinloader(projectModel, callback);\r\n }\r\n\r\n dataURItoBlob(dataURI) {\r\n // convert base64/URLEncoded data component to raw binary data held in a string\r\n var byteString;\r\n if (dataURI.split(\",\")[0].indexOf(\"base64\") >= 0)\r\n byteString = atob(dataURI.split(\",\")[1]);\r\n else byteString = unescape(dataURI.split(\",\")[1]);\r\n\r\n // separate out the mime component\r\n var mimeString = dataURI.split(\",\")[0].split(\":\")[1].split(\";\")[0];\r\n\r\n // write the bytes of the string to a typed array\r\n var ia = new Uint8Array(byteString.length);\r\n for (var i = 0; i < byteString.length; i++) {\r\n ia[i] = byteString.charCodeAt(i);\r\n }\r\n\r\n return new Blob([ia], { type: mimeString });\r\n }\r\n\r\n /***\r\n * Needed for ScreenshotTool\r\n */\r\n getProjectInfoString = () => {\r\n const project = this.state.project;\r\n const file = project.files.find(\r\n (file) => file.id === this.state.activeFileId\r\n );\r\n const fileName = file.fileName.split(\".\").slice(0, -1).join(\".\");\r\n\r\n // projekt_methode_filename_SceneNr_001.png\r\n return project.name + \"_\" + project.type + \"_\" + fileName;\r\n };\r\n\r\n onSaveScreenshot = () => {\r\n const file = this.state.project.files.find(\r\n (file) => file.id === this.state.activeFileId\r\n );\r\n\r\n let img = this.rendererdict[this.state.activeFileId].canvas;\r\n\r\n let ctx = img.getContext(\"2d\");\r\n\r\n ctx.save();\r\n let a = ctx.getTransform().a;\r\n let d = ctx.getTransform().d;\r\n let e = ctx.getTransform().e;\r\n let f = ctx.getTransform().f;\r\n ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n\r\n let projectName = file.fileName.split(\".\").slice(0, -1).join(\".\");\r\n if (\r\n this.state.project.type.includes(\"HistoPointCounting\") ||\r\n this.state.project.type.includes(\"HistoClassification\")\r\n ) {\r\n if (projectName.includes(\"__\")) {\r\n projectName = projectName.split(\"-\").slice(0, -4).join(\"-\");\r\n } else {\r\n projectName = projectName.split(\"-\").slice(0, -3).join(\"-\");\r\n }\r\n }\r\n\r\n let fontSize = 20;\r\n ctx.font = fontSize + \"px Arial\";\r\n\r\n // Box-Position\r\n let x = 10;\r\n let y = 10;\r\n let width = ctx.measureText(projectName).width + 10;\r\n let height = parseInt(fontSize, 10) + 10;\r\n\r\n // Draw Box-Border\r\n ctx.fillStyle = \"black\";\r\n let thickness = 1;\r\n ctx.fillRect(\r\n x - thickness,\r\n y - thickness,\r\n width + thickness * 2,\r\n height + thickness * 2\r\n );\r\n\r\n // Draw Box\r\n // ctx.globalAlpha = 0.8;\r\n ctx.fillStyle = \"white\";\r\n ctx.fillRect(x, y, width, height);\r\n\r\n // Add Text\r\n // ctx.globalAlpha = 1;\r\n ctx.textAlign = \"left\";\r\n ctx.textBaseline = \"top\";\r\n ctx.fillStyle = \"black\";\r\n ctx.fillText(projectName, 15, 15);\r\n\r\n ctx.setTransform(a, 0, 0, d, e, f);\r\n ctx.restore();\r\n\r\n img = img.toDataURL(\"image/jpeg\", 0.9);\r\n\r\n if (\r\n this.state.project.type.includes(\"HistoPointCounting\") ||\r\n this.state.project.type.includes(\"HistoClassification\")\r\n ) {\r\n const fileName = file.fileName.split(\".\").slice(0, -1).join(\".\");\r\n let lastIndex = file.sourcePath.replace(/\\\\/g, \"/\").lastIndexOf(\"/\");\r\n const folderPath = file.sourcePath.substring(0, lastIndex + 1);\r\n Backend.saveScreenshot(\r\n folderPath,\r\n fileName,\r\n this.dataURItoBlob(img),\r\n (response) => {\r\n window.showSuccessSnackbar(\r\n \"Screenshot saved here: \" + response.savePath\r\n );\r\n }\r\n );\r\n } else {\r\n let link = document.createElement(\"a\");\r\n\r\n // projekt_methode_filename_SceneNr_001.png\r\n let screenShotName =\r\n this.getProjectInfoString() + \"_S\" + (file.scene + 1) + \".jpg\";\r\n link.download = screenShotName;\r\n link.href = img.replace(\"image/jpeg\", \"image/octet-stream\");\r\n link.click();\r\n }\r\n };\r\n\r\n getMousePosition = () => {\r\n return [this.mousePosition.mouseX, this.mousePosition.mouseY];\r\n };\r\n\r\n zoomToRect = (rect) => {\r\n // zoom to rect in viewer/rendererdict[this.state.activeFileId]\r\n this.rendererdict[this.state.activeFileId].zoomFit();\r\n //this.rendererdict[this.state.activeFileId].zoomToRect();\r\n let width = rect.right - rect.left;\r\n let height = rect.bottom - rect.top;\r\n this.createZoomObjectForRect(\r\n false,\r\n rect.left - width,\r\n rect.right + width,\r\n rect.top - height,\r\n rect.bottom + height\r\n );\r\n };\r\n\r\n moveToRect = (rect) => {\r\n // make roi/rect in center of screen\r\n if (!this.rendererdict[this.state.activeFileId]) {\r\n setTimeout(() => this.moveToRect(), 400);\r\n } else {\r\n this.rendererdict[this.state.activeFileId].centerRoi(rect);\r\n }\r\n };\r\n\r\n onZoomOriginal = () => {\r\n this.rendererdict[this.state.activeFileId].zoomOriginal();\r\n if (this.state.showFullscreen) {\r\n if (this.state.fullscreenChain) {\r\n for (const value of Object.values(this.state.fullscreenFileIds)) {\r\n this.rendererdict[\"Full\" + value].zoomOriginal();\r\n }\r\n } else {\r\n this.rendererdict[\"Full\" + this.state.activeFileId].zoomOriginal();\r\n }\r\n }\r\n };\r\n\r\n onZoomOneToN = (x) => {\r\n this.rendererdict[this.state.activeFileId].zoomOneToN(x);\r\n if (this.state.showFullscreen) {\r\n if (this.state.fullscreenChain) {\r\n for (const value of Object.values(this.state.fullscreenFileIds)) {\r\n this.rendererdict[\"Full\" + value].zoomOneToN(x);\r\n }\r\n } else {\r\n this.rendererdict[\"Full\" + this.state.activeFileId].zoomOneToN(x);\r\n }\r\n }\r\n };\r\n\r\n fullscreenInitFilePlacement = (pt, fileId, factor, fs = false) => {\r\n const r = fs\r\n ? this.rendererdict[\"Full\" + fileId]\r\n : this.rendererdict[fileId];\r\n\r\n let o = this.props.tiles.getTransformationOffset(fileId);\r\n\r\n r.ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n r.ctx.translate(pt.x, pt.y);\r\n r.ctx.translate(-o[0] * factor, -o[1] * factor);\r\n r.ctx.scale(factor, factor);\r\n };\r\n\r\n onZoomFit = () => {\r\n if (this.state.showFullscreen) {\r\n if (\r\n this.state.fullscreenChain &&\r\n this.state.fullscreenFileIds.length === 2\r\n ) {\r\n let pt = null;\r\n let factor = null;\r\n\r\n for (const value of Object.values(this.state.fullscreenFileIds)) {\r\n let m = this.props.tiles.getTransformationMatrix(value);\r\n this.rendererdict[\"Full\" + value].zoomFit();\r\n if (!Array.isArray(m)) {\r\n pt = this.rendererdict[\"Full\" + value].getPointInCanvasCoord(0, 0);\r\n factor = this.rendererdict[\"Full\" + value].state.initialScale;\r\n }\r\n }\r\n for (const value of Object.values(this.state.fullscreenFileIds)) {\r\n let m = this.props.tiles.getTransformationMatrix(value);\r\n if (Array.isArray(m) && pt !== null && factor !== null) {\r\n this.fullscreenInitFilePlacement(pt, value, factor, true);\r\n }\r\n }\r\n } else {\r\n this.rendererdict[\"Full\" + this.state.activeFileId].zoomFit();\r\n }\r\n } else {\r\n this.rendererdict[this.state.activeFileId].zoomFit();\r\n if (Object.keys(this.chainListFileIds).length > 1) {\r\n for (const value of Object.values(this.chainListFileIds)) {\r\n if (value !== this.props.activeFileId)\r\n this.rendererdict[value].zoomFit();\r\n }\r\n }\r\n let pt = null;\r\n let factor = null;\r\n\r\n for (const value of Object.values(this.state.splitscreenFileIds)) {\r\n let m = this.props.tiles.getTransformationMatrix(value);\r\n if (!Array.isArray(m)) {\r\n pt = this.rendererdict[value].getPointInCanvasCoord(0, 0);\r\n factor = this.rendererdict[value].state.initialScale;\r\n }\r\n }\r\n for (const value of Object.values(this.state.splitscreenFileIds)) {\r\n let m = this.props.tiles.getTransformationMatrix(value);\r\n if (Array.isArray(m) && pt !== null && factor !== null) {\r\n this.fullscreenInitFilePlacement(pt, value, factor);\r\n }\r\n }\r\n }\r\n };\r\n\r\n onZoomDelta = (delta) => {\r\n this.rendererdict[this.state.activeFileId].zoomDelta(delta);\r\n if (this.state.showFullscreen) {\r\n if (this.state.fullscreenChain) {\r\n for (const value of Object.values(this.state.fullscreenFileIds)) {\r\n this.rendererdict[\"Full\" + value].zoomDelta(delta);\r\n }\r\n } else {\r\n this.rendererdict[\"Full\" + this.state.activeFileId].zoomDelta(delta);\r\n }\r\n }\r\n };\r\n\r\n onSaveClick = (callback) => {\r\n this.saveFunction(null, callback);\r\n };\r\n\r\n onSaveGalleryClick = () => {\r\n this.saveFunction();\r\n };\r\n\r\n histogramChanged(histogramConfig) {\r\n this.rendererdict[this.state.activeFileId].updateFLChannels(\r\n histogramConfig\r\n );\r\n }\r\n\r\n toggleSideBar = () => {\r\n if (this.state.sideBarWidth > 0) {\r\n this.setMountedState({\r\n originalSideBarWidth: this.state.sideBarWidth,\r\n sideBarWidth: 0,\r\n });\r\n } else {\r\n this.setMountedState({\r\n sideBarWidth: this.state.originalSideBarWidth,\r\n });\r\n }\r\n this.updateDimensions();\r\n this.props.spinloader.setRightWidth(\r\n this.state.sideBarWidth +\r\n this.state.verticalToolBarWidth +\r\n this.state.classRoomChatWidth\r\n );\r\n };\r\n\r\n toggleClassRoomChat = () => {\r\n if (this.state.classRoomChatWidth === 0) {\r\n this.setMountedState({\r\n classRoomChatWidth: 300,\r\n });\r\n } else {\r\n this.setMountedState({\r\n classRoomChatWidth: this.state.classRoomChatWidth > 0 ? 0 : 300,\r\n });\r\n }\r\n this.updateDimensions();\r\n this.props.spinloader.setRightWidth(\r\n this.state.sideBarWidth +\r\n this.state.verticalToolBarWidth +\r\n this.state.classRoomChatWidth\r\n );\r\n };\r\n\r\n mouseWheelEvent = (e) => {\r\n if (e.ctrlKey) {\r\n this.setMountedState({\r\n opacity: Math.min(1, Math.max(0, this.state.opacity + e.deltaY / 1000)),\r\n });\r\n }\r\n if (\r\n typeof this.tools[this.state.activeTool] !== \"undefined\" &&\r\n this.tools[this.state.activeTool].mouseWheelEvent\r\n )\r\n this.tools[this.state.activeTool].mouseWheelEvent(e);\r\n };\r\n\r\n showGrid = () => {\r\n // check if show tile name in rois --> only if project contains tiles tool\r\n return this.state.project\r\n ? this.checkToolInConfig(\"TilesTool\")\r\n ? true\r\n : false\r\n : false;\r\n };\r\n\r\n resizeSideBar = (deltaX, resizeEnd) => {\r\n let newSideBarWidth = this.state.sideBarWidth + deltaX;\r\n if (\r\n newSideBarWidth > this.state.minSideBarWidth &&\r\n window.innerWidth - newSideBarWidth > this.state.minRendererWidth\r\n ) {\r\n this.setMountedState({ sideBarWidth: newSideBarWidth });\r\n this.props.persistentStorage.save(\"sideBarWidth\", newSideBarWidth);\r\n }\r\n if (resizeEnd) {\r\n this.updateDimensions();\r\n }\r\n };\r\n\r\n resizeTimeLine = (deltaY, resizeEnd) => {\r\n let newTimeLineHeight = this.state.timeLineHeight + deltaY;\r\n if (\r\n newTimeLineHeight > this.state.minTimeLineHeight &&\r\n window.innerHeight - newTimeLineHeight - 64 > this.state.minCanvasHeight\r\n ) {\r\n this.setMountedState({ timeLineHeight: newTimeLineHeight });\r\n this.props.persistentStorage.save(\"timeLineHeight\", newTimeLineHeight);\r\n }\r\n if (resizeEnd) {\r\n this.updateDimensions();\r\n }\r\n };\r\n\r\n updateToolBarWidth = (newToolBarWidth, galleryView) => {\r\n if (this.state.verticalToolBarWidth !== newToolBarWidth) {\r\n this.setMountedState({\r\n verticalToolBarWidth: newToolBarWidth,\r\n });\r\n this.updateDimensions();\r\n } else if (galleryView && this.state.verticalToolBarWidth !== 45) {\r\n this.setMountedState({\r\n verticalToolBarWidth: 45,\r\n });\r\n this.updateDimensions();\r\n }\r\n };\r\n\r\n isElementVisible = (el) => {\r\n // check if element was visible in previous use of project\r\n // check saved value of element\r\n let visible = this.props.persistentStorage.load(el);\r\n\r\n // if undefined make element visible\r\n if (typeof visible === \"undefined\") {\r\n return el === \"showResultTable\" || el === \"showZoomBar\" ? false : true;\r\n } else {\r\n return visible;\r\n }\r\n };\r\n\r\n setSideBarWidth = () => {\r\n // set sideBarWidth depending on project module\r\n // get saved SideBarWith from local storage\r\n let sideBarWidthObject = this.props.persistentStorage.load(\"sideBarWidth\");\r\n let sideBarWidthFromConfig =\r\n this.state.viewerConfig.project.projectStringProperties[\"SideBarWidth\"];\r\n let sideBarWidth;\r\n // check if special project module\r\n if (this.resultTabActive()) {\r\n if (this.state && this.state.verticalToolBarWidth) {\r\n sideBarWidth =\r\n window.innerWidth - this.state.verticalToolBarWidth - 5 - 900; // subtract verticalToolBar, Padding and Renderer\r\n } else {\r\n sideBarWidth = window.innerWidth - 45 - 5 - 900; // subtract verticalToolBar, Padding and Renderer\r\n }\r\n } else {\r\n if (sideBarWidthObject) {\r\n // if sideBarWidth was saved to persistentStorage\r\n sideBarWidth = sideBarWidthObject;\r\n } else {\r\n // check if sideBarWidth is set in config --> if not set default value 455\r\n sideBarWidth =\r\n sideBarWidthFromConfig && sideBarWidthFromConfig !== \"\"\r\n ? parseInt(sideBarWidthFromConfig, 10)\r\n : 455;\r\n }\r\n }\r\n this.setMountedState({ sideBarWidth });\r\n this.updateDimensions();\r\n };\r\n\r\n getProjectLabel = () => {\r\n if (this.state && this.state.viewerConfig) {\r\n return this.state.viewerConfig.project.label;\r\n }\r\n };\r\n\r\n saveChainStatus = () => {\r\n this.props.persistentStorage.save(\"chainList\", this.chainList);\r\n this.props.persistentStorage.save(\r\n \"chainListFileIds\",\r\n this.chainListFileIds\r\n );\r\n };\r\n\r\n onSelectFileSplitscreen = (fileId) => {\r\n //get all ome and histoconfig prepared\r\n let { splitscreenFileIds } = this.state;\r\n if (splitscreenFileIds.length < 9) {\r\n this.addFileToFullscreen(fileId, 0);\r\n splitscreenFileIds.push(fileId);\r\n this.props.persistentStorage.save(\"ActiveFileId\", fileId);\r\n this.props.persistentStorage.save(\r\n \"SplitscreenFileIds\",\r\n splitscreenFileIds\r\n );\r\n this.openFile(fileId, this.props.id, true);\r\n this.setMountedState({\r\n splitscreenFileIds,\r\n activeFileId: fileId,\r\n });\r\n this.updateDimensions();\r\n } else {\r\n window.showErrorSnackbar(\r\n \"A maximum of 9 images within the splitscreen is allowed\"\r\n );\r\n }\r\n };\r\n\r\n onSwitchFileSplitscreen = (newFileId) => {\r\n let { activeFileId, splitscreenFileIds } = this.state;\r\n\r\n let rendererRef = this.rendererdict[activeFileId];\r\n delete this.rendererdict[activeFileId];\r\n this.rendererdict[newFileId] = rendererRef;\r\n\r\n let index = splitscreenFileIds.indexOf(activeFileId);\r\n splitscreenFileIds[index] = newFileId;\r\n activeFileId = newFileId;\r\n this.openFile(activeFileId, this.props.id, true);\r\n this.props.persistentStorage.save(\"ActiveFileId\", activeFileId);\r\n this.props.persistentStorage.save(\"SplitscreenFileIds\", splitscreenFileIds);\r\n\r\n this.chainList[index] = false;\r\n delete this.chainListFileIds[index];\r\n this.saveChainStatus();\r\n\r\n this.setMountedState({\r\n splitscreenFileIds,\r\n activeFileId,\r\n });\r\n };\r\n\r\n onExcludeSplitscreen = (index, e) => {\r\n let { splitscreenFileIds, activeFileId } = this.state;\r\n\r\n if (activeFileId === splitscreenFileIds[index]) {\r\n splitscreenFileIds.splice(index, 1);\r\n activeFileId = splitscreenFileIds[Math.max(index - 1, 0)];\r\n } else {\r\n splitscreenFileIds.splice(index, 1);\r\n }\r\n this.props.persistentStorage.save(\"ActiveFileId\", activeFileId);\r\n this.props.persistentStorage.save(\"SplitscreenFileIds\", splitscreenFileIds);\r\n this.setMountedState({\r\n splitscreenFileIds,\r\n activeFileId,\r\n });\r\n\r\n this.chainList[index] = false;\r\n delete this.chainListFileIds[index];\r\n this.saveChainStatus();\r\n this.updateDimensions();\r\n e.stopPropagation();\r\n return false;\r\n };\r\n\r\n onChainSplitscreen = (index, currentFileId, e) => {\r\n if (!this.chainList[index]) {\r\n this.chainList[index] = true;\r\n this.chainListFileIds[index] = currentFileId;\r\n this.saveChainStatus();\r\n } else if (this.chainList[index]) {\r\n this.chainList[index] = false;\r\n delete this.chainListFileIds[index];\r\n this.saveChainStatus();\r\n }\r\n if (e) {\r\n e.stopPropagation();\r\n }\r\n };\r\n\r\n onChangeChain = (bool, index, fileId) => {\r\n this.chainList[index] = bool;\r\n this.chainListFileIds[index] = fileId;\r\n if (!bool) {\r\n delete this.chainListFileIds[index];\r\n }\r\n this.saveChainStatus();\r\n };\r\n\r\n onDropFile = (event) => {\r\n event.preventDefault();\r\n let id = event.dataTransfer.getData(\"Text\");\r\n for (let i = 0; i < this.state.project.files.length; i++) {\r\n if (this.state.project.files[i].id === id) {\r\n this.onSelectFileSplitscreen(id);\r\n }\r\n }\r\n this.setMountedState({ showSplitscreenDropzone: false });\r\n };\r\n\r\n setActiveView = (index) => {\r\n let { splitscreenFileIds, activeFileId } = this.state;\r\n if (activeFileId !== splitscreenFileIds[index]) {\r\n activeFileId = splitscreenFileIds[index];\r\n }\r\n this.addFileToFullscreen(activeFileId, 0);\r\n this.props.persistentStorage.save(\"ActiveFileId\", activeFileId);\r\n this.setMountedState({\r\n activeFileId,\r\n });\r\n };\r\n\r\n onToggleFullscreen = () => {\r\n if (this.state.showFullscreen) {\r\n this.setMountedState({ showOverlay: false, showWindowTool: false });\r\n this.setOpacityChangeFullscreen(0, 100);\r\n this.setOpacityChangeFullscreen(1, 0);\r\n }\r\n this.setMountedState({ showFullscreen: !this.state.showFullscreen });\r\n this.updateDimensions();\r\n };\r\n\r\n setOpacityChangeFullscreen = (id, value) => {\r\n if (id === 0) {\r\n this.setMountedState({ firstFullscreenOpacity: value });\r\n } else {\r\n this.setMountedState({ secFullscreenOpacity: value });\r\n }\r\n };\r\n\r\n addFileToFullscreen = (fileId, idx) => {\r\n let { fullscreenFileIds } = this.state;\r\n if (\r\n (idx === 0 && fullscreenFileIds[1] === fileId) ||\r\n (idx === 1 && fullscreenFileIds[0] === fileId)\r\n ) {\r\n let firstRef = this.rendererdict[\"Full\" + fullscreenFileIds[0]];\r\n let secRef = this.rendererdict[\"Full\" + fullscreenFileIds[1]];\r\n let firstId = fullscreenFileIds[0];\r\n let secId = fullscreenFileIds[1];\r\n this.rendererdict[\"Full\" + fullscreenFileIds[1]] = firstRef;\r\n this.rendererdict[\"Full\" + fullscreenFileIds[0]] = secRef;\r\n fullscreenFileIds[0] = secId;\r\n fullscreenFileIds[1] = firstId;\r\n } else if (fullscreenFileIds[idx] && fullscreenFileIds[idx] !== fileId) {\r\n let rendererRef = this.rendererdict[\"Full\" + fullscreenFileIds[idx]];\r\n delete this.rendererdict[\"Full\" + fullscreenFileIds[idx]];\r\n this.rendererdict[\"Full\" + fileId] = rendererRef;\r\n fullscreenFileIds[idx] = fileId;\r\n }\r\n if (fullscreenFileIds.length === 0 || fullscreenFileIds.length === 1) {\r\n fullscreenFileIds[idx] = fileId;\r\n }\r\n\r\n if (this.sliderRef) {\r\n this.sliderRef.setState({ init: false });\r\n }\r\n this.setMountedState({\r\n fullscreenFileIds,\r\n });\r\n };\r\n\r\n setActiveFileFullscreen = (fileId) => {\r\n this.setMountedState({ activeFileId: fileId });\r\n };\r\n\r\n onToggleFullscreenChain = () => {\r\n this.setMountedState({ fullscreenChain: !this.state.fullscreenChain });\r\n };\r\n\r\n onToggleOverlay = () => {\r\n this.setMountedState({\r\n showOverlay: !this.state.showOverlay,\r\n showWindowTool: false,\r\n });\r\n };\r\n\r\n onToggleWindowTool = () => {\r\n this.setMountedState({ showWindowTool: !this.state.showWindowTool });\r\n };\r\n\r\n toggleShowFirstAccordion = () => {\r\n this.setMountedState({\r\n showFirstAccordion: !this.state.showFirstAccordion,\r\n });\r\n };\r\n\r\n /**\r\n * Saves those structures to which AI results will be saved to.\r\n * @param {object} obj Structure information including the model used.\r\n * @param {string} task What to do with a given structure. Supports \"add\" and \"remove_all\".\r\n */\r\n setAiUsedStructures = (obj, task) => {\r\n switch (task) {\r\n // Add a strucuture with an assigend model\r\n case \"add\":\r\n {\r\n let aiStructures = this.state.aiUsedStructures;\r\n if (!aiStructures.filter((e) => e.id === obj.id).length > 0) {\r\n aiStructures.push(obj);\r\n }\r\n this.setMountedState({ aiUsedStructures: aiStructures });\r\n }\r\n break;\r\n\r\n // Remove everything\r\n case \"remove_all\":\r\n this.setMountedState({ aiUsedStructures: [] });\r\n break;\r\n\r\n default:\r\n console.warn(`Invalid task provided to setAiUsedStructures(): ${task}`);\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const {\r\n verticalToolBarWidth,\r\n sideBarWidth,\r\n classRoomChatWidth,\r\n activeTool,\r\n project,\r\n containerKey,\r\n // view layout flags\r\n showGallery,\r\n show3DViewer,\r\n showPointCloud,\r\n showTilesGallery,\r\n showTimeBar,\r\n displayTimeBar,\r\n showZStackBar,\r\n displayZStackBar,\r\n drawLayer,\r\n commentLayers,\r\n landmarkLayers,\r\n opacity,\r\n importProgress,\r\n splitscreenFileIds,\r\n showSplitscreenDropzone,\r\n activeFileId,\r\n omeDict,\r\n minZ,\r\n maxZ,\r\n fullscreenFileIds,\r\n histogramConfig,\r\n showFullscreen,\r\n showOverlay,\r\n showWindowTool,\r\n } = this.state;\r\n\r\n const {\r\n structures,\r\n roiLayers,\r\n //fileRoiLayers,\r\n selectedLayer,\r\n } = this.props.projectContext;\r\n\r\n return (\r\n \r\n {\r\n if (\r\n this.state.viewerConfig.project.projectProperties[\r\n \"EnableSplitscreen\"\r\n ]\r\n )\r\n this.setMountedState({ showSplitscreenDropzone: true });\r\n })\r\n }\r\n onDragLeave={() => {\r\n this.setMountedState({ showSplitscreenDropzone: false });\r\n }}\r\n onDragOver={(e) => e.preventDefault()}\r\n onDrop={(e) => {\r\n if (\r\n this.state.viewerConfig.project.projectProperties[\r\n \"EnableSplitscreen\"\r\n ]\r\n )\r\n this.onDropFile(e);\r\n }}\r\n >\r\n {showSplitscreenDropzone && (\r\n
\r\n Drop file here for split screen.\r\n
\r\n )}\r\n {!showGallery &&\r\n !showTilesGallery &&\r\n !showFullscreen &&\r\n splitscreenFileIds.map((currentFileId, index) => (\r\n 2\r\n ? 4\r\n : splitscreenFileIds.length > 1\r\n ? 6\r\n : 12\r\n }\r\n style={{\r\n border: splitscreenFileIds.length > 1 && \"1px solid\",\r\n position: \"relative\",\r\n background: \"#EBEBEB\",\r\n height:\r\n splitscreenFileIds.length === 4\r\n ? \"50%\"\r\n : splitscreenFileIds.length > 6\r\n ? \"33.333333333%\"\r\n : splitscreenFileIds.length > 3\r\n ? \"50%\"\r\n : \"100%\",\r\n zIndex: currentFileId === activeFileId ? \"0\" : \"1\",\r\n }}\r\n onClick={() => this.setActiveView(index, currentFileId)}\r\n >\r\n -1 && importProgress < 100}\r\n hideBackdrop\r\n style={{ pointerEvents: \"none\" }}\r\n >\r\n \r\n Importing File:
\r\n "\r\n {this.state.project &&\r\n this.state.project.files.find(\r\n (file) => file.id === this.state.activeFileId\r\n ).fileName}\r\n "\r\n
\r\n \r\n \r\n {/* ADD 3D-Viewer-Component!!! */}\r\n {show3DViewer &&\r\n !showGallery &&\r\n !showTilesGallery &&\r\n omeDict[currentFileId] &&\r\n this.zoomObjectDict &&\r\n histogramConfig[currentFileId] && (\r\n \r\n {currentFileId === activeFileId &&\r\n splitscreenFileIds.length > 1 && (\r\n
\r\n )}\r\n {splitscreenFileIds.length > 1 && (\r\n \r\n this.onExcludeSplitscreen(index, e)}\r\n >\r\n \r\n \r\n \r\n )}\r\n {splitscreenFileIds.length > 1 && (\r\n \r\n \r\n this.onChainSplitscreen(index, currentFileId, e)\r\n }\r\n >\r\n {this.chainList[index] ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n {!showGallery &&\r\n !show3DViewer &&\r\n !showTilesGallery &&\r\n omeDict[currentFileId] &&\r\n this.zoomObjectDict &&\r\n histogramConfig[currentFileId] && (\r\n \r\n {currentFileId === activeFileId &&\r\n splitscreenFileIds.length > 1 && (\r\n
\r\n )}\r\n {splitscreenFileIds.length > 1 && (\r\n \r\n this.onExcludeSplitscreen(index, e)}\r\n >\r\n \r\n \r\n \r\n )}\r\n {splitscreenFileIds.length > 1 && (\r\n \r\n \r\n this.onChainSplitscreen(index, currentFileId, e)\r\n }\r\n >\r\n {this.chainList[index] ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n (this.rendererdict[currentFileId] = c)\r\n }\r\n rendererDict={this.rendererdict}\r\n projectConfig={this.state.projectConfig}\r\n ome={omeDict[currentFileId]}\r\n histogramConfig={histogramConfig[currentFileId]}\r\n rois={this.state.rois}\r\n fileId={currentFileId}\r\n activeFileId={activeFileId}\r\n projectId={this.props.id}\r\n activeTool={\r\n currentFileId === activeFileId\r\n ? activeTool\r\n : Tools.NONE\r\n }\r\n onChangeROIs={(e) => this.setMountedState({ rois: e })}\r\n // toggle different dialogs\r\n showGallery={showGallery}\r\n showTilesGallery={showTilesGallery}\r\n displayTimeBar={displayTimeBar}\r\n displayZStackBar={displayZStackBar}\r\n showZStackBar={showZStackBar}\r\n showTimeBar={showTimeBar}\r\n tools={this.tools}\r\n structures={structures}\r\n roiLayers={roiLayers[currentFileId]}\r\n allRoiLayers={roiLayers}\r\n drawLayer={\r\n currentFileId === activeFileId\r\n ? drawLayer\r\n : {\r\n regionRois: [],\r\n inverted: false,\r\n clear: false,\r\n }\r\n }\r\n commentLayer={commentLayers[currentFileId]}\r\n landmarkLayer={landmarkLayers[currentFileId]}\r\n selectedLayer={selectedLayer}\r\n opacity={opacity}\r\n changeHiConfig={this.setHistogramConfig}\r\n updateProject={this.updateProject}\r\n tzoomROI1={this.resetRoiZoomInDict}\r\n zoomROI={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomRoi\r\n : false\r\n }\r\n zoomLeft={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomLeft\r\n : 0\r\n }\r\n zoomRight={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomRight\r\n : 0\r\n }\r\n zoomTop={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomTop\r\n : 0\r\n }\r\n zoomBottom={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomBottom\r\n : 0\r\n }\r\n zoomROI1={this.resetRoiZoom}\r\n setSelectedRoi={this.setSelectedRoi}\r\n setAIObjects={this.setAIObjects}\r\n selRoi={this.state.selRoi}\r\n showGridLabels={this.showGrid()}\r\n viewerConfig={this.state.viewerConfig}\r\n activeTab={this.props.projectContext.activeTab}\r\n onChangeTool={this.onChangeTool}\r\n setChangingFile={\r\n this.props.projectContext.setChangingFile\r\n }\r\n changingFile={this.props.projectContext.changingFile}\r\n project={project}\r\n updateGlobalZ={this.updateGlobalZ}\r\n updateGlobalT={this.updateGlobalT}\r\n timeLineHeight={this.state.timeLineHeight}\r\n resizeTimeLine={this.resizeTimeLine}\r\n loadedAnnotationsCounter={\r\n this.state.loadedAnnotationsCounter\r\n }\r\n frameArrayDict={this.state.frameArrayDict}\r\n projectContext={this.props.projectContext}\r\n setSelectedLayer={this.setSelectedLayer}\r\n showMarks={activeTool === \"landmark\" ? true : false}\r\n landmarkLayers={landmarkLayers}\r\n showFullscreen={showFullscreen}\r\n splitscreenIdx={index}\r\n onChangeChain={this.onChangeChain}\r\n fsChain={this.onToggleFullscreenChain}\r\n resultTabActive={() => this.resultTabActive()}\r\n onSelectFile={this.onSelectFile}\r\n openNextFile={this.openNextFile}\r\n openPrevFile={this.openPrevFile}\r\n />\r\n \r\n )}\r\n \r\n ))}\r\n {!showGallery &&\r\n !showTilesGallery &&\r\n omeDict[activeFileId] &&\r\n this.zoomObjectDict &&\r\n histogramConfig[activeFileId] &&\r\n showFullscreen &&\r\n fullscreenFileIds.map((currentFileId, index) => (\r\n \r\n \r\n (this.rendererdict[\"Full\" + currentFileId] = c)\r\n }\r\n rendererDict={this.rendererdict}\r\n projectConfig={this.state.projectConfig}\r\n ome={omeDict[currentFileId]}\r\n histogramConfig={histogramConfig[currentFileId]}\r\n rois={this.state.rois}\r\n fileId={currentFileId}\r\n activeFileId={activeFileId}\r\n projectId={this.props.id}\r\n activeTool={\r\n currentFileId === activeFileId ? activeTool : Tools.NONE\r\n }\r\n onChangeROIs={(e) => this.setMountedState({ rois: e })}\r\n // toggle different dialogs\r\n showGallery={showGallery}\r\n showTilesGallery={showTilesGallery}\r\n displayTimeBar={displayTimeBar}\r\n displayZStackBar={displayZStackBar}\r\n showZStackBar={showZStackBar}\r\n showTimeBar={showTimeBar}\r\n tools={this.tools}\r\n structures={structures}\r\n roiLayers={roiLayers[currentFileId]}\r\n allRoiLayers={roiLayers}\r\n drawLayer={\r\n currentFileId === activeFileId\r\n ? drawLayer\r\n : {\r\n regionRois: [],\r\n inverted: false,\r\n clear: false,\r\n }\r\n }\r\n commentLayer={commentLayers[currentFileId]}\r\n landmarkLayer={landmarkLayers[currentFileId]}\r\n selectedLayer={selectedLayer}\r\n opacity={opacity}\r\n changeHiConfig={this.setHistogramConfig}\r\n updateProject={this.updateProject}\r\n tzoomROI1={this.resetRoiZoomInDict}\r\n zoomROI={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomRoi\r\n : false\r\n }\r\n zoomLeft={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomLeft\r\n : 0\r\n }\r\n zoomRight={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomRight\r\n : 0\r\n }\r\n zoomTop={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomTop\r\n : 0\r\n }\r\n zoomBottom={\r\n this.zoomObjectDict[currentFileId]\r\n ? this.zoomObjectDict[currentFileId].zoomBottom\r\n : 0\r\n }\r\n zoomROI1={this.resetRoiZoom}\r\n setSelectedRoi={this.setSelectedRoi}\r\n setAIObjects={this.setAIObjects}\r\n selRoi={this.state.selRoi}\r\n showGridLabels={this.showGrid()}\r\n viewerConfig={this.state.viewerConfig}\r\n activeTab={this.props.projectContext.activeTab}\r\n onChangeTool={this.onChangeTool}\r\n setChangingFile={this.props.projectContext.setChangingFile}\r\n changingFile={this.props.projectContext.changingFile}\r\n project={project}\r\n updateGlobalZ={this.updateGlobalZ}\r\n updateGlobalT={this.updateGlobalT}\r\n timeLineHeight={this.state.timeLineHeight}\r\n resizeTimeLine={this.resizeTimeLine}\r\n loadedAnnotationsCounter={this.state.loadedAnnotationsCounter}\r\n frameArrayDict={this.state.frameArrayDict}\r\n showMarks={activeTool === \"landmark\" ? true : false}\r\n landmarkLayers={landmarkLayers}\r\n showFullscreen={showFullscreen}\r\n fullscreenIdx={index}\r\n onChangeChain={this.onChangeChain}\r\n fsChain={this.onToggleFullscreenChain}\r\n showWindowTool={showWindowTool}\r\n windowToolRef={this.windowToolRef}\r\n resultTabActive={() => this.resultTabActive()}\r\n />\r\n \r\n ))}\r\n {!showGallery &&\r\n !showTilesGallery &&\r\n omeDict[activeFileId] &&\r\n this.zoomObjectDict &&\r\n histogramConfig[activeFileId] &&\r\n showFullscreen &&\r\n showOverlay && (\r\n (this.sliderRef = c)}\r\n setOpacity={this.setOpacityChangeFullscreen}\r\n activeFileId={activeFileId}\r\n splitscreenFileIds={splitscreenFileIds}\r\n omeDict={omeDict}\r\n addFile={this.addFileToFullscreen}\r\n setActive={this.setActiveFileFullscreen}\r\n fullscreenFileIds={fullscreenFileIds}\r\n fsChain={this.onToggleFullscreenChain}\r\n isChained={this.state.fullscreenChain}\r\n rendererdict={this.rendererdict}\r\n >\r\n )}\r\n {!showGallery &&\r\n !showTilesGallery &&\r\n omeDict[activeFileId] &&\r\n this.zoomObjectDict &&\r\n histogramConfig[activeFileId] &&\r\n showFullscreen &&\r\n showWindowTool && (\r\n (this.windowToolRef = c)}\r\n activeFileId={activeFileId}\r\n rendererDict={this.rendererdict}\r\n fullscreenFileIds={fullscreenFileIds}\r\n >\r\n )}\r\n {(showGallery || showTilesGallery) && histogramConfig[activeFileId] && (\r\n (this.gallery = c)}\r\n ome={omeDict[activeFileId]}\r\n fileId={activeFileId}\r\n projectId={this.props.id}\r\n structures={structures}\r\n roiLayers={roiLayers[activeFileId]}\r\n selectedLayer={selectedLayer}\r\n visibleImage={this.visibleImage}\r\n coloredImages={this.coloredImages}\r\n histogramConfig={histogramConfig[activeFileId]}\r\n gallery={this.createZoomObjectForRect}\r\n activeTool={activeTool}\r\n tools={this.tools}\r\n visImgs={this.state.visImgs}\r\n selectedObjects={this.selObjects}\r\n drawLayer={drawLayer}\r\n saveChangesGallery={this.saveChangesGallery}\r\n applyDL={this.applyDL}\r\n setApplyModelAfterTraining={this.setApplyModelAfterTraining}\r\n makePredictions={this.applyModelAfterTraining}\r\n selObjs={this.selObjs}\r\n updateCount={this.updateCount}\r\n alruns={this.state.alruns}\r\n setAlruns={this.setAlruns}\r\n graphData={this.graphData}\r\n updateViewer={this.updateViewer}\r\n onGallerychangePage={this.onGallerychangePage}\r\n showZStackBar={\r\n this.props.persistentStorage.load(\r\n \"showZStackBar\" + activeFileId\r\n ) === true ||\r\n this.props.persistentStorage.load(\r\n \"showZStackBar\" + activeFileId\r\n ) === false\r\n ? this.props.persistentStorage.load(\r\n \"showZStackBar\" + activeFileId\r\n )\r\n : false\r\n }\r\n viewerConfig={this.state.viewerConfig}\r\n startAutomaticTraining={this.startAutomaticTraining}\r\n updateStructure={this.state.updateStructure}\r\n trainingWarning={this.trainingWarning}\r\n setFUllyAnnotated={this.setFUllyAnnotated}\r\n setAnnotated={this.setAnnotated}\r\n showGallery={showGallery}\r\n showTilesGallery={showTilesGallery}\r\n project={project}\r\n onSelectLayer={(e) => {\r\n this.props.projectContext.setState({ selectedLayer: e });\r\n }}\r\n globalZ={this.state.z}\r\n updateFileClasses={this.updateFileClasses}\r\n />\r\n )}\r\n \r\n {omeDict[activeFileId] &&\r\n histogramConfig[activeFileId] &&\r\n this.rendererdict[activeFileId] && (\r\n -1 && importProgress < 100}\r\n verticalToolBarWidth={this.state.verticalToolBarWidth}\r\n viewerConfig={this.state.viewerConfig}\r\n structures={structures}\r\n roiLayers={roiLayers[activeFileId]}\r\n // tool selection\r\n activeTool={activeTool}\r\n onChangeTool={this.onChangeTool}\r\n // layer selection\r\n selectedLayer={selectedLayer}\r\n // toggle different dialogs\r\n showGallery={showGallery}\r\n filesGalleryActive={\r\n showGallery &&\r\n this.state.viewerConfig.project.projectStringProperties[\r\n \"ViewerType\"\r\n ] === \"FilesGallery\"\r\n }\r\n onToggleGallery={(e) => {\r\n this.setMountedState({\r\n showGallery: e,\r\n showTilesGallery: false,\r\n });\r\n if (showTilesGallery) {\r\n this.toggleSideBar();\r\n }\r\n if (showGallery) {\r\n this.updateDimensions();\r\n if (this.resultTabActive()) {\r\n this.onChangeTool(\"pointcountingtile\");\r\n }\r\n }\r\n if (this.state.project.type.includes(\"HistoPointCounting\")) {\r\n // make parent to selectedLayer again\r\n let parentIndex = selectedLayer;\r\n if (structures[selectedLayer].classificationSubtype) {\r\n parentIndex = this.getParentIndex(\r\n structures[selectedLayer].parentId\r\n );\r\n }\r\n this.props.projectContext.setState({\r\n selectedLayer: parentIndex,\r\n });\r\n // hide sidebar\r\n this.toggleSideBar();\r\n }\r\n }}\r\n changeToSelectedFile={this.changeToSelectedFile}\r\n showTilesGallery={showTilesGallery}\r\n // show 3D Viewer\r\n show3DViewer={show3DViewer}\r\n onToggle3DViewer={(e) => {\r\n this.toggleSideBar();\r\n this.saveFunction(null, () => {\r\n console.log(\"SaveFunction Callback\");\r\n this.setMountedState({\r\n show3DViewer: e,\r\n showGallery: false,\r\n showTilesGallery: false,\r\n });\r\n });\r\n }}\r\n showPointCloud={showPointCloud}\r\n onToggleMeshView={(e) => {\r\n this.setMountedState({ showPointCloud: e });\r\n }}\r\n onToggleTilesGallery={(e) => {\r\n this.setMountedState({\r\n showTilesGallery: e,\r\n showGallery: false,\r\n });\r\n this.toggleSideBar();\r\n }}\r\n onToggleTimeBar={() => {\r\n this.setMountedState({ showTimeBar: !this.state.showTimeBar });\r\n this.updateDimensions();\r\n }}\r\n onSaveScreenshot={this.onSaveScreenshot}\r\n onZoomOriginal={this.onZoomOriginal}\r\n onZoomOneToN={this.onZoomOneToN}\r\n onZoomFit={this.onZoomFit}\r\n // save project\r\n onSave={this.onSaveClick}\r\n //save gallery images\r\n onSaveGallery={this.onSaveGalleryClick}\r\n alruns={this.state.alruns}\r\n onZoomDelta={this.onZoomDelta}\r\n applyDL={this.applyDL}\r\n tools={this.tools}\r\n fileId={activeFileId}\r\n projectId={this.props.id}\r\n saveChangesGallery={this.saveChangesGallery}\r\n project={this.state.project}\r\n setGalleryTool={this.setGalleryTool}\r\n setAlruns={this.setAlruns}\r\n trainingWarning={this.trainingWarning}\r\n onToggleSideBar={this.toggleSideBar}\r\n resizeSideBar={this.resizeSideBar}\r\n updateToolBarWidth={this.updateToolBarWidth}\r\n ome={omeDict[activeFileId]}\r\n activeTab={this.props.projectContext.activeTab}\r\n splitscreenCount={splitscreenFileIds.length}\r\n displayTimeBar={displayTimeBar}\r\n displayZStackBar={displayZStackBar}\r\n rendererRef={\r\n showFullscreen\r\n ? this.rendererdict[\"Full\" + activeFileId]\r\n : this.rendererdict[activeFileId]\r\n }\r\n onToggleFullscreen={this.onToggleFullscreen}\r\n showFullscreen={showFullscreen}\r\n onToggleOverlay={this.onToggleOverlay}\r\n showOverlay={showOverlay}\r\n onToggleWindowTool={this.onToggleWindowTool}\r\n showWindowTool={showWindowTool}\r\n aiUsedStructures={this.state.aiUsedStructures}\r\n />\r\n )}\r\n {omeDict[activeFileId] && histogramConfig[activeFileId] && (\r\n (this.sidebar = c)}\r\n key={activeFileId}\r\n sideBarWidth={sideBarWidth}\r\n project={project}\r\n alterStructure={this.alterStructure}\r\n structures={structures}\r\n roiLayers={roiLayers[activeFileId]}\r\n // tool selection\r\n activeTool={activeTool}\r\n onChangeTool={this.onChangeTool}\r\n // layer selection\r\n selectedLayer={selectedLayer}\r\n // toggle different dialogs\r\n showGallery={showGallery}\r\n onToggleGallery={(e) => {\r\n this.setMountedState({ showGallery: e, showTilesGallery: false });\r\n if (showTilesGallery) {\r\n this.toggleSideBar();\r\n }\r\n if (showGallery) {\r\n this.updateDimensions();\r\n if (this.resultTabActive()) {\r\n this.onChangeTool(\"pointcountingtile\");\r\n }\r\n }\r\n if (this.state.project.type.includes(\"HistoPointCounting\")) {\r\n // make parent to selectedLayer again\r\n let parentIndex = selectedLayer;\r\n if (structures[selectedLayer].classificationSubtype) {\r\n parentIndex = this.getParentIndex(\r\n structures[selectedLayer].parentId\r\n );\r\n }\r\n this.props.projectContext.setState({\r\n selectedLayer: parentIndex,\r\n });\r\n // hide sidebar\r\n this.toggleSideBar();\r\n }\r\n }}\r\n showTilesGallery={showTilesGallery}\r\n // show 3D Viewer\r\n show3DViewer={show3DViewer}\r\n onToggle3DViewer={(e) => {\r\n this.saveFunction(null, () => {\r\n console.log(\"SaveFunction Callback\");\r\n this.setMountedState({\r\n show3DViewer: e,\r\n showGallery: false,\r\n showTilesGallery: false,\r\n });\r\n });\r\n }}\r\n showPointCloud={showPointCloud}\r\n onToggleMeshView={(e) => {\r\n this.setMountedState({ showPointCloud: e });\r\n }}\r\n onToggleTilesGallery={(e) => {\r\n this.setMountedState({ showTilesGallery: e, showGallery: false });\r\n this.toggleSideBar();\r\n }}\r\n onToggleTimeBar={() => {\r\n this.setMountedState({ showTimeBar: !this.state.showTimeBar });\r\n this.updateDimensions();\r\n }}\r\n onSaveScreenshot={this.onSaveScreenshot}\r\n onZoomOriginal={this.onZoomOriginal}\r\n onZoomOneToN={this.onZoomOneToN}\r\n onZoomFit={this.onZoomFit}\r\n // save project\r\n onSave={this.onSaveClick}\r\n //save gallery images\r\n onSaveGallery={this.onSaveGalleryClick}\r\n alruns={this.state.alruns}\r\n onZoomDelta={this.onZoomDelta}\r\n applyDL={this.applyDL}\r\n tools={this.tools}\r\n fileId={activeFileId}\r\n projectId={this.props.id}\r\n saveChangesGallery={this.saveChangesGallery}\r\n setGalleryTool={this.setGalleryTool}\r\n setAlruns={this.setAlruns}\r\n trainingWarning={this.trainingWarning}\r\n onToggleSideBar={this.toggleSideBar}\r\n resizeSideBar={this.resizeSideBar}\r\n ome={omeDict[activeFileId]}\r\n activeTab={this.props.projectContext.activeTab}\r\n splitscreenCount={splitscreenFileIds.length}\r\n displayTimeBar={displayTimeBar}\r\n displayZStackBar={displayZStackBar}\r\n rendererRef={this.rendererdict[activeFileId]}\r\n onToggleFullscreen={this.onToggleFullscreen}\r\n showFullscreen={showFullscreen}\r\n viewerConfig={this.state.viewerConfig}\r\n splitscreenFileIds={splitscreenFileIds}\r\n onSelectFile={this.onSelectFile}\r\n onExcludeFilesToggle={this.onExcludeFilesToggle}\r\n // meta data\r\n histogramConfig={histogramConfig}\r\n onChangeChannels={(e) => this.histogramChanged(e)}\r\n id={this.props.id}\r\n // roi list\r\n rois={this.state.rois}\r\n onCenterROI={(roi) =>\r\n this.rendererdict[activeFileId].centerROI(roi)\r\n }\r\n onHoverROI={(roi, en) =>\r\n this.rendererdict[activeFileId].hoverROI(roi, en)\r\n }\r\n // tool parameters\r\n tool={this.tools[this.state.activeTool]}\r\n // import export parametersets\r\n onExportParameters={this.onExportParameters}\r\n onImportParameters={this.onImportParameters}\r\n allRoiLayers={roiLayers}\r\n deleteforAllScenes={this.deleteforAllScenes}\r\n updateViewer={this.updateViewer}\r\n onChangeLayers={() => {\r\n if (this._isMounted) this.forceUpdate();\r\n }}\r\n onSelectLayer={(e, callback) => {\r\n this.props.projectContext.setState(\r\n { selectedLayer: e },\r\n callback\r\n );\r\n }}\r\n opacity={opacity}\r\n onChangeOpacity={(e) => this.setMountedState({ opacity: e })}\r\n setSelectedLayer={this.setSelectedLayer}\r\n updateStructureChange={this.updateStructureChange}\r\n setAIFormData={this.setAIFormData}\r\n formDataAICockpit={this.state.formDataAICockpit}\r\n setSideBarWidth={this.setSideBarWidth}\r\n onUpdateDimensions={() => this.updateDimensions()}\r\n showFirstAccordion={this.state.showFirstAccordion}\r\n toggleShowFirstAccordion={this.toggleShowFirstAccordion}\r\n aiUsedStructures={this.state.aiUsedStructures}\r\n setAiUsedStructures={this.setAiUsedStructures}\r\n />\r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nViewer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n persistentStorage: PropTypes.object,\r\n projectContext: PropTypes.object,\r\n id: PropTypes.string,\r\n tiles: PropTypes.object,\r\n projectHistory: PropTypes.object,\r\n spinloader: PropTypes.object,\r\n resultTab: PropTypes.object,\r\n activeFileId: PropTypes.string,\r\n};\r\n\r\nexport default withTiles(\r\n withAllViewerContexts(withResultTab(withStyles(styles)(Viewer)))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n TextField,\r\n MenuItem,\r\n FormControl,\r\n Checkbox,\r\n RadioGroup,\r\n FormControlLabel,\r\n FormLabel,\r\n} from \"@mui/material\";\r\n\r\nconst styles = {\r\n paddingContainer: {\r\n padding: 10,\r\n },\r\n formItem: {\r\n width: \"100%\",\r\n marginBottom: 20,\r\n },\r\n numberInput: {\r\n width: 50,\r\n marginRight: 10,\r\n },\r\n applyButton: {\r\n width: \"100%\",\r\n },\r\n hidden: {\r\n display: \"none\",\r\n },\r\n};\r\n\r\nclass ProteomSettings extends Component {\r\n render() {\r\n const { classes, metaData, projectStringProperties, onChangeMetaData } =\r\n this.props;\r\n if (typeof projectStringProperties === \"undefined\") return
;\r\n return (\r\n
\r\n \r\n onChangeMetaData(\"Channel\", e.target.value)}\r\n value={metaData.Channel}\r\n >\r\n {projectStringProperties.Channel.split(\",\").map((value, index) => (\r\n \r\n {value}\r\n \r\n ))}\r\n \r\n \r\n\r\n \r\n onChangeMetaData(\"Proteome\", e.target.value)}\r\n value={metaData.Proteome}\r\n >\r\n {projectStringProperties.Proteome.split(\",\").map((value, index) => (\r\n \r\n {value}\r\n \r\n ))}\r\n \r\n \r\n\r\n \r\n Epitope type\r\n \r\n \r\n onChangeMetaData(\"Continues\", e.currentTarget.checked)\r\n }\r\n checked={Boolean(metaData.Continues)}\r\n />\r\n }\r\n label=\"Continuous\"\r\n />\r\n \r\n onChangeMetaData(\"Discontinues\", e.currentTarget.checked)\r\n }\r\n checked={Boolean(metaData.Discontinues)}\r\n />\r\n }\r\n label=\"Discontinuous\"\r\n />\r\n \r\n \r\n \r\n Epitope length\r\n
\r\n {\r\n if (e.target.value < metaData.EpitopeLengthMax) {\r\n onChangeMetaData(\"EpitopeLengthMin\", e.target.value);\r\n }\r\n }}\r\n value={metaData.EpitopeLengthMin}\r\n className={classes.numberInput}\r\n />\r\n {\r\n if (e.target.value > metaData.EpitopeLengthMin) {\r\n onChangeMetaData(\"EpitopeLengthMax\", e.target.value);\r\n }\r\n }}\r\n value={metaData.EpitopeLengthMax}\r\n className={classes.numberInput}\r\n />\r\n
\r\n
\r\n \r\n \r\n Minimum score (do not show results with lower score)\r\n \r\n
\r\n onChangeMetaData(\"MinScore\", e.target.value)}\r\n inputProps={{ step: \"0.01\" }}\r\n value={metaData.MinScore}\r\n className={classes.numberInput}\r\n />\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nProteomSettings.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n metaData: PropTypes.object,\r\n projectProperties: PropTypes.object,\r\n projectStringProperties: PropTypes.object,\r\n onChangeMetaData: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(ProteomSettings);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n position: \"relative\",\r\n height: \"100%\",\r\n width: \"100%\",\r\n textAlign: \"center\",\r\n },\r\n view3d: { position: \"relative\", width: \"100%\", height: 456, zIndex: 100000 },\r\n hiddenView3d: {\r\n position: \"absolute\",\r\n width: \"100%\",\r\n height: 456,\r\n visibility: \"hidden\",\r\n },\r\n});\r\n\r\nclass Preview3d extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n shownProteinId: \"\",\r\n };\r\n }\r\n addScript = (src) => {\r\n let script = document.getElementById(src);\r\n if (script === null) {\r\n script = document.createElement(\"script\");\r\n script.id = src;\r\n script.src = src;\r\n script.async = false;\r\n document.head.appendChild(script);\r\n }\r\n\r\n return script;\r\n };\r\n addStyle = (href) => {\r\n let link = document.getElementById(href);\r\n if (link === null) {\r\n link = document.createElement(\"link\");\r\n link.id = href;\r\n link.href = href;\r\n link.rel = \"stylesheet\";\r\n document.head.appendChild(link);\r\n }\r\n };\r\n initPeptide = () => {};\r\n\r\n updateProtein = () => {\r\n if (this.props.selectedRow) {\r\n if (this.state.shownProteinId !== this.props.selectedRow.proteinId) {\r\n this.getUniprotData(this.props.selectedRow, (found) => {\r\n console.log(\"result found:\", found);\r\n });\r\n }\r\n }\r\n };\r\n\r\n componentDidUpdate = () => {\r\n this.updateProtein();\r\n };\r\n\r\n getUniprotData = (selectedRow, callback) => {\r\n let proteinId = selectedRow.proteinId;\r\n let locationMin = selectedRow.location;\r\n let locationMax = selectedRow.location + selectedRow.name.length;\r\n let viewer3D = this;\r\n var xmlhttp = new XMLHttpRequest();\r\n xmlhttp.onreadystatechange = function () {\r\n if (this.readyState === 4 && this.status === 200) {\r\n //myFunction(this);\r\n let xmlDoc = this.responseXML;\r\n //let x = xmlDoc.getElementsByTagName(\"dbReference\");\r\n for (let dbReference of xmlDoc.getElementsByTagName(\"dbReference\")) {\r\n if (dbReference.getAttribute(\"type\") === \"PDB\") {\r\n let viewerId = dbReference.getAttribute(\"id\");\r\n for (let property of dbReference.childNodes) {\r\n if (\r\n property.getAttribute &&\r\n property.getAttribute(\"type\") === \"chains\"\r\n ) {\r\n let chainsArr = property.getAttribute(\"value\").split(\", \");\r\n for (let value of chainsArr) {\r\n let valueArr = value.split(\"=\");\r\n let chain = valueArr[0];\r\n let positionsArr = valueArr[1].split(\"-\");\r\n let minPos = positionsArr[0];\r\n let maxPos = positionsArr[1];\r\n if (locationMin > minPos && locationMax < maxPos) {\r\n viewer3D.openMolecule(\r\n proteinId,\r\n viewerId,\r\n chain,\r\n locationMin,\r\n locationMax\r\n );\r\n callback(true);\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n callback(false);\r\n };\r\n xmlhttp.open(\r\n \"GET\",\r\n \"https://www.uniprot.org/uniprot/\" + proteinId + \".xml\",\r\n true\r\n );\r\n xmlhttp.send();\r\n };\r\n\r\n getLiteMolScope = () => {\r\n if (typeof this.liteMolScope === \"undefined\") {\r\n let element = document.getElementById(\"litemol_1cbs\");\r\n this.liteMolScope = window.angular.element(element).isolateScope();\r\n }\r\n return this.liteMolScope;\r\n };\r\n\r\n openMolecule = (proteinId, moleculeId, chain, locationMin, locationMax) => {\r\n this.setState({ shownProteinId: proteinId });\r\n const liteMolScope = this.getLiteMolScope();\r\n liteMolScope.LiteMolComponent.destroyPlugin();\r\n liteMolScope.LiteMolComponent.createPlugin();\r\n liteMolScope.LiteMolComponent.moleculeId = moleculeId;\r\n liteMolScope.LiteMolComponent.loadMolecule();\r\n //this.liteMolScope.LiteMolComponent.colorChains(\"A\", [255, 0, 0]);\r\n setTimeout(() => {\r\n let sequenceAnnotation =\r\n liteMolScope.LiteMolComponent.loadSequenceAnnotation();\r\n console.log(\"sequenceAnnotation:\", sequenceAnnotation);\r\n liteMolScope.LiteMolComponent.colorChains(\"#nothing#\", [0, 255, 0]);\r\n console.log(\"chain:\", chain);\r\n chain =\r\n chain.split(\"/\").length > 1 ? chain.split(\"/\")[1] : chain.split(\"/\")[0];\r\n let selectionDetails = {\r\n entity_id: \"1\",\r\n struct_asym_id: chain,\r\n start_residue_number: locationMin,\r\n end_residue_number: locationMax,\r\n };\r\n liteMolScope.LiteMolComponent.highlightOn(selectionDetails);\r\n }, 1000);\r\n };\r\n\r\n initLiteMolScope = () => {\r\n console.log(\"initLiteMolScope()\");\r\n //Bootstrapping / Installing the library\r\n window.angular.element(document).ready(() => {\r\n this.litemolelem = document.getElementById(\"litemol_1cbs\");\r\n window.angular.bootstrap(document, [\"pdb.component.library\"]);\r\n });\r\n\r\n //bind to the component scope on window.onload\r\n window.onload = () => {\r\n window.liteMolElement = document.getElementById(\"litemol_1cbs\");\r\n window.liteMolScope = window.angular\r\n .element(window.liteMolElement)\r\n .isolateScope();\r\n };\r\n };\r\n\r\n componentDidMount = () => {\r\n console.log(\"Preview3d componentDidMOunt()\");\r\n this.addStyle(\r\n \"//www.ebi.ac.uk/pdbe/pdb-component-library/v1.0/css/pdb.component.library.min-1.0.0.css\"\r\n );\r\n const angularScript = this.addScript(\r\n \"https://www.ebi.ac.uk/pdbe/pdb-component-library/libs/angular.1.4.7.min.js\"\r\n );\r\n this.addScript(\r\n \"https://www.ebi.ac.uk/pdbe/pdb-component-library/libs/d3.min.js\"\r\n );\r\n this.addScript(\r\n \"https://www.ebi.ac.uk/pdbe/pdb-component-library/v1.0/js/pdb.component.library.min-1.0.0.js\"\r\n );\r\n if (typeof window.angular === \"undefined\") {\r\n angularScript.onload = () => {\r\n this.initLiteMolScope();\r\n };\r\n } else {\r\n let element = document.getElementById(\"litemol_1cbs\");\r\n element.replaceWith(window.liteMolElement);\r\n window.liteMolScope = window.angular.element(element).isolateScope();\r\n }\r\n this.updateProtein();\r\n };\r\n render() {\r\n const { classes } = this.props;\r\n\r\n return (\r\n
\r\n {this.props.selectedRow ? (\r\n \r\n Protein ID: {this.props.selectedRow.proteinId}\r\n \r\n ) : (\r\n \r\n Please select a protein from the results to view its properties\r\n here.\r\n \r\n )}\r\n \r\n \r\n
\r\n {this.props.selectedRow && (\r\n
\r\n \r\n https://www.uniprot.org/uniprot/\r\n {this.props.selectedRow.proteinId}\r\n \r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nPreview3d.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n selectedRow: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(Preview3d);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from '@mui/styles/withStyles';\r\nimport { TextField, Button, Typography, Tabs, Tab } from \"@mui/material\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faCog, faDna } from \"@fortawesome/free-solid-svg-icons\";\r\n\r\nimport ProteomSettings from \"./ProteomSettings\";\r\nimport Preview3d from \"../components/Preview3d\";\r\n\r\nconst styles = {\r\n paddingContainer: {\r\n padding: 10,\r\n },\r\n formItem: {\r\n width: \"100%\",\r\n marginBottom: 20,\r\n },\r\n numberInput: {\r\n width: 50,\r\n marginRight: 10,\r\n },\r\n applyButton: {\r\n width: \"100%\",\r\n },\r\n tab: {\r\n minWidth: 395 / 3,\r\n minHeight: 44,\r\n height: 44,\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n \"& *\": {\r\n display: \"inline-block\",\r\n fontSize: \"16px\",\r\n lineHeight: \"16px\",\r\n },\r\n \"& svg\": {\r\n marginRight: \"5px\",\r\n position: \"relative\",\r\n top: \"4px\",\r\n },\r\n },\r\n};\r\n\r\nclass ProteomeSideBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n activeTab: 0,\r\n };\r\n\r\n window.forceSidebarUpdate = this.forceSidebarUpdate;\r\n }\r\n\r\n // // file handling, if upload need later on\r\n // componentDidMount = () => {\r\n // this.fileInputButton = document.getElementById(\"proteomFileInput\");\r\n // this.fileInputButton.addEventListener(\"change\", this.readSingleFile, false);\r\n // };\r\n\r\n // readSingleFile(e) {\r\n // let file = e.target.files[0];\r\n // if (!file) {\r\n // return;\r\n // }\r\n // let reader = new FileReader();\r\n // reader.onload = function (e) {\r\n // let contents = e.target.result;\r\n // //displayContents(contents);\r\n // let lines = contents.split(\"\\n\");\r\n // let initIdx = 0;\r\n // //important columns:\r\n // // ID => Protein ID (more)\r\n // //\r\n // for (let i = 0; i < lines.length; i++) {\r\n // lines[i] = lines[i].split(\"\\t\");\r\n // if (initIdx === 0 && lines[i].length > 10) {\r\n // initIdx = i;\r\n // }\r\n // }\r\n // let lineTable = lines.splice(initIdx, lines.length);\r\n // console.log(\"lineTable:\", initIdx, lineTable.length, lineTable);\r\n // };\r\n // reader.readAsText(file);\r\n // }\r\n\r\n // openProteomFile = () => {\r\n // this.fileInputButton.click();\r\n // };\r\n\r\n handleTabChange = (event, value) => {\r\n this.setState({ activeTab: value });\r\n };\r\n render() {\r\n const { classes, project } = this.props;\r\n const { activeTab } = this.state;\r\n\r\n return (\r\n
\r\n \r\n }\r\n label=\"View\"\r\n />\r\n }\r\n label=\"Properties\"\r\n />\r\n \r\n {this.state.activeTab === 0 && (\r\n \r\n )}\r\n\r\n {/* */}\r\n {this.state.activeTab === 1 && (\r\n
\r\n \r\n Analysis Properties\r\n \r\n\r\n {project && (\r\n \r\n this.props.changeProjectName(e.target.value)}\r\n className={classes.formItem}\r\n />\r\n {project.files.length > 0 && (\r\n \r\n )}\r\n\r\n \r\n \r\n )}\r\n\r\n \r\n Apply\r\n \r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nProteomeSideBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n selectedRow: PropTypes.object,\r\n onChangeMetaData: PropTypes.func,\r\n changeProjectName: PropTypes.func,\r\n saveAndRunProject: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(ProteomeSideBar);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport TableSortLabel from \"@mui/material/TableSortLabel\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\nimport { ArrowDropDown, ArrowDropUp } from \"@mui/icons-material\";\r\n\r\nconst rows = [\r\n {\r\n id: \"actions\",\r\n numeric: false,\r\n label: \"\",\r\n },\r\n {\r\n id: \"name\",\r\n numeric: false,\r\n label: \"Epitope\",\r\n },\r\n { id: \"score\", numeric: true, label: \"Score\" },\r\n {\r\n id: \"proteinId\",\r\n numeric: true,\r\n label: \"Protein ID\",\r\n },\r\n {\r\n id: \"ProteinName\",\r\n numeric: true,\r\n label: \"Protein name\",\r\n },\r\n { id: \"location\", numeric: true, label: \"Location\" },\r\n { id: \"epitope\", numeric: true, label: \"Epitope\" },\r\n];\r\n\r\nfunction desc(a, b, orderBy) {\r\n if (b[orderBy] < a[orderBy]) {\r\n return -1;\r\n }\r\n if (b[orderBy] > a[orderBy]) {\r\n return 1;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction stableSort(array, cmp) {\r\n const stabilizedThis = array.map((el, index) => [el, index]);\r\n stabilizedThis.sort((a, b) => {\r\n const order = cmp(a[0], b[0]);\r\n if (order !== 0) return order;\r\n return a[1] - b[1];\r\n });\r\n return stabilizedThis.map((el) => el[0]);\r\n}\r\n\r\nfunction getSorting(order, orderBy) {\r\n return order === \"desc\"\r\n ? (a, b) => desc(a, b, orderBy)\r\n : (a, b) => -desc(a, b, orderBy);\r\n}\r\n\r\nclass ProteomResultsHead extends React.Component {\r\n createSortHandler = (property) => (event) => {\r\n this.props.onRequestSort(event, property);\r\n };\r\n\r\n render() {\r\n const { order, orderBy } = this.props;\r\n\r\n return (\r\n \r\n \r\n {rows.map(\r\n (row, idx) => (\r\n \r\n {idx > 0 && idx < 3 ? (\r\n \r\n \r\n {row.label}\r\n \r\n \r\n ) : (\r\n {row.label}\r\n )}\r\n \r\n ),\r\n this\r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nProteomResultsHead.propTypes = {\r\n onRequestSort: PropTypes.func.isRequired,\r\n order: PropTypes.string.isRequired,\r\n orderBy: PropTypes.string.isRequired,\r\n rowCount: PropTypes.number.isRequired,\r\n};\r\n\r\nconst styles = () => ({\r\n root: {\r\n width: \"100%\",\r\n },\r\n table: {\r\n minWidth: 800,\r\n },\r\n tableWrapper: {\r\n overflowX: \"auto\",\r\n },\r\n});\r\n\r\nclass ProteomResults extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.counter = 0;\r\n this.epitopes = {};\r\n let allRows = [];\r\n\r\n this.state = {\r\n order: \"asc\",\r\n orderBy: \"calories\",\r\n selected: [],\r\n data: allRows,\r\n epitopes: this.epitopes,\r\n };\r\n }\r\n\r\n componentDidUpdate = (prevProps) => {\r\n if (\r\n Object.keys(prevProps.annotations).length === 0 &&\r\n Object.keys(this.props.annotations).length > 0\r\n ) {\r\n let allRows = [];\r\n for (const [key, value] of Object.entries(this.props.annotations)) {\r\n let name = key;\r\n //console.log(\"row\", key);\r\n let score = value.score;\r\n let proteinId = \"\";\r\n let proteinName = \"\";\r\n let location = \"\";\r\n let epitope = \"C\";\r\n for (let row of value.proteins) {\r\n proteinId = row.id;\r\n proteinName = row.name;\r\n location = row.content.indexOf(key, 0);\r\n allRows.push(\r\n this.createRow(\r\n name,\r\n score,\r\n proteinId,\r\n proteinName,\r\n location,\r\n epitope\r\n )\r\n );\r\n }\r\n }\r\n this.setState({ data: allRows });\r\n }\r\n };\r\n\r\n createRow(name, score, proteinId, proteinName, location, epitope) {\r\n this.counter += 1;\r\n if (typeof this.epitopes[name] === \"undefined\")\r\n this.epitopes[name] = { score: score, collapsed: true };\r\n return {\r\n id: this.counter,\r\n name,\r\n score,\r\n proteinId,\r\n proteinName,\r\n location,\r\n epitope,\r\n };\r\n }\r\n\r\n handleRequestSort = (event, property) => {\r\n const orderBy = property;\r\n let order = \"desc\";\r\n\r\n if (this.state.orderBy === property && this.state.order === \"desc\") {\r\n order = \"asc\";\r\n }\r\n\r\n this.setState({ order, orderBy });\r\n };\r\n\r\n handleClick = (row) => {\r\n this.setState({ selected: row.id });\r\n this.props.setSelectedRow(row);\r\n };\r\n\r\n handleEpitopeRowClick = (row) => {\r\n let epitopes = this.state.epitopes;\r\n epitopes[row.name].collapsed = !epitopes[row.name].collapsed;\r\n this.setState({ epitopes, selected: null });\r\n this.props.setSelectedRow(null);\r\n };\r\n\r\n isSelected = (id) => this.state.selected === id;\r\n\r\n isCollapsed = (name) => {\r\n if (this.state.epitopes && this.state.epitopes[name]) {\r\n return this.state.epitopes[name].collapsed;\r\n } else {\r\n return true;\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { data, order, orderBy } = this.state;\r\n let tempRow = null;\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n {stableSort(data, getSorting(order, orderBy)).map((n) => {\r\n const isSelected = this.isSelected(n.id);\r\n let epitopeRow = null;\r\n if (tempRow === null || tempRow.name !== n.name) {\r\n epitopeRow = n;\r\n }\r\n tempRow = n;\r\n return (\r\n \r\n {epitopeRow !== null && (\r\n this.handleEpitopeRowClick(n)}\r\n >\r\n \r\n {this.isCollapsed(n.name) ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n {n.name}\r\n \r\n {n.score}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {!this.isCollapsed(n.name) && (\r\n this.handleClick(n)}\r\n aria-checked={isSelected}\r\n tabIndex={-1}\r\n key={uuidv4()}\r\n selected={isSelected}\r\n >\r\n \r\n \r\n \r\n {n.proteinId}\r\n {n.proteinName}\r\n {n.location}\r\n {n.epitope}\r\n \r\n )}\r\n \r\n );\r\n })}\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nProteomResults.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n setSelectedRow: PropTypes.func,\r\n annotations: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(ProteomResults);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { IconButton, Tooltip, SvgIcon } from \"@mui/material\";\r\n\r\nimport { Save } from \"@mui/icons-material\";\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n position: \"relative\",\r\n height: \"100%\",\r\n },\r\n topTools: {\r\n position: \"absolute\",\r\n top: 0,\r\n },\r\n bottomTools: {\r\n position: \"absolute\",\r\n bottom: 0,\r\n },\r\n toolbarButton: {\r\n display: \"inline-block\",\r\n width: 40,\r\n height: 40,\r\n padding: 8,\r\n margin: 0,\r\n },\r\n toolbarButtonChecked: {\r\n width: 40,\r\n color: theme.palette.primary.main,\r\n },\r\n});\r\n\r\nclass ProteomToolBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n if (props.project.state && props.project.state === \"success\") {\r\n let downloadPath = Backend.downloadReport(this.props.project.id);\r\n console.log(\"downloadPath:\", downloadPath);\r\n }\r\n }\r\n\r\n render() {\r\n const { classes, project } = this.props;\r\n\r\n return (\r\n
\r\n
\r\n {project.state && project.state === \"success\" && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nProteomToolBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n onSave: PropTypes.func,\r\n project: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(ProteomToolBar);\r\n","import React, { Component } from \"react\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport ProteomeSideBar from \"./components/ProteomSideBar\";\r\nimport ProteomResults from \"./components/ProteomResults\";\r\nimport ProteomToolBar from \"./components/ProteomToolBar\";\r\nimport Backend from \"../common/utils/Backend\";\r\n\r\nconst styles = {\r\n outerContainer: {\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"calc(100% - 64px)\",\r\n background: \"#EBEBEB\",\r\n //background: \"blue\",\r\n display: \"grid\",\r\n gridTemplateColumns: \"auto 50px 456px\",\r\n },\r\n TableContainer: {\r\n background: \"white\",\r\n marginRight: 5,\r\n overflow: \"auto\",\r\n },\r\n PreviewContainer: {\r\n background: \"white\",\r\n },\r\n ToolBarContainer: {\r\n background: \"white\",\r\n margin: \"0 5px\",\r\n },\r\n SideBarContainer: {\r\n background: \"white\",\r\n },\r\n};\r\n\r\nclass ProteomeViewer extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n selectedRow: null,\r\n project: null,\r\n annotations: {},\r\n nameChanged: false,\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n window.addEventListener(\"keydown\", this.keyDown);\r\n Backend.loadProject(\r\n {\r\n id: this.props.id,\r\n },\r\n (project) => {\r\n if (project.projectData) {\r\n project.metaData = project.projectData.metaData;\r\n project.name = project.projectData.name;\r\n } else {\r\n project.metaData = JSON.parse(project.metaData);\r\n }\r\n window.setNavigationbarTitle(\r\n `${project.name} (${project.viewerConfig.project.label})`\r\n );\r\n this.setState({ project: project });\r\n Backend.loadAnnotationsObject(\r\n { id: project.id, fileId: project.files[0].id },\r\n (result) => {\r\n if (result.annotations) {\r\n this.setState({ annotations: result.annotations });\r\n }\r\n }\r\n );\r\n }\r\n );\r\n Backend.getCurrentUser((user) => {\r\n this.setState({ user: user.fullName });\r\n });\r\n };\r\n\r\n componentWillUnmount() {\r\n window.removeEventListener(\"keydown\", this.keyDown);\r\n }\r\n /**\r\n * handle shortcut\r\n * @param {ActionEvent} e Event when keyboard button is pressed\r\n */\r\n keyDown = (e) => {\r\n if (e.ctrlKey && e.key === \"s\") {\r\n this.saveFunction((result) => console.log(\"saved:\", result));\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n setSelectedRow = (row) => {\r\n this.setState({ selectedRow: row });\r\n };\r\n\r\n createProjectModel = () => {\r\n const { project, user } = this.state;\r\n\r\n const projectModel = {\r\n name: project.name,\r\n user: user,\r\n id: project.id,\r\n readableId: project.readableId,\r\n metaData: project.metaData,\r\n type: project.type,\r\n tools: project.viewerConfig.project.tools,\r\n job: project.viewerConfig.project.job,\r\n files: project.files,\r\n };\r\n console.log(\"projectModel:\", projectModel);\r\n return projectModel;\r\n };\r\n\r\n saveFunction = (callback) => {\r\n if (this.state) {\r\n if (this.state.nameChanged) {\r\n Backend.renameProject(\r\n this.state.project.id,\r\n this.state.project.name,\r\n () => {\r\n console.log(\"project changed!\");\r\n }\r\n );\r\n }\r\n Backend.saveProject(this.createProjectModel(), (data) => {\r\n if (data.success) {\r\n window.showSuccessSnackbar(\"Project saved succesfully!\");\r\n callback(true);\r\n } else {\r\n window.showErrorSnackbar(\"Project couldn't be saved!\");\r\n callback(false);\r\n }\r\n });\r\n }\r\n };\r\n saveAndRunProject = () => {\r\n this.saveFunction((success) => {\r\n if (success) {\r\n Backend.setProjectsPending([this.state.project.id], () => {\r\n this.props.history.push(\"/\");\r\n });\r\n }\r\n });\r\n };\r\n\r\n onChangeMetaData = (field, e) => {\r\n this.setState((prevState) => {\r\n let project = Object.assign({}, prevState.project);\r\n project.metaData[field] = e;\r\n return { project };\r\n });\r\n };\r\n\r\n changeProjectName = (projectName) => {\r\n this.setState((prevState) => {\r\n let project = Object.assign({}, prevState.project);\r\n project.name = projectName;\r\n return { project, nameChanged: true };\r\n });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n {this.state.project && (\r\n \r\n )}\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nProteomeViewer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n id: PropTypes.string,\r\n history: PropTypes.array,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(ProteomeViewer));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nconst SpectraViewerContext = React.createContext();\r\n\r\n/**\r\n * Allow other classes to use the SpectraViewer context with withSpectraViewer().\r\n * @param {*} Component The class using the context.\r\n * @returns The Component wrapped inside the SpectraViewer.\r\n */\r\nexport const withSpectraViewer = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withSpectraViewer(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\nclass SpectraViewerProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n selectedSpectrum: 0,\r\n areas: [],\r\n operationSets: [[[\"scores\", 1]]],\r\n maxScores: 0,\r\n useSavedCalcs: true,\r\n rawSpectra: [], // Permanently save spectra in frontend once loaded\r\n rawSpectraLoaded: false,\r\n pcas: [], // Permanently save pcas in frontend once loaded, only cahnge on update\r\n pcaOrder: \"asc\", // The order in which the PCAs are sorted\r\n selectedPca: null,\r\n selectedPcaId: null,\r\n focusedPca: {\r\n info: null,\r\n scores: null,\r\n approximations: null,\r\n }, // The pca which is currently being focused in analysis. Includes spectra both before and after trimming and preprocessing.\r\n analysisResults: [], // Permanently save results of analysis with focussed pca, only change on update\r\n analysisResultsLoaded: false,\r\n selectedPcaScore: 0,\r\n selectedProcessedSpectrum: 0,\r\n currentlyShownData: null,\r\n ratedSpectra: [],\r\n models: [], // AI Models provided\r\n selectedModelIdx: null,\r\n selectedModelName: null,\r\n passingCriteria: [],\r\n passingCriteria_idx: null,\r\n passingCriteria_min: 0.99,\r\n passingCriteria_max: 1.0,\r\n spectraPredictionSettings: [], // Format: {substance: \"\", concentration: 0.0}\r\n };\r\n }\r\n\r\n /**\r\n * Allows to set state of context from outside the class\r\n * @param {*} object Stateobject to be set.\r\n * @param {function} callback Function to be called after state has been updated.\r\n */\r\n setContextState = (object, callback) => {\r\n this.setState(object, callback);\r\n };\r\n\r\n /**\r\n * Saves all areas to state. Also assigns each sub-area a reference.\r\n * @param {array} areas\r\n */\r\n updateAreas = (areas) => {\r\n this.setState({\r\n areas: areas.map((area) => {\r\n area.refs = [React.createRef(), React.createRef()];\r\n return area;\r\n }),\r\n });\r\n };\r\n\r\n /**\r\n * Toggles the status of useSavedCalcs on or off.\r\n */\r\n toggleSavedCalcs = () => {\r\n this.setState({\r\n useSavedCalcs: !this.state.useSavedCalcs,\r\n });\r\n };\r\n\r\n /**\r\n * Ensure that not too many scores can be chosen.\r\n * Should no spectra be visible, all are used for pca.\r\n */\r\n setMaxScores = () => {\r\n let availableSamples = 0;\r\n availableSamples = this.state.rawSpectra.filter((el) => el.checked).length;\r\n this.setState({\r\n maxScores:\r\n availableSamples === 0\r\n ? this.state.rawSpectra.length - 1\r\n : availableSamples - 1,\r\n });\r\n };\r\n\r\n /**\r\n * Sort the pcas by a value from the result in ascending or descending order\r\n * @param {string} valueToSortBy The key used to sort the pcas\r\n * @param {string} order \"asc\" or \"desc\" for ascending or descending order respectively\r\n */\r\n sortPCAs = (valueToSortBy, order = \"desc\") => {\r\n // Sort PCAs in descending order by R² value\r\n let temp_pcas = this.state.pcas.sort((a, b) => {\r\n return b.result[valueToSortBy] - a.result[valueToSortBy];\r\n });\r\n // Invert array if decending order is wanted\r\n if (order === \"asc\") {\r\n temp_pcas.reverse();\r\n }\r\n // replace with sorted PCAs\r\n this.setState({ pcas: temp_pcas, pcaOrder: order });\r\n };\r\n\r\n render() {\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nSpectraViewerProvider.propTypes = {\r\n children: PropTypes.element,\r\n};\r\n\r\nexport default SpectraViewerProvider;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport {\r\n Button,\r\n IconButton,\r\n ListItem,\r\n ListItemText,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableRow,\r\n Tooltip,\r\n} from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n Cancel,\r\n CheckCircle,\r\n ErrorOutline,\r\n HourglassEmpty,\r\n Timeline,\r\n Visibility,\r\n VisibilityOff,\r\n} from \"@mui/icons-material\";\r\n\r\nimport SketchColorPicker from \"../../../viewer/components/SketchColorPicker\";\r\nimport { withSpectraViewer } from \"../../contexts/SpectraViewerContext\";\r\n\r\nconst TooltipTable = withStyles({\r\n tooltip: {\r\n background: \"#FFFFFF\",\r\n border: \"#EBEBEB solid 2px\",\r\n },\r\n})(Tooltip);\r\n\r\nclass SpectraTab extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n componentDidMount() {\r\n this.props.showRawSpectra();\r\n }\r\n\r\n /**\r\n * Determines which icon to diplay as a status of analysis results.\r\n * @param {Object} spectrum A spectrum for which analysis results can be displayed.\r\n * @returns {Tooltip} Renderable mui icon with mouseover information.\r\n */\r\n statusIcon = (spectrum) => {\r\n // In case of temporary spectra, that will not be analyzed\r\n if (spectrum.isTemporary) {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n // In case of not defined or empty rated spectra\r\n if (\r\n !this.props.spectraViewer.ratedSpectra ||\r\n this.props.spectraViewer.ratedSpectra.length === 0\r\n ) {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n // Attempt to find spectrum in array of rated spectra\r\n let spectrumRating = undefined;\r\n let spectrumWithinTolerances = undefined;\r\n let error = false;\r\n this.props.spectraViewer.ratedSpectra.some((ratedSpectrum) => {\r\n if (ratedSpectrum.id === spectrum.id) {\r\n spectrumWithinTolerances = ratedSpectrum.pass;\r\n spectrumRating = ratedSpectrum.rating;\r\n error = \"Error\" in ratedSpectrum.rating;\r\n return true;\r\n }\r\n return false;\r\n });\r\n // Define when a Spectrum is allowed to pass\r\n if (spectrumRating) {\r\n return (\r\n \r\n \r\n \r\n {Object.entries(spectrumRating).map(([key, value]) => {\r\n return (\r\n \r\n {key}\r\n \r\n {typeof value === \"number\"\r\n ? value < 0.01 && value !== 0\r\n ? value.toExponential(3)\r\n : Number(value).toFixed(6)\r\n : value}\r\n \r\n \r\n );\r\n })}\r\n \r\n
\r\n \r\n }\r\n >\r\n {error ? (\r\n \r\n ) : spectrumWithinTolerances ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n };\r\n\r\n render() {\r\n const { spectraViewer } = this.props;\r\n return (\r\n \r\n {this.props.initialized && (\r\n this.props.toggleAll()}\r\n >\r\n Toggle visibility of all spectra\r\n \r\n )}\r\n {this.props.initialized &&\r\n // List all spectra\r\n this.props.datasets.map((item, idx) => {\r\n return (\r\n \r\n {/* Spectra */}\r\n \r\n this.props.spectraViewer.setState({ selectedSpectrum: idx })\r\n }\r\n >\r\n \r\n \r\n {item.name}\r\n
\r\n }\r\n />\r\n \r\n {this.props.project.type === \"ESREvaluation\" &&\r\n // Statusicon used for pca compliance\r\n this.statusIcon(item)}\r\n {\r\n // Visibility Button\r\n \r\n {\r\n this.props.toggleLegend(item.name);\r\n e.stopPropagation();\r\n }}\r\n size=\"large\"\r\n >\r\n {item.checked ? : }\r\n \r\n \r\n }\r\n {\r\n item.color = newColor;\r\n this.props.updateChartData(this.props.datasets, () => {});\r\n }}\r\n />\r\n \r\n
\r\n );\r\n })}\r\n {this.props.initialized && this.props.project.type !== \"ESREvaluation\" && (\r\n // Option to change spectra settings\r\n this.props.setInitialized(false)}\r\n >\r\n Change Spectra Parameters\r\n \r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nSpectraTab.propTypes = {\r\n spectraViewer: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n datasets: PropTypes.array,\r\n toggleLegend: PropTypes.func,\r\n toggleAll: PropTypes.func,\r\n initialized: PropTypes.bool,\r\n updateChartData: PropTypes.func,\r\n setInitialized: PropTypes.func,\r\n showRawSpectra: PropTypes.func,\r\n onSave: PropTypes.func,\r\n returnHome: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(SpectraTab);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n FormControlLabel,\r\n Checkbox,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Paper,\r\n Input,\r\n Button,\r\n IconButton,\r\n Chip,\r\n} from \"@mui/material\";\r\nimport { Remove, Add, Delete } from \"@mui/icons-material\";\r\n\r\nimport { withSpectraViewer } from \"../../contexts/SpectraViewerContext\";\r\n\r\nconst styles = {\r\n applyButton: {\r\n width: \"100%\",\r\n },\r\n operationSetRow: {\r\n marginBottom: 10,\r\n },\r\n applyContainer: {\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n overflow: \"hidden\",\r\n },\r\n applyMainContent: {\r\n height: \"100%\",\r\n overflow: \"auto\",\r\n borderBottom: \"2px solid #EBEBEB\",\r\n },\r\n operationButton: {\r\n width: \"100%\",\r\n justifyContent: \"left\",\r\n textAligne: \"left\",\r\n textTransform: \"none\",\r\n },\r\n chipIndikation: {\r\n width: 100,\r\n cursor: \"pointer\",\r\n },\r\n chipContainer: {\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n flexWrap: \"wrap\",\r\n listStyle: \"none\",\r\n padding: 5,\r\n margin: 0,\r\n },\r\n chip: {\r\n margin: 5,\r\n },\r\n applyBottomContent: {\r\n borderTop: \"3px solid #EBEBEB\",\r\n padding: 10,\r\n },\r\n};\r\n\r\nconst operations = {\r\n diff: {\r\n name: \"differentiate\",\r\n type: \"int\",\r\n },\r\n int: {\r\n name: \"integrate\",\r\n type: \"int\",\r\n },\r\n // pwr: {\r\n // name: \"powerTransform\",\r\n // type: \"bool\",\r\n // },\r\n minMax: {\r\n name: \"scaleMinMax\",\r\n type: \"bool\",\r\n },\r\n quant: {\r\n name: \"scaleToQuantiles\",\r\n type: \"bool\",\r\n },\r\n std: {\r\n name: \"standardize\",\r\n type: \"bool\",\r\n },\r\n vec: {\r\n name: \"vectorNorm\",\r\n type: \"bool\",\r\n },\r\n scores: {\r\n name: \"maxPCAScores\",\r\n type: \"int\",\r\n },\r\n};\r\n\r\nclass OperationsTab extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n /**\r\n * Updates the areas as they need to be updated when moving the boundaries inside the graph.\r\n * Cannot use since the direct update breaks it.\r\n */\r\n componentDidUpdate = () => {\r\n this.props.spectraViewer.areas.forEach((area) => {\r\n area.refs[0].current.value = area.coordRange[0].toFixed(3);\r\n area.refs[1].current.value = area.coordRange[1].toFixed(3);\r\n });\r\n };\r\n\r\n onAddOperationsSet = () => {\r\n let operationSetsCopy = JSON.parse(\r\n JSON.stringify(this.props.spectraViewer.operationSets)\r\n );\r\n operationSetsCopy.push([[\"scores\", 1]]);\r\n this.props.spectraViewer.setState({ operationSets: operationSetsCopy });\r\n };\r\n\r\n onRemoveOperationSet = (idx) => {\r\n let operationSetsCopy = JSON.parse(\r\n JSON.stringify(this.props.spectraViewer.operationSets)\r\n );\r\n operationSetsCopy.splice(idx, 1);\r\n this.props.spectraViewer.setState({ operationSets: operationSetsCopy });\r\n };\r\n\r\n onAddOperation = (operation) => {\r\n let operationSetsCopy = JSON.parse(\r\n JSON.stringify(this.props.spectraViewer.operationSets)\r\n );\r\n let lastSet = operationSetsCopy[operationSetsCopy.length - 1];\r\n let toAdd = true;\r\n if (lastSet.length > 1) {\r\n // Increment if there already is an incrementable value\r\n if (lastSet[lastSet.length - 2][0] === operation) {\r\n // Only non-bool types are incremented\r\n if (operations[operation].type !== \"bool\") {\r\n lastSet[lastSet.length - 2][1] += 1;\r\n }\r\n toAdd = false;\r\n }\r\n }\r\n // Create new entry\r\n if (toAdd) {\r\n lastSet.splice(lastSet.length - 1, 0, [\r\n operation,\r\n operations[operation].type === \"bool\" ? true : 1,\r\n ]);\r\n }\r\n this.props.spectraViewer.setState({ operationSets: operationSetsCopy });\r\n };\r\n\r\n onChangeChip = (setIdx, idx, value) => {\r\n let operationSetsCopy = JSON.parse(\r\n JSON.stringify(this.props.spectraViewer.operationSets)\r\n );\r\n const key = operationSetsCopy[setIdx][idx][0];\r\n if (value === -1 || operations[key].type === \"int\") {\r\n operationSetsCopy[setIdx][idx][1] += value;\r\n }\r\n if (operationSetsCopy[setIdx][idx][1] <= 0) {\r\n operationSetsCopy[setIdx].splice(idx, 1);\r\n }\r\n if (operationSetsCopy[setIdx].length === 0) {\r\n operationSetsCopy.splice(setIdx, 1);\r\n }\r\n // Update operationsets if still present\r\n if (operationSetsCopy.length > 0) {\r\n this.props.spectraViewer.setState({ operationSets: operationSetsCopy });\r\n }\r\n };\r\n\r\n onApplySettings = () => {\r\n // Check for plausible pca settings\r\n for (\r\n let idx = 0;\r\n idx < this.props.spectraViewer.operationSets.length;\r\n idx++\r\n ) {\r\n // Get scores of opset\r\n let scores = this.props.spectraViewer.operationSets.slice(-1)[0][0][1];\r\n if (scores <= 0) {\r\n this.props.throwError(\r\n \"Please select a minimum of 1 score. Possibly increase selected spectra.\"\r\n );\r\n return;\r\n } else if (scores > this.props.spectraViewer.maxScores) {\r\n this.props.throwError(\r\n `Too many scores. Increase selected spectra or reduce scores to ${this.props.spectraViewer.maxScores}`\r\n );\r\n return;\r\n }\r\n }\r\n\r\n // Calculate the pcas as required\r\n this.props.requestData(\"calculate_pcas\");\r\n // Continue to pca selection tab\r\n if (this.props.project.type === \"ESRTraining\") {\r\n this.props.setActiveTab(2);\r\n }\r\n };\r\n\r\n /**\r\n * Updates the areas in the graph after entering them into the table.\r\n * @param {int} idx The index of the area you're referring to.\r\n * @param {JSON} area The area you're referring to.\r\n */\r\n onEnterArea = (idx, area) => {\r\n let tempAreas = this.props.spectraViewer.areas;\r\n tempAreas[idx].coordRange[0] = parseFloat(area.refs[0].current.value);\r\n tempAreas[idx].coordRange[1] = parseFloat(area.refs[1].current.value);\r\n this.props.spectraViewer.updateAreas(tempAreas);\r\n this.props.chart.dispatchAction({\r\n type: \"brush\",\r\n areas: tempAreas,\r\n });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n return (\r\n
\r\n
\r\n
\r\n {Object.keys(operations).map((short) => {\r\n return (\r\n \r\n {\r\n if (short !== \"scores\") this.onAddOperation(short);\r\n else this.onAddOperationsSet();\r\n }}\r\n >\r\n \r\n \r\n \r\n {operations[short].name}\r\n {short === \"scores\" ? \" (add new operations set)\" : \"\"}\r\n \r\n
\r\n
\r\n );\r\n })}\r\n
    \r\n {this.props.spectraViewer.operationSets.map(\r\n (operationSet, setIdx) => {\r\n return (\r\n
  1. \r\n \r\n {operationSet.map((data, idx) => {\r\n // Make sure that not too many scores are selected, but no fewer than 0\r\n data[1] = Math.max(\r\n 0,\r\n Math.min(\r\n data[1],\r\n this.props.spectraViewer.maxScores\r\n )\r\n );\r\n\r\n const removeIcon = ;\r\n let icon;\r\n\r\n let hideRemove =\r\n data[0] === \"scores\" && data[1] === 1;\r\n let hideAdd =\r\n data[0] === \"scores\" &&\r\n data[1] >= this.props.spectraViewer.maxScores;\r\n\r\n let labelValue = data[0];\r\n if (operations[data[0]].type === \"int\") {\r\n labelValue += \" \" + data[1];\r\n } else {\r\n hideAdd = true;\r\n }\r\n\r\n if (!hideAdd) {\r\n icon = ;\r\n }\r\n\r\n return (\r\n
  2. \r\n {\r\n if (!hideAdd)\r\n this.onChangeChip(setIdx, idx, 1);\r\n }}\r\n onDelete={\r\n hideRemove\r\n ? undefined\r\n : () => this.onChangeChip(setIdx, idx, -1)\r\n }\r\n deleteIcon={removeIcon}\r\n color={\r\n data[0] === \"scores\" ? \"secondary\" : \"primary\"\r\n }\r\n />\r\n
  3. \r\n );\r\n })}\r\n {this.props.spectraViewer.operationSets.length > 1 && (\r\n
  4. \r\n {\r\n this.onRemoveOperationSet(setIdx);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n
  5. \r\n )}\r\n \r\n \r\n );\r\n }\r\n )}\r\n
\r\n {this.props.spectraViewer.areas.length > 0 && (\r\n \r\n \r\n \r\n \r\n \r\n from\r\n to\r\n \r\n \r\n \r\n \r\n {this.props.spectraViewer.areas.map((area, idx) => (\r\n \r\n \r\n {idx}\r\n \r\n \r\n {\r\n this.onEnterArea(idx, area);\r\n }}\r\n onKeyUp={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.onEnterArea(idx, area);\r\n }\r\n }}\r\n inputRef={area.refs[0]}\r\n inputProps={{\r\n \"aria-label\": \"description\",\r\n step: this.props.xAxisData.stepX,\r\n }}\r\n />\r\n \r\n \r\n {\r\n this.onEnterArea(idx, area);\r\n }}\r\n onKeyUp={(e) => {\r\n if (e.key === \"Enter\") {\r\n this.onEnterArea(idx, area);\r\n }\r\n }}\r\n inputRef={area.refs[1]}\r\n inputProps={{\r\n \"aria-label\": \"description\",\r\n step: this.props.xAxisData.stepX,\r\n }}\r\n />\r\n \r\n \r\n {\r\n let tempAreas = this.props.spectraViewer.areas;\r\n this.props.spectraViewer.areas.splice(idx, 1);\r\n this.props.spectraViewer.updateAreas(tempAreas);\r\n this.props.chart.dispatchAction({\r\n type: \"brush\",\r\n areas: tempAreas,\r\n });\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
\r\n
\r\n )}\r\n
\r\n
\r\n {this.props.initialized && (\r\n
\r\n
\r\n {\r\n this.props.spectraViewer.toggleSavedCalcs();\r\n }}\r\n checked={this.props.spectraViewer.useSavedCalcs}\r\n />\r\n }\r\n label=\"Use saved calculations\"\r\n />\r\n {\r\n this.onApplySettings();\r\n }}\r\n >\r\n Apply\r\n \r\n
\r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nOperationsTab.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n requestData: PropTypes.func,\r\n chart: PropTypes.object,\r\n xAxisData: PropTypes.object,\r\n initialized: PropTypes.bool,\r\n setActiveTab: PropTypes.func,\r\n throwError: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(OperationsTab));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport SwapVertIcon from \"@mui/icons-material/SwapVert\";\r\n\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\nimport {\r\n Button,\r\n FormControlLabel,\r\n Grid,\r\n MenuItem,\r\n Radio,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n TextField,\r\n Tooltip,\r\n Typography,\r\n Slider,\r\n Checkbox,\r\n} from \"@mui/material\";\r\n\r\nimport { withSpectraViewer } from \"../../contexts/SpectraViewerContext\";\r\n\r\nconst criteriaLowerBound = 0.0;\r\nconst criteriaUpperBound = 100.0;\r\n\r\nconst xValueRangeMin = 300.0;\r\nconst xValueRangeMax = 400.0;\r\n\r\nconst styles = {\r\n paddingContainer: {\r\n padding: 10,\r\n },\r\n applyButton: {\r\n width: \"100%\",\r\n },\r\n applyContainer: {\r\n display: \"grid\",\r\n overflow: \"hidden\",\r\n },\r\n applyBottomContent: {\r\n borderTop: \"3px solid #EBEBEB\",\r\n padding: 10,\r\n \"& button:first-child\": {\r\n marginBottom: 10,\r\n },\r\n },\r\n selectionContainer: {\r\n overflow: \"auto\",\r\n borderTop: \"2px solid #EBEBEB\",\r\n },\r\n minMaxInput: {\r\n marginTop: 10,\r\n },\r\n};\r\n\r\nconst TooltipTable = withStyles({\r\n tooltip: {\r\n background: \"#FFFFFF\",\r\n border: \"#EBEBEB solid 2px\",\r\n },\r\n})(Tooltip);\r\n\r\nclass ModelTab extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n tabScrollPosition: 0,\r\n scrollContainerHeight: 1000,\r\n };\r\n this.selectionContainerRef = React.createRef();\r\n }\r\n\r\n handleScroll = (e) => {\r\n const element = this.selectionContainerRef.current;\r\n this.setState({\r\n tabScrollPosition: e.target.scrollTop,\r\n scrollContainerHeight: element.clientHeight,\r\n });\r\n };\r\n\r\n /**\r\n * Rendering only visible models/pcas\r\n * @param {int} idx Index of option to check\r\n * @returns {bool} Whether or not the given index is in view\r\n */\r\n isInView = (idx) => {\r\n const pos = 91 + idx * 74; // Pixel offset\r\n return (\r\n pos + 75 >= this.state.tabScrollPosition &&\r\n pos <= this.state.tabScrollPosition + this.state.scrollContainerHeight\r\n );\r\n };\r\n\r\n componentDidMount = () => {\r\n if (this.selectionContainerRef.current) {\r\n this.selectionContainerRef.current.addEventListener(\r\n \"scroll\",\r\n this.handleScroll\r\n );\r\n }\r\n };\r\n\r\n componentWillUnmount = () => {\r\n if (this.selectionContainerRef.current) {\r\n this.selectionContainerRef.current.removeEventListener(\r\n \"scroll\",\r\n this.handleScroll\r\n );\r\n }\r\n };\r\n\r\n /**\r\n * Select a pca. Deselect previously selected pca and/or models.\r\n * @param {Clickenvent} event Clickevent when selecting pca.\r\n * @param {int} idx Index of selected pca in list of pcas.\r\n */\r\n onPCASelection = (event, idx) => {\r\n // Must be adjusted together with backend\r\n const passingCriteria = [\r\n \"r2\",\r\n \"mse\",\r\n \"rmse\",\r\n \"expl_var\",\r\n \"max_err\",\r\n \"mean_abs_err\",\r\n \"mape\",\r\n \"med_abs_err\",\r\n ];\r\n\r\n if (event.target.value) {\r\n this.props.spectraViewer.setState({\r\n selectedPca: idx,\r\n selectedPcaId: this.props.spectraViewer.pcas[idx].id,\r\n selectedModelIdx: null,\r\n selectedModelName: null,\r\n passingCriteria,\r\n passingCriteria_idx: 0,\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Select a model. Deselect previously selected model and/or pcas.\r\n * @param {Clickenvent} event Clickevent when selecting model.\r\n * @param {int} idx Index of selected model in list of models.\r\n */\r\n onModelSelection = (event, idx) => {\r\n const model = this.props.spectraViewer.models[idx];\r\n\r\n // Analysis: Set passing criteria in accordance with selected model\r\n if (\r\n model.versions[model.selectedVersionIdx].modeltype === \"spectra-analysis\"\r\n ) {\r\n let passingCriteria = [];\r\n model.versions[model.selectedVersionIdx].substances?.forEach(\r\n (substance) => {\r\n passingCriteria.push(\r\n substance + \" Probability\", // Must be adjusted together with backend\r\n substance + \" Pred. Concentration\" // Must be adjusted together with backend\r\n );\r\n }\r\n );\r\n if (event.target.value) {\r\n this.props.spectraViewer.setState({\r\n selectedPca: null,\r\n selectedPcaId: null,\r\n selectedModelIdx: idx,\r\n selectedModelName: model.name,\r\n passingCriteria,\r\n passingCriteria_idx: 0,\r\n });\r\n }\r\n }\r\n // Prediction: Set prediction susbtances options\r\n else if (\r\n model.versions[model.selectedVersionIdx].modeltype === \"spectra-predict\"\r\n ) {\r\n const oldSettings = this.props.spectraViewer.spectraPredictionSettings;\r\n let spectraPredictionSettings = model.versions[\r\n model.selectedVersionIdx\r\n ].substances.map((substance) => {\r\n const foundIdx = oldSettings.findIndex(\r\n (setting) => setting.substance === substance\r\n );\r\n return foundIdx >= 0\r\n ? {\r\n substance: substance,\r\n concentration: oldSettings[foundIdx].concentration,\r\n }\r\n : { substance: substance, concentration: 0.0 };\r\n });\r\n if (event.target.value) {\r\n this.props.spectraViewer.setState({\r\n selectedPca: null,\r\n selectedPcaId: null,\r\n selectedModelIdx: idx,\r\n selectedModelName: model.name,\r\n passingCriteria: [],\r\n passingCriteria_idx: null,\r\n spectraPredictionSettings,\r\n });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Begin PCA analysis for the selected spectrum adn PCA model\r\n */\r\n onPcaAnalysis = () => {\r\n if (\r\n this.props.spectraViewer.rawSpectra[\r\n this.props.spectraViewer.selectedSpectrum\r\n ].isTemporary\r\n ) {\r\n window.showWarningSnackbar(\r\n `Action not possible with temporary spectrum \"${\r\n this.props.spectraViewer.rawSpectra[\r\n this.props.spectraViewer.selectedSpectrum\r\n ].name\r\n }\"`\r\n );\r\n return;\r\n }\r\n this.props.requestData(\"true_approx_scores\");\r\n this.props.project.type === \"ESRTraining\" && this.props.setActiveTab(3);\r\n this.props.project.type === \"ESREvaluation\" && this.props.setActiveTab(2);\r\n };\r\n\r\n /**\r\n * Predict spectrum for the given settings\r\n */\r\n onPredictSpectrum = () => {\r\n this.props.requestData(\"predict_spectrum\");\r\n this.props.setActiveTab(0);\r\n };\r\n\r\n /**\r\n * Generate table with pca\r\n * @param {JSON} pca PCA object\r\n * @param {int} idx Index of the pca in the pca list\r\n * @returns interactive table with pcas\r\n */\r\n pcaStats = (pca, idx) => {\r\n return (\r\n \r\n \r\n {this.isInView(idx) && (\r\n \r\n {/* Substances used for PCA */}\r\n \r\n Substances\r\n \r\n {pca.substances\r\n .reduce((result, substance) => {\r\n return `${result}${substance.name}, `;\r\n }, \"\")\r\n .slice(0, -2)}\r\n \r\n \r\n {/* Operations used for PCA */}\r\n \r\n Preprocessing\r\n \r\n {/* More than the simple scores */}\r\n {pca.preprocessing.length === 1\r\n ? \"none\"\r\n : pca.preprocessing\r\n .slice(0, pca.preprocessing.length - 1)\r\n .reduce((result, operation) => {\r\n return `${result}${operation[0]}: ${operation[1]}, `;\r\n }, \"\")\r\n .slice(0, -2)}\r\n \r\n \r\n \r\n Scores\r\n {pca.used_scores}\r\n \r\n {/* Areas */}\r\n \r\n Areas\r\n \r\n {pca.areas.length !== 0\r\n ? pca.areas\r\n .reduce((result, area) => {\r\n return `${result}[${Number(area[0]).toFixed(\r\n 2\r\n )}, ${Number(area[1]).toFixed(2)}], `;\r\n }, \"\")\r\n .slice(0, -2)\r\n : \"full\"}\r\n \r\n \r\n {/* No. of Features used for PCA */}\r\n \r\n No. of Features\r\n {pca.features}\r\n \r\n {/* Results of PCA */}\r\n {Object.entries(pca.result).map(([key, value]) => {\r\n return (\r\n \r\n {key}\r\n {Number(value).toFixed(6)}\r\n \r\n );\r\n })}\r\n \r\n )}\r\n
\r\n \r\n }\r\n >\r\n this.onPCASelection(e, idx)}>\r\n {this.isInView(idx) ? (\r\n \r\n \r\n {/* Radio Button */}\r\n \r\n }\r\n label=\"\"\r\n >\r\n \r\n \r\n {/* Substances */}\r\n {pca.substances\r\n .reduce((result, substance) => {\r\n return `${result} ${substance.name},`;\r\n }, \"\")\r\n .slice(0, -1)}\r\n \r\n \r\n {/* R^2 Value */}\r\n {Number(pca.result.r2).toFixed(6)}\r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n };\r\n\r\n /**\r\n * Generate table with models\r\n * @param {JSON} mode Model object\r\n * @param {int} idx Index of the model in the model list\r\n * @returns interactive table with model\r\n */\r\n modelStats = (model, idx) => {\r\n return (\r\n \r\n \r\n \r\n {/* Substances used for PCA */}\r\n \r\n Substances\r\n \r\n {model.versions[model.selectedVersionIdx].substances?.join(\r\n \", \"\r\n )}\r\n \r\n \r\n {/* Time created */}\r\n \r\n Creation time\r\n \r\n {model.versions[model.selectedVersionIdx].datetime}\r\n \r\n \r\n \r\n
\r\n \r\n }\r\n >\r\n this.onModelSelection(e, idx)}>\r\n \r\n {/* Radio Button */}\r\n \r\n }\r\n label=\"\"\r\n >\r\n \r\n \r\n {/* Substances */}\r\n {model.versions[model.selectedVersionIdx].substances?.join(\", \")}\r\n \r\n \r\n {/* Version */}\r\n {model.versions.length > 1 ? (\r\n // Version-selection dropdown\r\n {\r\n // Update selected version in models\r\n let models = this.props.spectraViewer.models;\r\n models[idx].selectedVersionIdx = models[\r\n idx\r\n ].versions.findIndex(\r\n (version) => version.label === event.target.value\r\n );\r\n this.props.spectraViewer.setState({\r\n models,\r\n });\r\n this.onModelSelection(event, idx);\r\n }}\r\n >\r\n {model.versions.map((version, idx) => (\r\n \r\n {version.label}\r\n \r\n ))}\r\n \r\n ) : (\r\n model.versions[model.selectedVersionIdx].label\r\n )}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n /**\r\n * Save the new upper and lower limits for selection criteria.\r\n * Will not go under the lower and over the upper bound set above (Usually 0 and 1).\r\n * @param {Array} newValue The new upper and lower limits to set for the criteria as array [min, max].\r\n */\r\n handleChangeCriteriaLimits = (newValue) => {\r\n this.props.spectraViewer.setState({\r\n passingCriteria_min: Math.max(Math.min(...newValue), criteriaLowerBound),\r\n passingCriteria_max: Math.min(Math.max(...newValue), criteriaUpperBound),\r\n });\r\n };\r\n\r\n /**\r\n * Set substances to predict and their respective concentrations.\r\n * @param {String} substance Name of the substance\r\n * @param {Number} concentration Concentration as a value between 0 and 100%\r\n */\r\n handleChangePredictionSettings = (substance, concentration) => {\r\n let { spectraPredictionSettings } = this.props.spectraViewer;\r\n\r\n // Limit concentration to allowed values\r\n concentration = Math.max(\r\n Math.min(concentration, criteriaUpperBound),\r\n criteriaLowerBound\r\n );\r\n\r\n // Check if value already exists, if found, update it, otherwise add it\r\n const foundIdx = spectraPredictionSettings.findIndex(\r\n (setting) => setting.substance === substance\r\n );\r\n if (foundIdx >= 0) {\r\n spectraPredictionSettings[foundIdx].concentration = concentration;\r\n } else {\r\n spectraPredictionSettings.push({\r\n substance: substance,\r\n concentration: concentration,\r\n });\r\n }\r\n\r\n // Update settings\r\n this.props.spectraViewer.setState({ spectraPredictionSettings });\r\n };\r\n\r\n /**\r\n * Set min and max values for the x-values range if user wants to set this manually\r\n * @param {Array} xValueMinMax Array with the minimum and maximum x-value\r\n */\r\n handleChangeManualXRange = (xValueMinMax) => {\r\n // Update settings\r\n this.props.spectraViewer.setState({ xValueMinMax });\r\n };\r\n\r\n /**\r\n * Component of passing criteria settings, moved out fo render for visibility\r\n * @returns Passing criteria settings element, wrapped in
\r\n */\r\n passingCriteriaSettings = () => {\r\n const { classes, spectraViewer } = this.props;\r\n return (\r\n // Set pass/fail parameters for spectra\r\n
\r\n Passing Criteria\r\n {/* Criteria selection | Limit Entry */}\r\n \r\n \r\n {\r\n let targetIndex = spectraViewer.passingCriteria.findIndex(\r\n (criterium) => criterium === event.target.value\r\n );\r\n this.props.spectraViewer.setState({\r\n passingCriteria_idx: targetIndex,\r\n });\r\n }}\r\n fullWidth={true}\r\n style={{ minWidth: 150 }}\r\n >\r\n {spectraViewer.passingCriteria.map((criterium) => (\r\n \r\n {criterium}\r\n \r\n ))}\r\n \r\n \r\n \r\n {/* Minimum selection */}\r\n \r\n this.handleChangeCriteriaLimits([\r\n Number(event.target.value),\r\n spectraViewer.passingCriteria_max,\r\n ])\r\n }\r\n fullWidth={true}\r\n inputProps={{\r\n min: criteriaLowerBound,\r\n max: criteriaUpperBound,\r\n type: \"number\",\r\n step: 1e-1,\r\n }}\r\n />\r\n \r\n\r\n \r\n \r\n this.handleChangeCriteriaLimits([\r\n spectraViewer.passingCriteria_min,\r\n Number(event.target.value),\r\n ])\r\n }\r\n fullWidth={true}\r\n inputProps={{\r\n min: criteriaLowerBound,\r\n max: criteriaUpperBound,\r\n type: \"number\",\r\n step: 1e-1,\r\n }}\r\n />\r\n \r\n \r\n
\r\n );\r\n };\r\n\r\n /**\r\n * Component containing predition entry settings\r\n * @returns spectra prediction element, wrapped in
\r\n */\r\n spectraPreditionSettings = () => {\r\n const { classes, spectraViewer } = this.props;\r\n // const model = spectraViewer.models[spectraViewer.selectedModelIdx];\r\n const model = spectraViewer.models[0]; // TODO: Change to line above\r\n const modelVersion = model?.versions[model.selectedVersionIdx];\r\n return (\r\n \r\n Prediction Settings\r\n \r\n {modelVersion?.substances.map((substance) => {\r\n return (\r\n \r\n {\r\n this.handleChangePredictionSettings(\r\n substance,\r\n Number(e.target.value)\r\n );\r\n }}\r\n value={\r\n spectraViewer.spectraPredictionSettings.find(\r\n (setting) => setting.substance === substance\r\n )?.concentration ?? 0.0\r\n }\r\n >\r\n \r\n );\r\n })}\r\n \r\n {spectraViewer.selectedPca == null &&\r\n spectraViewer.passingCriteria_idx === null &&\r\n spectraViewer.selectedModelIdx !== null && (\r\n {\r\n spectraViewer.setState({\r\n setXRangeManually: e.target.checked,\r\n });\r\n }}\r\n />\r\n }\r\n label={\"set x-value range manually\"}\r\n />\r\n )}\r\n\r\n {spectraViewer.setXRangeManually && (\r\n \r\n \r\n \r\n \r\n \r\n {\r\n this.handleChangeManualXRange(e.target.value);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n };\r\n\r\n render() {\r\n const { classes, spectraViewer } = this.props;\r\n return (\r\n \r\n \r\n PCA Selection\r\n {spectraViewer.pcas?.length !== 0 ? (\r\n \r\n \r\n \r\n \r\n #\r\n Substances\r\n \r\n \r\n this.props.spectraViewer.sortPCAs(\r\n \"r2\",\r\n spectraViewer.pcaOrder === \"asc\" ? \"desc\" : \"asc\"\r\n )\r\n }\r\n >\r\n R²\r\n \r\n \r\n \r\n \r\n {spectraViewer.pcas.map((pca, idx) => {\r\n return this.pcaStats(pca, idx);\r\n })}\r\n \r\n
\r\n
\r\n ) : (\r\n <>\r\n No PCAs found!\r\n \r\n Please use the "ESR Training" module to train PCAs\r\n with known spectra before validating further unknown ones.\r\n \r\n \r\n )}\r\n
\r\n {this.props.project.type === \"ESREvaluation\" && (\r\n \r\n Model Selection\r\n {spectraViewer.models?.length !== 0 ? (\r\n \r\n \r\n \r\n \r\n #\r\n Substances\r\n Version\r\n \r\n \r\n \r\n {spectraViewer.models.map((model, idx) => {\r\n return this.modelStats(model, idx);\r\n })}\r\n \r\n
\r\n
\r\n ) : (\r\n <>\r\n No AI models found!\r\n \r\n Please import AI models before validating further unknown\r\n ones.\r\n \r\n \r\n )}\r\n \r\n )}\r\n {this.props.initialized &&\r\n this.props.project.type === \"ESREvaluation\" &&\r\n // PCA or analysis model selected\r\n (spectraViewer.selectedPca !== null ? (\r\n this.passingCriteriaSettings()\r\n ) : // AI model selected\r\n spectraViewer.selectedModelIdx !== null ? (\r\n spectraViewer.passingCriteria_idx === null ? (\r\n // Prediction Model\r\n this.spectraPreditionSettings()\r\n ) : (\r\n // Analysis model\r\n this.passingCriteriaSettings()\r\n )\r\n ) : (\r\n // Nothing or something else selected\r\n
\r\n ))}\r\n {(this.props.initialized ||\r\n this.props.project.type === \"ESREvaluation\") && (\r\n
\r\n {\r\n // PCA selected\r\n if (spectraViewer.selectedPca !== null) {\r\n this.onPcaAnalysis();\r\n }\r\n // Predcition model selected\r\n else if (\r\n spectraViewer.passingCriteria_idx === null &&\r\n spectraViewer.selectedModelIdx !== null\r\n ) {\r\n this.onPredictSpectrum();\r\n }\r\n }}\r\n >\r\n {\r\n // PCA selected\r\n spectraViewer.selectedPca !== null\r\n ? \"Analyse Selected Spectrum with Selected PCA\"\r\n : // Predcition model selected\r\n spectraViewer.passingCriteria_idx === null &&\r\n spectraViewer.selectedModelIdx !== null\r\n ? \"Predict Spectrum\"\r\n : // Nothing or something else selected\r\n \"Please select a PCA or prediction model\"\r\n }\r\n \r\n {\r\n this.props.onSave();\r\n if (this.props.project.type === \"ESREvaluation\") {\r\n // Check whether to use PCAs or AI models\r\n if (spectraViewer.selectedPca !== null) {\r\n this.props.requestData(\"pca_evaluation\");\r\n } else if (\r\n spectraViewer.selectedModelIdx !== null &&\r\n spectraViewer.passingCriteria_idx !== null\r\n ) {\r\n // Analysis ai model\r\n this.props.requestData(\"ai_evaluation\");\r\n }\r\n this.props.setActiveTab(0);\r\n } else if (this.props.project.type === \"ESRTraining\") {\r\n this.props.requestData(\"pca_chosen\");\r\n // Return to home screen\r\n this.props.returnHome();\r\n }\r\n }}\r\n >\r\n Select\r\n \r\n
\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nModelTab.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n initialized: PropTypes.bool,\r\n onSave: PropTypes.func,\r\n requestData: PropTypes.func,\r\n setActiveTab: PropTypes.func,\r\n returnHome: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(ModelTab));\r\n","import React, { Component } from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\n\r\nimport {\r\n ListItem,\r\n IconButton,\r\n ListItemText,\r\n Tooltip,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { VisibilityOff, Visibility } from \"@mui/icons-material\";\r\n\r\nimport { withSpectraViewer } from \"../../contexts/SpectraViewerContext\";\r\n\r\nclass AnalysisTab extends Component {\r\n graph_names = [`Original`, `Preprocessed`, `Approximated`, `Residual`];\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n componentDidMount() {\r\n this.props.showAnalysisResults();\r\n }\r\n\r\n /**\r\n * The button to display for each item, indicating its visibility.\r\n * @param {boolean} checked Whether the item is checked.\r\n * @param {Function} func The function to execute with func(name, checked) upon button press.\r\n * @param {string} name The name of the dataseries the visibility refers to.\r\n * @param {Object} iconOn The icon to diplay when series is visible.\r\n * @param {Object} iconOff The icon to diplay when series is hidden.\r\n * @returns\r\n */\r\n visbilityButton = (checked, func, name, iconOn, iconOff) => {\r\n return (\r\n \r\n {\r\n func(name, checked);\r\n e.stopPropagation();\r\n }}\r\n size=\"large\"\r\n >\r\n {checked ? iconOn : iconOff}\r\n \r\n \r\n );\r\n };\r\n\r\n onApproxToggleVisibility = (name, checked) => {\r\n // Enables/Disables all series belonging to a single approximation\r\n this.props.datasets\r\n .filter((element) => this.graph_names.includes(element.name))\r\n .forEach((element) => {\r\n // On initial load, the spectra are set to undefined\r\n if (element.checked === checked || element.checked === undefined) {\r\n this.props.toggleLegend(element.name);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Checks if a series calles by name is currently visible.\r\n * @param {string} name The name of the dataseries in the spectrum.\r\n * @returns {boolean} Is the series checked, i.e. currently visible?\r\n */\r\n checkForChecked = (name) => {\r\n let element = this.props.datasets.filter((element) =>\r\n element.name.startsWith(name)\r\n )[0];\r\n return element ? element.checked : false;\r\n };\r\n\r\n /**\r\n * Checks if any item of a group is checked.\r\n * @param {object} item Group of series referring to a single starting spectrum. Include original, preprocessed, approximation, residual.\r\n * @returns {boolean} Are any of the above checked?\r\n */\r\n checkForAnyChecked = (item) => {\r\n let checked = false;\r\n this.props.datasets\r\n .filter((element) => this.graph_names.includes(element.name))\r\n .forEach((element) => {\r\n if (element.checked) {\r\n checked = true;\r\n }\r\n });\r\n\r\n item.checked = checked;\r\n return checked;\r\n };\r\n\r\n render() {\r\n return this.props.spectraViewer.selectedPca !== null &&\r\n this.props.spectraViewer.focusedPca.info !== null ? (\r\n
\r\n {/* Spectrum Analysis Information */}\r\n {this.props.spectraViewer.selectedPca !== null &&\r\n this.props.spectraViewer.focusedPca.approximations.map(\r\n (approximation, idx) => {\r\n let orig = `Original`;\r\n let pre = `Preprocessed`;\r\n let approx = `Approximated`;\r\n let resid = `Residual`;\r\n return (\r\n \r\n \r\n this.props.spectraViewer.setState({\r\n selectedProcessedSpectrum: idx,\r\n })\r\n }\r\n >\r\n \r\n \r\n {approximation.name}\r\n
\r\n }\r\n />\r\n \r\n {/* Full visibility toggle */}\r\n {this.visbilityButton(\r\n this.checkForAnyChecked(approximation),\r\n this.onApproxToggleVisibility,\r\n approximation.name,\r\n ,\r\n \r\n )}\r\n {/* Original Spectrum Visibility */}\r\n {this.visbilityButton(\r\n this.checkForChecked(orig),\r\n this.props.toggleLegend,\r\n orig,\r\n ,\r\n \r\n )}\r\n {/* Preprocessed Spectra Visibility */}\r\n {this.visbilityButton(\r\n this.checkForChecked(pre),\r\n this.props.toggleLegend,\r\n pre,\r\n ,\r\n \r\n )}\r\n {/* Approximated Spectra visibility */}\r\n {this.visbilityButton(\r\n this.checkForChecked(approx),\r\n this.props.toggleLegend,\r\n approx,\r\n ,\r\n \r\n )}\r\n {/* Residual Spectra visibilty */}\r\n {this.visbilityButton(\r\n this.checkForChecked(resid),\r\n this.props.toggleLegend,\r\n resid,\r\n ,\r\n \r\n )}\r\n \r\n
\r\n );\r\n }\r\n )}\r\n {/* PCA Analysis Information */}\r\n {this.props.spectraViewer.focusedPca.scores.map((score, idx) => {\r\n return (\r\n \r\n \r\n this.props.spectraViewer.setState({ selectedPcaScore: idx })\r\n }\r\n >\r\n \r\n \r\n {score.name}\r\n \r\n }\r\n />\r\n \r\n {this.visbilityButton(\r\n this.checkForChecked(score.name),\r\n this.props.toggleLegend,\r\n score.name,\r\n ,\r\n \r\n )}\r\n \r\n \r\n );\r\n })}\r\n \r\n ) : (\r\n
\r\n Please select a PCA\r\n \r\n Please select a PCA.Choose a PCA from the PCA-Tab and press the\r\n analyse button at the bottom of the tab. The spectrum selected in the\r\n spectra tab will then be analysed using the respective pca.\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nAnalysisTab.propTypes = {\r\n spectraViewer: PropTypes.object.isRequired,\r\n datasets: PropTypes.array,\r\n toggleLegend: PropTypes.func,\r\n showRawSpectra: PropTypes.func,\r\n showAnalysisResults: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(AnalysisTab);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { withSpectraViewer } from \"../contexts/SpectraViewerContext\";\r\n\r\nimport { Redirect } from \"react-router-dom\";\r\nimport { Tabs, Tab } from \"@mui/material\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport {\r\n faCog,\r\n faChartArea,\r\n faChartLine,\r\n faCheckCircle,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\n\r\nimport SpectraTab from \"./SpectraSidebarTabs/SpectraTab\";\r\nimport OperationsTab from \"./SpectraSidebarTabs/OperationsTab\";\r\nimport ModelTab from \"./SpectraSidebarTabs/ModelTab\";\r\nimport AnalysisTab from \"./SpectraSidebarTabs/AnalysisTab\";\r\n\r\nconst styles = {\r\n root: {\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n overflow: \"hidden\",\r\n },\r\n tab: {\r\n minWidth: 395 / 3,\r\n minHeight: 44,\r\n height: 44,\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n \"& *\": {\r\n display: \"inline-block\",\r\n fontSize: \"16px\",\r\n lineHeight: \"16px\",\r\n },\r\n \"& svg\": {\r\n marginRight: \"5px\",\r\n position: \"relative\",\r\n top: \"4px\",\r\n },\r\n },\r\n};\r\n\r\nclass SpectraSideBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n activeTab: 0,\r\n returnHome: false,\r\n };\r\n }\r\n handleTabChange = (event, value) => {\r\n this.setState({ activeTab: value });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { activeTab } = this.state;\r\n\r\n return this.props.project.type === \"ESRTraining\" ? (\r\n // ESR Training Module\r\n
\r\n {/* Return to homescreen by rendering the following line */}\r\n {this.state.returnHome && }\r\n \r\n }\r\n label={\r\n \"Spectra (\" + this.props.spectraViewer.rawSpectra.length + \")\"\r\n }\r\n />\r\n }\r\n label=\"Settings\"\r\n />\r\n }\r\n label=\"Models\"\r\n />\r\n }\r\n label=\"Analysis\"\r\n />\r\n \r\n {this.state.activeTab === 0 && (\r\n this.setState({ returnHome: true })}\r\n />\r\n )}\r\n {this.state.activeTab === 1 && (\r\n this.setState({ activeTab: tab_no })}\r\n throwError={this.props.throwError}\r\n />\r\n )}\r\n {this.state.activeTab === 2 && (\r\n this.setState({ activeTab: value })}\r\n returnHome={() => this.setState({ returnHome: true })}\r\n />\r\n )}\r\n {this.state.activeTab === 3 && (\r\n \r\n )}\r\n
\r\n ) : (\r\n // ESR Evaluation Module\r\n
\r\n {/* Return to homescreen by rendering the following line */}\r\n {this.state.returnHome && }\r\n \r\n }\r\n label={\r\n \"Spectra (\" + this.props.spectraViewer.rawSpectra.length + \")\"\r\n }\r\n />\r\n }\r\n label=\"Models\"\r\n />\r\n }\r\n label=\"Analysis\"\r\n />\r\n \r\n {this.state.activeTab === 0 && (\r\n this.setState({ returnHome: true })}\r\n />\r\n )}\r\n {this.state.activeTab === 1 && (\r\n this.setState({ activeTab: value })}\r\n returnHome={() => this.setState({ returnHome: true })}\r\n />\r\n )}\r\n {this.state.activeTab === 2 && (\r\n \r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nSpectraSideBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n xAxisData: PropTypes.object,\r\n chart: PropTypes.object,\r\n datasets: PropTypes.array,\r\n initialized: PropTypes.bool,\r\n setInitialized: PropTypes.func,\r\n maxScores: PropTypes.number,\r\n toggleLegend: PropTypes.func,\r\n toggleAll: PropTypes.func,\r\n onChangeMetaData: PropTypes.func,\r\n requestData: PropTypes.func,\r\n onSave: PropTypes.func,\r\n showRawSpectra: PropTypes.func,\r\n showAnalysisResults: PropTypes.func,\r\n throwError: PropTypes.func,\r\n updateChartData: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(SpectraSideBar));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport * as echarts from \"echarts\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n position: \"relative\",\r\n height: \"100%\",\r\n },\r\n topContainer: {\r\n height: \"100%\",\r\n width: \"100%\",\r\n overflow: \"hidden\",\r\n },\r\n toolBarBorder: {\r\n position: \"absolute\",\r\n top: 0,\r\n right: 40,\r\n height: \"100%\",\r\n width: 3,\r\n background: \"#EBEBEB\",\r\n },\r\n});\r\n\r\nclass ELineChart extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n chartRef: React.createRef(),\r\n };\r\n }\r\n\r\n updateDimensions = () => {\r\n if (this.props.chart) this.props.chart.resize();\r\n };\r\n\r\n componentDidMount = async () => {\r\n await this.initChart();\r\n switch (this.props.mainChartDataShown) {\r\n case \"raw_spectra\":\r\n this.props.showRawSpectra();\r\n break;\r\n\r\n case \"analysis_results\":\r\n this.props.showAnalysisResults();\r\n break;\r\n\r\n default:\r\n this.props.requestData(\"init\");\r\n }\r\n };\r\n\r\n initChart = async () => {\r\n let chartDom = this.state.chartRef.current;\r\n //prevent context menu (right click) => so delete can be used\r\n chartDom.addEventListener(\"contextmenu\", (event) => {\r\n event.preventDefault();\r\n });\r\n\r\n let myChart = echarts.init(chartDom, { renderer: \"svg\" });\r\n this.props.setChart(myChart);\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nELineChart.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object.isRequired,\r\n chart: PropTypes.object,\r\n setChart: PropTypes.func,\r\n onSave: PropTypes.func,\r\n requestData: PropTypes.func,\r\n showRawSpectra: PropTypes.func,\r\n showAnalysisResults: PropTypes.func,\r\n mainChartDataShown: PropTypes.string,\r\n};\r\n\r\nexport default withStyles(styles)(ELineChart);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport * as echarts from \"echarts\";\r\nimport ecStat from \"echarts-stat\";\r\nimport { Select, MenuItem, InputLabel, FormControl } from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { withSpectraViewer } from \"../contexts/SpectraViewerContext\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n position: \"relative\",\r\n height: \"100%\",\r\n width: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n },\r\n chartObject: {\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n margin: {\r\n textAlign: \"center\",\r\n margin: \"10px 30px 0\",\r\n },\r\n});\r\n\r\nclass ResultChart extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.chartRef = React.createRef();\r\n this.state = {\r\n chartType: props.initChartType,\r\n };\r\n }\r\n\r\n updateDimensions = () => {\r\n if (this.resultChart) this.resultChart.resize();\r\n };\r\n\r\n componentDidUpdate = () => {\r\n this.updateDimensions();\r\n };\r\n\r\n componentDidMount = () => {\r\n this.initChart();\r\n };\r\n\r\n initChart = () => {\r\n let chartDom = this.chartRef.current;\r\n echarts.registerTransform(ecStat.transform.regression);\r\n\r\n this.resultChart = echarts.init(chartDom);\r\n\r\n this.setOption(this.state.chartType);\r\n };\r\n\r\n setOption = (chartType) => {\r\n if (this.resultChart) {\r\n this.resultChart.clear();\r\n }\r\n // ToDo\r\n // // Group PCAs with same areas and preprocessing\r\n // let pcas = this.props.spectrumViewer.pcas;\r\n // let pcaGroups = [];\r\n\r\n // pcas.forEach((pca) => {\r\n // // Find all similar pcas\r\n // let pcaGroup = pcas.filter((element) => {\r\n // if (\r\n // element.areas === pca.areas &&\r\n // element.preprocessing === pca.preprocessing\r\n // ) {\r\n // return element;\r\n // }\r\n // });\r\n // pcaGroups.push(pcaGroup);\r\n // // Remove from overall array\r\n // pcaGroup.forEach((pcaGroupElement) =>\r\n // pcas.splice(\r\n // pcas.findIndex((pcaElement) => pcaElement.id === pcaGroupElement.id),\r\n // 1\r\n // )\r\n // );\r\n // });\r\n\r\n // console.log(\"PcaGroups\", pcaGroups);\r\n\r\n let data = [];\r\n let xAxisLabel = \"Actual\";\r\n let yAxisLabel = \"Prediction\";\r\n\r\n switch (chartType) {\r\n case \"rmsecvScore\":\r\n xAxisLabel = \"Score\";\r\n yAxisLabel = \"RMSECV\";\r\n data = this.props.spectraViewer.pcas.map((item) => {\r\n return {\r\n value: [item.used_scores, item.result.rmse],\r\n };\r\n });\r\n break;\r\n\r\n case \"r2Score\":\r\n xAxisLabel = \"Score\";\r\n yAxisLabel = \"R²\";\r\n data = this.props.spectraViewer.pcas.map((item) => {\r\n return {\r\n value: [item.used_scores, item.result.r2],\r\n };\r\n });\r\n break;\r\n\r\n case \"predTrue\":\r\n data = this.props.spectraViewer.rawSpectra.map((serie, idx) => {\r\n return {\r\n itemStyle: {\r\n color: this.props.datasets[idx].color,\r\n },\r\n value: [\r\n serie.meta.substances[0].concentration,\r\n serie.meta.substances[0].predictedConcentration,\r\n ],\r\n };\r\n });\r\n break;\r\n\r\n case \"diffTrue\":\r\n data = this.props.spectraViewer.rawSpectra.map((series, idx) => {\r\n return {\r\n name: this.props.datasets[idx].name,\r\n itemStyle: {\r\n color: this.props.datasets[idx].color,\r\n },\r\n value: [\r\n series.meta.substances[0].concentration,\r\n series.meta.substances[0].concentration -\r\n series.meta.substances[0].predictedConcentration,\r\n ],\r\n };\r\n });\r\n break;\r\n\r\n default:\r\n // Empty Chart\r\n xAxisLabel = \"\";\r\n yAxisLabel = \"\";\r\n data = [];\r\n }\r\n\r\n let series = [\r\n {\r\n name: \"Markers\",\r\n type: \"line\",\r\n data: data,\r\n },\r\n ];\r\n let labels = [\"Markers\"];\r\n\r\n // Reference lines in certain charts\r\n if (chartType === \"predTrue\" || chartType === \"diffTrue\") {\r\n labels.push(\"Line\");\r\n let lineData = this.props.spectraViewer.rawSpectra.map((serie) => {\r\n if (chartType === \"diffTrue\") {\r\n return [serie.meta.substances[0].concentration, 0];\r\n } else {\r\n return [\r\n serie.meta.substances[0].concentration,\r\n serie.meta.substances[0].concentration,\r\n ];\r\n }\r\n });\r\n lineData.unshift([0, 0]);\r\n series.push({\r\n name: \"Line\",\r\n type: \"line\",\r\n data: lineData,\r\n });\r\n }\r\n\r\n let option = {\r\n legend: {\r\n data: labels,\r\n left: \"center\",\r\n bottom: 10,\r\n },\r\n grid: {\r\n top: 40,\r\n left: 60,\r\n right: 80,\r\n },\r\n tooltip: {\r\n trigger: \"axis\",\r\n axisPointer: {\r\n type: \"cross\",\r\n },\r\n },\r\n xAxis: {\r\n name: xAxisLabel,\r\n },\r\n yAxis: {\r\n type: \"value\",\r\n name: yAxisLabel,\r\n min: \"dataMin\",\r\n max: \"dataMax\",\r\n axisLabel: {\r\n show: true,\r\n interval: 1e-3,\r\n showMinLabel: false,\r\n showMaxLabel: false,\r\n },\r\n },\r\n series: series,\r\n };\r\n\r\n option && this.resultChart.setOption(option);\r\n };\r\n\r\n handleChange = (e) => {\r\n this.setState({ chartType: e.target.value }, () => {\r\n this.setOption(this.state.chartType);\r\n });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n
\r\n \r\n Chart Type\r\n this.handleChange(e)}\r\n //input={}\r\n >\r\n {this.props.chartTypes.map((chartType, idx) => {\r\n return (\r\n \r\n {chartType.name}\r\n \r\n );\r\n })}\r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nResultChart.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n initChartType: PropTypes.string,\r\n chartTypes: PropTypes.array,\r\n datasets: PropTypes.array,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(ResultChart));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { Fab, Grid, IconButton } from \"@mui/material\";\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport RemoveCircleIcon from \"@mui/icons-material/RemoveCircle\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport ResultChart from \"./ResultChart\";\r\nimport { withSpectraViewer } from \"../contexts/SpectraViewerContext\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n position: \"relative\",\r\n height: \"100%\",\r\n overflow: \"hidden\",\r\n },\r\n fab: {\r\n position: \"absolute\",\r\n bottom: theme.spacing(2),\r\n right: theme.spacing(2),\r\n },\r\n excludeButton: {\r\n position: \"absolute\",\r\n top: 0,\r\n right: 0,\r\n color: \"#666\",\r\n },\r\n});\r\n\r\nconst CHARTTYPES = [\r\n { value: \"rmsecvScore\", name: \"RMSECV vs Score\" },\r\n { value: \"r2Score\", name: \"R² vs Score\" },\r\n { value: \"predTrue\", name: \"Prediction vs. True value\" },\r\n { value: \"diffTrue\", name: \"Difference vs. True value\" },\r\n];\r\n\r\nclass SpectraResultCharts extends Component {\r\n componentDidMount = () => {\r\n this.props.setCurrentlyShownData(\"result_chart\");\r\n // Should none be present so far, preselect the first graph\r\n if (this.props.resultChartTypes.length === 0) {\r\n this.handleClickOpen();\r\n }\r\n };\r\n\r\n handleClickOpen = () => {\r\n let value = CHARTTYPES[this.props.resultChartTypes.length % 4].value;\r\n this.props.onUpdateResultChartTypes([\r\n ...this.props.resultChartTypes,\r\n value,\r\n ]);\r\n };\r\n\r\n onRemoveChart = (index) => {\r\n this.props.onUpdateResultChartTypes(\r\n this.props.resultChartTypes.filter((elem, idx) => idx !== index)\r\n );\r\n };\r\n\r\n render() {\r\n const { classes, resultChartTypes } = this.props;\r\n return (\r\n
\r\n \r\n {resultChartTypes.map((initChartType, index) => (\r\n 2\r\n ? 4\r\n : resultChartTypes.length > 1\r\n ? 6\r\n : 12\r\n }\r\n style={{\r\n border: resultChartTypes.length > 1 && \"1px solid\",\r\n position: \"relative\",\r\n background: \"#EBEBEB\",\r\n height:\r\n resultChartTypes.length === 4\r\n ? \"50%\"\r\n : resultChartTypes.length > 6\r\n ? \"33.333333333%\"\r\n : resultChartTypes.length > 3\r\n ? \"50%\"\r\n : \"100%\",\r\n }}\r\n >\r\n \r\n this.onRemoveChart(index)}\r\n >\r\n \r\n \r\n \r\n ))}\r\n \r\n\r\n {resultChartTypes.length < 9 && (\r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nSpectraResultCharts.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n resultChartTypes: PropTypes.array,\r\n datasets: PropTypes.array,\r\n onUpdateResultChartTypes: PropTypes.func,\r\n setCurrentlyShownData: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(SpectraResultCharts));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Paper,\r\n Input,\r\n Button,\r\n} from \"@mui/material\";\r\n\r\nimport { withSpectraViewer } from \"../contexts/SpectraViewerContext\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n position: \"relative\",\r\n height: \"100%\",\r\n overflow: \"auto\",\r\n },\r\n paperContainer: {\r\n margin: 10,\r\n },\r\n table: {},\r\n applyButton: {\r\n margin: 10,\r\n width: \"calc(100% - 20px)\",\r\n },\r\n});\r\n\r\nclass FileParamForm extends Component {\r\n /**\r\n * Updates the input fields of the file parameters.\r\n * @param {int} index Position of spectrum in array of spectra.\r\n * @param {string} paramName Key of value to edit.\r\n * @param {string} value New value.\r\n */\r\n onFileParamChange = (index, paramName, value) => {\r\n let fileParams = this.props.fileParams.map((fileParam, idx) => {\r\n if (idx === index) {\r\n fileParam = JSON.parse(JSON.stringify(fileParam));\r\n fileParam[paramName] = value\r\n .trim()\r\n .split(\";\")\r\n .map((e) => e.trim());\r\n return fileParam;\r\n } else {\r\n return fileParam;\r\n }\r\n });\r\n\r\n this.props.spectraViewer.setState({ useSavedCalcs: false });\r\n this.props.onUpdateFileParams(fileParams);\r\n };\r\n\r\n /**\r\n * Validate input data, save project and continue to main window.\r\n * @returns {} Stay in screen on unvalidated input data\r\n */\r\n onApply = () => {\r\n let error = false;\r\n let fileParams = this.props.fileParams.map((fp) => {\r\n // Clean up input\r\n if (typeof fp.subName === \"string\") {\r\n fp.subName = fp.subName\r\n .trim()\r\n .split(\";\")\r\n .map((e) => e.trim());\r\n }\r\n if (typeof fp.subName === \"string\") {\r\n fp.concentration = fp.concentration\r\n .trim()\r\n .split(\";\")\r\n .map((e) => e.trim());\r\n }\r\n\r\n // Remove empty entries\r\n fp.subName = fp.subName.filter((e) => e === 0 || e);\r\n fp.concentration = fp.concentration.filter((e) => e === 0 || e);\r\n\r\n // Each substance must have exactly one concentration\r\n if (fp.subName.length !== fp.concentration.length) {\r\n error = true;\r\n window.showErrorSnackbar(\r\n fp.fileName + \": Mismatch of substance and concentration count.\"\r\n );\r\n // Highlight errorneous entries\r\n fp.error = error;\r\n return fp;\r\n }\r\n\r\n // All spectra must have an assigend name\r\n if (!fp.subName || fp.subName.length === 0) {\r\n error = true;\r\n // Highlight errorneous entries\r\n fp.error = error;\r\n window.showErrorSnackbar(fp.fileName + \": missing substance name.\");\r\n return fp;\r\n }\r\n\r\n // All spectra must have an assigend concentration for each substance\r\n let concentrationsOk = true;\r\n fp.concentration = fp.concentration.map((concentr) => {\r\n // Allow for 0.0 and 0,0 input values\r\n let tmp = isNaN(concentr)\r\n ? parseFloat(concentr.replace(\",\", \".\").replace(\" \", \"\"))\r\n : concentr;\r\n\r\n if (isNaN(tmp)) {\r\n concentrationsOk = false;\r\n window.showErrorSnackbar(\r\n `${fp.fileName}: Invalid input value, concentration \"${concentr}\" must be a number between 0 and 100.`\r\n );\r\n return concentr;\r\n }\r\n concentr = tmp;\r\n\r\n if (concentr < 0 || concentr > 100) {\r\n concentrationsOk = false;\r\n window.showErrorSnackbar(\r\n `${fp.fileName}: Concentration must be between 0 and 100 %, was ${concentr}.`\r\n );\r\n return concentr;\r\n }\r\n\r\n return concentr;\r\n });\r\n if (!concentrationsOk) {\r\n error = true;\r\n fp.error = error;\r\n return fp;\r\n }\r\n // Passed all tests\r\n fp.error = false;\r\n return fp;\r\n });\r\n\r\n this.props.onUpdateFileParams(fileParams);\r\n if (error) {\r\n return;\r\n }\r\n\r\n this.props.save();\r\n this.props.setInitialized(true);\r\n };\r\n\r\n render() {\r\n const { classes, fileParams } = this.props;\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n File\r\n \r\n Substance Name
Multiple semicolon-separated entries\r\n possible\r\n
\r\n \r\n Concentration (%)\r\n
Multiple semicolon-separated entries possible\r\n
\r\n
\r\n
\r\n \r\n {fileParams.map((fileParam, idx) => (\r\n \r\n \r\n {fileParam.fileName}\r\n \r\n \r\n {\r\n this.onFileParamChange(\r\n idx,\r\n \"subName\",\r\n e.target.value\r\n );\r\n }}\r\n error={fileParam.error}\r\n />\r\n \r\n \r\n {\r\n this.onFileParamChange(\r\n idx,\r\n \"concentration\",\r\n e.target.value\r\n );\r\n }}\r\n error={fileParam.error}\r\n />\r\n \r\n \r\n ))}\r\n \r\n
\r\n this.onApply()}\r\n >\r\n Apply\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nFileParamForm.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n fileParams: PropTypes.array,\r\n onUpdateFileParams: PropTypes.func,\r\n setInitialized: PropTypes.func,\r\n save: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(FileParamForm));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { IconButton, Tooltip, SvgIcon } from \"@mui/material\";\r\nimport { Save } from \"@mui/icons-material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n background: \"white\",\r\n borderRight: \"5px solid #EBEBEB\",\r\n height: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n },\r\n toolbarButton: {\r\n width: 40,\r\n },\r\n toolbarButtonChecked: {\r\n width: 40,\r\n color: theme.palette.primary.main,\r\n },\r\n});\r\n\r\n// Only the bottom tools, top tools are part of the chart\r\nclass SpectraToolBar extends Component {\r\n render() {\r\n const { classes, showResultTable } = this.props;\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nSpectraToolBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n showResultTable: PropTypes.bool,\r\n onSave: PropTypes.func,\r\n toggleLeftTableContainer: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(SpectraToolBar);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { List, ListItem, ListItemText, Typography } from \"@mui/material\";\r\n\r\nimport { withSpectraViewer } from \"../contexts/SpectraViewerContext\";\r\n\r\nconst styles = {\r\n root: {\r\n height: \"100%\",\r\n overflow: \"auto\",\r\n opacity: 0.8,\r\n backgroundColor: \"#000000\",\r\n color: \"#ffffff\",\r\n },\r\n mainContent: {\r\n overflow: \"auto\",\r\n },\r\n};\r\n\r\nclass SpectraLeftTableResults extends Component {\r\n render() {\r\n const { classes } = this.props;\r\n const { rawSpectra } = this.props.spectraViewer;\r\n return (\r\n
\r\n
\r\n {rawSpectra && rawSpectra.length > 0 && (\r\n \r\n \r\n \r\n Value\r\n \r\n {Object.keys(\r\n rawSpectra[this.props.spectraViewer.selectedSpectrum].meta\r\n .measurement\r\n ).map((key, idx) => {\r\n const value =\r\n rawSpectra[this.props.spectraViewer.selectedSpectrum].meta\r\n .measurement[key];\r\n return (\r\n \r\n \r\n \r\n {value.toString()}\r\n \r\n \r\n );\r\n })}\r\n \r\n )}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nSpectraLeftTableResults.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n leftTableWidth: PropTypes.number,\r\n setParentState: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(SpectraLeftTableResults));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from '@mui/styles/withStyles';\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport TableSortLabel from \"@mui/material/TableSortLabel\";\r\n\r\nfunction descendingComparator(a, b, orderBy) {\r\n if (b[orderBy] < a[orderBy]) {\r\n return -1;\r\n }\r\n if (b[orderBy] > a[orderBy]) {\r\n return 1;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction getComparator(order, orderBy) {\r\n return order === \"desc\"\r\n ? (a, b) => descendingComparator(a, b, orderBy)\r\n : (a, b) => -descendingComparator(a, b, orderBy);\r\n}\r\n\r\nfunction stableSort(array, comparator) {\r\n const stabilizedThis = array.map((el, index) => [el, index]);\r\n stabilizedThis.sort((a, b) => {\r\n const order = comparator(a[0], b[0]);\r\n if (order !== 0) return order;\r\n return a[1] - b[1];\r\n });\r\n return stabilizedThis.map((el) => el[0]);\r\n}\r\n\r\nfunction EnhancedTableHead(props) {\r\n const { classes, order, orderBy, onRequestSort, headCells } = props;\r\n const createSortHandler = (property) => (event) => {\r\n onRequestSort(event, property);\r\n };\r\n\r\n return (\r\n \r\n \r\n {headCells.map((headCell) => (\r\n \r\n \r\n {headCell.label}\r\n {orderBy === headCell.id ? (\r\n \r\n {order === \"desc\" ? \"sorted descending\" : \"sorted ascending\"}\r\n \r\n ) : null}\r\n \r\n \r\n ))}\r\n \r\n \r\n );\r\n}\r\n\r\nEnhancedTableHead.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n onRequestSort: PropTypes.func.isRequired,\r\n order: PropTypes.oneOf([\"asc\", \"desc\"]).isRequired,\r\n orderBy: PropTypes.string.isRequired,\r\n rowCount: PropTypes.number.isRequired,\r\n headCells: PropTypes.array.isRequired,\r\n};\r\n\r\nconst styles = {\r\n root: {\r\n width: \"100%\",\r\n },\r\n table: {\r\n minWidth: 750,\r\n \"& *\": {\r\n color: \"white !important\",\r\n background: \"#333333\",\r\n },\r\n },\r\n visuallyHidden: {\r\n border: 0,\r\n clip: \"rect(0 0 0 0)\",\r\n height: 1,\r\n margin: -1,\r\n overflow: \"hidden\",\r\n padding: 0,\r\n position: \"absolute\",\r\n top: 20,\r\n width: 1,\r\n },\r\n};\r\n\r\nclass CustomResultTable extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n order: \"asc\",\r\n orderBy: \"calories\",\r\n };\r\n }\r\n render() {\r\n const { classes, rows, headCells } = this.props;\r\n const { order, orderBy } = this.state;\r\n\r\n const handleRequestSort = (event, property) => {\r\n const isAsc = orderBy === property && order === \"asc\";\r\n this.setState({\r\n order: isAsc ? \"desc\" : \"asc\",\r\n orderBy: property,\r\n });\r\n };\r\n\r\n const dense = false;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n {stableSort(rows, getComparator(order, orderBy)).map(\r\n (row, index) => {\r\n return (\r\n \r\n {headCells.map((headCell, i) => {\r\n return (\r\n {row[headCell.id]}\r\n );\r\n })}\r\n \r\n );\r\n }\r\n )}\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nCustomResultTable.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n headCells: PropTypes.array,\r\n rows: PropTypes.array,\r\n tableHeight: PropTypes.number,\r\n};\r\n\r\nexport default withStyles(styles)(CustomResultTable);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport CustomResultTable from \"./CustomResultTable\";\r\n\r\nimport { withSpectraViewer } from \"../contexts/SpectraViewerContext\";\r\n\r\nconst styles = {\r\n root: {\r\n height: \"100%\",\r\n width: \"100%\",\r\n overflow: \"hidden\",\r\n backgroundColor: \"#333333\",\r\n color: \"#ffffff\",\r\n },\r\n mainContent: {\r\n overflow: \"hidden\",\r\n height: \"100%\",\r\n },\r\n};\r\n\r\nconst headCells = [\r\n { id: \"rmse\", numeric: true, disablePadding: true, label: \"RMSECV\" },\r\n { id: \"r2\", numeric: true, disablePadding: false, label: \"R²\" },\r\n { id: \"scores\", numeric: true, disablePadding: false, label: \"Scores\" },\r\n { id: \"areas\", numeric: false, disablePadding: false, label: \"Areas\" },\r\n { id: \"settings\", numeric: false, disablePadding: false, label: \"Settings\" },\r\n];\r\n\r\nclass SpectraBottomTableResults extends Component {\r\n render() {\r\n const { classes } = this.props;\r\n const rows = this.props.spectraViewer.pcas.map((result) => {\r\n return {\r\n r2: result.result.r2,\r\n rmse: result.result.rmse,\r\n scores: result.used_scores,\r\n areas: result.areas.toString(),\r\n settings: result.preprocessing.toString(),\r\n };\r\n });\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nSpectraBottomTableResults.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n tableHeight: PropTypes.number,\r\n setParentState: PropTypes.func,\r\n};\r\n\r\nexport default withSpectraViewer(withStyles(styles)(SpectraBottomTableResults));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n// define the component's styling\r\nconst styles = () => ({\r\n resizesBorder: {\r\n height: \"100%\",\r\n width: \"100%\",\r\n cursor: \"col-resize\",\r\n },\r\n //invisible over whole screen, so mouse is always tracked\r\n overlayBorder: {\r\n position: \"fixed\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n zIndex: 9999999,\r\n cursor: \"col-resize\",\r\n },\r\n});\r\n\r\nclass LocalVerticalResizeBorder extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n resizeMode: false,\r\n borderWidth: 8,\r\n newWidth: props.targetWidth,\r\n };\r\n }\r\n\r\n handleMouseDown = (e) => {\r\n this.setState({ resizeMode: true, lastPageX: e.pageX, initPageX: e.pageX });\r\n };\r\n handleMouseMove = (e) => {\r\n e.preventDefault();\r\n if (this.state.resizeMode) {\r\n let deltaX = this.state.lastPageX - e.pageX;\r\n deltaX = this.props.leftBorder ? deltaX : -deltaX;\r\n let newWidth = this.state.newWidth + deltaX;\r\n if (newWidth > this.props.min) {\r\n this.props.resizeWidth(newWidth);\r\n } else if (this.props.targetWidth > this.props.min) {\r\n this.props.resizeWidth(this.props.min);\r\n }\r\n this.setState({ lastPageX: e.pageX, newWidth });\r\n }\r\n };\r\n handleMouseEnd = () => {\r\n if (this.state.resizeMode) {\r\n this.setState({ resizeMode: false });\r\n this.props.resizeWidth(this.props.targetWidth);\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n //const { borderWidth } = this.state;\r\n return (\r\n this.handleMouseDown(e)}\r\n onMouseMove={(e) => this.handleMouseMove(e)}\r\n onMouseLeave={(e) => this.handleMouseEnd(e)}\r\n onMouseUp={(e) => this.handleMouseEnd(e)}\r\n >
\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nLocalVerticalResizeBorder.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n min: PropTypes.number,\r\n targetWidth: PropTypes.number,\r\n leftBorder: PropTypes.bool,\r\n resizeWidth: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(LocalVerticalResizeBorder);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n// define the component's styling\r\nconst styles = () => ({\r\n resizesBorder: {\r\n height: \"100%\",\r\n width: \"100%\",\r\n cursor: \"row-resize\",\r\n },\r\n //invisible over whole screen, so mouse is always tracked\r\n overlayBorder: {\r\n position: \"fixed\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n zIndex: 9999999,\r\n cursor: \"row-resize\",\r\n },\r\n});\r\n\r\nclass LocalHorizontalResizeBorder extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n resizeMode: false,\r\n borderHeight: 8,\r\n newHeight: props.targetHeight,\r\n };\r\n }\r\n\r\n handleMouseDown = (e) => {\r\n this.setState({ resizeMode: true, lastPageY: e.pageY, initPageY: e.pageY });\r\n };\r\n handleMouseMove = (e) => {\r\n e.preventDefault();\r\n if (this.state.resizeMode) {\r\n let deltaY = this.state.lastPageY - e.pageY;\r\n deltaY = !this.props.bottomBorder ? deltaY : -deltaY;\r\n let newHeight = this.state.newHeight + deltaY;\r\n if (newHeight > this.props.min) {\r\n this.props.resizeHeight(newHeight);\r\n } else if (this.props.targetHeight > this.props.min) {\r\n this.props.resizeHeight(this.props.min);\r\n }\r\n this.setState({ lastPageY: e.pageY, newHeight });\r\n }\r\n };\r\n handleMouseEnd = () => {\r\n if (this.state.resizeMode) {\r\n this.setState({ resizeMode: false });\r\n this.props.resizeHeight(this.props.targetHeight);\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n this.handleMouseDown(e)}\r\n onMouseMove={(e) => this.handleMouseMove(e)}\r\n onMouseLeave={(e) => this.handleMouseEnd(e)}\r\n onMouseUp={(e) => this.handleMouseEnd(e)}\r\n >
\r\n );\r\n }\r\n}\r\n\r\n// define the component's interface\r\nLocalHorizontalResizeBorder.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n min: PropTypes.number,\r\n targetHeight: PropTypes.number,\r\n bottomBorder: PropTypes.bool,\r\n resizeHeight: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(LocalHorizontalResizeBorder);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport SpectraSideBar from \"./components/SpectraSideBar\";\r\nimport ELineChart from \"./components/ELineChart\";\r\nimport SpectraResultCharts from \"./components/SpectraResultCharts\";\r\nimport FileParamForm from \"./components/FileParamForm\";\r\n\r\nimport { Tabs, Tab } from \"@mui/material\";\r\n\r\nimport Backend from \"../common/utils/Backend\";\r\nimport { withSpinloader } from \"../common/components/Spinloader\";\r\nimport { withSpectraViewer } from \"./contexts/SpectraViewerContext\";\r\nimport SpectraToolBar from \"./components/SpectraToolBar\";\r\nimport SpectraLeftTableResults from \"./components/SpectraLeftTableResults\";\r\nimport SpectraBottomTableResults from \"./components/SpectraBottomTableResults\";\r\nimport LocalVerticalResizeBorder from \"./components/LocalVerticalResizeBorder\";\r\nimport LocalHorizontalResizeBorder from \"./components/LocalHorizontalResizeBorder\";\r\n\r\nconst styles = {\r\n outerContainer: {\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"calc(100% - 64px)\",\r\n background: \"#EBEBEB\",\r\n display: \"grid\",\r\n },\r\n borderBackground: {\r\n background: \"#EBEBEB\",\r\n },\r\n TableContainer: {\r\n background: \"white\",\r\n marginRight: 5,\r\n overflow: \"hidden\",\r\n width: \"100%\",\r\n display: \"grid\",\r\n gridTemplateRows: \"auto 1fr\",\r\n },\r\n PreviewContainer: {\r\n background: \"white\",\r\n },\r\n leftTableContainer: {\r\n overflow: \"hidden\",\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr 5px\",\r\n },\r\n bottomTableContainer: {\r\n overflow: \"hidden\",\r\n display: \"grid\",\r\n gridTemplateRows: \"5px 1fr\",\r\n },\r\n ToolBarContainer: {\r\n background: \"white\",\r\n margin: \"0 5px\",\r\n },\r\n SideBarContainer: {\r\n background: \"white\",\r\n overflow: \"hidden\",\r\n display: \"grid\",\r\n gridTemplateRows: \"1fr auto\",\r\n },\r\n};\r\n\r\nclass SpectraViewer extends Component {\r\n constructor(props) {\r\n super(props);\r\n this._isMounted = false;\r\n this.state = {\r\n initialized: false,\r\n activeMainTab: 0,\r\n resultChartTypes: [],\r\n project: null,\r\n chart: null,\r\n datasets: [],\r\n fileParams: [],\r\n windowSize: [0, 0],\r\n maxScores: 0,\r\n xAxisData: {\r\n minX: 0,\r\n maxX: 0,\r\n stepX: 0.1,\r\n min: 0,\r\n max: 0,\r\n },\r\n showResultTable: false,\r\n leftTableWidth: 400,\r\n bottomTableHeight: 300,\r\n sideBarWidth: 550,\r\n mainChartDataShown: null,\r\n setXRangeManually: true,\r\n xValueMinMax: [330, 344], // default values\r\n };\r\n }\r\n\r\n /**\r\n * Initializes top level container containing all elements of the viewer.\r\n * Loads saved project from backend.\r\n */\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n window.addEventListener(\"keydown\", this.keyDown);\r\n window.addEventListener(\"resize\", () => this.updateDimensions());\r\n Backend.loadProject(\r\n {\r\n id: this.props.id,\r\n },\r\n (project) => {\r\n if (project.projectData) {\r\n project.metaData = project.projectData.metaData;\r\n project.name = project.projectData.name;\r\n } else {\r\n project.metaData = JSON.parse(project.metaData);\r\n }\r\n window.setNavigationbarTitle(\r\n `${project.name} (${project.viewerConfig.project.label})`\r\n );\r\n Backend.getCurrentUser((user) => {\r\n let areas = this.props.spectraViewer.areas;\r\n let operationSets = this.props.spectraViewer.operationSets;\r\n let useSavedCalcs = this.props.spectraViewer.useSavedCalcs;\r\n let passingCriteria = this.props.spectraViewer.passingCriteria;\r\n let passingCriteria_idx =\r\n this.props.spectraViewer.passingCriteria_idx;\r\n let passingCriteria_min =\r\n this.props.spectraViewer.passingCriteria_min;\r\n let passingCriteria_max =\r\n this.props.spectraViewer.passingCriteria_max;\r\n let datasets = [];\r\n let fileParams = [];\r\n let xAxisData = this.state.xAxisData;\r\n let setXRangeManually = true;\r\n let xValueMinMax = [330, 344]; // default values\r\n if (project.projectData) {\r\n let simpleParams = JSON.parse(project.projectData.simpleParams);\r\n useSavedCalcs = simpleParams.useSavedCalcs\r\n ? simpleParams.useSavedCalcs\r\n : true;\r\n areas = simpleParams.areas;\r\n xAxisData = simpleParams.xAxisData\r\n ? simpleParams.xAxisData\r\n : xAxisData;\r\n fileParams = simpleParams.fileParams ? simpleParams.fileParams : [];\r\n // Backwards compatibility\r\n datasets = simpleParams.datasets\r\n ? simpleParams.datasets\r\n : simpleParams.legendData;\r\n operationSets = simpleParams.operationSets\r\n ? simpleParams.operationSets\r\n : this.props.spectraViewer.operationSets;\r\n\r\n passingCriteria = simpleParams.passingCriteria\r\n ? simpleParams.passingCriteria\r\n : this.props.spectraViewer.passingCriteria;\r\n\r\n passingCriteria_idx = simpleParams.passingCriteria_idx\r\n ? simpleParams.passingCriteria_idx\r\n : this.props.spectraViewer.passingCriteria_idx;\r\n\r\n passingCriteria_min = simpleParams.passingCriteria_min\r\n ? simpleParams.passingCriteria_min\r\n : this.props.spectraViewer.passingCriteria_max;\r\n\r\n passingCriteria_max = simpleParams.passingCriteria_max\r\n ? simpleParams.passingCriteria_max\r\n : this.props.spectraViewer.passingCriteria_max;\r\n }\r\n if (fileParams.length === 0) {\r\n fileParams = project.files.map((file) => {\r\n return {\r\n fileName: file.fileName,\r\n id: file.id,\r\n subName: [],\r\n concentration: [],\r\n };\r\n });\r\n } else if (\r\n // Check for old format\r\n typeof fileParams[0].subName === \"string\" ||\r\n typeof fileParams[0].concentration === \"number\"\r\n ) {\r\n // Ensure backwards compatibility with single substance spectra\r\n fileParams = fileParams.map((file) => {\r\n // Convert to new, array-based format\r\n return {\r\n fileName: file.fileName,\r\n id: file.id,\r\n subName: file.subName\r\n ? typeof file.subName === \"string\"\r\n ? [file.subName]\r\n : file.subName\r\n : [],\r\n concentration:\r\n file.concentration || file.concentration === 0\r\n ? typeof file.concentration === \"number\"\r\n ? [file.concentration]\r\n : file.concentration\r\n : [],\r\n };\r\n });\r\n }\r\n this.setState({\r\n xAxisData,\r\n fileParams,\r\n initialized: project.projectData !== null,\r\n areas,\r\n datasets,\r\n user: user.fullName,\r\n project: this.createProjectModel(project, user.fullName),\r\n });\r\n this.props.spectraViewer.setState({\r\n operationSets,\r\n useSavedCalcs,\r\n passingCriteria,\r\n passingCriteria_idx,\r\n passingCriteria_min,\r\n passingCriteria_max,\r\n xValueMinMax,\r\n setXRangeManually,\r\n });\r\n });\r\n }\r\n );\r\n };\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n window.removeEventListener(\"keydown\", this.keyDown);\r\n window.removeEventListener(\"resize\", () => this.updateDimensions());\r\n this.props.spinloader.hide();\r\n }\r\n\r\n updateDimensions = () => {\r\n this.setState({ windowSize: [window.innerWidth, window.innerHeight] });\r\n if (this.state.chart) this.state.chart.resize();\r\n };\r\n /**\r\n * handle shortcut\r\n * @param {ActionEvent} e Event when keyboard button is pressed\r\n */\r\n keyDown = (e) => {\r\n if (e.ctrlKey && e.key === \"s\") {\r\n this.saveFunction();\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n /**\r\n * Gets all numbertype rating criteria from an list of ratedSpectra without duplicates.\r\n * @param {JSON} ratedSpectra A list of ratings, each containing criteria as keys.\r\n * @returns {List} All keys (= criteria) as strings without duplicates.\r\n */\r\n gatherAllCriteria = (ratedSpectra) => {\r\n let criteria = [];\r\n ratedSpectra.forEach(\r\n (spectrum) =>\r\n (criteria = criteria.concat(\r\n Object.keys(spectrum.rating).filter(\r\n // Only get criterium of type number not yet included in criteria\r\n (key) =>\r\n typeof spectrum.rating[key] === \"number\" &&\r\n criteria.indexOf(key) < 0\r\n )\r\n ))\r\n );\r\n return criteria;\r\n };\r\n\r\n /**\r\n * Gets data from the backend, depending on the requesttype.\r\n * @param {string} requestType Can be \"init\", \"update\", \"pca_chosen\",\r\n * \"calculate_pcas\", \"pca_evaluation\", \"ai_evaluation\", \"true_approx_scores\",\r\n * \"predict_spectrum\"\r\n */\r\n requestData = (requestType) => {\r\n const { project } = this.state;\r\n\r\n let areas = this.state.xAxisData.length\r\n ? this.props.spectraViewer.areas.map((area) => [\r\n area.coordRange[0],\r\n area.coordRange[1],\r\n ])\r\n : [];\r\n\r\n // Add substances and concetrations of spectra files\r\n let files = project.files;\r\n files = files.map((file) => {\r\n // Add checked status an graph color to file data\r\n const useAll =\r\n this.props.spectraViewer.rawSpectra.filter((el) => el.checked)\r\n .length === 0;\r\n for (let i = 0; i < this.props.spectraViewer.rawSpectra.length; i++) {\r\n if (\r\n this.props.spectraViewer.rawSpectra[i].id &&\r\n this.props.spectraViewer.rawSpectra[i].id === file.id\r\n ) {\r\n file.color = this.props.spectraViewer.rawSpectra[i].color;\r\n // Should no spectra be selected, all are used.\r\n file.checked = useAll\r\n ? true\r\n : this.props.spectraViewer.rawSpectra[i].checked;\r\n }\r\n }\r\n // Look for values in state and add theem to file properties\r\n for (let i = 0; i < this.state.fileParams.length; i++) {\r\n if (\r\n this.state.fileParams[i].id &&\r\n this.state.fileParams[i].id === file.id\r\n ) {\r\n file.id = this.state.fileParams[i].id;\r\n file.substances = this.state.fileParams[i].subName.map(\r\n (name, idx) => {\r\n return {\r\n name: name,\r\n concentration: this.state.fileParams[i].concentration[idx],\r\n };\r\n }\r\n );\r\n // Successful reading of files\r\n return file;\r\n }\r\n }\r\n\r\n return file;\r\n });\r\n let input = {\r\n id: project.id,\r\n projectType: project.type,\r\n files: files,\r\n requestType: requestType, // Definitions: see method description\r\n areaSet: areas,\r\n operations: this.props.spectraViewer.operationSets,\r\n useSavedCalcs: this.props.spectraViewer.useSavedCalcs,\r\n selectedPcaId: this.props.spectraViewer.selectedPcaId,\r\n selectedModel:\r\n this.props.spectraViewer.models[\r\n this.props.spectraViewer.selectedModelIdx\r\n ],\r\n selectedSpectrumId:\r\n this.props.spectraViewer.rawSpectra[\r\n this.props.spectraViewer.selectedSpectrum\r\n ]?.id,\r\n passingCriteria: {\r\n criterium:\r\n this.props.spectraViewer.passingCriteria[\r\n this.props.spectraViewer.passingCriteria_idx\r\n ],\r\n limits: [\r\n this.props.spectraViewer.passingCriteria_min,\r\n this.props.spectraViewer.passingCriteria_max,\r\n ],\r\n },\r\n spectraPredictionSettings:\r\n this.props.spectraViewer.spectraPredictionSettings,\r\n setXRangeManually: this.props.spectraViewer.setXRangeManually,\r\n xValueMinMax: this.props.spectraViewer.xValueMinMax,\r\n };\r\n // pca chosen simply returns to home screen\r\n if (input.requestType !== \"pca_chosen\") {\r\n this.props.spinloader.show();\r\n }\r\n\r\n Backend.requestSpectraData(\r\n input,\r\n (data) => {\r\n switch (input.requestType) {\r\n case \"pca_chosen\":\r\n // Only clean up pcas in backend, we're done in the frontend\r\n break;\r\n\r\n case \"calculate_pcas\":\r\n // Only extract the calculated pcas\r\n this.props.spectraViewer.setState({ pcas: data.pcas });\r\n this.props.spinloader.hide();\r\n break;\r\n\r\n case \"pca_evaluation\":\r\n // Analyse all selected spectra using the selected pca\r\n this.props.spectraViewer.setState({\r\n ratedSpectra: data.rated_spectra,\r\n passingCriteria: this.gatherAllCriteria(data.rated_spectra),\r\n });\r\n this.props.spinloader.hide();\r\n break;\r\n\r\n case \"ai_evaluation\":\r\n // Analyse all selected spectra using the selected ai model\r\n this.props.spectraViewer.setState({\r\n ratedSpectra: data.rated_spectra,\r\n passingCriteria: this.gatherAllCriteria(data.rated_spectra),\r\n });\r\n this.props.spinloader.hide();\r\n break;\r\n\r\n case \"true_approx_scores\":\r\n // Calculate pca approximation of a given spectrum for comparison purposes\r\n this.props.spectraViewer.setState(\r\n {\r\n focusedPca: {\r\n info: data.focusedPca.info,\r\n approximations: data.focusedPca.approximations,\r\n scores: data.focusedPca.scores,\r\n },\r\n },\r\n\r\n () =>\r\n this.props.spectraViewer.setState(\r\n {\r\n currentlyShownData: null,\r\n analysisResults: this.structurePcaAnalysisResults(),\r\n analysisResultsLoaded: true,\r\n },\r\n\r\n () => this.showAnalysisResults()\r\n )\r\n );\r\n break;\r\n\r\n case \"predict_spectrum\":\r\n // Predict a new spectrum from concentration input values.\r\n this.showPredictionResults(data.predictedSpectra);\r\n this.props.spinloader.hide();\r\n break;\r\n\r\n case \"init\":\r\n // Get exisiting models\r\n Backend.getModelMetadata(\"verified_models\", false, (model_data) => {\r\n model_data = model_data.filter((model) => {\r\n // Filter models to where any version is a spectra-analysis or a spectra-predict model\r\n if (\r\n !model.versions.some(\r\n (version) =>\r\n version.modeltype === \"spectra-analysis\" ||\r\n version.modeltype === \"spectra-predict\"\r\n )\r\n ) {\r\n return false;\r\n }\r\n\r\n // Remove any faulty versions\r\n model.versions = model.versions.filter(\r\n (version) =>\r\n version.modeltype === \"spectra-analysis\" ||\r\n version.modeltype === \"spectra-predict\"\r\n );\r\n\r\n // Select the first version as default\r\n model.selectedVersionIdx = 0;\r\n\r\n // Keep only models where versions are still present\r\n return model.versions.length > 0;\r\n });\r\n\r\n this.props.spectraViewer.setState({ models: model_data });\r\n });\r\n\r\n this.props.spectraViewer.setState(\r\n {\r\n pcas: data.pcas,\r\n rawSpectra: data.series,\r\n rawSpectraLoaded: true,\r\n currentlyShownData: null,\r\n },\r\n () => {\r\n this.showRawSpectra();\r\n }\r\n );\r\n break;\r\n\r\n case \"update\":\r\n default:\r\n this.setSeries(data.series, () => {\r\n this.props.spinloader.hide();\r\n });\r\n }\r\n return true;\r\n },\r\n (error) => {\r\n // Concatenate array of errors to single string\r\n window.openErrorDialog(\r\n error.reduce((currentValue, newValue) => {\r\n return `${currentValue}${newValue}\\n`;\r\n }, \"\")\r\n );\r\n this.props.spinloader.hide();\r\n return false;\r\n },\r\n (backendStatus) => {\r\n if (this._isMounted) {\r\n this.props.spinloader.showWithProgress(backendStatus);\r\n }\r\n }\r\n );\r\n };\r\n\r\n structurePcaAnalysisResults = () => {\r\n // Build a series of objects, that may be used to accurately display individual components of the analysis.\r\n let series = [];\r\n let total =\r\n this.props.spectraViewer.focusedPca.scores.length +\r\n this.props.spectraViewer.focusedPca.approximations.length;\r\n let current = 1;\r\n // all the pca scores\r\n this.props.spectraViewer.focusedPca.scores.forEach((score) => {\r\n this.props.spinloader.showWithProgress({\r\n message: \"Calculating series\",\r\n progress: (current++ / total) * 100,\r\n });\r\n series.push({\r\n name: score.name,\r\n checked: score.checked ? score.checked : false,\r\n type: score.type ? score.type : \"line\",\r\n symbol: score.symbol ?? \"none\",\r\n data: score.data,\r\n character: \"score\",\r\n });\r\n });\r\n\r\n // all the pca original data, processed data, approximations, and residuals\r\n this.props.spectraViewer.focusedPca.approximations.forEach(\r\n (approximation) => {\r\n this.props.spinloader.showWithProgress({\r\n message: \"Calculating series\",\r\n progress: (current++ / total) * 100,\r\n });\r\n // Match with original data\r\n this.props.spectraViewer.rawSpectra.some((rawSpectrum) => {\r\n if (rawSpectrum.id === approximation.id) {\r\n series.push({\r\n name: `Original`,\r\n checked: approximation.checked ? approximation.checked : false,\r\n type: approximation.type ? approximation.type : \"line\",\r\n symbol: approximation.symbol ?? \"none\",\r\n data: rawSpectrum.data,\r\n character: \"original spectrum\",\r\n });\r\n return true;\r\n }\r\n return false;\r\n });\r\n\r\n // Preprocessed data\r\n series.push({\r\n name: `Preprocessed`,\r\n checked: approximation.checked ? approximation.checked : false,\r\n type: approximation.type ? approximation.type : \"line\",\r\n symbol: approximation.symbol ?? \"none\",\r\n data: approximation.original_data,\r\n character: \"preprocessed spectrum\",\r\n });\r\n\r\n // Approximated Data\r\n series.push({\r\n name: `Approximated`,\r\n checked: approximation.checked ? approximation.checked : false,\r\n type: approximation.type ? approximation.type : \"line\",\r\n symbol: approximation.symbol ?? \"none\",\r\n data: approximation.approximated_data,\r\n character: \"approximated spectrum\",\r\n });\r\n\r\n // Residual data\r\n series.push({\r\n name: `Residual`,\r\n checked: approximation.checked ? approximation.checked : false,\r\n type: approximation.type ? approximation.type : \"line\",\r\n symbol: approximation.symbol ?? \"none\",\r\n data: approximation.original_data.map((orig_data, idx) => {\r\n let datapoint = [\r\n orig_data[0],\r\n approximation.approximated_data[idx][1] - orig_data[1],\r\n ];\r\n return datapoint;\r\n }),\r\n character: \"residual spectrum\",\r\n });\r\n }\r\n );\r\n return series;\r\n };\r\n\r\n /**\r\n * Displays the raw spectra as loaded from backend in graph.\r\n * @returns {bool} Successful display of raw spectra.\r\n */\r\n showRawSpectra = () => {\r\n if (\r\n this.props.spectraViewer.rawSpectraLoaded &&\r\n this.props.spectraViewer.currentlyShownData !== \"raw_spectra\"\r\n ) {\r\n this.props.spinloader.showWithMessage(\"Loading datapoints...\");\r\n setTimeout(() => {\r\n this.state.chart.clear();\r\n this.props.spectraViewer.setState({\r\n currentlyShownData: \"raw_spectra\",\r\n });\r\n this.setState({\r\n mainChartDataShown: \"raw_spectra\",\r\n });\r\n this.setSeries(this.props.spectraViewer.rawSpectra, () => {\r\n this.props.spinloader.hide();\r\n });\r\n }, 0);\r\n\r\n return true;\r\n } else if (this.props.spectraViewer.currentlyShownData === \"raw_spectra\") {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * Displays the analysis results as calculated in backend in graph.\r\n * @returns {bool} Successful display of analysis results.\r\n */\r\n showAnalysisResults = () => {\r\n if (\r\n this.props.spectraViewer.analysisResultsLoaded &&\r\n this.props.spectraViewer.currentlyShownData !== \"analysis_results\"\r\n ) {\r\n this.props.spinloader.showWithMessage(\"Loading datapoints...\");\r\n setTimeout(() => {\r\n this.state.chart.clear();\r\n this.props.spectraViewer.setState({\r\n currentlyShownData: \"analysis_results\",\r\n });\r\n this.setState({\r\n mainChartDataShown: \"analysis_results\",\r\n });\r\n this.setSeries(this.props.spectraViewer.analysisResults, () => {\r\n this.props.spinloader.hide();\r\n });\r\n }, 0);\r\n return true;\r\n } else if (\r\n this.props.spectraViewer.currentlyShownData === \"analysis_results\"\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * Integrate predicted spectra alongside rawSpectra.\r\n * @param {Array} spectra All predicted spectra to be shown alongside the normal, rawSpectra\r\n */\r\n showPredictionResults = (spectra) => {\r\n // Show spectra alongside normal spectra\r\n let tmpSpectra = this.props.spectraViewer.rawSpectra;\r\n // Filter out double names\r\n let existingNames = [];\r\n spectra.forEach((spectrum) => existingNames.push(spectrum.name));\r\n tmpSpectra = tmpSpectra.filter(\r\n (spectrum) => !existingNames.some((name) => name === spectrum.name)\r\n );\r\n\r\n tmpSpectra.push(...spectra);\r\n this.props.spectraViewer.setState(\r\n {\r\n rawSpectraLoaded: true,\r\n currentlyShownData: null,\r\n rawSpectra: tmpSpectra,\r\n },\r\n () => this.showRawSpectra()\r\n );\r\n };\r\n\r\n /**\r\n * Sets the top-level Apache ELineChart\r\n * @param {ELineChart} chart\r\n * @returns nothing when no chart is given.\r\n */\r\n setChart = (chart) => {\r\n this.setState({ chart });\r\n if (chart === null) {\r\n return;\r\n }\r\n // update areas while drawing for settings content in side bar\r\n chart.on(\"brush\", (params) => {\r\n this.props.spectraViewer.updateAreas(params.areas);\r\n });\r\n\r\n // Toggling a single spectrum\r\n // update checked spectras for spectra tab content in side bar\r\n chart.on(\"legendselectchanged\", (params) => {\r\n this.validateDatasets(params);\r\n });\r\n\r\n // Selecting all spectra\r\n // Update checked spectras for spectra tab content in side bar\r\n chart.on(\"legendselectall\", (params) => {\r\n this.validateDatasets(params);\r\n });\r\n\r\n // Inversing all spectra\r\n // Update checked spectras for spectra tab content in side bar\r\n chart.on(\"legendinverseselect\", (params) => {\r\n this.validateDatasets(params);\r\n });\r\n\r\n //reset to show all spectra\r\n chart.on(\"restore\", () => {\r\n this.setState({\r\n datasets: this.state.datasets.map((item) => {\r\n item.checked = true;\r\n return item;\r\n }),\r\n });\r\n });\r\n };\r\n\r\n validateDatasets = (params) => {\r\n let datasets = JSON.parse(JSON.stringify(this.state.datasets));\r\n let rawSpectra = this.props.spectraViewer.rawSpectra;\r\n let analysisResults = this.props.spectraViewer.analysisResults;\r\n\r\n for (let i = 0; i < datasets.length; i++) {\r\n let key = datasets[i].name;\r\n let checked = params.selected[key];\r\n // undefined inputs are defaulted to true by the echart.\r\n // only once specifically set, they have a boolean value.\r\n if (typeof checked !== \"undefined\") {\r\n datasets[i].checked = checked;\r\n } else {\r\n checked = true; // checked is used further down\r\n datasets[i].checked = checked;\r\n }\r\n\r\n if (this.props.spectraViewer.currentlyShownData === \"raw_spectra\") {\r\n // Update raw spectra\r\n rawSpectra.filter((spectrum) => spectrum.name === key)[0].checked =\r\n checked;\r\n } else if (\r\n this.props.spectraViewer.currentlyShownData === \"analysis_results\"\r\n ) {\r\n // Update analysis results\r\n analysisResults.filter((spectrum) => spectrum.name === key)[0].checked =\r\n checked;\r\n }\r\n }\r\n this.setState({ datasets });\r\n this.props.spectraViewer.setState({ rawSpectra, analysisResults });\r\n this.forceUpdate();\r\n };\r\n\r\n /**\r\n * Sets options for graph, including series as data\r\n * @param {array} series Datavalues for series\r\n * @param {function} callback Checks on success of this function. Is fed true or false.\r\n */\r\n setSeries = async (series, callback) => {\r\n // Graph settings\r\n let option = {\r\n animation: false,\r\n tooltip: {\r\n trigger: \"axis\",\r\n axisPointer: {\r\n type: \"cross\",\r\n },\r\n },\r\n legend: {\r\n show: false,\r\n data: series.map((item) => item.name),\r\n },\r\n grid: {\r\n left: 20,\r\n right: 20,\r\n top: 60,\r\n containLabel: true,\r\n tooltip: {\r\n show: true,\r\n },\r\n },\r\n toolbox: {\r\n dataZoom: {\r\n show: true,\r\n },\r\n feature: {\r\n dataZoom: {\r\n yAxisIndex: \"none\",\r\n },\r\n brush: {\r\n type: [\"lineX\", \"keep\", \"clear\"],\r\n },\r\n restore: {},\r\n saveAsImage: {},\r\n },\r\n //orient: \"vertical\",\r\n itemSize: 26,\r\n iconStyle: {\r\n borderWidth: 3,\r\n borderColor: \"rgba(0, 0, 0, 0.54)\",\r\n },\r\n right: 20,\r\n },\r\n brush: {\r\n xAxisIndex: \"all\",\r\n brushLink: \"all\",\r\n outOfBrush: {\r\n colorAlpha: 0.1,\r\n },\r\n },\r\n xAxis: {\r\n type: \"value\",\r\n scale: true,\r\n // minInterval: 0.01,\r\n axisLabel: {\r\n show: true,\r\n interval: 1,\r\n },\r\n },\r\n yAxis: {\r\n type: \"value\",\r\n // minInterval: 0.01,\r\n },\r\n dataZoom: [\r\n {\r\n type: \"inside\",\r\n disabled: false,\r\n },\r\n {},\r\n ],\r\n series: series,\r\n };\r\n this.state.chart.setOption(option);\r\n\r\n // Update graph contents\r\n let success = await this.updateChartData(series);\r\n callback(success);\r\n };\r\n\r\n /**\r\n * Updates graph contents.\r\n * @param {Array} series Datavalues for graphs.\r\n * @returns {bool} Success status of data update.\r\n */\r\n updateChartData = async (series) => {\r\n let minX = 10000000;\r\n let maxX = -10000000;\r\n let length = 0;\r\n series.forEach((item) => {\r\n minX = Math.min(minX, item.data[0][0]);\r\n maxX = Math.max(maxX, item.data[item.data.length - 1][0]);\r\n length = Math.max(length, item.data.length);\r\n });\r\n\r\n const xAxisData = {\r\n minX: minX,\r\n maxX: maxX,\r\n stepX: 0.1,\r\n length: length,\r\n };\r\n\r\n this.setState({ datasets: series, xAxisData });\r\n if (series.length > 0) {\r\n series.forEach((dataset) => {\r\n if (!dataset.checked) {\r\n this.state.chart.dispatchAction({\r\n type: \"legendUnSelect\",\r\n name: dataset.name,\r\n });\r\n }\r\n });\r\n }\r\n\r\n if (this.props.spectraViewer.areas.length > 0) {\r\n this.state.chart.dispatchAction({\r\n type: \"brush\",\r\n areas: this.props.spectraViewer.areas,\r\n });\r\n }\r\n this.props.spectraViewer.setMaxScores();\r\n return true;\r\n };\r\n\r\n /**\r\n * Toggles a selected dataseries on or off,\r\n * influencing the maximum amount of settable scores,\r\n * and limiting those to be included in analysis/PCA training.\r\n * @param {string} name Name of the datasereies to toggle\r\n */\r\n toggleLegend = (name) => {\r\n this.state.chart.dispatchAction({\r\n type: \"legendToggleSelect\",\r\n name: name,\r\n });\r\n this.props.spectraViewer.setMaxScores();\r\n };\r\n\r\n /**\r\n * Toggles all dataseries on or off,\r\n * including them all in the analysis/PCA training.\r\n * @param {string} name Name of the dataseries to toggle\r\n */\r\n toggleAll = () => {\r\n let spectra = this.state.datasets;\r\n this.state.chart.dispatchAction({\r\n type: \"legendAllSelect\",\r\n });\r\n\r\n // Deactivate all spectra should all be activated\r\n if (spectra.every((spectrum) => spectrum.checked)) {\r\n this.state.chart.dispatchAction({\r\n type: \"legendInverseSelect\",\r\n });\r\n }\r\n this.props.spectraViewer.setMaxScores();\r\n };\r\n\r\n setSelectedRow = (row) => {\r\n this.setState({ selectedRow: row });\r\n };\r\n\r\n onUpdateResultChartTypes = (resultChartTypes) => {\r\n this.setState({ resultChartTypes });\r\n };\r\n\r\n onUpdateFileParams = (fileParams) => {\r\n this.setState({ fileParams });\r\n };\r\n\r\n createProjectModel = (project, user) => {\r\n const projectModel = {\r\n name: project.name,\r\n user: user,\r\n id: project.id,\r\n readableId: project.readableId,\r\n metaData: project.metaData,\r\n type: project.type,\r\n tools: project.viewerConfig.project.tools,\r\n job: project.viewerConfig.project.job,\r\n files: project.files,\r\n };\r\n return projectModel;\r\n };\r\n\r\n /**\r\n * Prepares the data from state for saving.\r\n * Saves project accordingly.\r\n */\r\n saveFunction = () => {\r\n if (this.state) {\r\n let project = this.state.project;\r\n project.simpleParams = JSON.stringify({\r\n xAxisData: this.state.xAxisData,\r\n useSavedCalcs: this.props.spectraViewer.useSavedCalcs,\r\n areas: this.props.spectraViewer.areas.map((area) => {\r\n // Remove refs before saving\r\n area.refs = [];\r\n return area;\r\n }),\r\n datasets: this.state.datasets,\r\n operationSets: this.props.spectraViewer.operationSets,\r\n fileParams: this.state.fileParams,\r\n passingCriteria: this.props.spectraViewer.passingCriteria,\r\n passingCriteria_idx: this.props.spectraViewer.passingCriteria_idx,\r\n passingCriteria_min: this.props.spectraViewer.passingCriteria_min,\r\n passingCriteria_max: this.props.spectraViewer.passingCriteria_max,\r\n });\r\n Backend.saveProject(project, (data) => {\r\n if (data.success) {\r\n window.showSuccessSnackbar(\"Project saved succesfully!\");\r\n } else {\r\n window.showErrorSnackbar(\"Project could not be saved!\");\r\n }\r\n });\r\n }\r\n };\r\n\r\n onChangeMetaData = (field, e) => {\r\n this.setState((prevState) => {\r\n let project = Object.assign({}, prevState.project);\r\n project.metaData[field] = e;\r\n return { project };\r\n });\r\n };\r\n\r\n handleMainTabChange = (event, value) => {\r\n this.setState({ activeMainTab: value });\r\n };\r\n\r\n toggleLeftTableContainer = () => {\r\n this.setState({ showResultTable: !this.state.showResultTable });\r\n setTimeout(() => this.updateDimensions(), 10);\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const {\r\n initialized,\r\n project,\r\n activeMainTab,\r\n showResultTable,\r\n leftTableWidth,\r\n sideBarWidth,\r\n } = this.state;\r\n\r\n return (\r\n \r\n
\r\n {project && (\r\n \r\n {initialized || this.state.project.type === \"ESREvaluation\" ? (\r\n \r\n \r\n \r\n\r\n {this.state.project.type !== \"ESREvaluation\" && (\r\n \r\n )}\r\n \r\n\r\n \r\n \r\n this.setState(value)}\r\n />\r\n
\r\n {\r\n this.setState({\r\n leftTableWidth: width,\r\n });\r\n this.updateDimensions();\r\n }}\r\n />\r\n
\r\n
\r\n \r\n \r\n\r\n \r\n \r\n this.props.spectraViewer.setState({\r\n currentlyShownData: value,\r\n })\r\n }\r\n />\r\n \r\n
\r\n {\r\n this.setState({\r\n bottomTableHeight: height,\r\n });\r\n this.updateDimensions();\r\n }}\r\n />\r\n
\r\n this.setState(value)}\r\n />\r\n \r\n \r\n \r\n ) : (\r\n \r\n this.setState({ initialized: value })\r\n }\r\n save={this.saveFunction}\r\n />\r\n )}\r\n \r\n )}\r\n \r\n
\r\n {\r\n this.setState({\r\n sideBarWidth: width,\r\n });\r\n this.updateDimensions();\r\n }}\r\n />\r\n
\r\n
\r\n this.saveFunction()}\r\n showResultTable={this.state.showResultTable}\r\n toggleLeftTableContainer={() => this.toggleLeftTableContainer()}\r\n />\r\n
\r\n
\r\n {project && (\r\n this.setState({ initialized: value })}\r\n maxScores={this.state.maxScores}\r\n toggleLegend={this.toggleLegend}\r\n toggleAll={this.toggleAll}\r\n onChangeMetaData={this.onChangeMetaData}\r\n requestData={this.requestData}\r\n onSave={() => this.saveFunction()}\r\n showRawSpectra={this.showRawSpectra}\r\n showAnalysisResults={this.showAnalysisResults}\r\n throwError={(error) => window.showErrorSnackbar(error)}\r\n updateChartData={this.setSeries}\r\n />\r\n )}\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nSpectraViewer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n spectraViewer: PropTypes.object.isRequired,\r\n id: PropTypes.string,\r\n spinloader: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(\r\n withSpinloader(withSpectraViewer(withStyles(styles)(SpectraViewer)))\r\n);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst ScanViewerContext = React.createContext();\r\n\r\nexport const withScanViewerContext = (Component) => {\r\n const WrappedComponent = (props) => (\r\n \r\n {(context) => }\r\n \r\n );\r\n\r\n WrappedComponent.displayName = `withScanViewerContext(${\r\n Component.displayName || Component.name || \"Component\"\r\n })`;\r\n\r\n return WrappedComponent;\r\n};\r\n\r\n/**\r\n * handles the communication with backend.\r\n * this is the main component, it has to be added at the root of the app.\r\n * all components that use withPersistentStorage(...) will have access to it via this.props.persistentStorage...\r\n */\r\nclass ScanViewerProvider extends Component {\r\n constructor(props) {\r\n super(props);\r\n this._isMounted = false;\r\n this.state = {\r\n mapVisible: true,\r\n cameraVisible: false,\r\n gridVisible: true,\r\n commentsVisible: true,\r\n sideBarContent: \"fluorescence\",\r\n sharpness: 0,\r\n streamReady: false,\r\n slideScanning: false,\r\n activeTab: 0,\r\n filePath: \"\",\r\n commentCount: 0,\r\n sharpnessBenchmark: 80,\r\n w: 400,\r\n h: 400,\r\n fluorescenceChannels: \"\",\r\n selectedChannel: \"\",\r\n cameraMinFramerate: 0,\r\n cameraMaxFramerate: 30,\r\n cameraMinExposureTime: 30,\r\n cameraMaxExposureTime: 99999,\r\n cameraMinGain: 0.1,\r\n cameraMaxGain: 12.0,\r\n cameraMinGamma: 0.0,\r\n cameraMaxGamma: 3.95,\r\n cameraMinBlackValue: 0.0,\r\n cameraMaxBlackValue: 31.9,\r\n pixelSizeCamera: 3.45,\r\n cameraColorMin: 0,\r\n cameraColorMax: 15.99,\r\n };\r\n\r\n this.channels = [];\r\n this.socket = Backend.connectScanner();\r\n this.socket.onopen = () => {\r\n console.log(\"SCANNER CONNECTED\");\r\n this.send({\r\n state: \"toggle\",\r\n target: \"camera\",\r\n value: this.state.cameraVisible,\r\n });\r\n this.send({\r\n state: \"toggle\",\r\n target: \"grid\",\r\n value: this.state.gridVisible,\r\n });\r\n };\r\n this.socket.onclose = () => {\r\n console.log(\"SCANNER DISCONNECTED\");\r\n };\r\n let lastStateUpdateTime = performance.now();\r\n this.socket.onmessage = (ev) => {\r\n const data = JSON.parse(ev.data);\r\n if (data.state) {\r\n if (data.state === \"stream_ready\") {\r\n this.setState({ streamReady: true });\r\n } else if (data.state === \"stitching_start\") {\r\n props.spinloader.show();\r\n } else if (data.state === \"stitching\") {\r\n props.spinloader.showWithProgress({\r\n message: \"Progress\",\r\n progress: data.progress,\r\n });\r\n } else if (data.state === \"stitching_end\") {\r\n props.spinloader.hide();\r\n } else if (data.state === \"camera_error\") {\r\n window.openResponseDialog(\r\n \"Camera could not be found. Retry?\",\r\n (response) => {\r\n if (!response) {\r\n this.exitScanner();\r\n this.props.history.push(\"/\");\r\n }\r\n }\r\n );\r\n } else if (data.state === \"saving_error\") {\r\n props.spinloader.hide();\r\n window.openWarningDialog(\r\n \"Number of channels not equal. Please save in separate file.\"\r\n );\r\n } else if (data.state === \"cameraParameters\") {\r\n console.log(\"update params\", data);\r\n this.setState({\r\n cameraMinFramerate: data.cameraMinFramerate,\r\n cameraMaxFramerate: data.cameraMaxFramerate,\r\n cameraMinExposureTime: data.cameraMinExposureTime,\r\n cameraMaxExposureTime: data.cameraMaxExposureTime,\r\n cameraMinGain: data.cameraMinGain,\r\n cameraMaxGain: data.cameraMaxGain,\r\n cameraMinGamma: data.cameraMinGamma,\r\n cameraMaxGamma: data.cameraMaxGamma,\r\n cameraMinBlackValue: data.cameraMinBlackValue,\r\n cameraMaxBlackValue: data.cameraMaxBlackValue,\r\n pixelSizeCamera: data.pixelSizeCamera,\r\n });\r\n }\r\n }\r\n if (data.sharpness && data.sharpness !== this.state.sharpness) {\r\n // reduce state updates to max 10/s\r\n if (performance.now() - lastStateUpdateTime > 100) {\r\n this.setState({ sharpness: data.sharpness });\r\n lastStateUpdateTime = performance.now();\r\n }\r\n }\r\n };\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n window.addEventListener(\"beforeunload\", this.exitScanner);\r\n const cameraVisibleValue =\r\n localStorage.getItem(\"scanCameraVisible\") === \"undefined\"\r\n ? false\r\n : localStorage.getItem(\"scanCameraVisible\") === \"true\"\r\n ? true\r\n : false;\r\n const mapVisibleValue =\r\n localStorage.getItem(\"scanMapVisible\") === \"undefined\"\r\n ? true\r\n : localStorage.getItem(\"scanMapVisible\") === \"true\"\r\n ? true\r\n : false;\r\n const gridVisibleValue =\r\n localStorage.getItem(\"scanGridVisible\") === \"undefined\"\r\n ? true\r\n : localStorage.getItem(\"scanGridVisible\") === \"true\"\r\n ? true\r\n : false;\r\n const commentsVisibleValue =\r\n localStorage.getItem(\"scanCommentsVisible\") === \"undefined\"\r\n ? true\r\n : localStorage.getItem(\"scanCommentsVisible\") === \"true\"\r\n ? true\r\n : false;\r\n const sideBarContentValue = localStorage.getItem(\"scanSideBarContent\");\r\n this.setState({\r\n cameraVisible: cameraVisibleValue,\r\n mapVisible: mapVisibleValue,\r\n gridVisible: gridVisibleValue,\r\n commentsVisible: commentsVisibleValue,\r\n sideBarContent: sideBarContentValue,\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n this.exitScanner();\r\n window.removeEventListener(\"beforeunload\", this.exitScanner);\r\n this._isMounted = false;\r\n }\r\n\r\n changeScanState = (scanState) => {\r\n if (scanState === \"scan_save\") {\r\n this.changeTab(0);\r\n }\r\n if (this.socket) {\r\n this.send({ state: scanState });\r\n this.setMountedState({ slideScanning: scanState === \"scan_start\" });\r\n if (scanState === \"scan_start\") {\r\n this.setState({ commentCount: 5 });\r\n } else if (scanState === \"scan_pause\") {\r\n this.setState({ commentCount: 6 });\r\n } else if (scanState === \"scan_reset\") {\r\n this.setState({ commentCount: 0 });\r\n this.channels = [];\r\n }\r\n }\r\n };\r\n\r\n send = (objectToSend) => {\r\n if (this.socket !== null && this.socket.readyState === 1) {\r\n this.socket.send(JSON.stringify(objectToSend));\r\n }\r\n };\r\n\r\n setScanRendererSize = (w, h) => {\r\n this.setState({ w: w });\r\n this.setState({ h: h });\r\n this.send({\r\n state: \"renderSize\",\r\n w: w,\r\n h: h,\r\n });\r\n };\r\n\r\n changeMicroscopeParams = (paramJson) => {\r\n paramJson.state = \"microscope_params\";\r\n this.send(paramJson);\r\n };\r\n\r\n moveCenter = (dx, dy) => {\r\n this.send({\r\n state: \"scan_translate\",\r\n dx: dx,\r\n dy: dy,\r\n });\r\n };\r\n\r\n sendMinimapClickPosition = (x, y) => {\r\n this.send({\r\n state: \"minimap_click\",\r\n x: x,\r\n y: y,\r\n });\r\n };\r\n\r\n sendFilePath = (filePath) => {\r\n this.setState({ filePath: filePath });\r\n this.send({\r\n state: \"file_name_change\",\r\n filePath: filePath,\r\n });\r\n };\r\n\r\n changeTab = (tabIdx) => {\r\n this.setMountedState({ activeTab: tabIdx });\r\n };\r\n\r\n createWSI = () => {\r\n this.send({\r\n state: \"scan_save\",\r\n filePath: this.state.filePath,\r\n channels: this.channels,\r\n });\r\n this.channels = [];\r\n };\r\n\r\n setVignetteState = (value) => {\r\n this.send({\r\n state: \"vignette\",\r\n value: value,\r\n });\r\n };\r\n\r\n setFeaturePointsState = (checked, numFeaturePoints) => {\r\n this.send({\r\n state: \"featurePoint\",\r\n checked: checked,\r\n numFeaturePoints: numFeaturePoints,\r\n });\r\n };\r\n\r\n toggleCamera = () => {\r\n const value = !this.state.cameraVisible;\r\n this.send({\r\n state: \"toggle\",\r\n target: \"camera\",\r\n value: value,\r\n });\r\n this.setMountedState({ cameraVisible: value });\r\n localStorage.setItem(\"scanCameraVisible\", value.toString());\r\n };\r\n\r\n toggleMinimap = () => {\r\n const value = !this.state.mapVisible;\r\n this.setMountedState({ mapVisible: value });\r\n localStorage.setItem(\"scanMapVisible\", value.toString());\r\n };\r\n\r\n toggleGrid = () => {\r\n const value = !this.state.gridVisible;\r\n this.send({\r\n state: \"toggle\",\r\n target: \"grid\",\r\n value: value,\r\n });\r\n this.setMountedState({ gridVisible: value });\r\n localStorage.setItem(\"scanGridVisible\", value.toString());\r\n };\r\n\r\n toggleComments = () => {\r\n const value = !this.state.commentsVisible;\r\n this.setMountedState({ commentsVisible: value });\r\n localStorage.setItem(\"scanCommentsVisible\", value.toString());\r\n };\r\n\r\n toggleFluorescence = () => {\r\n let value = \"\";\r\n if (this.state.sideBarContent === \"fluorescence\") {\r\n this.setMountedState({ sideBarContent: \"microscopeSettings\" });\r\n value = \"microscopeSettings\";\r\n } else {\r\n this.setMountedState({ sideBarContent: \"fluorescence\" });\r\n value = \"fluorescence\";\r\n }\r\n localStorage.setItem(\"scanSideBarContent\", value);\r\n };\r\n\r\n updateFluorescenceParams = (paramJson) => {\r\n this.send(paramJson);\r\n };\r\n\r\n deleteTile = (x, y) => {\r\n this.send({\r\n state: \"delete\",\r\n x: x,\r\n y: y,\r\n });\r\n };\r\n\r\n undo = () => {\r\n this.send({\r\n state: \"undo\",\r\n });\r\n };\r\n\r\n redo = () => {\r\n this.send({\r\n state: \"redo\",\r\n });\r\n };\r\n\r\n zoomIn = () => {\r\n this.send({\r\n state: \"zoom_in\",\r\n });\r\n };\r\n\r\n zoomOut = () => {\r\n this.send({\r\n state: \"zoom_out\",\r\n });\r\n };\r\n\r\n zoomReset = () => {\r\n this.send({\r\n state: \"zoom_reset\",\r\n });\r\n };\r\n\r\n exitScanner = () => {\r\n this.send({\r\n state: \"exit_scanner\",\r\n });\r\n };\r\n\r\n render() {\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n}\r\n\r\nScanViewerProvider.propTypes = {\r\n children: PropTypes.element.isRequired,\r\n spinloader: PropTypes.object,\r\n history: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(withSpinloader(ScanViewerProvider));\r\n","import React, { Component } from \"react\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport PropTypes from \"prop-types\";\r\nimport classNames from \"classnames\";\r\nimport DragIndicator from \"@mui/icons-material/DragIndicator\";\r\nimport Draggable from \"react-draggable\";\r\n\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\n\r\nconst styles = {\r\n root: {\r\n position: \"absolute\",\r\n left: 0,\r\n bottom: 0,\r\n height: 170,\r\n width: 220,\r\n border: \"2px solid rgb(85, 85, 85)\",\r\n opacity: 0.8,\r\n textAlign: \"center\",\r\n userSelect: \"none\",\r\n },\r\n streamImg: {\r\n background: \"black\",\r\n maxWidth: \"100%\",\r\n maxHeight: \"100%\",\r\n display: \"inline-block\",\r\n pointerEvents: \"all\",\r\n },\r\n dragIndicator: {\r\n color: \"#fff\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n cursor: \"grab\",\r\n },\r\n grabbing: {\r\n cursor: \"grabbing\",\r\n },\r\n};\r\n\r\n/**\r\n * class to render minimap and handle interaction\r\n */\r\nclass ScanMinimap extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n grabbing: false,\r\n };\r\n this.minimapRef = React.createRef();\r\n this.x = 0;\r\n this.y = 0;\r\n }\r\n\r\n /**\r\n * by clicking on the minimap move the rectangle and send data to scanViewer\r\n * @param {ActionEvent} e Mouse event\r\n */\r\n onMinimapClick = (e) => {\r\n const parentRect = this.minimapRef.current.getBoundingClientRect();\r\n const x = e.clientX - parentRect.x;\r\n const y = e.clientY - parentRect.y;\r\n this.props.scanViewerContext.sendMinimapClickPosition(x, y);\r\n };\r\n\r\n /**\r\n * Change position of minimap canvas\r\n * @param {AcitonEvent} e Mouse event\r\n * @param {Object} ui object with x,y coordinate of mouse location\r\n */\r\n handleDrag = (e, ui) => {\r\n this.x = ui.x;\r\n this.y = ui.y;\r\n };\r\n\r\n // handle dragging of the minimap region rectangle\r\n mouseDown = (event) => {\r\n this.onMinimapClick(event);\r\n this.dragging = true;\r\n event.preventDefault();\r\n };\r\n\r\n // handle dragging of the minimap region rectangle\r\n mouseMove = (event) => {\r\n if (this.dragging == true) {\r\n this.onMinimapClick(event);\r\n }\r\n event.preventDefault();\r\n };\r\n\r\n mouseUp = (event) => {\r\n this.dragging = false;\r\n event.preventDefault();\r\n };\r\n\r\n render() {\r\n const { grabbing } = this.state;\r\n const { classes } = this.props;\r\n const { mapVisible } = this.props.scanViewerContext;\r\n return (\r\n this.setState({ grabbing: true })}\r\n onDrag={this.handleDrag}\r\n onStop={() => this.setState({ grabbing: false })}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nScanMinimap.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n src: PropTypes.string,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(ScanMinimap));\r\n","import React, { Component } from \"react\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport PropTypes from \"prop-types\";\r\nimport {\r\n Card,\r\n CardActions,\r\n CardContent,\r\n Button,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\n\r\nconst styles = {\r\n cardStyle: {\r\n position: \"absolute\",\r\n top: 10,\r\n left: 0,\r\n minWidth: 235,\r\n width: 570,\r\n maxWidth: \"calc(100% - 16px)\",\r\n margin: 8,\r\n },\r\n previousButtonStyle: {\r\n position: \"absolute\",\r\n left: 11,\r\n },\r\n nextButtonStyle: {\r\n position: \"absolute\",\r\n left: 91,\r\n },\r\n cardContentStyle: {\r\n padding: 16,\r\n \"&:last-child\": {\r\n paddingBottom: 0,\r\n },\r\n },\r\n cardActionsStyle: {\r\n height: 37,\r\n padding: 0,\r\n \"&:last-child\": {\r\n paddingBottom: 8,\r\n },\r\n },\r\n closeButtonStyle: {\r\n position: \"absolute\",\r\n right: 8,\r\n },\r\n};\r\n\r\nconst cameraSettings = {\r\n heading: \"Camera settings\",\r\n info: [\r\n \"Start by adjusting the camera settings.\",\r\n \"1. Select the right lightsource.\",\r\n \"2. Adjust the picture by using the slides.\",\r\n ],\r\n};\r\nconst opticsSettings = {\r\n heading: \"Optics settings\",\r\n info: [\r\n \"Select the correct lense and adapter settings.\",\r\n \"1. Select the lense magnification you use for your scan.\",\r\n \"2. Select the right adapter magnification you use on your microscope.\",\r\n ],\r\n};\r\nconst recordVignette = {\r\n heading: \"Record vignette\",\r\n info: [\r\n \"Click on the fluorescence button, if you want to scan fluorescence. And press NEXT\",\r\n \"Record the vignette to compensate camera errors.\",\r\n \"1. Move the visible picture to a mostly white area.\",\r\n \"2. Click on Record Vignette.\",\r\n \"3. Move the microscope table for about 1 to 2 seconds in different directions.\",\r\n \"4. Click on Stop Recording.\",\r\n \"5. Click on Filter Vignette.\",\r\n ],\r\n};\r\nconst fluorescenceSettings = {\r\n heading: \"Fluorescence\",\r\n info: [\r\n \"1. Add channels by typing in the name and pressing Enter or the + symbol\",\r\n \"2. Select the channel you want to scan and click on Play\",\r\n ],\r\n};\r\nconst startScan = {\r\n heading: \"Start scan\",\r\n info: [\r\n \"1. Move to the position where you want to start your scan.\",\r\n \"2. Adjust the sharpness.\",\r\n \"3. Press the Play button and start your scan.\",\r\n ],\r\n};\r\nconst duringScan = {\r\n heading: \"Scanning\",\r\n info: [\r\n \"If the rectangle is red, the picture is out of focus or the Scanner lost the picture.\",\r\n \"You can correct the sharpness benchmark in the Settings.\",\r\n \"If you finished scanning click on the Pause button.\",\r\n \"If you want to reset the scan, delete or undo the last tiles, click on the Pause button.\",\r\n ],\r\n};\r\nconst pausedScan = {\r\n heading: \"Paused\",\r\n info: [\r\n \"To save the scan click on the Save button at the bottom of the toolbar.\",\r\n \"If you want to remove tiles, either click on the Undo button or right click on the tile.\",\r\n \"If you want to reset the scan, click on the Reset button.\",\r\n \"If you scan fluorescence, you can add, delete and select other channels in the fluorescence tab.\",\r\n ],\r\n};\r\n\r\n/**\r\n * class to render comments and handle interaction\r\n */\r\nclass ScanComments extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.texts = [\r\n //if changes happen here, make sure that right indeces are in ScanViewerContext (changeScanSettings)\r\n cameraSettings,\r\n opticsSettings,\r\n recordVignette,\r\n fluorescenceSettings,\r\n startScan,\r\n duringScan,\r\n pausedScan,\r\n ];\r\n }\r\n\r\n render() {\r\n const { classes, scanViewerContext } = this.props;\r\n const { commentsVisible } = scanViewerContext;\r\n const count = scanViewerContext.commentCount;\r\n return (\r\n
\r\n \r\n \r\n \r\n Tips:\r\n \r\n \r\n {this.texts[count].heading}\r\n \r\n \r\n {this.texts[count].info.map((row, idx) => {\r\n return
{row}
;\r\n })}\r\n
\r\n
\r\n \r\n element == duringScan) ||\r\n count ===\r\n this.texts.findIndex((element) => element == pausedScan)\r\n }\r\n size=\"small\"\r\n onClick={() => {\r\n scanViewerContext.setState({ commentCount: count - 1 });\r\n }}\r\n >\r\n Previous\r\n \r\n element == duringScan) ||\r\n count ===\r\n this.texts.findIndex((element) => element == startScan) ||\r\n count ===\r\n this.texts.findIndex((element) => element == pausedScan)\r\n }\r\n size=\"small\"\r\n onClick={() => {\r\n scanViewerContext.setState({ commentCount: count + 1 });\r\n }}\r\n >\r\n Next\r\n \r\n {\r\n scanViewerContext.setState({ commentsVisible: false });\r\n }}\r\n >\r\n Close\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nScanComments.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(ScanComments));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport ScanMinimap from \"./ScanMinimap\";\r\nimport ScanComments from \"./ScanComments\";\r\nimport LinearProgress from \"@mui/material/LinearProgress\";\r\n\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n backgroundColor: \"#D3D3D3\",\r\n display: \"grid\",\r\n overflow: \"hidden\",\r\n gridTemplateRows: \"auto 1fr\",\r\n },\r\n mainStream: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n },\r\n imgStyle: {\r\n maxWidth: \"100%\",\r\n maxHeight: \"100%\",\r\n pointerEvents: \"none\",\r\n },\r\n minimapStream: {\r\n position: \"absolute\",\r\n left: 5,\r\n bottom: 5,\r\n border: \"3px solid white\",\r\n },\r\n progressBar: {\r\n height: 10,\r\n },\r\n});\r\n\r\nclass ScanRenderer extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n imageHash: Date.now(), // to reload stream,\r\n };\r\n\r\n this.mouseState = \"idle\";\r\n\r\n this.mainStreamRef = React.createRef();\r\n }\r\n\r\n /**\r\n * Handle mousewheel event\r\n * @param {ActionEvent} e Event when mousewheel is used\r\n */\r\n onMouseWheel = (e) => {\r\n if (e.deltaY > 0) {\r\n this.props.scanViewerContext.zoomOut();\r\n } else if (e.deltaY < 0) {\r\n this.props.scanViewerContext.zoomIn();\r\n }\r\n };\r\n /**\r\n * add eventlistener and initialize renderer size\r\n */\r\n componentDidMount() {\r\n window.onbeforeunload = () => {\r\n this.cleanup();\r\n };\r\n window.addEventListener(\"resize\", () => this.computeRendererSize());\r\n this.computeRendererSize();\r\n document\r\n .getElementById(\"scanMainStream\")\r\n .addEventListener(\"mousewheel\", this.onMouseWheel, true);\r\n }\r\n\r\n /**\r\n * cleanup and remove EventListener\r\n */\r\n componentWillUnmount() {\r\n this.cleanup();\r\n document\r\n .getElementById(\"scanMainStream\")\r\n .removeEventListener(\"mousewheel\", this.onMouseWheel, true);\r\n }\r\n\r\n cleanup() {\r\n window.removeEventListener(\"resize\", this.computeRendererSize);\r\n }\r\n\r\n /**\r\n * calculates height and width of renderer\r\n */\r\n computeRendererSize() {\r\n const w = this.mainStreamRef.current.clientWidth;\r\n const h = window.innerHeight - 64;\r\n this.props.scanViewerContext.setScanRendererSize(w, h);\r\n }\r\n\r\n /**\r\n * delete tile with right mouse click\r\n * @param {MouseEvent} e Mouse click\r\n */\r\n deleteAtMousePosition = (e) => {\r\n const parentRect = this.mainStreamRef.current.getBoundingClientRect();\r\n const x = e.clientX - parentRect.x;\r\n const y = e.clientY - parentRect.y;\r\n const center = [\r\n parseInt(parentRect.width / 2, 10),\r\n parseInt(parentRect.height / 2, 10),\r\n ];\r\n this.props.scanViewerContext.deleteTile(x - center[0], y - center[1]);\r\n };\r\n\r\n /**\r\n * if main (left) button and auxiliary (wheel) button pressed: move picture.\r\n * on secondary (right) button: delete tile\r\n * @param {MouseEvent} e When mouse is down\r\n */\r\n onMouseDown = (e) => {\r\n if (e.button === 0 || e.button === 1) {\r\n this.mouseState = \"translate\";\r\n } else if (e.button === 2) {\r\n this.mouseState = \"delete\";\r\n this.deleteAtMousePosition(e);\r\n }\r\n };\r\n\r\n /**\r\n * on mouse up: change mouseState to \"idle\"\r\n */\r\n onMouseUp = () => {\r\n this.mouseState = \"idle\";\r\n };\r\n\r\n /**\r\n * on mouse move: delete tiles or move Center of viewer\r\n * @param {ActionEvent} event\r\n */\r\n onMouseMove = (event) => {\r\n if (this.mouseState === \"translate\") {\r\n this.props.scanViewerContext.moveCenter(event.movementX, event.movementY);\r\n } else if (this.mouseState === \"delete\") {\r\n this.deleteAtMousePosition(event);\r\n }\r\n event.preventDefault(); // prevent image from being marked\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { sharpness, sharpnessBenchmark } = this.props.scanViewerContext;\r\n const { imageHash } = this.state;\r\n const mainStreamSrc =\r\n \"http://127.0.0.1:8051/api/scan/stream?stream_type=main\";\r\n const minimapStreamSrc =\r\n \"http://127.0.0.1:8051/api/scan/stream?stream_type=minimap\";\r\n return (\r\n
\r\n \r\n e.preventDefault()}\r\n className={classes.mainStream}\r\n onMouseDown={this.onMouseDown}\r\n onMouseMove={this.onMouseMove}\r\n onMouseUp={this.onMouseUp}\r\n onMouseLeave={this.onMouseUp}\r\n >\r\n \r\n
\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nScanRenderer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(ScanRenderer));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogContent,\r\n DialogTitle,\r\n List,\r\n ListItem,\r\n ListItemIcon,\r\n ListItemText,\r\n Tooltip,\r\n IconButton,\r\n TextField,\r\n FormControl,\r\n InputLabel,\r\n Select,\r\n MenuItem,\r\n DialogActions,\r\n Grid,\r\n Table,\r\n TableBody,\r\n TableRow,\r\n TableCell,\r\n} from \"@mui/material\";\r\n\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\n\r\nimport { Folder, ArrowUpward, Image } from \"@mui/icons-material\";\r\n\r\nconst styles = (theme) => ({\r\n root: {},\r\n selectFileButton: {\r\n width: \"100%\",\r\n },\r\n dialogTitle: {\r\n paddingBottom: 0,\r\n },\r\n listItem: {\r\n cursor: \"pointer\",\r\n },\r\n fileIcon: {\r\n color: theme.palette.primary.main,\r\n },\r\n upButton: {\r\n marginLeft: -12,\r\n },\r\n contentBox: {\r\n border: \"2px solid rgb(218, 218, 218)\",\r\n height: 500,\r\n overflowY: \"auto\",\r\n },\r\n resultFileRow: {\r\n display: \"grid\",\r\n overflow: \"hidden\",\r\n width: \"100%\",\r\n gridTemplateColumns: \"auto 1fr auto\",\r\n marginTop: 8,\r\n },\r\n folderPathText: {\r\n maxWidth: 200,\r\n lineHeight: \"60px\",\r\n marginRight: 5,\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n direction: \"rtl\",\r\n overflow: \"hidden\",\r\n },\r\n extensionDropDown: {\r\n marginTop: 8,\r\n marginLeft: 5,\r\n },\r\n dialogContent: {\r\n paddingTop: 0,\r\n width: 800,\r\n },\r\n});\r\n\r\n/**\r\n * dialog window for saving file\r\n */\r\nclass SelectFileDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n currentPath: \"\",\r\n inputIsValid: false,\r\n fileName: \"\",\r\n currentFiles: [],\r\n selectedExtension: props.fileFormats[0],\r\n };\r\n this.updateCurrentFiles(\"\");\r\n }\r\n\r\n /**\r\n * when Dialog window opens: update files and\r\n * check if filename already exists -> update num Time points\r\n * @param {object} prevProps\r\n */\r\n componentDidUpdate = (prevProps) => {\r\n // if Dialog Window opens:\r\n if (!prevProps.open && this.props.open) {\r\n // update Current Files\r\n this.updateCurrentFiles(this.state.currentPath, () => {\r\n // update num time points\r\n const file = this.state.currentFiles.filter((value) => {\r\n return value.path === this.state.fileName + \".hsasld\";\r\n });\r\n if (file.length > 0) {\r\n this.onListItemClick(file[0]);\r\n }\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * update visible files of selected folder\r\n * @param {String} path filepath\r\n * @param {func} callback callback\r\n */\r\n updateCurrentFiles = (path, callback) => {\r\n const { fileFormats } = this.props;\r\n Backend.walkDir(path, (result) => {\r\n if (fileFormats) {\r\n result = result.filter((entry) => {\r\n if (entry.type === \"directory\") return true;\r\n let pathParts = entry.path.split(\".\");\r\n let extension = pathParts[pathParts.length - 1].toLowerCase();\r\n if (fileFormats.indexOf(extension) < 0) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n });\r\n }\r\n this.setState({ currentFiles: result, currentPath: path }, callback);\r\n });\r\n };\r\n\r\n /**\r\n * if in directory, update folder, else update textfield when clicking on file\r\n * @param {Object} item\r\n */\r\n onListItemClick = (item) => {\r\n if (item.type === \"directory\") {\r\n this.updateCurrentFiles(item.path);\r\n } else {\r\n this.setState(\r\n {\r\n fileName: item.path\r\n .replace(/^.*[\\\\/]/, \"\")\r\n .split(\".\")\r\n .slice(0, -1)\r\n .join(\".\"),\r\n },\r\n () => {\r\n this.validateFilePath();\r\n }\r\n );\r\n }\r\n };\r\n\r\n /**\r\n * set filename state and validate filepath\r\n * @param {ActionEvent} e User input in textfield\r\n */\r\n onChangeFileName = (e) => {\r\n this.setState({ fileName: e.target.value }, () => {\r\n this.validateFilePath();\r\n });\r\n };\r\n\r\n /**\r\n * assemble [currentpath]/[filename].[extension] if currentpath is available.\r\n * Else: [filename].[extension]\r\n */\r\n validateFilePath = () => {\r\n let fullFilePath = \"\";\r\n if (this.state.currentPath === \"\") {\r\n fullFilePath = this.state.fileName + \".\" + this.state.selectedExtension;\r\n } else {\r\n fullFilePath =\r\n this.state.currentPath +\r\n \"/\" +\r\n this.state.fileName +\r\n \".\" +\r\n this.state.selectedExtension;\r\n }\r\n this.changeFilePath(fullFilePath);\r\n };\r\n\r\n /**\r\n * validate file path and check if file already exists. If so, get timepoints\r\n * @param {String} fullFilePath Filepath inkl currentPath\r\n */\r\n changeFilePath = (fullFilePath) => {\r\n this.props.scanViewerContext.setState({ fullFilePath });\r\n const pathParts = fullFilePath.split(\".\");\r\n const extension = pathParts[pathParts.length - 1].toLowerCase();\r\n const fileName = fullFilePath\r\n .replace(/^.*[\\\\/]/, \"\")\r\n .split(\".\")\r\n .slice(0, -1)\r\n .join(\".\");\r\n const inputIsValid = fileName !== \"\";\r\n this.setState({ inputIsValid });\r\n\r\n if (inputIsValid) {\r\n this.props.scanViewerContext.sendFilePath(fullFilePath);\r\n }\r\n\r\n if (extension === \"hsasld\") {\r\n Backend.getFileMetadata(fullFilePath, (result) => {\r\n if (result.sizeT) {\r\n this.setState({ numTimePoints: result.sizeT });\r\n } else {\r\n this.setState({ numTimePoints: 0 });\r\n }\r\n });\r\n }\r\n };\r\n\r\n render() {\r\n const { classes, fileFormats, open } = this.props;\r\n const {\r\n currentFiles,\r\n currentPath,\r\n selectedExtension,\r\n fileName,\r\n numTimePoints,\r\n inputIsValid,\r\n } = this.state;\r\n const { filePath } = this.props.scanViewerContext;\r\n return (\r\n \r\n this.props.onClose()}>\r\n \r\n Select Result WSI File\r\n \r\n \r\n
\r\n
\r\n {\"/\"}\r\n {currentPath}\r\n
\r\n \r\n \r\n Extension\r\n \r\n this.setState({ fileFormat: e.target.value })\r\n }\r\n >\r\n {fileFormats.map((fileFormat, idx) => {\r\n return (\r\n \r\n .{fileFormat}\r\n \r\n );\r\n })}\r\n \r\n \r\n
\r\n \r\n \r\n \r\n {currentPath !== \"\" && (\r\n \r\n \r\n \r\n {\r\n this.updateCurrentFiles(\r\n currentPath.substring(\r\n 0,\r\n currentPath.lastIndexOf(\"/\")\r\n )\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {currentFiles.map((item, idx) => {\r\n return (\r\n this.onListItemClick(item)}\r\n >\r\n \r\n {item.type === \"directory\" ? (\r\n \r\n ) : (\r\n \r\n
\r\n {\r\n \r\n }\r\n \r\n {item.path}\r\n
\r\n \r\n \r\n }\r\n >\r\n \r\n \r\n )}\r\n
\r\n \r\n {item.type === \"directory\" ? (\r\n
\r\n \r\n Full Path:{\" \"}\r\n
\r\n {item.path}\r\n \r\n ) : (\r\n
\r\n \r\n File Size:{\" \"}\r\n
\r\n {item.fileSize}\r\n
\r\n \r\n Creation Date:{\" \"}\r\n \r\n {item.creationTime}\r\n \r\n )}\r\n \r\n }\r\n >\r\n \r\n {item.path.replace(/^.*[\\\\/]/, \"\")}\r\n \r\n \r\n \r\n );\r\n })}\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n File Name:\r\n {this.state.fileName}\r\n \r\n \r\n Full Path:\r\n \r\n {this.state.currentPath +\r\n \"/\" +\r\n this.state.fileName +\r\n \".\" +\r\n this.state.selectedExtension}\r\n \r\n \r\n \r\n File Status:\r\n \r\n {numTimePoints > 0\r\n ? \"WSI File already exists\"\r\n : \"WSI File does not exist\"}\r\n \r\n \r\n {numTimePoints > 0 && (\r\n \r\n Time Points:\r\n {numTimePoints}\r\n \r\n )}\r\n \r\n Action on Save:\r\n \r\n {numTimePoints > 0\r\n ? \"Time Point \" +\r\n (numTimePoints + 1) +\r\n \" will be added\"\r\n : \"WSI File will be created\"}\r\n \r\n \r\n \r\n
\r\n {numTimePoints > 0 && (\r\n \r\n )}\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n this.props.onConfirm()}\r\n variant=\"contained\"\r\n >\r\n Confirm\r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nSelectFileDialog.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n fileFormats: PropTypes.array.isRequired,\r\n open: PropTypes.bool.isRequired,\r\n onClose: PropTypes.func.isRequired,\r\n onConfirm: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(SelectFileDialog));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { Tooltip, IconButton, Divider } from \"@mui/material\";\r\nimport {\r\n Save,\r\n Videocam,\r\n Map,\r\n GridOn,\r\n Pause,\r\n PlayArrow,\r\n RestartAlt,\r\n Redo,\r\n Undo,\r\n ZoomIn,\r\n ZoomOut,\r\n Comment,\r\n Flare,\r\n} from \"@mui/icons-material\";\r\nimport CustomSvgIcon from \"../../globalComponents/CustomSvgIcon\";\r\nimport { faExchangeAlt } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\nimport SelectFileDialog from \"./SelectFileDialog\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n height: \"100%\",\r\n display: \"grid\",\r\n overflow: \"hidden\",\r\n gridTemplateRows: \"1fr auto\",\r\n },\r\n toolbarButton: {\r\n width: 40,\r\n color: theme.palette.primary.inactive,\r\n },\r\n toolbarButtonActive: {\r\n width: 40,\r\n color: theme.palette.primary.main,\r\n },\r\n});\r\n\r\nclass ScanToolBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n fileDialogOpen: false,\r\n mapVisible: true,\r\n cameraVisible: true,\r\n gridVisible: false,\r\n commentsVisible: false,\r\n };\r\n window.addEventListener(\"keydown\", this.keyDown);\r\n }\r\n\r\n onSave = () => {\r\n this.setState({ fileDialogOpen: false });\r\n this.props.scanViewerContext.createWSI();\r\n };\r\n\r\n onPlayPause = () => {\r\n if (this.props.scanViewerContext.slideScanning) {\r\n if (!this.props.sidebarVisible) {\r\n this.props.onToggleSidebar();\r\n }\r\n this.props.scanViewerContext.changeScanState(\"scan_pause\");\r\n } else {\r\n if (this.props.sidebarVisible) {\r\n this.props.onToggleSidebar();\r\n }\r\n this.props.scanViewerContext.changeScanState(\"scan_start\");\r\n }\r\n };\r\n\r\n /**\r\n * Handle keyboard shortcuts\r\n * @param {ActionEvent} e Keyboard keys\r\n */\r\n keyDown = (e) => {\r\n let elem = null;\r\n if (e.ctrlKey) {\r\n switch (e.key) {\r\n case \"z\": //ctrl z\r\n elem = document.getElementById(\"undoButtonScanToolBar\");\r\n break;\r\n case \"y\": // ctrl y\r\n elem = document.getElementById(\"redoButtonScanToolBar\");\r\n break;\r\n case \"s\":\r\n elem = document.getElementById(\"saveButtonScanToolBar\");\r\n break;\r\n }\r\n } else if (e.shiftKey) {\r\n switch (e.key) {\r\n case \"*\":\r\n case \"+\": //shift +\r\n elem = document.getElementById(\"zoomInScanToolBar\");\r\n break;\r\n case \"_\":\r\n case \"-\": // shift -\r\n elem = document.getElementById(\"zoomOutScanToolBar\");\r\n break;\r\n case \"=\": //shift digit[0]\r\n elem = document.getElementById(\"zoomResetScanToolBar\");\r\n break;\r\n }\r\n } else if (e.key === \"Insert\") {\r\n //shift numpad[0]\r\n elem = document.getElementById(\"zoomResetScanToolBar\");\r\n } else {\r\n return;\r\n }\r\n if (elem !== null) {\r\n elem.click();\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n render() {\r\n const { classes, onToggleSidebar } = this.props;\r\n const {\r\n mapVisible,\r\n cameraVisible,\r\n gridVisible,\r\n commentsVisible,\r\n changeScanState,\r\n slideScanning,\r\n sideBarContent,\r\n } = this.props.scanViewerContext;\r\n const context = this.props.scanViewerContext;\r\n return (\r\n
\r\n
\r\n {slideScanning ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n changeScanState(\"scan_reset\")}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n this.setState({ fileDialogOpen: true })}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n this.setState({ fileDialogOpen: false })}\r\n fileFormats={[\"hsasld\"]}\r\n />\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nScanToolBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n onToggleSidebar: PropTypes.func.isRequired,\r\n sidebarVisible: PropTypes.bool,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(ScanToolBar));\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n Grid,\r\n FormControl,\r\n TextField,\r\n Typography,\r\n Slider,\r\n IconButton,\r\n} from \"@mui/material\";\r\n\r\nimport InfoIcon from \"@mui/icons-material/Info\";\r\n\r\nconst styles = {\r\n root: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto\",\r\n },\r\n sliderContainer: {\r\n margin: 0,\r\n width: \"100%\",\r\n marginTop: -16,\r\n },\r\n input: {\r\n width: 55,\r\n },\r\n iconButton: {\r\n height: 40,\r\n marginTop: 16,\r\n },\r\n};\r\n\r\nclass CustomSlider extends React.Component {\r\n render() {\r\n const { params, classes } = this.props;\r\n return (\r\n
\r\n
\r\n \r\n {params.label} \r\n \r\n \r\n {\r\n params.onSliderChange(e.target.value);\r\n }}\r\n onDoubleClick={params.onDoubleClick}\r\n onChangeCommitted={params.onSliderchangeComitted}\r\n />\r\n \r\n \r\n {\r\n params.onChange(parseFloat(e.target.value));\r\n }}\r\n type=\"number\"\r\n inputProps={{\r\n step: params.step,\r\n min: this.props.min,\r\n max: this.props.max,\r\n role: \"numberInput\",\r\n }}\r\n />\r\n \r\n \r\n \r\n
\r\n window.openWarningDialog(params.info)}\r\n >\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nCustomSlider.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n params: PropTypes.object.isRequired,\r\n min: PropTypes.number,\r\n max: PropTypes.number,\r\n};\r\n\r\nexport default withStyles(styles)(CustomSlider);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport { FormControl, InputLabel, Select, MenuItem } from \"@mui/material\";\r\n\r\nconst styles = {\r\n root: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto\",\r\n },\r\n sliderContainer: {\r\n margin: 0,\r\n width: \"100%\",\r\n marginTop: -16,\r\n },\r\n input: {\r\n width: 55,\r\n },\r\n iconButton: {\r\n height: 40,\r\n marginTop: 16,\r\n },\r\n};\r\n\r\nclass CustomSelector extends React.Component {\r\n render() {\r\n const { params, classes } = this.props;\r\n return (\r\n
\r\n \r\n {params.label}\r\n item.name === params.selectedValue)\r\n .name\r\n }\r\n onChange={(e) => params.onChange(e.target.value)}\r\n inputProps={{\r\n name: params.selectedValue,\r\n id: params.selectedValue,\r\n }}\r\n >\r\n {params.options.map((value) => (\r\n \r\n {value.label}\r\n \r\n ))}\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nCustomSelector.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n params: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(CustomSelector);\r\n","import React, { Component } from \"react\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\nimport CustomSlider from \"../../globalComponents/CustomSlider\";\r\nimport CustomSelector from \"../../globalComponents/CustomSelector\";\r\nimport {\r\n Button,\r\n Checkbox,\r\n FormControlLabel,\r\n FormGroup,\r\n IconButton,\r\n // TextField, // for DEBUG\r\n} from \"@mui/material\";\r\n\r\nimport { PlayArrow, Stop, Info } from \"@mui/icons-material\";\r\n\r\nconst styles = {\r\n root: {\r\n padding: 20,\r\n height: \"100%\",\r\n overflowY: \"auto\",\r\n },\r\n OpticsRow: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto auto\",\r\n width: \"100%\",\r\n marginTop: 10,\r\n },\r\n OpticsSelector: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr 1fr\",\r\n width: \"100%\",\r\n },\r\n vignetteRow: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto auto\",\r\n width: \"100%\",\r\n marginTop: 10,\r\n marginBottom: 10,\r\n },\r\n recordButton: {\r\n lineHeight: \"30px\",\r\n },\r\n checkboxLabel: {\r\n margin: \"0px !important\",\r\n },\r\n textfieldNumber: {\r\n width: \"90px\",\r\n },\r\n featurePointRow: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto auto\",\r\n width: \"100%\",\r\n marginTop: 15,\r\n },\r\n infoButton: {\r\n height: 40,\r\n marginTop: 16,\r\n },\r\n};\r\n\r\n/**\r\n * Class to render Camera Settings, read them and send them to backend\r\n */\r\nclass ScanMicroscopeSettings extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n activeTab: 0,\r\n vignetteState: \"\",\r\n // checkedFeaturePoint: false, // for DEBUG\r\n // numFeaturePoints: 3, // for DEBUG\r\n };\r\n\r\n // sets the colors (RGB) to the chosen white balance\r\n this.lightSourceParams = {\r\n label: \"Light Source\",\r\n selectedValue: \"Daylight6500K\",\r\n info: [\r\n \"Sets the light source preset.\",\r\n \"The colors in the image will be corrected so that they are appropriate for the selected light source.\",\r\n ],\r\n options: [\r\n {\r\n name: \"Off\",\r\n label: \"Off\",\r\n },\r\n {\r\n name: \"Daylight5000K\",\r\n label: \"Daylight (5000 Kelvin)\",\r\n },\r\n {\r\n name: \"Daylight6500K\",\r\n label: \"Daylight (6500 Kelvin)\",\r\n },\r\n {\r\n name: \"Tungsten2800K\",\r\n label: \"Tungsten (2800 Kelvin)\",\r\n },\r\n ],\r\n onChange: (value) => {\r\n this.lightSourceParams.selectedValue = value;\r\n if (value === \"Off\") {\r\n this.sliderParams.red.value = 1.0;\r\n this.sliderParams.green.value = 1.0;\r\n this.sliderParams.blue.value = 1.0;\r\n } else if (value === \"Daylight5000K\") {\r\n this.sliderParams.red.value = 1.57349;\r\n this.sliderParams.green.value = 1.0;\r\n this.sliderParams.blue.value = 2.2749;\r\n } else if (value === \"Daylight6500K\") {\r\n this.sliderParams.red.value = 1.82056;\r\n this.sliderParams.green.value = 1.0;\r\n this.sliderParams.blue.value = 1.94189;\r\n } else if (value === \"Tungsten2800K\") {\r\n this.sliderParams.red.value = 1.06372;\r\n this.sliderParams.green.value = 1.0;\r\n this.sliderParams.blue.value = 4.17261;\r\n }\r\n this.forceUpdate();\r\n this.sendParams();\r\n },\r\n };\r\n\r\n this.lenseParams = {\r\n label: \"Lense Type\",\r\n selectedValue: \"40x\",\r\n options: [\r\n {\r\n name: \"4x\",\r\n label: \"4x\",\r\n },\r\n {\r\n name: \"10x\",\r\n label: \"10x\",\r\n },\r\n {\r\n name: \"20x\",\r\n label: \"20x\",\r\n },\r\n {\r\n name: \"40x\",\r\n label: \"40x\",\r\n },\r\n {\r\n name: \"100x\",\r\n label: \"100x\",\r\n },\r\n ],\r\n onChange: (value) => {\r\n this.lenseParams.selectedValue = value;\r\n this.forceUpdate();\r\n this.sendParams();\r\n },\r\n };\r\n this.adapterParams = {\r\n label: \"Adapter Type\",\r\n selectedValue: \"0.65x\",\r\n options: [\r\n {\r\n name: \"0.65x\",\r\n label: \"0.65x\",\r\n },\r\n {\r\n name: \"1x\",\r\n label: \"None\",\r\n },\r\n ],\r\n onChange: (value) => {\r\n this.adapterParams.selectedValue = value;\r\n this.forceUpdate();\r\n this.sendParams();\r\n },\r\n };\r\n this.sliderParams = {\r\n frameRate: {\r\n type: \"Slider\",\r\n label: \"Frame Rate\",\r\n info: [\r\n \"Acquisition frame rate of the camera in frames per second.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 30,\r\n minKey: \"cameraMinFramerate\",\r\n maxKey: \"cameraMaxFramerate\",\r\n step: 1,\r\n standardValue: 30,\r\n },\r\n exposureTime: {\r\n type: \"Slider\",\r\n label: \"Exposure Time\",\r\n info: [\r\n \"Value of the shutter speed the camera uses.\",\r\n \"The higher the shutter speed, the darker the image \",\r\n ],\r\n value: 250,\r\n minKey: \"cameraMinExposureTime\",\r\n maxKey: \"cameraMaxExposureTime\",\r\n standardValue: 250,\r\n },\r\n gain: {\r\n type: \"Slider\",\r\n label: \"Gain\",\r\n info: [\r\n \"Value of the currently selected gain in dB.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 0.1,\r\n minKey: \"cameraMinGain\",\r\n maxKey: \"cameraMaxGain\",\r\n step: 0.1,\r\n standardValue: 0.1,\r\n },\r\n gamma: {\r\n type: \"Slider\",\r\n label: \"Gamma\",\r\n info: [\r\n \"Gamma correction to be applied.\",\r\n \"Gamma correction allows you to optimize the brightness of acquired images for display on a monitor.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 1.0,\r\n minKey: \"cameraMinGamma\",\r\n maxKey: \"cameraMaxGamma\",\r\n step: 0.01,\r\n standardValue: 1.0,\r\n },\r\n blackValue: {\r\n type: \"Slider\",\r\n label: \"Black Value\",\r\n info: [\r\n \"Black level value to be applied to the currently selected sensor tap.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 0,\r\n minKey: \"cameraMinBlackValue\",\r\n maxKey: \"cameraMaxBlackValue\",\r\n step: 0.1,\r\n standardValue: 0,\r\n },\r\n red: {\r\n type: \"Slider\",\r\n label: \"Red\",\r\n info: [\r\n \"Sets the light source preset.\",\r\n \"The colors in the image will be corrected so that they are appropriate for the red light source.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 1.82,\r\n minKey: \"cameraColorMin\",\r\n maxKey: \"cameraColorMax\",\r\n step: 0.01,\r\n },\r\n green: {\r\n type: \"Slider\",\r\n label: \"Green\",\r\n info: [\r\n \"Sets the light source preset.\",\r\n \"The colors in the image will be corrected so that they are appropriate for the green light source.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 1.0,\r\n minKey: \"cameraColorMin\",\r\n maxKey: \"cameraColorMax\",\r\n step: 0.01,\r\n },\r\n blue: {\r\n type: \"Slider\",\r\n label: \"Blue\",\r\n info: [\r\n \"Sets the light source preset.\",\r\n \"The colors in the image will be corrected so that they are appropriate for the blue light source.\",\r\n \"Double click to reset value to default.\",\r\n ],\r\n value: 1.94,\r\n minKey: \"cameraColorMin\",\r\n maxKey: \"cameraColorMax\",\r\n step: 0.01,\r\n },\r\n };\r\n\r\n this.sharpnessBenchmark = {\r\n type: \"Slider\",\r\n label: \"Image Sharpness Benchmark\",\r\n info: [\r\n \"Sets the benchmark for evaluating how much in focus the image is.\",\r\n \"If the sharpness value is below the benchmark the image will not be stitched.\",\r\n \"It is possible that the image cannot be stitched when the sharpness is too low.\",\r\n \"So do not set the benchmark too low!\",\r\n ],\r\n value: 80,\r\n min: 0,\r\n max: 100,\r\n standardValue: 80,\r\n onChange: (value) => {\r\n this.sharpnessBenchmark.value = value;\r\n this.props.scanViewerContext.setState({\r\n sharpnessBenchmark: this.sharpnessBenchmark.value,\r\n });\r\n this.forceUpdate();\r\n this.sendParams();\r\n },\r\n onSliderChange: (value) => {\r\n this.sharpnessBenchmark.value = value;\r\n this.props.scanViewerContext.setState({\r\n sharpnessBenchmark: this.sharpnessBenchmark.value,\r\n });\r\n this.forceUpdate();\r\n this.sendParams();\r\n },\r\n onDoubleClick: () => {\r\n this.sharpnessBenchmark.value = this.sharpnessBenchmark.standardValue;\r\n this.props.scanViewerContext.setState({\r\n sharpnessBenchmark: this.sharpnessBenchmark.value,\r\n });\r\n this.forceUpdate();\r\n this.sendParams();\r\n },\r\n };\r\n\r\n this.sendParams();\r\n }\r\n /**\r\n * create json with important values and send to backend\r\n */\r\n sendParams() {\r\n let paramJson = {\r\n lightSource: this.lightSourceParams.selectedValue,\r\n lense: this.lenseParams.selectedValue,\r\n adapter: this.adapterParams.selectedValue,\r\n sharpnessBenchmark: this.sharpnessBenchmark.value,\r\n pixelSizeCamera: this.props.scanViewerContext.pixelSizeCamera,\r\n };\r\n for (const [key, value] of Object.entries(this.sliderParams)) {\r\n paramJson[key] = value.value;\r\n }\r\n // Backend.configureMicroscopeCamera(paramJson);\r\n this.props.scanViewerContext.changeMicroscopeParams(paramJson);\r\n }\r\n\r\n render() {\r\n const { classes, scanViewerContext } = this.props;\r\n const {\r\n vignetteState,\r\n // checkedFeaturePoint, numFeaturePoints // for DEBUG\r\n } = this.state;\r\n return (\r\n
\r\n

Settings

\r\n {/* not in use at the moment */}\r\n {/* */}\r\n {Object.entries(this.sliderParams).map(([key, value], idx) => {\r\n let params = value;\r\n params.onChange = (value) => {\r\n this.sliderParams[key].value = value;\r\n this.forceUpdate();\r\n if (\r\n value >= scanViewerContext[params.minKey] &&\r\n value <= scanViewerContext[params.maxKey]\r\n ) {\r\n params.error = false;\r\n this.sendParams();\r\n } else {\r\n params.error = true;\r\n }\r\n };\r\n params.onSliderChange = (value) => {\r\n this.sliderParams[key].value = value;\r\n this.forceUpdate();\r\n this.sendParams();\r\n };\r\n params.onDoubleClick = () => {\r\n if (this.sliderParams[key].label === \"Red\") {\r\n switch (this.lightSourceParams.selectedValue) {\r\n case \"Off\":\r\n this.sliderParams[key].value = 1.0;\r\n break;\r\n case \"Daylight5000K\":\r\n this.sliderParams[key].value = 1.57349;\r\n break;\r\n case \"Daylight6500K\":\r\n this.sliderParams[key].value = 1.82056;\r\n break;\r\n case \"Tungsten2800K\":\r\n this.sliderParams[key].value = 1.06372;\r\n break;\r\n }\r\n } else if (this.sliderParams[key].label === \"Green\") {\r\n this.sliderParams[key].value = 1.0;\r\n } else if (this.sliderParams[key].label === \"Blue\") {\r\n switch (this.lightSourceParams.selectedValue) {\r\n case \"Off\":\r\n this.sliderParams[key].value = 1.0;\r\n break;\r\n case \"Daylight5000K\":\r\n this.sliderParams[key].value = 2.2749;\r\n break;\r\n case \"Daylight6500K\":\r\n this.sliderParams[key].value = 1.94189;\r\n break;\r\n case \"Tungsten2800K\":\r\n this.sliderParams[key].value = 4.17261;\r\n break;\r\n }\r\n } else {\r\n this.sliderParams[key].value =\r\n this.sliderParams[key].standardValue;\r\n }\r\n this.forceUpdate();\r\n this.sendParams();\r\n };\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n window.openWarningDialog([\r\n \"Set the used lense and adapter magnification.\",\r\n \"These values are important for the Scanner to behave correctly.\",\r\n ])\r\n }\r\n >\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n {\r\n const value =\r\n vignetteState === \"ready\" ? \"filtering\" : \"ready\";\r\n scanViewerContext.setVignetteState(value);\r\n this.setState({ vignetteState: value });\r\n }}\r\n />\r\n }\r\n label=\"Filter Vignette\"\r\n />\r\n \r\n {\r\n const value =\r\n vignetteState === \"\" || vignetteState === \"ready\"\r\n ? \"recording\"\r\n : \"ready\";\r\n scanViewerContext.setVignetteState(value);\r\n this.setState({ vignetteState: value });\r\n }}\r\n >\r\n {vignetteState === \"recording\" ? : }{\" \"}\r\n {vignetteState === \"recording\"\r\n ? \"Stop Recording\"\r\n : \"Record Vignette\"}\r\n \r\n \r\n window.openWarningDialog([\r\n \"To filter the vignette, a vignette must be recorded first:\",\r\n \"1. Navigate to a mostly white position.\",\r\n \"2. Record Vignette.\",\r\n \"3. Navigate around until shown vignette is not changing anymore.\",\r\n \"4. Stop Recording.\",\r\n \"5. Filter Vignette is now possible.\",\r\n ])\r\n }\r\n >\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n {/* for DEBUG use: */}\r\n {/*
\r\n \r\n {\r\n const checked = e.target.checked;\r\n this.setState({ checkedFeaturePoint: checked });\r\n scanViewerContext.setFeaturePointsState(\r\n checked,\r\n numFeaturePoints\r\n );\r\n }}\r\n />\r\n }\r\n label=\"Show Feature Points\"\r\n />\r\n \r\n\r\n {\r\n const numberFeaturePoints = e.target.value;\r\n this.setState({ numFeaturePoints: numberFeaturePoints });\r\n scanViewerContext.setFeaturePointsState(\r\n checkedFeaturePoint,\r\n numberFeaturePoints\r\n );\r\n }}\r\n />\r\n\r\n \r\n window.openWarningDialog([\r\n \"Activates feature points and sets the number of feature points to be displayed.\",\r\n \"Feature points are points, that the computer uses for orientation. The Scanner needs them to compare the position of different images.\",\r\n \"This function is mainly for development use.\",\r\n ])\r\n }\r\n >\r\n \r\n \r\n
*/}\r\n
\r\n );\r\n }\r\n}\r\n\r\nScanMicroscopeSettings.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withScanViewerContext(\r\n withStyles(styles)(ScanMicroscopeSettings)\r\n);\r\n","import React, { Component } from \"react\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport PropTypes from \"prop-types\";\r\nimport {\r\n Typography,\r\n TextField,\r\n Tooltip,\r\n IconButton,\r\n List,\r\n ListItem,\r\n ListItemButton,\r\n Button,\r\n} from \"@mui/material\";\r\nimport { withScanViewerContext } from \"../contexts/ScanViewerContext\";\r\nimport SketchColorPicker from \"../../viewer/components/SketchColorPicker\";\r\nimport { Add, Delete } from \"@mui/icons-material\";\r\nimport { getRandomColor } from \"../../viewer/utils/RandomColorGenerator\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n padding: 20,\r\n height: \"100%\",\r\n overflowY: \"auto\",\r\n },\r\n ChannelTextField: {\r\n paddingBottom: 0,\r\n paddingTop: 0,\r\n paddingLeft: 0,\r\n width: 345,\r\n },\r\n buttonSelected: {\r\n width: \"100%\",\r\n color: \"black\",\r\n background: theme.palette.selected.main,\r\n borderRadius: 0,\r\n },\r\n buttonUnselected: {\r\n width: \"100%\",\r\n color: \"black\",\r\n borderRadius: 0,\r\n background: \"white\",\r\n },\r\n listItemSelected: {\r\n background: theme.palette.selected.main,\r\n },\r\n listItemUnselected: {\r\n background: \"white\",\r\n },\r\n});\r\n\r\n/**\r\n * class to render fluorescence card and handle interaction\r\n */\r\nclass ScanFluorescence extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n channelName: \"\",\r\n selectedIndex: -1,\r\n };\r\n }\r\n addChannel = () => {\r\n const newItem = {\r\n label: this.state.channelName,\r\n color: getRandomColor(),\r\n };\r\n this.props.scanViewerContext.channels.push(newItem);\r\n this.sendParams(\"add_fl_channel\");\r\n this.setState({ channelName: \"\" });\r\n this.setState({\r\n selectedIndex: this.props.scanViewerContext.channels.length - 1,\r\n });\r\n };\r\n\r\n selectChannel = (index) => {\r\n this.setState({ selectedIndex: index }, () => {\r\n this.sendParams(\"change_fl_channel\");\r\n });\r\n };\r\n\r\n deleteChannel = (channel, index) => {\r\n window.openResponseDialog(\r\n \"Do you really want to delete \" + channel.label + \"?\",\r\n (response) => {\r\n if (response) {\r\n this.props.scanViewerContext.channels.splice(index, 1);\r\n this.sendParams(\"delete_fl_channel\");\r\n this.setState({\r\n selectedIndex: this.props.scanViewerContext.channels.length - 1,\r\n });\r\n }\r\n }\r\n );\r\n };\r\n\r\n sendParams = (state) => {\r\n let paramJson = {\r\n state: state,\r\n selectedChannel: this.state.selectedIndex,\r\n channels: this.props.scanViewerContext.channels,\r\n };\r\n this.props.scanViewerContext.updateFluorescenceParams(paramJson);\r\n };\r\n\r\n render() {\r\n const { selectedIndex, channelName } = this.state;\r\n const { classes } = this.props;\r\n\r\n return (\r\n
\r\n

Scans

\r\n this.selectChannel(-1)}\r\n >\r\n Brightfield\r\n \r\n \r\n {\"Channels (\" + this.props.scanViewerContext.channels.length + \"):\"}\r\n \r\n \r\n {this.props.scanViewerContext.channels.map((channel, index) => (\r\n this.selectChannel(index)}\r\n >\r\n {\r\n channel.label = e.target.value;\r\n this.forceUpdate();\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" && e.target.value !== \"\") {\r\n channel.label = e.target.value;\r\n this.forceUpdate();\r\n }\r\n }}\r\n />\r\n {\r\n channel.color = color;\r\n this.forceUpdate();\r\n }}\r\n />\r\n \r\n {\r\n this.deleteChannel(channel, index);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n {\r\n this.setState({ channelName: e.target.value });\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" && channelName !== \"\") {\r\n this.addChannel();\r\n }\r\n }}\r\n />\r\n \r\n \r\n {\r\n this.addChannel();\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nScanFluorescence.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(ScanFluorescence));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport ScanRenderer from \"./components/ScanRenderer\";\r\nimport ScanToolBar from \"./components/ScanToolBar\";\r\nimport ScanMicroscopeSettings from \"./components/ScanMicroscopeSettings\";\r\nimport { withScanViewerContext } from \"./contexts/ScanViewerContext\";\r\nimport ScanFluorescence from \"./components/ScanFluorescence\";\r\n\r\nconst styles = {\r\n root: {\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n width: \"100%\",\r\n height: \"calc(100% - 64px)\",\r\n display: \"grid\",\r\n },\r\n rendererContainer: {\r\n background: \"d3d3d3\",\r\n },\r\n toolBarContainer: {\r\n background: \"white\",\r\n borderLeft: \"5px solid #ebebeb\",\r\n borderRight: \"5px solid #ebebeb\",\r\n },\r\n sideBarContainer: {\r\n background: \"#fffff\",\r\n overflow: \"hidden\",\r\n },\r\n};\r\n\r\nclass ScanViewer extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n sidebarVisible: true,\r\n };\r\n }\r\n\r\n onToggleSidebar = () => {\r\n if (this.state.sidebarVisible) {\r\n const w = this.props.scanViewerContext.w + 436;\r\n const h = this.props.scanViewerContext.h;\r\n this.props.scanViewerContext.setScanRendererSize(w, h);\r\n } else {\r\n const w = this.props.scanViewerContext.w - 436;\r\n const h = this.props.scanViewerContext.h;\r\n this.props.scanViewerContext.setScanRendererSize(w, h);\r\n }\r\n this.setState({ sidebarVisible: !this.state.sidebarVisible });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { streamReady, sideBarContent } = this.props.scanViewerContext;\r\n return (\r\n \r\n
\r\n {streamReady && }\r\n
\r\n
\r\n \r\n
\r\n
\r\n {sideBarContent === \"fluorescence\" ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nScanViewer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n scanViewerContext: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withScanViewerContext(withStyles(styles)(ScanViewer));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nimport Backend from \"../common/utils/Backend\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport Datasheet from \"react-datasheet\";\r\nimport \"react-datasheet/lib/react-datasheet.css\";\r\n\r\nimport XLSX from \"xlsx\";\r\nimport { Button, Tabs, Tab, Paper } from \"@mui/material\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n width: \"100%\",\r\n height: \"calc(100% - 64px)\",\r\n \"& .data-editor\": {\r\n height: \"24px !important\",\r\n boxSizing: \"border-box !important\",\r\n },\r\n \"& .value-viewer\": {\r\n padding: \"0 10px !important\",\r\n },\r\n display: \"grid\",\r\n gridTemplateRows: \"auto auto 1fr\",\r\n overflow: \"hidden\",\r\n },\r\n resultTabContent: {\r\n height: \"100%\",\r\n overflowY: \"auto\",\r\n },\r\n});\r\n\r\nclass Report extends Component {\r\n _isMounted = false;\r\n state = {\r\n activeTab: 0,\r\n settings: { tempPath: \"\" },\r\n project: undefined,\r\n charts: [],\r\n };\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n componentDidMount() {\r\n this._isMounted = true;\r\n const chartFolderPath = \"/\" + this.props.id + \"/charts/\";\r\n Backend.walkProjectDirFiles(chartFolderPath, (charts) => {\r\n this.setMountedState({ charts });\r\n });\r\n\r\n Backend.loadProject(\r\n {\r\n id: this.props.id,\r\n },\r\n (project) => {\r\n this.setMountedState({ project: project });\r\n window.setNavigationbarTitle(\r\n `Results: ${project.name} (${project.viewerConfig.project.label})`\r\n );\r\n }\r\n );\r\n\r\n let download_path = Backend.downloadReport(this.props.id);\r\n let url = window.location.origin + download_path;\r\n\r\n /* set up async GET request */\r\n let req = new XMLHttpRequest();\r\n req.open(\"GET\", url, true);\r\n req.responseType = \"arraybuffer\";\r\n\r\n req.onload = () => {\r\n let data = new Uint8Array(req.response);\r\n let workbook = XLSX.read(data, { type: \"array\" });\r\n\r\n if (\r\n workbook.SheetNames.length === 1 &&\r\n workbook.SheetNames[0] === \"Sheet1\" &&\r\n workbook.Sheets.Sheet1.A1.v.toLowerCase().startsWith(\"error\")\r\n ) {\r\n window.showErrorSnackbar(workbook.Sheets.Sheet1.A1.v);\r\n }\r\n\r\n let sheets = workbook.SheetNames.map((sheet_name) =>\r\n XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name], {\r\n header: 1,\r\n raw: true,\r\n })\r\n );\r\n for (let i = 0; i < sheets.length; i++) {\r\n for (let j = 0; j < sheets[i].length; j++) {\r\n for (let k = 0; k < sheets[i][j].length; k++) {\r\n if (typeof sheets[i][j][k] === \"undefined\") {\r\n sheets[i][j][k] = \"\";\r\n }\r\n }\r\n }\r\n }\r\n const abc = [...Array(26)].map((val, i) => String.fromCharCode(i + 65));\r\n sheets = sheets.map((sheet) => {\r\n let rowLength = 0;\r\n let lastContentIdx = 0;\r\n for (let i = 0; i < sheet.length; i++) {\r\n if (sheet[i].length > 0) lastContentIdx = i;\r\n if (sheet[i].length > rowLength) rowLength = sheet[i].length;\r\n }\r\n sheet = sheet.filter((item, idx) => idx <= lastContentIdx);\r\n return sheet.map((row) => {\r\n row = row.map((cell) => {\r\n if (typeof cell === \"number\") {\r\n // if (sheet[0][i] && sheet[0][i].includes(\"%\")) {\r\n // cell *= 100;\r\n // }\r\n if (cell % 1 > 0 && cell < 1) {\r\n cell = cell.toFixed(6);\r\n } else if (cell % 1 > 0) {\r\n // Check if float precision exists\r\n cell = cell.toFixed(2);\r\n }\r\n } else if (\r\n typeof cell === \"string\" &&\r\n cell.includes(\"Ausreißer ignorieren\")\r\n ) {\r\n cell = \"\";\r\n }\r\n return { value: cell };\r\n });\r\n while (row.length < rowLength) {\r\n row.push({ value: \"\" });\r\n }\r\n return row;\r\n });\r\n });\r\n for (let sheet of sheets) {\r\n let addRow = new Array(sheet[0].length);\r\n addRow = sheet[0].map((v, i) => {\r\n return { value: abc[i], readOnly: true };\r\n });\r\n sheet = sheet.unshift(addRow);\r\n }\r\n for (let sheet of sheets) {\r\n for (let [index, row] of sheet.entries()) {\r\n row = row.unshift({\r\n value: index === 0 ? \"\" : index,\r\n readOnly: true,\r\n });\r\n }\r\n }\r\n\r\n this.setMountedState({\r\n workbook: workbook,\r\n array_sheets: sheets,\r\n });\r\n };\r\n\r\n req.send();\r\n }\r\n handleChange = (event, value) => {\r\n this.setMountedState({ activeTab: value });\r\n };\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n
\r\n
\r\n \r\n Download Excel File\r\n \r\n \r\n (All Excel files are saved here: {this.state.settings.tempPath}\r\n reports/)\r\n \r\n
\r\n \r\n {this.state.workbook &&\r\n this.state.workbook.SheetNames.map((tab_name, index) => (\r\n \r\n ))}\r\n {this.state.charts.length > 0 && }\r\n \r\n
\r\n {this.state.array_sheets &&\r\n this.state.array_sheets.map((array_sheet, index) => (\r\n \r\n \r\n cell.value}\r\n onCellsChanged={() => {\r\n return;\r\n }}\r\n overflow=\"clip\"\r\n />\r\n \r\n
\r\n ))}\r\n {this.state.array_sheets && (\r\n \r\n \r\n {this.state.charts.map((chart, idx) => (\r\n \r\n ))}\r\n \r\n
\r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nReport.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n id: PropTypes.string,\r\n history: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(Report));\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Route, Redirect } from \"react-router-dom\";\r\n\r\nimport { authenticationService } from \"../services\";\r\n\r\nconst PrivateRoute = ({ component: Component, roles, ...rest }) => (\r\n {\r\n const currentUser = authenticationService.currentUserValue;\r\n if (!currentUser) {\r\n // not logged in so redirect to login page with the return url\r\n return (\r\n \r\n );\r\n }\r\n\r\n // check if route is restricted by role\r\n if (roles && roles.indexOf(currentUser.role) === -1) {\r\n // role not authorised so redirect to home page\r\n return ;\r\n }\r\n\r\n // authorised so return component\r\n return ;\r\n }}\r\n />\r\n);\r\n\r\nPrivateRoute.propTypes = {\r\n component: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),\r\n roles: PropTypes.array,\r\n location: PropTypes.string,\r\n};\r\n\r\nexport { PrivateRoute };\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n//import { userService } from \"../../common/services\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\nimport {\r\n TextField,\r\n Typography,\r\n CardActions,\r\n Button,\r\n Card,\r\n CardContent,\r\n Tooltip,\r\n} from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = {\r\n root: {\r\n flexGrow: 1,\r\n width: \"100%\",\r\n height: \"calc(100vh - 64px - 48px)\",\r\n overflow: \"hidden\",\r\n },\r\n paper: {\r\n padding: 20,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n },\r\n};\r\n\r\nclass SystemContainer extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n os: \"Windows\",\r\n settings: null,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n Backend.getLicensingInfo((result) => {\r\n let os = result.os;\r\n this.setState({ os: os });\r\n });\r\n Backend.readAppSettings((data) => {\r\n this.setState({ settings: data });\r\n });\r\n }\r\n\r\n onChangeMetaData = (field, e) => {\r\n const { settings } = this.state;\r\n settings[field] = e;\r\n this.setState({ settings });\r\n };\r\n\r\n saveClick = () => {\r\n // Check if contains Backslashes and replaces them\r\n // Also adds forward slash at the end if not contains\r\n const { settings } = this.state;\r\n const { storagePath, tempPath, galleryOutputPath } = settings;\r\n\r\n let collection = [storagePath, tempPath, galleryOutputPath];\r\n for (var [i, e] of collection.entries()) {\r\n e = e.replace(/\\\\/g, \"/\");\r\n while (e.includes(\"//\")) {\r\n e = e.replace(\"//\", \"/\");\r\n }\r\n if (!e.endsWith(\"/\")) {\r\n e = e + \"/\";\r\n }\r\n collection[i] = e;\r\n }\r\n settings[\"storagePath\"] = collection[0];\r\n settings[\"tempPath\"] = collection[1];\r\n settings[\"galleryOutputPath\"] = collection[2];\r\n\r\n this.setState(settings);\r\n\r\n Backend.writeAppSettings(this.state.settings, (data) => {\r\n console.log(data);\r\n });\r\n window.location.reload();\r\n };\r\n\r\n deleteTempFilesClick = () => {\r\n window.openResponseDialog(\r\n \"Delete temporary files folder? Imported files have to be imported again. Projects will not be affected.\",\r\n (response) => {\r\n if (response) {\r\n this.props.spinloader.show();\r\n Backend.deleteTempFiles((result) => {\r\n this.props.spinloader.hide();\r\n if (result.success) {\r\n if (result.deleted) {\r\n window.showSuccessSnackbar(\"Temp files folder deleted!\");\r\n } else {\r\n window.showWarningSnackbar(\"No femp files folder found!\");\r\n }\r\n } else {\r\n window.showErrorSnackbar(\"Temp files folder deleting failed!\");\r\n }\r\n });\r\n }\r\n }\r\n );\r\n };\r\n\r\n render() {\r\n //const { classes } = this.props;\r\n const { settings } = this.state;\r\n return (\r\n \r\n \r\n System Actions\r\n \r\n {this.state.os === \"Windows\" && (\r\n System Settings\r\n )}\r\n {this.state.os === \"Windows\" &&\r\n settings &&\r\n Object.keys(settings)\r\n .filter(\r\n (metaField) =>\r\n !(\r\n metaField === \"schedulerStart\" ||\r\n metaField === \"schedulerEnd\"\r\n )\r\n )\r\n .map((metaField) => (\r\n \r\n this.onChangeMetaData(metaField, e.target.value)\r\n }\r\n />\r\n ))}\r\n
\r\n
\r\n Job Scheduler\r\n
\r\n\r\n {settings && (\r\n \r\n {\r\n settings.schedulerStart = e.target.value;\r\n }}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n inputProps={{\r\n step: 300, // 5 min\r\n }}\r\n />\r\n \r\n )}\r\n\r\n \r\n {settings && (\r\n \r\n {\r\n settings.schedulerEnd = e.target.value;\r\n }}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n inputProps={{\r\n step: 300, // 5 min\r\n }}\r\n />\r\n \r\n )}\r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nSystemContainer.propTypes = {\r\n spinloader: PropTypes.object,\r\n};\r\n\r\nexport default withSpinloader(withStyles(styles)(SystemContainer));\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n//import { userService } from \"../../common/services\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport {\r\n IconButton,\r\n TableRow,\r\n TableCell,\r\n TableHead,\r\n Table,\r\n TableBody,\r\n Button,\r\n Card,\r\n CardContent,\r\n Typography,\r\n CardActions,\r\n Tooltip,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n TextField,\r\n DialogActions,\r\n MenuItem,\r\n} from \"@mui/material\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { Delete, Edit } from \"@mui/icons-material\";\r\n\r\nconst styles = {\r\n paper: {\r\n padding: 20,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n },\r\n};\r\n\r\nclass UserDetailsDialog extends React.Component {\r\n state = { user: null };\r\n componentDidUpdate(prevProps) {\r\n // dialog open\r\n if (this.props.open !== prevProps.open && this.props.open) {\r\n this.setState({ user: JSON.parse(JSON.stringify(this.props.user)) });\r\n }\r\n }\r\n\r\n onChange = (e) => {\r\n const { user } = this.state;\r\n user[e.target.name] = e.target.value;\r\n this.setState({ user });\r\n };\r\n\r\n render() {\r\n const { open, onClose, onApply, create } = this.props;\r\n const { user } = this.state;\r\n return (\r\n \r\n User Details\r\n {user && (\r\n \r\n \r\n \r\n \r\n \r\n Standard User\r\n Admin\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nUserDetailsDialog.propTypes = {\r\n open: PropTypes.bool,\r\n user: PropTypes.string,\r\n onClose: PropTypes.func,\r\n onApply: PropTypes.func,\r\n create: PropTypes.bool,\r\n};\r\n\r\nclass UsersContainer extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n users: null,\r\n userDetails: null,\r\n create: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n Backend.loadUserList((data) => {\r\n this.setState({ users: data });\r\n });\r\n }\r\n\r\n onUserEdit = (e) => {\r\n if (this.state.create) {\r\n Backend.createUser(e, () => {\r\n Backend.loadUserList((data) => {\r\n this.setState({ users: data });\r\n });\r\n });\r\n } else {\r\n Backend.updateUser(e, () => {\r\n Backend.loadUserList((data) => {\r\n this.setState({ users: data });\r\n });\r\n });\r\n }\r\n this.setState({ userDetails: null, create: false });\r\n };\r\n\r\n deleteUser = (id) => {\r\n window.openResponseDialog(\"Delete user forever?\", (response) => {\r\n if (response) {\r\n Backend.deleteUser(id, () => {\r\n Backend.loadUserList((data) => {\r\n this.setState({ users: data });\r\n });\r\n });\r\n }\r\n });\r\n };\r\n\r\n newUserClick = () => {\r\n this.setState({\r\n userDetails: {\r\n email: \"\",\r\n fullName: \"\",\r\n role: \"User\",\r\n password: \"\",\r\n },\r\n create: true,\r\n });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { users, userDetails, create } = this.state;\r\n return (\r\n \r\n \r\n Users\r\n \r\n \r\n \r\n Full Name\r\n Email\r\n Role\r\n Actions\r\n \r\n \r\n \r\n {users &&\r\n users.map((user) => (\r\n \r\n \r\n {user.fullName}\r\n \r\n {user.email}\r\n {user.role}\r\n \r\n \r\n this.setState({ userDetails: user })}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n this.deleteUser(user.id)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n this.setState({ userDetails: null, create: false })}\r\n />\r\n
\r\n );\r\n }\r\n}\r\n\r\nUsersContainer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n open: PropTypes.bool,\r\n};\r\n\r\nexport default withStyles(styles)(UsersContainer);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n TextField,\r\n IconButton,\r\n Grid,\r\n ListItem,\r\n ListItemText,\r\n ListItemIcon,\r\n List,\r\n Tooltip,\r\n DialogActions,\r\n} from \"@mui/material\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { Folder, ArrowUpward } from \"@mui/icons-material\";\r\n\r\nclass FolderChooser extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n dirfiles: [],\r\n currentPath: \"\",\r\n };\r\n\r\n this.updateFolderList(\"\");\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.open !== this.props.open && this.props.open) {\r\n this.updateFolderList(\"\");\r\n }\r\n }\r\n\r\n updateFolderList = (currentPath) => {\r\n // load list of available project types from backend\r\n Backend.walkDir(currentPath, (e) => {\r\n let filteredDirFiles = e.filter((entry) => {\r\n if (entry.type === \"directory\") {\r\n let sameMrxsFile = e.find((element) => {\r\n return element.path === entry.path + \".mrxs\";\r\n });\r\n return typeof sameMrxsFile === \"undefined\";\r\n } else {\r\n return true;\r\n }\r\n });\r\n // write received info into state\r\n this.setState({\r\n currentPath: currentPath,\r\n dirfiles: filteredDirFiles,\r\n });\r\n });\r\n };\r\n\r\n isDisabled = (relativePath) => {\r\n let { project } = this.props;\r\n if (project) {\r\n const projectFiles = [\r\n ...new Set(project.files.map((file) => file.relativePath)),\r\n ];\r\n if (projectFiles.includes(relativePath)) return true;\r\n }\r\n return false;\r\n };\r\n\r\n render() {\r\n const { onClose, settings, ...other } = this.props;\r\n\r\n const { dirfiles, currentPath } = this.state;\r\n\r\n return (\r\n onClose()} {...other} maxWidth=\"lg\">\r\n Choose Directory for Auto Import\r\n \r\n \r\n \r\n {currentPath && (\r\n \r\n \r\n \r\n {\r\n this.updateFolderList(\r\n currentPath.substring(\r\n 0,\r\n currentPath.lastIndexOf(\"\\\\\")\r\n )\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {dirfiles.map((e, id) =>\r\n e.type === \"file\" ? null : (\r\n this.updateFolderList(e.path)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n )\r\n )}\r\n \r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n onClose(currentPath)}\r\n color=\"primary\"\r\n autoFocus\r\n >\r\n Choose\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nFolderChooser.propTypes = {\r\n onClose: PropTypes.func,\r\n open: PropTypes.bool,\r\n project: PropTypes.object,\r\n settings: PropTypes.object,\r\n};\r\n\r\nexport default FolderChooser;\r\n","import React from \"react\";\r\n//import { userService } from \"../../common/services\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport {\r\n TextField,\r\n Typography,\r\n CardActions,\r\n Button,\r\n Card,\r\n CardContent,\r\n Tooltip,\r\n ListItem,\r\n List,\r\n ListItemText,\r\n ListItemAvatar,\r\n Avatar,\r\n ListItemSecondaryAction,\r\n IconButton,\r\n} from \"@mui/material\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport FolderIcon from \"@mui/icons-material/Folder\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport FolderChooser from \"./FolderChooser\";\r\n\r\nconst styles = {\r\n root: {\r\n flexGrow: 1,\r\n width: \"100%\",\r\n height: \"calc(100vh - 64px - 48px)\",\r\n overflow: \"hidden\",\r\n },\r\n paper: {\r\n padding: 20,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n },\r\n};\r\n\r\nclass ImporterContainer extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n settings: null,\r\n showFolderChooser: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n Backend.readImporterSettings((settings) => {\r\n // convert string to array\r\n if (settings.importerFolders)\r\n settings.folders = settings.importerFolders.split(\";\");\r\n else settings.folders = [];\r\n this.setState({ settings });\r\n });\r\n }\r\n\r\n onChangeMetaData = (field, e) => {\r\n const { settings } = this.state;\r\n settings[field] = e;\r\n this.setState({ settings });\r\n };\r\n\r\n saveClick = () => {\r\n const { settings } = this.state;\r\n settings.importerFolders = settings.folders.join(\";\");\r\n Backend.writeImporterSettings(settings, (data) => {\r\n console.log(data);\r\n });\r\n };\r\n addDirectoryClick = () => {\r\n this.setState({ showFolderChooser: true });\r\n };\r\n\r\n handleClose = (path) => {\r\n if (path) {\r\n const { settings } = this.state;\r\n settings.folders.push(path);\r\n this.setState({ settings });\r\n }\r\n this.setState({ showFolderChooser: false });\r\n };\r\n\r\n removeDirectoryClick = (path) => {\r\n const { settings } = this.state;\r\n settings.folders = settings.folders.filter((e) => e !== path);\r\n this.setState({ settings });\r\n };\r\n\r\n render() {\r\n //const { classes } = this.props;\r\n const { settings, showFolderChooser } = this.state;\r\n\r\n if (!settings) return null;\r\n return (\r\n \r\n \r\n \r\n Auto Import Settings\r\n \r\n {settings.folders.map((folder, folderIdx) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n this.removeDirectoryClick(folder)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n }\r\n onClick={this.addDirectoryClick}\r\n >\r\n Add Directory\r\n \r\n
\r\n
\r\n \r\n {\r\n settings.importerStart = e.target.value;\r\n }}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n inputProps={{\r\n step: 300, // 5 min\r\n }}\r\n />\r\n \r\n\r\n \r\n \r\n {\r\n settings.importerEnd = e.target.value;\r\n }}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n inputProps={{\r\n step: 300, // 5 min\r\n }}\r\n />\r\n \r\n\r\n \r\n \r\n {\r\n settings.importerNewerThan = e.target.value;\r\n }}\r\n InputLabelProps={{\r\n shrink: true,\r\n }}\r\n inputProps={{\r\n step: 300, // 5 min\r\n }}\r\n />\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(ImporterContainer);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport classNames from \"classnames\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n Button,\r\n IconButton,\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n ImageListItem,\r\n ImageList,\r\n DialogActions,\r\n} from \"@mui/material\";\r\n\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst styles = () => ({\r\n dialogContent: {\r\n paddingTop: 0,\r\n maxWidth: 900,\r\n minWidth: 750,\r\n },\r\n tileBar: {\r\n position: \"absolute\",\r\n left: \"0\",\r\n bottom: \"0\",\r\n width: \"100%\",\r\n height: \"auto\",\r\n padding: \"14px\",\r\n fontFamily: \"Roboto, Helvetica, Arial, sans-serif\",\r\n fontSize: \"1em\",\r\n color: \"white\",\r\n background: \"rgba(0,0,0,0.5)\",\r\n },\r\n projectTile: {\r\n cursor: \"pointer\",\r\n \"&:hover\": {\r\n background: \"#AAA\",\r\n },\r\n },\r\n projectTileSelected: {\r\n background: \"#1BA1E2!important\",\r\n },\r\n projectTilesList: {\r\n maxHeight: \"500px\",\r\n padding: 3,\r\n },\r\n deleteButton: {\r\n position: \"absolute\",\r\n bottom: 0,\r\n right: 0,\r\n zIndex: 10,\r\n },\r\n test: {\r\n background: \"green\",\r\n },\r\n});\r\n\r\nconst ProjectModuleTiles = (props) => {\r\n const {\r\n classes,\r\n availableTypes,\r\n projectType,\r\n onProjectType,\r\n onProjectTypeChange,\r\n } = props;\r\n\r\n return (\r\n \r\n \r\n {availableTypes.map((tile) => (\r\n onProjectType(tile.name)}\r\n className={classNames(\r\n classes.projectTile,\r\n projectType === tile.name && classes.projectTileSelected\r\n )}\r\n >\r\n {tile.isUserModule && (\r\n {\r\n Backend.deleteProjectModuleType(tile.name, () => {\r\n window.showSuccessSnackbar(\r\n \"Project Type \" + tile.name + \" sucessfully deleted!\"\r\n );\r\n onProjectTypeChange();\r\n });\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n )}\r\n\r\n \r\n
{tile.label}
\r\n \r\n ))}\r\n \r\n
\r\n );\r\n};\r\n\r\nProjectModuleTiles.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n availableTypes: PropTypes.array,\r\n projectType: PropTypes.string,\r\n onProjectType: PropTypes.func,\r\n onProjectTypeChange: PropTypes.func,\r\n};\r\nclass ModuleSelectionDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this._isMounted = false;\r\n\r\n this.state = {\r\n submitted: false,\r\n projectTypes: [],\r\n selectedProjectType: null,\r\n projectType: \"\",\r\n };\r\n this.updateProjectTypes();\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n updateProjectTypes = () => {\r\n Backend.loadAvailableProjectTypes((projectTypes) => {\r\n // order project types by order attribute\r\n projectTypes = projectTypes.sort((a, b) => a.order - b.order);\r\n\r\n // write received info into state\r\n this.setMountedState({\r\n projectTypes: projectTypes,\r\n });\r\n });\r\n };\r\n\r\n componentDidUpdate(prevProps) {\r\n // on open dialog\r\n if (prevProps.open !== this.props.open && this.props.open) {\r\n this.updateProjectTypes();\r\n }\r\n }\r\n\r\n onProjectType = (e) => {\r\n if (this.props.project) {\r\n window.openWarningDialog(\r\n \"Project already created and the Project Type can't be changed afterwards.\\nPlease create a new Project instead.\"\r\n );\r\n } else {\r\n this.setMountedState({ projectType: e });\r\n }\r\n };\r\n\r\n handleClose = () => {\r\n this.props.onClose();\r\n };\r\n\r\n handleOK = () => {\r\n let selectedProjectType = this.state.projectTypes.find(\r\n (item) => item.name === this.state.projectType\r\n );\r\n this.props.onSelectProject(selectedProjectType);\r\n };\r\n\r\n render() {\r\n const { classes, ...other } = this.props;\r\n const { projectType, projectTypes } = this.state;\r\n\r\n return (\r\n \r\n Project Module\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nModuleSelectionDialog.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n onClose: PropTypes.func,\r\n onSelectProject: PropTypes.func,\r\n open: PropTypes.bool,\r\n project: PropTypes.object,\r\n};\r\n\r\nexport default withStyles(styles)(ModuleSelectionDialog);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport ModuleSelectionDialog from \"./ModuleSelectionDialog\";\r\nimport {\r\n Grid,\r\n Typography,\r\n IconButton,\r\n Card,\r\n CardContent,\r\n Tooltip,\r\n Button,\r\n} from \"@mui/material\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport {\r\n faImages,\r\n faCube,\r\n faFillDrip,\r\n faPen,\r\n faPencilRuler,\r\n faDrawPolygon,\r\n faClone,\r\n faMousePointer,\r\n faCamera,\r\n faDownload,\r\n faSquareFull,\r\n faTable,\r\n faThLarge,\r\n faBrain,\r\n faHandPointer,\r\n} from \"@fortawesome/free-solid-svg-icons\";\r\nimport { faCircle } from \"@fortawesome/free-regular-svg-icons\";\r\nimport RateReviewIcon from \"@mui/icons-material/RateReview\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport {\r\n ViewQuilt,\r\n Save,\r\n ZoomOutMap,\r\n CheckBoxOutlineBlank,\r\n ZoomIn,\r\n} from \"@mui/icons-material\";\r\nimport PublishIcon from \"@mui/icons-material/Publish\";\r\nimport GetAppIcon from \"@mui/icons-material/GetApp\";\r\nimport SortIcon from \"@mui/icons-material/Sort\";\r\nimport ScatterPlotIcon from \"@mui/icons-material/ScatterPlot\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n width: \"100%\",\r\n height: \"calc(100vh - 64px - 48px)\",\r\n overflow: \"hidden\",\r\n },\r\n paper: {\r\n padding: 20,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n },\r\n activeColor: {\r\n color: theme.palette.primary.main,\r\n },\r\n textIcon: {\r\n fontSize: 18,\r\n fontWeight: \"bold\",\r\n },\r\n tileContainer: {\r\n position: \"relative\",\r\n width: 270,\r\n height: 180,\r\n overflow: \"hidden\",\r\n },\r\n textInputField: {\r\n width: \"calc(100% - 320px)\",\r\n },\r\n previewDiv: {\r\n cursor: \"pointer\",\r\n background: \"gray\",\r\n color: \"white\",\r\n top: \"50%\",\r\n width: \"100%\",\r\n position: \"relative\",\r\n height: 180,\r\n textAlign: \"center\",\r\n fontSize: 40,\r\n lineHeight: \"150px\",\r\n },\r\n tileImage: {\r\n width: \"100%\",\r\n position: \"relative\",\r\n cursor: \"pointer\",\r\n },\r\n previewIcon: {\r\n marginTop: \"-8px\",\r\n },\r\n tileBar: {\r\n position: \"absolute\",\r\n left: \"0\",\r\n bottom: \"0\",\r\n width: \"100%\",\r\n height: \"auto\",\r\n padding: \"14px\",\r\n fontFamily: \"Roboto, Helvetica, Arial, sans-serif\",\r\n fontSize: \"1em\",\r\n color: \"white\",\r\n background: \"rgba(0,0,0,0.5)\",\r\n },\r\n middleStructuresColumn: {\r\n float: \"left\",\r\n marginRight: 10,\r\n },\r\n});\r\n\r\nclass ModuleCreationContainer extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n isDevState: false,\r\n previewFile: null,\r\n previewImgUrl: \"\",\r\n dialogOpen: false,\r\n selectedProject: null,\r\n name: \"\",\r\n moduleIdError: false,\r\n moduleLabelError: false,\r\n previewError: false,\r\n noStructuresError: false,\r\n project: {\r\n isUserModule: true,\r\n label: \"\",\r\n description: \"\",\r\n annotations: \"pixel\",\r\n order: 0,\r\n metaData: [\r\n \"Datum\",\r\n \"Versuchsnummer\",\r\n \"AK Verdünnung\",\r\n \"Mitarbeiter\",\r\n \"Färbung\",\r\n \"AK\",\r\n ],\r\n ProjectProperties: {\r\n AutomaticBaseRoiWholeImage: false,\r\n Hidden: false,\r\n HideSubMenus: false,\r\n Online: false,\r\n PreventOverlap: true,\r\n PreventOverlapSame: true,\r\n },\r\n ProjectStringProperties: {\r\n SideBarWidth: \"\",\r\n },\r\n toolsInProject: {\r\n GalleryTool: true,\r\n TilesTool: false,\r\n AdjustLayoutTool: true,\r\n FindSmallestROITool: true,\r\n PlotNearestTool: false,\r\n DrawRectangleAnnotationTool: true,\r\n DrawEllipseAnnotationTool: true,\r\n DrawPixelAnnotationTool: true,\r\n DrawRegionAnnotationTool: true,\r\n SelectRegionAnnotationTool: true,\r\n CopyRegionAnnotationTool: true,\r\n FillHoleAnnotationTool: true,\r\n OtherTools: true,\r\n CommentTool: true,\r\n ScreenshotTool: true,\r\n ZoomOriginalTool: true,\r\n ZoomInOutTool: true,\r\n ZoomFitTool: true,\r\n SaveTool: true,\r\n LandmarkTool: true,\r\n HeatmapTool: true,\r\n SaveImagesTool: false,\r\n PassiveLearningTool: false,\r\n ApplyModelTool: false,\r\n RoiTab: true,\r\n AICockpit: true,\r\n ResultTab: false,\r\n AITrainingTool: false,\r\n ShowALTabTool: false,\r\n GridTool: false,\r\n GridAnnotationTool: true,\r\n GalleryTrainingTool: false,\r\n },\r\n structures: [\r\n {\r\n id: 1,\r\n label: \"Base ROI\",\r\n color: \"rgba(0, 0, 0, 0.0)\",\r\n inversed: \"true\",\r\n toolNames: [\"iam_base_roi\"],\r\n },\r\n ],\r\n dynamicStructure: {\r\n label: \"Structure {}\",\r\n toolNames: [],\r\n },\r\n models: [],\r\n job: \"job_simple_analysis\",\r\n },\r\n };\r\n\r\n Backend.loadReducedAvailableProjectTypes((projectTypes) => {\r\n if (\r\n projectTypes.some((projectType) => projectType.name === \"testProject\")\r\n ) {\r\n this.setState({ isDevState: true });\r\n }\r\n });\r\n }\r\n\r\n setProject = (obj) => {\r\n let projectObject = this.state.project;\r\n const structureKeys = [\r\n \"id\",\r\n \"label\",\r\n \"color\",\r\n \"toolNames\",\r\n \"inversed\",\r\n \"parentId\",\r\n \"classificationSubtype\",\r\n ];\r\n\r\n Object.keys(projectObject).forEach((key) => {\r\n if (key in obj) {\r\n if (key === \"structures\") {\r\n projectObject[\"structures\"] = [];\r\n for (let structure of obj[\"structures\"]) {\r\n let structureObj = {};\r\n for (let k of structureKeys) {\r\n if (k in structure) {\r\n structureObj[k] = structure[k];\r\n }\r\n }\r\n projectObject[\"structures\"].push(structureObj);\r\n }\r\n } else {\r\n projectObject[key] = obj[key];\r\n }\r\n }\r\n });\r\n this.setState({ project: projectObject });\r\n };\r\n\r\n handleStructureSelect = ({ target }) => {\r\n let uploadedFile = target.files[0];\r\n if (typeof uploadedFile === \"undefined\") return false;\r\n\r\n if (\r\n !(uploadedFile.type === \"\" && uploadedFile.name.endsWith(\".strhsa\")) &&\r\n uploadedFile.type !== \"application/json\"\r\n ) {\r\n window.showErrorSnackbar(\"Wrong file type == \" + uploadedFile.type);\r\n return false;\r\n }\r\n\r\n if (uploadedFile) {\r\n let readFile = new FileReader();\r\n readFile.onload = (e) => {\r\n let contents = e.target.result;\r\n let structures = JSON.parse(contents);\r\n let resultStructures = [];\r\n for (let structure of structures) {\r\n let tempStructure = {\r\n id: structure.id,\r\n label: structure.label,\r\n color: structure.color,\r\n toolNames: structure.toolNames ? structure.toolNames : [],\r\n };\r\n if (structure.inversed) {\r\n tempStructure.inversed = structure.inversed;\r\n }\r\n if (structure.parentId) {\r\n tempStructure.parentId = structure.parentId;\r\n }\r\n if (structure.classificationSubtype) {\r\n tempStructure.classificationSubtype =\r\n structure.classificationSubtype;\r\n }\r\n resultStructures.push(tempStructure);\r\n }\r\n this.setProject({\r\n structures: resultStructures,\r\n });\r\n this.setState({\r\n noStructuresError: false,\r\n });\r\n };\r\n readFile.readAsText(uploadedFile);\r\n } else {\r\n console.log(\"Failed to load file\");\r\n }\r\n };\r\n\r\n handlePreviewSelect = ({ target }) => {\r\n if (target.files.length > 0) {\r\n this.setState({\r\n previewError: false,\r\n previewFile: target.files[0],\r\n previewImgUrl: window.URL.createObjectURL(target.files[0]),\r\n });\r\n }\r\n };\r\n\r\n renderIcon(param) {\r\n switch (param) {\r\n case \"GalleryTool\":\r\n return ;\r\n case \"3DVisualisation\":\r\n return ;\r\n case \"TilesTool\":\r\n return ;\r\n case \"FindSmallestROITool\":\r\n return ;\r\n case \"PlotNearestTool\":\r\n return ;\r\n case \"AdjustLayoutTool\":\r\n return ;\r\n case \"DrawRectangleAnnotationTool\":\r\n return ;\r\n case \"DrawPixelAnnotationTool\":\r\n return ;\r\n case \"DrawMagicWandAnnotationTool\":\r\n return ;\r\n case \"DrawRegionAnnotationTool\":\r\n return ;\r\n case \"DrawEllipseAnnotationTool\":\r\n return ;\r\n case \"FillHoleAnnotationTool\":\r\n return ;\r\n case \"SelectRegionAnnotationTool\":\r\n return ;\r\n case \"TilesClassificationTool\":\r\n return ;\r\n case \"CopyRegionAnnotationTool\":\r\n return ;\r\n case \"AITrainingTool\":\r\n return ;\r\n case \"GridTool\":\r\n return ;\r\n case \"OtherTools\":\r\n return ;\r\n case \"SaveImagesTool\":\r\n return ;\r\n case \"CommentTool\":\r\n return ;\r\n case \"ScreenshotTool\":\r\n return ;\r\n case \"ZoomOriginalTool\":\r\n return
1:X
;\r\n case \"ZoomFitTool\":\r\n return ;\r\n case \"ZoomInOutTool\":\r\n return ;\r\n case \"SaveTool\":\r\n return ;\r\n case \"PassiveLearningTool\":\r\n case \"RoiTab\":\r\n return ;\r\n case \"AICockpit\":\r\n case \"ShowALTabTool\":\r\n case \"ApplyModelTool\":\r\n return ;\r\n default:\r\n return ;\r\n }\r\n }\r\n\r\n onCreateProjectType = () => {\r\n let missingInput = false;\r\n if (this.state.name === \"\") {\r\n window.showErrorSnackbar(\"Please set a Module ID\");\r\n this.setState({\r\n moduleIdError: true,\r\n });\r\n missingInput = true;\r\n }\r\n if (this.state.project.label === \"\") {\r\n this.setState({\r\n moduleLabelError: true,\r\n });\r\n window.showErrorSnackbar(\"Please set a Module Name\");\r\n }\r\n if (this.state.previewImgUrl === \"\") {\r\n this.setState({\r\n previewError: true,\r\n });\r\n window.showErrorSnackbar(\"Please select a Preview Image\");\r\n missingInput = true;\r\n }\r\n if (this.state.previewImgUrl.includes(\"data:image\")) {\r\n this.setState({\r\n previewError: true,\r\n });\r\n window.showErrorSnackbar(\"Please select your own Preview Image\");\r\n missingInput = true;\r\n }\r\n if (this.state.project.structures.length === 0) {\r\n this.setState({\r\n noStructuresError: true,\r\n });\r\n window.showErrorSnackbar(\"Please select a valid structures file\");\r\n missingInput = true;\r\n }\r\n if (missingInput) return;\r\n Backend.loadReducedAvailableProjectTypes((projectTypes) => {\r\n if (projectTypes.find((item) => item.name === this.state.name)) {\r\n window.showErrorSnackbar(\r\n \"Project Module with ID \" + this.state.name + \" already exists!\"\r\n );\r\n this.setState({ moduleIdError: true });\r\n return;\r\n }\r\n\r\n Backend.createProjectModuleTypeImage(\r\n this.state.name,\r\n this.state.previewFile,\r\n () => {\r\n window.showSuccessSnackbar(\r\n \"Project Module \" +\r\n this.state.project.label +\r\n \" succesfully created\"\r\n );\r\n }\r\n );\r\n let projectObject = this.state.project;\r\n projectObject.isUserModule = true;\r\n Backend.createProjectModuleTypeJsonFile(\r\n this.state.name,\r\n projectObject,\r\n (response) => console.log(\"Project json file created:\", response)\r\n );\r\n });\r\n };\r\n renderPreviewImage = () => {\r\n let imagePreview;\r\n if (this.state.previewImgUrl === \"\") {\r\n imagePreview = (\r\n document.getElementById(\"selectImage\").click()}\r\n className={this.props.classes.previewDiv}\r\n >\r\n {\" \"}\r\n Preview\r\n \r\n \r\n );\r\n } else {\r\n imagePreview = (\r\n document.getElementById(\"selectImage\").click()}\r\n src={this.state.previewImgUrl}\r\n className={this.props.classes.tileImage}\r\n alt=\"\"\r\n />\r\n );\r\n }\r\n return (\r\n \r\n {imagePreview}\r\n \r\n \r\n );\r\n };\r\n\r\n onSelectProject = (projectType) => {\r\n console.log(\"projectType:\", projectType);\r\n this.setState({\r\n name: projectType.name,\r\n dialogOpen: false,\r\n });\r\n this.setProject(projectType);\r\n };\r\n\r\n exportSelectedProjectType = () => {\r\n Backend.loadReducedAvailableProjectTypes((projectTypes) => {\r\n if (projectTypes.find((item) => item.name === this.state.name)) {\r\n Backend.exportProjectTypes(\r\n [this.state.name],\r\n this.state.name,\r\n (response) => {\r\n window.showSuccessSnackbar(\"Project Module exported!\");\r\n console.log(\"response:\", response);\r\n }\r\n );\r\n } else {\r\n window.showErrorSnackbar(\"module does not exist!\");\r\n }\r\n });\r\n };\r\n\r\n exportNewProjectTypes = () => {\r\n Backend.loadAvailableProjectTypes((projectTypes) => {\r\n let ownProjectTypes = projectTypes\r\n .filter((item) => item.isUserModule)\r\n .map((item) => item.name);\r\n if (ownProjectTypes.length > 0) {\r\n Backend.exportProjectTypes(\r\n ownProjectTypes,\r\n \"project_modules\",\r\n (response) => {\r\n window.showSuccessSnackbar(\"Project Modules exported!\");\r\n console.log(\"response:\", response);\r\n }\r\n );\r\n } else {\r\n window.showErrorSnackbar(\"No Project Modules created to export!\");\r\n }\r\n });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { isDevState } = this.state;\r\n return (\r\n \r\n \r\n \r\n \r\n Create Project Module\r\n \r\n \r\n {Object.keys(this.state.project.toolsInProject).map(\r\n (key, idx) => (\r\n \r\n {\r\n let toolsInProjectObject =\r\n this.state.project.toolsInProject;\r\n toolsInProjectObject[key] = !toolsInProjectObject[key];\r\n this.setProject({\r\n toolsInProject: toolsInProjectObject,\r\n });\r\n }}\r\n size=\"large\"\r\n >\r\n {this.renderIcon(key)}\r\n \r\n \r\n )\r\n )}\r\n \r\n\r\n \r\n
\r\n
\r\n {this.renderPreviewImage()}\r\n\r\n
\r\n {this.state.project.label}\r\n
\r\n
\r\n
\r\n \r\n document.getElementById(\"selectStructures\").click()\r\n }\r\n >\r\n \r\n {this.state.project.structures.length} Structures\r\n {\" \"}\r\n \r\n
\r\n\r\n this.exportSelectedProjectType()}\r\n >\r\n Export selected Project Module\r\n \r\n
\r\n this.exportNewProjectTypes()}\r\n >\r\n Export all new Project Modules\r\n \r\n
\r\n {\r\n document.getElementById(\"selectImportFile\").click();\r\n }}\r\n >\r\n Import Project Modules\r\n \r\n\r\n {\r\n console.log(\"file:\", e.target.files);\r\n if (e.target.files.length > 0) {\r\n Backend.importProjectTypes(\r\n e.target.files[0],\r\n (response) => {\r\n console.log(\"response:\", response);\r\n }\r\n );\r\n }\r\n }}\r\n />\r\n
\r\n
\r\n this.setState({ dialogOpen: true })}\r\n >\r\n Open existing Project Modules\r\n \r\n this.setState({ dialogOpen: false })}\r\n onSelectProject={this.onSelectProject}\r\n />\r\n
\r\n \r\n this.setState({\r\n name: e.target.value,\r\n moduleIdError: false,\r\n })\r\n }\r\n />\r\n \r\n this.setProject({\r\n label: e.target.value,\r\n moduleLabelError: false,\r\n })\r\n }\r\n />\r\n \r\n this.setProject({ description: e.target.value })\r\n }\r\n />\r\n
\r\n
\r\n
\r\n \r\n create new Project Type\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nModuleCreationContainer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(ModuleCreationContainer);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { Grid } from \"@mui/material\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n//import { Delete, Edit } from \"@mui/icons-material\";\r\nimport SystemContainer from \"./components/SystemContainer\";\r\nimport UsersContainer from \"./components/UsersContainer\";\r\nimport ImporterContainer from \"./components/ImporterContainer\";\r\nimport ModuleCreationContainer from \"./components/ModuleCreationContainer\";\r\n\r\nconst styles = {\r\n root: {\r\n flexGrow: 1,\r\n width: \"100%\",\r\n height: \"calc(100vh - 64px)\",\r\n overflow: \"auto\",\r\n },\r\n rootContent: {\r\n margin: 0,\r\n width: \"100%\",\r\n },\r\n paper: {\r\n padding: 20,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n },\r\n};\r\n\r\nclass AdminPage extends React.Component {\r\n saveClick = () => {};\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nAdminPage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(AdminPage);\r\n","import React, { Component } from \"react\";\r\n\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nimport Avatar from \"@mui/material/Avatar\";\r\nimport Button from \"@mui/material/Button\";\r\nimport CssBaseline from \"@mui/material/CssBaseline\";\r\nimport LockOutlinedIcon from \"@mui/icons-material/LockOutlined\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { ValidatorForm, TextValidator } from \"react-material-ui-form-validator\";\r\n\r\nimport { authenticationService } from \"../common/services\";\r\nimport Backend from \"../common/utils/Backend\";\r\n\r\nconst styles = (theme) => ({\r\n main: {\r\n width: \"auto\",\r\n display: \"block\", // Fix IE 11 issue.\r\n marginLeft: theme.spacing(3),\r\n marginRight: theme.spacing(3),\r\n // When screen sizes surpasses the theshold, change the look\r\n [theme.breakpoints.up(600 + 3 * 2 * 8)]: {\r\n // [theme.breakpoints.up(500 + theme.spacing(3 * 2))]: {\r\n // In the mui v5 update, theme.spacing returns \"48px\" instead of 48.\r\n // Therefore, hardcoding the default theme.spacing multiplyer of 8.\r\n width: 600,\r\n marginLeft: \"auto\",\r\n marginRight: \"auto\",\r\n },\r\n },\r\n paper: {\r\n marginTop: theme.spacing(8),\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n padding: `${theme.spacing(2)} ${theme.spacing(3)} ${theme.spacing(3)}`,\r\n },\r\n avatar: {\r\n margin: theme.spacing(1),\r\n backgroundColor: theme.palette.secondary.main,\r\n },\r\n form: {\r\n width: \"100%\", // Fix IE 11 issue.\r\n marginTop: theme.spacing(1),\r\n },\r\n submit: {\r\n marginTop: theme.spacing(3),\r\n },\r\n});\r\n\r\nclass LoginPage extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n formData: {\r\n email: \"\",\r\n password: \"\",\r\n },\r\n isSubmitting: false,\r\n users: null,\r\n isUsername: false,\r\n emailErrorText: \"Email or Username is not valid\",\r\n };\r\n\r\n // if mounted in Storybook and test users should be used\r\n if (props.testUserList) {\r\n console.log(\"No LicensingInfo loaded, since test users used!\");\r\n } else {\r\n // redirect if license is not VALID\r\n Backend.getLicensingInfo((license) => {\r\n if (license.licenseStatus !== \"VALID\") {\r\n authenticationService.logout();\r\n this.props.history.push(\"/licensing\");\r\n }\r\n });\r\n // redirect to home if already logged in\r\n if (authenticationService.currentUserValue) {\r\n this.props.history.push(\"/\");\r\n }\r\n }\r\n }\r\n\r\n validateEmail(email) {\r\n const re =\r\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n return re.test(String(email).toLowerCase());\r\n }\r\n\r\n validateUserOrEmail = (userList, value) => {\r\n // Backend get all users\r\n // check if valid user\r\n let valid = false;\r\n this.setState({ users: userList });\r\n\r\n // allow (and trim) spaces at the start and end of the email/mail + make sure only one space in name\r\n // https://stackoverflow.com/questions/16974664/remove-extra-spaces-in-string-javascript\r\n value = value.replace(/\\s{2,}/g, \" \").trim();\r\n\r\n userList.forEach((u) => {\r\n if (value === u.fullName) {\r\n this.setState({ isUsername: true });\r\n valid = true;\r\n } else if (value === u.email) {\r\n this.setState({ isUsername: false });\r\n valid = true;\r\n }\r\n });\r\n\r\n if (this.validateEmail(value)) {\r\n this.setState({ emailErrorText: \"No User found for given Email\" });\r\n } else {\r\n this.setState({\r\n emailErrorText: \"No User found for given Username\",\r\n });\r\n }\r\n return valid;\r\n };\r\n\r\n componentDidMount() {\r\n const { testUserList } = this.props;\r\n // if mounted in Storybook and test users should be used\r\n if (testUserList) {\r\n ValidatorForm.addValidationRule(\"isUserOrEmail\", (value) =>\r\n this.validateUserOrEmail(testUserList, value)\r\n );\r\n } else {\r\n //Create Custom Validation Rule to allow User Name and e-mail\r\n Backend.getUserList((userList) => {\r\n ValidatorForm.addValidationRule(\"isUserOrEmail\", (value) =>\r\n this.validateUserOrEmail(userList, value)\r\n );\r\n });\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n ValidatorForm.removeValidationRule(\"isUserOrEmail\");\r\n }\r\n\r\n handleChange = (event) => {\r\n const { formData } = this.state;\r\n formData[event.target.name] = event.target.value;\r\n this.setState({ formData });\r\n };\r\n\r\n handleSubmit = () => {\r\n this.setState({\r\n isSubmitting: true,\r\n });\r\n\r\n const { formData, isUsername, users } = this.state;\r\n let { email } = formData;\r\n\r\n // allow (and trim) spaces at the start and end of the email/mail + make sure only one space in name\r\n // https://stackoverflow.com/questions/16974664/remove-extra-spaces-in-string-javascript\r\n email = email.replace(/\\s{2,}/g, \" \").trim();\r\n\r\n if (isUsername) {\r\n users.forEach((user) =>\r\n user.fullName === email ? (email = user.email) : email\r\n );\r\n }\r\n\r\n authenticationService.login(email, formData.password).then(\r\n () => {\r\n window.location.reload(true); //clear cache\r\n const { from } = this.props.location.state || {\r\n from: { pathname: \"/\" },\r\n };\r\n this.props.history.push(from);\r\n },\r\n (error) => {\r\n this.setState({\r\n error: error,\r\n isSubmitting: false,\r\n });\r\n }\r\n );\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { isSubmitting, error, formData, emailErrorText } = this.state;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n Sign In\r\n \r\n \r\n {error && (\r\n \r\n {error}\r\n \r\n )}\r\n \r\n \r\n \r\n Sign In\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nLoginPage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n history: PropTypes.object,\r\n location: PropTypes.object,\r\n testUserList: PropTypes.array,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(LoginPage));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport Backend from \"../common/utils/Backend\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport {\r\n Select,\r\n InputLabel,\r\n FormHelperText,\r\n FormControl,\r\n Typography,\r\n MenuItem,\r\n} from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { ValidatorForm, TextValidator } from \"react-material-ui-form-validator\";\r\n\r\nimport CssBaseline from \"@mui/material/CssBaseline\";\r\nimport Paper from \"@mui/material/Paper\";\r\n\r\nconst styles = (theme) => ({\r\n main: {\r\n width: \"auto\",\r\n display: \"block\", // Fix IE 11 issue.\r\n marginLeft: theme.spacing(3),\r\n marginRight: theme.spacing(3),\r\n [theme.breakpoints.up(600 + 3 * 2 * 8)]: {\r\n // [theme.breakpoints.up(500 + theme.spacing(3 * 2))]: {\r\n // In the mui v5 update, theme.spacing returns \"48px\" instead of 48.\r\n // Therefore, hardcoding the default theme.spacing multiplyer of 8.\r\n width: \"100%\",\r\n height: \"calc(100% - 64px)\",\r\n margin: 0,\r\n overflow: \"auto\",\r\n },\r\n },\r\n paper: {\r\n maxWidth: 600,\r\n margin: \"20px auto\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n padding: `${theme.spacing(2)} ${theme.spacing(3)} ${theme.spacing(3)}`,\r\n },\r\n formControl: {\r\n marginTop: theme.spacing(1),\r\n },\r\n form: {\r\n width: \"100%\", // Fix IE 11 issue.\r\n marginTop: theme.spacing(1),\r\n },\r\n submit: {\r\n marginTop: theme.spacing(3),\r\n width: \"100%\",\r\n },\r\n});\r\n\r\nclass LicensingPage extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n licenseStatus: \"\",\r\n validationMsg: \"\",\r\n hardwareID: \"\",\r\n os: \"Windows\",\r\n expirationDate: \"\",\r\n isSubmitting: false,\r\n validationObject: {\r\n storagePath: true,\r\n tempPath: true,\r\n galleryOutputPath: true,\r\n javaPath: true,\r\n },\r\n formData: {\r\n storagePath: \"\",\r\n tempPath: \"\",\r\n galleryOutputPath: \"\",\r\n javaPath: \"\",\r\n localhost: false,\r\n licenseKey: \"\",\r\n },\r\n };\r\n\r\n Backend.getLicensingInfo((result) => this.setState(result));\r\n Backend.readAppSettingsLicensing((result) => {\r\n const formData = result;\r\n this.setState({ formData });\r\n });\r\n }\r\n\r\n handleChange = (event) => {\r\n const { formData } = this.state;\r\n formData[event.target.name] = event.target.value;\r\n this.setState({ formData });\r\n };\r\n\r\n correctPath(path) {\r\n path = path.replace(/\\\\/g, \"/\");\r\n while (path.includes(\"//\")) {\r\n path = path.replace(\"//\", \"/\");\r\n }\r\n if (!path.endsWith(\"/\")) {\r\n path = path + \"/\";\r\n }\r\n return path;\r\n }\r\n\r\n handleSubmit = () => {\r\n this.setState({\r\n isSubmitting: true,\r\n });\r\n\r\n const { formData } = this.state;\r\n\r\n let storagePath = formData.storagePath;\r\n let tempPath = formData.tempPath;\r\n let galleryOutputPath = formData.galleryOutputPath;\r\n let javaPath = formData.javaPath;\r\n\r\n storagePath = this.correctPath(storagePath);\r\n tempPath = this.correctPath(tempPath);\r\n galleryOutputPath = this.correctPath(galleryOutputPath);\r\n\r\n formData[\"storagePath\"] = storagePath;\r\n formData[\"tempPath\"] = tempPath;\r\n formData[\"galleryOutputPath\"] = galleryOutputPath;\r\n formData[\"javaPath\"] = javaPath;\r\n\r\n this.setState({ formData });\r\n\r\n Backend.writeAppSettingsLicensing(this.state.formData, (data) => {\r\n let allValid = true;\r\n let dialogString = \"\";\r\n let validationObject = this.state.validationObject;\r\n for (const [key, value] of Object.entries(data)) {\r\n if (!value) {\r\n allValid = false;\r\n validationObject[key] = false;\r\n\r\n if (key === \"javaPath\") {\r\n dialogString += \"File not found: \";\r\n } else {\r\n dialogString += \"Folder not found: \";\r\n }\r\n dialogString += formData[key] + \"\\n\";\r\n }\r\n }\r\n if (allValid) {\r\n window.location.reload();\r\n } else {\r\n window.openWarningDialog(dialogString);\r\n this.setState({ isSubmitting: false, validationObject });\r\n }\r\n });\r\n };\r\n\r\n removeErrorStyle = (key) => {\r\n let validationObject = this.state.validationObject;\r\n if (validationObject[key] !== \"none\") {\r\n validationObject[key] = true;\r\n this.setState({ validationObject });\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { isSubmitting, error, formData } = this.state;\r\n\r\n return (\r\n
\r\n \r\n \r\n {this.state.licenseStatus === \"INVALID\" && (\r\n

Invalid License Key!

\r\n )}\r\n {this.state.licenseStatus === \"CRACKED\" && (\r\n

Cracked License Key!

\r\n )}\r\n {this.state.licenseStatus === \"VALID\" &&

Valid License Key

}\r\n
\r\n License State: \r\n {this.state.licenseStatus}\r\n
\r\n {this.state.validationMsg !== \"\" && (\r\n \r\n Validation Message: \r\n {this.state.validationMsg}\r\n
\r\n
\r\n )}\r\n {this.state.expirationDate !== \"\" && (\r\n \r\n Expiration Date: \r\n {this.state.expirationDate}\r\n
\r\n
\r\n )}\r\n\r\n Hardware Id: \r\n {this.state.hardwareID}\r\n
\r\n
\r\n\r\n {this.state.licenseStatus === \"VALID\" && (\r\n \r\n )}\r\n \r\n {error && (\r\n \r\n {error}\r\n \r\n )}\r\n this.removeErrorStyle(\"storagePath\")}\r\n fullWidth\r\n margin=\"normal\"\r\n name=\"storagePath\"\r\n label=\"Storage Path\"\r\n type=\"text\"\r\n validators={[\"required\"]}\r\n errorMessages={[\"this field is required\"]}\r\n onChange={this.handleChange}\r\n value={formData.storagePath}\r\n />\r\n this.removeErrorStyle(\"tempPath\")}\r\n fullWidth\r\n margin=\"normal\"\r\n name=\"tempPath\"\r\n label=\"Tempfiles Path\"\r\n type=\"text\"\r\n validators={[\"required\"]}\r\n errorMessages={[\"this field is required\"]}\r\n onChange={this.handleChange}\r\n value={formData.tempPath}\r\n />\r\n this.removeErrorStyle(\"galleryOutputPath\")}\r\n fullWidth\r\n margin=\"normal\"\r\n name=\"galleryOutputPath\"\r\n label=\"Gallery Output Path\"\r\n type=\"text\"\r\n validators={[\"required\"]}\r\n errorMessages={[\"this field is required\"]}\r\n onChange={this.handleChange}\r\n value={formData.galleryOutputPath}\r\n />\r\n this.removeErrorStyle(\"javaPath\")}\r\n fullWidth\r\n margin=\"normal\"\r\n name=\"javaPath\"\r\n label=\"Java Path\"\r\n type=\"text\"\r\n validators={[\"required\"]}\r\n errorMessages={[\"this field is required\"]}\r\n onChange={this.handleChange}\r\n value={formData.javaPath}\r\n />\r\n \r\n Localhost?\r\n \r\n False\r\n True\r\n \r\n Set True to use remotely\r\n \r\n \r\n\r\n \r\n Submit\r\n \r\n \r\n {this.state.licenseStatus !== \"VALID\" && this.state.os !== \"Windows\" && (\r\n
\r\n To Update LicenseKey do following steps: \r\n
\r\n
    \r\n
  1. Get Valid License Key
  2. \r\n
  3. Open env.list
  4. \r\n
  5. Paste Valid License Key to HSA_LICENSE_KEY
  6. \r\n
  7. Shutdown docker container
  8. \r\n
  9. \r\n Restart Container with docker-compose up\r\n
  10. \r\n
\r\n
\r\n )}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nLicensingPage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(LicensingPage);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { TextValidator } from \"react-material-ui-form-validator\";\r\nimport classNames from \"classnames\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\nimport {\r\n DialogContent,\r\n ImageListItem,\r\n ImageList,\r\n ImageListItemBar,\r\n Grid,\r\n FormHelperText,\r\n TextField,\r\n} from \"@mui/material\";\r\n\r\nconst styles = () => ({\r\n dialogContent: {\r\n paddingTop: 0,\r\n maxWidth: 900,\r\n height: 562,\r\n },\r\n tileBar: {\r\n whiteSpace: \"normal !important\",\r\n },\r\n projectTile: {\r\n cursor: \"pointer\",\r\n padding: 5,\r\n overflow: \"hidden\",\r\n border: \"1px solid black\",\r\n \"&:hover\": {\r\n background: \"#AAA\",\r\n },\r\n },\r\n projectTileSelected: {\r\n background: \"#1BA1E2!important\",\r\n },\r\n projectTilesList: {\r\n maxHeight: 437,\r\n padding: 3,\r\n },\r\n expiredMarker: {\r\n color: \"red\",\r\n border: \"2px solid red\",\r\n position: \"absolute\",\r\n top: 5,\r\n right: 5,\r\n zIndex: 1,\r\n background: \"rgba(255,255,255,0.9)\",\r\n padding: \"2px 5px 5px 5px\",\r\n },\r\n expiringMarker: {\r\n color: \"darkorange\",\r\n border: \"2px solid darkorange\",\r\n position: \"absolute\",\r\n top: 8,\r\n right: 8,\r\n zIndex: 1,\r\n background: \"rgba(255,255,255,0.9)\",\r\n padding: \"2px 5px 5px 5px\",\r\n lineHeight: \"16px\",\r\n },\r\n});\r\n\r\nclass Step0 extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n searchText: \"\",\r\n };\r\n this.imageListItemRefs = [];\r\n }\r\n\r\n onChangeFilter = (e) => {\r\n let searchText = e.target.value;\r\n this.setState({ searchText });\r\n this.imageListItemRefs = [];\r\n };\r\n\r\n isInView = (el) => {\r\n if (\r\n !this.imageList ||\r\n this.imageList.getBoundingClientRect().height === 0\r\n ) {\r\n this.imageList = document.getElementById(\"ImageList\");\r\n if (\r\n this.imageList &&\r\n this.imageList.getAttribute(\"listener\") !== \"true\"\r\n ) {\r\n this.imageList.addEventListener(\"scroll\", this.handleImageListScroll);\r\n }\r\n }\r\n let result = false;\r\n if (this.imageList && el) {\r\n let parentTop = this.imageList.getBoundingClientRect().top;\r\n let parentHeight = this.imageList.getBoundingClientRect().height;\r\n let elTop = el.getBoundingClientRect().top;\r\n let elHeight = el.getBoundingClientRect().height;\r\n\r\n result = elTop + elHeight > parentTop && elTop < parentTop + parentHeight;\r\n }\r\n return result;\r\n };\r\n\r\n handleImageListScroll = () => {\r\n this.forceUpdate();\r\n };\r\n\r\n render() {\r\n const {\r\n classes,\r\n availableTypes,\r\n projectType,\r\n onProjectType,\r\n name,\r\n onChangeName,\r\n onSaveName,\r\n } = this.props;\r\n\r\n // Check for selected histo modules.\r\n let isHistoModule =\r\n projectType.includes(\"HistoClassification\") ||\r\n projectType.includes(\"HistoPointCounting\");\r\n\r\n return (\r\n \r\n \r\n \r\n onSaveName(e.target.value)}\r\n onChange={(e) => onChangeName(e.target.value)}\r\n style={{ marginTop: 0 }}\r\n type=\"text\"\r\n validators={isHistoModule ? [] : [\"required\"]}\r\n value={isHistoModule ? \"Will be filled in automatically\" : name}\r\n variant=\"standard\"\r\n // select all text if component is defined\r\n onFocus={(e) => e.target.select()}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n onSaveName(e.target.value);\r\n }\r\n }}\r\n />\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n Project Type\r\n \r\n \r\n {availableTypes\r\n .filter((row) => {\r\n let searchContent = row.label.toLowerCase();\r\n if (row.projectProperties.Hidden) return false;\r\n let toSearch = this.state.searchText.toLowerCase();\r\n return searchContent.includes(toSearch);\r\n })\r\n .map((availableType) => (\r\n {\r\n if (!this.imageListItemRefs[availableType.name]) {\r\n this.imageListItemRefs[availableType.name] = el;\r\n this.forceUpdate();\r\n }\r\n }}\r\n key={availableType.name}\r\n onClick={() => onProjectType(availableType)}\r\n className={classNames(\r\n classes.projectTile,\r\n projectType === availableType.name &&\r\n classes.projectTileSelected\r\n )}\r\n >\r\n {availableType.projectProperties.WIP && (\r\n
WIP
\r\n )}\r\n {availableType.isValid === false &&\r\n availableType.expirationDate && (\r\n
\r\n Expired on{\" \"}\r\n {availableType.expirationDate.replace(\"T00:00:00\", \"\")}!\r\n
\r\n )}\r\n {availableType.isValid && availableType.expiresInDays < 32 && (\r\n
\r\n Expires in {availableType.expiresInDays} days!\r\n
\r\n )}\r\n\r\n {this.isInView(this.imageListItemRefs[availableType.name]) && (\r\n \r\n )}\r\n\r\n \r\n\r\n {/*
{availableType.label}
*/}\r\n \r\n ))}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nStep0.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n name: PropTypes.string,\r\n projectType: PropTypes.string,\r\n onChangeName: PropTypes.func,\r\n onSaveName: PropTypes.func,\r\n availableTypes: PropTypes.array,\r\n onProjectType: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(Step0);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport ProteomSettings from \"../../../proteomViewer/components/ProteomSettings\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n DialogContent,\r\n TextField,\r\n FormHelperText,\r\n FormControlLabel,\r\n Checkbox,\r\n} from \"@mui/material\";\r\n\r\nconst styles = () => ({\r\n root: {},\r\n dialogContent: {\r\n paddingTop: 0,\r\n maxWidth: 900,\r\n height: 562,\r\n },\r\n});\r\n\r\nclass Step1 extends Component {\r\n render() {\r\n const {\r\n classes,\r\n formData,\r\n onChangeMetaData,\r\n projectProperties,\r\n projectStringProperties,\r\n } = this.props;\r\n const metaData = formData.metaData;\r\n return (\r\n \r\n \r\n Meta Data for Project !!!\r\n \r\n {formData.projectType.includes(\"ProteomeAnalysis\") ? (\r\n \r\n ) : (\r\n Object.keys(metaData).map((metaField, i) => (\r\n
\r\n {metaData[metaField] === true || metaData[metaField] === false ? (\r\n \r\n onChangeMetaData(metaField, e.currentTarget.checked)\r\n }\r\n name=\"checkedB\"\r\n color=\"primary\"\r\n />\r\n }\r\n label={metaField}\r\n />\r\n ) : (\r\n onChangeMetaData(metaField, e.target.value)}\r\n />\r\n )}\r\n {/* onChangeMetaData(metaField, null)}\r\n >\r\n \r\n */}\r\n
\r\n ))\r\n )}\r\n
\r\n );\r\n }\r\n}\r\n\r\nStep1.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n formData: PropTypes.object.isRequired,\r\n projectProperties: PropTypes.object,\r\n projectStringProperties: PropTypes.object,\r\n onChangeMetaData: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(Step1);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { Grid, Button, TextField } from \"@mui/material\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = () => ({\r\n root: {},\r\n});\r\n\r\n// This is commented out since the attepts to implement an autocomplete\r\n// somehow failed. However, it took time to copy, so it stays for now.\r\n// // Product per specifications\r\n// const products = [\r\n// { label: \"Bratwurst\", abbr: \"BW\" },\r\n// { label: \"Kochpökelware\", abbr: \"KO\" },\r\n// { label: \"Rohpökelware\", abbr: \"RO\" },\r\n// { label: \"Brühwurst\", abbr: \"BR\" },\r\n// { label: \"Verarbeitugnsfleisch\", abbr: \"VA\" },\r\n// { label: \"Separatorenfleisch\", abbr: \"SP\" },\r\n// { label: \"Hackfleisch roh\", abbr: \"HA\" },\r\n// { label: \"Hackfleischerz. gegart\", abbr: \"HG\" },\r\n// { label: \"Kochwurst\", abbr: \"KO\" },\r\n// { label: \"Rohwurst\", abbr: \"RO\" },\r\n// { label: \"Aspikwaren\", abbr: \"AS\" },\r\n// { label: \"Rohfleisch\", abbr: \"RF\" },\r\n// { label: \"Gegartes Fleisch\", abbr: \"GF\" },\r\n// { label: \"Kontrollen\", abbr: \"KO\" },\r\n// { label: \"Stufenkontrollen\", abbr: \"SK\" },\r\n// { label: \"LVU\", abbr: \"LV\" },\r\n// { label: \"Zusätze\", abbr: \"ZU\" },\r\n// { label: \"Fisch\", abbr: \"FI\" },\r\n// { label: \"Vegetarische Produkte\", abbr: \"VP\" },\r\n// { label: \"Sonstiges\", abbr: \"SO\" },\r\n// ];\r\n\r\n// const products_2 = [\r\n// \"BW\",\r\n// \"KO\",\r\n// \"RO\",\r\n// \"BR\",\r\n// \"VA\",\r\n// \"SP\",\r\n// \"HA\",\r\n// \"HG\",\r\n// \"AS\",\r\n// \"RF\",\r\n// \"GF\",\r\n// \"SK\",\r\n// \"LV\",\r\n// \"ZU\",\r\n// \"FI\",\r\n// \"VP\",\r\n// \"SO\",\r\n// ];\r\n\r\nclass EmptySlideCreation extends Component {\r\n // Allow format YYYY-XXZZZZZ-FF-TT-SSS-NN\r\n allowed_formats = [\r\n /^[0-9]{4}-[0-9]{7}-[0-9_]{2}-[A-Z]{2}-[A-Z0-9_]{3}-[0-9]{2}$/,\r\n ];\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n emptyFile_name: \"\",\r\n ref_regex: React.createRef(),\r\n valid_regex: false,\r\n };\r\n }\r\n\r\n /**\r\n * Checks the input against all valid inputs and updates the status accordingly.\r\n * @param {string} input The currently typed value in the entry field.\r\n */\r\n checkFormat = (input) => {\r\n this.setState({\r\n valid_regex: this.allowed_formats.some((format) => {\r\n return format.test(input);\r\n }),\r\n });\r\n this.setState({ emptyFile_name: input });\r\n };\r\n\r\n /**\r\n * The histo classificaation module needs to work without an actual file.\r\n * Here, the interface is provided to add the relevant information to do so.\r\n * It mimics the filename structure YYYY-XXZZZZZ-FF-TT-SSS-NN\r\n * @returns empty file creation interface for histo modules\r\n */\r\n render() {\r\n return (\r\n \r\n \r\n this.checkFormat(e.target.value)}\r\n type=\"text\"\r\n variant=\"standard\"\r\n value={this.state.emptyFile_name}\r\n // Enable adding files with \"Enter\" key.\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n\r\n if (this.state.valid_regex) {\r\n // Add file with empty attribute to it\r\n this.props.addFile(\r\n e,\r\n this.state.emptyFile_name.concat(\" (empty)\")\r\n );\r\n // Clear entry field for next entry\r\n this.setState({ emptyFile_name: \"\" });\r\n }\r\n }\r\n }}\r\n />\r\n \r\n \r\n {/* Add Button */}\r\n \r\n {\r\n // Add file with empty attribute to it\r\n this.props.addFile(\r\n event,\r\n this.state.emptyFile_name.concat(\" (empty)\")\r\n );\r\n // Clear entry field for next entry\r\n this.setState({ emptyFile_name: \"\" });\r\n }}\r\n >\r\n Add Empty Slide\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nEmptySlideCreation.propTypes = {\r\n addFile: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(EmptySlideCreation);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport MoreVertIcon from \"@mui/icons-material/MoreVert\";\r\nimport {\r\n DialogContent,\r\n TextField,\r\n IconButton,\r\n Grid,\r\n Checkbox,\r\n ListItem,\r\n ListItemText,\r\n ListItemIcon,\r\n List,\r\n Typography,\r\n Tooltip,\r\n ListItemSecondaryAction,\r\n Menu,\r\n MenuItem,\r\n} from \"@mui/material\";\r\nimport Backend from \"../../../common/utils/Backend\";\r\nimport EmptySlideCreation from \"./EmptySlideCreation\";\r\nimport {\r\n Folder,\r\n ArrowUpward,\r\n ArrowDownward,\r\n Image,\r\n CheckBox,\r\n AddToPhotos,\r\n} from \"@mui/icons-material\";\r\n\r\nconst styles = () => ({\r\n root: {},\r\n freeHistoParameters: {},\r\n applyButton: {\r\n width: \"100%\",\r\n },\r\n dialogContent: {\r\n paddingTop: 0,\r\n maxWidth: 900,\r\n height: 600,\r\n },\r\n fileList: {\r\n border: \"2px solid rgb(218, 218, 218)\",\r\n height: \"100%\",\r\n overflowY: \"auto\",\r\n minHeight: \"calc(100% - 35px)\",\r\n maxHeight: \"500px\",\r\n },\r\n});\r\n\r\n// The openslide reader cannot work with non-ascii symbols\r\nconst non_utf8_capable_filetypes = [\"mrxs\", \"svs\", \"ndpi\", \"svslide\"];\r\n\r\nclass Step2 extends Component {\r\n constructor(props) {\r\n super(props);\r\n this._isMounted = false;\r\n this.state = {\r\n dirfiles: [],\r\n currentPath: \"\",\r\n lastFileName: \"\",\r\n filterText: \"\",\r\n sortMenuOpen: false,\r\n sortBy: \"name\",\r\n sortReverse: true,\r\n };\r\n\r\n this.updateFolderList(\"\");\r\n }\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n getLastDir = (folderPath) => {\r\n let pathEnding = \"-1\";\r\n let lastSeperator = folderPath.lastIndexOf(\"/\");\r\n if (lastSeperator < 0) {\r\n lastSeperator = folderPath.lastIndexOf(String.fromCharCode(92));\r\n }\r\n if (lastSeperator > 0) {\r\n pathEnding = folderPath.substr(lastSeperator + 1, folderPath.length);\r\n }\r\n return pathEnding;\r\n };\r\n\r\n onChangeFilter(e) {\r\n let filterText = e.target.value;\r\n let { currentPath } = this.state;\r\n this.setMountedState({ filterText });\r\n this.updateFolderList(currentPath, filterText);\r\n }\r\n\r\n getFilesFromPath = (currentPath, filterText, callback, addAll = false) => {\r\n let supportedFileFormats = [];\r\n\r\n if (this.props.formData.projectType === \"ProteomeAnalysis\") {\r\n supportedFileFormats = [\"txt\"];\r\n } else if (\r\n this.props.formData.projectType === \"ESREvaluation\" ||\r\n this.props.formData.projectType === \"ESRTraining\"\r\n ) {\r\n supportedFileFormats = [\"csv\"];\r\n } else {\r\n supportedFileFormats = [\r\n \"avi\",\r\n \"bmp\",\r\n \"czi\",\r\n \"dm3\",\r\n \"gif\",\r\n \"hsasld\",\r\n \"jpeg\",\r\n \"jpg\",\r\n \"lif\",\r\n \"mp4\",\r\n \"mrxs\",\r\n \"ndpi\",\r\n \"png\",\r\n \"scn\",\r\n \"svs\",\r\n \"svslide\",\r\n // The following formats are not supported on linux systems\r\n \"isyntax\",\r\n \"nd2\",\r\n \"tif\",\r\n \"tiff\",\r\n \"zvi\",\r\n ];\r\n }\r\n\r\n // load list of available files\r\n Backend.walkDir(currentPath, (e) => {\r\n let filteredDirFiles = e.filter((entry) => {\r\n // filter out files with not supported file formats (e.g. .xlsx)\r\n if (entry.type === \"file\") {\r\n let pathParts = entry.path.split(\".\");\r\n let extension = pathParts[pathParts.length - 1].toLowerCase();\r\n if (supportedFileFormats.indexOf(extension) < 0) {\r\n return false;\r\n }\r\n // Filter out placeholder file\r\n let filename = pathParts[pathParts.length - 2];\r\n if (filename === \"empty_file\") {\r\n return false;\r\n }\r\n }\r\n\r\n if (filterText !== \"\") {\r\n let path = entry.path.split(\"/\")[entry.path.split(\"/\").length - 1];\r\n if (path.toLowerCase().includes(filterText.toLowerCase())) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n if (entry.type === \"directory\" && !addAll) {\r\n const foldersToExclude = [\"DAT\", \"SCS\", \"ANS\"];\r\n const lastDir = this.getLastDir(entry.path);\r\n if (foldersToExclude.includes(lastDir)) return false;\r\n\r\n let sameMrxsFile = e.find((element) => {\r\n return element.path === entry.path + \".mrxs\";\r\n });\r\n return typeof sameMrxsFile === \"undefined\";\r\n } else if (addAll && entry.type === \"directory\") {\r\n this.getFilesFromPath(entry.path, filterText, callback, addAll);\r\n } else {\r\n return true;\r\n }\r\n }\r\n });\r\n\r\n let sortedDirFiles = filteredDirFiles.sort((a, b) => {\r\n if (a.path > b.path) {\r\n return 1;\r\n }\r\n if (a.path < b.path) {\r\n return -1;\r\n }\r\n return 0;\r\n });\r\n\r\n callback(sortedDirFiles);\r\n });\r\n };\r\n\r\n updateFolderList = (currentPath, filterText = \"\") => {\r\n this.getFilesFromPath(currentPath, filterText, (dirfiles) => {\r\n // write received info into state\r\n this.setMountedState({\r\n currentPath: currentPath,\r\n dirfiles: dirfiles,\r\n });\r\n });\r\n };\r\n\r\n addFile = (event, fileName) => {\r\n // Ensure that only ascii-conform paths are used.\r\n if (\r\n non_utf8_capable_filetypes.includes(\r\n fileName.split(\".\").pop().toLowerCase()\r\n )\r\n ) {\r\n let hasMoreThanAscii = [...fileName].some(\r\n (char) => char.charCodeAt(0) > 127\r\n );\r\n if (hasMoreThanAscii) {\r\n window.showErrorSnackbar(\r\n \"File type does not support characters such as 'ä', 'ö', 'ü', or 'ß' in path.\"\r\n );\r\n window.openWarningDialog(\r\n \"The file \" +\r\n fileName +\r\n \" or its path contain invalid characters such as 'ä', 'ö', 'ü', or 'ß'. \\\r\n Please rename the file or its folder.\"\r\n );\r\n return;\r\n }\r\n }\r\n\r\n let { files } = this.props.formData;\r\n let { lastFileName, dirfiles } = this.state;\r\n let dirFilePaths = dirfiles.map((file) => file.path);\r\n if (event.shiftKey && lastFileName !== \"\") {\r\n let lastFileIdx = dirFilePaths.indexOf(lastFileName);\r\n if (lastFileIdx >= 0) {\r\n let fileIdx = dirFilePaths.indexOf(fileName);\r\n let firstIdx = Math.min(lastFileIdx, fileIdx);\r\n let lastIdx = Math.max(lastFileIdx, fileIdx);\r\n files = files.filter((file) => !dirFilePaths.includes(file));\r\n for (let i = firstIdx; i <= lastIdx; i++) {\r\n let fileNameToAdd = dirFilePaths[i];\r\n files.push(fileNameToAdd);\r\n }\r\n this.props.onChangeFiles(files.sort());\r\n }\r\n } else {\r\n if (files.includes(fileName)) {\r\n files = files.filter((c) => c !== fileName);\r\n } else {\r\n files.push(fileName);\r\n }\r\n this.setMountedState({ lastFileName: fileName });\r\n this.props.onChangeFiles(files.sort());\r\n }\r\n };\r\n\r\n toggleAllFiles = (currentPath) => {\r\n let { dirfiles } = this.state;\r\n let { files } = this.props.formData;\r\n if (dirfiles.filter((file) => files.includes(file.path)).length > 0) {\r\n this.removeFolder(currentPath);\r\n } else {\r\n this.addFolder(currentPath);\r\n }\r\n };\r\n\r\n addFolder = (folderPath) => {\r\n this.getFilesFromPath(\r\n folderPath,\r\n \"\",\r\n (dirfiles) => {\r\n let filePaths = dirfiles.map((file) => file.path);\r\n let { files } = this.props.formData;\r\n let filteredFiles = filePaths.filter(\r\n (file) => !files.some((x) => file === x)\r\n );\r\n let filesToAdd = files.concat(filteredFiles);\r\n this.props.onChangeFiles(filesToAdd);\r\n },\r\n true\r\n );\r\n };\r\n\r\n removeFolder = () => {\r\n let { files } = this.props.formData;\r\n let dirFilePaths = this.state.dirfiles.map((file) => file.path);\r\n let resultFiles = files.filter((file) => dirFilePaths.indexOf(file) < 0);\r\n if (files.length !== resultFiles.length) {\r\n this.props.onChangeFiles(resultFiles.sort());\r\n }\r\n };\r\n\r\n isDisabled = (relativePath) => {\r\n let { project } = this.props;\r\n if (project) {\r\n const projectFiles = [\r\n ...new Set(project.files.map((file) => file.relativePath)),\r\n ];\r\n if (projectFiles.includes(relativePath)) return true;\r\n }\r\n return false;\r\n };\r\n\r\n toggleSortMenu = () => {\r\n this.setMountedState({ sortMenuOpen: !this.state.sortMenuOpen });\r\n };\r\n\r\n setSortBy = (value) => {\r\n let { sortBy, sortReverse } = this.state;\r\n\r\n if (value === sortBy) {\r\n sortReverse = !sortReverse;\r\n } else {\r\n sortReverse = false;\r\n }\r\n\r\n let dirfiles = [];\r\n if (value === \"name\") {\r\n dirfiles = this.state.dirfiles.sort((a, b) => {\r\n if (a.path > b.path) {\r\n return 1;\r\n }\r\n if (a.path < b.path) {\r\n return -1;\r\n }\r\n return 0;\r\n });\r\n } else {\r\n dirfiles = this.state.dirfiles.sort((a, b) => {\r\n if (a.creationTime > b.creationTime) {\r\n return 1;\r\n }\r\n if (a.creationTime < b.creationTime) {\r\n return -1;\r\n }\r\n return 0;\r\n });\r\n }\r\n if (!sortReverse) {\r\n dirfiles = dirfiles.reverse();\r\n }\r\n\r\n this.setMountedState({\r\n dirfiles: dirfiles,\r\n sortMenuOpen: false,\r\n sortBy: value,\r\n sortReverse: sortReverse,\r\n });\r\n };\r\n\r\n /**\r\n * Sets an image to the default error image when there is an error.\r\n * @param {field} e The field event\r\n */\r\n image_error = (e) => {\r\n e.target.src = \"/img/image_error.svg\";\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { files } = this.props.formData;\r\n const {\r\n dirfiles,\r\n currentPath,\r\n filterText,\r\n sortMenuOpen,\r\n sortBy,\r\n sortReverse,\r\n } = this.state;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n \r\n Microscope Files:\r\n \r\n
\r\n \r\n {\r\n this.anchorEl = node;\r\n }}\r\n aria-controls=\"sort-menu\"\r\n aria-haspopup=\"true\"\r\n onClick={() => this.toggleSortMenu()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n this.toggleSortMenu()}\r\n >\r\n this.setSortBy(\"name\")}>\r\n Sort by name{\" \"}\r\n {sortBy === \"name\" && (\r\n \r\n {sortReverse ? : }\r\n \r\n )}\r\n \r\n this.setSortBy(\"date\")}>\r\n Sort by creation date{\" \"}\r\n {sortBy === \"date\" && (\r\n \r\n {sortReverse ? : }\r\n \r\n )}\r\n \r\n \r\n
\r\n
\r\n\r\n
\r\n \r\n this.onChangeFilter(e)}\r\n />\r\n
\r\n \r\n {currentPath && (\r\n \r\n \r\n files.includes(file.path))\r\n .length > 0\r\n }\r\n onChange={() => this.toggleAllFiles(currentPath)}\r\n />\r\n \r\n \r\n \r\n {\r\n this.updateFolderList(\r\n currentPath.substring(\r\n 0,\r\n currentPath.lastIndexOf(\"/\")\r\n )\r\n );\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {dirfiles.map((e, id) =>\r\n e.type === \"file\" ? (\r\n this.addFile(clickEvent, e.path)}\r\n >\r\n \r\n \r\n
\r\n {\r\n \r\n }\r\n \r\n {e.path}\r\n
\r\n \r\n \r\n }\r\n >\r\n {files.includes(e.path) ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n
\r\n \r\n
\r\n File Size:{\" \"}\r\n
\r\n {e.fileSize}\r\n
\r\n
\r\n Creation Date:{\" \"}\r\n
\r\n {e.creationTime}\r\n \r\n }\r\n >\r\n \r\n \r\n \r\n ) : (\r\n this.updateFolderList(e.path)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n this.addFolder(e.path)}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n )\r\n )}\r\n
\r\n
\r\n \r\n \r\n Project Files:\r\n \r\n \r\n {files.map((e, i) => (\r\n \r\n this.addFile(clickEvent, e)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n
\r\n {/* Allow slide-free projects in Hist Classification Module. */}\r\n {/* Meta-Data will need to be entered manually. */}\r\n {this.props.formData.projectType === \"HistoClassification\" && (\r\n \r\n )}\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nStep2.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n formData: PropTypes.object,\r\n onChangeFiles: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(Step2);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { Button, Dialog, DialogTitle, MobileStepper } from \"@mui/material\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { KeyboardArrowLeft, KeyboardArrowRight } from \"@mui/icons-material\";\r\nimport { ValidatorForm } from \"react-material-ui-form-validator\";\r\nimport { authenticationService } from \"../../common/services\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nimport Step0 from \"./CreateProjectdialogComponents/Step0\";\r\nimport Step1 from \"./CreateProjectdialogComponents/Step1\";\r\nimport Step2 from \"./CreateProjectdialogComponents/Step2\";\r\n\r\nconst styles = () => ({\r\n root: {},\r\n});\r\n\r\nclass CreateProjectDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n submitted: false,\r\n activeStep: 0,\r\n projectTypes: [],\r\n formData: {\r\n name: props.newdefaultname,\r\n projectType: \"\",\r\n metaData: {},\r\n files: [],\r\n projectProperties: {},\r\n projectStringProperties: {},\r\n },\r\n };\r\n\r\n Backend.loadAvailableProjectTypes((projectTypes) => {\r\n const { formData } = this.state;\r\n // order project types by order attribute\r\n projectTypes = projectTypes.sort((a, b) => a.order - b.order);\r\n Backend.getLicensingInfo((license) => {\r\n if (license.activeModules.length > 0) {\r\n if (license.licenseStatus !== \"VALID\") {\r\n authenticationService.logout();\r\n this.props.history.push(\"/licensing\");\r\n return;\r\n }\r\n\r\n projectTypes = projectTypes.map((projectType) => {\r\n if (license.activeModules.length > 0) {\r\n let activeModule = license.activeModules.find(\r\n (x) => x.name === projectType.name\r\n );\r\n if (activeModule) {\r\n projectType.expirationDate = activeModule.expirationDate;\r\n projectType.isValid = !activeModule.isExpired;\r\n projectType.expiresInDays = activeModule.expiresInDays;\r\n } else {\r\n projectType.isValid = false;\r\n }\r\n } else {\r\n projectType.isValid = true;\r\n }\r\n return projectType;\r\n });\r\n\r\n projectTypes = projectTypes.filter(\r\n (projectType) => typeof projectType.expirationDate !== \"undefined\"\r\n );\r\n if (projectTypes.length > 0) {\r\n // select default project type\r\n let firstValidProjectType = projectTypes.find((pt) => pt.isValid);\r\n if (firstValidProjectType) {\r\n formData.projectType = firstValidProjectType.name;\r\n for (let metaField of projectTypes.find(\r\n (c) => c.name === formData.projectType\r\n ).metaData) {\r\n // use existing value or init dict entry with empty string\r\n formData.metaData[metaField] =\r\n metaField === \"Datum\" || metaField === \"Date\"\r\n ? this.getDate()\r\n : formData.metaData[metaField] || \"\";\r\n }\r\n }\r\n }\r\n }\r\n\r\n // write received info into state\r\n this.setState({\r\n projectTypes: projectTypes,\r\n formData,\r\n metaData: {},\r\n files: [],\r\n });\r\n });\r\n });\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n // on open dialog\r\n if (prevProps.open !== this.props.open && this.props.open) {\r\n const { formData } = this.state;\r\n if (this.props.project) {\r\n formData.files = [\r\n ...new Set(this.props.project.files.map((file) => file.relativePath)),\r\n ];\r\n formData.name = this.props.project.name;\r\n formData.projectType = this.props.project.type;\r\n } else {\r\n formData.files = [];\r\n formData.name = this.props.newdefaultname;\r\n }\r\n this.setState({\r\n submitted: false,\r\n activeStep: 0,\r\n formData,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Defines what happens when the next button is pressed.\r\n * When moving a step forward, checks are made to see if the next option is necessary.\r\n * When finishing the final step, project is created or updated.\r\n */\r\n handleNext = () => {\r\n if (this.props.project) {\r\n this.props.onClose();\r\n }\r\n const { formData } = this.state;\r\n if (this.state.activeStep >= 2) {\r\n // last step -> submit data\r\n this.setState({ submitted: true });\r\n if (this.props.project) {\r\n //this.onSaveName(this.props.project.name);\r\n Backend.updateProjectFiles(this.props.project.id, formData, (e) => {\r\n this.setState({ submitted: false });\r\n this.handleClose();\r\n this.props.history.push(\"/view/\" + e.projectId);\r\n });\r\n } else {\r\n if (\r\n formData.projectType.includes(\"HistoClassification\") ||\r\n formData.projectType.includes(\"HistoPointCounting\")\r\n ) {\r\n let name = formData.files[0];\r\n name = name.replace(/\\\\/g, \"/\");\r\n let name_array = name.split(\"/\");\r\n name = name_array[name_array.length - 1];\r\n name = name.split(\".\")[0];\r\n name_array = name.split(\"-\");\r\n let i = 0;\r\n while (i < name_array.length - 1) {\r\n if (i === 0) {\r\n name = name_array[i];\r\n } else {\r\n name = name + \"-\" + name_array[i];\r\n }\r\n i = i + 1;\r\n }\r\n\r\n formData.name = name;\r\n this.setState({ formData: formData });\r\n }\r\n Backend.createProject(this.state.formData, (e) => {\r\n this.setState({ submitted: false });\r\n this.handleClose();\r\n if (formData.projectType.includes(\"ProteomeAnalysis\")) {\r\n Backend.loadProject(\r\n {\r\n id: e.projectId,\r\n },\r\n (project) => {\r\n Backend.getCurrentUser((user) => {\r\n const projectModel = {\r\n name: project.name,\r\n user: user.fullName,\r\n id: project.id,\r\n readableId: project.readableId,\r\n metaData: JSON.parse(project.metaData),\r\n type: project.type,\r\n tools: project.viewerConfig.project.tools,\r\n job: project.viewerConfig.project.job,\r\n files: project.files,\r\n };\r\n Backend.saveProject(projectModel, (data) => {\r\n if (data.success) {\r\n this.props.handle_active_tab_change(0);\r\n Backend.setProjectsPending([project.id], () => {\r\n console.log(\"job ready to start!\");\r\n });\r\n }\r\n });\r\n });\r\n }\r\n );\r\n } else if (\r\n formData.projectType.includes(\"ESRTraining\") ||\r\n formData.projectType.includes(\"ESREvaluation\")\r\n ) {\r\n this.props.history.push(\"/esr_view/\" + e.projectId);\r\n } else {\r\n this.props.history.push(\"/view/\" + e.projectId);\r\n }\r\n });\r\n }\r\n } else {\r\n let nextStep = this.state.activeStep + 1;\r\n if (formData.projectType === \"\") {\r\n window.openWarningDialog(\"Please select a Project Module!\");\r\n return;\r\n }\r\n\r\n if (nextStep === 1 && Object.keys(formData.metaData).length === 0) {\r\n nextStep++;\r\n }\r\n this.setState({ activeStep: nextStep, formData });\r\n }\r\n };\r\n\r\n handleBack = () => {\r\n const { formData } = this.state;\r\n if (this.state.activeStep === 0) {\r\n this.props.onClose();\r\n } else {\r\n let prevStep = this.state.activeStep - 1;\r\n\r\n if (prevStep === 1 && Object.keys(formData.metaData).length === 0) {\r\n prevStep--;\r\n }\r\n formData.files = [];\r\n this.setState({ activeStep: prevStep, formData: formData });\r\n }\r\n };\r\n\r\n handleClose = () => {\r\n this.props.onClose();\r\n };\r\n\r\n uploadFile() {\r\n Backend.uploadFile(\r\n this.state.files[0],\r\n (e) => {\r\n this.setState({ completed: e });\r\n },\r\n () => {\r\n this.handleClose();\r\n }\r\n );\r\n }\r\n\r\n onChangeName = (e) => {\r\n const { formData } = this.state;\r\n formData.name = e;\r\n this.setState({ formData });\r\n if (this.props.project) {\r\n let project = this.props.project;\r\n project.name = e;\r\n }\r\n };\r\n\r\n onSaveName = () => {\r\n if (this.props.project) {\r\n Backend.renameProject(\r\n this.props.project.id,\r\n this.props.project.name,\r\n () => {\r\n console.log(\"project changed!\");\r\n }\r\n );\r\n }\r\n };\r\n\r\n /**\r\n * Fills in project parameters for saving.\r\n * Checks for valid expiration date and gives expiration notice.\r\n * @param {Object} e Selected module from step 0, including properties.\r\n */\r\n onProjectType = (e) => {\r\n let formData = this.state.formData;\r\n formData.projectProperties = e.projectProperties;\r\n formData.projectStringProperties = e.ProjectStringProperties;\r\n formData.metaData = e.metaData;\r\n formData.toolsInProject = e.toolsInProject;\r\n this.setState({ formData: formData });\r\n\r\n if (!e.isValid && e.expirationDate) {\r\n window.openWarningDialog(\r\n \"This Project Module expired on \" +\r\n e.expirationDate.replace(\"T00:00:00\", \"\") +\r\n \".\\nPlease contact HS Analysis GmbH to updated the licence!\"\r\n );\r\n return;\r\n }\r\n if (this.props.project) {\r\n window.openWarningDialog(\r\n \"Project already created and the Project Type can't be changed afterwards.\\nPlease create a new Project instead.\"\r\n );\r\n } else {\r\n const { formData, projectTypes } = this.state;\r\n formData.projectType = e.name;\r\n formData.metaData = {};\r\n\r\n let selectedProjectType = projectTypes.find(\r\n (pt) => pt.name === formData.projectType\r\n );\r\n if (\r\n selectedProjectType &&\r\n selectedProjectType.name.includes(\"ProteomeAnalysis\")\r\n ) {\r\n formData.projectStringProperties =\r\n selectedProjectType.projectStringProperties;\r\n formData.projectProperties = selectedProjectType.projectProperties;\r\n for (const [key, value] of Object.entries(\r\n formData.projectStringProperties\r\n )) {\r\n formData.metaData[key] = value.split(\",\")[0];\r\n }\r\n for (const [key, value] of Object.entries(formData.projectProperties)) {\r\n formData.metaData[key] = value;\r\n }\r\n }\r\n for (let metaField of this.state.projectTypes.find(\r\n (c) => c.name === e.name\r\n ).metaData) {\r\n // use existing value or init dict entry with empty string\r\n formData.metaData[metaField] =\r\n metaField === \"Datum\" || metaField === \"Date\"\r\n ? this.getDate()\r\n : formData.metaData[metaField] || \"\";\r\n }\r\n this.setState({ formData });\r\n }\r\n };\r\n\r\n onChangeMetaData = (field, e) => {\r\n const { formData } = this.state;\r\n if (e === null) {\r\n // delete field\r\n delete formData.metaData[field];\r\n } else {\r\n // update fiel value\r\n formData.metaData[field] = e;\r\n }\r\n this.setState({ formData });\r\n };\r\n\r\n onChangeFiles = (e) => {\r\n const { formData } = this.state;\r\n formData.files = e;\r\n this.setState({ formData });\r\n };\r\n\r\n getDate = () => {\r\n let today = new Date();\r\n let dd = String(today.getDate()).padStart(2, \"0\");\r\n let mm = String(today.getMonth() + 1).padStart(2, \"0\");\r\n let yyyy = today.getFullYear();\r\n today = dd + \".\" + mm + \".\" + yyyy;\r\n return today;\r\n };\r\n\r\n render() {\r\n // const { ...other } = this.props;\r\n const { activeStep, formData, projectTypes, submitted } = this.state;\r\n\r\n return (\r\n \r\n Create New Project\r\n \r\n {activeStep === 0 && (\r\n \r\n )}\r\n {activeStep === 1 && (\r\n \r\n )}\r\n {activeStep === 2 && (\r\n \r\n )}\r\n \r\n {/* Change Next Button depending on if you're editing a project\r\n or creating a new one */}\r\n {this.props.project ? \"Save\" : \"Next\"}\r\n {!this.props.project && }\r\n \r\n }\r\n backButton={\r\n \r\n \r\n {\"Back\"}\r\n \r\n }\r\n />\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nCreateProjectDialog.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n project: PropTypes.object,\r\n onClose: PropTypes.func,\r\n selectedValue: PropTypes.string,\r\n newdefaultname: PropTypes.string,\r\n handle_active_tab_change: PropTypes.func,\r\n open: PropTypes.bool,\r\n history: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(CreateProjectDialog));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport CheckIcon from \"@mui/icons-material/Check\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContentText,\r\n DialogContent,\r\n TextField,\r\n DialogActions,\r\n Button,\r\n InputAdornment,\r\n Tooltip,\r\n} from \"@mui/material\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst styles = () => ({\r\n root: {},\r\n dialogContent: {\r\n paddingTop: 0,\r\n maxWidth: 900,\r\n minWidth: 750,\r\n },\r\n tileImage: {},\r\n tileBar: {\r\n position: \"absolute\",\r\n left: \"0\",\r\n bottom: \"0\",\r\n width: \"100%\",\r\n height: \"auto\",\r\n padding: \"14px\",\r\n fontFamily: \"Roboto, Helvetica, Arial, sans-serif\",\r\n fontSize: \"1em\",\r\n color: \"white\",\r\n background: \"rgba(0,0,0,0.5)\",\r\n },\r\n projectTile: {\r\n cursor: \"pointer\",\r\n \"&:hover\": {\r\n background: \"#AAA\",\r\n },\r\n },\r\n projectTileSelected: {\r\n background: \"#1BA1E2!important\",\r\n },\r\n projectTilesList: {\r\n maxHeight: \"500px\",\r\n padding: 3,\r\n },\r\n});\r\n\r\nclass ImportProjectsDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n formData: props.formData\r\n ? props.formData\r\n : {\r\n filesToMap: [],\r\n },\r\n open: Boolean(props.open),\r\n };\r\n }\r\n\r\n /**\r\n * Open/Show ImportProjectsDialog.\r\n * Main way to open this dialog.\r\n * @param {JSON} formData File mappings, mapping previous to new files.\r\n */\r\n show(formData) {\r\n this.setState({ open: true, formData });\r\n }\r\n\r\n /**\r\n * Close ImportProjectsDialog. Resets state.\r\n */\r\n handleClose = () => {\r\n this.setState({\r\n open: false,\r\n formData: {\r\n filesToMap: [],\r\n },\r\n });\r\n };\r\n\r\n /**\r\n * Submit all updated filepaths to backend for project completion.\r\n */\r\n handleSubmit = () => {\r\n let { formData } = this.state;\r\n // Ensure all files with the same origin file get the updated new path\r\n formData.filesToMap\r\n // Find all duplicate items, except the first one, i.e. the ones that have not been updated.\r\n .filter(\r\n (mapping, index, array) =>\r\n array.findIndex(\r\n (el) => el.file.sourcePath === mapping.file.sourcePath\r\n ) !== index\r\n )\r\n // Equalize settings for all files with the same sourcePath\r\n .forEach((dupeObject) => {\r\n dupeObject.newPath = formData.filesToMap.find(\r\n (mapping) => mapping.file.sourcePath === dupeObject.file.sourcePath\r\n ).newPath;\r\n });\r\n this.setState({ formData });\r\n\r\n // No duplicate paths per file allowed\r\n if (\r\n formData.filesToMap\r\n // All files with potential duplicates, could be same file, different scene\r\n .filter(\r\n (mapping, index, array) =>\r\n array.findIndex(\r\n (el) =>\r\n el.newPath === mapping.newPath &&\r\n el.file.sourcePath !== mapping.file.sourcePath\r\n ) !== index\r\n )\r\n // Exclude same file, different scene from duplicates\r\n .some((dup) =>\r\n formData.filesToMap\r\n .filter(\r\n (el) =>\r\n el.newPath === dup.newPath &&\r\n el.file.sourcePath !== dup.file.sourcePath\r\n )\r\n .some((el) => el.file.scene === dup.file.scene)\r\n )\r\n ) {\r\n // Assign all duplicates as such\r\n formData.filesToMap.forEach((mapping) => {\r\n if (\r\n formData.filesToMap.some(\r\n (potDupe) =>\r\n potDupe.newPath === mapping.newPath &&\r\n potDupe.file.sourcePath !== mapping.file.sourcePath\r\n )\r\n ) {\r\n mapping.found = false;\r\n } else {\r\n // Note: potentially marks \"not-found\" items as found, as they are no duplicates\r\n mapping.found = true;\r\n }\r\n });\r\n\r\n window.showErrorSnackbar(\r\n \"Please remove duplicate file assignments. Each filepath must be unique.\"\r\n );\r\n this.setState({ formData });\r\n return;\r\n }\r\n\r\n Backend.importProjectsFinalize(\r\n formData,\r\n // Success\r\n () => {\r\n this.handleClose();\r\n },\r\n // Error\r\n (err) => {\r\n console.warn(err);\r\n window.openWarningDialog(err);\r\n }\r\n );\r\n };\r\n\r\n render() {\r\n const { open, formData } = this.state;\r\n\r\n return (\r\n \r\n Map Files of Imported Project\r\n \r\n \r\n Import file doesn't contain image files. Please select the\r\n corresponding files from your hard drive.\r\n \r\n {formData.filesToMap\r\n // Only show unique source files, not one per scene of file.\r\n .filter(\r\n (mapping, index, array) =>\r\n array.findIndex(\r\n (el) => el.file.sourcePath === mapping.file.sourcePath\r\n ) === index\r\n )\r\n .map((c) => (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n }}\r\n disabled\r\n autoFocus\r\n margin=\"dense\"\r\n label=\"Old Path\"\r\n fullWidth\r\n variant=\"filled\"\r\n />\r\n {\r\n c.newPath = e.target.value;\r\n this.forceUpdate();\r\n }}\r\n autoFocus\r\n margin=\"dense\"\r\n label=\"New Path\"\r\n fullWidth\r\n error={!c.found}\r\n />\r\n
\r\n ))}\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nImportProjectsDialog.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n formData: PropTypes.object,\r\n open: PropTypes.bool,\r\n};\r\n\r\nexport default withStyles(styles)(ImportProjectsDialog);\r\n","import React, { useRef } from \"react\";\r\nimport classNames from \"classnames\";\r\nimport PropTypes from \"prop-types\";\r\nimport { lighten, darken } from \"@mui/material/styles\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TablePagination,\r\n TableRow,\r\n TableSortLabel,\r\n Toolbar,\r\n Typography,\r\n Paper,\r\n Checkbox,\r\n IconButton,\r\n Tooltip,\r\n Button,\r\n LinearProgress,\r\n // SvgIcon,\r\n Tabs,\r\n Tab,\r\n TextField,\r\n} from \"@mui/material\";\r\nimport CustomSvgIcon from \"../../globalComponents/CustomSvgIcon\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\r\nimport TimerIcon from \"@mui/icons-material/Timer\";\r\nimport { convertDate } from \"../../common/utils/Localization\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\nimport \"./../../css/tooltip.css\";\r\nimport {\r\n Stop,\r\n FileCopy,\r\n CloudDownload,\r\n CloudUpload,\r\n} from \"@mui/icons-material\";\r\nimport ImportProjectsDialog from \"../dialogs/ImportProjectsDialog\";\r\n\r\nfunction desc(a, b, orderBy) {\r\n if (b[orderBy] < a[orderBy]) {\r\n return -1;\r\n }\r\n if (b[orderBy] > a[orderBy]) {\r\n return 1;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction stableSort(array, cmp) {\r\n const stabilizedThis = array.map((el, index) => [el, index]);\r\n stabilizedThis.sort((a, b) => {\r\n const order = cmp(a[0], b[0]);\r\n if (order !== 0) return order;\r\n return a[1] - b[1];\r\n });\r\n return stabilizedThis.map((el) => el[0]);\r\n}\r\n\r\nfunction getSorting(order, orderBy) {\r\n return order === \"desc\"\r\n ? (a, b) => desc(a, b, orderBy)\r\n : (a, b) => -desc(a, b, orderBy);\r\n}\r\n\r\nconst rows = [\r\n { id: \"readableId\", numeric: false, disablePadding: false, label: \"ID\" },\r\n { id: \"thumbnail\", numeric: false, disablePadding: true, label: \"Preview\" },\r\n { id: \"name\", numeric: false, disablePadding: true, label: \"Name\" },\r\n { id: \"type\", numeric: true, disablePadding: false, label: \"Method\" },\r\n { id: \"state\", numeric: true, disablePadding: false, label: \"State\" },\r\n {\r\n id: \"creationDateTime\",\r\n numeric: true,\r\n disablePadding: false,\r\n label: \"Created\",\r\n },\r\n { id: \"actions\", numeric: false, disablePadding: false, label: \"Actions\" },\r\n];\r\n\r\nclass EnhancedTableHead extends React.Component {\r\n createSortHandler = (property) => (event) => {\r\n this.props.onRequestSort(event, property);\r\n };\r\n\r\n render() {\r\n const { onSelectAllClick, order, orderBy, numSelected } = this.props;\r\n\r\n return (\r\n \r\n \r\n \r\n 0} onChange={onSelectAllClick} />\r\n \r\n {rows.map(\r\n (row) => (\r\n \r\n \r\n \r\n {row.label}\r\n \r\n \r\n \r\n ),\r\n this\r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nEnhancedTableHead.propTypes = {\r\n numSelected: PropTypes.number.isRequired,\r\n onRequestSort: PropTypes.func.isRequired,\r\n onSelectAllClick: PropTypes.func.isRequired,\r\n order: PropTypes.string.isRequired,\r\n orderBy: PropTypes.string.isRequired,\r\n rowCount: PropTypes.number.isRequired,\r\n};\r\n\r\nconst toolbarStyles = (theme) => ({\r\n root: {\r\n paddingRight: theme.spacing(1),\r\n },\r\n highlight:\r\n theme.palette.mode === \"light\"\r\n ? {\r\n color: theme.palette.secondary.main,\r\n backgroundColor: lighten(theme.palette.secondary.light, 0.85),\r\n }\r\n : {\r\n color: theme.palette.text.primary,\r\n backgroundColor: theme.palette.secondary.dark,\r\n },\r\n spacer: {\r\n flex: \"1 1 100%\",\r\n },\r\n actions: {\r\n color: theme.palette.text.secondary,\r\n },\r\n title: {\r\n flex: \"0 0 auto\",\r\n },\r\n});\r\n\r\nlet EnhancedTableToolbar = (props) => {\r\n const {\r\n numSelected,\r\n classes,\r\n onDeleteClick,\r\n onRunSelectedClick,\r\n onTimedRunSelectedClick,\r\n onDuplicateSelectedClick,\r\n onImportClick,\r\n onExportClick,\r\n searchText,\r\n onChangeFilter,\r\n } = props;\r\n\r\n const fileUploader = useRef(null);\r\n\r\n const onChangeFile = (event) => {\r\n props.spinloader.show();\r\n event.stopPropagation();\r\n event.preventDefault();\r\n onImportClick(event.target.files);\r\n event.target.value = \"\";\r\n };\r\n\r\n return (\r\n 0,\r\n })}\r\n >\r\n
\r\n {numSelected > 0 ? (\r\n \r\n {numSelected} selected\r\n \r\n ) : (\r\n \r\n Projects\r\n \r\n )}\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n {numSelected > 0 ? (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n ) : (\r\n \r\n fileUploader.current.click()}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nEnhancedTableToolbar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n numSelected: PropTypes.number.isRequired,\r\n onDeleteClick: PropTypes.func,\r\n onImportClick: PropTypes.func,\r\n onExportClick: PropTypes.func,\r\n onRunSelectedClick: PropTypes.func,\r\n onTimedRunSelectedClick: PropTypes.func,\r\n searchText: PropTypes.string,\r\n onChangeFilter: PropTypes.func,\r\n onDuplicateSelectedClick: PropTypes.func,\r\n spinloader: PropTypes.object,\r\n};\r\n\r\nEnhancedTableToolbar = withStyles(toolbarStyles)(EnhancedTableToolbar);\r\n\r\nconst styles = () => ({\r\n root: {\r\n width: \"100%\",\r\n },\r\n table: {\r\n minWidth: 1020,\r\n },\r\n tableRow: {\r\n cursor: \"pointer\",\r\n },\r\n tableWrapper: {\r\n overflowX: \"auto\",\r\n height: \"calc(100vh - 232px)\",\r\n },\r\n paginationSpacer: {\r\n flex: \"0.0 1 0%\",\r\n },\r\n creatingJobBar: {\r\n backgroundColor: darken(\"#216DC0\", 0.3),\r\n },\r\n input: {\r\n width: \"calc(100% - 48px)\",\r\n },\r\n progressBarContainer: {\r\n position: \"relative\",\r\n },\r\n progressBar: {\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n width: \"100%\",\r\n lineHeight: \"20px\",\r\n textAlign: \"center\",\r\n },\r\n});\r\n\r\nclass ProjectsTable extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this._isMounted = false;\r\n this.state = {\r\n order: \"desc\",\r\n orderBy: \"changeDateTime\",\r\n selected: [],\r\n page: 0,\r\n rowsPerPage: 50,\r\n searchText: \"\",\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n this._isMounted = true;\r\n Backend.loadAvailableProjectTypes((e) => {\r\n this.setState({\r\n projectTypes: e,\r\n projectTypesNames: e.map((projectType) => projectType.name),\r\n });\r\n });\r\n };\r\n\r\n componentWillUnmount = () => {\r\n this._isMounted = false;\r\n };\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n onChangeFilter = (e) => {\r\n let searchText = e.target.value;\r\n console.log(searchText);\r\n this.setState({ searchText });\r\n };\r\n\r\n handleRequestSort = (event, property) => {\r\n const orderBy = property;\r\n let order = \"desc\";\r\n\r\n if (this.state.orderBy === property && this.state.order === \"desc\") {\r\n order = \"asc\";\r\n }\r\n\r\n this.setState({ order, orderBy });\r\n };\r\n\r\n handleSelectAllClick = (event) => {\r\n if (event.target.checked) {\r\n this.setState(() => ({\r\n selected: this.props.projects\r\n .filter((n) =>\r\n this.props.activeTab === 0\r\n ? n.state !== \"success\"\r\n : n.state === \"success\"\r\n )\r\n .map((n) => n.id),\r\n }));\r\n } else {\r\n this.setState({ selected: [] });\r\n }\r\n };\r\n\r\n handleSelectOneClick = (e, n) => {\r\n let selectedObject = this.state.selected;\r\n let selectedIndex = selectedObject.indexOf(n.id);\r\n if (selectedIndex !== -1) selectedObject.splice(selectedIndex, 1);\r\n else selectedObject.push(n.id);\r\n this.setState(() => ({\r\n selected: selectedObject,\r\n }));\r\n e.stopPropagation();\r\n };\r\n\r\n handleClick = (event, project) => {\r\n if (this.props.serverIsRunning) {\r\n if (\r\n project.state === \"error\" ||\r\n project.state === \"success\" ||\r\n project.state === \"ready\" ||\r\n project.state === \"pending\" ||\r\n project.state === \"timed\" ||\r\n project.state === \"running\"\r\n ) {\r\n if (project.type === \"ProteomeAnalysis\") {\r\n this.props.history.push(\"/proteome_view/\" + project.id);\r\n } else if (\r\n project.type === \"ESRTraining\" ||\r\n project.type === \"ESREvaluation\"\r\n ) {\r\n this.props.history.push(\"/esr_view/\" + project.id);\r\n } else {\r\n this.props.history.push(\"/view/\" + project.id);\r\n }\r\n }\r\n } else {\r\n window.showWarningSnackbar(\"Local API Server not ready!\");\r\n }\r\n };\r\n\r\n handleContextmenu = (event, project) => {\r\n if (!this.isSelected(project.id)) {\r\n const { selected } = this.state;\r\n selected.push(project.id);\r\n this.setState({ selected });\r\n }\r\n event.preventDefault();\r\n return false;\r\n };\r\n\r\n handleChangePage = (event, page) => {\r\n this.setState({ page });\r\n };\r\n\r\n handleChangeRowsPerPage = (event) => {\r\n this.setState({ rowsPerPage: event.target.value });\r\n };\r\n\r\n isSelected = (id) => this.state.selected.indexOf(id) !== -1;\r\n\r\n /**\r\n * Runs job for project now\r\n * @param {MouseEvent} e\r\n * @param {String} id Project Id\r\n */\r\n onRunRowClick(e, id) {\r\n e.stopPropagation();\r\n Backend.setProjectsPending([id], () => {\r\n console.log(\"project state changed to pending:\", id);\r\n });\r\n }\r\n\r\n /**\r\n * Cancels job for project now\r\n * @param {MouseEvent} e\r\n * @param {String} id Project Id\r\n */\r\n onCancelRowClick(e, id) {\r\n e.stopPropagation();\r\n Backend.cancelJob(id);\r\n }\r\n\r\n /**\r\n * Set job state for project to timed\r\n * @param {MouseEvent} e\r\n * @param {String} id Project Id\r\n */\r\n onSetTimedClick(e, id) {\r\n e.stopPropagation();\r\n Backend.setProjectsTimed([id], () => {\r\n console.log(\"project state changed to timed:\", id);\r\n });\r\n }\r\n\r\n onRunSelectedClick = () => {\r\n let projects = this.props.projects;\r\n let projectIds = [];\r\n for (let project of projects) {\r\n for (let id of this.state.selected) {\r\n if (id === project.id && project.canRun) {\r\n projectIds.push(id);\r\n }\r\n }\r\n }\r\n Backend.setProjectsPending(projectIds, () => {\r\n this.setState({ selected: [] });\r\n });\r\n };\r\n\r\n onTimedRunSelectedClick = () => {\r\n let projects = this.props.projects;\r\n let projectIds = [];\r\n for (let project of projects) {\r\n for (let id of this.state.selected) {\r\n if (id === project.id && project.canRun) {\r\n projectIds.push(id);\r\n }\r\n }\r\n }\r\n Backend.setProjectsTimed(projectIds, () => {\r\n console.log(\"projects state changed to timed:\", projectIds);\r\n this.setState({ selected: [] });\r\n });\r\n };\r\n\r\n /**\r\n * Import / Export Projects\r\n */\r\n onImportClick = (files) => {\r\n Backend.importProjects(files[0], (res) => {\r\n this.ImportProjectsDialog.show(res);\r\n this.setState({ selected: [] });\r\n this.props.spinloader.hide();\r\n });\r\n };\r\n\r\n onExportClick = () => {\r\n this.props.spinloader.show();\r\n let exportName = \"\";\r\n let numSelected = 0;\r\n for (let project of this.props.projects) {\r\n if (this.state.selected.includes(project.id)) {\r\n if (numSelected === 0) {\r\n exportName += project.name;\r\n }\r\n numSelected++;\r\n }\r\n }\r\n if (numSelected > 1) {\r\n exportName += \"+\" + (numSelected - 1);\r\n }\r\n\r\n Backend.exportProjects(this.state.selected, exportName, () => {\r\n this.props.spinloader.hide();\r\n this.setState({ selected: [] });\r\n });\r\n };\r\n\r\n /**\r\n * Delete selected projects\r\n */\r\n onDeleteClick = () => {\r\n window.openResponseDialog(\r\n \"Do you really want to delete this project?\",\r\n (response) => {\r\n if (response) {\r\n Backend.deleteProjects(this.state.selected, () => {\r\n this.setState({ selected: [] });\r\n });\r\n // get projectnames for selected projectIDs\r\n let projects = this.props.projects.filter((project) =>\r\n this.state.selected.includes(project.id)\r\n );\r\n let projectNames = [];\r\n projects.forEach(function (element) {\r\n projectNames.push(element.name);\r\n });\r\n Backend.deleteGalleryExport(projectNames, () => {\r\n this.setState({ selected: [] });\r\n });\r\n }\r\n }\r\n );\r\n };\r\n\r\n onDuplicateSelectedClick = () => {\r\n Backend.duplicateProjects(this.state.selected, () => {\r\n this.setState({ selected: [] });\r\n this.props.handle_active_tab_change(0);\r\n });\r\n };\r\n\r\n onDuplicateSingleClick = (e, id) => {\r\n e.stopPropagation();\r\n Backend.duplicateProjects([id], () => {\r\n console.log(\"Project copied!\");\r\n this.props.handle_active_tab_change(0);\r\n });\r\n };\r\n\r\n /**\r\n * Updates label style according to project state\r\n * @param {Object} project project obejct with state string e.g. error, success, pending, running...\r\n */\r\n labelFromState = (project) => {\r\n const { classes } = this.props;\r\n switch (project.state) {\r\n case \"creating\":\r\n return (\r\n \r\n {\r\n e.stopPropagation();\r\n console.log(project.message);\r\n }}\r\n >\r\n \r\n
{project.progress}%
\r\n
\r\n \r\n );\r\n case \"running\":\r\n return (\r\n \r\n {\r\n e.stopPropagation();\r\n console.log(project.message);\r\n }}\r\n >\r\n \r\n
{project.progress}%
\r\n \r\n \r\n );\r\n case \"success\":\r\n return (\r\n {\r\n e.stopPropagation();\r\n console.log(project.message);\r\n }}\r\n >\r\n Finished\r\n \r\n );\r\n case \"error\":\r\n return (\r\n {\r\n e.stopPropagation();\r\n console.log(project.message);\r\n window.openErrorDialog(project.message);\r\n }}\r\n >\r\n {project.state}\r\n \r\n );\r\n default:\r\n return (\r\n {\r\n e.stopPropagation();\r\n console.log(project.message);\r\n }}\r\n >\r\n {project.state}\r\n \r\n );\r\n }\r\n };\r\n\r\n /**\r\n * Returns Label of a project type\r\n * @param {String} type Project type string\r\n */\r\n labelFromProjectType(type) {\r\n if (!this.state.projectTypes) return type;\r\n let resultObject = this.state.projectTypes.find((c) => c.name === type);\r\n return resultObject ? resultObject.label : type;\r\n }\r\n\r\n handleChange = (event, value) => {\r\n if (value !== this.props.activeTab) {\r\n if (value === 1) {\r\n window.document.title = `Finished - HSA Kit ${window.version}`;\r\n } else {\r\n window.document.title = `Projects - HSA Kit ${window.version}`;\r\n }\r\n this.props.handle_active_tab_change(value);\r\n if (this.state.selected.length > 0) {\r\n this.setState({\r\n selected: [],\r\n });\r\n }\r\n }\r\n };\r\n\r\n countFinished(countOther) {\r\n let result = this.props.projects.length;\r\n if (this.props.projects.length > 0) {\r\n result = this.props.projects.reduce(\r\n (acc, cur) => acc + (cur.state === \"success\" ? 1 : 0),\r\n 0\r\n );\r\n }\r\n if (countOther) {\r\n result = this.props.projects.length - result;\r\n }\r\n return result;\r\n }\r\n\r\n render() {\r\n const { classes, projects, activeTab } = this.props;\r\n const { order, orderBy, selected, rowsPerPage, page, searchText } =\r\n this.state;\r\n\r\n return (\r\n \r\n (this.ImportProjectsDialog = c)} />\r\n \r\n \r\n \r\n \r\n \r\n\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {stableSort(projects, getSorting(order, orderBy))\r\n .filter((row) => {\r\n let showJob = false;\r\n //filter if pending or finished\r\n if (searchText !== \"\") {\r\n if (\r\n !row.name.toLowerCase().includes(searchText.toLowerCase())\r\n ) {\r\n return false;\r\n }\r\n }\r\n if (activeTab === 1) {\r\n showJob = row.state === \"success\";\r\n } else {\r\n showJob = row.state !== \"success\";\r\n }\r\n if (this.state.projectTypesNames) {\r\n //filter if job project module exists (release version)\r\n if (showJob) {\r\n return this.state.projectTypesNames.includes(row.type);\r\n } else {\r\n return false;\r\n }\r\n }\r\n return false;\r\n })\r\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\r\n .map((n) => {\r\n const isSelected = this.isSelected(n.id);\r\n return (\r\n this.handleClick(event, n)}\r\n role=\"checkbox\"\r\n aria-checked={isSelected}\r\n tabIndex={-1}\r\n key={n.id}\r\n selected={isSelected}\r\n onContextMenu={(event) =>\r\n this.handleContextmenu(event, n)\r\n }\r\n >\r\n \r\n \r\n this.handleSelectOneClick(event, n)\r\n }\r\n />\r\n \r\n {n.readableId}\r\n \r\n \r\n {n.files\r\n .slice(0, Math.min(5, n.files.length))\r\n .map((file) => {\r\n return (\r\n \r\n
\r\n {\r\n \r\n }\r\n \r\n {file.fileName}\r\n
\r\n \r\n \r\n );\r\n })}\r\n \r\n }\r\n >\r\n {\r\n \r\n (event.target.style.display = \"none\")\r\n }\r\n width=\"60\"\r\n height=\"60\"\r\n src={Backend.renderThumbnail(\r\n n.files.length > 0 ? n.files[0].id : 0\r\n )}\r\n alt=\"\"\r\n />\r\n }\r\n \r\n
\r\n \r\n \r\n {n.name}\r\n \r\n {!n.type.includes(\"HistoPointCounting\") &&\r\n !n.type.includes(\"HistoClassification\") && (\r\n {\r\n this.props.onEditProject(n);\r\n e.stopPropagation();\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n )}\r\n \r\n \r\n {this.labelFromProjectType(n.type)}\r\n \r\n \r\n {this.labelFromState(n)}\r\n \r\n \r\n {convertDate(n.creationDateTime).toLocaleString()}\r\n \r\n \r\n {n.state === \"success\" &&\r\n n.type !== \"ProteomeAnalysis\" ? (\r\n \r\n \r\n {\r\n e.stopPropagation();\r\n this.props.history.push(\"/report/\" + n.id);\r\n }}\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n ) : (\r\n \"\"\r\n )}\r\n {n.state === \"success\" && (\r\n \r\n \r\n \r\n this.onDuplicateSingleClick(e, n.id)\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {!n.type.includes(\"HistoPointCounting\") &&\r\n !n.type.includes(\"HistoClassification\") && (\r\n \r\n {n.state === \"running\" ||\r\n n.state === \"timed\" ||\r\n n.state === \"pending\" ? (\r\n \r\n \r\n \r\n this.onCancelRowClick(e, n.id)\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n {!n.canRun ||\r\n n.state === \"running\" ||\r\n n.state === \"pending\" ? (\r\n \r\n this.onSetTimedClick(e, n.id)\r\n }\r\n size=\"large\"\r\n >\r\n \r\n \r\n ) : (\r\n \r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n );\r\n })}\r\n
\r\n
\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nProjectsTable.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n projects: PropTypes.array,\r\n activeTab: PropTypes.number,\r\n handle_active_tab_change: PropTypes.func,\r\n onEditProject: PropTypes.func,\r\n spinloader: PropTypes.object,\r\n serverIsRunning: PropTypes.bool,\r\n history: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(withSpinloader(withStyles(styles)(ProjectsTable)));\r\n","export function convertUTCDateToLocalDate(date) {\r\n var newDate = new Date(date.getTime() + date.getTimezoneOffset() * 60 * 1000);\r\n\r\n var offset = date.getTimezoneOffset() / 60;\r\n var hours = date.getHours();\r\n\r\n newDate.setHours(hours - offset);\r\n\r\n return newDate;\r\n}\r\n\r\nexport function convertDate(jsonDate) {\r\n return new Date(jsonDate);\r\n}\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { Fab, Tooltip } from \"@mui/material\";\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\nimport CreateProjectDialog from \"./dialogs/CreateProjectDialog\";\r\nimport ProjectsTable from \"./components/ProjectsTable\";\r\n\r\nimport { authenticationService } from \"../common/services\";\r\n\r\n/**\r\n * Adds leading zeros to a number\r\n * @param {Number} num Number\r\n * @param {Number} size length that the number should have\r\n * @returns {String} String of number with zero padding\r\n */\r\nfunction pad(num, size) {\r\n var s = num + \"\";\r\n while (s.length < size) s = \"0\" + s;\r\n return s;\r\n}\r\n\r\n/**\r\n * Generates a default name for new Projects like \"Project 001\"\r\n * @param {Object[]} data List of Projects\r\n * @returns {String} Smart Default name for a new project\r\n */\r\nfunction incrementDefaultName(data) {\r\n let newDefaultName = \"Project 001\";\r\n let maxProjNum = 0;\r\n for (let proj of data) {\r\n if (proj.name.match(\"Project [0-9][0-9][0-9]\")) {\r\n const projNum = parseInt(proj.name.replace(\"Project \", \"\"), 10);\r\n let newMaxProjNum = Math.max(maxProjNum, projNum);\r\n if (newMaxProjNum) maxProjNum = newMaxProjNum;\r\n }\r\n }\r\n newDefaultName = `Project ${pad(maxProjNum + 1, 3)}`;\r\n return newDefaultName;\r\n}\r\n\r\nconst styles = (theme) => ({\r\n root: {},\r\n fab: {\r\n position: \"absolute\",\r\n bottom: theme.spacing(2),\r\n right: theme.spacing(2),\r\n },\r\n});\r\n\r\nclass HomePage extends Component {\r\n constructor(props) {\r\n super(props);\r\n this._isMounted = false;\r\n this.state = {\r\n editableProject: null,\r\n projects: [],\r\n open: false,\r\n newDefaultName: \"Project 001\",\r\n activeTab: 0,\r\n serverIsRunning: false,\r\n };\r\n this.refreshInterval = setInterval(() => this.refreshProjects(), 1000);\r\n\r\n Backend.getCurrentUser((user) => {\r\n if (user.fullName === null) {\r\n authenticationService.logout();\r\n window.location.reload(true); //clear cache\r\n }\r\n });\r\n this.checkPythonServer();\r\n }\r\n checkPythonServer = () => {\r\n Backend.isLocalServerReady((result) => {\r\n if (this.state.serverIsRunning !== result) {\r\n this.setMountedState({ serverIsRunning: result });\r\n }\r\n if (!result) {\r\n setTimeout(this.checkPythonServer, 2000);\r\n }\r\n });\r\n };\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n handleClickOpen = () => {\r\n Backend.getLicensingInfo((license) => {\r\n if (license.licenseStatus === \"VALID\") {\r\n this.setMountedState({\r\n editableProject: null,\r\n open: true,\r\n });\r\n } else {\r\n authenticationService.logout();\r\n this.props.history.push(\"/licensing\");\r\n }\r\n });\r\n };\r\n\r\n handleEditOpen = (project) => {\r\n this.setMountedState({\r\n editableProject: project,\r\n open: true,\r\n });\r\n };\r\n\r\n handleClose = () => {\r\n this.setMountedState({\r\n editableProject: null,\r\n open: false,\r\n });\r\n this.refreshProjects();\r\n };\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n clearInterval(this.refreshInterval);\r\n }\r\n\r\n refreshProjects() {\r\n Backend.listProjects((data) => {\r\n let projectsChanged =\r\n JSON.stringify(this.state.projects) !== JSON.stringify(data);\r\n if (projectsChanged) {\r\n this.setMountedState({\r\n projects: data,\r\n newDefaultName: incrementDefaultName(data),\r\n });\r\n }\r\n });\r\n }\r\n handle_active_tab_change = (activeTabIndex) => {\r\n if (this.state.activeTab !== activeTabIndex) {\r\n this.setMountedState({ activeTab: activeTabIndex });\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { serverIsRunning } = this.state;\r\n return (\r\n
\r\n \r\n \r\n {\r\n if (serverIsRunning) {\r\n this.handleClickOpen();\r\n } else {\r\n window.showWarningSnackbar(\"Local API Server not ready!\");\r\n }\r\n }}\r\n >\r\n {serverIsRunning ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nHomePage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n history: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(HomePage));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport Accordion from \"@mui/material/Accordion\";\r\nimport AccordionSummary from \"@mui/material/AccordionSummary\";\r\nimport AccordionDetails from \"@mui/material/AccordionDetails\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\r\n\r\nimport TreeView from \"@mui/lab/TreeView\";\r\nimport TreeItem from \"@mui/lab/TreeItem\";\r\n\r\nconst styles = {\r\n root: {\r\n background: \"none\",\r\n width: \"100%\",\r\n },\r\n treeRoot: {\r\n flexGrow: 1,\r\n maxWidth: 400,\r\n },\r\n expansionRow: {\r\n width: \"100%\",\r\n },\r\n expansionDetails: {\r\n flex: \"none\",\r\n padding: 0,\r\n paddingBottom: 10,\r\n },\r\n tagsTreeItem: {\r\n zIndex: 3,\r\n position: \"relative\",\r\n \"& .coloredSquare\": {\r\n width: 20,\r\n height: 20,\r\n border: \"1px solid black\",\r\n position: \"absolute\",\r\n left: 0,\r\n top: 2,\r\n zIndex: 1,\r\n },\r\n \"& .tagsLabel\": {\r\n marginLeft: 20,\r\n },\r\n },\r\n};\r\nconst tags = [\r\n {\r\n id: \"1\",\r\n name: \"tag 1\",\r\n color: \"#ffffff\",\r\n subTags: [],\r\n },\r\n {\r\n id: \"2\",\r\n name: \"tag 2\",\r\n color: \"#ffff00\",\r\n subTags: [\r\n {\r\n id: \"4\",\r\n name: \"sub tag 1\",\r\n color: \"#ff0000\",\r\n },\r\n {\r\n id: \"5\",\r\n name: \"sub tag 2\",\r\n color: \"#00ff00\",\r\n },\r\n ],\r\n },\r\n {\r\n id: \"3\",\r\n name: \"tag 3\",\r\n color: \"#0000ff\",\r\n subTags: [],\r\n },\r\n];\r\n\r\nclass CasesSideBar extends Component {\r\n state = {};\r\n\r\n render() {\r\n const { classes } = this.props;\r\n return (\r\n
\r\n \r\n }\r\n aria-controls=\"priority-content\"\r\n id=\"priority-header\"\r\n >\r\n Important\r\n \r\n \r\n
Important Cases
\r\n
\r\n
\r\n\r\n \r\n }\r\n aria-controls=\"cases-content\"\r\n id=\"cases-header\"\r\n >\r\n Cases\r\n \r\n \r\n
All Cases
\r\n
\r\n
\r\n\r\n \r\n }\r\n aria-controls=\"tags-content\"\r\n id=\"tags-header\"\r\n >\r\n Tags\r\n \r\n \r\n }\r\n defaultExpandIcon={}\r\n >\r\n {tags.map((tag) => {\r\n return (\r\n \r\n \r\n
{tag.name}
\r\n \r\n }\r\n >\r\n {tag.subTags.map((subtag) => {\r\n return (\r\n \r\n \r\n
{subtag.name}
\r\n \r\n }\r\n />\r\n );\r\n })}\r\n \r\n );\r\n })}\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nCasesSideBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(CasesSideBar);\r\n","import React from \"react\";\r\nimport classNames from \"classnames\";\r\nimport PropTypes from \"prop-types\";\r\nimport { lighten, darken } from \"@mui/material/styles\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\nimport {\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TablePagination,\r\n TableRow,\r\n TableSortLabel,\r\n Toolbar,\r\n Typography,\r\n Paper,\r\n Checkbox,\r\n IconButton,\r\n Tooltip,\r\n} from \"@mui/material\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst caseState = {\r\n cs0: {\r\n label: \"In preperation\",\r\n color: \"#8B572A\",\r\n },\r\n cs1: {\r\n label: \"For Review\",\r\n color: \"#417505\",\r\n },\r\n cs2: {\r\n label: \"Finished\",\r\n color: \"#417505\",\r\n },\r\n cs3: {\r\n label: \"Customer Data\",\r\n color: \"#4A90E2\",\r\n },\r\n};\r\n\r\nconst tags = {\r\n t1: {\r\n label: \"High Priority\",\r\n color: \"red\",\r\n },\r\n t2: {\r\n label: \"US\",\r\n color: \"lightblue\",\r\n },\r\n t3: {\r\n label: \"VisioPharm\",\r\n color: \"blue\",\r\n },\r\n t4: {\r\n label: \"Breast\",\r\n color: \"purple\",\r\n },\r\n};\r\n\r\n// const patients = {\r\n// p1: {\r\n// firstName: \"Rose\",\r\n// lastName: \"Acacia\",\r\n// birthDate: \"27.11.1977\",\r\n// gender: \"Female\",\r\n// },\r\n// p2: {\r\n// firstName: \"Kaylee\",\r\n// lastName: \"Rogers\",\r\n// birthDate: \"11.02.1970\",\r\n// gender: \"Male\",\r\n// },\r\n// p3: {\r\n// firstName: \"Nora\",\r\n// lastName: \"Hernandez\",\r\n// birthDate: \"02.02.1927\",\r\n// gender: \"Female\",\r\n// },\r\n// p4: {\r\n// firstName: \"Fraser\",\r\n// lastName: \"Morris\",\r\n// birthDate: \"12.11.1987\",\r\n// gender: \"Male\",\r\n// },\r\n// };\r\n\r\n// const Users = {\r\n// u1: {\r\n// firstName: \"Brittany\",\r\n// lastName: \"Hill\",\r\n// },\r\n// u2: {\r\n// firstName: \"Dona\",\r\n// lastName: \"Murphy\",\r\n// },\r\n// u3: {\r\n// firstName: \"Robyn\",\r\n// lastName: \"Flores\",\r\n// },\r\n// };\r\n\r\nconst cases = [\r\n {\r\n id: 0,\r\n caseId: \"H14-DEMO-0001-US\",\r\n creationDate: \"5/26/2020\",\r\n modificationDat: \"5/26/2020\",\r\n Patient: \"p1\",\r\n description: \"Breast\",\r\n caseHolder: \"u1\",\r\n caseState: \"cs1\",\r\n tags: [\"t1\", \"t2\"],\r\n },\r\n {\r\n id: 1,\r\n caseId: \"T15-0103-AP\",\r\n creationDate: \"5/26/2020\",\r\n modificationDat: \"5/26/2020\",\r\n Patient: \"p2\",\r\n description: \"Brain\",\r\n caseHolder: \"u1\",\r\n caseState: \"cs2\",\r\n tags: [\"t4\", \"t2\"],\r\n },\r\n {\r\n id: 2,\r\n caseId: \"T15-0103-US\",\r\n creationDate: \"5/26/2020\",\r\n modificationDat: \"5/26/2020\",\r\n Patient: \"p3\",\r\n description: \"Brain\",\r\n caseHolder: \"u1\",\r\n caseState: \"cs3\",\r\n tags: [],\r\n },\r\n {\r\n id: 3,\r\n caseId: \"T13-0091-AP\",\r\n creationDate: \"5/26/2020\",\r\n modificationDat: \"5/26/2020\",\r\n Patient: \"p1\",\r\n description: \"Sigmoid\",\r\n caseHolder: \"u1\",\r\n caseState: \"cs3\",\r\n tags: [\"t3\", \"t4\"],\r\n },\r\n {\r\n id: 4,\r\n caseId: \"T14-0103-AP\",\r\n creationDate: \"5/26/2020\",\r\n modificationDat: \"5/26/2020\",\r\n Patient: \"p4\",\r\n description: \"Skin\",\r\n caseHolder: \"u1\",\r\n caseState: \"cs0\",\r\n tags: [\"t4\"],\r\n },\r\n];\r\n\r\nfunction desc(a, b, orderBy) {\r\n if (b[orderBy] < a[orderBy]) {\r\n return -1;\r\n }\r\n if (b[orderBy] > a[orderBy]) {\r\n return 1;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction stableSort(array, cmp) {\r\n const stabilizedThis = array.map((el, index) => [el, index]);\r\n stabilizedThis.sort((a, b) => {\r\n const order = cmp(a[0], b[0]);\r\n if (order !== 0) return order;\r\n return a[1] - b[1];\r\n });\r\n return stabilizedThis.map((el) => el[0]);\r\n}\r\n\r\nfunction getSorting(order, orderBy) {\r\n return order === \"desc\"\r\n ? (a, b) => desc(a, b, orderBy)\r\n : (a, b) => -desc(a, b, orderBy);\r\n}\r\n\r\nconst rows = [\r\n {\r\n id: \"readableId\",\r\n numeric: false,\r\n disablePadding: false,\r\n label: \"ID\",\r\n width: \"50px\",\r\n },\r\n {\r\n id: \"name\",\r\n numeric: false,\r\n disablePadding: true,\r\n label: \"Name\",\r\n width: \"\",\r\n },\r\n {\r\n id: \"creationDateTime\",\r\n numeric: true,\r\n disablePadding: false,\r\n label: \"Created\",\r\n width: \"100px\",\r\n },\r\n {\r\n id: \"tags\",\r\n numeric: false,\r\n label: \"Tags\",\r\n width: \"100px\",\r\n },\r\n {\r\n id: \"status\",\r\n numeric: false,\r\n disablePadding: false,\r\n label: \"Status\",\r\n width: \"150px\",\r\n },\r\n];\r\n\r\nclass EnhancedTableHead extends React.Component {\r\n createSortHandler = () => () => {\r\n //this.props.onRequestSort(event, property);\r\n };\r\n\r\n render() {\r\n const { onSelectAllClick, order, orderBy, numSelected } = this.props;\r\n\r\n return (\r\n \r\n \r\n \r\n 0} onChange={onSelectAllClick} />\r\n \r\n {rows.map(\r\n (row) => (\r\n \r\n \r\n \r\n {row.label}\r\n \r\n \r\n \r\n ),\r\n this\r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nEnhancedTableHead.propTypes = {\r\n onSelectAllClick: PropTypes.func,\r\n order: PropTypes.string,\r\n orderBy: PropTypes.string,\r\n numSelected: PropTypes.number,\r\n};\r\n\r\nconst toolbarStyles = (theme) => ({\r\n root: {\r\n paddingRight: theme.spacing(1),\r\n },\r\n highlight:\r\n theme.palette.mode === \"light\"\r\n ? {\r\n color: theme.palette.secondary.main,\r\n backgroundColor: lighten(theme.palette.secondary.light, 0.85),\r\n }\r\n : {\r\n color: theme.palette.text.primary,\r\n backgroundColor: theme.palette.secondary.dark,\r\n },\r\n spacer: {\r\n flex: \"1 1 100%\",\r\n },\r\n actions: {\r\n color: theme.palette.text.secondary,\r\n },\r\n title: {\r\n flex: \"0 0 auto\",\r\n },\r\n});\r\n\r\nlet EnhancedTableToolbar = (props) => {\r\n const { numSelected, classes, onDeleteClick } = props;\r\n\r\n return (\r\n 0,\r\n })}\r\n >\r\n
\r\n {numSelected > 0 ? (\r\n \r\n {numSelected} selected\r\n \r\n ) : (\r\n \r\n Cases\r\n \r\n )}\r\n
\r\n
\r\n
\r\n {numSelected > 0 && (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n )}\r\n
\r\n \r\n );\r\n};\r\n\r\nEnhancedTableToolbar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n onDeleteClick: PropTypes.func,\r\n numSelected: PropTypes.number,\r\n};\r\n\r\nEnhancedTableToolbar = withStyles(toolbarStyles)(EnhancedTableToolbar);\r\n\r\nconst styles = () => ({\r\n root: {\r\n width: \"100%\",\r\n },\r\n table: {\r\n minWidth: 500,\r\n },\r\n tableRow: {\r\n cursor: \"pointer\",\r\n },\r\n tableWrapper: {\r\n overflowX: \"auto\",\r\n height: \"calc(100vh - 232px)\",\r\n },\r\n paginationSpacer: {\r\n flex: \"0.0 1 0%\",\r\n },\r\n creatingJobBar: {\r\n backgroundColor: darken(\"#216DC0\", 0.3),\r\n },\r\n input: {\r\n width: \"calc(100% - 48px)\",\r\n },\r\n tagBox: {\r\n display: \"inline-block\",\r\n width: 20,\r\n height: 20,\r\n borderRadius: 5,\r\n color: \"#fff\",\r\n border: \"1px solid rgba(0, 0, 0, 0.54)\",\r\n margin: 2,\r\n },\r\n caseStateContainer: {\r\n borderRadius: 5,\r\n padding: 5,\r\n width: \"100%\",\r\n textAlign: \"center\",\r\n border: \"1px solid rgba(0, 0, 0, 0.54)\",\r\n color: \"white\",\r\n },\r\n});\r\n\r\nclass ProjectsTable extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n order: \"desc\",\r\n orderBy: \"changeDateTime\",\r\n selected: [],\r\n page: 0,\r\n rowsPerPage: 50,\r\n activeTab: 0,\r\n };\r\n Backend.loadAvailableProjectTypes((e) => {\r\n this.setState({ projectTypes: e });\r\n });\r\n }\r\n\r\n handleChange = (event, value) => {\r\n if (value !== this.state.activeTab) {\r\n if (value === 1) {\r\n window.document.title = `Finished - HSA Kit ${window.version}`;\r\n } else {\r\n window.document.title = `Projects - HSA Kit ${window.version}`;\r\n }\r\n if (this.state.selected.length > 0) {\r\n this.setState({\r\n activeTab: value,\r\n selected: [],\r\n });\r\n } else {\r\n this.setState({\r\n activeTab: value,\r\n });\r\n }\r\n }\r\n };\r\n\r\n handleClick = (event, value) => {\r\n console.log(\"value\", value);\r\n };\r\n\r\n isSelected = (id) => this.state.selected.indexOf(id) !== -1;\r\n handleChangePage = () => {\r\n console.log(\"change page\");\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const projects = cases;\r\n\r\n const orderBy = \"id\";\r\n const { order, selected, rowsPerPage, page, activeTab } = this.state;\r\n\r\n return (\r\n \r\n console.log(\"delte click\")}\r\n />\r\n\r\n
\r\n \r\n \r\n \r\n {rows.map((row) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n {stableSort(cases, getSorting(order, orderBy))\r\n .filter((row) => {\r\n if (activeTab === 1) {\r\n return row.state === \"success\";\r\n } else {\r\n return row.state !== \"success\";\r\n }\r\n })\r\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\r\n .map((n) => {\r\n const isSelected = this.isSelected(n.id);\r\n return (\r\n this.props.onChangeSelection(n.id)}\r\n role=\"checkbox\"\r\n aria-checked={isSelected}\r\n tabIndex={-1}\r\n key={n.id}\r\n selected={isSelected}\r\n onContextMenu={(event) =>\r\n this.handleContextmenu(event, n)\r\n }\r\n >\r\n \r\n \r\n this.handleSelectOneClick(event, n)\r\n }\r\n />\r\n \r\n {n.id}\r\n {n.caseId}\r\n {n.creationDate}\r\n \r\n {n.tags.map((tag) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n {caseState[n.caseState].label}\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n
\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nProjectsTable.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n projects: PropTypes.array,\r\n selectedCase: PropTypes.number,\r\n onChangeSelection: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(ProjectsTable);\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport Backend from \"../../common/utils/Backend\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n width: \"100%\",\r\n },\r\n sceneTile: {\r\n display: \"inline-block\",\r\n },\r\n});\r\n\r\nclass CasesViewer extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n projects: null,\r\n };\r\n Backend.listProjects((data) => {\r\n this.setState({\r\n projects: data,\r\n });\r\n });\r\n }\r\n\r\n render() {\r\n const { classes, selectedCase } = this.props;\r\n const { projects } = this.state;\r\n\r\n return (\r\n
\r\n {projects &&\r\n projects.length > selectedCase &&\r\n projects[selectedCase].files.map((file) => {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n })}\r\n
\r\n );\r\n }\r\n}\r\n\r\nCasesViewer.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n selectedCase: PropTypes.number,\r\n};\r\n\r\nexport default withStyles(styles)(CasesViewer);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { Paper, Grid } from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport CasesSideBar from \"./components/CasesSideBar\";\r\nimport CasesTable from \"./components/CasesTable\";\r\n\r\nimport CasesViewer from \"./components/CasesViewer\";\r\n\r\nconst styles = {\r\n root: {\r\n background: \"#EEEEEE\",\r\n width: \"100%\",\r\n height: \"calc(100% - 64px)\",\r\n padding: 5,\r\n },\r\n casesContainer: {\r\n height: \"100%\",\r\n },\r\n paper: {\r\n padding: 0,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n overflow: \"auto\",\r\n height: \"100%\",\r\n },\r\n};\r\n\r\nclass CasesPage extends Component {\r\n state = {\r\n selectedCase: 0,\r\n };\r\n\r\n onChangeSelection = (id) => {\r\n if (id !== this.state.selectedCase) {\r\n this.setState({ selectedCase: id });\r\n }\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { selectedCase } = this.state;\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nCasesPage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(CasesPage);\r\n","export default __webpack_public_path__ + \"static/media/p1.d8b6b771.jpg\";","export default __webpack_public_path__ + \"static/media/p2.28be19b6.jpg\";","export default __webpack_public_path__ + \"static/media/p3.79920250.jpg\";","export default __webpack_public_path__ + \"static/media/p4.bcf3e966.jpg\";","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport p1 from \"./images/p1.jpg\";\r\nimport p2 from \"./images/p2.jpg\";\r\nimport p3 from \"./images/p3.jpg\";\r\nimport p4 from \"./images/p4.jpg\";\r\n\r\nimport { Paper } from \"@mui/material\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nconst styles = {\r\n root: {\r\n background: \"#EEEEEE\",\r\n width: \"100%\",\r\n height: \"calc(100% - 64px)\",\r\n overflowY: \"auto\",\r\n padding: 5,\r\n },\r\n paper: {\r\n width: 800,\r\n margin: \"10px auto\",\r\n padding: 10,\r\n \"& img\": {\r\n width: \"100%\",\r\n },\r\n },\r\n};\r\n\r\nclass PredictionPage extends Component {\r\n state = {};\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const images = [p1, p2, p3, p4];\r\n return (\r\n
\r\n {images.map((item, idx) => (\r\n \r\n \"\"\r\n \r\n ))}\r\n
\r\n );\r\n }\r\n}\r\n\r\nPredictionPage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(PredictionPage);\r\n","import React, { Component } from \"react\";\r\n\r\nimport withStyles from '@mui/styles/withStyles';\r\n\r\nimport {\r\n Grid,\r\n Card,\r\n CardContent,\r\n Checkbox,\r\n FormControl,\r\n FormControlLabel\r\n} from \"@mui/material\";\r\n\r\n//import { Role } from \"../common/utils\";\r\n//import { authenticationService } from \"../common/services\";\r\n\r\n//const tabUrls = [\"/settings/\", \"/settings/admin\"];\r\n\r\nconst styles = {\r\n root: {\r\n background: \"#EEEEEE\"\r\n },\r\n paper: {\r\n padding: 20,\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\"\r\n }\r\n};\r\n\r\nclass SettingsPage extends Component {\r\n state = {};\r\n\r\n render() {\r\n //const { classes } = this.props;\r\n //const currentUser = authenticationService.currentUserValue;\r\n return (\r\n \r\n \r\n \r\n

Preferences

\r\n \r\n {\r\n {\r\n console.log(\"e\", e)\r\n //onChange(!includeBaseROI);\r\n //this.setState({ includeBaseROI: !includeBaseROI });\r\n }}\r\n />\r\n }\r\n label=\"Update on slider move\"\r\n />\r\n }\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(SettingsPage);\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport AppBar from \"@mui/material/AppBar\";\r\nimport Toolbar from \"@mui/material/Toolbar\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport Button from \"@mui/material/Button\";\r\nimport { authenticationService } from \"../services\";\r\nimport { Role, history } from \"../utils\";\r\nimport {\r\n Popper,\r\n Grow,\r\n Paper,\r\n ClickAwayListener,\r\n MenuList,\r\n MenuItem,\r\n SvgIcon,\r\n Tooltip,\r\n} from \"@mui/material\";\r\nimport {\r\n ArrowDropDown,\r\n Person,\r\n ExitToApp,\r\n Build,\r\n Info,\r\n} from \"@mui/icons-material\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nimport PermMediaIcon from \"@mui/icons-material/PermMedia\";\r\nimport WorkIcon from \"@mui/icons-material/Work\";\r\nimport ScannerIcon from \"@mui/icons-material/Scanner\";\r\nimport ScreenShareIcon from \"@mui/icons-material/ScreenShare\";\r\n\r\nimport Backend from \"../utils/Backend\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n height: \"100vh\",\r\n },\r\n grow: {\r\n flexGrow: 1,\r\n },\r\n menuButton: {\r\n marginLeft: -12,\r\n marginRight: 20,\r\n height: 50,\r\n cursor: \"pointer\",\r\n },\r\n appbarPlaceholder: theme.mixins.toolbar,\r\n headerButton: {\r\n textTransform: \"none\",\r\n height: 64,\r\n padding: \"0 20px\",\r\n borderRadius: 0,\r\n },\r\n menu: {\r\n transformOrigin: \"center top\",\r\n marginTop: 7,\r\n marginLeft: -40,\r\n minWidth: 200,\r\n },\r\n menuIcon: {\r\n marginRight: 10,\r\n color: \"#444\",\r\n },\r\n warningColor: {\r\n color: theme.palette.warning.main,\r\n },\r\n errorColor: {\r\n color: theme.palette.error.main,\r\n },\r\n});\r\n\r\nclass NavigationBar extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this._isMounted = false;\r\n this.state = {\r\n currentUser: null,\r\n isAdmin: false,\r\n open: false,\r\n headline: \"\",\r\n showDevButtons: false,\r\n resultsPath: \"\",\r\n isResultsButtonVisible: false,\r\n extraButtonState: \"\", //none, results, project\r\n scannerState: null,\r\n expirationMessage: \"\",\r\n };\r\n\r\n window.setNavigationbarTitle = this.setNavigationbarTitle;\r\n }\r\n\r\n // check if report button should be shown\r\n // and check if report exist\r\n checkProjectButton = (pathname) => {\r\n let isResultsButtonVisible = pathname.includes(\"/view\");\r\n if (this.state.isResultsButtonVisible !== isResultsButtonVisible) {\r\n this.setMountedState({ isResultsButtonVisible });\r\n }\r\n if (isResultsButtonVisible) {\r\n let uuid = pathname.split(\"view/\").slice(-1)[0];\r\n let dir_path = \"/\" + uuid;\r\n Backend.walkProjectDirFiles(dir_path, (result) => {\r\n let reportExists = false;\r\n for (let row of result) {\r\n if (\r\n row.path.endsWith(\"report.xlsx\") ||\r\n row.path.endsWith(\"report.xlsm\")\r\n ) {\r\n reportExists = true;\r\n break;\r\n }\r\n }\r\n this.setMountedState({\r\n resultsPath: reportExists ? \"/report/\" + uuid : \"\",\r\n extraButtonState: \"results\",\r\n });\r\n });\r\n } else {\r\n if (pathname.includes(\"report/\")) {\r\n let uuid = pathname.split(\"report/\").slice(-1)[0];\r\n this.setMountedState({\r\n extraButtonState: \"project\",\r\n projectPath: \"/view/\" + uuid,\r\n });\r\n } else {\r\n this.setMountedState({\r\n extraButtonState: \"\",\r\n projectPath: \"\",\r\n });\r\n }\r\n }\r\n };\r\n\r\n componentDidMount() {\r\n this._isMounted = true;\r\n\r\n //on first load\r\n this.checkProjectButton(location.pathname);\r\n this.setPageHeadline();\r\n\r\n //on path change\r\n this.props.history.listen((location) => {\r\n this.setPageHeadline();\r\n this.checkProjectButton(location.pathname);\r\n });\r\n\r\n authenticationService.currentUser.subscribe((x) =>\r\n this.setMountedState({\r\n currentUser: x,\r\n isAdmin: x && x.role === Role.Admin,\r\n })\r\n );\r\n\r\n Backend.getLicensingInfo((license) => {\r\n let scannerState = \"INVALID\";\r\n let expirationMessage = \"\";\r\n if (license.activeModules.length === 0) {\r\n scannerState = \"VALID\";\r\n } else {\r\n const scannerData = license.activeModules.find(\r\n (item) => item.name === \"HSAScanner\"\r\n );\r\n if (scannerData) {\r\n const expirationDays = scannerData.expiresInDays;\r\n if (expirationDays < 31) {\r\n if (expirationDays < 0) {\r\n if (expirationDays === -1) {\r\n expirationMessage = \"Expired for 1 day!\";\r\n } else {\r\n expirationMessage = \"Expired for \" + -expirationDays + \" days!\";\r\n }\r\n } else {\r\n if (expirationDays == 1) {\r\n expirationMessage = \"Expires in 1 day!\";\r\n } else {\r\n expirationMessage = \"Expires in \" + expirationDays + \" days!\";\r\n }\r\n }\r\n }\r\n if (scannerData.isExpired) {\r\n scannerState = \"EXPIRED\";\r\n } else {\r\n scannerState = \"VALID\";\r\n }\r\n }\r\n }\r\n\r\n this.setMountedState({ scannerState, expirationMessage });\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n setMountedState = (stateObject, callback) => {\r\n if (this._isMounted) {\r\n this.setState(stateObject, callback);\r\n }\r\n };\r\n\r\n setNavigationbarTitle = (title) => {\r\n this.setMountedState({ headline: title });\r\n };\r\n\r\n logout() {\r\n authenticationService.logout();\r\n history.push(\"/login\");\r\n window.location.reload(true);\r\n }\r\n\r\n handleMenu() {\r\n this.setMountedState((state) => ({ open: !state.open }));\r\n }\r\n\r\n handleClose(event) {\r\n if (this.anchorEl.contains(event.target)) {\r\n return;\r\n }\r\n\r\n this.setMountedState({ open: false });\r\n }\r\n\r\n setPageHeadline() {\r\n let path = window.location.href;\r\n Backend.getVersion((data) => {\r\n let fullVersion = data.version.split(\".\");\r\n if (fullVersion.length > 3) {\r\n window.version = fullVersion.slice(0, 3).join(\".\");\r\n } else {\r\n window.version = data.version;\r\n }\r\n if (path.includes(\"/view/\")) {\r\n window.document.title = \"Viewer\";\r\n } else if (path.includes(\"/report/\")) {\r\n window.document.title = \"Results\";\r\n } else if (path.includes(\"/admin\")) {\r\n window.document.title = \"Admin\";\r\n } else if (path.includes(\"/login\")) {\r\n window.document.title = \"Login\";\r\n } else if (path.includes(\"/about\")) {\r\n window.document.title = \"About\";\r\n } else if (path.includes(\"/cases\")) {\r\n window.document.title = \"Cases\";\r\n } else if (path.includes(\"/classroom\")) {\r\n window.document.title = \"Classroom\";\r\n } else if (path.includes(\"/prediction\")) {\r\n window.document.title = \"Prediction\";\r\n } else if (path.includes(\"licensing\")) {\r\n window.document.title = \"Licenseing\";\r\n } else if (path.includes(\"scan_view\")) {\r\n window.document.title = \"Scan Viewer\";\r\n } else {\r\n window.document.title = \"Projects\";\r\n }\r\n window.document.title += ` - HSA Kit ${window.version}`;\r\n });\r\n let headline = \"Home\";\r\n if (window.navigationBarTitle) {\r\n headline = window.navigationBarTitle;\r\n } else if (path.includes(\"/view/\")) {\r\n headline = \"Viewer\";\r\n } else if (path.includes(\"/report/\")) {\r\n headline = \"Results\";\r\n } else if (path.includes(\"/admin\")) {\r\n headline = \"Admin Settings\";\r\n } else if (path.includes(\"/login\")) {\r\n headline = \"Login\";\r\n } else if (path.includes(\"/about\")) {\r\n headline = \"About\";\r\n } else if (path.includes(\"/classroom\")) {\r\n headline = \"Classroom\";\r\n } else if (path.includes(\"/cases\")) {\r\n headline = \"Cases\";\r\n } else if (path.includes(\"/prediction\")) {\r\n headline = \"Prediction\";\r\n } else if (path.includes(\"/licensing\")) {\r\n headline = \"Licenseing\";\r\n } else if (path.includes(\"/scan_view\")) {\r\n headline = \"Scan Viewer\";\r\n }\r\n if (this.state.headline !== headline) {\r\n this.setMountedState({ headline: headline });\r\n }\r\n return headline;\r\n }\r\n\r\n render() {\r\n const {\r\n currentUser,\r\n isAdmin,\r\n open,\r\n showDevButtons,\r\n scannerState,\r\n expirationMessage,\r\n } = this.state;\r\n const { classes } = this.props;\r\n\r\n return (\r\n \r\n \r\n this.props.history.push(\"/\")}\r\n alt=\"hsa logo\"\r\n src=\"/img/hsa_logo.png\"\r\n />\r\n \r\n {this.state.headline}\r\n \r\n \r\n {currentUser ? (\r\n \r\n {/* hidden log file download button */}\r\n {\r\n Backend.getAbout((result) => {\r\n if (result.logFiles && result.logFiles.length > 0) {\r\n let newestLogFile = result.logFiles[0];\r\n\r\n const a = document.createElement(\"a\");\r\n let url =\r\n \"api/about/logfile?name=\" +\r\n window.decodeURIComponent(newestLogFile);\r\n a.href = url;\r\n a.download = url.split(\"/\").pop();\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n }\r\n });\r\n }}\r\n >
\r\n {\r\n this.props.history.push(\"/\");\r\n this.setState({ headline: \"Home\" });\r\n }}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n \r\n Projects\r\n \r\n \r\n \r\n {\r\n this.props.history.push(\"/scan_view\");\r\n }}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n \r\n Scan\r\n \r\n \r\n \r\n \r\n\r\n {this.state.extraButtonState !== \"\" && (\r\n \r\n {this.state.extraButtonState === \"results\" ? (\r\n \r\n this.props.history.push(this.state.resultsPath)\r\n }\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n \r\n \r\n \r\n \r\n Results\r\n \r\n ) : (\r\n {\r\n this.props.history.push(this.state.projectPath);\r\n }}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n Project\r\n \r\n )}\r\n \r\n )}\r\n\r\n {showDevButtons && (\r\n \r\n this.props.history.push(\"/prediction\")}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n Prediction\r\n \r\n this.props.history.push(\"/cases\")}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n Cases\r\n \r\n {\r\n if (window.location.href.includes(\"/view/\")) {\r\n window.toggleClassRoomChat();\r\n } else {\r\n window.openWarningDialog(\"Please open a Project first\");\r\n }\r\n }}\r\n className={classes.headerButton}\r\n color=\"inherit\"\r\n >\r\n \r\n Classroom\r\n \r\n \r\n )}\r\n\r\n {\r\n this.anchorEl = node;\r\n }}\r\n className={classes.headerButton}\r\n aria-owns={open ? \"menu-appbar\" : undefined}\r\n aria-haspopup=\"true\"\r\n onClick={() => this.handleMenu()}\r\n color=\"inherit\"\r\n >\r\n \r\n {currentUser.fullName}\r\n \r\n \r\n \r\n {({ TransitionProps }) => (\r\n \r\n \r\n this.handleClose(e)}\r\n >\r\n \r\n {isAdmin && (\r\n this.props.history.push(\"/admin\")}\r\n >\r\n \r\n Admin\r\n \r\n )}\r\n {isAdmin && (\r\n {\r\n this.props.history.push(\"/licensing\");\r\n }}\r\n >\r\n \r\n Licensing Page\r\n \r\n )}\r\n this.props.history.push(\"/about\")}\r\n >\r\n \r\n About / Help\r\n \r\n \r\n \r\n Logout\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nNavigationBar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n history: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(NavigationBar));\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { v4 as uuidv4 } from \"uuid\";\r\n\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nimport Typography from \"@mui/material/Typography\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport {\r\n Tabs,\r\n Tab,\r\n Paper,\r\n Container,\r\n CssBaseline,\r\n Table,\r\n TableBody,\r\n TableRow,\r\n TableCell,\r\n Grid,\r\n} from \"@mui/material\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n width: \"100%\",\r\n height: \"calc(100vh - 64px - 48px)\",\r\n overflow: \"hidden\",\r\n },\r\n paper: {\r\n marginTop: theme.spacing(8),\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n },\r\n link: {\r\n display: \"inline-block\",\r\n margin: 5,\r\n },\r\n});\r\n\r\nconst LogFilesTabComp = (props) => {\r\n const { logFiles, logFilesPython, classes } = props;\r\n\r\n return (\r\n
\r\n \r\n \r\n Analysis Log Files:\r\n {logFilesPython.map((c) => (\r\n \r\n {c}\r\n \r\n ))}\r\n \r\n \r\n Core Log Files:\r\n {logFiles.map((c) => (\r\n \r\n {c}\r\n \r\n ))}\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nLogFilesTabComp.propTypes = {\r\n classes: PropTypes.object,\r\n logFiles: PropTypes.array,\r\n logFilesPython: PropTypes.array,\r\n};\r\n\r\nconst LogFilesTab = withStyles(styles)(LogFilesTabComp);\r\n\r\nconst AboutTab = (props) => {\r\n const { version, intranetUrl, localhostMode } = props;\r\n\r\n return (\r\n
\r\n Version:\r\n
\r\n

\r\n Copyright © {new Date().getFullYear()} HS Analysis GmbH - All\r\n Rights Reserved\r\n

\r\n

HSA Kit Version {version} (64-bit)

\r\n

\r\n \r\n https://www.hs-analysis.com\r\n \r\n

\r\n

\r\n support@hs-analysis.com\r\n

\r\n

This software is for research only.

\r\n \r\n Intranet URL ({localhostMode ? \"disabled\" : \"enabled\"}):\r\n \r\n
\r\n

\r\n {intranetUrl}\r\n

\r\n
\r\n );\r\n};\r\n\r\nAboutTab.propTypes = {\r\n version: PropTypes.string,\r\n intranetUrl: PropTypes.string,\r\n localhostMode: PropTypes.bool,\r\n};\r\n\r\nconst HelpTab = (props) => {\r\n const { workflows } = props;\r\n\r\n return (\r\n
\r\n Handbook:\r\n
\r\n

\r\n \r\n Handbook.pdf\r\n \r\n

\r\n Workflows:\r\n
\r\n {workflows.map((c) => (\r\n

\r\n \r\n {c}\r\n \r\n

\r\n ))}\r\n
\r\n Help:\r\n
\r\n

\r\n support@hs-analysis.com\r\n

\r\n
\r\n );\r\n};\r\n\r\nHelpTab.propTypes = {\r\n workflows: PropTypes.array,\r\n};\r\n\r\nfunction ReleaseNotesTab(props) {\r\n const { releaseNotes } = props;\r\n\r\n return (\r\n
\r\n ReleaseNotes:\r\n
\r\n \r\n \r\n {releaseNotes.map((c) => (\r\n \r\n {c.version}\r\n \r\n
    \r\n {c.notes.map((note) => (\r\n
  • {note}
  • \r\n ))}\r\n
\r\n
\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nReleaseNotesTab.propTypes = {\r\n releaseNotes: PropTypes.object,\r\n};\r\n\r\nclass AboutPage extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n releaseNotes: [],\r\n version: \"1.0.0\",\r\n activeTab: 0,\r\n buildDate: null,\r\n };\r\n this.scrollRef = React.createRef();\r\n\r\n Backend.getAbout((result) => this.setState(result));\r\n }\r\n\r\n handleChange = (event, newValue) => {\r\n this.scrollRef.current.scrollTo(0, 0);\r\n this.setState({ activeTab: newValue });\r\n };\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const {\r\n releaseNotes,\r\n version,\r\n activeTab,\r\n workflows,\r\n intranetUrl,\r\n localhostMode,\r\n logFiles,\r\n logFilesPython,\r\n } = this.state;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {activeTab === 0 && (\r\n \r\n )}\r\n {activeTab === 1 && }\r\n {activeTab === 2 && (\r\n \r\n )}\r\n {activeTab === 3 && (\r\n \r\n )}\r\n
\r\n
\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nAboutPage.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n releaseNotes: PropTypes.object,\r\n};\r\n\r\nexport default withRouter(withStyles(styles)(AboutPage));\r\n","import React, { Component } from \"react\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nclass CustomDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n open: false,\r\n title: \"\",\r\n content: \"\",\r\n dialogState: \"confirm\",\r\n responseFunction: null,\r\n };\r\n\r\n window.openResponseDialog = this.handleConfirmOpen;\r\n window.openErrorDialog = this.handleErrorOpen;\r\n window.openWarningDialog = this.handleWarningOpen;\r\n }\r\n\r\n handleConfirmOpen = (title, responseFunction) => {\r\n this.setState({\r\n title: title,\r\n open: true,\r\n dialogState: \"confirm\",\r\n responseFunction: responseFunction,\r\n });\r\n };\r\n\r\n handleErrorOpen = (content) => {\r\n this.setState({\r\n title: \"Error\",\r\n content: content,\r\n dialogState: \"error\",\r\n open: true,\r\n });\r\n };\r\n\r\n handleWarningOpen = (title) => {\r\n this.setState({\r\n title: title,\r\n dialogState: \"warning\",\r\n open: true,\r\n });\r\n };\r\n\r\n handleClose = (confirmed) => {\r\n this.setState({ open: false });\r\n if (this.state.dialogState === \"confirm\" && this.state.responseFunction) {\r\n this.state.responseFunction(confirmed);\r\n }\r\n };\r\n\r\n downloadError = () => {\r\n let filename = \"hsa_error_log.txt\";\r\n let text = this.state.content;\r\n let element = document.createElement(\"a\");\r\n element.setAttribute(\r\n \"href\",\r\n \"data:text/plain;charset=utf-8,\" + encodeURIComponent(text)\r\n );\r\n element.setAttribute(\"download\", filename);\r\n\r\n element.style.display = \"none\";\r\n document.body.appendChild(element);\r\n\r\n element.click();\r\n\r\n document.body.removeChild(element);\r\n };\r\n\r\n render() {\r\n const { dialogState, open, title, content } = this.state;\r\n return (\r\n this.handleClose(false)}\r\n aria-labelledby=\"responsive-dialog-title\"\r\n >\r\n {typeof title === \"object\" && title.length > 1 ? (\r\n \r\n {title.map((row, idx) => {\r\n return
{row}
;\r\n })}\r\n
\r\n ) : (\r\n {title}\r\n )}\r\n\r\n \r\n {(dialogState === \"confirm\" || dialogState === \"error\") && (\r\n \r\n {dialogState === \"confirm\" && content !== \"\" && (\r\n {content}\r\n )}\r\n {dialogState === \"error\" && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n\r\n \r\n {dialogState === \"confirm\" && (\r\n this.handleClose(false)}\r\n color=\"primary\"\r\n >\r\n Cancel\r\n \r\n )}\r\n {dialogState === \"error\" && (\r\n \r\n )}\r\n this.handleClose(true)}\r\n color=\"primary\"\r\n autoFocus\r\n >\r\n OK\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default CustomDialog;\r\n","import React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport { Route } from \"react-router-dom\";\r\n\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport { withSnackbar } from \"notistack\";\r\n\r\nimport Viewer from \"./viewer/Viewer\";\r\nimport ProteomViewer from \"./proteomViewer/ProteomViewer\";\r\nimport SpectraViewer from \"./spectraViewer/SpectraViewer\";\r\nimport ScanViewer from \"./scanViewer/ScanViewer\";\r\n\r\nimport Report from \"./home/Report\";\r\n\r\nimport { Role } from \"./common/utils\";\r\n//import { authenticationService } from \"./common/services\";\r\nimport { PrivateRoute } from \"./common/components\";\r\nimport AdminPage from \"./admin/AdminPage\";\r\nimport LoginPage from \"./account/LoginPage\";\r\nimport LicensingPage from \"./licensing/LicensingPage\";\r\nimport HomePage from \"./home/HomePage\";\r\nimport CasesPage from \"./cases/CasesPage\";\r\nimport PredictionPage from \"./prediction/PredictionPage\";\r\nimport SettingsPage from \"./settings/SettingsPage\";\r\nimport NavigationBar from \"./common/components/NavigationBar\";\r\nimport AboutPage from \"./about/AboutPage\";\r\nimport PersistentStorageProvider from \"./viewer/contexts/PersistentStorageContext\";\r\nimport ProjectHistoryProvider from \"./viewer/contexts/ProjectHistoryContext\";\r\nimport ProjectProvider from \"./viewer/contexts/ProjectContext\";\r\nimport ResultTabProvider from \"./viewer/contexts/ResultTabContext\";\r\nimport { TilesProvider } from \"./viewer/contexts/TilesContext\";\r\nimport SpectraViewerProvider from \"./spectraViewer/contexts/SpectraViewerContext\";\r\nimport ScanProvider from \"./scanViewer/contexts/ScanViewerContext\";\r\nimport \"./css/global.css\";\r\nimport CustomDialog from \"./common/components/CustomDialog\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n height: \"100vh\",\r\n },\r\n grow: {\r\n flexGrow: 1,\r\n },\r\n menuButton: {\r\n marginLeft: -12,\r\n marginRight: 20,\r\n height: 50,\r\n },\r\n appbarPlaceholder: theme.mixins.toolbar,\r\n});\r\n\r\nclass App extends Component {\r\n static displayName = App.name;\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n window.showSuccessSnackbar = (str) => {\r\n this.props.enqueueSnackbar(str, {\r\n variant: \"success\",\r\n });\r\n };\r\n\r\n window.showWarningSnackbar = (str) => {\r\n this.props.enqueueSnackbar(str, {\r\n variant: \"warning\",\r\n });\r\n };\r\n\r\n window.showErrorSnackbar = (str) => {\r\n this.props.enqueueSnackbar(str, {\r\n variant: \"error\",\r\n });\r\n };\r\n\r\n return (\r\n
\r\n
\r\n (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n (\r\n \r\n )}\r\n />\r\n (\r\n \r\n \r\n \r\n )}\r\n />\r\n (\r\n \r\n \r\n \r\n )}\r\n />\r\n } />\r\n } />\r\n }\r\n />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n \r\n\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nApp.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n enqueueSnackbar: PropTypes.func,\r\n};\r\n\r\nexport default withSnackbar(withStyles(styles)(App));\r\n","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register () {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW (swUrl) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker (swUrl) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').indexOf('javascript') === -1\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister () {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import \"bootstrap/dist/css/bootstrap.css\";\r\nimport React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport { BrowserRouter } from \"react-router-dom\";\r\nimport App from \"./App\";\r\nimport { unregister as unregisterServiceWorker } from \"./registerServiceWorker\";\r\nimport SpinloaderProvider from \"./common/components/Spinloader\";\r\n\r\nimport {\r\n ThemeProvider,\r\n StyledEngineProvider,\r\n createTheme,\r\n} from \"@mui/material/styles\";\r\nimport { SnackbarProvider } from \"notistack\";\r\n\r\nconst baseUrl = document.getElementsByTagName(\"base\")[0].getAttribute(\"href\");\r\nconst rootElement = document.getElementById(\"root\");\r\nexport const theme = createTheme({\r\n palette: {\r\n selected: {\r\n main: \"rgba(0, 0, 0, 0.2)\",\r\n },\r\n primary: {\r\n // light: will be calculated from palette.primary.main,\r\n main: \"#0673C1\",\r\n inactive: \"rgba(0, 0, 0, 0.54)\",\r\n // dark: will be calculated from palette.primary.main,\r\n // contrastText: will be calculated to contrast with palette.primary.main\r\n },\r\n secondary: {\r\n // light: will be calculated from palette.primary.main,\r\n main: \"#182A42\",\r\n // dark: will be calculated from palette.primary.main,\r\n // contrastText: will be calculated to contrast with palette.primary.main\r\n },\r\n default: {\r\n main: \"#ffffff\",\r\n },\r\n error: {\r\n main: \"#d84646\",\r\n },\r\n success: {\r\n main: \"#4e9a51\",\r\n },\r\n warning: {\r\n main: \"#f68a1c\",\r\n },\r\n },\r\n typography: {\r\n useNextVariants: true,\r\n },\r\n});\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n rootElement\r\n);\r\n\r\nunregisterServiceWorker();\r\n"],"sourceRoot":""}