dicom-extractor-2023/warchive.py

220 lines
7.4 KiB
Python

import os
import glob
import threading
import time
import pydicom
import shutil
import random
import ctypes
from registry import Registry
from PyQt6.QtWidgets import QDialog
from PyQt6.QtWidgets import QLabel
from PyQt6.QtWidgets import QPushButton
from PyQt6.QtWidgets import QStyle
class wArchive(QDialog):
def __init__(self):
super().__init__()
self.setFixedSize(400, 400)
self.setWindowTitle("Archiviere...")
self.setStyleSheet("background-color: white")
pixmap = QStyle.StandardPixmap.SP_DriveNetIcon
icon = self.style().standardIcon(pixmap)
self.setWindowIcon(icon)
column1w = 180
column2s = column1w + 20
column2w = 400 - column2s - 10
self.lLine1 = QLabel("Starte Archivierung:", self)
self.lLine1.setGeometry(10, 10, column1w, 20)
self.tLine1 = QLabel("", self)
self.tLine1.setGeometry(column2s, 10, column2w, 20)
self.lLine2 = QLabel("Pfad zum Archiv:", self)
self.lLine2.setGeometry(10, 30, column1w, 20)
self.tLine2 = QLabel("", self)
self.tLine2.setGeometry(column2s, 30, column2w, 20)
self.lLine3 = QLabel("CD-Rom-Laufwerk:", self)
self.lLine3.setGeometry(10, 50, column1w, 20)
self.tLine3 = QLabel("", self)
self.tLine3.setGeometry(column2s, 50, column2w, 20)
self.lLine4 = QLabel("DICOMDIR-Datei gefunden:", self)
self.lLine4.setGeometry(10, 70, column1w, 20)
self.tLine4 = QLabel("", self)
self.tLine4.setGeometry(column2s, 70, column2w, 20)
self.lLine5 = QLabel("DICOM-Verzeichnis gefunden:", self)
self.lLine5.setGeometry(10, 90, column1w, 20)
self.tLine5 = QLabel("", self)
self.tLine5.setGeometry(column2s, 90, column2w, 20)
self.lLine6 = QLabel("Archiv beschreibbar:", self)
self.lLine6.setGeometry(10, 110, column1w, 20)
self.tLine6 = QLabel("", self)
self.tLine6.setGeometry(column2s, 110, column2w, 20)
self.lLine7 = QLabel("DICOM-Dateien gefunden:", self)
self.lLine7.setGeometry(10, 130, column1w, 20)
self.tLine7 = QLabel("", self)
self.tLine7.setGeometry(column2s, 130, column2w, 20)
self.lLine8 = QLabel("Name:", self)
self.lLine8.setGeometry(10, 150, column1w, 20)
self.tLine8 = QLabel("", self)
self.tLine8.setGeometry(column2s, 150, column2w, 20)
self.lLine9 = QLabel("Geburtsdatum:", self)
self.lLine9.setGeometry(10, 170, column1w, 20)
self.tLine9 = QLabel("", self)
self.tLine9.setGeometry(column2s, 170, column2w, 20)
self.lLine10 = QLabel("Dateien:", self)
self.lLine10.setGeometry(10, 190, column1w, 20)
self.tLine10 = QLabel("", self)
self.tLine10.setGeometry(column2s, 190, column2w, 20)
self.bArchive = QPushButton("Archivieren", self)
self.bArchive.setGeometry(10, 350, 380, 40)
self.bArchive.setEnabled(False)
self.bArchive.clicked.connect(self.copyData)
archive = threading.Thread(target=self.archive)
archive.start()
time.sleep(0.1)
self.exec()
def archive(self):
okay = ""
notokay = ""
self.tLine1.setText(okay)
self.tLine1.setStyleSheet("color: green")
reg = Registry()
self.ArchivePath, self.CDRomPath = reg.regRead()
self.tLine2.setText(self.ArchivePath)
self.tLine3.setText(self.CDRomPath + ":\\")
# Logic
dicomfile = False
dicomdir = False
target_writable = False
has_dicom_files = False
has_pName = False
has_pBirth = False
# Check if DICOMDIR file exists
if os.path.isfile(os.path.join(self.CDRomPath + ":", os.sep, "DICOMDIR")):
dicomfile = True
self.tLine4.setText(okay)
self.tLine4.setStyleSheet("color: green")
else:
self.tLine4.setText(notokay)
self.tLine4.setStyleSheet("color: red")
# Check if DICOM directory exists
if os.path.isdir(os.path.join(self.CDRomPath + ":", os.sep, "DICOM")):
dicomdir = True
self.tLine5.setText(okay)
self.tLine5.setStyleSheet("color: green")
else:
self.tLine5.setText(notokay)
self.tLine5.setStyleSheet("color: red")
# Check if ArchivePath is writable
if os.access(self.ArchivePath, os.W_OK) is True:
target_writable = True
self.tLine6.setText(okay)
self.tLine6.setStyleSheet("color: green")
else:
self.tLine6.setText(notokay)
self.tLine6.setStyleSheet("color: red")
# List of all files under DICOM directory
path = os.path.join(self.CDRomPath + ":", os.sep, "DICOM")
self.files = []
for x in os.walk(path):
for y in glob.glob(os.path.join(x[0], "*")):
if os.path.isfile(y):
self.files.append(y)
# Get PatientsName from first file
self.pName = ""
self.pBirth = ""
try:
dicom = pydicom.read_file(self.files[0])
self.pName = str(dicom.PatientName)
self.pBirth = str(dicom.PatientBirthDate)
has_dicom_files = True
has_pName = True
has_pBirth = True
self.tLine7.setText(okay)
self.tLine7.setStyleSheet("color: green")
except:
self.tLine7.setText(notokay)
self.tLine7.setStyleSheet("color: red")
# Output pName and pBirth
if self.pName and self.pBirth:
self.tLine8.setText(self.pName)
self.tLine8.setStyleSheet("color: green")
self.tLine9.setText(self.pBirth)
self.tLine9.setStyleSheet("color: green")
else:
self.tLine8.setText(notokay)
self.tLine8.setStyleSheet("color: red")
self.tLine9.setText(notokay)
self.tLine9.setStyleSheet("color: red")
# Output file count
self.tLine10.setText(str(len(self.files)))
# Activate bArchive
if dicomfile and dicomdir and target_writable and has_dicom_files and has_pBirth and has_pName:
self.bArchive.setEnabled(True)
def copyData(self):
self.bArchive.setEnabled(False)
source = self.files
# LastName^FirstName^Birth
mainFolder = os.path.join(self.ArchivePath, self.pName + "^" + self.pBirth)
try:
os.mkdir(mainFolder)
except:
pass
# LastName^FirstName^Birth\1234
subFolder = self.randomString(4)
os.mkdir(os.path.join(mainFolder, subFolder))
filename = 1
for file in source:
shutil.copy(file, os.path.join(mainFolder, subFolder, str(filename)))
filename += 1
# Eject CD
ctypes.windll.WINMM.mciSendStringW(u"set cdaudio door open", None, 0, None)
self.close()
@staticmethod
def randomString(length):
string = ""
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
for _ in range(length):
char = random.choice(chars)
string = string + char
return string