2024-07-12

QA计划整理工具,
用于将Elekta Monaco导出的Patient QA计划,按照不同患者整理到各自文件夹里面。

可以尝试使用auto-py-to-exe打包,注意在advance选项里面添加submodule:pydicom。

import os
import shutil
import pydicom
import tkinter as tk
from tkinter import filedialog, messagebox

def create_patient_folder(rt_plan_file, rt_dose_file, base_folder, patient_folders):
    ds_plan = pydicom.dcmread(rt_plan_file, force=True)
    # ds_dose = pydicom.dcmread(rt_dose_file, force=True)

    patient_id = ds_plan.PatientID
    patient_name = ds_plan.PatientName
    rt_plan_description = ds_plan.RTPlanDescription
    total_mu = round(sum(beam.BeamMeterset for beam in ds_plan.FractionGroupSequence[0].ReferencedBeamSequence))

    folder_name = f"{rt_plan_description}_{patient_id}_{patient_name}_MU_{total_mu}"
    patient_folder = os.path.join(base_folder, folder_name)

    if not os.path.exists(patient_folder):
        os.makedirs(patient_folder)

    shutil.move(rt_plan_file, os.path.join(patient_folder, os.path.basename(rt_plan_file)))
    shutil.move(rt_dose_file, os.path.join(patient_folder, os.path.basename(rt_dose_file)))

    patient_folders.append(folder_name)

def organize_files(base_folder):
    rt_plan_files = []
    rt_dose_files = []
    patient_folders = []

    for file in os.listdir(base_folder):
        file_path = os.path.join(base_folder, file)
        if file_path.endswith('.dcm'):
            ds = pydicom.dcmread(file_path, force=True)
            if ds.Modality == 'RTPLAN':
                rt_plan_files.append(file_path)
            elif ds.Modality == 'RTDOSE':
                rt_dose_files.append(file_path)

    for rt_plan_file in rt_plan_files:
        ds_plan = pydicom.dcmread(rt_plan_file, force=True)
        corresponding_dose_file = None
        for rt_dose_file in rt_dose_files:
            ds_dose = pydicom.dcmread(rt_dose_file, force=True)
            if ds_plan.PatientID == ds_dose.PatientID:
                corresponding_dose_file = rt_dose_file
                break

        if corresponding_dose_file:
            create_patient_folder(rt_plan_file, corresponding_dose_file, base_folder, patient_folders)
            rt_dose_files.remove(corresponding_dose_file)

    messagebox.showinfo("完成", "文件处理完成。")

def select_folder():
    folder_selected = filedialog.askdirectory()
    if folder_selected:
        folder_path.set(folder_selected)

def start_processing():
    base_folder = folder_path.get()
    if os.path.exists(base_folder):
        organize_files(base_folder)
    else:
        messagebox.showerror("错误", "请选择一个有效的文件夹路径")

# 创建图形界面
root = tk.Tk()
root.title("DCM 文件整理工具")

folder_path = tk.StringVar()

frame = tk.Frame(root)
frame.pack(pady=10)

folder_label = tk.Label(frame, text="文件夹路径:")
folder_label.grid(row=0, column=0, padx=5, pady=5)

folder_entry = tk.Entry(frame, textvariable=folder_path, width=50)
folder_entry.grid(row=0, column=1, padx=5, pady=5)

select_button = tk.Button(frame, text="选择文件夹", command=select_folder)
select_button.grid(row=0, column=2, padx=5, pady=5)

start_button = tk.Button(root, text="开始处理", command=start_processing)
start_button.pack(pady=10)

close_button = tk.Button(root, text="关闭", command=root.quit)
close_button.pack(pady=10)

root.mainloop()

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容

  • 打卡每日提升流程进度: 1000-359 1.睡前安宁/午间静谧/清晨唤醒(理想方向3+2)U辅助系统 2.二十年...
    番茄打卡阅读 27评论 0 1
  • 《绿茵梦想》 第一章:初次登场 在城市的边缘,有一片不起眼的足球场,那里是年轻人们挥洒汗水和梦想的地方。每到周末,...
    少年_66a9阅读 25评论 0 0
  • 《绿茵梦想》 第一章:初次登场 在城市的边缘,有一片不起眼的足球场,那里是年轻人们挥洒汗水和梦想的地方。每到周末,...
    少年_66a9阅读 35评论 0 0
  • 昨天孩子放暑假了,我不用再每天监督孩子的作业,现在应该又要把日程中每天的事项优化一下,一些没有完成的课程和笔记在这...
    桂亘阅读 41评论 0 1
  • 请大家继续按第二周共修主题梳理自己过往的人生!感受自己生活的平衡轮 1、请描述你平衡轮的状况,如果以前没有画过,就...
    薛小丫520阅读 8评论 0 0