AutoPACS/src/pacs.py

376 lines
10 KiB
Python
Raw Normal View History

2024-12-10 22:40:17 +00:00
2025-01-23 21:57:56 +00:00
from pathlib import Path
2024-12-10 22:40:17 +00:00
import datetime
import glob
import logging
import os
import shutil
import time
from pywinauto import Desktop, actionlogger, mouse, keyboard
from pywinauto.application import Application
from pywinauto.timings import Timings
from settings import *
def mouse_click(ws):
r = ws.rectangle()
coords = (r.left + r.right)//2, (r.top + r.bottom)//2
mouse.move(coords=coords)
2025-01-01 22:37:20 +00:00
time.sleep(0.1)
2024-12-10 22:40:17 +00:00
mouse.click(coords=coords)
2025-01-23 21:57:56 +00:00
time.sleep(0.1)
# mouse.press(coords=coords)
# mouse.release(coords=coords)
2024-12-10 22:40:17 +00:00
def login(id=USER_ID, pw=PASSWORD):
# Timings.fast()
# Timings.window_find_timeout = 10
patterns = [
# '另存新檔.*'
'.* - Microsoft Edge$',
'.*日期:.*',
]
for p in patterns:
while True:
quit = False
try:
w = Desktop(backend="uia").window(title_re=p)
logging.warning(p + str(w))
w.close()
except:
quit = True
if quit:
break
app = Application(backend="uia").start(r'C:\Users\xfr\Desktop\PACS.exe')
w = Desktop(backend="uia").window(title_re='.* - Microsoft Edge$')
w.wait('ready')
# time.sleep(9)
app = Application(backend="uia").connect(title_re='.* - Microsoft Edge$')
# app.wait_cpu_usage_lower(threshold=50)
# dlg_spec = Desktop(backend="uia").window(title_re='.* - Microsoft Edge$')
window = app.window(title_re='.* - Microsoft Edge$')
# dlg_spec = app.top_window()
window['使用者帳號: \xa0Edit'].set_text(id)
window['使用者密碼: \xa0Edit'].set_text(pw)
# r = window['登入Static'].rectangle()
# coords = (r.left + r.right)//2, (r.top + r.bottom)//2
# mouse.click(coords=coords)
mouse_click(window['登入Static'])
time.sleep(9)
return app, window
def dump(pane):
print(pane)
print(dir(pane))
print(pane.element_info)
print(pane.get_properties())
print(pane.print_control_identifiers())
# print(len(pane.children()))
2025-01-23 21:57:56 +00:00
# TDicomTagListForm = None
2024-12-10 22:40:17 +00:00
2024-12-31 13:33:28 +00:00
def save_tag(window, outdir):
2025-01-23 21:57:56 +00:00
global TDicomTagListForm
2025-01-01 22:37:20 +00:00
mouse_click(window['註釋/標籤'])
2024-12-31 13:33:28 +00:00
2025-01-23 21:57:56 +00:00
TDicomTagListForm = window['DICOM 標籤清單Dialog']
if TDicomTagListForm.exists():
TDicomTagListForm.close()
2025-02-08 01:48:24 +00:00
TDicomTagListForm.wait_not('exists', 30)
2025-01-23 21:57:56 +00:00
TToolBar = window.child_window(class_name='TToolBar', found_index=2)
2025-01-01 22:37:20 +00:00
Button5 = TToolBar.Button5
2025-01-23 21:57:56 +00:00
Button5.wait('ready', 10)
2025-01-01 22:37:20 +00:00
# time.sleep(2)
mouse_click(Button5)
2024-12-31 13:33:28 +00:00
2025-01-01 22:37:20 +00:00
export_to_file = window['輸出至檔案']
export_to_file.wait('ready', 99)
export = export_to_file.wrapper_object()
export.click()
2024-12-31 13:33:28 +00:00
2025-01-23 21:57:56 +00:00
2025-01-01 22:37:20 +00:00
TDicomTagListForm = window['DICOM 標籤清單Dialog']
2024-12-31 13:33:28 +00:00
2025-01-01 22:37:20 +00:00
dlg_save = Desktop(backend="uia").window(title='另存新檔')
NEdit = dlg_save['檔案名稱(N):Edit']
NEdit.wait('ready', 99)
edit = NEdit.wrapper_object()
pahtname = os.path.join(outdir, edit.get_value())
for p in glob.glob(pahtname + '*'):
os.remove(p)
edit.set_text(pahtname)
dlg_save['存檔(S)Button'].wrapper_object().click()
2024-12-31 13:33:28 +00:00
2025-01-01 22:37:20 +00:00
TDicomTagListForm.close()
2025-01-23 21:57:56 +00:00
# logging.warning("TDicomTagListForm closing")
# TDicomTagListForm.wait_not('exists', 60)
# logging.warning("TDicomTagListForm not exists")
2024-12-10 22:40:17 +00:00
2025-01-01 22:37:20 +00:00
return pahtname
2024-12-10 22:40:17 +00:00
2025-01-01 22:37:20 +00:00
def save_study(chartno, outdir, only_tag):
2024-12-31 13:33:28 +00:00
# TViewerForm
2024-12-10 22:40:17 +00:00
# while True:
# logging.warning('connecting '+chartno)
# try:
# app = Application(backend="uia").connect(title_re='^%s.*'%chartno)
# break
# except:
# time.sleep(1)
logging.warning('connecting '+chartno)
2025-02-08 01:48:24 +00:00
app = Application(backend="uia").connect(title_re='.*%s.*'%chartno, timeout=300)
2025-01-23 21:57:56 +00:00
shutil.rmtree(outdir, ignore_errors=True)
os.makedirs(outdir, exist_ok=True)
2024-12-10 22:40:17 +00:00
logging.warning(str(app))
window = app.top_window()
# window.maximize()
index = 0
while True:
TFlowPanel = window.child_window(class_name='TFlowPanel', found_index=index)
# dump(TFlowPanel)
if TFlowPanel.control_count():
break
index += 1
series = sorted(TFlowPanel.children(), key=lambda x: x.rectangle().left)
c = series[0]
c.set_focus()
mouse_click(c)
keyboard.send_keys('^i')
2024-12-31 13:33:28 +00:00
# logging.warning(str(TFlowPanel.get_properties()))
# print(str(TFlowPanel.get_properties()))
# print(str(window.get_properties()))
# window.dump_tree(filename='test.log')
# exit()
2024-12-10 22:40:17 +00:00
for c in series:
logging.warning(str(c.element_info))
2025-01-23 21:57:56 +00:00
# c.wait('ready') #AttributeError: 'UIAWrapper' object has no attribute 'wait'
2024-12-10 22:40:17 +00:00
c.set_focus()
2025-01-01 22:37:20 +00:00
mouse_click(c)
2024-12-31 13:33:28 +00:00
keyboard.send_keys('^{HOME}')
2025-01-23 21:57:56 +00:00
time.sleep(.1)
2025-01-01 22:37:20 +00:00
p = save_tag(window, outdir)
2024-12-31 13:33:28 +00:00
2025-01-01 22:37:20 +00:00
mouse_click(c)
keyboard.send_keys('^{END}')
2025-01-23 21:57:56 +00:00
time.sleep(.1)
2025-01-01 22:37:20 +00:00
p = save_tag(window, outdir)
2024-12-31 13:33:28 +00:00
2025-01-01 22:37:20 +00:00
# mouse_click(c)
# keyboard.send_keys('^{HOME}')
# time.sleep(1)
# p = save_tag(window, outdir)
2024-12-10 22:40:17 +00:00
2025-01-01 22:37:20 +00:00
if not only_tag:
2024-12-10 22:40:17 +00:00
2025-01-01 22:37:20 +00:00
keyboard.send_keys('^s')
keyboard.send_keys('{DOWN}')
keyboard.send_keys('{DOWN}')
2024-12-10 22:40:17 +00:00
2025-01-01 22:37:20 +00:00
# time.sleep(9)
2024-12-10 22:40:17 +00:00
2025-01-01 22:37:20 +00:00
# logging.warning(str(datetime.datetime.now()))
TFormSaveBitmap = window['選項']
# TFormSaveBitmap.dump_tree(filename='z-%s-TFormSaveBitmap.txt'%chartno)
2025-01-23 21:57:56 +00:00
TFormSaveBitmap.wait('ready')
2025-01-01 22:37:20 +00:00
Edit5 = TFormSaveBitmap.Edit5
Edit5.wait('ready')
Edit5.set_text(outdir)
2025-01-01 22:37:20 +00:00
# TFormSaveBitmap.Edit5.set_text(outdir)
TFormSaveBitmap.Button2.click()
2024-12-10 22:40:17 +00:00
2025-01-01 22:37:20 +00:00
logging.warning('button clicked')
2025-01-23 21:57:56 +00:00
time.sleep(.1)
2025-01-01 22:37:20 +00:00
logging.warning('saving started')
saving = window.child_window(title_re='^另存新檔.*')
logging.warning('saving exists')
saving.wait_not("exists", timeout=999)
logging.warning('saving not exists')
2024-12-10 22:40:17 +00:00
c.set_focus()
mouse_click(c)
keyboard.send_keys('^q')
2025-01-23 21:57:56 +00:00
# window.wait_not('exists', 9)
2024-12-10 22:40:17 +00:00
# while True:
# try:
# if not window.exists():
# break
# except :
# break
# logging.warning(str((datetime.datetime.now())))
# c.set_focus()
# mouse_click(c)
# keyboard.send_keys('^q')
# time.sleep(9)
2025-01-01 22:37:20 +00:00
def save_patient(chartno, outdir, query = "CT,MR", only_tag=False):
2024-12-10 22:40:17 +00:00
app = Application(backend="uia").connect(title_re='.* - Microsoft Edge$')
logging.warning(str(app))
# window = app.window(title_re='.* - Microsoft Edge$')
window=app.top_window()
window.maximize()
if query:
window['病歷號Edit'].set_text(chartno)
window['儀器種類Edit'].set_text(query)
r = window['ComboBox關閉'].rectangle()
coords = (r.left + r.right)//2, (r.top + r.bottom)//2
mouse.click(coords=coords)
keyboard.send_keys('{UP}')
keyboard.send_keys('{UP}')
keyboard.send_keys('{ENTER}')
window['Button'].click()
time.sleep(9)
ListItem = window['開啟影像'].parent()
# print(ListItem.texts())
ListView = ListItem.parent()
2025-01-23 21:57:56 +00:00
# shutil.rmtree(outdir, ignore_errors=True)
# os.makedirs(outdir, exist_ok=True)
2024-12-10 22:40:17 +00:00
items =[]
2025-01-23 21:57:56 +00:00
rows = []
row = None
LeftUpper = ListView.items()[0]
mouse_click(LeftUpper)
2024-12-10 22:40:17 +00:00
for item in ListView.items():
2025-01-23 21:57:56 +00:00
# logging.warning(str(item))
# logging.warning(str(dir(item)))
# logging.warning(str(item.texts()))
2024-12-10 22:40:17 +00:00
2025-01-23 21:57:56 +00:00
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] != '開啟影像':
2024-12-10 22:40:17 +00:00
# continue
2025-01-23 21:57:56 +00:00
# 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):
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}')
2025-02-08 01:48:24 +00:00
time.sleep(.3)
2025-01-23 21:57:56 +00:00
logging.warning(str(item.get_properties()))
mouse_click(item)
save_study(chartno, subdir, only_tag)
complete_file.touch()
2024-12-10 22:40:17 +00:00
bottom = False
logging.warning(str(items[i].rectangle()))
2024-12-10 22:40:17 +00:00
try:
2025-01-23 21:57:56 +00:00
if items[i+2].rectangle().top < 1:
2024-12-10 22:40:17 +00:00
bottom = True
except:
bottom = True
if bottom:
logging.warning(str(item.get_properties()))
2024-12-10 22:40:17 +00:00
item.set_focus()
keyboard.send_keys('{DOWN}')
logging.warning('{DOWN}')
2024-12-10 22:40:17 +00:00
# r = item.rectangle()
# coords = (r.left + r.right)//2, (r.top + r.bottom)//2
# mouse.scroll(coords=coords)
2025-01-23 21:57:56 +00:00
time.sleep(.1)
2024-12-10 22:40:17 +00:00
logging.warning(chartno+" completed "+query)
return 0
# exit()
actionlogger.enable()
def main():
# FORMAT = '%(asctime)s %(clientip)-15s %(user)-8s %(message)s'
FORMAT = '%(asctime)s %(message)s'
logging.basicConfig(filename=__file__.replace('.py','.%s.log'%str(datetime.datetime.now()).replace(':','')),
format=FORMAT)
# logger = logging.getLogger('pywinauto')
# logger.handlers[0] = logging.FileHandler(__file__.replace('.py','.log'))
# logging.basicConfig(format=FORMAT)
# formatter = logging.Formatter(FORMAT)
# logger.handlers[0].setFormatter(formatter)
app, window = login()
save_patient('5344141', r'T:\0\5344141', query="CT,MR")
# save_patient('5344141', r'T:\0\5344141', query="CT")
# save_patient('2380784', r'T:\3\2380784', query=False)
# save_study('2380784', outdir=r'T:\0\2380784')
# step2()
if __name__ == '__main__':
main()