{"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","common/utils/Utils.jsx","viewer/utils/StructuresUtils.jsx","viewer/utils/PolygonUtil.jsx","viewer/utils/ROI.jsx","viewer/contexts/PersistentStorageContext.jsx","viewer/utils/RandomColorGenerator.jsx","viewer/contexts/ProjectContext.jsx","viewer/contexts/ProjectHistoryContext.jsx","common/components/Spinloader.jsx","viewer/contexts/AllViewerContexts.jsx","viewer/contexts/ResultTabContext.jsx","viewer/contexts/TilesContext.jsx","viewer/components/tools/Tool.jsx","viewer/components/tools/ActiveLearningTool.jsx","home/components/AIModelDialogTable.jsx","home/dialogs/AIModelDialog.jsx","viewer/components/tools/AITrainingTool.jsx","viewer/components/ClassroomChat.jsx","viewer/components/SketchColorPicker.jsx","viewer/components/tools/CommentTool.jsx","viewer/components/tools/CopyTool.jsx","viewer/components/tools/ConfigForms/OverlapConfigForm.jsx","viewer/components/tools/EllipseTool.jsx","viewer/components/tools/FillTool.jsx","globalComponents/CustomRangeSlider.jsx","viewer/components/tools/FilterAnnotationsTool.jsx","viewer/utils/RendererUtils.jsx","viewer/components/CroppedImage.jsx","viewer/components/SceneImage.jsx","viewer/components/AccuracyGraph.jsx","viewer/components/GalleryToolBoxes.jsx","viewer/components/Gallery.jsx","viewer/components/tools/GridAnnotationTool.jsx","viewer/components/tools/GridTool.jsx","viewer/components/tools/HeatmapTool.jsx","viewer/components/tools/InstantAnalysisHooks/ColorBox.jsx","viewer/components/tools/InstantAnalysisTool.jsx","viewer/utils/ArrayUtils.jsx","viewer/components/tools/LandmarkTool.jsx","viewer/components/tools/MagicWandTool.jsx","viewer/components/OverlaySlider.jsx","viewer/components/tools/PenTool.jsx","viewer/utils/TinyQueue.jsx","viewer/utils/rbush-knn.jsx","viewer/components/tools/PlotNearestRoiTool.jsx","viewer/components/tools/RectangleTool.jsx","viewer/components/tools/RegionGrabCutTool.jsx","viewer/components/tools/RegionGrowingTool.jsx","viewer/components/tools/RegionTool.jsx","viewer/utils/CanvasUtil.jsx","viewer/components/ScaleBar.jsx","viewer/components/ZoomBar.jsx","viewer/components/MiniMap.jsx","viewer/components/ResultTable.jsx","viewer/components/ToggleButton.jsx","globalComponents/CustomSvgIcon.jsx","viewer/components/VerticalResizeBorder.jsx","viewer/components/VerticalToolBar.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/tools/SelectionTool.jsx","home/dialogs/TrainAIModelComponents/TrainModelStep0.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/components/sidebar/SideBarTabResults.jsx","viewer/components/SideBar.jsx","viewer/components/tools/TilesClassificationTool.jsx","viewer/components/tools/TilesHistoPointCountingTool.jsx","viewer/components/3DViewHelper.jsx","viewer/components/3D-Viewer.jsx","viewer/components/WindowTool.jsx","common/components/LazyRender.jsx","home/dialogs/FindFilesDialog.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","common/components/SelectPathButton.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/CreateTimeLineChartDialogComponents/ProjectsTimeLineChart.jsx","home/dialogs/CreateTimeLineChartDialog.jsx","home/components/ProjectsTable.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","jobProgressConnection","HubConnectionBuilder","withUrl","configureLogging","LogLevel","Warning","build","fetch_auth","url","config","arguments","length","undefined","token","Authorization","concat","handleJsonResponse","res","callback","console","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","Backend","_classCallCheck","_createClass","key","json","id","catch","errorName","log","customErrorPrint","appsettings","path","showErrorSnackbar","params","errorCallback","progressCallback","jobId","Math","random","toString","substr","connection","on","line","debug","start","invoke","err","_requestProject","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_args","wrap","_context","prev","Error","stop","_x","_x2","apply","_loadAnnotations","_callee2","queryOptions","_context2","abrupt","fileId","_x3","_x4","model_path","online","result","models","unlistedModels","modelErrs","map","model","name","version","shortErr","ex","projectIds","exportName","blob","URL","createObjectURL","a","document","createElement","href","download","appendChild","click","remove","file","FormData","append","formData","projectActionMode","projectCount","projects","aiModel","names","output_name","img","folderPath","fileName","projectJson","fileMappings","projectNames","projectId","projectType","encodeURIComponent","availabeProjectTypes","waitForElement","setTimeout","getVersion","ptKey","projectTypes","loadAvailableProjectTypes","item","annotations","description","isUserModule","order","label","dir","str","e","spinloader","_this","off","isJsonString","jsonLine","k","showWarningSnackbar","trainingProgress","includes","progress","replace","showWithProgress","parseInt","show","project","myJson","state","stdout","_this2","galleryTrainingProgress","alModel","page","lv","x","y","sourcePath","image_path","zRange","showPointCloud","toLowerCase","successCallback","modelType","isVdlModel","parameters","advancedSettings","comDLArchitecture","updateTrainingData","verifiedAIModel","selectedAIModel","redirect","group","graphRequestSettings","startsWith","slice","uuidv4","Accept","tileExportProgress","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","this","channels","i","isNaN","channelName","enabled","min","low","max","high","type","scale","Histogram","_Component","_inherits","_super","_createSuper","props","call","setMountedState","stateObject","_isMounted","setState","handleColorPickerClick","index","selectedSingleChannel","displayColorPicker","selectedChannels","push","handleColorPickerClose","handleColorPickerChange","newHistogramConfig","histogramConfig","onChange","forceUpdateWithTimeout","delay","forceUpdate","activateAllChannels","Array","from","validGamma","singleChannelMode","channelSelectMode","leftGammaValue","gammaFunction","rightGammaValue","changeChannelSelectMode","updateChannels","changeChannel","filter","v","onExportHistogramParameters","strData","projectContext","getProjectStringInfos","downloadName","date","dataStr","dlAnchorElem","setAttribute","onImportHistogramParameters","files","target","fr","FileReader","onload","selectedCs","loadedConfig","stateToSet","newStateObject","c","isBrightfield","Object","assign","readAsText","stateGamma","originalHistogramConfig","getEnabledChannels","histograms","datasets","sliderMode","_loop","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","s","moveTo","lineTo","fillText","strokeStyle","closePath","stroke","maxValues","lineWidth","borderColor","backgroundColor","globalAlpha","transformedCount","fill","gammaCanvas","values","_step","_iterator","_createForOfIteratorHelper","done","selectedChannel","_step2","_iterator2","f","_step3","_iterator3","handleMinMaxRange","_this$state","reduce","total","leftSide","rightSide","_this$state2","lastX","middleBarActive","deltaX","clientX","new_min","new_max","_this$state3","dataset","p","_jsx","onDragStart","preventDefault","onMouseMove","buttons","updateRange","leftBarActive","rightBarActive","onMouseUp","children","_jsxs","React","Fragment","style","ref","drawHistogramBackground","onMouseDown","className","leftGamma","stopPropagation","handleGammaChange","blur","rightGamma","round","borderRight","borderLeft","toFixed","onClick","SketchPicker","_this$state4","channelsArray","borderWidth","_step4","_iterator4","labels","_this3","_this$props","classes","_this$state5","initData","el","Tooltip","disableInteractive","IconButton","marginTop","handleReset","size","FontAwesomeIcon","icon","faUndo","handleLogLin","faChartArea","handleMinMaxFit","faArrowsAltH","handleBestFit","faChartLine","GetApp","getElementById","Publish","accept","renderHistogram","slider1","parseFloat","sliderGamma","marginLeft","slider2","ToggleButtonGroup","ToggleButton","onDoubleClick","paddingBottom","renderColorPicker","FormControlLabel","control","Checkbox","checked","Component","withStyles","viewerType","generateParentList","structures","parentList","structure","idx","currentStruct","classificationSubtype","parentId","getParentIndex","generateChildrenList","childrenList","generateAListOfAllChildrenRecursively","hasChild","allChildren","struct","child","_toConsumableArray","getParentIndexLayer","findIndex","element","subtypeLevel","getContainedRegionRois","roiLayers","parent","parentIdx","decendantIds","_ref","layer","regionRois","roi","structureId","lineArrayBuffer","lineArray","radius","vw","vh","feature","turf","buffered","buffer","viewRect","_unused","distance","p1","p2","deltaY","sqrt","calcBoundingBox","region","rect","pointInsideRegion","turfPoint","turfPoly","pointInside","regionRoi","regions","hasIntersection","regionRoi1","regionRoi2","poly1","poly2","intersects","isInside","findIndexById","findSameLayer","selectedLayer","defaultParentIndex","parentLayerId","parentIndex","findSiblingRoiLayers","overlapRoiLayers","visible","checkIfStructureHidden","isSubtype","findClickedRoi","includeBaseROI","inversed","_step6","overlapTreeItems","tree","search","minX","minY","maxX","maxY","_iterator6","treeItem","updateDrawLayer","drawRegion","clear","subtype","bufferSize","drawRegionRois","RegionROI","color1","multiLayerRegions","multiDrawRegions","transformResult","coordArray","geometry","coordinates","_step14","_iterator14","roiToAdd","createRegionRoi","area","fullyLoaded","isObject","updateLayer","positionInRoiLayer","overlap","parentLayer","clickedOnRoi","_step15","historyItem","histId","_iterator15","parentRegionRois","reducedLayerRegionRois","_step12","_iterator12","forEach","uuid","getTreeItemsFromRois","multiParentRegions","tolerance","highQuality","intersection","poly","turfPolyToRegionRois","_step16","_iterator16","overlapRoiLayer","_step17","overlapItems","_iterator17","_loop2","drawRoi","drawPoly","isIntersecting","_step18","_iterator18","_step19","_iterator19","_loop3","comment","add","copy","transformResultInfo","differenceRegionsInfo","_step13","_iterator13","segDiff","idxRoi","segGeoJSON","idxRegionsInfo","subtypeName","differenceRegionsAndInfo","openErrorDialog","firstRoiToAdd","insert","all","fromIndex","arr","toIndex","splice","arraymove","projectHistory","findRoi","resultRoi","targetLayerIndex","_step20","_iterator20","validateAndCorrectRois","rois","fallbackStructureIndex","suggestedStructure","find","realStructureByNameAndColor","_generateChildrenList","suggestedStructChildren","_slicedToArray","realStructureByParentAndColor","realStructureByParentAndLabel","newlyAssignedStructure","fallbackStructure","PolyBool","epsilon","BaseROI","strokeColor","fillColor","CommentROI","commentValue","computedValue","inverted","fontScaleFactor","updateBounds","bounds","obj","roiCopy","isAnnotated","isLabeled","isSelObj","aiAnnotated","setRegions","center","ai","annotated","labeled","isSel","isSaved","saved","z","tileName","selected","selectedWithKey","frequencyClass","isStartData","aiIdx","galleryIndex","firstTimeGallery","pointOnPolygon","point","converted","inputRegions","resultRegions","comp","numObjects","getSimplifiedRectRegions","intRegions","simplifyedRegions","simplifiedPoly","simplifyRegions","pArea","abs","RectROI","_BaseROI","drawingMode","resizePoint","cornerRadius","getTransform","dragStart","canvas","hovered","cornerDiameter","getFirstValidatedIndexValue","createRoisFromAnno","anno","geoJSON","frequencyCl","PersistentStorageContext","createContext","withPersistentStorage","WrappedComponent","Consumer","context","_objectSpread","persistentStorage","displayName","PersistentStorageProvider","loadedProjectState","projectState","projectTypeState","_i","_Object$entries","entries","_Object$entries$_i","Provider","save","saveProjectTypeValue","load","loadProjectTypeValue","loadAll","colors","colorIdx","getRandomColor","floor","ProjectContext","withProject","ProjectProvider","componentDidUpdate","structuresStateList","isUnfolded","showSubtypes","init","viewer","setChangingFile","changingFile","setActiveTab","tab","activeTab","getActiveTab","colorInUse","getUnusedColor","getRegionById","getNumberOfChilds","parentStructure","importStructures","tools","RBush","addStructure","grid","viewerConfig","newLayerId","newStructure","dynamic","allToolNames","dynamicStructure","classFrequencies","class_0","class_1","class_2","class_3","class_4","class_5","class_6","avgClassFrequnecy","defaultSelected","alterStructure","newRoilayer","addSubStructure","fromHistoModule","subStructure","parentColor","subtypeColor","numberChilds","roiIndex","addSubtypeText","addSubType","findChilds","subType","deleteStructure","_this$state6","childs","toplevelParentId","structureIndex","roiIdx","subtypesRemoved","RegionRoi","parentStruct","toplevelParentIndex","fullChildrenList","currentChildren","updateStructures","newSelectedLayer","duplicateStructure","_this$state7","pureLabel","split","copiesCount","duplicateChildren","findChildren","oldParent","newParent","_this$state8","newId","canMoveStructure","selectedStructure","direction","structuresSameLevel","moveStructure","_this$state9","strt","ed","allElements_1","lastStructure","idxSwapStructure","otherParent","sceneGUID","sort","roi_layer_a","roi_layer_b","join","today","Date","dd","String","getDate","padStart","mm","getMonth","yyyy","getFullYear","setStateNow","newState","setAiModelRepository","aiModelRepository","setAiStateObject","aiStateObject","setPersistentStorage","commentLayers","ome","isLoadingAnnotations","galleryImageSize","annotationsReduced","totalRoiCount","fileRoiLayers","ProjectHistoryContext","ProjectHistoryProvider","past","future","action","updateState","processItem","stepType","_this$viewer$props$pr","parentLayerIdx","parentRoiLayer","_ret","undo","pop","redo","shownSaveHintNum","canUndo","canRedo","getHistoryLength","sizeLimitReached","_assertThisInitialized","newItem","mergePastItems","SpinloaderContext","withSpinloader","SpinloaderProvider","progressObject","messagePresent","indefinite","clearTimeout","timeout","showWithMessage","rightWidth","scenesLeft","waitTime","timeoutHide","hide","_this4","func","_this5","_this6","showWithTimeout","numberScenes","progObject","resetTimer","numberRestScenes","hideTimeDelayed","setRightWidth","greyedOutBackground","onContextMenu","progressContainer","Dialog","dialog","open","hideBackdrop","DialogTitle","CircularProgress","LinearProgress","linearProgress","variant","margin","textAlign","pointerEvents","withAllViewerContexts","component","withProjectHistory","ResultTabContext","withResultTab","propsWithoutClasses","_objectDestructuringEmpty","resultTab","ResultTabProvider","getPosition","rendererCtx","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","TilesContext","withTiles","tiles","TilesProvider","getIndex","strAnnoCount","getIndexObj","strSubtypesPages","resetStPg","visibleImage","visibleImageUpdatedAt","coloredImages","coloredImagesUpdatedAt","imgWidth","imgHeight","pageIndex","selectedLayerColor","selcetedLayerIndex","annotationCount","firstIteration","accPoints","pointCount","galleryVisible","isMousedown","isOnImage","IsInOtherImage","onPageInput","structureBefore","graphAcc","roiProps","pos","histoClassificationStarted","zLevel","chainLeaderId","transformationMatrix","transformationFactor","transformationOffset","setVisibleImage","clearTiles","_Object$keys","keys","_i2","_Object$keys2","_i3","_Object$keys3","_i4","_Object$keys4","pushVisibleImage","tileId","getTime","sorted","resetVisibleImages","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","getAccPoints","setGalleryVisible","getGalleryVisible","setIsMousedown","getIsMousedown","setIsOnImage","getIsOnImage","setIsInOtherImage","isInOtherImage","getIsInOtherImage","setRoiProps","getRoiProps","setPositionRoi","setOnPageInput","getOnPageInput","pushStrAnnoCount","pushDynamicStructureAC","setStrAnnoCount","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","setHistoClassificationStarted","getHistoClassificationStarted","setFileId","getFileId","setZLevel","getZLevel","setTransformationMatnFactnOff","fact","Off","getTransformationMatrix","getTransformationFactor","getTransformationOffset","removeTransformationMatrix","resetAllTransformationMatnFact","getAllTransformationMatrices","getAllTransformationFactors","getAllTransformationOffsets","Tool","flag","prevX","currX","prevY","currY","downScale","ActiveLearningTool","_Tool","_len","args","_key","toolLayerConfig","toolConfig","Typography","ConfigForm","onApply","preview","calcPreview","calcFull","_super2","FormControl","fullWidth","FormLabel","Button","handleRowClick","columns","options","AIModelDialogTable","sortOrder","filterType","print","responsive","rowsSelected","selectToolbarPlacement","draggableColumns","tableBodyMaxHeight","onRowSelectionChange","currentRowsSelected","selectedObject","dataIndex","handleSelectedAIModels","handleAddButton","onRowClick","textLabels","noMatch","toolTip","columnHeaderTooltip","column","pagination","previous","rowsPerPage","displayRows","downloadCsv","viewColumns","filterTable","reset","titleAria","selectedRows","delete","deleteAria","MUIDataTable","dataTable","verified","row","versions","validationloss","validationmiou","validationmeaniou","trainingObjectsCount","trainingobjectscount","epochs","datetime","modeltype","PaperComponent","Draggable","handle","cancel","Paper","Transition","forwardRef","Slide","AIModelDialog","selectedAIModels","addButtonDisabled","handleClickOpen","getModelMetadata","modelsInitialized","handleClickOpenExistingModels","trainExistingModel","existingAIModels","handleSelectModel","event","selectedVersion","aiModels","selectedModel","handleSelectVersion","handleClose","finishAddCustomAIModels","successful","showSuccessSnackbar","information","initAIFormData","handleAdd","customAIModelsAdded","selectedAiModel","sourcepath","addCustomAIModels","handleRemove","openResponseDialog","deleteCustomAIModels","handleAddExistingModel","selectedModelInformation","getSelectedModelSourcepath","setSelectedExistingModel","selectedModelIdx","selectedModelSourcepath","modelSelectionContainer","modelInformationContainer","addCustomAIModelButton","AddCircleOutlineIcon","addCustomAIModelText","TransitionComponent","keepMounted","onClose","tableDialog","DialogContent","dialogContent","DialogContentText","DialogActions","disabled","placement","Grid","xs","gridContent","InputLabel","Select","selectContent","MenuItem","overflowY","minHeight","maxWidth","fontWeight","AITrainingTool","updateTrainingProgress","buildingModel","showDownloadProgress","showTrainingProgress","epochsProgress","hideStartTraining","buildingModelText","stepsProgress","lossProgress","meanIoUProgress","trainingFinished","showOptimizationProgress","trainingFailed","elapsedTime","substring","modelOptimizeProgress","modelDownloadProgress","valmeanIoUProgress","vallossProgress","configForm","onParameterChange","selectedExistingModel","errorEpochs","errorAIName","openTrainExistingDialog","selectedExistingModelSourcepath","updateProject","createProjectModel","projectModel","saveProject","aiTrainingSignalR","onApplyAll","componentRef","ConfigFormRaw","TextField","required","placeholder","helperText","InputProps","inputProps","startIcon","PlayArrowRoundedIcon","readOnly","disableUnderline","tooltip","ReplayRoundedIcon","students","primary","avatar","ClassroomChat","classRoomChatWidth","headline","List","student","ListItem","alignItems","ListItemAvatar","Avatar","alt","ListItemText","secondary","inline","Divider","SketchColorPicker","_React$Component","yPosition","handleClick","clientY","innerHeight","handleChange","reactCSS","pickerContainer","default","swatch","scaleUnitLabels","scaleUnits","buttonStyle","listButtonStyle","CommentTool","noConfig","mouseActionState","points","commentState","selectedTool","selectedCommentIdx","lastP","gripData","generateDistancePoints","vector","dl","generateArrowPoints","addPoint","eventPoint","lastEventPoint","updateCommentRoi","commentLayer","renderConfiguration","changeSelectedCommentIdx","commentRois","changeCommentState","forceSidebarUpdate","deleteCommentRoi","changeSelectedColor","changeSelectedCommentValue","changeRoiFontSize","lineColor","selectionColor","drawLayer","X","Y","numPoints","physicalLength","physicalSizeX","unitLength","unitExponent","unitExponentIndex","mouseP","selectedCommentRoi","minArea","Number","MAX_SAFE_INTEGER","containsPoint","commentRoiArea","deltaXProc","deltaYProc","computePolygonArea","physicalSizeY","computLengthValue","endsWith","button","pointInsideBounds","startPoint","lastRoi","mousePosition","fct","pointInsideSelection","gripPoints","_gripPoints","gripPoint","gripSize","gripSizeInner","bInner","fillRect","_len2","_key2","changeCommentType","_this$props$commentSt","Crop169Icon","ArrowForwardOutlinedIcon","faDrawPolygon","faRuler","CommentIcon","maxHeight","commentRoi","multiline","InputLabelProps","shrink","ListItemSecondaryAction","edge","FormatSizeIcon","DeleteIcon","reverse","CopyTool","mode","layerResults","selectedSameLayer","historyLength","drawRegions","foundRoiResults","foundRegionIndex","foundRoi","allRegions","regionroi","regionRois1","regionRois2","regions1","regions2","getIntersections","roi_region","historyLength2","onChangeMode","RadioGroup","FormGroup","Radio","OverlapConfigForm","removeOverlap","removeOverlapSame","useNodeDrawingMode","onChangeRemoveOverlap","onChangeRemoveOverlapSame","onChangeUseNodeDrawingMode","EllipseTool","tempRemoveOverlap","tempRemoveOverlapSame","originalSelectedLayer","viewerConfig_project","projectProperties","numberOfSegments","dist","cos","PI","sin","pointsToCirclePolygon","sizeX","sizeY","FillTool","mainRoi","hole","tempHoleRoi","overlappingRegionRoiTreeItems","possibleRoiCandidates","oRoi","finalPossibleRoiCandidates","roisToExclude","possibleOverlapRoi","_possibleRoiCandidate","excludedOverlapRoi","fRoi","fillHole","CustomRangeSlider","FormHelperText","sliderContainer","spacing","input","valueMin","onChangeMin","onKeyDown","code","onKeyEnter","role","Slider","valueMax","onSliderChange","onChangeCommitted","onSliderchangeComitted","onChangeMax","FilterAnnotationsTool","selection","selectionIdx","smallerIdx","biggerIdx","sortedTreeItems","checkJumps","randSliderKey","rangeSliderParams","updateRangeMode","zoomToRect","deleteSmaller","idxToDelete","roiLayer","treeItemToDelete","updateSortedTreeItems","deleteBigger","treeItem1","treeItem2","valueIsMin","valueIsMax","selectRegion","toggleJumps","deleteSelection","resultItem","treeItems","bArea","curX","curY","findSmallestTreeItem","sortIdx","smallerSelectionCount","biggerSelectionCount","smallerMinSliderCount","biggerMaxSliderCount","gridTemplateColumns","gridGap","Pagination","shape","Delete","configureImage","putImageData","__assign","t","prototype","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","_SVD","_a","u","eps","withu","withv","tol","TypeError","l1","m","l","testConvergence","q","iteration","SVD","multiply","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","offsetX","offsetY","tileLoaderParams","matFromImageData","dst","Mat","dsize","Size","warpPerspective","INTER_NEAREST","BORDER_REPLICATE","newImgData","ImageData","Uint8ClampedArray","cols","rows","offTileCan","tileLoader","colorInImage","globalCompositeOperation","CroppedImage","componentDidMount","roI","validateZ","addEventListener","mousewheel","passive","offsetHeight","globalZ","findVisibleRois","pd","parentLayerIndex","activeTool","areAllImagesComplete","allComplete","complete","imgLeft","imgTop","canvasFactor","opacity","getRoiStructureId","_this$props2","getClassificationStructure","handleCanvasClick","_this$props3","automaticTraining","classificationId","setSelectedWithKey","updateGallery","classificationStructure","roiWasSubtype","bufferRoiId","nativeEvent","which","getNuberChildRois","startData","alruns","enoughAnnotations","startAutomaticTraining","giveWarning","allImgsAnnotated","_this$props4","allImagesLabeled","setFUllyAnnotated","setAnnotated","minFive","twoAnnotated","enough","handleCanvasMouseDown","_this$props5","drawingEnabled","getBoundingClientRect","mouseX","mouseY","canvasFactor1","mouse","gallery","handleMouseMove","_this$props6","mouseOnCanvas","mousepos","handleMouseUp","_this$props7","posInRoiLayer","positionInLayer","setObjectToLoad","handleMouseLeave","_this$props8","handleMouseEnter","_this$props9","_this$props10","showZStackBar","onZStep","zoomSpeed","imgBoundWidth","actTool","previousPageIndex","loadedCount","fullyLoadedCount","imgs1","visibleRegions","removeEventListener","_this$props11","scroll","draw","zoomSp","imgBoundHeight","sizeZ","_this$props12","canvasWidth","imgBottom","imgRight","d","factorPyramidLevel","level","getBaseLog","maxLevel","factor_w","factor_h","xBound","yBound","boundWidth","boundHeight","xTile","yTile","rows1","cols1","getPageForChannel","objectToLoad","vImg","setTransform","restore","_y","sX","sY","sWidth","sHeight","x1D","y1D","wD","hD","imageForCanvas","fktWidth","fktHeight","imageSmoothingEnabled","contour","drawCustomCursor","ctxOv","canvasOverlay","drawCrosshair","crosshairLineWidth","lineLength","linePostion","widthHeight","crosshairColor","crosshairOpacity","deltaZ","newZ","_this$props13","drawMode","pixelSize","unit","physicalSizeXUnit","canvasWidthString","onMouseLeave","onMouseEnter","zBar","zStackIcon","faLayerGroup","zStepUp","ArrowDropUp","zStepDown","ArrowDropDown","withTheme","transition","SceneImage","handleImageClick","classId","selectedInGallery","getColorFromId","getParentColor","galleryMounted","image","showFileNames","gridTemplateRows","borderBottom","objectFit","renderOriginalImage","AccuracyGraph","factor","cWdt","GalleryToolBoxes","getShowContour","setDrawContour","showGallery","getProjectLabel","isScrollbarVisible","scrollHeight","clientHeight","onResize","toolbarSize","handleChangeContour","showContour","handleChangeShowFileNames","setShowFileNames","handleChangeCombo","setFirstTimeGallery","getStructuresForDropDown","findParentIndex","unshift","handleChangeFilteredStructure","emptyIdx","onSelectLayer","handleChangeCrosshair","fromKeyPress","setDrawCrosshair","handleChangeActiveTab","setAutomaticTraining","startTraining","activeLearning","trainingWarning","findClassificationChilds","saveChangesGallery","setAlruns","passiveLearning","applyDL","numberElements","applyModel","handleChangeMakePredictions","setApplyModelAfterTraining","checkToolInConfig","toolName","toolsInProject","originalToolbarHeight","comboBoxSizeOptions","childsGallery","setCrosshairColor","setCrosshairOpacity","setCrosshairLineWidth","isFilesGallery","comboBoxSizeValue","option","onStart","onStop","Resizable","resizableContainer","resizeHandles","Card","Build","toolBox","Mouse","Keyboard","DragIndicator","classNames","faBrain","Tabs","tabsContainer","indicatorColor","textColor","Tab","progressText","trainingAcc","setStartData","makePredictions","defaultChecked","newValue","ChatBubbleOutline","flexVerticalContainer","flexFlow","flexRowContentHeight","flex","flexRowRemainingHeight","aiLabel","imgOuter","Gallery","drawContour","allImagesLoaded","allImagesComplete","_Object$values","fromChangePage","fromMount","loadedRois","pg","isRoiSubtype","setElementCount","elCnt","projectStringProperties","childNames","findAllSubtypes","elementCount","childIds","setDynamicStructure","dynamicIndex","setAnnotationsContext","lenStructures","setSubtypesPagesContext","allChilds","shift","setSubtypeValues","twoSubtypes","scrollTo","scrollTop","behavior","selectNewImage","selectNewRoi","selectNewFile","roiLay","idxSelRoi","childLabels","subtypeRois","idxInSubtypes","nextRoi","idxNextRoi","visibleFiles","deleteSelectedRoi","idxNext","handleChangePage","onGallerychangePage","checkIfLoadNewObject","scrollToTop","prevStr","handleChangeRowsPerPage","pageInput","numObjsInLayer","getNumberOfElements","ceil","numEls","classifyImageWithKey","classifyRoiWithKey","classifyFileWithKey","_this$props14","currentRoi","_this$props15","classifyTilesGalleryWithKey","_this$props16","setPageSelectedRoi","_this$props17","enoughAnnosCount","handleDivMouseDown","handleDivMouseUp","_this$props18","prps","_this$props19","childColors","isFileSubtype","fileClassId","_this$props20","setProgress","acc","validationAcc","filterObjects","renderCroppedImage","tile","onRefresh","number","visImgs","indexOffset","fromAI","renderSceneImage","imageSize","getRowsPerPageForProject","canvasSize","playingZ","zsr","playDirectionZ","_this$props21","_this$props22","selectedObjects","object","nextProps","_this$props23","clr","selObjCord","selObjs","indexLayer","setLayer","allRoiLayers","updateFileClasses","_tools$iam_ai_inferen","_this$props24","_this$props25","_objectWithoutProperties","_excluded","classificationFiles","iam_ai_inference","toolTipCircularProgress","roisForImages","displayedFiles","justifyContent","overflowX","alignContent","onScroll","maxHeigth","TablePagination","labelRowsPerPage","rowsPerPageOptions","getRowsPerPageOptionsForProject","backIconButtonProps","nextIconButtonProps","onPageChange","onRowsPerPageChange","labelDisplayedRows","fontFamily","paddingTop","GridAnnotationTool","gridSize","endPoint","rightClick","gridOffsetX","gridOffsetY","exportClasses","baseROIOnly","currentFileId","createSelectionArea","sP","eP","treeSelection","gridLayer","createGrid","baseRois","rendererDict","printFunction","setSelectedLayer","baseRoi","c_1","c_2","c_3","c_4","gridTileCount","saveGridConfig","onClickExport","pconfig","projectNoViewConfig","fileIndex","exportObject","selectedStructureId","fileConfig","tileExport","newLine","tileCount","saveObject","moveAnnotations","disableExport","rendererObj","mp","onChangeGridSize","onChangeOverlap","onChangeGridOffsetX","onChangeGridOffsetY","onChangeExportClasses","onChangeBaseROIOnly","inputElement","h6_small","gridButton","gridIconText","GridTool","tilesToGenerate","showGridPreview","isInsideBaseROI","createRandomTiles","structureName","positions","foundTiles","isValidTile","noGridForChilds","fromFileChange","lenChilds","newGridSize","resetStructure","setGridSize","avgClassFrequency","create1mmGrid","isHistoClassification","isHistoPointCounting","_Fragment","currentTarget","sizeUnit","defaultValue","pixelWidth","HeatmapTool","threshold","maxValue","searchRadius","prevSelectedLayer","activeGrid","initTool","visibilityState","getPointInCanvas","getSubtypeLabels","structs","getRois","checkRTree","rtree","KDBush","treePoints","worldToCanvas","yToWorld","rendererRef","p3","xToWorld","worldDistance","dStart","dEnd","makeTiles","tileSizeX","tileSizeY","canvasHeight","TLx","TLy","BRx","BRy","setHeatmapWithGrid","results","gridMaxValue","range","_step5","avgX","avgY","_iterator5","setHeatmapData","setHeatmapWithoutGrid","noGridMaxValue","within","checkVisibleObjects","pxlValue","textAlignLast","backgroundImage","updateDrawing","useStyles","makeStyles","colorBox","removeIcon","ColorBox","parameter","_useState","useState","_useState2","setHovered","newColors","RemoveIcon","Accordion","expanded","MuiAccordion","AccordionSummary","content","MuiAccordionSummary","AccordionDetails","theme","MuiAccordionDetails","InstantAnalysisTool","runAnalysis","callbackFunction","fileIds","instantAnalysisSignalR","calcTileName","letters","numberRows","numberCellsAlphabet","firstLetter","lettersIdx","resetParameters","configFormRef","ui","prevW","prevH","pixelLengthX","pixelLengthY","pixelArea","renderer","previewRect","findParentStructure","fileClassification","toolParams","formDataAICockpit","selLayerStructureId","modelName","outerParentidx","findOuterParentIdx","layersToSave","parentlist","depending_structure","depending_channel","required_structures","isArray","required_struture","rendererdict","activeLearningSignalR","selectedToolName","layerIndex","annotationSaveStructureId","annotationSaveStructureIndex","newRois","collides","itemsToRemove","itemToRemove","_step7","_iterator7","applyToAll","_step8","_iterator8","_loop5","_step9","directParent","directParentIdx","_iterator9","childIdx","excludeScene","getSelectedObjects","resultProject","pFile","usedLayerIndices","Set","_step10","_iterator10","_loop4","coord","has","_step11","_iterator11","formControlInUse","arc","SettingsBackupRestoreIcon","validateParameters","cIndex","_loop6","toolParam","tempCIndex","prevProps","onUseIAM","accordionExpanded","_this7","exponent","_this8","formControls","optionalFormControls","_loop7","digits","valueOf","formControl","hiddenStructures","component_type","rangeValue","sceneAreaPx","formControlKey","rangeValueText","handleTextFieldChange","newRangeValue","use_iam","transformExponential","htmlFor","sortedColors","colorA","convert","lab","raw","colorB","colorPickerActive","ColorizeIcon","lastColor","optional","expandIcon","ExpandMoreIcon","LandmarkTool","selectedLandmarkIdx","gripIdx","radioValue","deletedNumberQ","onClickRemoveTransformation","matrix","transformLandmark","transformAnnotation","onChangeChain","splitscreenIdx","reallocateLandmarkNumbers","bMarks","landmarkLayers","landmarkRois","onClickApplyTransformation","splitscreenFileIds","baseMarks","targetMarks","_Object$entries2","_Object$entries2$_i","_i5","_Object$entries3","_Object$entries3$_i","generateLandmarkTransformation","handleRadioChange","onClickRemoveAllMarks","landmarkLayer","mousePoint","linelength","topLeft","bottomRight","roiColor","markNumber","tag","_i6","checkBoundingBox","hatchOffset","MagicWandTool","shiftflag","lastp","mouseWheelEvent","shiftKey","useMagicWand","bytes","wandMask","MagicWandToolLib","floodFill","len","gaussBlurOnlyBorder","cacheInd","getBorderIndices","trace","cs","traceContours","simplifyContours","inner","ps","onChangeThreshold","OverlaySlider","update","activeFileId","checkedUp","upperListValue","addFile","lowerListValue","fileCheck","checkedLow","handleUpVisChange","handleLowVisChange","setOpacity","handleUpMenuChange","setActive","handleLowMenuChange","handleCheck","lowValue","fullscreenFileIds","omeDict","fsChain","upperArea","upperList","scene","lowerArea","lowerList","sliderDiv","upFormcontrol","lowFormcontrol","upButton","VisibilityIcon","lowButton","chainButton","isChained","LinkIcon","LinkOffIcon","slider","getAriaValueText","valueLabelDisplay","orientation","PenTool","penRadius","minPenRadius","maxPenRadius","tempUseNodeDrawingMode","initDrawing","replaceLastPointInDrawLayer","addPointToDrawLayer","applyDrawLayer","linePoly","lineRegions","delta","fkt","fromGallery","_this$line","penRad","onChangePenRadius","TinyQueue","compare","defaultCompare","_down","_up","current","halfLength","best","knn","predicate","maxDistance","candidate","node","toBBox","queue","compareDist","boxDist","leaf","isItem","peek","box","dx","axisDist","dy","PlotNearestRoiTool","nearestLayer","main","nearest","mainRadius","nearestRadius","connectionLineWidth","mainVisibility","nearestVisibility","connectionVisibility","maxDistanceVisibility","nearestLayerId","setSelectedRoiLayer","onChangeColors","onChangeConfig","onChangeSelection","nearestCenters","center2","drawDistanceCircles","selectedTree","drawNearestConnections","drawLayerCircles","onChangeColor","colorObject","configObject","numberInput","filteredStructures","Table","TableBody","TableRow","TableCell","scope","align","Visibility","VisibilityOff","select","RectangleTool","selectedIndex","resizeMode","resizingStarted","selectNexRoi","updateObjectMode","newRoi","getValidatedRegions","hoveredRoi","editRoi","deleteRoi","mouseDownPosition","mouseDownRoi","hoveredIndex","rw","rh","setHoveredRoi","deltaP","setClickedRoiSelected","getRectRegions","rb","cornerSize","roiWidth","roiHeight","highlightRoi","highlightResizeCorner","RegionGrabCutTool","penOpacity","lines","matline","fitPointToImage","getPolygonsWithOpenCV","tlp","resultImageData","rect1","Rect","resizeMultiplier","originalSize","workingSize","resize","INTER_AREA","point1","Point","point2","cvtColor","COLOR_RGBA2RGB","mask","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","THRESH_BINARY","contours","MatVector","hierarchy","findContours","RETR_CCOMP","CHAIN_APPROX_SIMPLE","polygons","cnt","get","contourArea","polygon","data32S","removeCenteredObject","centeredRoi","drawVisibleImage","getTopLeftPoint","getBottomRightPoint","isPointOutsideRect","isOutside","brp","isDrawingpointInsideRect","resetViuals","lineFlag","obvColor","rad","topLeftPoint","RegionGrowingTool","growRegion","seed","inputData","outputData","seedIdx","seedR","seedG","seedB","newedge","ii","next4Edges","jj","ci","cr","cg","cb","imageData","growResult","rgbaPlanes","RegionTool","getIndexOf","drawRegionGeoJson","polygonToGeoJSON","drawRegionWithoutHoles","_unused2","getExterior","trackTransforms","svg","createElementNS","xform","createSVGMatrix","savedTransforms","translate","sx","sy","scaleNonUniform","rotate","radians","transform","m2","pt","createSVGPoint","transformedPoint","matrixTransform","inverse","backTransformedPoint","maxScaleWidth","ScaleBar","newWidth","zoom","scalebarMeters","toExponential","mantissa","roundedMantissa","fluorescence","setScaleBarData","parentObj","offsetParent","onDrag","marks","ZoomBar","isSelected","clickable","verticalBar","markButton","fab","changeValue","MiniMap","initialized","inSideBar","getCtx","miniMapMouseEvent","pageX","pageY","onMoveTo","chainMouseMove","mouseDown","dragging","mouseMove","mouseUp","zoomMouseWheel","stopEvent","imgLoaded","coloredImg","zoomOut","mainCanvas","screenX","screenY","screenW","screenH","palette","classToUse","rootsideBar","rootsidebar","ResultTable","updateResultTable","percentageNumber","getPercentageAndNumber","percentage","numberObjects","structuredTableValues","percNumb","numberParentObjects","renderIcon","PlayArrow","Remove","renderRow","structureIdx","paddingLeft","tableSize","onToggle","toolbarButton","toolbarButtonChecked","Map","toolbarButtonIcon","faInfoCircle","faStopwatch","faInfo","LinearScale","faTable","UnfoldMore","defaultProps","CustomSvgIcon","vertAlign","xmlns","viewBox","isolation","fillRule","vectorEffect","strokeWidth","strokeLinejoin","strokeLinecap","strokeMiterlimit","focusable","VerticalResizeBorder","handleMouseDown","lastPageX","resizeSideBar","handleMouseEnd","overlayBorder","resizesBorder","Tools","NONE","RECT_ROI","PEN_ROI","MAGICWAND_ROI","REGIONGROWING_ROI","REGIONGRABCUT_ROI","REGION_ROI","RECTANGLE_ROI","COMMENT_ROI","ELLIPSE_ROI","COPY_ROI","SELECTION_ROI","FILTERANNOTATIONS_ROI","PLOTNEAREST_ROI","FILL","IAM","AL","AITRAINING","GRIDTOOL","GRIDANNOTATIONTOOL","SELECTION_Tile","POINTCOUNTING_Tile","LANDMARK","HEATMAP","VerticalToolBar","setToolBarWidth","viewerToGallery","containerElement","topElement","bottomElement","verticalToolBarWidth","containerHeight","topHeight","bottomHeight","resultWidth","updateToolBarWidth","exportAllFiles","fileIDs","exportGallery","str_1","str_2","showMessage","exportCurrentFile","setStructureIds","setZLevelforRois","zLevelClassification","ApplyModel","onStartTraining","onSave","anchorEl","allScenes","onChangeTool","displayTimeBar","onToggleTimeBar","displayZStackBar","filesGalleryActive","show3DViewer","onToggle3DViewer","onToggleMeshView","showTilesGallery","onSaveScreenshot","onZoomDelta","onZoomFit","onZoomOriginal","onToggleSideBar","annotationsAreReduced","showZoomLevels","showUndoRedo","showSaveTool","showToggleSideBar","toolBar","Popper","TransitionProps","Fade","getLayoutElement","Boolean","isImporting","onToggleGallery","setGalleryTool","changeToSelectedFile","faImages","faCube","faBraille","onToggleTilesGallery","faSquareFull","FilterAlt","ScatterPlotIcon","splitscreenCount","onToggleFullscreen","showFullscreen","FullscreenExitIcon","FullscreenIcon","ViewQuilt","divider","faPlus","faPen","faMagic","CheckBoxOutlineBlank","faCircle","AllOutIcon","faFillDrip","faMousePointer","faClone","faThLarge","faTh","tool","InlineSVG","aiUsedStructures","faPlayCircle","onSaveImages","faDownload","faFileDownload","toolBarRow","faExchangeAlt","Save","RateReviewIcon","onToggleOverlay","showOverlay","FlipIcon","PinDropIcon","onToggleWindowTool","showWindowTool","SelectAllIcon","faCamera","textIcon","onZoomOneToN","ZoomOutMap","bind","ZoomIn","ZoomOut","UndoIcon","RedoIcon","getDist","pointA","pointB","getPointByPlaceInCurve","startIndex","place","distAr","indexA","indexB","getCurveDistances","distSum","_getStartInterpolPoin","absPlace","accLen","distIndex","absPlaceDist","getStartInterpolPoint","indA","indB","pA","pB","linearInterpol","pStart","pEnd","tStart","tEnd","getFigure","figureA","figureB","startPointIndA","startPointIndB","figAIsClockwise","figBIsClockwise","pointsCount","t1","t2","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","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","onStep","onPlayPause","playing","playDirection","onChangeSr","sr","timeLineHeight","ArrowLeft","PauseCircleOutline","PlayCircleOutline","ArrowRight","renderContent","ValueLabelComponent","enterTouchDelay","ZStackBar","minZ","maxZ","onChangeZ","onChangeZValue","onChangeZSr","barIcon","verticalTextfield","playPauseDown","stepUp","stepDown","playPauseUp","ImageInfo","infoArea","noWrap","sizeS","paddingRight","toBase","base","symbols","decimal","conversion","Renderer","createBackgroundPattern","backgroundPattern","patternContext","canvasId","mouseup","mousemove","heatmap","h337","create","gradient","maxOpacity","minOpacity","lastY","t0","performance","now","loadObject","showTimeBar","checkMiniMapVisivility","mousePos","getMousePositionInImage","componentWillUnmount","keepRendering","loadAllTiles","updatePreviewRect","setPreviewRect","updatePreviewRectSize","objectMode","UNSAFE_componentWillReceiveProps","isActive","previewRectChanged","getMousePosition","getPositionInImage","toolMouseForward","selectedId","getPointInCanvasCoord","tp","mousedown","ctrlKey","selROI","classify","classifySelectedRoi","pickedColor","hexColor","rgbToHex","colors_foreground","colors_background","colorListName","newROI","resizeROI","onChangeROIs","dragROI","fDragStart","_Object$values2","chainListFileIds","altKey","tempChainToggle","isDrawing","showHeatmap","heatmapData","setData","mouseBusy","changeCursorStyle","colorPickerType","middleMousePos","drag","_Object$values3","fPt","chainMouseDrag","_Object$values4","zoomMoveActionDebounced","lastMoveTime","mouseEnter","mouseLeave","centerX","centerY","updateFrameArray","showResultTable","onScaleOnly","wheelDelta","detail","zoomDirection","newZoom","zoomValueOut","zoomTo","returnValue","zoomPoint","_Object$values5","chainMousewheel","_Object$values6","leaderZoomPoint","miniMapZoom","tpt","miniMapRef","_i7","_Object$values7","initialScale","zoomMoveAction","chainMoveTo","_i8","_Object$values8","_i9","_Object$values9","hoverROI","centerROI","transformLandmarkNoOffset","newRegionList","newRegion","temp","generateTransformationOffset","origCenter","xValues","yValues","targetId","baseOme","ids","calculateTransformationMatrix","tOffset","offset","pushRegTile","colImg","mat","imgRegistered","callbackCounter","isLoadingTiles","Img","pushColoredImage","preloadNextFrames","changeHiConfig","preloadFrame","preloadNextZFrames","zoomToFactor","scaleTarget","zoomOriginal","resultTabActive","zoomOneToN","zoomDelta","zoomFit","canvasTranform","centerRoi","selRoi","roiItem","setNextTile","setZoomLevelForGridSize","pt2","zoomInRoi","zoomROI","pt1","zoomLeft","zoomRight","zoomTop","zoomBottom","tzoomROI1","setSubtypeRois","childStructures","_i10","findRoiLayer","strs","parentLayerRois","parentLayerTree","doubleObject","doubleObjectIndex","parentTreeItem","parentRoi","newArray","zoomObject","zoomRoi","updateVisibleROIDebounced","inDebounce","debounce","updateZ","updateGlobalZ","updateT","updateGlobalT","dt","lastFps","fps","newT","initializedZ","visX","visY","_i12","_visX","compositionModeFluor","parentlv","imgOld","requestAnimationFrame","scaleFactor","limitVisibleRegions","rr","rRoi","updateCounter","visibleRegionsRadius","serachParams","structureHasRois","showSubstructure","subtypeHasSubstructureParent","hasStrParent","fillstyle","findColor","ptrn","createPattern","patternScale","boundsAreaCompare","getDynamicRegions","_step23","_iterator23","showGridLabels","textBaseline","txt","tempStrokeStyle","tempLineWidth","_step21","_iterator21","_step24","_iterator24","showObjectIdx","layerRois","_step22","_iterator22","getPointOnPoly","textToShow","_step25","_iterator25","angle","atan2","wrapText","showMarks","showScaleBar","scaleBarData","scaleWidth","stopLineHeight","fontMargin","selectedROI","nowTime","windowToolRef","updateCanvas","_step26","_iterator26","lineIdx","words","testLine","measureText","getChildsofStructure","setNewSelRoi","withMouse","parentIndexLayer","idxStr","strToUse","nextFileId","getNextFileId","automaticFileChange","onSelectFile","inxCurrentFile","keyDown","rendererKeyDown","keyDownSelection","isTilesToolUsed","hasLayerTileNames","updateFLChannels","onPlayPauseZ","onSeek","onStepZ","scaledWidth","scaledHeight","previewWidth","previewHeight","minSize","maxSize","setPreviewSize","newSize","keyExtender","_defineProperty","hideMiniMap","showMiniMap","hideRestrictions","saveString","render","miniMapKey","showImageInfo","showZoomBar","showFileNavButtons","_ref2","toolbarButtonRootSingle","toolbarButtonRoot","heatmapContainer","userSelect","rightSpace","frameArrayDict","fileNavLeftBtn","followCursor","openPrevFile","KeyboardArrowLeftIcon","fileNavRightBtn","openNextFile","KeyboardArrowRightIcon","tMin","tMax","layerTrees","startY","miniMapReady","visibleRegionsLimit","structureRegionLimits","slowestStructureIdx","fastestStructureIdx","fileIdStateData","initFrameArray","updateExistingStructures","oldVisibleRegionCount","tempLayer","applyFrameArray","loadFrameArray","_step27","updatedFrameArrayFrame","_iterator27","getClearedRoiLayer","prevState","prevT","prevZ","curZ","prevFrameIndex","storeRoiLayersToFrameArray","removedStructures","_step28","_iterator28","existingStructures","_step29","_iterator29","layerId","oldFileId","newFileId","oldFrameIndex","getRemovedStructures","removeLayersFromFrameArray","flipRoiLayers","histoModule","clearRoiLayers","loadedAnnotationsCounter","SelectionTool","foundLayer","setCol","setIds","setBorderColor","setClassificationId","setClassification","setAutomaticFileChange","changeItem","fromButton","boundsSelection","moveToRect","changeTile","classifyFullSceneImage","ClassifySceneAsOneImage","fromRenderer","tilesProject","dashLength","setLineDash","changeSelRoi","handleChangeClassification","handleAutomaticFileChange","_this2$props","getPrevFileId","_this2$props2","getCurrentFileInx","_this2$props3","NavigateBefore","NavigateNext","TrainModelStep1","defaultImages","ImageList","ImageListItem","projectTile","projectTileSelected","updateFormDataGeneral","images","ImageListItemBar","loading","tileHeadline","imgContainer","ListItemOptionsMenu","optionsAnchorEl","handleOptionsOpen","handleOptionsClose","downloadAsFile","jsonObject","exportAnnotations","roiRegions","importAnnotations","inputElem","onchange","nonOverlapping","overlappingRois","intersecting","MoreVertIcon","Menu","ListItemIcon","PlaylistAddIcon","FileCopyIcon","ArrowUpwardIcon","ArrowDownwardIcon","ListItemStructure","hideSubtypes","visibilitySubtypesOff","visibilitySubtypesOn","selectStructure","adaptRois","newName","onChangeLayers","updateViewer","setTextInput","renderLocation","allStructuresEnabled","listItem","updateFormDataStructures","selStructures","structureInput","inputRef","textOverflow","whiteSpace","ListItemSubType","itemClicked","updateStructureChange","drawDivider","classificationChilds","numberOfObjects","listItemRef","isInView","parLayer","allStructures","_createElement","isAdmin","verticalFlip","horizontalFlip","updateFormDataAugmentations","TrainModelStep3","checkNameAvailibility","valueToCheck","isInvalidInput","test","newModelName","versionName","metaData","nameInUse","invalidChar","firstSelectField","updateFormDataMetaData","updateFormDataAdvSettings","image_size","setSelectedModel","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","encoderType","multiple","renderValue","updateFormDataAdvSettingsFlChannels","levelDataArray","levelData","optimizer","log2","resultValue","createDataSet","unfolded","selectedLevel","lastVersion","calculateWeightMap","calculate_weight_map","pyramid_level","modelData","replaceAll","Unet","UnetPlusPlus","DeepLabV3Plus","decoder","encoderTypeFound","backbone","selArchitecture","dataset_approach","settingsType","allSettingsEnabled","largestRoiPx","totalRoisArea","numberRois","layerIdx","avgArea","pyramidLevel","fullScene","objects150ImageSize","lvDistance","textInputField","dropDownLabel","getStringBetween","dataString","stringBefore","stringAfter","regexString","match","TrainAIModelDialog","updateTrainingProgressObject","errorLabel","trainingSuccessful","showTrainingButton","maxEpochs","tempProgress","overallProgress","metricsDict","splitMetrics","keyValue","augmentation","tileProgress","buildingModelProgress","processingFilesCount","multiplier","initTraining","handleNext","datasetOnly","validChar","newModel","activeStep","selStructure","startTrainingTime","trainModelInfo","stopAITraining","ValidatorForm","onSubmit","dialogRowContainer","TrainModelStep0","TrainModelStep2","Stepper","alternativeLabel","nonLinear","Step","StepButton","MobileStepper","steps","nextButton","KeyboardArrowRight","backButton","KeyboardArrowLeft","usableModels","SideBarTabAISelectByModel","aiCockpitLoaded","updateModelCheckboxes","modelIsSelected","selectedModels","checkboxesChanged","modelIsDisabled","modelIsChecked","usableStructures","usableStructure","structureIsChecked","isChecked","structureIsDisabled","isDisabled","updateSelectedTool","availableModels","availableModelsForStructure","getAvailableModelsForStructure","fullStructure","structurePath","findParentId","usableStructurClone","structure_indices","updatePersistentDefaultModels","expandedIdx","setAiUsedStructures","selectedLayerIdx","currentDefaultModels","handleExpandingChange","onExportClick","export","Name","WeightsName","exportAIModel","onDeleteClick","deleteAIModel","toggleModel","handleChangeModel","structureNameArray","handleModelChange","checkedStructure","selectedDropDownVersion","modelVersion","onFocus","handleChangeVersion","thickness","toPrecision","SideBarTabAI","setFormDataAICockpit","setAIFormData","checkForAvailableIAMSubtype","findClassificationSubtypes","selModel","handleImportModelSelection","importAIModels","success","fileIsNew","modelIncludesSubtypes","visibleVersions","lastSubtype","Online","initModelCounter","getOnlineModelsContainer","CloudDownload","Refresh","PublishIcon","tabContainer","setAvailableModels","setModelsInitialized","accordionContainer","showFirstAccordion","toggleShowFirstAccordion","square","TableContainer","tableContainer","table","TableHead","spinnerContainer","SideBarTabRois","structureScrollList","handlestructureListScroll","countVisibleStructures","cur","dynamicStructureText","focusTextInput","getAttribute","parentTop","parentHeight","elTop","structuresListHeight","textInput","createRef","structureRefs","tabContent","onExportParameters","onImportParameters","Add","onCenterROI","onHoverROI","summary","onChangeOpacity","roiContainer","FileTreeView","handleScroll","hasNotExcludedScenes","some","imageList","handleImageListScroll","overflowListRef","missingThumbnails","currentSceneFilterIdx","imageListItemRefs","scrollPosition","onExcludeFilesToggle","fileGroups","fileNames","selectedPath","scenes","maxSceneIdx","fileTreeView","excludeAllContainer","projectsToExclude","projectsToInclude","toExclude","RemoveCircleIcon","AddCircleIcon","filesList","fn","fn_index","fileItem","labelWrap","sceneFile","f_id","sceneItem","sceneName","excludeButton","previewImageContainer","previewImageSelected","previewImageInSplitscreen","previewImageNotSelected","importText","draggable","dataTransfer","previewImage","renderThumbnail","onError","lineThrough1","lineThrough2","sidebarHandle","closeButton","expensionSummary","visibility","SideBarTabView","isMounted","onChangeChannels","sideBarWidth","histogramContainer","ScoringMatrixHistoClassification","UNSAFE_componentWillMount","selSample","store","selId","parentIdxSelStructure","getAbbreviationOfStructure","strWithBracket","isCriticalOrSelected","isStructureCritical","numberTiles","totalClassFrequencies","mean","setAvgClassFrequ","criticalClass","subtractFrequencyClass","addFrequencyClass","fClass","newSelChildIdx","warningWasShown","warningStr","handleChangeSelectedStructure","parentStructures","idxNewSelectedStructure","resetStructures","selectRow","renderSubtypeRow","rowFrequencyClass","renderFrequencyClasses","isSelSampleSet","ScoringMatrixHistoPointCounting","getCount","blockClassifyTile","classifyTile","getTotalCount","onNext","classifyTileWithkey","keyNumber","canCallClassifyTileWithKey","structureForClassification","isTileClassified","tileHasStructureClass","indexSubtype","fromRendering","emptyId","renderMatrixBottom","renderMatrixHeader","HistoClassififcationLabels","SideBarTabResults","gridtool","isHistoClass","setSelectedSampleFromFilename","sampleAbbr","sampleLabel","exists","changeSample","isHistoPntC","setRoiItem","resetRoiLayers","sortSlides","savedRoi","numberRegionRois","selectiontile","checkIfSkipped","setClassToZero","startHistoPointCounting","pointcountingtile","totalCount","onPause","saveToJSON","blockPrevious","onPrevious","previousHistoClassification","previousHistoPointCounting","newSelectedRoi","prevFileId","lastTileIndices","roiFile","blockNext","nextButtonDisabled","nextHistoClassification","nextHistoPointCounting","id_range","getRoiLayersIdRange","tmp","roi_min","roi_max","indicesObject","isLastClassifiedTile","classifiedTiles","idxLastTile","blueTilesClassified","nextFileIndex","previousFileIndex","setProjectsPending","onEnd","renderGridTool","dynamicStructureAbbrText","newSubstructureLabel","addSelectedStructures","structuresToAdd","showLabelsToAdd","startOrContinueText","nextOrSkipText","isLastFile","_this$props26","lastTileClassification","lastTileCounting","labelWithBracket","getOtherLabels","_this$props27","sampleChilds","sampleChildsLabels","newLabels","histoLabel","handleChangeNewStructures","updatedStructures","labelStr","_this$props28","numberTilesFile","showAddSubstructure","withRouter","SideBar","subscribe","initAICockpitData","structureIndices","augmentations","backbones","unet","unet_pp","deepLabV3_p","classification_models","lossFunction","physicalSize","physicalSizeUnit","in_channels","setInputChannels","flChannels","setFlChannels","modelsize","lr","batch_size","datasetApproach","includeBackgroundTiles","tileSize","objectBasedBaseStructure","useExistingDataset","useClassWeights","loadPersistentDefaultModels","defaultModels","connectOnline","selected_model","selected_version","loadProject","projectData","stringProperties","DefaultModels","foundModel","foundVersion","structureKey","warn","initPythonModules","handleTabChange","isResultTab","setSideBarWidth","nextTab","getActiveTabResults","renderCommentTool","_this$props$projectCo","roiCount","sidebar","faCog","faPencilRuler","faChartBar","tabContentContainer","sideBarTabResults","borderTop","TilesClassificationTool","TilesHistoPointCountingTool","lineLengthWidth","lineLengthHeight","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","getStyle","texture","applyQuaternion","quaternion","material","frameId","animate","cancelAnimationFrame","antialias","propsCam","Viewer3D","renderer3D","outputEncoding","toneMappingExposure","aspect","updateProjectionMatrix","light","controls","OrbitControls","get3dObjects","GLTFLoader","gltf","setFromObject","getCenter","get3DAllObjectsExists","load3DObject","getObjectByName","WindowTool","handleSizeChanged","CompContainer","canvasComp","flexDirection","LazyRender","maxContainerHeight","elementHeight","_props$offsetElements","offsetElements","containerRef","useRef","scrollPositionTop","setScrollPositionTop","_useState3","_useState4","setContainerHeight","useEffect","ProjectActionMode","freeze","Import","Update","_dialogContent","_Object$freeze","FindFilesDialog","_props$formData","_props$onSuccess","dialogIsOpen","openAccordion","handleSubmit","checkFileMappings","allUniquelyMapped","onSuccess","openWarningDialog","endAdornment","duplicatePath","InputAdornment","ContentCopyIcon","found","CheckIcon","ErrorIcon","newPath","uniqueFiles","mapping","array","localeCompare","filesFound","duplicates","missing","_","generateFileList","Viewer","idMapping","toolPresets","paramName","setNavigationbarTitle","commentLayersObject","landmarkLayersObject","tMatrices","tFactors","tOffsets","projectDataFiles","fileIdx","dataFileIdx","info","projectDataFile","projectFile","fullyAnnotated","getCurrentUser","fullName","migrateTools","initLayersAndStructures","openedFileId","sFileIds","fsFileIds","newZoomObjectDict","openFile","zoomObjectDict","rv","sortedFiles","setSelLayerConfig","_step4$value","_step5$value","toolIndex","viewerConfigTool","vTool","transformedVParameters","generateToolParameterDict","makeProjectCompatible","sructuresWithNoId","projDataStr","viewerConfStr","newLayerIndices","loadAllFiles","newProjectObject","newRoiLayers","projId","fileAnnotationsLoaded","loadAnnotationsFunction","createAnnotationsProjectModel","loadAnnotations","withHoles","onlyAnnotations","saveWithSpinloader","preparingStartJob","saveFunction","toolParameters","sharedToolParameters","shared","structureHasChild","findStructureSubtypeLevel","subtypeLevelCount","pIndex","clearOtherLayers","updateStructuresWithPersistentStorage","histogram","storedParams","checkIfErrorInProjectData","newRegionRois","selObjects","graphData","selectedFileId","processGeoJSONArray","geoJSONArray","layerID","newRegionRoisObject","layerObject","tIdx","_this$props$projectCo2","projectWithClasses","getLocalZoomObject","toggleRois","elem","activeElement","localName","onSaveClick","toggleSideBar","pressedNumber","getArrayDepth","depthArray","depth","isCorrespondingPolygon","createNewRois","frameGeoJson","timeoutId","updateVisibleROI","processLoadedAnnotations","jsonAnnotations","newroiLayers","is_locked","is_reduced","total_roi_count","emptyIdxs","_keys","idframeArray","idTimeArray","loadedframeArray","objectframeArray","_this$createNewRois","_this$createNewRois2","structROIs","structID","annotatedFileIds","_this$props$projectCo3","structuresMap","currentFile","fileData","maxResults","lp1","lastViewRoiParams","lp2","_this$props$projectCo4","_this$props$projectCo5","deleteRoiLayersForScene","_this$props$projectCo6","galleryChangeTool","checkTool","exit","_this$props$projectCo7","checkPropertyInConfig","property","persisObj","updateStructure","sliderRef","addFileToFullscreen","onSwitchFileSplitscreen","projectObject","toggleFileTreeView","showFileTreeView","containerKey","loadSCNXMLAnnotations","deleteforAllScenes","getNumberSubstructuresWithRois","_this$props$projectCo8","nextParentLayer","_this$props$projectCo9","readableId","job","correctStructureId","regionRoisToMove","roiLayerIdx","current_id","idTimeArr","idLayer","tArrRois","frameIdTimeArr","selLayer","selStructureId","exportSubstructures","numberSubstructuresWithRois","fileID","fromActiveLearning","updateCount","setAIObjects","_this$props$projectCo10","Objs","subtypeStructureIdx","idxLastLabeled","unlabeled","sortedObjects","newSortedArray","updatedRoiLayer","_this$props$projectCo11","findFileIndex","applyModelAfterTraining","startPassiveLearningTraining","prepareImagesForTraining","startClassification","projModel","warning","adjustRoiLayers","_this$props$projectCo12","_loop8","subtypeLayer","addStuff","string","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","o","_i11","_i13","_i14","_i15","_i16","onSaveGalleryClick","originalSideBarWidth","updateDimensions","toggleClassRoomChat","showGrid","resizeEnd","newSideBarWidth","minSideBarWidth","minRendererWidth","newTimeLineHeight","minTimeLineHeight","minCanvasHeight","newToolBarWidth","galleryView","isElementVisible","sideBarWidthObject","sideBarWidthFromConfig","saveChainStatus","chainList","onSelectFileSplitscreen","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","structureTools","resetRoiZoom","resetRoiZoomInDict","onmousedown","onmouseup","onmousemove","requestProject","newMappingsFound","FindMissingFiles","gl","X1","Y1","hConfig","paramDict","paramLabelDict","activeId","_i17","_Object$values10","savedT","_i18","_Object$values11","widthThreshold","outerWidth","heightThreshold","outerHeight","Firebug","chrome","isInitialized","lastFileId","_this$props$projectCo13","_loop9","loadImage","newOme","failedFilePath","automaticFullImageRoiLayer","msg","docstr","doc","DOMParser","parseFromString","annodoc","getElementsByTagName","tagName","vertices","vertex","selRoiLayer","fromExport","defaultSaveCallback","saveAnnotations","dataURI","byteString","atob","unescape","mimeString","ia","Uint8Array","charCodeAt","_this9","_this$props$projectCo14","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","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","_React$Component2","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","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","scores","approximations","analysisResults","analysisResultsLoaded","selectedPcaScore","selectedProcessedSpectrum","currentlyShownData","ratedSpectra","selectedModelName","passingCriteria","passingCriteria_idx","passingCriteria_min","passingCriteria_max","spectraPredictionSettings","TooltipTable","SpectraTab","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","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","_model$versions$model","substances","substance","oldSettings","foundIdx","setting","concentration","onPcaAnalysis","onPredictSpectrum","pcaStats","pca","preprocessing","used_scores","features","r2","modelStats","_model$versions$model2","_model$versions$model3","subst","handleChangeCriteriaLimits","handleChangePredictionSettings","handleChangeManualXRange","xValueMinMax","passingCriteriaSettings","_spectraViewer$passin","targetIndex","criterium","spectraPreditionSettings","_spectraViewer$spectr","_spectraViewer$spectr2","setXRangeManually","_spectraViewer$pcas","_spectraViewer$models","SwapVertIcon","returnHome","AnalysisTab","graph_names","visbilityButton","iconOn","iconOff","onApproxToggleVisibility","checkForChecked","checkForAnyChecked","showAnalysisResults","approximation","orig","pre","approx","resid","SpectraSideBar","Redirect","to","faCheckCircle","tab_no","ELineChart","initChart","mainChartDataShown","chartDom","myChart","chartRef","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","AddIcon","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","_this$props$spectraVi","useAll","areaSet","selectedSpectrumId","limits","requestSpectraData","rated_spectra","structurePcaAnalysisResults","showPredictionResults","predictedSpectra","model_data","setSeries","currentValue","backendStatus","_score$symbol","symbol","character","_approximation$symbol2","_approximation$symbol3","_approximation$symbol4","rawSpectrum","_approximation$symbol","original_data","approximated_data","orig_data","spectra","_tmpSpectra","tmpSpectra","existingNames","validateDatasets","animation","containLabel","toolbox","dataZoom","yAxisIndex","brush","saveAsImage","itemSize","iconStyle","xAxisIndex","brushLink","outOfBrush","colorAlpha","sent","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","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","_this$props$scanViewe","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","ArrowUpward","Folder","fileIcon","fileSize","creationTime","onConfirm","selectFileButton","ScanToolBar","fileDialogOpen","sidebarVisible","onToggleSidebar","toolbarButtonActive","Pause","Videocam","GridOn","Comment","Flare","Undo","Redo","RestartAlt","inactive","CustomSlider","iconButton","InfoIcon","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","Info","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","read","SheetNames","Sheets","Sheet1","A1","sheets","sheet_name","utils","sheet_to_json","header","abc","fromCharCode","sheet","rowLength","lastContentIdx","cell","addRow","_step3$value","array_sheets","tab_name","resultTabContent","array_sheet","Datasheet","valueRenderer","onCellsChanged","renderReportChart","boxSizing","PrivateRoute","roles","rest","Route","pathname","SystemContainer","saveClick","collection","storagePath","galleryOutputPath","_step$value","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","FolderIcon","importerStart","importerEnd","importerNewerThan","ProjectModuleTiles","availableTypes","onProjectType","onProjectTypeChange","rowHeight","projectTilesList","deleteButton","deleteProjectModuleType","tileImage","tileBar","ModuleSelectionDialog","updateProjectTypes","handleOK","selectedProjectType","onSelectProject","submitted","ModuleCreationContainer","setProject","structureKeys","structureObj","_structureKeys","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","SortIcon","faHandPointer","activeColor","toolsInProjectObject","middleStructuresColumn","tileContainer","GetAppIcon","importProjectTypes","AdminPage","rootContent","LoginPage","validateUserOrEmail","userList","valid","isUsername","validateEmail","emailErrorText","isSubmitting","testUserList","license","licenseStatus","addValidationRule","getUserList","removeValidationRule","CssBaseline","LockOutlinedIcon","form","TextValidator","validators","errorMessages","suggested","submit","breakpoints","up","contentIcon","SelectPathDialog","isFolder","acceptPath","isOpen","setIsOpen","setPath","_useState5","_useState6","directories","setDirectories","getDirectories","handleListItemClick","useCallback","directory","handleGoUp","onCancel","onAccept","Description","dirName","LicensingPage","_event$target","javaPath","correctPath","writeAppSettingsLicensing","allValid","dialogString","validationObject","removeErrorStyle","handleCopyLink","navigator","clipboard","writeText","hardwareID","pasteLicenseKeyFromClipboard","readText","licenseKey","readLicenseKeyFromFile","fileInput","fileReader","fileContents","handleAccept","validationMsg","expirationDate","localhost","readAppSettingsLicensing","statusBlock","OutlinedInput","SelectPathButton","licensStatusContainer","pasteIconButton","ContentPasteIcon","importIconButton","FileUploadIcon","licensingInput","Step0","onChangeFilter","searchText","onChangeName","onSaveName","isHistoModule","sm","SearchIcon","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","foldersToExclude","sortedDirFiles","lastDir","char","lastFileName","dirFilePaths","lastFileIdx","firstIdx","lastIdx","fileNameToAdd","onChangeFiles","toggleAllFiles","removeFolder","addFolder","filePaths","filteredFiles","filesToAdd","resultFiles","toggleSortMenu","sortMenuOpen","setSortBy","sortBy","sortReverse","image_error","ArrowDownward","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","ProjectsTimeLineChart","selectedProjects","selectedTargetColumnHeadline","formatter","dataView","orient","legendLabels","combinedResultRows","getOption","rowData","combinedResults","targetColumnIndex","columnHeadlines","targetColumnData","axisValue","seriesName","updateChart","projectItem","errorItem","CreateTimeLineChartDialog","close","selectedProjectIds","setSelectedProjects","selectedProjectsFailed","setSelectedProjectsFailed","setProjectData","_useState7","_useState8","targetColumnHeadlines","setTargetColumnHeadlines","_useState9","_useState10","setSelectedTargetColumnHeadline","filteredProjects","arr1","arr2","sortedArr1","sortedArr2","isDifferent","failedProjects","promises","promise","resolve","roiLayerInfoSheet","sheetToJson","combindedResultsStartIndex","resultRow","projectSheetData","updatedColumnHeadlines","validProjects","entryProject","columnHeadline","DragDropContext","onDragEnd","destination","source","newSelectedProjects","_newSelectedProjects$","movedItem","Droppable","droppableId","provided","innerRef","droppableProps","draggableId","draggableProps","dragHandleProps","DragHandleIcon","ErrorOutlineIcon","onSelectAllClick","numSelected","EnhancedTableToolbar","onRunSelectedClick","onTimedRunSelectedClick","onDuplicateSelectedClick","onImportClick","onCreateTimeLineChartClick","fileUploader","_initTimelineButton","timeLineButtonTooltip","timeLineButtonDisabled","projectTypeEqual","projectTypeSupported","allProjectsFinished","notSupportedMethod","supportedProjectTypes","initTimelineButton","_initTimelineButton2","Toolbar","highlight","actions","TimelineIcon","TimerIcon","FileCopy","PlayArrowIcon","CloudUpload","lighten","dark","spacer","ProjectsTable","projectTypesNames","handleSelectAllClick","isJobVisible","handleSelectOneClick","serverIsRunning","handleContextmenu","canRun","setProjectsTimed","importProjects","ImportProjectsDialog","exportProjects","deleteProjects","deleteGalleryExport","duplicateProjects","onDuplicateSingleClick","onProjectStateClick","loadProjectMessage","jsonResponse","onProjectErrorStateClick","labelFromState","progressBarContainer","bar","creatingJobBar","showJob","openCreateTimeLineDialog","createTimeLineChartDialogIsOpen","closeCreateTimeLineDialog","cancelJob","resultObject","countOther","_this$state$createTim","sortedProjects","countFinished","tableLayout","jsonDate","tableRow","onEditProject","EditIcon","labelFromProjectType","creationDateTime","toLocaleString","onCancelRowClick","onSetTimedClick","onRunRowClick","paginationSpacer","darken","incrementDefaultName","maxProjNum","proj","projNum","newMaxProjNum","num","pad","HomePage","checkPythonServer","isLocalServerReady","editableProject","handleEditOpen","refreshProjects","activeTabIndex","newDefaultName","refreshProjectsInterval","clearInterval","refreshInterval","listProjects","serverSpinLoader","tags","subTags","CasesSideBar","expansionRow","expansionDetails","TreeView","treeRoot","defaultCollapseIcon","defaultExpandIcon","ChevronRightIcon","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","WorkIcon","ScannerIcon","warningColor","PermMediaIcon","ScreenShareIcon","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","setProjectTypeWorkflows","aboutResult","filteredWorkflows","workflow","scrollRef","buildDate","Container","CustomDialog","handleConfirmOpen","responseFunction","dialogState","handleErrorOpen","handleWarningOpen","confirmed","downloadError","App","enqueueSnackbar","historyDepth","ProteomViewer","_ref3","ScanProvider","_ref4","exact","withSnackbar","hostname","baseUrl","rootElement","createTheme","typography","useNextVariants","ReactDOM","BrowserRouter","basename","StyledEngineProvider","injectFirst","ThemeProvider","SnackbarProvider","maxSnack","serviceWorker","registration","unregister"],"mappings":"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","file":"static/js/main.ac4099e4.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 { v4 as uuidv4 } from \"uuid\";\r\n\r\nconst SERVER_URL = \"http://127.0.0.1:8051/\";\r\nlet jobProgressConnection = new HubConnectionBuilder()\r\n .withUrl(\"/jobprogress\")\r\n .configureLogging(LogLevel.Warning)\r\n .build();\r\njobProgressConnection.serverTimeoutInMilliseconds = 5_000 * 1_000; // 50000 second\r\njobProgressConnection.keepAliveIntervalInMilliseconds = 5_000 * 1_000; // 50000 second\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\n/**\r\n * Default handeling on a successfully parsed json response that returns an \"error\" key to report errors.\r\n * @param {JSON} res Parsed json object from response.\r\n * @param {Function} callback The function to call to handle a successful request.\r\n * @param {Function} error Optional. The function to call on any error.\r\n */\r\nfunction handleJsonResponse(res, callback, error = () => {}) {\r\n if (res.error) {\r\n console.error(error);\r\n error(res.error);\r\n } else {\r\n callback(res);\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 /**\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 /**\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 * list all folders inside the given path\r\n * @param {*} path is the path to the folder the subfolders should be listed\r\n */\r\n static getDirectories(path) {\r\n return fetch_auth(`/api/admin/directories?path=${path}`).then(\r\n (response) => {\r\n if (response.status === 200) return response.json();\r\n if (response.status === 400) {\r\n window.showErrorSnackbar(\"Access to the path is denied.\");\r\n return null;\r\n }\r\n }\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} 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 * Request a project, before actually loading it.\r\n * Allows to check if the project is available and to inject further actions if not.\r\n * @param {uuidv4} id The id of the project to request.\r\n * @param {Function} callback The function to call to handle a successful request.\r\n * @param {Function} error Optional. The function to call on any error.\r\n */\r\n static async requestProject(id, callback, error = () => {}) {\r\n fetch_auth(`/api/project/request?id=${id}`, {\r\n method: \"GET\",\r\n })\r\n .then((response) => {\r\n if (response.ok) {\r\n return response.json();\r\n }\r\n throw new Error(`Error loading exported projects`);\r\n })\r\n .then((res) => handleJsonResponse(res, callback, error))\r\n .catch((err) => {\r\n console.error(err);\r\n error(err);\r\n });\r\n }\r\n\r\n /**\r\n * Load project meta data from backend.\r\n * @param {Object} params object containing project id {id: GUID}.\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 async loadAnnotations(params, queryOptions) {\r\n return fetch_auth(\r\n `/api/project/get_annotations?id=${params.id}&fileId=${params.fileId}`,\r\n {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(queryOptions),\r\n }\r\n ).then((response) => {\r\n if (response.status === 200) return response.json();\r\n if (response.status === 400) {\r\n window.showErrorSnackbar(\"Access to the path is denied.\");\r\n return null;\r\n }\r\n });\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 * @param {Function} errorCallback Function executed on error. Receives {string} Error.\r\n */\r\n static getModelMetadata(\r\n model_path,\r\n online = false,\r\n callback,\r\n errorCallback = () => {}\r\n ) {\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 const modelErrs = unlistedModels.map(\r\n (model) => `\\n${model.name} - ${model.version}: \\t${model.shortErr}`\r\n );\r\n errorCallback(\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, errorCallback) {\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 if (errorCallback) errorCallback(error);\r\n });\r\n } catch (ex) {\r\n console.log(\"error:\", ex);\r\n }\r\n }\r\n\r\n /**\r\n * Get message from one project\r\n * @param {String} id\r\n * @returns Promise\r\n */\r\n static loadProjectMessage(id) {\r\n return fetch_auth(`/api/project/get_message?id=${id}`).then((response) =>\r\n response.json()\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 * Import exported projects.\r\n * @param {FormFile} file The file to import projects from.\r\n * @param {Function} callback The function to call to handle a successful request.\r\n * @param {Function} error Optional. The function to call on any error.\r\n */\r\n static importProjects(file, callback, error = () => {}) {\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) => {\r\n if (response.ok) {\r\n return response.json();\r\n }\r\n throw new Error(`Error loading exported projects`);\r\n })\r\n .then((res) => handleJsonResponse(res, callback, error))\r\n .catch((err) => {\r\n console.error(err);\r\n error(err);\r\n });\r\n }\r\n\r\n /**\r\n * Checks new or edited proposed file mappings for validity in Backend.\r\n * @param {Tuple(Array, Array)} formData Tuple with list of all projects to import and list of all proposed file mappings.\r\n * @param {String} projectActionMode The action to perform on the projects. Must be a valid value of ProjectActionMode.\r\n * @param {Function} callback The function to call to handle a successful request. Receives {object} Response.\r\n * @param {Function} error Optional. The function to call on any error. Receives {string} Error.\r\n */\r\n static checkFileMappings(\r\n formData,\r\n projectActionMode,\r\n callback,\r\n error = () => {}\r\n ) {\r\n fetch_auth(`/api/project/checkFileMappings?mode=${projectActionMode}`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(formData),\r\n })\r\n .then((response) => {\r\n if (response.ok) {\r\n return response.json();\r\n }\r\n const projectCount = formData.projects.length;\r\n throw new Error(\r\n `Error importing ${projectCount} ${\r\n projectCount === 1 ? \"project\" : \"projects\"\r\n }`\r\n );\r\n })\r\n .then((res) => handleJsonResponse(res, callback, error))\r\n .catch((err) => {\r\n console.error(err);\r\n error(err.message);\r\n });\r\n }\r\n\r\n /**\r\n * Export an AI model to a .modelhsa file and triggers its download.\r\n * @param {Object} aiModel The model to export.\r\n * @param {Function} callback What to\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 * 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 if (callback) {\r\n callback(data);\r\n }\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.log(\"data:\", data);\r\n\r\n // connection.on(\"Progress\", (line) => {\r\n // // output debug prints of python module\r\n // //console.debug(line);\r\n // });\r\n jobProgressConnection.off(\"StandardOutput\");\r\n jobProgressConnection.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 jobProgressConnection.off(\"Result\");\r\n jobProgressConnection.on(\"Result\", (json) => {\r\n if (json.error) {\r\n console.log(\"iam result error:\", 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 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 if (jobProgressConnection.state === 0) {\r\n // 0 = disconnected\r\n jobProgressConnection\r\n .start()\r\n .then(() =>\r\n jobProgressConnection.invoke(\"AssociateJob\", myJson.jobId)\r\n )\r\n .catch((err) => console.error(err.toString()));\r\n } else {\r\n jobProgressConnection\r\n .invoke(\"AssociateJob\", myJson.jobId)\r\n .catch((err) => console.error(err.toString()));\r\n }\r\n });\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.toLowerCase() === \"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 jobProgressConnection.off(\"Progress\");\r\n jobProgressConnection.on(\"Progress\", (line) => {\r\n if (line) {\r\n progressCallback(line);\r\n }\r\n });\r\n jobProgressConnection.off(\"StandardOutput\");\r\n jobProgressConnection.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 jobProgressConnection.off(\"StandardError\");\r\n jobProgressConnection.on(\"StandardError\", (line) => {\r\n // output debug prints of python module\r\n if (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 jobProgressConnection.off(\"Result\");\r\n jobProgressConnection.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 if (jobProgressConnection.state === 0) {\r\n jobProgressConnection\r\n .start()\r\n .then(() =>\r\n jobProgressConnection.invoke(\"AssociateJob\", myJson.jobId)\r\n )\r\n .catch((err) => console.error(err.toString()));\r\n } else {\r\n jobProgressConnection\r\n .invoke(\"AssociateJob\", myJson.jobId)\r\n .catch((err) => console.error(err.toString()));\r\n }\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) => {\r\n return response.ok ? response.json() : { user: { group: null } };\r\n })\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 \r\n \r\n this.handleColorPickerClick(e, index)\r\n }\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\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","/**\r\n * Adjusts a UTC date to local timezone.\r\n * @param {Date} date A date object to convert.\r\n * @returns {Date} A date adjusted to the local timezone.\r\n */\r\nexport 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\n/**\r\n * Turn a json date into a standard Date object.\r\n * @param {object} jsonDate An date formatted as a json object.\r\n * @returns {Date} A Date object.\r\n */\r\nexport function convertDate(jsonDate) {\r\n return new Date(jsonDate);\r\n}\r\n\r\n/**\r\n * Get the viewer defining url path from a project type in the format \"/path/\".\r\n * @param {string} projectType Name of the project type.\r\n * @returns {string} Viewer defining path for URL.\r\n */\r\nexport function viewerType(projectType) {\r\n // Spectra Viewer\r\n if (\r\n projectType.includes(\"ESRTraining\") ||\r\n projectType.includes(\"ESREvaluation\")\r\n ) {\r\n return \"/esr_view/\";\r\n }\r\n // Proteome Viewer\r\n else if (projectType.includes(\"ProteomeAnalysis\")) {\r\n return \"/proteome_view/\";\r\n }\r\n // Image Viewer\r\n else {\r\n return \"/view/\";\r\n }\r\n}\r\n\r\n/**\r\n * if there were no new calls of this function for the delay time, the newest func will be triggered\r\n * @param {function} func callback function\r\n * @param {int} delay in ms\r\n * @returns\r\n */\r\nexport function debounce(fn, delay) {\r\n let timeoutId;\r\n return function (...args) {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n fn(...args);\r\n }, delay);\r\n };\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 a given 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 the 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 // Find the index of the given structure within the structures array\r\n const idx = structures.findIndex((struct) => struct.id === structure.id);\r\n // Generate a list of parent structures for each structure in the structures array\r\n const parentList = generateParentList(structures);\r\n\r\n // Find the direct parent of the given structure\r\n const parent = parentList[idx][parentList[idx].length - 1];\r\n\r\n // Find the index of the parent structure within the structures array\r\n const parentIdx = structures.findIndex((struct) => struct.id === parent.id);\r\n\r\n // Generate a list of children structures for each structure in the structures array,\r\n // then retrieve the children IDs for the given structure\r\n const decendantIds = generateChildrenList(structures)[idx].map(\r\n ({ id }) => id\r\n );\r\n\r\n // Filter the ROI layer of the parent structure to only include ROIs\r\n // that belong to the given structure and its decendants\r\n return roiLayers[parentIdx].layer.regionRois.filter((roi) =>\r\n decendantIds.includes(roi.structureId)\r\n );\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 PolyBool from \"polybooljs\";\r\n\r\nimport { RegionROI } from \"./ROI\";\r\nimport * as turf from \"@turf/turf\";\r\nimport { generateChildrenList } from \"./StructuresUtils\";\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 === undefined || lineArray.length === 0) return;\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 isInside(regionRoi1, regionRoi2) {\r\n let poly1 = turf.polygon(regionRoi1.regions);\r\n let poly2 = turf.polygon(regionRoi2.regions);\r\n\r\n // Return true if poly1 is completely inside poly2\r\n return turf.booleanWithin(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 bufferSize\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 if (bufferSize && bufferSize !== 0) {\r\n transformResult = buffer(transformResult, bufferSize * 100);\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\r\n/**\r\n * Validates rois in the given array and corrects them in place if necessary.\r\n * Goes to great lengths to attempt to find the correct structure for each roi.\r\n * When provided, uses fallback if no matching structure was found.\r\n * @param {array[RegionROI]} rois Rois to validate and correct.\r\n * @param {array[object]} structures The structures of the project.\r\n * @param {number} fallbackStructureIndex Optional. The index of the fallback structure to use if no matching structure was found. Defaults to null.\r\n */\r\nexport function validateAndCorrectRois(\r\n rois,\r\n structures,\r\n fallbackStructureIndex = null\r\n) {\r\n // Validate and correct rois.\r\n rois.forEach((roi) => {\r\n // Find the corresponding structure by id.\r\n const suggestedStructure = structures.find(\r\n (structure) => structure.id === roi.structureId\r\n );\r\n if (\r\n suggestedStructure?.color === roi.color &&\r\n suggestedStructure.label === roi.subtypeName\r\n ) {\r\n // The roi is valid.\r\n return;\r\n }\r\n\r\n // The roi is invalid. Correct it.\r\n // Check if id and color match.\r\n if (suggestedStructure?.color === roi.color) {\r\n roi.subtypeName = suggestedStructure.label;\r\n return;\r\n }\r\n\r\n // Check if id and label match.\r\n if (suggestedStructure?.label === roi.subtypeName) {\r\n roi.color = suggestedStructure.color;\r\n return;\r\n }\r\n\r\n // Find the corresponding structure by color and label.\r\n const realStructureByNameAndColor = structures.find(\r\n (structure) =>\r\n structure.color === roi.color && structure.label === roi.subtypeName\r\n );\r\n\r\n if (realStructureByNameAndColor) {\r\n roi.structureId = realStructureByNameAndColor.id;\r\n return;\r\n }\r\n\r\n // Find the corresponding structure by parent and color.\r\n const [suggestedStructChildren] = generateChildrenList(structures).filter(\r\n (s) => s[0].id === roi.structureId\r\n );\r\n if (suggestedStructChildren) {\r\n const realStructureByParentAndColor = suggestedStructChildren.find(\r\n (structure) => structure.color === roi.color\r\n );\r\n if (realStructureByParentAndColor) {\r\n roi.structureId = realStructureByParentAndColor.id;\r\n roi.subtypeName = realStructureByParentAndColor.label;\r\n return;\r\n }\r\n\r\n // Find the corresponding structure by parent and label.\r\n const realStructureByParentAndLabel = suggestedStructChildren.find(\r\n (structure) => structure.label === roi.subtypeName\r\n );\r\n if (realStructureByParentAndLabel) {\r\n roi.structureId = realStructureByParentAndLabel.id;\r\n roi.color = realStructureByParentAndLabel.color;\r\n return;\r\n }\r\n }\r\n\r\n const newlyAssignedStructure = structures.find(\r\n (structure) => structure.id === roi.structureId\r\n );\r\n\r\n if (!newlyAssignedStructure) {\r\n // The roi is invalid, cannot be corrected, and no replacement structure was found and no fallback structure was provided.\r\n if (fallbackStructureIndex === null) {\r\n console.debug(\r\n 'Could not correct roi with id \"' +\r\n roi.id +\r\n '\". No structure with color \"' +\r\n roi.color +\r\n '\" and label \"' +\r\n roi.subtypeName +\r\n '\" found. No structure matching structure with id \"' +\r\n roi.structureId +\r\n '\" found. No fallback structure provided.'\r\n );\r\n return;\r\n }\r\n\r\n // The roi is invalid, cannot be corrected, and no replacement structure was found. Use the fallback structure instead.\r\n const fallbackStructure = structures[fallbackStructureIndex];\r\n roi.structureId = fallbackStructure.id;\r\n roi.color = fallbackStructure.color;\r\n roi.subtypeName = fallbackStructure.label;\r\n\r\n console.debug(\r\n 'Corrected roi with id \"' +\r\n roi.id +\r\n '\" using fallback structure: Color \"' +\r\n roi.color +\r\n '\" label \"' +\r\n roi.subtypeName +\r\n '\"'\r\n );\r\n return;\r\n }\r\n\r\n // The roi is invalid and cannot be corrected.\r\n roi.structureId = newlyAssignedStructure.id;\r\n roi.color = newlyAssignedStructure.color;\r\n roi.subtypeName = newlyAssignedStructure.label;\r\n\r\n console.debug(\r\n 'Could not correct roi with id \"' +\r\n roi.id +\r\n '\". No structure with color \"' +\r\n roi.color +\r\n '\" and label \"' +\r\n roi.subtypeName +\r\n '\" found. Original structure id: \"' +\r\n roi.structureId +\r\n '\". Assigning it to its suggested structure \"' +\r\n newlyAssignedStructure.label +\r\n '\" with id \"' +\r\n newlyAssignedStructure.id +\r\n '\" and color \"' +\r\n newlyAssignedStructure.color +\r\n '\" instead.'\r\n );\r\n return;\r\n });\r\n}\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 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 loadedProjectState = JSON.parse(\r\n localStorage.getItem(this.props.projectId)\r\n );\r\n this.projectState = loadedProjectState ? loadedProjectState : {};\r\n this.projectTypeState = null;\r\n }\r\n\r\n save(key, value) {\r\n let v = JSON.stringify(value);\r\n let stateObject = { ...this.projectState }; //copy whole state for saving\r\n stateObject[key] = v;\r\n localStorage.setItem(this.props.projectId, JSON.stringify(stateObject));\r\n this.projectState[key] = v;\r\n }\r\n\r\n load(key) {\r\n if (typeof this.projectState[key] === \"string\") {\r\n try {\r\n return JSON.parse(this.projectState[key]);\r\n } catch (e) {\r\n return this.projectState[key];\r\n }\r\n } else {\r\n return this.projectState[key];\r\n }\r\n }\r\n\r\n saveProjectTypeValue(projectType, key, value) {\r\n let v = JSON.stringify(value);\r\n let stateObject = { ...this.projectTypeState }; //copy whole state for saving\r\n stateObject[key] = v;\r\n localStorage.setItem(\"local_\" + projectType, JSON.stringify(stateObject));\r\n this.projectState[key] = v;\r\n }\r\n\r\n loadProjectTypeValue(projectType, key) {\r\n if (this.projectTypeState == null) {\r\n this.projectTypeState = JSON.parse(\r\n localStorage.getItem(\"local_\" + projectType)\r\n );\r\n }\r\n if (this.projectTypeState == null) return null;\r\n if (typeof this.projectTypeState[key] === \"string\") {\r\n try {\r\n return JSON.parse(this.projectTypeState[key]);\r\n } catch (e) {\r\n return this.projectTypeState[key];\r\n }\r\n } else {\r\n return this.projectTypeState[key];\r\n }\r\n }\r\n\r\n loadAll() {\r\n let stateObject = {};\r\n for (const [key, value] of Object.entries(this.projectState)) {\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 saveProjectTypeValue: (projectType, key, value) =>\r\n this.saveProjectTypeValue(projectType, key, value),\r\n load: (key) => this.load(key),\r\n loadProjectTypeValue: (projectType, key) =>\r\n this.loadProjectTypeValue(projectType, 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","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 isLoadingAnnotations: false,\r\n galleryImageSize: 300,\r\n annotationsReduced: false,\r\n totalRoiCount: -1,\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 componentDidUpdate = () => {\r\n if (this.persistentStorage && this.state.project) {\r\n const structuresStateList = this.state.structures.map((structure) => {\r\n return {\r\n isUnfolded: structure.isUnfolded,\r\n showSubtypes: structure.showSubtypes,\r\n visible: structure.visible,\r\n };\r\n });\r\n this.persistentStorage.saveProjectTypeValue(\r\n this.state.project.type,\r\n \"structuresStateList\",\r\n structuresStateList\r\n );\r\n }\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 setPersistentStorage = (persistentStorage) => {\r\n this.persistentStorage = persistentStorage;\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 clear = () => {\r\n this.past = [];\r\n this.future = [];\r\n this.shownSaveHintNum = 0;\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) return;\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 * 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 const progress = parseInt(progressObject.progress);\r\n this.setState({\r\n show: true,\r\n messagePresent: true,\r\n message: progressObject.message + \": \" + progress + \"%\",\r\n progress: isNaN(progress) ? 0 : progress,\r\n indefinite: false,\r\n });\r\n clearTimeout(this.timeout);\r\n };\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 e.preventDefault()}\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 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.histoClassificationStarted = 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 setHistoClassificationStarted: (a) => {\r\n this.histoClassificationStarted = a;\r\n },\r\n getHistoClassificationStarted: () => {\r\n return this.histoClassificationStarted;\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","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\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\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 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 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 handleSelectModel = (event) => {\r\n let selectedVersion = null;\r\n if (this.state.existingAIModels.aiModels[event.target.value - 1].versions)\r\n selectedVersion =\r\n this.state.existingAIModels.aiModels[event.target.value - 1].versions.slice(-1)[0]\r\n .label;\r\n this.setState({\r\n selectedModel: event.target.value,\r\n selectedVersion: selectedVersion,\r\n });\r\n };\r\n\r\n handleSelectVersion = (event) => {\r\n this.setState({ selectedVersion: event.target.value });\r\n };\r\n\r\n 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 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 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 this.finishAddCustomAIModels\r\n );\r\n }\r\n };\r\n\r\n handleRemove = (e) => {\r\n e.preventDefault();\r\n window.openResponseDialog(\"Delete the models permanently?\", (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 // send selected exisiting model to AITrainingTool.jsx (parent)\r\n handleAddExistingModel = (e) => {\r\n let selectedModelInformation = [\r\n this.state.existingAIModels.aiModels[this.state.selectedModel - 1].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 this.handleClose(e);\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 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 {\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 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 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 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 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 { 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 {\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 from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\nimport {\r\n Grid,\r\n FormControl,\r\n TextField,\r\n FormHelperText,\r\n Slider,\r\n} from \"@mui/material\";\r\n\r\nconst styles = {\r\n sliderContainer: {\r\n margin: 0,\r\n width: \"100%\",\r\n },\r\n input: {\r\n width: 55,\r\n },\r\n};\r\n\r\nclass CustomRangeSlider extends React.Component {\r\n render() {\r\n const { params, classes } = this.props;\r\n return (\r\n \r\n {params.label}\r\n \r\n \r\n params.onChangeMin(parseInt(e.target.value, 10))}\r\n onKeyDown={(e) => {\r\n if (e.code === \"Enter\") {\r\n params.onKeyEnter();\r\n }\r\n }}\r\n inputProps={{\r\n step: params.step,\r\n min: params.min,\r\n max: params.max,\r\n type: \"number\",\r\n \"aria-labelledby\": \"input-slider\",\r\n role: \"numberInput1\",\r\n }}\r\n />\r\n \r\n \r\n {\r\n params.onSliderChange(e.target.value);\r\n }}\r\n onChangeCommitted={params.onSliderchangeComitted}\r\n />\r\n \r\n \r\n params.onChangeMax(parseInt(e.target.value, 10))}\r\n onKeyDown={(e) => {\r\n if (e.code === \"Enter\") {\r\n params.onKeyEnter();\r\n }\r\n }}\r\n inputProps={{\r\n step: params.step,\r\n min: params.min,\r\n max: params.max,\r\n type: \"number\",\r\n \"aria-labelledby\": \"input-slider\",\r\n role: \"numberInput2\",\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nCustomRangeSlider.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n params: PropTypes.object.isRequired,\r\n};\r\n\r\nexport default withStyles(styles)(CustomRangeSlider);\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 Button,\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\nimport CustomRangeSlider from \"../../../globalComponents/CustomRangeSlider\";\r\n\r\nclass FilterAnnotationsTool extends Tool {\r\n name = \"Filter Annotations\";\r\n selection = null;\r\n selectionIdx = 0;\r\n smallerIdx = -2;\r\n biggerIdx = -2;\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 randSliderKey = 0;\r\n rangeSliderParams = {\r\n key: \"0\",\r\n label: \"\",\r\n min: 0,\r\n max: 10000,\r\n valueMin: 0,\r\n valueMax: 10000,\r\n step: 1,\r\n onKeyEnter: () => this.updateRangeMode(),\r\n onSliderChange: (value) => {\r\n this.rangeSliderParams.valueMin = value[0];\r\n this.rangeSliderParams.valueMax = value[1];\r\n window.forceSidebarUpdate();\r\n },\r\n onSliderchangeComitted: () => this.updateRangeMode(),\r\n };\r\n\r\n updateRangeMode = () => {\r\n if (this.sortedTreeItems && this.sortedTreeItems.length > 0) {\r\n let smallerIdx = -2;\r\n let biggerIdx = -2;\r\n for (let i = 0; i < this.sortedTreeItems.length; i++) {\r\n const treeItem = this.sortedTreeItems[i];\r\n if (\r\n treeItem.roi.area > this.rangeSliderParams.valueMin &&\r\n smallerIdx === -2\r\n ) {\r\n smallerIdx = i - 1;\r\n }\r\n if (\r\n treeItem.roi.area > this.rangeSliderParams.valueMax &&\r\n biggerIdx === -2\r\n ) {\r\n biggerIdx = i;\r\n break;\r\n }\r\n }\r\n if (smallerIdx !== this.smallerIdx && smallerIdx >= 0) {\r\n this.smallerIdx = smallerIdx;\r\n this.selectionIdx = this.smallerIdx;\r\n this.selection = this.sortedTreeItems[this.selectionIdx];\r\n if (this.checkJumps) window.zoomToRect(this.selection.roi.bounds);\r\n window.forceSidebarUpdate();\r\n } else if (biggerIdx !== this.biggerIdx && biggerIdx >= 0) {\r\n this.biggerIdx = biggerIdx;\r\n this.selectionIdx = this.biggerIdx;\r\n this.selection = this.sortedTreeItems[this.selectionIdx];\r\n if (this.checkJumps) window.zoomToRect(this.selection.roi.bounds);\r\n window.forceSidebarUpdate();\r\n } else if (smallerIdx < 0 || biggerIdx < 0) {\r\n if (smallerIdx > 0) {\r\n this.selection = this.sortedTreeItems[smallerIdx];\r\n } else if (biggerIdx > 0) {\r\n this.selection = this.sortedTreeItems[biggerIdx];\r\n }\r\n this.smallerIdx = smallerIdx;\r\n this.biggerIdx = biggerIdx;\r\n window.forceSidebarUpdate();\r\n }\r\n }\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 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 deleteSmaller = (idx) => {\r\n let historyItem = [];\r\n let histId = this.structures[this.parentIndex].id;\r\n this.biggerIdx -= idx + 1;\r\n let idxToDelete = idx;\r\n const roiLayer = this.roiLayers[this.parentIndex];\r\n while (idxToDelete >= 0) {\r\n const treeItemToDelete = this.sortedTreeItems[idxToDelete];\r\n roiLayer.tree.remove(treeItemToDelete);\r\n this.tree.remove(treeItemToDelete);\r\n historyItem.push({ add: false, id: histId, roi: treeItemToDelete.roi });\r\n idxToDelete--;\r\n }\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 this.selection = null;\r\n this.smallerIdx = -2;\r\n window.forceSidebarUpdate();\r\n window.projectHistory.add(historyItem);\r\n };\r\n\r\n deleteBigger = (idx) => {\r\n let historyItem = [];\r\n let histId = this.structures[this.parentIndex].id;\r\n let idxToDelete = idx;\r\n const roiLayer = this.roiLayers[this.parentIndex];\r\n while (idxToDelete < this.sortedTreeItems.length) {\r\n const treeItemToDelete = this.sortedTreeItems[idxToDelete];\r\n roiLayer.tree.remove(treeItemToDelete);\r\n this.tree.remove(treeItemToDelete);\r\n historyItem.push({ add: false, id: histId, roi: treeItemToDelete.roi });\r\n idxToDelete++;\r\n }\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 this.selection = null;\r\n this.biggerIdx = -2;\r\n window.forceSidebarUpdate();\r\n window.projectHistory.add(historyItem);\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 this.smallerIdx = -2;\r\n this.biggerIdx = -2;\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 if (this.sortedTreeItems.length > 0) {\r\n const valueIsMin =\r\n this.rangeSliderParams.min === this.rangeSliderParams.valueMin;\r\n const valueIsMax =\r\n this.rangeSliderParams.max === this.rangeSliderParams.valueMax;\r\n this.rangeSliderParams.min = parseInt(\r\n this.sortedTreeItems[0].roi.area,\r\n 10\r\n );\r\n if (\r\n this.rangeSliderParams.valueMin < this.rangeSliderParams.min ||\r\n valueIsMin\r\n ) {\r\n this.rangeSliderParams.valueMin = this.rangeSliderParams.min;\r\n }\r\n this.rangeSliderParams.max =\r\n parseInt(\r\n this.sortedTreeItems[this.sortedTreeItems.length - 1].roi.area,\r\n 10\r\n ) + 1;\r\n if (\r\n this.rangeSliderParams.valueMax > this.rangeSliderParams.max ||\r\n valueIsMax\r\n ) {\r\n this.rangeSliderParams.valueMax = this.rangeSliderParams.max;\r\n }\r\n }\r\n window.forceSidebarUpdate();\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 rangeSliderParams={this.rangeSliderParams}\r\n deleteSmaller={this.deleteSmaller}\r\n deleteBigger={this.deleteBigger}\r\n />\r\n
\r\n );\r\n };\r\n}\r\n\r\nclass ConfigForm extends Component {\r\n render() {\r\n const smallerSelectionCount =\r\n this.props.selectionIdx < 0 ? 0 : this.props.selectionIdx + 1;\r\n const biggerSelectionCount =\r\n this.props.selectionIdx < 0\r\n ? 0\r\n : this.props.regionRois.length - this.props.selectionIdx;\r\n const smallerMinSliderCount =\r\n this.props.smallerIdx < 0 ? 0 : this.props.smallerIdx;\r\n const biggerMaxSliderCount =\r\n this.props.biggerIdx < 0\r\n ? 0\r\n : this.props.regionRois.length - this.props.biggerIdx - 1;\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 {this.props.selection &&\r\n this.props.smallerIdx < 0 &&\r\n this.props.biggerIdx < 0 ? (\r\n
\r\n
Selection:
\r\n
    \r\n
  • Area: {this.props.selection.roi.area.toFixed(2)} px
  • \r\n
\r\n \r\n \r\n this.props.deleteSmaller(this.props.selectionIdx)\r\n }\r\n >\r\n Delete {smallerSelectionCount}
\r\n smaller Rois\r\n \r\n this.props.deleteBigger(this.props.selectionIdx)}\r\n >\r\n {\" \"}\r\n Delete {biggerSelectionCount}
\r\n bigger Rois\r\n \r\n
\r\n
\r\n ) : (\r\n
\r\n
Range:
\r\n
    \r\n {this.props.sortedTreeItems[this.props.smallerIdx] ? (\r\n
  • \r\n First ROI smaller than minimum value:\r\n
      \r\n
    • \r\n Area:{\" \"}\r\n {this.props.sortedTreeItems[\r\n this.props.smallerIdx\r\n ].roi.area.toFixed(2)}{\" \"}\r\n px\r\n
    • \r\n
    \r\n
  • \r\n ) : (\r\n
  • No ROI is smaller than minimum value!
  • \r\n )}\r\n {this.props.sortedTreeItems[this.props.biggerIdx] ? (\r\n
  • \r\n First ROI bigger than maximum value:\r\n
      \r\n
    • \r\n Area:{\" \"}\r\n {this.props.sortedTreeItems[\r\n this.props.biggerIdx\r\n ].roi.area.toFixed(2)}{\" \"}\r\n px\r\n
    • \r\n
    \r\n
  • \r\n ) : (\r\n
  • No ROI is bigger than minimum value!
  • \r\n )}\r\n
\r\n \r\n this.props.deleteSmaller(this.props.smallerIdx)}\r\n >\r\n Delete {smallerMinSliderCount}
\r\n smaller Rois\r\n \r\n this.props.deleteBigger(this.props.biggerIdx)}\r\n >\r\n {\" \"}\r\n Delete {biggerMaxSliderCount}
\r\n bigger Rois\r\n \r\n
\r\n \r\n )}\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
\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 \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\n}\r\n\r\nConfigForm.propTypes = {\r\n randSliderKey: PropTypes.number,\r\n checkJumps: PropTypes.bool,\r\n toggleJumps: PropTypes.func,\r\n selectionIdx: PropTypes.number,\r\n smallerIdx: PropTypes.number,\r\n biggerIdx: PropTypes.number,\r\n sortedTreeItems: PropTypes.array,\r\n selection: PropTypes.object,\r\n selectRegion: PropTypes.func,\r\n regionRois: PropTypes.array,\r\n delete: PropTypes.func,\r\n rangeSliderParams: PropTypes.object,\r\n deleteSmaller: PropTypes.func,\r\n deleteBigger: PropTypes.func,\r\n};\r\n\r\nexport default FilterAnnotationsTool;\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\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, { 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 React from \"react\";\r\n\r\nimport { RegionROI } from \"../../utils/ROI\";\r\nimport { isInside } from \"../../utils/PolygonUtil\";\r\nimport RBush from \"rbush\";\r\n\r\nimport {\r\n Tooltip,\r\n IconButton,\r\n Typography,\r\n TextField,\r\n Button,\r\n FormControlLabel,\r\n Checkbox,\r\n} from \"@mui/material\";\r\n\r\nimport Tool from \"./Tool\";\r\n\r\nconst styles = {\r\n inputElement: {\r\n marginBottom: 8,\r\n },\r\n h6_small: {\r\n fontSize: \"18px\",\r\n marginTop: \"8px\",\r\n },\r\n gridButton: {\r\n marginBottom: \"20px\",\r\n },\r\n gridIconText: { fontSize: 18, fontWeight: \"bold\" },\r\n};\r\n\r\nclass GridTool extends Tool {\r\n name = \"GridTool\";\r\n tileWidth = 0;\r\n tileHeight = 0;\r\n tilesToGenerate = 10;\r\n showGridPreview = false;\r\n\r\n setLayer(obj) {\r\n this.ome = obj.ome;\r\n if (\r\n this.ome.physicalSizeX &&\r\n this.ome.physicalSizeX !== 0 &&\r\n this.ome.physicalSizeX !== 1\r\n ) {\r\n this.sizeUnit = obj.ome.physicalSizeXUnit;\r\n this.pixelSize = obj.ome.physicalSizeX * 1000000;\r\n } else {\r\n this.sizeUnit = \"px\";\r\n this.pixelSize = 1;\r\n }\r\n\r\n if (this.tileWidth === 0 || this.tileHeight === 0) {\r\n this.tileWidth = parseInt(this.ome.sizeX / 20, 10);\r\n this.tileHeight = parseInt(this.ome.sizeY / 20, 10);\r\n }\r\n\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.isHistoClassification = this.projectNoViewConfig.type.includes(\r\n \"HistoClassification\"\r\n );\r\n this.isHistoPointCounting =\r\n this.projectNoViewConfig.type.includes(\"HistoPointCounting\");\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 // draw preview grid\r\n drawCustomCursor(ctx) {\r\n if (!this.showGridPreview) return;\r\n const pixelWidth = 1 / ctx.getTransform().a;\r\n const tileWidth = this.tileWidth;\r\n const tileHeight = this.tileHeight;\r\n\r\n if (tileWidth < pixelWidth * 3 || tileHeight < pixelWidth * 3) return;\r\n ctx.beginPath();\r\n ctx.strokeStyle = \"rgba(0,0,0,0.5)\";\r\n ctx.lineWidth = pixelWidth;\r\n for (let x = 0; x < this.ome.sizeX; x += tileWidth) {\r\n ctx.moveTo(x, 0);\r\n ctx.lineTo(x, this.ome.sizeY);\r\n }\r\n for (let y = 0; y < this.ome.sizeY; y += tileHeight) {\r\n ctx.moveTo(0, y);\r\n ctx.lineTo(this.ome.sizeX, y);\r\n }\r\n ctx.stroke();\r\n }\r\n\r\n isInsideBaseROI = (regionRoi) => {\r\n let baseRois = this.roiLayers[0].tree\r\n .search(regionRoi.treeItem)\r\n .map((item) => item.roi);\r\n if (baseRois.length === 0) return false;\r\n for (const baseRoi of baseRois) {\r\n if (isInside(regionRoi, baseRoi)) return true;\r\n }\r\n return false;\r\n };\r\n\r\n // create this.tilesToGenerate random tiles on the grid with the size of this.tileWidth and this.tileHeight\r\n createRandomTiles = () => {\r\n const historyItem = [];\r\n const histId = this.structures[this.selectedLayer].id;\r\n\r\n const isSubtype =\r\n this.structures[this.selectedLayer].isSubtype &&\r\n this.structures[this.selectedLayer].classificationSubtype;\r\n const structureName = isSubtype\r\n ? this.structures[this.selectedLayer].label\r\n : \"\";\r\n const color = this.structures[this.selectedLayer].color;\r\n\r\n // Create a list of all possible tile positions\r\n let positions = [];\r\n for (let x = 0; x < this.ome.sizeX - this.tileWidth; x += this.tileWidth) {\r\n for (\r\n let y = 0;\r\n y < this.ome.sizeY - this.tileHeight;\r\n y += this.tileHeight\r\n ) {\r\n positions.push([x, y]);\r\n }\r\n }\r\n\r\n // Shuffle the positions array\r\n for (let i = positions.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [positions[i], positions[j]] = [positions[j], positions[i]];\r\n }\r\n\r\n // Clear old tiles\r\n for (let roi of this.layer.regionRois) {\r\n historyItem.push({ add: false, id: histId, roi: roi });\r\n }\r\n this.roiLayers[this.selectedLayer].layer.regionRois = [];\r\n this.roiLayers[this.selectedLayer].tree = new RBush();\r\n\r\n let foundTiles = 0;\r\n // Create new tiles\r\n for (\r\n let i = 0;\r\n foundTiles < this.tilesToGenerate && i < positions.length;\r\n i++\r\n ) {\r\n let regions = [];\r\n let c_1 = positions[i];\r\n regions.push(c_1);\r\n let c_2 = [c_1[0] + this.tileWidth, c_1[1]];\r\n regions.push(c_2);\r\n let c_3 = [c_1[0] + this.tileWidth, c_1[1] + this.tileHeight];\r\n regions.push(c_3);\r\n let c_4 = [c_1[0], c_1[1] + this.tileHeight];\r\n regions.push(c_4);\r\n let roi = new RegionROI({\r\n regions: regions,\r\n color1: color,\r\n subtype: isSubtype,\r\n name: structureName,\r\n structureId: this.structures[this.selectedLayer].id,\r\n });\r\n let isValidTile = true;\r\n if (this.selectedLayer > 0) {\r\n isValidTile = this.isInsideBaseROI(roi);\r\n }\r\n if (isValidTile) {\r\n foundTiles++;\r\n this.roiLayers[this.selectedLayer].layer.regionRois.push(roi);\r\n this.roiLayers[this.selectedLayer].tree.insert(roi.treeItem);\r\n historyItem.push({ add: true, id: histId, roi: roi });\r\n }\r\n\r\n if (i === positions.length - 1) {\r\n window.showWarningSnackbar(\r\n \"All possible \" + foundTiles + \" tiles set!\"\r\n );\r\n }\r\n }\r\n window.projectHistory.add(historyItem);\r\n };\r\n\r\n createGrid = (x, noGridForChilds, fromFileChange) => {\r\n const historyItem = [];\r\n const histId = this.structures[this.selectedLayer].id;\r\n if (typeof this.projectNoViewConfig === \"undefined\") return;\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 for (let roi of this.roiLayers[str].layer.regionRois) {\r\n historyItem.push({ add: false, id: histId, roi: roi });\r\n }\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 historyItem.push({ add: true, id: histId, roi: roi });\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 window.projectHistory.add(historyItem);\r\n if (this.showGridPreview) {\r\n this.showGridPreview = false;\r\n window.forceSidebarUpdate();\r\n }\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 {!this.isHistoClassification && !this.isHistoPointCounting &&(\r\n <>\r\n \r\n Add random grid tiles:\r\n \r\n {\r\n this.showGridPreview = e.currentTarget.checked;\r\n window.forceSidebarUpdate();\r\n }}\r\n />\r\n }\r\n label=\"Show grid preview\"\r\n />\r\n {\r\n this.tileWidth = Math.round(\r\n parseFloat(e.target.value, 10) / this.pixelSize\r\n );\r\n window.forceSidebarUpdate();\r\n }}\r\n inputProps={{\r\n step: this.pixelSize,\r\n }}\r\n fullWidth\r\n style={styles.inputElement}\r\n />\r\n {\r\n this.tileHeight = Math.round(\r\n parseFloat(e.target.value, 10) / this.pixelSize\r\n );\r\n window.forceSidebarUpdate();\r\n }}\r\n inputProps={{\r\n step: this.pixelSize,\r\n }}\r\n fullWidth\r\n style={styles.inputElement}\r\n />\r\n {\r\n this.tilesToGenerate = parseInt(e.target.value, 10);\r\n window.forceSidebarUpdate();\r\n }}\r\n style={styles.inputElement}\r\n />\r\n this.createRandomTiles()}\r\n >\r\n Set {this.tilesToGenerate} random tiles\r\n \r\n \r\n )}\r\n \r\n Create grid:\r\n \r\n\r\n {!this.isHistoClassification && !this.isHistoPointCounting && (\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.isHistoClassification && (\r\n \r\n this.createGrid(1)} size=\"large\">\r\n
(1x1)
\r\n
\r\n
\r\n )}\r\n\r\n {this.isHistoClassification && (\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.isHistoClassification && (\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.isHistoPointCounting && (\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 { 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, { useState } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport RemoveIcon from \"@mui/icons-material/Remove\";\r\nimport { makeStyles } from \"@mui/styles\";\r\n\r\n// Define your styles.\r\nconst useStyles = makeStyles({\r\n colorBox: {\r\n display: \"inline-block\",\r\n width: 26,\r\n height: 26,\r\n margin: 7,\r\n cursor: \"pointer\",\r\n },\r\n removeIcon: {\r\n transition: \"opacity .25s ease-in-out\",\r\n },\r\n});\r\n\r\nexport default function ColorBox(props) {\r\n const classes = useStyles();\r\n const { color, index, parameter, onParameterChange, selected } = props;\r\n const [hovered, setHovered] = useState(false);\r\n\r\n return (\r\n setHovered(true)}\r\n onMouseLeave={() => setHovered(false)}\r\n onClick={() => {\r\n let newColors = [...parameter];\r\n newColors.splice(index, 1);\r\n onParameterChange(newColors);\r\n }}\r\n >\r\n \r\n \r\n );\r\n}\r\n\r\nColorBox.propTypes = {\r\n color: PropTypes.string.isRequired,\r\n index: PropTypes.number.isRequired,\r\n parameter: PropTypes.array.isRequired,\r\n onParameterChange: PropTypes.func.isRequired,\r\n selected: PropTypes.bool,\r\n};\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 ColorizeIcon from \"@mui/icons-material/Colorize\";\r\nimport {\r\n generateParentList,\r\n generateChildrenList,\r\n getParentIndexLayer,\r\n} from \"../../utils/StructuresUtils\";\r\nimport { sortColors } from \"../../utils/ArrayUtils\";\r\nimport SettingsBackupRestoreIcon from \"@mui/icons-material/SettingsBackupRestore\";\r\nimport ColorBox from \"./InstantAnalysisHooks/ColorBox\";\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 overflow: \"hidden\",\r\n backgroundColor: \"rgba(0, 0, 0, .03)\",\r\n borderBottom: \"1px solid rgba(0, 0, 0, .125)\",\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 ? obj.ome.physicalSizeX * Math.pow(10, 6) : 1; //pixel x length in µm\r\n this.pixelLengthY = obj.ome ? obj.ome.physicalSizeY * Math.pow(10, 6) : 1;\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.allRoiLayers = obj.allRoiLayers;\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 this.renderer = obj.rendererDict[obj.fileId];\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 let 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 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 const parentlist = generateParentList(this.structures);\r\n for (const parent of parentlist[this.selectedLayer]) {\r\n const parentIdx = this.structures.findIndex((s) => s.id === parent.id);\r\n if (!layersToSave.includes(parentIdx)) layersToSave.push(parentIdx);\r\n }\r\n if (outerParentidx === this.selectedLayer) {\r\n outerParentidx = 0;\r\n }\r\n let stateObject = this.state;\r\n stateObject[\"parentIdx\"] = outerParentidx;\r\n\r\n if (this.state.depending_structure) {\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 if (this.state.depending_structure === -1) {\r\n layersToSave = \"all\";\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 const historyItem = [];\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 // ID for history\r\n const histId = annotationSaveStructureId;\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 historyItem.push({\r\n add: false,\r\n id: histId,\r\n roi: itemToRemove.roi,\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 historyItem.push({\r\n add: true,\r\n id: histId,\r\n roi: roi,\r\n });\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 calcPreview: ${\r\n new Date().getTime() - start\r\n } ms`\r\n );\r\n\r\n window.projectHistory.add(historyItem);\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 // Get the layer where the annotations are saved\r\n const parentlist = generateParentList(this.structures);\r\n const childrenList = generateChildrenList(this.structures);\r\n\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];\r\n for (const parent of parentlist[this.selectedLayer]) {\r\n const parentIdx = this.structures.findIndex((s) => s.id === parent.id);\r\n if (!layersToSave.includes(parentIdx)) layersToSave.push(parentIdx);\r\n }\r\n if (parentlist[this.selectedLayer].length > 1) {\r\n const directParent = parentlist[this.selectedLayer][1];\r\n const directParentIdx = this.structures.findIndex(\r\n (s) => s.id === directParent.id\r\n );\r\n for (const child of childrenList[directParentIdx]) {\r\n const childIdx = this.structures.findIndex((s) => s.id === child.id);\r\n if (!layersToSave.includes(childIdx)) layersToSave.push(childIdx);\r\n }\r\n }\r\n if (this.selectedLayer > 0 && !layersToSave.includes(this.selectedLayer)) {\r\n layersToSave.push(this.selectedLayer);\r\n }\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 if (this.state.depending_structure === -1) {\r\n layersToSave = \"all\";\r\n }\r\n layersToSave = \"all\";\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 const historyItem = [];\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); // might be nececerry to fix a bug\r\n\r\n if (fileId === this.id) {\r\n // create set of already used layerIdices\r\n let usedLayerIndices = new Set();\r\n if (selectedLayer !== 0) usedLayerIndices.add(0);\r\n\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 // if (anno.geoJSON.coordinates.length === 0) continue;\r\n\r\n if (\r\n anno.geoJSON.structureId &&\r\n anno.geoJSON.structureId.length > 0\r\n ) {\r\n this.allRoiLayers[fileId][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: anno.geoJSON.structureId[idx][0],\r\n color1: anno.geoJSON.color1[idx][0],\r\n name: anno.geoJSON.name[idx][0],\r\n subtype: anno.geoJSON.subtype[idx][0],\r\n });\r\n });\r\n } else {\r\n this.allRoiLayers[fileId][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[layerIndex].id,\r\n });\r\n });\r\n }\r\n const histId =\r\n parentlist[layerIndex][parentlist[layerIndex].length - 1].id;\r\n\r\n // check if layerIndex is already used\r\n if (!usedLayerIndices.has(layerIndex)) {\r\n for (let treeItem of this.allRoiLayers[fileId][\r\n layerIndex\r\n ].tree.all()) {\r\n if (layerIndex === 0 && selectedLayer !== 0) continue;\r\n historyItem.push({ add: false, id: histId, roi: treeItem.roi });\r\n }\r\n this.allRoiLayers[fileId][layerIndex].tree.clear();\r\n for (let roi of this.allRoiLayers[fileId][layerIndex].layer\r\n .regionRois) {\r\n this.allRoiLayers[fileId][layerIndex].tree.insert(roi.treeItem);\r\n historyItem.push({ add: true, id: histId, roi: roi });\r\n }\r\n usedLayerIndices.add(layerIndex);\r\n }\r\n }\r\n }\r\n\r\n console.debug(\r\n `IAM Frontend Execution time calcFull: ${\r\n new Date().getTime() - start\r\n } 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 window.projectHistory.add(historyItem);\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 renderer={this.renderer}\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 onUseIAM = () => {\r\n this.props.onApply(this);\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.length > 0\r\n ) {\r\n if (\r\n parameter.ui.hiddenStructures.includes(-1) || // -1 means to hide this parameter on all structures\r\n parameter.ui.hiddenStructures.includes(selectedLayer) || // hide for structure in config\r\n !(parameter.name in this.state)\r\n ) {\r\n continue;\r\n }\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 const rangeValue = this.state[parameter.name];\r\n const pixelSizeX = this.props.ome.physicalSizeX * Math.pow(10, 6); //pixel x length in µm\r\n const pixelSizeY = this.props.ome.physicalSizeY * Math.pow(10, 6);\r\n const pixelArea = pixelSizeX * pixelSizeY; //pixel area in µm\r\n const isMaxValuePositive = parameter.ui.max > 0;\r\n const sceneAreaPx = isMaxValuePositive\r\n ? parameter.ui.max\r\n : this.props.ome.sizeX * this.props.ome.sizeY;\r\n const maxValue =\r\n component_type === \"exp_range\"\r\n ? sceneAreaPx * pixelArea\r\n : parameter.ui.max;\r\n\r\n const formControlKey = `${toolConfig.name}_${parameter.name}`;\r\n if (rangeValue[1] < 0 || rangeValue[1] === null) {\r\n rangeValue[1] = maxValue;\r\n }\r\n if (\r\n typeof rangeValue[0] === \"undefined\" ||\r\n typeof rangeValue[1] === \"undefined\"\r\n )\r\n break;\r\n const rangeValueText = `${\r\n parameter.ui.label\r\n } = ${rangeValue[0].toFixed(digits)} ... ${rangeValue[1].toFixed(\r\n digits\r\n )}`;\r\n\r\n const handleTextFieldChange = (index, value) => {\r\n const newValue = value === \"\" ? 0 : Number(value);\r\n const newRangeValue = [...rangeValue];\r\n newRangeValue[index] = newValue;\r\n this.onParameterChange(parameter.name, newRangeValue);\r\n };\r\n\r\n const handleSliderChange = (e, v) => {\r\n let newValue;\r\n if (component_type === \"exp_range\") {\r\n newValue = [v[0] ** 2, v[1] ** 2];\r\n } else {\r\n const step = parameter.ui.step ? parameter.ui.step : 1;\r\n newValue = [v[0] * step, v[1] * step];\r\n }\r\n this.onParameterChange(parameter.name, newValue);\r\n };\r\n formControl = (\r\n \r\n {rangeValueText}\r\n \r\n \r\n handleTextFieldChange(0, e.target.value)}\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: maxValue,\r\n type: \"number\",\r\n \"aria-labelledby\": \"input-slider\",\r\n }}\r\n />\r\n \r\n \r\n {\r\n this.onParameterChange(\"formControlInUse\", false);\r\n onApply(this);\r\n }}\r\n />\r\n \r\n \r\n handleTextFieldChange(1, e.target.value)}\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: maxValue,\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 }\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 case \"color_picker\": {\r\n const sortedColors = sortColors(this.state[parameter.name]);\r\n formControl = (\r\n \r\n
{parameter.ui.label}
\r\n
\r\n {\r\n this.props.renderer.setMountedState({\r\n colorPickerActive:\r\n !this.props.renderer.state.colorPickerActive,\r\n });\r\n window.forceSidebarUpdate();\r\n }}\r\n style={{\r\n color: this.props.renderer.state.colorPickerActive\r\n ? \"#0673C1\"\r\n : \"rgba(0, 0, 0, 0.54)\",\r\n }}\r\n >\r\n \r\n \r\n {sortedColors.map((color, index) => (\r\n \r\n this.onParameterChange(parameter.name, newColors)\r\n }\r\n />\r\n ))}\r\n
\r\n \r\n );\r\n break;\r\n }\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 \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 renderer: PropTypes.object,\r\n};\r\n\r\nconst ConfigForm = withSpinloader(ConfigFormRaw);\r\n\r\nexport default InstantAnalysisTool;\r\n","//array functions\r\n\r\nimport convert from \"color-convert\";\r\n\r\n//returns the nth largest value from array\r\nexport function nthlargest(arra, highest) {\r\n let x = 0;\r\n let y = 0;\r\n let z = 0;\r\n let temp = 0;\r\n const tnum = arra.length;\r\n let flag = false;\r\n let result = false;\r\n\r\n while (x < tnum) {\r\n y = x + 1;\r\n\r\n if (y < tnum) {\r\n for (z = y; z < tnum; z++) {\r\n if (arra[x] < arra[z]) {\r\n temp = arra[z];\r\n arra[z] = arra[x];\r\n arra[x] = temp;\r\n flag = true;\r\n } else {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n if (flag) {\r\n flag = false;\r\n } else {\r\n x++;\r\n if (x === highest) {\r\n result = true;\r\n }\r\n }\r\n if (result) {\r\n break;\r\n }\r\n }\r\n\r\n return arra[highest - 1];\r\n}\r\n\r\n/**\r\n *\r\n * @param {Array} colors\r\n * @returns {Array}\r\n */\r\nexport function sortColors(colors) {\r\n return colors.sort((a, b) => {\r\n const colorA = convert.hex.lab.raw(a);\r\n const colorB = convert.hex.lab.raw(b);\r\n\r\n // When lab[0] values are identical, start comparing lab[1] values\r\n return colorA[0] - colorB[0] || colorA[1] - colorB[1];\r\n });\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 { 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 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 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 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 if (linePoly === undefined) return;\r\n this.flag = false;\r\n this.drawLayer.regionRois = []; //only one region will be drawn to the draw layer\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","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 {\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\" &&\r\n this.hoveredRoi !== null &&\r\n this.hoveredRoi.structureId ===\r\n this.structures[this.selectedLayer].id))\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 (\r\n this.mouseDownPosition &&\r\n this.mouseDownRoi &&\r\n (this.mouseDownRoi.structureId ==\r\n this.structures[this.selectedLayer].id ||\r\n this.drawMode === \"edit\")\r\n ) {\r\n let deltaP = {\r\n x: this.mouseDownPosition.x - p.x,\r\n y: this.mouseDownPosition.y - p.y,\r\n };\r\n let regions = [];\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 // do not highlight if not in selected structure in draw mode\r\n // do not highlight if not object annotation\r\n // highlight all object annotations if in edit mode\r\n if (\r\n roi &&\r\n roi.isObject &&\r\n (this.drawMode === \"edit\" ||\r\n roi.structureId == this.structures[this.selectedLayer].id)\r\n ) {\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 // do not highlight resize corner if not in selected structure in draw mode\r\n // do not highlight resize corner if not object annotation\r\n // highlight resize corner for all object annotations if in edit mode\r\n if (\r\n roi &&\r\n roi.isObject &&\r\n (this.drawMode === \"edit\" ||\r\n roi.structureId == this.structures[this.selectedLayer].id)\r\n ) {\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.drawMode === \"draw\" &&\r\n this.hoveredRoi &&\r\n this.hoveredRoi.structureId !==\r\n this.structures[this.selectedLayer].id) ||\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 {\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 {\r\n updateDrawLayer,\r\n updateLayer,\r\n findSiblingRoiLayers,\r\n findSameLayer,\r\n} from \"../../utils/PolygonUtil\";\r\nimport OverlapConfigForm from \"./ConfigForms/OverlapConfigForm\";\r\n\r\nimport {\r\n Typography,\r\n FormControl,\r\n FormLabel,\r\n Slider,\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 threshold = 30;\r\n buffer = 0;\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.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 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.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 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\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 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 this.buffer\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.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 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 (this.removeOverlap = e)}\r\n onChangeRemoveOverlapSame={(e) => (this.removeOverlapSame = e)}\r\n />\r\n \r\n {\"Buffer: \" + this.buffer + \" px\"}\r\n \r\n {\r\n this.buffer = 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 Apply [Enter]\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default RegionGrowingTool;\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","// 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 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 { 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 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","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, { 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\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 FilterAlt,\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 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 FILTERANNOTATIONS_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 annotationsAreReduced,\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(\"FilterAnnotationsTool\") &&\r\n !show3DViewer &&\r\n !showGallery &&\r\n !showTilesGallery && (\r\n \r\n \r\n onChangeTool(\r\n activeTool === Tools.FILTERANNOTATIONS_ROI\r\n ? Tools.NONE\r\n : Tools.FILTERANNOTATIONS_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 \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 \r\n {this.checkToolInConfig(\"DrawPixelAnnotationTool\") &&\r\n !filesGalleryActive &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \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\r\n {this.checkToolInConfig(\"DrawMagicWandAnnotationTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \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\r\n {this.checkToolInConfig(\"DrawRectangleAnnotationTool\") &&\r\n !filesGalleryActive &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \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\r\n {this.checkToolInConfig(\"DrawEllipseAnnotationTool\") &&\r\n !filesGalleryActive &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \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\r\n {this.checkToolInConfig(\"DrawRegionAnnotationTool\") &&\r\n !filesGalleryActive &&\r\n !show3DViewer &&\r\n !showTilesGallery && (\r\n \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\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 \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\r\n {this.checkToolInConfig(\"DrawGrabCutAnnotationTool\") &&\r\n !show3DViewer &&\r\n !showTilesGallery &&\r\n !filesGalleryActive && (\r\n \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\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 \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\r\n {this.checkToolInConfig(\"SelectRegionAnnotationTool\") &&\r\n !show3DViewer && (\r\n \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\r\n {this.checkToolInConfig(\"CopyRegionAnnotationTool\") &&\r\n !show3DViewer && (\r\n \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\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.getHistoClassificationStarted() &&\r\n !this.props.resultTab.getGridExists() &&\r\n !show3DViewer && (\r\n \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\r\n {this.checkToolInConfig(\"GridAnnotationTool\") &&\r\n !show3DViewer && (\r\n \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\r\n {structures &&\r\n structures[selectedLayer] &&\r\n structures[selectedLayer].tools.map((tool) => {\r\n const invalidToolNames = [\r\n \"alm_gallery_tool\",\r\n \"iam_ai_inference\",\r\n ];\r\n return (\r\n tool.name &&\r\n tools[tool.name] &&\r\n !invalidToolNames.includes(tool.name) &&\r\n this.checkToolInConfig(\"OtherTools\") &&\r\n !show3DViewer && (\r\n \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 );\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 annotationsAreReduced: PropTypes.bool,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withTiles(withResultTab(withStyles(styles)(VerticalToolBar)))\r\n);\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\nconst rgbToHex = (r, g, b) => {\r\n if (r > 255 || g > 255 || b > 255) throw \"Invalid color component\";\r\n return \"#\" + ((r << 16) | (g << 8) | b).toString(16);\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 colorPickerActive: 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 } else if (\r\n this.props.activeTool === \"iam_region_growing\" &&\r\n this.state.colorPickerActive &&\r\n event.button !== 1\r\n ) {\r\n const x = event.clientX - this.canvas.getBoundingClientRect().left;\r\n const y = event.clientY - this.canvas.getBoundingClientRect().top;\r\n //draw image to get pixelcolor w/o annotations\r\n this.drawVisibleImage();\r\n const pickedColor = this.ctx.getImageData(x, y, 1, 1).data;\r\n const hexColor = rgbToHex(\r\n pickedColor[0],\r\n pickedColor[1],\r\n pickedColor[2]\r\n );\r\n const colors_foreground =\r\n this.props.tools[this.props.activeTool].configFormRef.state\r\n .colors_foreground;\r\n const colors_background =\r\n this.props.tools[this.props.activeTool].configFormRef.state\r\n .colors_background;\r\n const colorListName =\r\n event.button === 0 ? \"colors_foreground\" : \"colors_background\";\r\n const colors =\r\n this.props.tools[this.props.activeTool].configFormRef.state[\r\n colorListName\r\n ];\r\n\r\n if (\r\n !colors_foreground.includes(hexColor) &&\r\n !colors_background.includes(hexColor)\r\n ) {\r\n colors.push(hexColor);\r\n this.props.tools[\r\n this.props.activeTool\r\n ].configFormRef.onParameterChange(colorListName, colors);\r\n this.props.tools[\r\n this.props.activeTool\r\n ].configFormRef.onParameterChange(\"lastColor\", hexColor);\r\n this.props.tools[this.props.activeTool].configFormRef.onUseIAM();\r\n } else {\r\n window.showWarningSnackbar(\"Color already in use\");\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 changeCursorStyle = (p1) => {\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 };\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.props.activeTool === \"iam_region_growing\") {\r\n if (this.state.colorPickerType) {\r\n this.changeCursorStyle(p1);\r\n } else {\r\n this.canvas.style.cursor = \"default\";\r\n }\r\n }\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 this.changeCursorStyle(p1);\r\n this.toolMouseForward(event);\r\n } else if (this.props.activeTool === Tools.RECT_ROI) {\r\n this.changeCursorStyle(p1);\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 {number} a Horizontal scaling. A value of 1 results in no scaling.\r\n * @param {number} b Vertical skewing.\r\n * @param {number} c Horizontal skewing.\r\n * @param {number} d Vertical scaling. A value of 1 results in no scaling.\r\n * @param {number} e Horizontal translation (moving).\r\n * @param {number} 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 /**\r\n * Zoom the canvas to the specified recangle.\r\n * @param {object} rect The rectangle to zoom to. Contains left, right, top, bottom as pixel values.\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 const parentLayerTree = this.props.roiLayers[parentIndex].tree;\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 const overlappingParentRois = parentLayerTree.search(\r\n element.treeItem\r\n );\r\n overlappingParentRois.forEach((parentTreeItem) => {\r\n const parentRoi = parentTreeItem.roi;\r\n if (\r\n Math.abs(parentRoi.bounds.left - element.bounds.left) <= 5 &&\r\n Math.abs(parentRoi.bounds.top - element.bounds.top) <= 5 &&\r\n Math.abs(parentRoi.bounds.right - element.bounds.right) <= 5 &&\r\n Math.abs(parentRoi.bounds.bottom - element.bounds.bottom) <= 5\r\n ) {\r\n doubleObject = true;\r\n doubleObjectIndex = parentLayerRois.indexOf(parentRoi);\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 window.forceSidebarUpdate(); // update Sidebar, so annotations count\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 this.props.updateVisibleROIDebounced(p1, p2);\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 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 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 textToShow = textToShow + 1;\r\n\r\n this.ctx.fillText(textToShow.toBase(62), center.x, center.y);\r\n }\r\n }\r\n this.ctx.closePath();\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 this.props.projectContext.isLoadingAnnotations) && (\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 updateVisibleROIDebounced: PropTypes.func,\r\n projectContext: PropTypes.object,\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 {\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 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, { 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 { structures, selectedLayer } = projectContext;\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 historyItem = [];\r\n const histId = structures[selectedLayer].id;\r\n let drawRegions = JSON.parse(e.target.result);\r\n let nonOverlapping = [];\r\n const tree = roiLayers[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 historyItem.push({ add: true, id: histId, roi: r });\r\n roiLayers[selectedLayer].layer.regionRois.push(r);\r\n tree.insert(r.treeItem);\r\n });\r\n window.projectHistory.add(historyItem);\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 this.props.onSelectLayer(index, () => {\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 {\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 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 Typography,\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 (selectedLevel === -1) selectedLevel = maxLevel;\r\n this.props.updateFormDataAdvSettings(\"level\", selectedLevel);\r\n\r\n if (lastVersion && typeof lastVersion.image_size !== \"undefined\") {\r\n this.props.updateFormDataAdvSettings(\r\n \"tileSize\",\r\n lastVersion.image_size\r\n );\r\n this.props.updateFormDataAdvSettings(\r\n \"overlap\",\r\n parseInt(lastVersion.image_size / 16)\r\n );\r\n }\r\n\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 this.updateModelInFormData(\r\n selectedEncoderArchitecture,\r\n selectedDecoder\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 if (lastVersion.dataset_approach) {\r\n this.props.updateFormDataAdvSettings(\r\n \"datasetApproach\",\r\n lastVersion.dataset_approach\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\r\n this.state = {\r\n settingsType: \"dafault\",\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 allSettingsEnabled: false,\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, selectedModel } = this.props;\r\n\r\n // use saved settings of model if continue training\r\n if (selectedModel.name !== \"newModel\") {\r\n return;\r\n }\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.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 allStructuresEnabled,\r\n } = this.state;\r\n const { formData, histogramConfig } = this.props;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n Model architecture:\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 settings\r\n }\r\n />\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.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 {formData[\"modelType\"] === \"segmentation\" && (\r\n \r\n this.props.updateFormDataAdvSettings(\r\n \"includeBackgroundTiles\",\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 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","// Copyright HS Analysis GmbH, 2021\r\n// Author: Viktor Eberhardt, Timo Koch\r\n\r\n// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// Material UI imports\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport GetApp from \"@mui/icons-material/GetApp\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport MuiAccordion from \"@mui/material/Accordion\";\r\nimport MuiAccordionDetails from \"@mui/material/AccordionDetails\";\r\nimport MuiAccordionSummary from \"@mui/material/AccordionSummary\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\"; \r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\n// HSA imports\r\nimport Backend from \"../../../common/utils/Backend\";\r\nimport { withAllViewerContexts } from \"../../contexts/AllViewerContexts\";\r\nimport { withPersistentStorage } from \"../../contexts/PersistentStorageContext\";\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 this.updatePersistentDefaultModels(usableModels);\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 if (\r\n selectedModel.versions.length === 0 ||\r\n selectedModel.versions[0].sourcepath.includes(\".h5\")\r\n ) {\r\n this.props.onChangeTool(\"none\");\r\n return;\r\n }\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 updatePersistentDefaultModels = (usableModels) => {\r\n let currentDefaultModels = [];\r\n for (let model of Object.values(usableModels)) {\r\n if (model.isChecked) {\r\n currentDefaultModels.push(model.name);\r\n }\r\n }\r\n this.props.persistentStorage.saveProjectTypeValue(\r\n this.props.projectContext.project.type,\r\n \"defaultModels\",\r\n currentDefaultModels\r\n );\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 persistentStorage: PropTypes.object,\r\n};\r\n\r\nexport default withAllViewerContexts(\r\n withPersistentStorage(withStyles(styles)(SideBarTabAISelectByModel))\r\n);\r\n","// Copyright HS Analysis GmbH, 2019\r\n// Author: Viktor Eberhardt, Timo Koch\r\n\r\n// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// Material UI imports\r\nimport ArrowDropDown from \"@mui/icons-material/ArrowDropDown\";\r\nimport ArrowDropUp from \"@mui/icons-material/ArrowDropUp\";\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\nimport CloudDownload from \"@mui/icons-material/CloudDownload\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport MuiAccordion from \"@mui/material/Accordion\";\r\nimport MuiAccordionDetails from \"@mui/material/AccordionDetails\";\r\nimport MuiAccordionSummary from \"@mui/material/AccordionSummary\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport PlayArrow from \"@mui/icons-material/PlayArrow\";\r\nimport PublishIcon from \"@mui/icons-material/Publish\";\r\nimport Refresh from \"@mui/icons-material/Refresh\";\r\nimport Remove from \"@mui/icons-material/Remove\";\r\nimport Select from \"@mui/material/Select\";\r\nimport Tab from \"@mui/material/Tab\";\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 Tabs from \"@mui/material/Tabs\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\n// HSA imports\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 // Hyper => Keras model with .h5 file\r\n // Efficient => pytorch lightning model with .pth file\r\n if (model.name.includes(\"Hyper\") || model.name.includes(\"Efficient\")) {\r\n if (\r\n model.versions[0].sourcepath.includes(\".h5\") ||\r\n model.versions[0].sourcepath.includes(\".pth\")\r\n ) {\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 }\r\n }\r\n if (model.versions.length > 0 && model.versions[0].structure_indices) {\r\n for (let idx of model.versions[0].structure_indices) {\r\n if (structures.length > idx) {\r\n if (\r\n structures[idx].label === fullStructure.label &&\r\n structures[idx].id === fullStructure.id\r\n ) {\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 { withAllViewerContexts } from \"../contexts/AllViewerContexts\";\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 excludeAllContainer: {\r\n position: \"absolute\",\r\n top: 0,\r\n right: 0,\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 currentSceneFilterIdx: 0,\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 { currentSceneFilterIdx } = this.state;\r\n const {\r\n classes,\r\n project,\r\n onSelectFile,\r\n fileId,\r\n onExcludeFilesToggle,\r\n splitscreenFileIds,\r\n projectContext,\r\n } = this.props;\r\n const { fileGroups } = projectContext;\r\n\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 let maxSceneIdx = 0;\r\n for (let file of project.files) {\r\n if (file.scene > maxSceneIdx) {\r\n maxSceneIdx = file.scene;\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 {maxSceneIdx > 0 && (\r\n \r\n {\r\n const projectsToExclude = project.files.filter((file) => {\r\n return (\r\n file.scene === currentSceneFilterIdx &&\r\n file.excludeScene !== true\r\n );\r\n });\r\n const projectsToInclude = project.files.filter((file) => {\r\n return (\r\n file.scene !== currentSceneFilterIdx &&\r\n file.excludeScene === true\r\n );\r\n });\r\n onExcludeFilesToggle(projectsToExclude, true);\r\n onExcludeFilesToggle(projectsToInclude, false);\r\n if (maxSceneIdx > currentSceneFilterIdx) {\r\n this.setState({\r\n currentSceneFilterIdx: currentSceneFilterIdx + 1,\r\n });\r\n } else {\r\n this.setState({ currentSceneFilterIdx: 0 });\r\n }\r\n }}\r\n >\r\n \r\n {currentSceneFilterIdx + 1}\r\n
\r\n \r\n \r\n )}\r\n\r\n \r\n {\r\n const toExclude = this.hasNotExcludedScenes(project.files);\r\n console.log(\"project.files:\", 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\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 projectContext: PropTypes.object,\r\n};\r\n\r\nexport default withAllViewerContexts(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 {\r\n classes,\r\n fileId,\r\n histogramConfig,\r\n ome,\r\n onChangeChannels,\r\n onSelectFile,\r\n onExcludeFilesToggle,\r\n project,\r\n projectContext,\r\n sideBarWidth,\r\n splitscreenFileIds,\r\n tiles,\r\n visible,\r\n } = this.props;\r\n\r\n if (!visible) return null;\r\n\r\n return (\r\n \r\n {histogramConfig[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 {!tiles.getHistoClassificationStarted() && (\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 this.store = this.props.persistentStorage;\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 const selSample = this.store.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.getHistoClassificationStarted()) {\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 const 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.store.save(\"selLayerSample\", idxNewSelectedStructure);\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 const dropdownDisabled = this.props.tiles.getHistoClassificationStarted();\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 this.store = this.props.persistentStorage;\r\n this.canCallClassifyTileWithKey = true;\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.store.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 const { resultTab } = this.props;\r\n // get all parent structures\r\n const parentStructures = this.props.structures.filter(\r\n (element) => element.subtypeLevel === 0\r\n );\r\n\r\n const 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 resultTab.setSelectedChildIndex(1);\r\n 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.store.save(\"selLayerSample\", idxNewSelectedStructure);\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 const 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 blockClassifyTile = (structure) => {\r\n const { roiLayers, selectedLayer, resultTab, tiles, onChangeTool } =\r\n this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n\r\n // if file is changing no classification is possible for a few seconds\r\n if (resultTab.getFileChange()) return true;\r\n\r\n // if not started no classification is possible\r\n if (!tiles.getHistoClassificationStarted()) {\r\n window.showWarningSnackbar(\"Please click 'RUN' to classify.\");\r\n return true;\r\n }\r\n\r\n // if no grid no classification is possible\r\n if (roiLayers[selectedLayer].layer.regionRois.length === 0) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n onChangeTool(\"gridtool\");\r\n return true;\r\n }\r\n\r\n // do not classify empty structure if 100 already reached\r\n if (\r\n 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 true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n classifyTile = (structure) => {\r\n if (this.blockClassifyTile(structure)) return;\r\n\r\n const { roiLayers, selectedLayer, resultTab } = this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\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 && this.canCallClassifyTileWithKey) {\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 this.canCallClassifyTileWithKey = false;\r\n setTimeout(() => {\r\n this.canCallClassifyTileWithKey = true;\r\n }, 100); // re-enable the call after 0.1 seconds\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, resultTab } = 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 const 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 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 const dropdownDisabled = this.props.tiles.getHistoClassificationStarted();\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","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 const { project } = this.props;\r\n\r\n this.store = this.props.persistentStorage;\r\n this.gridtool = \"gridtool\";\r\n this.selectiontile = \"selectiontile\";\r\n this.pointcountingtile = \"pointcountingtile\";\r\n this.isHistoClass = project.type.includes(\"HistoClassification\");\r\n this.isHistoPntC = project.type.includes(\"HistoPointCounting\");\r\n this.tile = this.isHistoClass ? this.selectiontile : this.pointcountingtile;\r\n\r\n this.sortSlides();\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.getHistoClassificationStarted()) {\r\n this.props.onChangeTool(this.gridtool);\r\n }\r\n if (this.isHistoClass) {\r\n this.props.resultTab.setHundredTiles(false);\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 const { project, resultTab, structures } = this.props;\r\n // set selected sample according to file name (hint in filename about sample)\r\n if (project && project.name && !resultTab.getSelSampleSet()) {\r\n const res = project.name.split(\"-\");\r\n const 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 const idxNewSelectedStructure = structures.findIndex(\r\n (element) => element.label === sampleLabel\r\n );\r\n\r\n if (idxNewSelectedStructure >= 0) {\r\n this.props.onSelectLayer(idxNewSelectedStructure);\r\n const selId = structures[idxNewSelectedStructure].id;\r\n\r\n // get all parent structures\r\n const parentStructures = structures.filter(\r\n (element) => element.subtypeLevel === 0\r\n );\r\n\r\n // get Index of sample in parent structures\r\n const parentIdxSelStructure = parentStructures.findIndex(\r\n (element) => element.id === selId\r\n );\r\n resultTab.setSelectedStructure(parentIdxSelStructure);\r\n this.store.save(\"selLayerSample\", idxNewSelectedStructure);\r\n }\r\n resultTab.setSelSampleSet(true);\r\n }\r\n };\r\n\r\n getGridExists = () => {\r\n const { roiLayers, resultTab } = 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 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 resultTab,\r\n } = this.props;\r\n const numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n const gridSize = Math.sqrt(numberTiles);\r\n\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 resultTab.setSelectedRoi(0);\r\n resultTab.setSelectedChildIndex(1);\r\n resultTab.setResetPressed(true);\r\n resultTab.setHundredTiles(false);\r\n\r\n if (this.isHistoClass) {\r\n // set started to false\r\n this.props.tiles.setHistoClassificationStarted(false);\r\n }\r\n\r\n // save selectedRoi in local storage\r\n this.store.save(\"selectedRoi\", resultTab.getSelectedRoi());\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 (!(this.isHistoClass || this.isHistoPntC)) {\r\n onChangeTool(\"none\");\r\n }\r\n } else {\r\n // make new grid\r\n // if no grid finish here\r\n if (numberTiles === 0) {\r\n return;\r\n }\r\n\r\n const roiItem = this.setRoiItem(roiLayers, selectedLayer, 0);\r\n\r\n // make new grid\r\n if (this.isHistoClass) {\r\n tools[this.gridtool].createGrid(gridSize);\r\n } else if (this.isHistoPntC) {\r\n tools[this.gridtool].createGrid(gridSize, true);\r\n }\r\n onChangeTool(this.tile);\r\n tools[this.tile].setNextTile(roiItem);\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 sortSlides = () => {\r\n this.props.project.files.sort((a, b) => {\r\n if (a.fileName < b.fileName) return -1;\r\n if (a.fileName > b.fileName) return 1;\r\n return 0;\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 resultTab,\r\n tiles,\r\n } = this.props;\r\n const savedRoi = this.store.load(\"selectedRoi\");\r\n const numberRegionRois = roiLayers[selectedLayer].layer.regionRois.length;\r\n const gridSize = Math.sqrt(numberRegionRois);\r\n\r\n // if no grid\r\n if (numberRegionRois === 0 && this.isHistoClass) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n this.props.onChangeTool(this.gridtool);\r\n return;\r\n }\r\n\r\n // reset\r\n if (tiles.getHistoClassificationStarted()) {\r\n // initialize gridtool if not initialized yet\r\n onChangeTool(this.gridtool);\r\n setTimeout(() => this.resetStructures(), 100);\r\n // set started to false\r\n tiles.setHistoClassificationStarted(false);\r\n\r\n if (fileId !== project.files[0].id && this.isHistoClass) {\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 if (this.isHistoClass) {\r\n window.setZoomLevelForGridSize(gridSize);\r\n\r\n // get selectedRoi from previous use\r\n if (savedRoi !== undefined) {\r\n resultTab.setSelectedRoi(savedRoi);\r\n } else {\r\n resultTab.setSelectedRoi(0);\r\n }\r\n\r\n // make tilesClassificationTool active\r\n const roiItem = this.setRoiItem(roiLayers, selectedLayer, 0);\r\n tools[this.selectiontile].setNextTile(roiItem);\r\n onChangeTool(this.selectiontile);\r\n // On Start set Labels to 0\r\n this.checkIfSkipped();\r\n this.setClassToZero();\r\n } else if (this.isHistoPntC) {\r\n onChangeTool(this.gridtool);\r\n // make small delay to initialize grid tool\r\n setTimeout(() => this.startHistoPointCounting(), 100);\r\n }\r\n\r\n tiles.setHistoClassificationStarted(true);\r\n resultTab.setResetPressed(false);\r\n window.setGridSize(gridSize);\r\n };\r\n\r\n startHistoPointCounting = () => {\r\n const { tools, onChangeTool, roiLayers, selectedLayer, resultTab } =\r\n this.props;\r\n const numberRegionRois = roiLayers[selectedLayer].layer.regionRois.length;\r\n const savedRoi = this.store.load(\"selectedRoi\");\r\n\r\n // only create grid if not exists\r\n if (numberRegionRois === 0) {\r\n tools[this.gridtool].createGrid(20, true);\r\n }\r\n\r\n window.setZoomLevelForGridSize(20);\r\n\r\n // get selectedRoi from previous use\r\n if (savedRoi !== undefined) {\r\n resultTab.setSelectedRoi(savedRoi);\r\n } else {\r\n resultTab.setSelectedRoi(0);\r\n }\r\n\r\n // make tilesClassificationTool active\r\n onChangeTool(this.pointcountingtile);\r\n const roiItem = this.setRoiItem(roiLayers, selectedLayer, 0);\r\n tools[this.pointcountingtile].setNextTile(roiItem);\r\n\r\n // check if 100 tiles already classified\r\n const totalCount = this.getTotalCount();\r\n resultTab.setHundredTiles(totalCount >= 100);\r\n };\r\n\r\n onPause = () => {\r\n const belongsToFinishedTab = this.store.load(\"belongsToFinishedTab\");\r\n\r\n if (belongsToFinishedTab === undefined) {\r\n this.props.onSave();\r\n } else {\r\n this.saveToJSON();\r\n }\r\n };\r\n\r\n setRoiItem = (roiLayers, selectedLayer, selectedRoi) => {\r\n return {\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\r\n blockPrevious = () => {\r\n const { roiLayers, selectedLayer, onChangeTool } = this.props;\r\n const numberRegionRois = roiLayers[selectedLayer].layer.regionRois.length;\r\n\r\n // if no grid\r\n if (numberRegionRois === 0) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n onChangeTool(this.gridtool);\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n onPrevious = () => {\r\n if (this.blockPrevious()) return;\r\n\r\n const { tools, roiLayers, selectedLayer, onChangeTool, resultTab } =\r\n this.props;\r\n\r\n // Do not proceed if file is changing if maximum number of tiles is reached\r\n if (resultTab.getHundredTiles()) return;\r\n\r\n if (this.isHistoClass) {\r\n this.previousHistoClassification();\r\n } else if (this.isHistoPntC) {\r\n this.previousHistoPointCounting();\r\n }\r\n onChangeTool(this.tile);\r\n\r\n const newSelectedRoi = resultTab.getSelectedRoi();\r\n const roiItem = this.setRoiItem(roiLayers, selectedLayer, newSelectedRoi);\r\n tools[this.tile].setNextTile(roiItem);\r\n this.store.save(\"selectedRoi\", newSelectedRoi);\r\n };\r\n\r\n previousHistoClassification = () => {\r\n const { roiLayers, selectedLayer } = this.props;\r\n const selectedRoi = this.props.resultTab.getSelectedRoi();\r\n\r\n this.checkIfSkipped();\r\n // if first tile of scene go to previous file last tile\r\n if (selectedRoi === 0) {\r\n // change file\r\n let prevFileId = this.getPrevFileId();\r\n if (!prevFileId) return;\r\n\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 this.props.resultTab.setSelectedRoi(selectedRoi - 1);\r\n this.props.resultTab.setSelectedChildIndex(1);\r\n this.setClassToZero();\r\n }\r\n };\r\n\r\n previousHistoPointCounting = () => {\r\n const { resultTab, onSelectFile } = this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n const lastTileIndices = this.store.load(\"tileIndices\");\r\n let nextRoi;\r\n\r\n // if first tile of scene do nothing\r\n if (selectedRoi === 0) {\r\n const prevFileId = this.getPrevFileId();\r\n if (prevFileId) {\r\n const roiFile = lastTileIndices ? lastTileIndices[prevFileId] : 0;\r\n // get tile index from previous file\r\n resultTab.setSelectedRoi(roiFile);\r\n resultTab.setSelectedChildIndex(1);\r\n resultTab.setZoomLevelFixed(false);\r\n resultTab.setHundredTiles(false);\r\n window.showWarningSnackbar(\"Please wait, loading previous file ...\");\r\n 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 (resultTab.getSelectedRoi() === 21) {\r\n // set last red tile from specification\r\n resultTab.setSelectedRoi(378);\r\n return;\r\n }\r\n\r\n // check if last tile in row --> then skip next row\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 resultTab.setSelectedRoi(nextRoi);\r\n }\r\n };\r\n\r\n blockNext = () => {\r\n const { roiLayers, selectedLayer, onChangeTool, resultTab } = this.props;\r\n const numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n\r\n // if file is changing no classification is possible for a few seconds\r\n if (resultTab.getFileChange()) return true;\r\n\r\n // if no grid is initialized yet no classification is possible\r\n if (numberTiles === 0) {\r\n window.showWarningSnackbar(\"Please create a grid before annotating\");\r\n onChangeTool(this.gridtool);\r\n return true;\r\n }\r\n\r\n // if last tile in last file stop\r\n if (this.nextButtonDisabled() && !resultTab.getFileChange()) {\r\n window.showWarningSnackbar(\"Finished!\");\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n onNext = () => {\r\n if (this.blockNext()) return;\r\n\r\n const { tools, roiLayers, selectedLayer, onChangeTool, resultTab } =\r\n this.props;\r\n\r\n // Do not proceed if file is changing if maximum number of tiles is reached\r\n if (resultTab.getHundredTiles()) return;\r\n\r\n // set new selectedRoi\r\n if (this.isHistoClass) {\r\n this.nextHistoClassification();\r\n } else if (this.isHistoPntC) {\r\n this.nextHistoPointCounting();\r\n }\r\n onChangeTool(this.tile);\r\n\r\n const newSelectedRoi = resultTab.getSelectedRoi();\r\n const roiItem = this.setRoiItem(roiLayers, selectedLayer, newSelectedRoi);\r\n tools[this.tile].setNextTile(roiItem);\r\n this.store.save(\"selectedRoi\", newSelectedRoi);\r\n };\r\n\r\n nextHistoClassification = () => {\r\n const { roiLayers, selectedLayer, onSelectFile } = this.props;\r\n const selectedRoi = this.props.resultTab.getSelectedRoi();\r\n\r\n this.checkIfSkipped();\r\n\r\n const numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n if (selectedRoi === numberTiles - 1) {\r\n // change file\r\n const nextFileId = this.getNextFileId();\r\n if (!nextFileId) return;\r\n\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 this.props.resultTab.setSelectedRoi(selectedRoi + 1);\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, resultTab } = this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n const 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, resultTab } = this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n const 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 // 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 let roi_min = 99999;\r\n let roi_max = -1;\r\n\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, resultTab } =\r\n this.props;\r\n const numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n const totalCount = this.getTotalCount();\r\n let lastTileIndices = this.store.load(\"tileIndices\");\r\n let indicesObject = {};\r\n resultTab.setHundredTiles(totalCount >= 100);\r\n\r\n if (\r\n (resultTab.getHundredTiles() && this.isLastClassifiedTile()) ||\r\n selectedRoi === numberTiles - 1\r\n ) {\r\n const nextFileId = this.getNextFileId();\r\n if (nextFileId) {\r\n if (lastTileIndices === undefined) {\r\n indicesObject[fileId] = selectedRoi;\r\n this.store.save(\"tileIndices\", indicesObject);\r\n } else {\r\n lastTileIndices[fileId] = selectedRoi;\r\n this.store.save(\"tileIndices\", lastTileIndices);\r\n }\r\n\r\n window.showWarningSnackbar(\"Please wait, loading next file ...\");\r\n onSelectFile(nextFileId);\r\n resultTab.setFileChange(true);\r\n resultTab.setZoomLevelFixed(false);\r\n resultTab.setSelectedRoi(0);\r\n 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;\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 if (nextRoi >= numberTiles) {\r\n // roi does not exist --> start with \"blue\" tiles from specifications\r\n nextRoi = 21;\r\n }\r\n\r\n resultTab.setSelectedRoi(nextRoi);\r\n };\r\n\r\n isLastClassifiedTile = () => {\r\n const { structures, roiLayers, selectedLayer, resultTab } = this.props;\r\n const selectedRoi = 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 const 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 const 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 const 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 /**\r\n * Finds the id of the first included file after the current file.\r\n * If the current file is the last included file, a warning is shown and null is returned.\r\n * @returns {string} Id of next file.\r\n */\r\n getNextFileId = () => {\r\n const { project, fileId } = this.props;\r\n const currentFileIndex = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n let nextFileIndex = currentFileIndex + 1;\r\n while (\r\n project.files[nextFileIndex] &&\r\n project.files[nextFileIndex].excludeScene\r\n ) {\r\n nextFileIndex++;\r\n if (nextFileIndex >= project.files.length) {\r\n window.showWarningSnackbar(\"Last file included in analysis.\");\r\n return null;\r\n }\r\n }\r\n\r\n return project.files[nextFileIndex].id;\r\n };\r\n\r\n /**\r\n * Finds the id of the first included file before the current file.\r\n * If the current file is the first included file, a warning is shown and null is returned.\r\n * @returns {string} Id of previous file.\r\n */\r\n getPrevFileId = () => {\r\n const { project, fileId } = this.props;\r\n const currentFileIndex = project.files.findIndex(\r\n (element) => element.id === fileId\r\n );\r\n\r\n let previousFileIndex = currentFileIndex - 1;\r\n while (\r\n project.files[previousFileIndex] &&\r\n project.files[previousFileIndex].excludeScene\r\n ) {\r\n previousFileIndex--;\r\n if (previousFileIndex < 0) {\r\n window.showWarningSnackbar(\"First file included in analysis.\");\r\n return null;\r\n }\r\n }\r\n\r\n return project.files[previousFileIndex].id;\r\n };\r\n\r\n saveToJSON = () => {\r\n if (this.isHistoClass) {\r\n this.checkIfSkipped();\r\n }\r\n\r\n this.props.onSave();\r\n\r\n if (this.getTotalCount() < 100 && this.isHistoPntC) {\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 };\r\n\r\n onEnd = () => {\r\n this.store.save(\"belongsToFinishedTab\", true);\r\n this.saveToJSON();\r\n\r\n const { 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 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 } = 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 const newSubstructureLabel =\r\n dynamicStructureText + \" [\" + dynamicStructureAbbrText + \"]\";\r\n\r\n if (this.isHistoPntC) {\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 } = this.props;\r\n const { structuresToAdd } = this.state;\r\n\r\n if (this.isHistoClass) {\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.getHistoClassificationStarted()) {\r\n return \"RUN\";\r\n } else {\r\n if (this.isHistoClass) {\r\n return \"RESET ALL FILES\";\r\n } else if (this.isHistoPntC) {\r\n return \"RESET CURRENT FILE\";\r\n } else {\r\n return \"RESET\";\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Determines the text for the next/skip button.\r\n * Disply skip if the current tile has no classification.\r\n * @returns {string} Text for next/skip button.\r\n */\r\n nextOrSkipText = () => {\r\n if (this.isHistoClass) {\r\n return \"NEXT\";\r\n }\r\n\r\n if (!this.getGridExists()) {\r\n return \"NEXT\";\r\n }\r\n const { roiLayers, resultTab } = this.props;\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n\r\n const 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 const 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, resultTab, tiles } = this.props;\r\n\r\n if (resultTab.getFileChange()) return true;\r\n\r\n let disabled;\r\n if (tiles.getHistoClassificationStarted()) {\r\n disabled = false;\r\n } else {\r\n disabled = true;\r\n }\r\n\r\n const selectedRoi = resultTab.getSelectedRoi();\r\n const numberTiles = roiLayers[selectedLayer].layer.regionRois.length;\r\n if (!disabled && this.isHistoClass) {\r\n // if last file and last tile\r\n const lastTileClassification =\r\n selectedRoi === numberTiles - 1 ? true : false;\r\n if (this.isLastFile() && lastTileClassification) {\r\n return true;\r\n }\r\n } else if (!disabled && this.isHistoPntC) {\r\n // last file and last tile or last file and 100 annotated\r\n const lastTileCounting = selectedRoi === numberTiles - 1 ? true : false;\r\n if (\r\n (this.isLastFile() && lastTileCounting) ||\r\n (this.isLastFile() &&\r\n 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 const 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 const 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 const 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.getHistoClassificationStarted();\r\n return (\r\n \r\n \r\n \r\n File {this.getCurrentFileInx()} / {this.props.project.files.length}\r\n \r\n {this.isHistoClass && (\r\n \r\n )}\r\n {this.isHistoPntC && (\r\n \r\n )}\r\n {this.isHistoPntC && 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.isHistoClass && showAddSubstructure && (\r\n
\r\n Add structures:\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.isHistoClass &&\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.isHistoClass &&\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 includeBackgroundTiles: false,\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 loadPersistentDefaultModels = () => {\r\n let defaultModels = this.props.persistentStorage.loadProjectTypeValue(\r\n this.props.project.type,\r\n \"defaultModels\"\r\n );\r\n return Array.isArray(defaultModels) ? defaultModels : [];\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(\r\n \"verified_models\",\r\n connectOnline,\r\n (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 =\r\n 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\r\n let defaultModels = this.loadPersistentDefaultModels();\r\n if (\r\n defaultModels.length === 0 &&\r\n stringProperties.DefaultModels\r\n ) {\r\n defaultModels = stringProperties.DefaultModels.split(\",\");\r\n }\r\n if (defaultModels.length > 0) {\r\n for (let modelName of defaultModels) {\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(\r\n formDataAICockpit\r\n ).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 (error) => {\r\n console.warn(error);\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 if view tab is selected for some cases\r\n if (value === 0) {\r\n if (\r\n project.type.includes(\"HistoPointCounting\") ||\r\n project.type.includes(\"HistoClassification\") ||\r\n (this.props.activeTool && this.props.activeTool.includes(\"iam_\"))\r\n ) {\r\n this.props.onChangeTool(\"none\");\r\n }\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 const { annotationsReduced, totalRoiCount } = this.props.projectContext;\r\n\r\n if (!roiLayers) return null;\r\n\r\n let roiCount = 0;\r\n const gridTileCount =\r\n rendererRef && rendererRef.gridTileCount ? rendererRef.gridTileCount : 0;\r\n if (annotationsReduced) {\r\n roiCount = totalRoiCount;\r\n } else if (rendererRef) {\r\n roiCount =\r\n rois.length -\r\n gridTileCount +\r\n roiLayers.reduce((acc, cur) => acc + cur.layer.regionRois.length, 0);\r\n }\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={\"ROIS (\" + roiCount + \")\"}\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 { 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","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","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","// Framework imports\r\nimport React, { useState, useRef, useEffect } from \"react\";\r\nimport { PropTypes } from \"prop-types\";\r\n\r\n/**\r\n * Only load the visible children of a (long) list.\r\n * @param {Array} children Children to be rendered only whne in rendering area.\r\n * @param {number} maxContainerHeight The maximum allowed height of the container in pixels.\r\n * @param {number} elementHeight The height of a single element. all elements assumed to be the same height.\r\n * @param {number} offsetElements Optional. The number of elements to be preloaded outside of visible area. Defaults to 2.\r\n * @returns\r\n */\r\nexport function LazyRender(props) {\r\n const {\r\n children,\r\n maxContainerHeight,\r\n elementHeight,\r\n offsetElements = 2,\r\n } = props;\r\n const containerRef = useRef();\r\n\r\n const [scrollPositionTop, setScrollPositionTop] = useState(0);\r\n const [containerHeight, setContainerHeight] = useState(100);\r\n\r\n useEffect(() => {\r\n setContainerHeight(containerRef.current.clientHeight);\r\n containerRef.current.addEventListener(\"scroll\", (e) => handleScroll(e));\r\n return containerRef.current.removeEventListener(\"scroll\", (e) =>\r\n handleScroll(e)\r\n );\r\n }, []);\r\n\r\n /**\r\n * Update position and container properties on scroll.\r\n * @param {event} e Scrollevent.\r\n */\r\n const handleScroll = (e) => {\r\n setScrollPositionTop(e.target.scrollTop);\r\n setContainerHeight(containerRef.current.clientHeight);\r\n };\r\n\r\n /**\r\n * The placeholder to put in place of a non-rendered element\r\n */\r\n const placeholder = (key) => (\r\n
\r\n );\r\n\r\n /**\r\n * Determine if an element should be rendered depending on its position.\r\n * @param {int} idx The index of the element in an arrray.\r\n * @returns {Boolean} Whether an element sould be rendered.\r\n */\r\n function isInView(idx) {\r\n const pos = idx * elementHeight;\r\n\r\n const minRendered = scrollPositionTop - offsetElements * elementHeight;\r\n const maxRendered =\r\n scrollPositionTop + containerHeight + offsetElements * elementHeight;\r\n\r\n const shouldBeRendered = pos >= minRendered && pos <= maxRendered;\r\n return shouldBeRendered;\r\n }\r\n\r\n return (\r\n \r\n {children.map((c, i) => (isInView(i) ? c : placeholder(i)))}\r\n \r\n );\r\n}\r\n\r\nLazyRender.propTypes = {\r\n children: PropTypes.array.isRequired,\r\n maxContainerHeight: PropTypes.number.isRequired,\r\n elementHeight: PropTypes.number.isRequired,\r\n offsetElements: PropTypes.number,\r\n};\r\n","// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\n// External packages\r\nimport CheckIcon from \"@mui/icons-material/Check\";\r\nimport Accordion from \"@mui/material/Accordion\";\r\nimport AccordionSummary from \"@mui/material/AccordionSummary\";\r\nimport AccordionDetails from \"@mui/material/AccordionDetails\";\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 InputAdornment from \"@mui/material/InputAdornment\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\nimport ContentCopyIcon from \"@mui/icons-material/ContentCopy\";\r\nimport ErrorIcon from \"@mui/icons-material/Error\";\r\n\r\n// HSA imports\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { LazyRender } from \"../../common/components/LazyRender\";\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});\r\n\r\n/**\r\n * Enum for project action mode.\r\n */\r\nexport const ProjectActionMode = Object.freeze({\r\n Import: 0,\r\n Update: 1,\r\n});\r\n\r\n/**\r\n * Content of the dialog, depending on the project action mode.\r\n */\r\nconst _dialogContent = Object.freeze({\r\n [ProjectActionMode.Import]: {\r\n title: \"Map Files of Imported Project\",\r\n text: \"An exported project does not contain image files, only their respective names. \",\r\n },\r\n [ProjectActionMode.Update]: {\r\n title: \"Re-Map Missing Files\",\r\n text: \"Not all files previously associated with this project could be found in their original location. \",\r\n },\r\n});\r\n\r\nclass FindFilesDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n formData: props.formData ?? {\r\n fileMappings: [],\r\n },\r\n openAccordion: null,\r\n dialogIsOpen: Boolean(props.open),\r\n onSuccess: props.onSuccess ?? (() => {}),\r\n };\r\n }\r\n\r\n /**\r\n * Open/Show FindFilesDialog.\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, onSuccess = () => {}) {\r\n this.setState({ dialogIsOpen: true, formData, onSuccess: onSuccess });\r\n }\r\n\r\n /**\r\n * Close FindFilesDialog. Resets state.\r\n */\r\n handleClose = () => {\r\n this.setState({\r\n dialogIsOpen: false,\r\n openAccordion: null,\r\n formData: {\r\n fileMappings: [],\r\n projects: [],\r\n },\r\n });\r\n };\r\n\r\n /**\r\n * Submit all updated filepaths to backend for check and - if successfull - project completion.\r\n */\r\n handleSubmit = () => {\r\n const { formData } = this.state;\r\n const { projectActionMode } = this.props;\r\n Backend.checkFileMappings(\r\n formData,\r\n projectActionMode,\r\n (res) => {\r\n // Incomplete file mappings\r\n if (!res.allUniquelyMapped) {\r\n window.showWarningSnackbar(\r\n `Not all files could be uniquely associated. Please adapt the paths of all missing or duplicate paths.`\r\n );\r\n this.setState({ formData: res });\r\n return;\r\n }\r\n // Import completed without changes\r\n this.handleClose();\r\n this.state.onSuccess();\r\n\r\n \r\n },\r\n // Error\r\n (err) => {\r\n console.error(err);\r\n window.openWarningDialog(err);\r\n }\r\n );\r\n };\r\n\r\n /**\r\n * Generates a formatted file list, so that all three types of files may ues the same code.\r\n * @param {Array} files Files to map to screen.\r\n * @returns {div} Files mapped and formatted.\r\n */\r\n generateFileList(files) {\r\n return (\r\n \r\n {files.map((f) => (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n ) : f.found ? (\r\n // Files found\r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n // Missing files\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n }}\r\n disabled\r\n margin=\"dense\"\r\n label=\"Old Path\"\r\n fullWidth\r\n variant=\"filled\"\r\n />\r\n {\r\n f.newPath = e.target.value;\r\n this.forceUpdate();\r\n }}\r\n margin=\"dense\"\r\n label=\"New Path\"\r\n fullWidth\r\n error={!f.found || f.duplicatePath}\r\n />\r\n
\r\n ))}\r\n
\r\n );\r\n }\r\n\r\n render() {\r\n const { dialogIsOpen, formData } = this.state;\r\n const { classes, projectActionMode } = this.props;\r\n // Only show unique source files, not one per scene of file.\r\n const uniqueFiles = formData.fileMappings\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 .sort((a, b) => a.file.sourcePath.localeCompare(b.file.sourcePath));\r\n\r\n const filesFound = uniqueFiles.filter((f) => f.found);\r\n const duplicates = uniqueFiles.filter((f) => f.duplicatePath);\r\n const missing = uniqueFiles.filter((f) => !f.found && !f.duplicatePath);\r\n\r\n return (\r\n \r\n \r\n {_dialogContent[projectActionMode].title}\r\n \r\n \r\n \r\n {_dialogContent[projectActionMode].text}\r\n Please select the corresponding files from your hard drive.\r\n \r\n {\r\n this.setState({ openAccordion: expanded ? \"found\" : null });\r\n }}\r\n >\r\n \r\n {`Files Found (${filesFound.length})`}\r\n \r\n \r\n \r\n No further action needed. These files could automatically be\r\n associated with existing files inside your slides folder.\r\n \r\n {this.generateFileList(filesFound)}\r\n \r\n \r\n {\r\n this.setState({ openAccordion: expanded ? \"missing\" : null });\r\n }}\r\n >\r\n \r\n {`Files Missing (${missing.length})`}\r\n \r\n \r\n \r\n These files could not be automatically found inside your slides\r\n folder. Perhaps their names have changed or they need to be\r\n added again. Please insert missing files to the slides folder or\r\n specify their new name.\r\n \r\n {this.generateFileList(missing)}\r\n \r\n \r\n {\r\n this.setState({ openAccordion: expanded ? \"duplicate\" : null });\r\n }}\r\n >\r\n \r\n {`Duplicate Files (${duplicates.length})`}\r\n \r\n \r\n \r\n Multiple of the imported files have been associated with the\r\n same file inside your slides folder. It could not be\r\n automatically determined which on is correct, so the first one\r\n was chosen. It is not allowed to have the same file twice in a\r\n project, therefore, please inspect all duplicated and specify\r\n their correct path.\r\n \r\n {this.generateFileList(duplicates)}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nFindFilesDialog.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n projectActionMode: PropTypes.number.isRequired,\r\n formData: PropTypes.object,\r\n open: PropTypes.bool,\r\n onSuccess: PropTypes.func,\r\n};\r\n\r\nexport default withStyles(styles)(FindFilesDialog);\r\n","// Copyright HS-Analysis GmbH, 2019\r\n\r\n// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\n// External imports\r\nimport RBush from \"rbush\";\r\n\r\n// Material UI imports\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport Grid from \"@mui/material/Grid\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport LinearProgress from \"@mui/material/LinearProgress\";\r\nimport LinkIcon from \"@mui/icons-material/Link\";\r\nimport LinkOffIcon from \"@mui/icons-material/LinkOff\";\r\nimport RemoveCircleIcon from \"@mui/icons-material/RemoveCircle\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\n// HSA imports\r\nimport { ChannelsConfig } from \"./components/Histogram\";\r\nimport { debounce } from \"../common/utils/Utils\";\r\nimport { RegionROI, CommentROI, createRoisFromAnno } from \"./utils/ROI\";\r\nimport {\r\n updateLayer,\r\n calcBoundingBox,\r\n createRegionRoi,\r\n validateAndCorrectRois,\r\n} from \"./utils/PolygonUtil\";\r\nimport { withAllViewerContexts } from \"./contexts/AllViewerContexts\";\r\nimport { withResultTab } from \"./contexts/ResultTabContext\";\r\nimport { withTiles } from \"./contexts/TilesContext\";\r\nimport ActiveLearningTool from \"./components/tools/ActiveLearningTool\";\r\nimport AITrainingTool from \"./components/tools/AITrainingTool\";\r\nimport Backend from \"../common/utils/Backend\";\r\nimport ClassroomChat from \"./components/ClassroomChat\";\r\nimport CommentTool from \"./components/tools/CommentTool\";\r\nimport CopyTool from \"./components/tools/CopyTool\";\r\nimport EllipseTool from \"./components/tools/EllipseTool\";\r\nimport FillTool from \"./components/tools/FillTool\";\r\nimport FilterAnnotationsTool from \"./components/tools/FilterAnnotationsTool\";\r\nimport Gallery from \"./components/Gallery\";\r\nimport GridAnnotationTool from \"./components/tools/GridAnnotationTool\";\r\nimport GridTool from \"./components/tools/GridTool\";\r\nimport HeatmapTool from \"./components/tools/HeatmapTool\";\r\nimport InstantAnalysisTool from \"./components/tools/InstantAnalysisTool\";\r\nimport LandmarkTool from \"./components/tools/LandmarkTool\";\r\nimport MagicWandTool from \"./components/tools/MagicWandTool\";\r\nimport OverlaySlider from \"./components/OverlaySlider\";\r\nimport PenTool from \"./components/tools/PenTool\";\r\nimport PlotNearestRoiTool from \"./components/tools/PlotNearestRoiTool\";\r\nimport RectangleTool from \"./components/tools/RectangleTool\";\r\nimport RegionGrabCutTool from \"./components/tools/RegionGrabCutTool\";\r\nimport RegionGrowingTool from \"./components/tools/RegionGrowingTool\";\r\nimport RegionTool from \"./components/tools/RegionTool\";\r\nimport Renderer from \"./components/Renderer\";\r\nimport SelectionTool from \"./components/tools/SelectionTool\";\r\nimport SideBar from \"./components/SideBar\";\r\nimport TilesClassificationTool from \"./components/tools/TilesClassificationTool\";\r\nimport TilesHistoPointCountingTool from \"./components/tools/TilesHistoPointCountingTool\";\r\nimport VerticalToolBar, { Tools } from \"./components/VerticalToolBar\";\r\nimport Viewer3D from \"./components/3D-Viewer\";\r\nimport WindowTool from \"./components/WindowTool\";\r\nimport FindFilesDialog, {\r\n ProjectActionMode,\r\n} from \"../home/dialogs/FindFilesDialog\";\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 preparingStartJob: false,\r\n annotationsAreReduced: 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.FILTERANNOTATIONS_ROI] = new FilterAnnotationsTool();\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.requestProject(\r\n this.props.id,\r\n (res) => {\r\n if (!res.newMappingsFound && res.allUniquelyMapped) {\r\n this.loadProject();\r\n } else {\r\n this.FindMissingFiles.show(res, () => {\r\n this.loadProject();\r\n });\r\n }\r\n },\r\n (error) => window.openErrorDialog(error)\r\n );\r\n }\r\n\r\n loadProject = () => {\r\n Backend.loadProject(\r\n {\r\n id: this.props.id,\r\n },\r\n (project) => {\r\n if (project.projectData) {\r\n if (project.files.length > project.projectData.files.length) {\r\n project.projectData.files = project.files.map((file) => {\r\n file.annotations = [];\r\n return file;\r\n });\r\n }\r\n // Attempt to load project data from saved json.\r\n const idMapping = project.files.reduce((map, file) => {\r\n map[file.fileName + file.scene] = file.id;\r\n return map;\r\n }, {});\r\n\r\n project.projectData.files = project.projectData.files.map((file) => {\r\n const fileId = idMapping[file.fileName + file.scene];\r\n if (!fileId) {\r\n console.error(\r\n \"Error loading files: Id mapping failed, was the path to the slides changed?\"\r\n );\r\n }\r\n return { ...file, id: fileId };\r\n });\r\n\r\n project.projectData.files = project.projectData.files.map((file) => {\r\n const fileId = idMapping[file.fileName + file.scene];\r\n if (!fileId) {\r\n console.error(\r\n \"Error loading files: Id mapping failed, was the path to the slides changed?\"\r\n );\r\n }\r\n return { ...file, id: fileId };\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 const fileIdx = j;\r\n let dataFileIdx = projectDataFiles.findIndex((file) => {\r\n return file.id === project.files[fileIdx].id;\r\n });\r\n if (dataFileIdx === -1) {\r\n console.info(\r\n \"saved file and project file do not match, comparing by name and scene\"\r\n );\r\n dataFileIdx = projectDataFiles.findIndex((file) => {\r\n return (\r\n file.fileName === project.files[fileIdx].fileName &&\r\n file.scene === project.files[fileIdx].scene\r\n );\r\n });\r\n }\r\n if (dataFileIdx > -1) {\r\n const projectDataFile = projectDataFiles[dataFileIdx];\r\n const projectFile = project.files[fileIdx];\r\n projectFile.excludeScene = projectDataFile.excludeScene;\r\n projectFile.fullyAnnotated = projectDataFile.fullyAnnotated;\r\n projectFile.annotated = projectDataFile.annotated === true;\r\n projectFile.saved = projectDataFile.saved;\r\n projectFile.classId = projectDataFile.classId;\r\n } else {\r\n // this should not happen\r\n console.log(\r\n \"file data could not be matched with saved data for file:\",\r\n project.files[fileIdx].fileName,\r\n project.files[fileIdx].scene\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 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 const sortedFiles = [];\r\n for (let fileName of fileNames) {\r\n sortedFiles.push(...fileGroups[fileName]);\r\n }\r\n project.files = sortedFiles;\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 fileGroups: fileGroups,\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 countVisibleStructures = () => {\r\n return this.state.project.viewerConfig.project.structures.reduce(\r\n (acc, cur) => acc + (cur.visible ? 1 : 0),\r\n 0\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 const { project } = this.state;\r\n this.setMountedState({ formDataAICockpit: formDataAICockpit });\r\n // start job if defined in project config\r\n if (\r\n \"AutoSaveStartJob\" in project.viewerConfig.project.projectProperties &&\r\n project.viewerConfig.project.projectProperties[\"AutoSaveStartJob\"] &&\r\n !this.state.preparingStartJob &&\r\n this.state.project.state === \"ready\"\r\n ) {\r\n this.setState({ preparingStartJob: true });\r\n this.saveFunction();\r\n Backend.setProjectsPending([this.state.project.id], () => {\r\n console.log(\"project state changed to pending:\", this.state.project.id);\r\n });\r\n\r\n // return to Home Screen\r\n let { history } = this.props;\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\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 updateStructuresWithPersistentStorage = (structures) => {\r\n // check structures\r\n const structuresStateList =\r\n this.props.persistentStorage.loadProjectTypeValue(\r\n this.state.project.type,\r\n \"structuresStateList\"\r\n );\r\n if (structuresStateList === null) return;\r\n if (structuresStateList.length === structures.length) {\r\n for (let i = 0; i < structures.length; i++) {\r\n structures[i].isUnfolded = structuresStateList[i].isUnfolded;\r\n structures[i].visible = structuresStateList[i].visible;\r\n structures[i].showSubtypes = structuresStateList[i].showSubtypes;\r\n }\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\r\n this.updateStructuresWithPersistentStorage(structures);\r\n\r\n this.props.projectContext.setState({\r\n roiLayers,\r\n structures,\r\n viewerConfig: project.viewerConfig,\r\n });\r\n this.setMountedState({\r\n structures,\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 } else {\r\n idx = anno.id;\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 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 for (const fileId of Object.values(ids)) {\r\n newZoomObjectDict[fileId] = this.getLocalZoomObject(fileId);\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 this.props.projectContext.setPersistentStorage(\r\n this.props.persistentStorage\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 getLocalZoomObject = (fileId) => {\r\n const zoom = this.props.persistentStorage.load(\"zoomObject\" + fileId);\r\n let zoomObject = {};\r\n if (zoom) {\r\n zoom.zoomRoi = true;\r\n }\r\n if (zoom) {\r\n zoomObject = JSON.parse(JSON.stringify(zoom));\r\n } else {\r\n zoomObject = {\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 return zoomObject;\r\n };\r\n\r\n toggleRois = () => {\r\n const { structures } = this.state.project.viewerConfig.project;\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\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 this.toggleRois();\r\n break;\r\n default:\r\n break;\r\n }\r\n } else if (e.altKey) {\r\n for (let i = 1; i < 10; i++) {\r\n if (e.key === i.toString()) {\r\n elem = document.getElementById(\"channel_\" + (i - 1).toString());\r\n break;\r\n }\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 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 //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 this.props.spinloader.show();\r\n const fileData = {\r\n id: projectId,\r\n fileId: file.id,\r\n };\r\n const queryOptions = {\r\n minX: -1,\r\n minY: -1,\r\n maxX: -1,\r\n maxY: -1,\r\n maxResults: 2000,\r\n };\r\n const zoomObject = this.getLocalZoomObject(file.id);\r\n if (zoomObject && zoomObject.zoomRoi) {\r\n queryOptions.minX = parseInt(zoomObject.zoomLeft, 10);\r\n queryOptions.minY = parseInt(zoomObject.zoomTop, 10);\r\n queryOptions.maxX = parseInt(zoomObject.zoomRight, 10);\r\n queryOptions.maxY = parseInt(zoomObject.zoomBottom, 10);\r\n }\r\n Backend.loadAnnotations(fileData, queryOptions)\r\n .then((jsonAnnotations) => {\r\n this.processLoadedAnnotations(\r\n jsonAnnotations,\r\n file,\r\n id,\r\n projectId,\r\n newroiLayers,\r\n callback\r\n );\r\n if (jsonAnnotations.is_reduced === true) {\r\n window.showWarningSnackbar(\r\n \"Too many annotations to render, only sample annotations from middle are loaded!\"\r\n );\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err);\r\n window.openErrorDialog(\"Could not load annotations:\\n\" + err);\r\n this.props.spinloader.hide();\r\n });\r\n }\r\n\r\n updateVisibleROIDebounced = debounce(\r\n (...args) => this.updateVisibleROI(...args),\r\n 100\r\n );\r\n\r\n processLoadedAnnotations = (\r\n jsonAnnotations,\r\n file,\r\n id,\r\n projectId,\r\n newroiLayers,\r\n callback\r\n ) => {\r\n const { structures } = this.props.projectContext;\r\n if (jsonAnnotations && jsonAnnotations.is_locked) {\r\n // call Backend.loadAnnotations(...) again after 5 seconds until jsonAnnotations.is_locked does not exist anymore\r\n setTimeout(() => {\r\n this.loadAnnotations(file, id, projectId, newroiLayers, callback);\r\n }, 5000);\r\n return;\r\n }\r\n this.props.projectContext.setState({\r\n annotationsReduced: jsonAnnotations.is_reduced,\r\n totalRoiCount: jsonAnnotations.total_roi_count,\r\n });\r\n let result = jsonAnnotations.data;\r\n this.setMountedState({\r\n annotationsAreReduced: jsonAnnotations.is_reduced,\r\n });\r\n\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 validateAndCorrectRois(\r\n newRois,\r\n this.props.projectContext.structures,\r\n i\r\n );\r\n let structROIs = {\r\n id: anno.geoJSON.structID ? anno.geoJSON.structID : 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 validateAndCorrectRois(newRois, this.props.projectContext.structures, i);\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\r\n updateVisibleROI = (p1, p2) => {\r\n if (!this.state.annotationsAreReduced) return;\r\n const { roiLayers, fileId, structures } = this.props.projectContext;\r\n const structuresMap = {};\r\n for (let i = 0; i < structures.length; i++) {\r\n structuresMap[structures[i].id] = i;\r\n }\r\n structuresMap[1] = 0;\r\n let currentFile = this.props.projectContext.project.files.find(\r\n (file) => file.id === fileId\r\n );\r\n if (!this.props.projectContext.isLoadingAnnotations) {\r\n this.props.projectContext.setState({ isLoadingAnnotations: true });\r\n\r\n const fileData = {\r\n id: this.state.project.id,\r\n fileId: currentFile.id,\r\n };\r\n\r\n const queryOptions = {\r\n minX: parseInt(p1.x, 10),\r\n minY: parseInt(p1.y, 10),\r\n maxX: parseInt(p2.x, 10),\r\n maxY: parseInt(p2.y, 10),\r\n maxResults: 2000,\r\n };\r\n\r\n Backend.loadAnnotations(fileData, queryOptions)\r\n .then((jsonAnnotations) => {\r\n this.processLoadedAnnotations(\r\n jsonAnnotations,\r\n currentFile,\r\n fileId,\r\n this.state.project.id,\r\n roiLayers\r\n );\r\n this.props.spinloader.hide();\r\n this.props.projectContext.setState({ isLoadingAnnotations: false });\r\n const lp1 = this.lastViewRoiParams.p1;\r\n const lp2 = this.lastViewRoiParams.p2;\r\n if (p1.x !== lp1.x || p1.y !== lp1.y) {\r\n this.updateVisibleROIDebounced(lp1, lp2);\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err);\r\n window.openErrorDialog(\r\n `Could not load annotations of file ${currentFile.label}:\\n${err}`\r\n );\r\n this.props.spinloader.hide();\r\n this.props.projectContext.setState({ isLoadingAnnotations: false });\r\n });\r\n }\r\n this.lastViewRoiParams = { p1, p2 };\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 let newProjectObject = this.state.project;\r\n if (newProjectObject.projectData !== null) {\r\n let currentFile = newProjectObject.files.find(\r\n (file) => file.id === id\r\n );\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(\r\n currentFile,\r\n id,\r\n projectId,\r\n roiLayers,\r\n () => {\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 } 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\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 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 if (\r\n !(\r\n this.state.project.type.includes(\"HistoPointCounting\") ||\r\n this.state.project.type.includes(\"HistoClassification\")\r\n )\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 } = this.state;\r\n const { selectedLayer, structures, roiLayers, user } =\r\n 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 // move rois back to correct layer\r\n for (let i = 0; i < roiLayers[file.id].length; i++) {\r\n const regionRois = roiLayers[file.id][i].layer.regionRois;\r\n if (regionRois.length > 0) {\r\n const correctStructureId = structures[i].id;\r\n const regionRoisToMove = regionRois.filter(\r\n (roi) => roi.isSubtype && roi.structureId !== correctStructureId\r\n );\r\n if (regionRoisToMove.length > 0) {\r\n const newRois = regionRois.filter(\r\n (roi) => roi.structureId === correctStructureId\r\n );\r\n roiLayers[file.id][i].layer.regionRois = newRois;\r\n roiLayers[file.id][i].tree.clear();\r\n roiLayers[file.id][i].tree.load(\r\n newRois.map((item) => item.treeItem)\r\n ); //load tree to new data\r\n\r\n regionRoisToMove.forEach((roi) => {\r\n const roiLayerIdx = structures.findIndex(\r\n (structure) => structure.id === roi.structureId\r\n );\r\n roiLayers[file.id][roiLayerIdx].layer.regionRois.push(roi);\r\n roiLayers[file.id][roiLayerIdx].tree.insert(roi.treeItem);\r\n });\r\n }\r\n }\r\n }\r\n // console.log(\"roiLayers[file.id]:\", roiLayers[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 === true,\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 // save without annotations, since annotations will be saved seperately\r\n file.annotations = null;\r\n }\r\n if (this.state.annotationsAreReduced) {\r\n window.showErrorSnackbar(\"Sample Annotations can't be saved!\");\r\n this.props.spinloader.hide();\r\n if (typeof callback === \"function\") {\r\n callback();\r\n }\r\n } else {\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 }\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, () => {\r\n window.projectHistory.clear(); //clear to prevent history syncing bugs and clean up space\r\n if (typeof callback === \"function\") {\r\n callback();\r\n }\r\n });\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 (this.FindMissingFiles = c)}\r\n projectActionMode={ProjectActionMode.Update}\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 updateVisibleROIDebounced={\r\n this.updateVisibleROIDebounced\r\n }\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 updateVisibleROIDebounced={this.updateVisibleROIDebounced}\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 history: PropTypes.object,\r\n roiLayers: PropTypes.array,\r\n structures: PropTypes.array,\r\n};\r\n\r\nexport default withRouter(\r\n withTiles(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.name + \" Probability\", // Must be adjusted together with backend\r\n substance.name + \" 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.name\r\n );\r\n return foundIdx >= 0\r\n ? {\r\n substance: substance.name,\r\n concentration: oldSettings[foundIdx].concentration,\r\n }\r\n : { substance: substance.name, 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\r\n ?.map((subst) => subst.name)\r\n .join(\", \")}\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\r\n ?.map((subst) => subst.name)\r\n .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.name,\r\n Number(e.target.value)\r\n );\r\n }}\r\n value={\r\n spectraViewer.spectraPredictionSettings.find(\r\n (setting) => setting.substance === substance.name\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 (error) => {\r\n console.warn(error);\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 FilterAnnotationsTool: 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 \"FilterAnnotationsTool\":\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, { useState, useEffect, useCallback } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n List,\r\n ListItemButton,\r\n ListItemText,\r\n IconButton,\r\n Button,\r\n} from \"@mui/material\";\r\nimport { Folder, Description, ArrowUpward } from \"@mui/icons-material\";\r\nimport Backend from \"../utils/Backend\";\r\n\r\nimport { makeStyles } from \"@mui/styles\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n title: {\r\n minHeight: 64,\r\n },\r\n content: {\r\n width: \"500px\",\r\n height: \"500px\",\r\n overflow: \"auto\",\r\n },\r\n contentIcon: {\r\n color: theme.palette.icon.main,\r\n marginRight: \"5px\",\r\n },\r\n}));\r\n\r\nconst SelectPathDialog = ({ isFolder, acceptPath }) => {\r\n const classes = useStyles();\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [path, setPath] = useState(\"\");\r\n const [directories, setDirectories] = useState([]);\r\n\r\n useEffect(() => {\r\n // Get the list of directories when the dialog opens\r\n if (isOpen) {\r\n Backend.getDirectories(path).then((directories) => {\r\n if (directories) {\r\n setDirectories(directories);\r\n }\r\n });\r\n }\r\n }, [isOpen, path]);\r\n\r\n const handleListItemClick = useCallback((directory) => {\r\n setPath(directory);\r\n }, []);\r\n\r\n const handleGoUp = useCallback(() => {\r\n if (path.length < 4) {\r\n setPath(\"\");\r\n } else {\r\n const newPath = path.split(\"/\").slice(0, -1).join(\"/\");\r\n setPath(newPath === \"\" ? \"/\" : newPath);\r\n }\r\n }, [path]);\r\n\r\n const onCancel = useCallback(() => {\r\n setPath(\"\");\r\n setIsOpen(false);\r\n }, []);\r\n\r\n const onAccept = useCallback(() => {\r\n acceptPath(path);\r\n setIsOpen(false);\r\n }, [path]);\r\n\r\n return (\r\n <>\r\n setIsOpen(true)}>\r\n {isFolder ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n setIsOpen(false)}>\r\n {path}\r\n \r\n \r\n {/* Add a button to go up a folder if not already at root */}\r\n {path !== \"\" && (\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {/* Display each directory in the list */}\r\n {directories.map((directory) => {\r\n let dirName = directory.substring(directory.lastIndexOf(\"/\") + 1);\r\n if (dirName === \"\") {\r\n dirName = directory;\r\n }\r\n return (\r\n handleListItemClick(directory)}\r\n >\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nSelectPathDialog.propTypes = {\r\n isFolder: PropTypes.bool.isRequired,\r\n acceptPath: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default SelectPathDialog;\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 {\r\n Select,\r\n InputLabel,\r\n FormHelperText,\r\n FormControl,\r\n Typography,\r\n MenuItem,\r\n OutlinedInput,\r\n InputAdornment,\r\n IconButton,\r\n Tooltip,\r\n Button,\r\n Grid,\r\n} from \"@mui/material\";\r\nimport ContentCopyIcon from \"@mui/icons-material/ContentCopy\";\r\nimport ContentPasteIcon from \"@mui/icons-material/ContentPaste\";\r\nimport FileUploadIcon from \"@mui/icons-material/FileUpload\";\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\nimport SelectPathButton from \"../common/components/SelectPathButton\";\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 licensStatusContainer: {\r\n position: \"relative\",\r\n },\r\n licensingInput: {\r\n \"& .MuiInputBase-root\": {\r\n paddingTop: \"50px\",\r\n },\r\n \"& textarea\": {\r\n overflow: \"auto !important\",\r\n maxHeight: \"184px\",\r\n },\r\n },\r\n statusBlock: {\r\n width: \"100%\",\r\n maxWidth: \"350px\",\r\n },\r\n pasteIconButton: {\r\n position: \"absolute\",\r\n top: \"18px\",\r\n right: 0,\r\n zIndex: 1,\r\n },\r\n importIconButton: {\r\n position: \"absolute\",\r\n top: \"18px\",\r\n right: \"40px\",\r\n zIndex: 1,\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 { name, value } = event.target;\r\n this.setState((prevState) => ({\r\n formData: {\r\n ...prevState.formData,\r\n [name]: value,\r\n },\r\n }));\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 handleCopyLink = () => {\r\n navigator.clipboard.writeText(this.state.hardwareID);\r\n window.showSuccessSnackbar(\"Hardware Id copyied to clipboard!\");\r\n };\r\n\r\n pasteLicenseKeyFromClipboard = () => {\r\n navigator.clipboard\r\n .readText()\r\n .then((text) => {\r\n let formData = this.state.formData;\r\n formData.licenseKey = text;\r\n this.setState({ formData });\r\n window.showSuccessSnackbar(\r\n \"License Key replaced with clipboard content!\"\r\n );\r\n })\r\n .catch((err) => {\r\n window.openErrorDialog(\"Failed to read clipboard contents: \" + err);\r\n });\r\n };\r\n\r\n readLicenseKeyFromFile = () => {\r\n const fileInput = document.createElement(\"input\");\r\n fileInput.type = \"file\";\r\n fileInput.accept = \".txt\";\r\n\r\n fileInput.onchange = () => {\r\n const file = fileInput.files[0];\r\n if (file && file.size <= 1048576) {\r\n const fileReader = new FileReader();\r\n\r\n fileReader.onload = (event) => {\r\n const fileContents = event.target.result;\r\n let formData = this.state.formData;\r\n formData.licenseKey = fileContents;\r\n this.setState({ formData });\r\n window.showSuccessSnackbar(\"License Key replaced with file content!\");\r\n };\r\n\r\n fileReader.readAsText(file);\r\n } else if (file && file.size > 1048576) {\r\n window.showErrorSnackbar(\r\n \"Selected file is too big to contain a License Key!\"\r\n );\r\n }\r\n };\r\n\r\n fileInput.click();\r\n };\r\n\r\n handleAccept = (key, path) => {\r\n this.setState((prevState) => ({\r\n formData: {\r\n ...prevState.formData,\r\n [key]: path,\r\n },\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 \r\n Hardware Id\r\n \r\n \r\n \r\n \r\n \r\n }\r\n label=\"Stream link\"\r\n />\r\n \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\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 \r\n \r\n this.handleAccept(\"storagePath\", path)}\r\n />\r\n \r\n \r\n\r\n \r\n \r\n this.removeErrorStyle(\"tempPath\")}\r\n fullWidth\r\n margin=\"normal\"\r\n name=\"tempPath\"\r\n label=\"Data 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 \r\n \r\n this.handleAccept(\"tempPath\", path)}\r\n />\r\n \r\n \r\n \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 \r\n \r\n \r\n this.handleAccept(\"galleryOutputPath\", path)\r\n }\r\n />\r\n \r\n \r\n \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 \r\n this.handleAccept(\"javaPath\", path)}\r\n />\r\n \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 \r\n \r\n \r\n \r\n \r\n \r\n \r\n \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 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 \"tif\",\r\n \"tiff\",\r\n ];\r\n }\r\n\r\n let foldersToExclude = [];\r\n if (\r\n this.props.formData.projectType === \"HistoClassification\" ||\r\n this.props.formData.projectType === \"HistoPointCounting\"\r\n ) {\r\n foldersToExclude = [\"DAT\", \"SCS\", \"ANS\"];\r\n }\r\n\r\n // load list of available files\r\n Backend.walkDir(currentPath, (e) => {\r\n const filteredDirFiles = e\r\n .filter((entry) => {\r\n if (entry.type == \"directory\") {\r\n // Exclude specifically named folders\r\n const lastDir = this.getLastDir(entry.path);\r\n if (foldersToExclude.includes(lastDir)) return false;\r\n\r\n // Filter out folders that belong to a mrxs file wihtin the same folder\r\n if (e.some((element) => element.path === entry.path + \".mrxs\"))\r\n return false;\r\n\r\n if (addAll) {\r\n this.getFilesFromPath(entry.path, filterText, callback, addAll);\r\n return false;\r\n }\r\n\r\n return true;\r\n } else if (entry.type == \"file\") {\r\n const pathParts = entry.path.split(\".\");\r\n const extension = pathParts[pathParts.length - 1].toLowerCase();\r\n\r\n // Filter out files with not supported file formats (e.g. .xlsx)\r\n if (supportedFileFormats.every((e) => e !== extension))\r\n return false;\r\n\r\n // Filter out placeholder file\r\n if (pathParts[pathParts.length - 2] === \"empty_file\") return false;\r\n\r\n return true;\r\n } else {\r\n return true;\r\n }\r\n })\r\n .filter((entry) => {\r\n // Filter out files that do not match the filter text\r\n if (filterText === \"\") return true;\r\n const path = entry.path.split(\"/\")[entry.path.split(\"/\").length - 1];\r\n return path.toLowerCase().includes(filterText.toLowerCase());\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","// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { ValidatorForm } from \"react-material-ui-form-validator\";\r\n\r\n// External packages\r\nimport { Button, Dialog, DialogTitle, MobileStepper } from \"@mui/material\";\r\nimport { KeyboardArrowLeft, KeyboardArrowRight } from \"@mui/icons-material\";\r\n\r\n// HSA modules\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { viewerType } from \"../../common/utils/Utils\";\r\nimport { authenticationService } from \"../../common/services\";\r\nimport Step0 from \"./CreateProjectdialogComponents/Step0\";\r\nimport Step1 from \"./CreateProjectdialogComponents/Step1\";\r\nimport Step2 from \"./CreateProjectdialogComponents/Step2\";\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 {\r\n this.props.history.push(\r\n viewerType(formData.projectType) + e.projectId\r\n );\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 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(CreateProjectDialog);\r\n","//Importing necessary modules\r\nimport React, { useEffect, useRef } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport * as echarts from \"echarts\"; // updated import here\r\n\r\n//Functional Component\r\nconst ProjectsTimeLineChart = ({\r\n selectedProjects,\r\n selectedTargetColumnHeadline,\r\n projectData,\r\n}) => {\r\n const myChart = useRef(null);\r\n const option = useRef({\r\n grid: {\r\n right: \"25%\", // legend width\r\n },\r\n xAxis: {\r\n type: \"category\",\r\n axisLabel: {\r\n rotate: 45, // Rotate labels by 45 degrees.\r\n formatter: function (value) {\r\n return value.length > 10 ? value.slice(0, 10) + \"...\" : value;\r\n },\r\n },\r\n name: \"Project\",\r\n data: [],\r\n },\r\n yAxis: {\r\n type: \"value\",\r\n name: \"Number of Objects\",\r\n },\r\n toolbox: {\r\n show: true,\r\n feature: {\r\n mark: { show: true },\r\n dataView: { show: true, readOnly: false },\r\n saveAsImage: { show: true },\r\n },\r\n },\r\n legend: {\r\n data: [],\r\n selected: {},\r\n type: \"scroll\", // scrollable legend\r\n orient: \"vertical\",\r\n right: 0,\r\n top: 40,\r\n },\r\n\r\n series: [],\r\n });\r\n useEffect(() => {\r\n // Function to run when either of the props change\r\n const updateChart = () => {\r\n if (myChart.current === null) {\r\n myChart.current = echarts.init(document.getElementById(\"main\"));\r\n myChart.current.setOption(option.current);\r\n }\r\n if (\r\n !selectedTargetColumnHeadline ||\r\n !selectedProjects ||\r\n selectedProjects.length === 0 ||\r\n !projectData ||\r\n !projectData[selectedProjects[0].id] ||\r\n Object.keys(projectData).length !== selectedProjects.length ||\r\n Object.keys(projectData).length === 0\r\n ) {\r\n return;\r\n }\r\n const longestCombindeResults = Object.values(projectData).reduce(\r\n (acc, project) => {\r\n if (project.combinedResultRows.length > acc.length) {\r\n acc = project.combinedResultRows;\r\n }\r\n return acc;\r\n },\r\n []\r\n );\r\n const legendLabels = longestCombindeResults.map((row) => row[1]);\r\n option.current.yAxis.name = selectedTargetColumnHeadline;\r\n option.current.xAxis.data = selectedProjects.map(\r\n (project) => project.readableId\r\n );\r\n\r\n if (\r\n option.current.legend.data.length !== legendLabels.length ||\r\n option.current.legend.data.some(\r\n (label) => !legendLabels.includes(label)\r\n )\r\n ) {\r\n option.current.legend.data = legendLabels;\r\n option.current.legend.selected = legendLabels.reduce((acc, label) => {\r\n acc[label] = true;\r\n return acc;\r\n }, {});\r\n } else {\r\n option.current.legend.selected = {\r\n ...myChart.current.getOption().legend[0].selected,\r\n };\r\n }\r\n option.current.series = legendLabels.map((label, index) => {\r\n const series = {\r\n name: label,\r\n type: \"line\",\r\n data: [],\r\n };\r\n selectedProjects.forEach((project) => {\r\n const rowData = projectData[project.id];\r\n if (!rowData) return;\r\n const combinedResults = rowData.combinedResultRows;\r\n const columnHeadlines = rowData.columnHeadlines;\r\n const targetColumnIndex = columnHeadlines.indexOf(\r\n selectedTargetColumnHeadline\r\n );\r\n const targetColumnData = combinedResults.map(\r\n (row) => row[targetColumnIndex]\r\n );\r\n series.data.push(targetColumnData[index]);\r\n });\r\n return series;\r\n });\r\n if (option.current.series.length === 0) {\r\n return;\r\n }\r\n option.current.series[0].data = selectedProjects.map((project) => ({\r\n value: project.readableId,\r\n name: project.name,\r\n }));\r\n\r\n option.current.tooltip = {\r\n trigger: \"axis\",\r\n formatter: function (params) {\r\n let xAxisLabel = params[0].axisValue + \": \" + params[0].data.name;\r\n return (\r\n xAxisLabel +\r\n \"
\" +\r\n params.reduce((acc, param) => {\r\n acc += `
${param.seriesName}: ${param.value}`;\r\n return acc;\r\n }, \"\")\r\n );\r\n },\r\n };\r\n myChart.current.setOption(option.current);\r\n };\r\n\r\n // Check if all props are defined before running the function\r\n if (selectedProjects && selectedTargetColumnHeadline && projectData) {\r\n updateChart();\r\n }\r\n }, [selectedProjects, selectedTargetColumnHeadline, projectData]); // Dependency array\r\n //The useEffect hook runs after the component output has been rendered to the DOM.\r\n\r\n return
;\r\n};\r\n\r\nProjectsTimeLineChart.propTypes = {\r\n selectedProjects: PropTypes.arrayOf(PropTypes.object),\r\n selectedTargetColumnHeadline: PropTypes.string,\r\n projectData: PropTypes.object,\r\n};\r\n\r\nexport default ProjectsTimeLineChart;\r\n","import React, { useState, useEffect } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport Button from \"@mui/material/Button\";\r\nimport { DragDropContext, Droppable, Draggable } from \"react-beautiful-dnd\";\r\nimport XLSX from \"xlsx\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport { Select, MenuItem } from \"@mui/material\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport DragHandleIcon from \"@mui/icons-material/DragHandle\";\r\nimport ErrorOutlineIcon from \"@mui/icons-material/ErrorOutline\";\r\n\r\nimport ProjectsTimeLineChart from \"./CreateTimeLineChartDialogComponents/ProjectsTimeLineChart\";\r\n\r\nimport { makeStyles } from \"@mui/styles\";\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n dialogContent: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"250px 1fr\",\r\n },\r\n projectItem: {\r\n userSelect: \"none\",\r\n },\r\n errorItem: {\r\n color: theme.palette.error.main,\r\n },\r\n}));\r\n\r\nconst CreateTimeLineChartDialog = ({\r\n open,\r\n close,\r\n selectedProjectIds,\r\n projects,\r\n}) => {\r\n const classes = useStyles();\r\n\r\n // Initialize state for projects\r\n const [selectedProjects, setSelectedProjects] = useState([]);\r\n // add state for selected projects, that did not load\r\n const [selectedProjectsFailed, setSelectedProjectsFailed] = useState([]);\r\n const [projectData, setProjectData] = useState({}); // [project.id]: { columnHeadlines: [], combinedResultRows: [] }\r\n const [targetColumnHeadlines, setTargetColumnHeadlines] = useState([]); // [columnHeadline]\r\n const [selectedTargetColumnHeadline, setSelectedTargetColumnHeadline] =\r\n useState(\"\"); // columnHeadline\r\n\r\n // Fetch project data whenever selectedProjectIds change\r\n useEffect(() => {\r\n if (open) {\r\n const filteredProjects = projects.filter((project) =>\r\n selectedProjectIds.includes(project.id)\r\n );\r\n\r\n const isDifferent = (arr1, arr2) => {\r\n if (arr1.length !== arr2.length) {\r\n return true;\r\n }\r\n\r\n const sortedArr1 = [...arr1].sort();\r\n const sortedArr2 = [...arr2].sort();\r\n\r\n for (let i = 0; i < sortedArr1.length; i++) {\r\n if (sortedArr1[i] !== sortedArr2[i]) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // only update if the selected projects are different\r\n if (\r\n isDifferent(\r\n selectedProjects.map((p) => p.id),\r\n selectedProjectIds\r\n )\r\n ) {\r\n setSelectedProjects(filteredProjects);\r\n let projectData = {};\r\n const failedProjects = [];\r\n let promises = []; // Array to hold all requests\r\n\r\n for (const project of filteredProjects) {\r\n let download_path = Backend.downloadReport(project.id);\r\n let url = window.location.origin + download_path;\r\n\r\n /* set up async GET request */\r\n let promise = new Promise((resolve) => {\r\n // Wrap each request in a Promise\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 const roiLayerInfoSheet = workbook.Sheets[\"Roi Layer Info\"];\r\n\r\n // Convert the worksheet to JSON\r\n let sheetToJson = XLSX.utils.sheet_to_json(roiLayerInfoSheet, {\r\n header: 1,\r\n });\r\n\r\n // Load the first row into an array\r\n let columnHeadlines = sheetToJson[0];\r\n\r\n let combinedResultRows = [];\r\n let combindedResultsStartIndex = -1;\r\n for (let i = 1; i < sheetToJson.length; i++) {\r\n let resultRow = sheetToJson[i];\r\n if (resultRow[0] === \"Combined Results\") {\r\n // add this row and all following rows to the combinedResultRows array\r\n combindedResultsStartIndex = i;\r\n break;\r\n }\r\n }\r\n if (combindedResultsStartIndex !== -1) {\r\n for (\r\n let i = combindedResultsStartIndex;\r\n i < sheetToJson.length;\r\n i++\r\n ) {\r\n let resultRow = sheetToJson[i];\r\n combinedResultRows.push(resultRow);\r\n }\r\n }\r\n const projectSheetData = {\r\n columnHeadlines: columnHeadlines,\r\n combinedResultRows: combinedResultRows,\r\n };\r\n if (combinedResultRows.length > 0) {\r\n projectData[project.id] = projectSheetData;\r\n } else {\r\n failedProjects.push(projects.find((p) => p.id === project.id));\r\n }\r\n resolve(); // Resolve the promise when done\r\n };\r\n req.send();\r\n });\r\n\r\n promises.push(promise); // Add every promise to the array\r\n }\r\n\r\n Promise.all(promises).then(() => {\r\n if (Object.keys(projectData).length === 0) {\r\n // no project data was loaded\r\n setSelectedProjects([]);\r\n setSelectedProjectsFailed(filteredProjects);\r\n return;\r\n }\r\n // Wait for all promises to resolve\r\n // get the first project data object\r\n const firstProjectDataObject = Object.values(projectData)[0];\r\n\r\n // Use slice to remove the first 2 items and get rest of the items in columnHeadlines\r\n const updatedColumnHeadlines =\r\n firstProjectDataObject.columnHeadlines.slice(2);\r\n\r\n setTargetColumnHeadlines(updatedColumnHeadlines);\r\n setSelectedTargetColumnHeadline(updatedColumnHeadlines[0]);\r\n\r\n setProjectData(projectData);\r\n const validProjects = [];\r\n for (const projectId of Object.keys(projectData)) {\r\n const entryProject = projects.find((p) => p.id === projectId);\r\n validProjects.push(entryProject);\r\n }\r\n setSelectedProjects(validProjects);\r\n setSelectedProjectsFailed(failedProjects);\r\n });\r\n }\r\n }\r\n }, [open]);\r\n\r\n const onDragEnd = (result) => {\r\n // Dropped outside the list or in the same place\r\n if (\r\n !result.destination ||\r\n result.source.index === result.destination.index\r\n ) {\r\n return;\r\n }\r\n\r\n const newSelectedProjects = Array.from(selectedProjects);\r\n const [movedItem] = newSelectedProjects.splice(result.source.index, 1);\r\n newSelectedProjects.splice(result.destination.index, 0, movedItem);\r\n\r\n setSelectedProjects(newSelectedProjects);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n Create Timeline Chart\r\n \r\n
\r\n {/* dropdown to select the column headline to use for the timeline chart */}\r\n\r\n setSelectedTargetColumnHeadline(e.target.value)}\r\n >\r\n {targetColumnHeadlines.map((columnHeadline) => (\r\n \r\n {columnHeadline}\r\n \r\n ))}\r\n \r\n\r\n \r\n \r\n {(provided) => (\r\n \r\n {selectedProjects.map((project, index) => (\r\n \r\n {(provided) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n ))}\r\n {provided.placeholder}\r\n \r\n )}\r\n \r\n \r\n
\r\n {selectedProjectsFailed.length > 0 && (\r\n
\r\n Project results could not be loaded properly and will not be\r\n included in Chart:\r\n
\r\n )}\r\n\r\n \r\n {selectedProjectsFailed.map((project) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nCreateTimeLineChartDialog.propTypes = {\r\n open: PropTypes.bool.isRequired,\r\n close: PropTypes.func.isRequired,\r\n selectedProjectIds: PropTypes.arrayOf(PropTypes.string),\r\n projects: PropTypes.arrayOf(PropTypes.object),\r\n};\r\n\r\nexport default CreateTimeLineChartDialog;\r\n","// Copyright HS-Analysis GmbH, 2019\r\n\r\n// Framework imports\r\nimport { withRouter } from \"react-router-dom\";\r\nimport PropTypes from \"prop-types\";\r\nimport React, { useRef } from \"react\";\r\n\r\n// External imports\r\nimport classNames from \"classnames\";\r\n\r\n// Material UI imports\r\nimport { lighten, darken } from \"@mui/material/styles\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport CloudDownload from \"@mui/icons-material/CloudDownload\";\r\nimport CloudUpload from \"@mui/icons-material/CloudUpload\";\r\nimport CustomSvgIcon from \"../../globalComponents/CustomSvgIcon\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\nimport FileCopy from \"@mui/icons-material/FileCopy\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport LinearProgress from \"@mui/material/LinearProgress\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport PlayArrowIcon from \"@mui/icons-material/PlayArrow\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport Stop from \"@mui/icons-material/Stop\";\r\nimport Tab from \"@mui/material/Tab\";\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 TablePagination from \"@mui/material/TablePagination\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport TableSortLabel from \"@mui/material/TableSortLabel\";\r\nimport TimelineIcon from \"@mui/icons-material/Timeline\";\r\nimport Tabs from \"@mui/material/Tabs\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport TimerIcon from \"@mui/icons-material/Timer\";\r\nimport Toolbar from \"@mui/material/Toolbar\";\r\nimport Tooltip from \"@mui/material/Tooltip\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\n// HSA imports\r\nimport \"./../../css/tooltip.css\";\r\nimport { convertDate, viewerType } from \"../../common/utils/Utils\";\r\nimport { withSpinloader } from \"../../common/components/Spinloader\";\r\nimport Backend from \"../../common/utils/Backend\";\r\nimport FindFilesDialog, { ProjectActionMode } from \"../dialogs/FindFilesDialog\";\r\nimport CreateTimeLineChartDialog from \"../dialogs/CreateTimeLineChartDialog\";\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 display: \"grid\",\r\n gridTemplateColumns: \"80px 1fr auto\",\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 onCreateTimeLineChartClick,\r\n selected,\r\n projects,\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 const initTimelineButton = (numSelected, projects, selected) => {\r\n let timeLineButtonTooltip = \"Create Timeline Chart (2 selections required)\";\r\n let timeLineButtonDisabled = true;\r\n if (numSelected > 1) {\r\n const selectedProjects = projects.filter((project) => {\r\n return selected.includes(project.id);\r\n });\r\n const selectedProjectType = selectedProjects[0].type;\r\n let projectTypeEqual = true;\r\n let projectTypeSupported = true;\r\n let allProjectsFinished = true;\r\n let notSupportedMethod = \"\";\r\n\r\n const supportedProjectTypes = [\"Fungilyzer\"];\r\n // check if all selected projects have the same type\r\n for (let i = 1; i < selectedProjects.length; i++) {\r\n if (selectedProjects[i].type !== selectedProjectType) {\r\n projectTypeEqual = false;\r\n }\r\n if (selectedProjects[i].state !== \"success\") {\r\n allProjectsFinished = false;\r\n }\r\n // check if all selected projects are supported\r\n if (!supportedProjectTypes.includes(selectedProjects[i].type)) {\r\n notSupportedMethod = selectedProjects[i].type;\r\n projectTypeSupported = false;\r\n }\r\n }\r\n if (!allProjectsFinished) {\r\n timeLineButtonTooltip =\r\n \"Create Timeline Chart (All projects must be finished)\";\r\n } else if (!projectTypeEqual) {\r\n timeLineButtonTooltip = \"Create Timeline Chart (Method must be equal)\";\r\n } else if (!projectTypeSupported) {\r\n timeLineButtonTooltip =\r\n \"Create Timeline Chart (\" + notSupportedMethod + \" not supported)\";\r\n } else {\r\n timeLineButtonDisabled = false;\r\n timeLineButtonTooltip = \"Create Timeline Chart\";\r\n }\r\n }\r\n return [timeLineButtonDisabled, timeLineButtonTooltip];\r\n };\r\n\r\n const [timeLineButtonDisabled, timeLineButtonTooltip] = initTimelineButton(\r\n numSelected,\r\n projects,\r\n selected\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 {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 \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 onCreateTimeLineChartClick: PropTypes.func,\r\n selected: PropTypes.arrayOf(PropTypes.string),\r\n projects: PropTypes.arrayOf(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 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((project) => {\r\n return this.isJobVisible(project);\r\n })\r\n .map((project) => project.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 window.showWarningSnackbar(\"Local API Server not ready!\");\r\n return;\r\n }\r\n this.props.spinloader.show();\r\n Backend.requestProject(\r\n project.id,\r\n (res) => {\r\n this.props.spinloader.hide();\r\n if (!res.newMappingsFound && res.allUniquelyMapped) {\r\n this.props.history.push(viewerType(project.type) + project.id);\r\n return;\r\n }\r\n this.FindMissingFiles.show(res, () =>\r\n this.props.history.push(viewerType(project.type) + project.id)\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 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 onProjectStateClick = (e, id) => {\r\n e.stopPropagation();\r\n Backend.loadProjectMessage(id)\r\n .then((jsonResponse) => {\r\n if (jsonResponse.message) {\r\n console.log(jsonResponse.message);\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(\"Error:\", error);\r\n });\r\n };\r\n\r\n onProjectErrorStateClick = (e, id) => {\r\n e.stopPropagation();\r\n Backend.loadProjectMessage(id)\r\n .then((jsonResponse) => {\r\n if (jsonResponse.message) {\r\n window.openErrorDialog(jsonResponse.message);\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(\"Error:\", error);\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 this.onProjectStateClick(e, project.id)}\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 this.onProjectStateClick(e, project.id)}\r\n >\r\n \r\n
{project.progress}%
\r\n \r\n \r\n );\r\n case \"success\":\r\n return (\r\n this.onProjectStateClick(e, project.id)}\r\n >\r\n Finished\r\n \r\n );\r\n case \"error\":\r\n return (\r\n this.onProjectErrorStateClick(e, project.id)}\r\n >\r\n {project.state}\r\n \r\n );\r\n default:\r\n return (\r\n this.onProjectStateClick(e, project.id)}>\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 isJobVisible = (row) => {\r\n const { activeTab } = this.props;\r\n const { searchText } = this.state;\r\n let showJob = false;\r\n //filter if pending or finished\r\n if (searchText !== \"\") {\r\n if (!row.name.toLowerCase().includes(searchText.toLowerCase())) {\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\r\n openCreateTimeLineDialog = () => {\r\n this.setState({ createTimeLineChartDialogIsOpen: true });\r\n };\r\n\r\n closeCreateTimeLineDialog = () => {\r\n this.setState({ createTimeLineChartDialogIsOpen: false });\r\n };\r\n\r\n render() {\r\n const { classes, projects, activeTab } = this.props;\r\n const {\r\n order,\r\n orderBy,\r\n selected,\r\n rowsPerPage,\r\n page,\r\n searchText,\r\n createTimeLineChartDialogIsOpen = false,\r\n } = this.state;\r\n\r\n const sortedProjects = stableSort(\r\n projects,\r\n getSorting(order, orderBy)\r\n ).filter((row) => {\r\n return this.isJobVisible(row);\r\n });\r\n\r\n return (\r\n \r\n (this.ImportProjectsDialog = c)}\r\n projectActionMode={ProjectActionMode.Import}\r\n />\r\n (this.FindMissingFiles = c)}\r\n projectActionMode={ProjectActionMode.Update}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {sortedProjects.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) => this.handleContextmenu(event, n)}\r\n >\r\n \r\n this.handleSelectOneClick(event, 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","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\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 this.refreshProjectsInterval();\r\n }\r\n\r\n componentWillUnmount() {\r\n this._isMounted = false;\r\n clearInterval(this.refreshInterval);\r\n }\r\n\r\n refreshProjectsInterval() {\r\n this.refreshProjects(() => {\r\n setTimeout(() => this.refreshProjectsInterval(), 1000);\r\n });\r\n }\r\n\r\n refreshProjects(callback) {\r\n if (!this._isMounted) return;\r\n Backend.listProjects(\r\n (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 callback();\r\n },\r\n (error) => {\r\n if (this._isMounted && callback) {\r\n console.error(\r\n \"Error loading projects, reloading page might help. Error: \" + error\r\n );\r\n callback();\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","// Framework imports\r\nimport React, { Component } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\n// External npm packages\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 {\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 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\nimport withStyles from \"@mui/styles/withStyles\";\r\n\r\n// HSA Packages\r\nimport Backend from \"../utils/Backend\";\r\nimport { authenticationService } from \"../services\";\r\nimport { Role, history } from \"../utils\";\r\nimport { viewerType } from \"../utils/Utils\";\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 =\r\n pathname.includes(\"/view/\") || pathname.includes(\"/esr_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 Backend.loadProject({ id: uuid }, (project) => {\r\n this.setMountedState({\r\n extraButtonState: \"project\",\r\n projectPath: viewerType(project.type) + uuid,\r\n });\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 filteredWorkflows: [],\r\n };\r\n this.scrollRef = React.createRef();\r\n Backend.getAbout((result) => {\r\n this.setState(result);\r\n this.setProjectTypeWorkflows(result);\r\n });\r\n }\r\n\r\n setProjectTypeWorkflows = (aboutResult) => {\r\n if (aboutResult.workflows) {\r\n const workflows = aboutResult.workflows;\r\n Backend.getLicensingInfo((license) => {\r\n let filteredWorkflows = [];\r\n if (license.activeModules.length > 0) {\r\n filteredWorkflows = workflows.filter((workflow) => {\r\n return license.activeModules.some((activeModule) =>\r\n workflow\r\n .toLowerCase()\r\n .includes(activeModule.label.substring(0, 20).toLowerCase())\r\n );\r\n });\r\n } else {\r\n filteredWorkflows = workflows;\r\n }\r\n\r\n this.setState({ filteredWorkflows });\r\n });\r\n }\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 filteredWorkflows,\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 content: \"\",\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 icon: {\r\n main: \"rgba(0, 0, 0, 0.54)\",\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":""}