From e6992721392047940262d3155d571aa25ed5bd97 Mon Sep 17 00:00:00 2001 From: Xiao Gui Date: Mon, 22 Jul 2024 15:17:53 +0200 Subject: [PATCH 1/2] fix: gcs json API feat: (experimental) .pointcloud drag and drop --- .github/workflows/docker_img.yml | 2 +- docs/releases/v2.14.6.md | 10 +++++++ mkdocs.yml | 1 + package-lock.json | 8 ++--- package.json | 4 +-- .../sapi/core/space/interspaceLinearXform.ts | 27 +++++++++++++++-- src/viewerModule/nehuba/userLayers/service.ts | 30 +++++++++++++++++++ 7 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 docs/releases/v2.14.6.md diff --git a/.github/workflows/docker_img.yml b/.github/workflows/docker_img.yml index 77e1c8f70..54c2713df 100644 --- a/.github/workflows/docker_img.yml +++ b/.github/workflows/docker_img.yml @@ -175,7 +175,7 @@ jobs: - setting-vars uses: ./.github/workflows/deploy-helm.yml with: - DEPLOYMENT_NAME: master + DEPLOYMENT_NAME: prod IMAGE_TAG: ${{ needs.setting-vars.outputs.SXPLR_VERSION }} IMAGE_DIGEST: ${{ needs.build-docker-img.outputs.GIT_DIGEST }} secrets: diff --git a/docs/releases/v2.14.6.md b/docs/releases/v2.14.6.md new file mode 100644 index 000000000..cf575c992 --- /dev/null +++ b/docs/releases/v2.14.6.md @@ -0,0 +1,10 @@ +# v2.14.6 + +## Feature + +- (experimental) support `.pointcloud` drag-and-drop + +## Bugfix + +- Fixed dependency support for new GCS JSON API + diff --git a/mkdocs.yml b/mkdocs.yml index 6d2a03c78..dfd714d80 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -45,6 +45,7 @@ nav: - Differential gene expression analysis: "advanced/differential_gene_expression_analysis.md" - Release notes: + - v2.14.6: 'releases/v2.14.6.md' - v2.14.5: 'releases/v2.14.5.md' - v2.14.4: 'releases/v2.14.4.md' - v2.14.3: 'releases/v2.14.3.md' diff --git a/package-lock.json b/package-lock.json index 2fd6dcfa8..01873b6c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "@ngrx/effects": "^15.4.0", "@ngrx/store": "^15.4.0", "acorn": "^8.4.1", - "export-nehuba": "^0.1.5", + "export-nehuba": "^0.1.8", "file-loader": "^6.2.0", "jszip": "^3.6.0", "postcss": "^8.3.6", @@ -7646,9 +7646,9 @@ "dev": true }, "node_modules/export-nehuba": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/export-nehuba/-/export-nehuba-0.1.7.tgz", - "integrity": "sha512-LakXeWGkEtHwWrV69snlM2GGmeVP+jGnTaevOpWQJePkdkPq6DvCkCSH0mLBriR8yOPyO0e+VHuE3V4AnV4fPA==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/export-nehuba/-/export-nehuba-0.1.8.tgz", + "integrity": "sha512-A5RijEUDqhv09yAOeVb2AxS36YmJNyWXRmcImPFSGgLq9bP8bcjrHIbmBOsEX9ntAKwwaHNvlVVmDSwHnGqFug==", "dependencies": { "pako": "^1.0.6" } diff --git a/package.json b/package.json index 4f08a89b8..dfe5f4708 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "siibra-explorer", - "version": "2.14.5", + "version": "2.14.6", "description": "siibra-explorer - explore brain atlases. Based on humanbrainproject/nehuba & google/neuroglancer. Built with angular", "scripts": { "lint": "eslint src --ext .ts", @@ -55,7 +55,7 @@ "@ngrx/effects": "^15.4.0", "@ngrx/store": "^15.4.0", "acorn": "^8.4.1", - "export-nehuba": "^0.1.5", + "export-nehuba": "^0.1.8", "file-loader": "^6.2.0", "jszip": "^3.6.0", "postcss": "^8.3.6", diff --git a/src/atlasComponents/sapi/core/space/interspaceLinearXform.ts b/src/atlasComponents/sapi/core/space/interspaceLinearXform.ts index 1ccda890a..70d915215 100644 --- a/src/atlasComponents/sapi/core/space/interspaceLinearXform.ts +++ b/src/atlasComponents/sapi/core/space/interspaceLinearXform.ts @@ -1,4 +1,4 @@ -const VALID_XFORM_SRC = ["CCF_V2_5", "QUICKNII_ABA"] as const +const VALID_XFORM_SRC = ["CCF_V2_5", "QUICKNII_ABA", "MNI152", "CYRIL_PTCLD"] as const const VALID_XFORM_DST = ["NEHUBA"] as const export type TVALID_LINEAR_XFORM_SRC = typeof VALID_XFORM_SRC[number] @@ -12,6 +12,29 @@ const _linearXformDict: Record< TVALID_LINEAR_XFORM_DST, TLinearXform >> = { + CYRIL_PTCLD: { + NEHUBA: + // [ + // [-0.2, 0.0, 0.0, 96400000.0], + // [0.0, -0.2, 0.0, 96400000.0], + // [0.0, 0.0, -0.2, 114400000.0], + // [0.0, 0.0, 0.0, 1.0] + // ] + [ + [-1,0,0,96_500_000], + [0,-1,0,229_000_000 - 132_500_000], + [0,0,-1,193_000_000 - 78_500_000], + [0,0,0,1] + ] + }, + MNI152: { + NEHUBA: [ + [1,0,0,-96_500_000], + [0,1,0,-132_500_000], + [0,0,1,-78_500_000], + [0,0,0,1] + ] + }, CCF_V2_5: { NEHUBA: [ [-1e3, 0, 0, 11400000 - 5737500], // @@ -31,7 +54,7 @@ const _linearXformDict: Record< } } -const defaultXform = [ +export const defaultXform = [ [1e3, 0, 0, 0], [0, 1e3, 0, 0], [0, 0, 1e3, 0], diff --git a/src/viewerModule/nehuba/userLayers/service.ts b/src/viewerModule/nehuba/userLayers/service.ts index 4451a1342..9f31252b6 100644 --- a/src/viewerModule/nehuba/userLayers/service.ts +++ b/src/viewerModule/nehuba/userLayers/service.ts @@ -327,6 +327,36 @@ export class UserLayerService implements OnDestroy { } } + @RegisterSource(async input => { + if (input instanceof File && input.name.endsWith(".pointcloud")) { + return true + } + return false + }) + async processPtCld(file: File): Promise{ + + const layers: AnnotationLayer[] = [] + const text = await file.text() + + const id = getUuid() + const xform = await linearTransform("CYRIL_PTCLD", "NEHUBA") + const layer = new AnnotationLayer(id, "#ff0000", xform) + + layer.addAnnotation(text.split("\n").map((line, idx) => ({ + id: `${id}-${idx}`, + type: "point", + point: line.split(" ").map(v => parseFloat(v)*1e6) as [number, number, number], + }))) + return { + cleanup: () => { + layer.dispose() + }, + meta: { + filename: file.name, + } + } + } + async #processInput(input: ValidInputTypes): Promise { for (const { matcher, processor } of SOURCE_PROCESSOR) { if (await matcher(input)) { From f9a9fc0161f80fd02697736c39afa09eea523b19 Mon Sep 17 00:00:00 2001 From: Xiao Gui Date: Mon, 22 Jul 2024 15:21:53 +0200 Subject: [PATCH 2/2] fix lint --- src/features/feature-view/feature-view.component.ts | 2 +- src/viewerModule/nehuba/userLayers/service.ts | 1 - .../threeSurfer/threeSurferGlue/threeSurfer.component.ts | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/features/feature-view/feature-view.component.ts b/src/features/feature-view/feature-view.component.ts index 5897f9ebe..9fb77a973 100644 --- a/src/features/feature-view/feature-view.component.ts +++ b/src/features/feature-view/feature-view.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, Inject, Input, inject } from '@angular/core'; -import { BehaviorSubject, EMPTY, Observable, combineLatest, concat, of } from 'rxjs'; +import { BehaviorSubject, Observable, combineLatest, concat, of } from 'rxjs'; import { catchError, debounceTime, distinctUntilChanged, filter, map, shareReplay, switchMap, takeUntil, withLatestFrom } from 'rxjs/operators'; import { SAPI } from 'src/atlasComponents/sapi/sapi.service'; import { Feature, SimpleCompoundFeature, VoiFeature } from 'src/atlasComponents/sapi/sxplrTypes'; diff --git a/src/viewerModule/nehuba/userLayers/service.ts b/src/viewerModule/nehuba/userLayers/service.ts index 9f31252b6..e3da1416e 100644 --- a/src/viewerModule/nehuba/userLayers/service.ts +++ b/src/viewerModule/nehuba/userLayers/service.ts @@ -335,7 +335,6 @@ export class UserLayerService implements OnDestroy { }) async processPtCld(file: File): Promise{ - const layers: AnnotationLayer[] = [] const text = await file.text() const id = getUuid() diff --git a/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.component.ts b/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.component.ts index 68822f1b2..d857a0fb3 100644 --- a/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.component.ts +++ b/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.component.ts @@ -739,7 +739,6 @@ export class ThreeSurferGlueCmp implements IViewer<'threeSurfer'>, AfterViewInit const { geometry: evGeometry, - verticesIndicies: evVerticesIndicies, vertexIndex } = detail.mesh as { geometry: TThreeGeometry, verticesIndicies: number[], vertexIndex: number }