diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 166ca56..af1f9b8 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -72,7 +72,9 @@ "@cornerstonejs/streaming-image-volume-loader": "1.84.4", "dicomweb-client": "0.10.4", "@cornerstonejs/calculate-suv": "1.1.0", - "dcmjs": "0.34.1" + "dcmjs": "0.34.1", + "react-grid-layout": "1.4.4", + "react-resizable": "3.0.5" }, "devDependencies": { "@radix-ui/react-icons": "^1.3.0", @@ -97,4 +99,4 @@ "@types/lodash": "4.17.7", "vite-plugin-node-polyfills": "0.22.0" } -} +} \ No newline at end of file diff --git a/apps/desktop/src/components/base/SideBarLeft/constant.tsx b/apps/desktop/src/components/base/SideBarLeft/constant.tsx index abaebfc..f7215dd 100644 --- a/apps/desktop/src/components/base/SideBarLeft/constant.tsx +++ b/apps/desktop/src/components/base/SideBarLeft/constant.tsx @@ -10,7 +10,7 @@ import { export const menuItems: MenuItem[] = [ { to: "/", name: "自动分析", icon: }, { to: "/datasource", name: "数据列表", icon: }, - { to: "/viewer", name: "MPR阅片", icon: }, + // { to: "/viewer", name: "MPR阅片", icon: }, { to: "/models", name: "模型管理", icon: }, { to: "/tools", name: "小工具", icon: }, // { to: "/setting", name: "设置", icon: }, diff --git a/apps/desktop/src/components/base/SideBarLeft/index.tsx b/apps/desktop/src/components/base/SideBarLeft/index.tsx index 5826168..51c902f 100644 --- a/apps/desktop/src/components/base/SideBarLeft/index.tsx +++ b/apps/desktop/src/components/base/SideBarLeft/index.tsx @@ -15,11 +15,10 @@ export const SideBarLeft = () => { {menuItems.map((item) => (
  • handleClick(item)} > { + const containerRef = useRef(null); const viewportRef_AXIAL = useRef(null); const viewportRef_SAGITTAL = useRef(null); const viewportRef_CORONAL = useRef(null); @@ -68,6 +75,7 @@ export const CrosshairMpr = (props: CrosshairMprProps) => { const imageIds = useRef(); const ts = "-" + Date.now(); + useEffect(() => { cornerstoneTools.addTool(StackScrollMouseWheelTool); cornerstoneTools.addTool(CrosshairsTool); @@ -219,7 +227,7 @@ export const CrosshairMpr = (props: CrosshairMprProps) => { }, [props, ts]); useEffect(() => { - const resize = () => renderingEngine.current?.resize(); + const resize = () => renderingEngine.current?.resize() window.addEventListener("resize", resize); return () => { window.removeEventListener("resize", resize); @@ -231,14 +239,16 @@ export const CrosshairMpr = (props: CrosshairMprProps) => { }; return ( -
    -
    onDBClickViewport(viewportRef_AXIAL)} - className="h-1/3 border rounded-md" - ref={viewportRef_AXIAL} - >
    -
    -
    +
    + +
    onDBClickViewport(viewportRef_AXIAL)} ref={viewportRef_AXIAL}>
    +
    + +
    +
    + +
    +
    ); }; diff --git a/apps/desktop/src/pages/Viewer/index.tsx b/apps/desktop/src/pages/Viewer/index.tsx index 8a15f58..d7f5407 100644 --- a/apps/desktop/src/pages/Viewer/index.tsx +++ b/apps/desktop/src/pages/Viewer/index.tsx @@ -3,6 +3,7 @@ import { initCornerstone } from "./MprViewer/CornerstoneDicomLoader/init"; import { CrosshairMpr } from "./MprViewer/Crosshair"; import { useEffect, useState } from "react"; + export interface CurrentDicom { SeriesInstanceUID: string | null; StudyInstanceUID: string | null; @@ -26,14 +27,16 @@ export const Viewer = () => { }, [currentDicom]); useEffect(() => { + console.log(window.location.href) initCornerstone(() => { setCornerstoneLoaded(true); }); }, []); useEffect(() => { - console.log(currentDicom, cornerstoneLoaded); - }, [cornerstoneLoaded, currentDicom]); + console.log(cornerstoneLoaded); + }, [cornerstoneLoaded]); + return (
    @@ -46,10 +49,7 @@ export const Viewer = () => { StudyInstanceUID={currentDicom.StudyInstanceUID} SeriesInstanceUID={currentDicom.SeriesInstanceUID} /> - )} -
    - - {Object.values(currentDicom).some((i) => !i) && "导入dicom"} + )}
    ); }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1123cd5..9518ae8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -175,12 +175,18 @@ importers: react-dropzone: specifier: 14.2.3 version: 14.2.3(react@18.3.1) + react-grid-layout: + specifier: 1.4.4 + version: 1.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-hook-form: specifier: 7.53.0 version: 7.53.0(react@18.3.1) react-icons: specifier: ^5.2.1 version: 5.3.0(react@18.3.1) + react-resizable: + specifier: 3.0.5 + version: 3.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-resizable-panels: specifier: ^2.1.1 version: 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -2740,6 +2746,10 @@ packages: clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + clsx@2.0.0: resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} engines: {node: '>=6'} @@ -3255,6 +3265,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-equals@4.0.3: + resolution: {integrity: sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==} + fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} @@ -4632,12 +4645,24 @@ packages: peerDependencies: react: ^18.3.1 + react-draggable@4.4.6: + resolution: {integrity: sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + react-dropzone@14.2.3: resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} engines: {node: '>= 10.13'} peerDependencies: react: '>= 16.8 || 18.0.0' + react-grid-layout@1.4.4: + resolution: {integrity: sha512-7+Lg8E8O8HfOH5FrY80GCIR1SHTn2QnAYKh27/5spoz+OHhMmEhU/14gIkRzJOtympDPaXcVRX/nT1FjmeOUmQ==} + peerDependencies: + react: '>= 16.3.0' + react-dom: '>= 16.3.0' + react-hook-form@7.53.0: resolution: {integrity: sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==} engines: {node: '>=18.0.0'} @@ -4695,6 +4720,11 @@ packages: react: ^16.14.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 + react-resizable@3.0.5: + resolution: {integrity: sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==} + peerDependencies: + react: '>= 16.3' + react-router-dom@6.26.1: resolution: {integrity: sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==} engines: {node: '>=14.0.0'} @@ -7958,7 +7988,7 @@ snapshots: app-builder-bin@4.0.0: {} - app-builder-lib@24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)): + app-builder-lib@24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)): dependencies: '@develar/schema-utils': 2.6.5 '@electron/notarize': 2.2.1 @@ -7972,7 +8002,7 @@ snapshots: builder-util-runtime: 9.2.4 chromium-pickle-js: 0.2.0 debug: 4.3.6 - dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) + dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) ejs: 3.1.10 electron-builder-squirrel-windows: 24.13.3(dmg-builder@24.13.3) electron-publish: 24.13.1 @@ -8406,6 +8436,8 @@ snapshots: dependencies: mimic-response: 1.0.1 + clsx@1.2.1: {} + clsx@2.0.0: {} clsx@2.1.1: {} @@ -8686,9 +8718,9 @@ snapshots: dlv@1.1.3: {} - dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)): + dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3): dependencies: - app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) + app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) builder-util: 24.13.1 builder-util-runtime: 9.2.4 fs-extra: 10.1.0 @@ -8758,7 +8790,7 @@ snapshots: electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3): dependencies: - app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) + app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) archiver: 5.3.2 builder-util: 24.13.1 fs-extra: 10.1.0 @@ -8768,11 +8800,11 @@ snapshots: electron-builder@24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)): dependencies: - app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) + app-builder-lib: 24.13.3(dmg-builder@24.13.3(electron-builder-squirrel-windows@24.13.3))(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) builder-util: 24.13.1 builder-util-runtime: 9.2.4 chalk: 4.1.2 - dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3(dmg-builder@24.13.3)) + dmg-builder: 24.13.3(electron-builder-squirrel-windows@24.13.3) fs-extra: 10.1.0 is-ci: 3.0.1 lazy-val: 1.0.5 @@ -9019,6 +9051,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-equals@4.0.3: {} + fast-fifo@1.3.2: {} fast-glob@3.3.2: @@ -10534,6 +10568,13 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 + react-draggable@4.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + clsx: 1.2.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-dropzone@14.2.3(react@18.3.1): dependencies: attr-accept: 2.2.2 @@ -10541,6 +10582,17 @@ snapshots: prop-types: 15.8.1 react: 18.3.1 + react-grid-layout@1.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + clsx: 2.1.1 + fast-equals: 4.0.3 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-draggable: 4.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-resizable: 3.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + resize-observer-polyfill: 1.5.1 + react-hook-form@7.53.0(react@18.3.1): dependencies: react: 18.3.1 @@ -10590,6 +10642,14 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + react-resizable@3.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + prop-types: 15.8.1 + react: 18.3.1 + react-draggable: 4.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - react-dom + react-router-dom@6.26.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.19.1