CT DICOM fájlok megjelenítése és implantátum tervezés — önálló alkalmazásként fejleszthető, később git submodule-ként integrálható a DentalQuoteCreatorba (ahogy az odontogram és a dq-importer modul is).
- DICOM fájlok betöltése — lokális fájlrendszerből (drag & drop / file picker)
- 2D nézetek — axiális, koronális, szagittális síkok (MPR)
- 3D rekonstrukció — Volume rendering a CT adatokból
- Implantátum tervezés — implantátum pozícionálás, méretezés, szögezés
- Mérőeszközök — távolság, szög, terület, denzitás (HU) mérés
- Annotációk — megjegyzések, jelölések a képeken
- Export — tervek mentése/betöltése, képernyőkép export (PNG/PDF)
A DentalQuoteCreator-ral kompatibilis stack:
| Réteg | Technológia | Indoklás |
|---|---|---|
| Framework | React 18 + TypeScript | DQC kompatibilitás |
| Build | Vite | DQC kompatibilitás |
| Styling | Tailwind CSS | DQC kompatibilitás |
| DICOM parsing | @cornerstonejs/dicom-image-loader + dicom-parser | Iparági standard, aktívan fejlesztett |
| 2D rendering | @cornerstonejs/core + @cornerstonejs/tools | MPR nézetek, mérőeszközök |
| 3D rendering | @cornerstonejs/streaming-image-volume-loader + vtk.js | Volume rendering (Cornerstone3D VTK-ra épül) |
| State mgmt | React Context (később Zustand ha kell) | DQC pattern |
| i18n | Saját, DQC-kompatibilis | HU/EN/DE |
- A Cornerstone3D a legérettebb nyílt forráskódú orvosi képmegjelenítő library
- Natív TypeScript support
- Beépített MPR, volume rendering, annotációk, mérőeszközök
- Aktív community és OHIF viewer használja
DQ-Dicom-Viewer/
├── package.json
├── vite.config.ts
├── tsconfig.json
├── tailwind.config.js
├── index.html # Standalone dev entry
├── public/
│ └── sample-data/ # Teszt DICOM fájlok (gitignored)
├── src/
│ ├── main.tsx # Standalone app entry point
│ ├── App.tsx # Shell integrációs entry point
│ ├── types/
│ │ ├── dicom.ts # DICOM metadata típusok
│ │ ├── implant.ts # Implantátum típusok (méret, típus, gyártó)
│ │ └── plan.ts # Tervezési session típusok
│ ├── context/
│ │ ├── ViewerContext.tsx # Viewport állapot, aktív tool, layout
│ │ └── PlanContext.tsx # Implantátum terv állapot
│ ├── core/
│ │ ├── init.ts # Cornerstone3D inicializálás
│ │ ├── dicomLoader.ts # DICOM fájl betöltés és volume építés
│ │ ├── volumeBuilder.ts # Volume rekonstrukció logika
│ │ └── toolManager.ts # Tool regisztráció és kezelés
│ ├── components/
│ │ ├── layout/
│ │ │ ├── ViewerShell.tsx # Fő layout wrapper
│ │ │ ├── Toolbar.tsx # Felső eszköztár
│ │ │ └── SidePanel.tsx # Jobb oldali panel (DICOM info, implant props)
│ │ ├── viewport/
│ │ │ ├── ViewportGrid.tsx # 1x1, 2x2, 1+3 layout manager
│ │ │ ├── Viewport2D.tsx # Egyedi 2D nézet (axial/coronal/sagittal)
│ │ │ ├── Viewport3D.tsx # 3D volume rendering nézet
│ │ │ └── ViewportOverlay.tsx # HU érték, pozíció, window/level kijelzés
│ │ ├── tools/
│ │ │ ├── MeasurementTools.tsx # Távolság, szög mérők UI
│ │ │ ├── WindowLevel.tsx # Ablakszélesség/szint presetjei
│ │ │ └── CrosshairSync.tsx # Szálkereszt szinkronizáció
│ │ ├── implant/
│ │ │ ├── ImplantLibrary.tsx # Implantátum katalógus
│ │ │ ├── ImplantPlacer.tsx # Implantátum pozícionáló
│ │ │ ├── ImplantProperties.tsx # Kiválasztott implantátum tulajdonságai
│ │ │ ├── NerveCanal.tsx # Nervus alveolaris inferior jelölés
│ │ │ └── BoneAnalysis.tsx # Csont denzitás/vastagság elemzés
│ │ ├── dicom/
│ │ │ ├── FileDropZone.tsx # Drag & drop DICOM import
│ │ │ ├── SeriesList.tsx # DICOM sorozat lista
│ │ │ └── DicomTagBrowser.tsx # DICOM tag böngésző
│ │ └── export/
│ │ ├── PlanExport.tsx # Terv export (JSON + képek)
│ │ └── ScreenCapture.tsx # Viewport screenshot
│ ├── data/
│ │ └── implants/
│ │ ├── straumann.json # Straumann implantátum méretek
│ │ ├── nobel-biocare.json # Nobel Biocare méretek
│ │ └── megagen.json # MegaGen méretek
│ ├── hooks/
│ │ ├── useViewport.ts # Viewport kezelő hook
│ │ ├── useDicomLoader.ts # Fájl betöltés hook
│ │ ├── useImplantPlacement.ts # Implantátum elhelyezés logika
│ │ └── useMeasurements.ts # Mérések kezelése
│ ├── utils/
│ │ ├── dicomUtils.ts # DICOM tag kinyerés, sorozat csoportosítás
│ │ ├── geometryUtils.ts # 3D geometria számítások
│ │ └── exportUtils.ts # Export segédfüggvények
│ └── i18n/
│ ├── hu.ts
│ ├── en.ts
│ └── de.ts
└── .gitignore
- Projekt scaffold (Vite + React + TS + Tailwind)
- Cornerstone3D inicializálás és konfiguráció
- DICOM fájl betöltés (drag & drop, file picker)
- DICOM sorozat felismerés és csoportosítás (SeriesInstanceUID alapján)
- Egyedi 2D viewport (axiális nézet)
- Window/Level kezelés (egér interakció + preset-ek: csont, lágyrész, stb.)
- Alapvető navigáció (scroll a szeleteken, zoom, pan)
- DICOM tag megjelenítés overlay-ben (beteg neve, vizsgálat dátuma, szeletvastagság)
- MPR (Multi-Planar Reconstruction) — axiális, koronális, szagittális nézetek
- Viewport grid layout (1x1, 2x2, 1+3 elrendezések)
- Crosshair szinkronizáció a nézetek között
- Mérőeszközök:
- Távolságmérés (mm)
- Szögmérés
- HU (Hounsfield Unit) érték kijelzés
- Terület/profil mérés
- Annotációk (szöveg, nyíl)
- Volume rekonstrukció a CT szeletekből
- 3D nézet (VTK.js volume rendering)
- Transfer function preset-ek (csont, fogak, lágyrész, bőr)
- 3D forgatás, zoom
- Clipping plane (vágósík) a 3D modellen
- Implantátum katalógus (JSON adatbázis: Straumann, Nobel Biocare, MegaGen stb.)
- Implantátum elhelyezés a 2D nézeteken (pozíció + szög)
- Implantátum megjelenítés mind a 3 MPR síkban + 3D-ben
- Nervus alveolaris inferior (alsó fogideg) manuális jelölés
- Csont denzitás elemzés az implantátum körül (D1-D4 osztályozás)
- Csont vastagság mérés az implantátum vonalában
- Több implantátum kezelése egy tervben
- Abutment választás és megjelenítés
- Terv mentés/betöltés (JSON formátum)
- Screenshot export (PNG) az aktív nézetekből
- PDF report generálás (beteg adatok + terv képek + méretek)
- DentalQuoteCreator integráció:
- Git submodule beállítás
- Path alias a DQC tsconfig-ban:
@dq-dicom → src/modules/dq-dicom-viewer/src - Entry point:
App.tsxkomponens exportálás - Beteg kontextus fogadása props-ként (PatientId, név)
- Terv mentés callback a DQC felé
A meglévő submodule pattern-t követve:
# .gitmodules-ba kerül (DentalQuoteCreator oldalon):
[submodule "dq-dicom-viewer"]
path = src/modules/dq-dicom-viewer
url = https://github.com/ZoliQua/DQ-Dicom-Viewer.git
// DQC tsconfig.json — új path alias:
"@dq-dicom": ["src/modules/dq-dicom-viewer/src"]
// DQC vite.config.ts — ha kell saját backend:
"/api/dicom/*": { target: "http://localhost:3335" }
// DQC App.tsx — új route:
<Route path="/dicom-viewer" element={
<Guard permission="dicom.view">
<DicomViewerPage />
</Guard>
} />Az App.tsx exportál egy DicomViewer komponenst ami props-ként fogadja:
interface DicomViewerProps {
patientId?: string;
patientName?: string;
onPlanSaved?: (plan: ImplantPlan) => void;
embedded?: boolean; // ha true, nincs saját header/nav
}| Kihívás | Megoldás |
|---|---|
| Nagy DICOM fájlok (CT = 200-500 MB) | Streaming betöltés, Web Worker-ek, progressive rendering |
| WebGL memória limit | Volume decimálás, LOD (Level of Detail), viewport cleanup |
| Cornerstone3D Vite kompatibilitás | SharedArrayBuffer polyfill, COOP/COEP headerek konfigurálása |
| Implantátum geometria pontos pozícionálás | Cornerstone3D custom annotation tool |
| Cross-origin isolation (SharedArrayBuffer) | Vite dev server header config + production .htaccess |
Az 1. fázissal érdemes kezdeni — ez adja az összes többi fázis alapját. Amint egy DICOM fájl megjelenik a képernyőn és scrollozható, onnan iteratívan építhető minden más.