keep partial study

This commit is contained in:
Furen 2025-01-24 05:57:56 +08:00
parent d070c38106
commit 2c2a5d2416
3 changed files with 135 additions and 26 deletions

52
src/list-pituitary.py Normal file
View file

@ -0,0 +1,52 @@
from pathlib import Path
import base64
import hashlib
import datetime
import logging
import pandas as pd
def hashptid(mrn, hosp='NTUH'):
ptsalt = (mrn+hosp).upper().encode()
hash_in_bytes = hashlib.md5(ptsalt)
md5 = hash_in_bytes.hexdigest()
hash = base64.b32encode(hash_in_bytes.digest())[:8].decode()
# hash32 = base64.b32encode(hash_in_bytes)[:8].decode()
# hash10 = str(int(hashlib.md5(ptsalt).hexdigest(), 16))[-8:]
return md5, hash
def main():
FORMAT = '%(asctime)s %(message)s'
logging.basicConfig(filename=__file__.replace('.py','.%s.log'%str(datetime.datetime.now()).replace(':','')),
format=FORMAT)
# df = pd.read_excel('pituitary-op.xlsx')
# series = df['PatChartNo'].drop_duplicates().iloc[-1000:].iloc[::-1]
# outdir = r'T:\pituitary-op'
df = pd.read_excel('pituitary-srs.xlsx', sheet_name='NFA Data (n=178)', header=1)
series = df[~df['Patient ID'].isna()]['Patient ID'].drop_duplicates()
for index, row in series.items():
if isinstance(row, float):
row = int(row)
chartno = str(int(row)).zfill(7)
md5, hash = hashptid(chartno)
print(chartno, hash)
return 0
if __name__ == '__main__':
main()

View file

@ -1,4 +1,6 @@
from pathlib import Path
import datetime import datetime
import glob import glob
import logging import logging
@ -18,7 +20,7 @@ def mouse_click(ws):
mouse.move(coords=coords) mouse.move(coords=coords)
time.sleep(0.1) time.sleep(0.1)
mouse.click(coords=coords) mouse.click(coords=coords)
time.sleep(0.2) time.sleep(0.1)
# mouse.press(coords=coords) # mouse.press(coords=coords)
# mouse.release(coords=coords) # mouse.release(coords=coords)
@ -78,13 +80,20 @@ def dump(pane):
print(pane.print_control_identifiers()) print(pane.print_control_identifiers())
# print(len(pane.children())) # print(len(pane.children()))
# TDicomTagListForm = None
def save_tag(window, outdir): def save_tag(window, outdir):
global TDicomTagListForm
mouse_click(window['註釋/標籤']) mouse_click(window['註釋/標籤'])
TToolBar = window.child_window(class_name='TToolBar', found_index=2)
TDicomTagListForm = window['DICOM 標籤清單Dialog']
if TDicomTagListForm.exists():
TDicomTagListForm.close()
TDicomTagListForm.wait_not('exists', 20)
TToolBar = window.child_window(class_name='TToolBar', found_index=2)
Button5 = TToolBar.Button5 Button5 = TToolBar.Button5
Button5.wait('ready', 9) Button5.wait('ready', 10)
# time.sleep(2) # time.sleep(2)
mouse_click(Button5) mouse_click(Button5)
@ -93,6 +102,7 @@ def save_tag(window, outdir):
export = export_to_file.wrapper_object() export = export_to_file.wrapper_object()
export.click() export.click()
TDicomTagListForm = window['DICOM 標籤清單Dialog'] TDicomTagListForm = window['DICOM 標籤清單Dialog']
dlg_save = Desktop(backend="uia").window(title='另存新檔') dlg_save = Desktop(backend="uia").window(title='另存新檔')
@ -106,7 +116,9 @@ def save_tag(window, outdir):
dlg_save['存檔(S)Button'].wrapper_object().click() dlg_save['存檔(S)Button'].wrapper_object().click()
TDicomTagListForm.close() TDicomTagListForm.close()
TDicomTagListForm.wait_not('exists', 9) # logging.warning("TDicomTagListForm closing")
# TDicomTagListForm.wait_not('exists', 60)
# logging.warning("TDicomTagListForm not exists")
return pahtname return pahtname
@ -123,7 +135,10 @@ def save_study(chartno, outdir, only_tag):
# time.sleep(1) # time.sleep(1)
logging.warning('connecting '+chartno) logging.warning('connecting '+chartno)
app = Application(backend="uia").connect(title_re='^%s.*'%chartno, timeout=200) app = Application(backend="uia").connect(title_re='.*%s.*'%chartno, timeout=200)
shutil.rmtree(outdir, ignore_errors=True)
os.makedirs(outdir, exist_ok=True)
logging.warning(str(app)) logging.warning(str(app))
window = app.top_window() window = app.top_window()
@ -152,16 +167,17 @@ def save_study(chartno, outdir, only_tag):
for c in series: for c in series:
logging.warning(str(c.element_info)) logging.warning(str(c.element_info))
# c.wait('ready') #AttributeError: 'UIAWrapper' object has no attribute 'wait'
c.set_focus() c.set_focus()
mouse_click(c) mouse_click(c)
keyboard.send_keys('^{HOME}') keyboard.send_keys('^{HOME}')
time.sleep(1) time.sleep(.1)
p = save_tag(window, outdir) p = save_tag(window, outdir)
mouse_click(c) mouse_click(c)
keyboard.send_keys('^{END}') keyboard.send_keys('^{END}')
time.sleep(1) time.sleep(.1)
p = save_tag(window, outdir) p = save_tag(window, outdir)
# mouse_click(c) # mouse_click(c)
@ -180,6 +196,7 @@ def save_study(chartno, outdir, only_tag):
# logging.warning(str(datetime.datetime.now())) # logging.warning(str(datetime.datetime.now()))
TFormSaveBitmap = window['選項'] TFormSaveBitmap = window['選項']
# TFormSaveBitmap.dump_tree(filename='z-%s-TFormSaveBitmap.txt'%chartno) # TFormSaveBitmap.dump_tree(filename='z-%s-TFormSaveBitmap.txt'%chartno)
TFormSaveBitmap.wait('ready')
Edit5 = TFormSaveBitmap.Edit5 Edit5 = TFormSaveBitmap.Edit5
Edit5.wait('ready') Edit5.wait('ready')
@ -189,7 +206,7 @@ def save_study(chartno, outdir, only_tag):
TFormSaveBitmap.Button2.click() TFormSaveBitmap.Button2.click()
logging.warning('button clicked') logging.warning('button clicked')
time.sleep(1) time.sleep(.1)
logging.warning('saving started') logging.warning('saving started')
saving = window.child_window(title_re='^另存新檔.*') saving = window.child_window(title_re='^另存新檔.*')
logging.warning('saving exists') logging.warning('saving exists')
@ -199,6 +216,7 @@ def save_study(chartno, outdir, only_tag):
c.set_focus() c.set_focus()
mouse_click(c) mouse_click(c)
keyboard.send_keys('^q') keyboard.send_keys('^q')
# window.wait_not('exists', 9)
# while True: # while True:
# try: # try:
@ -242,25 +260,68 @@ def save_patient(chartno, outdir, query = "CT,MR", only_tag=False):
ListView = ListItem.parent() ListView = ListItem.parent()
shutil.rmtree(outdir, ignore_errors=True) # shutil.rmtree(outdir, ignore_errors=True)
os.makedirs(outdir, exist_ok=True) # os.makedirs(outdir, exist_ok=True)
items =[] items =[]
rows = []
row = None
LeftUpper = ListView.items()[0]
mouse_click(LeftUpper)
for item in ListView.items(): for item in ListView.items():
if item.texts()[0] != '開啟影像': # logging.warning(str(item))
continue # logging.warning(str(dir(item)))
items.append(item) # logging.warning(str(item.texts()))
logging.debug(str(item.rectangle()))
if item.texts()[0] == '開啟影像':
if row:
rows.append(row)
# logging.warning(str(row))
items.append(item)
row = []
if row is not None:
row.append(item.texts()[0])
# if item.texts()[0] != '開啟影像':
# continue
# items.append(item)
# logging.debug(str(item.rectangle()))
rows.append(row)
# logging.warning(str(row))
# logging.warning(str(len(items)))
# logging.warning(str(items))
# exit()
for i, item in enumerate(items): for i, item in enumerate(items):
# if i < 7:
# continue series_name = '%s_%s_%s' % (rows[i][5], rows[i][9], rows[i][10])
series_name = series_name.replace('/', '').replace(' ', '')
complete_file = Path(f'{outdir}\\{series_name}.complete')
if complete_file.is_file():
logging.warning('skip '+str(complete_file))
else:
subdir = Path(f'{outdir}\\{series_name}')
time.sleep(.1)
logging.warning(str(item.get_properties()))
mouse_click(item)
save_study(chartno, subdir, only_tag)
complete_file.touch()
bottom = False bottom = False
logging.warning(str(items[i].rectangle())) logging.warning(str(items[i].rectangle()))
try: try:
if items[i+1].rectangle().top < 1: if items[i+2].rectangle().top < 1:
bottom = True bottom = True
except: except:
bottom = True bottom = True
@ -275,14 +336,8 @@ def save_patient(chartno, outdir, query = "CT,MR", only_tag=False):
# coords = (r.left + r.right)//2, (r.top + r.bottom)//2 # coords = (r.left + r.right)//2, (r.top + r.bottom)//2
# mouse.scroll(coords=coords) # mouse.scroll(coords=coords)
time.sleep(2) time.sleep(.1)
# item.wait('ready') # no attribute wait
time.sleep(1)
logging.warning(str(item.get_properties()))
mouse_click(item)
save_study(chartno, outdir, only_tag)
logging.warning(chartno+" completed "+query) logging.warning(chartno+" completed "+query)
return 0 return 0

View file

@ -22,7 +22,9 @@ def get_pacs(series, outdir, max_patients=100):
continue continue
logging.warning('saving '+chartno) logging.warning('saving '+chartno)
pacs.save_patient(chartno, f'{outdir}\\{chartno}', query="CT,MR", only_tag=True) pacs.save_patient(chartno, f'{outdir}\\{chartno}', query="CT,MR",
# only_tag=True
)
complete_file.touch() complete_file.touch()
num_patients += 1 num_patients += 1