AutoPACS/src/pacs.py
2025-02-08 09:48:24 +08:00

375 lines
10 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from pathlib import Path
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)
time.sleep(0.1)
mouse.click(coords=coords)
time.sleep(0.1)
# mouse.press(coords=coords)
# mouse.release(coords=coords)
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()))
# TDicomTagListForm = None
def save_tag(window, outdir):
global TDicomTagListForm
mouse_click(window['註釋/標籤'])
TDicomTagListForm = window['DICOM 標籤清單Dialog']
if TDicomTagListForm.exists():
TDicomTagListForm.close()
TDicomTagListForm.wait_not('exists', 30)
TToolBar = window.child_window(class_name='TToolBar', found_index=2)
Button5 = TToolBar.Button5
Button5.wait('ready', 10)
# time.sleep(2)
mouse_click(Button5)
export_to_file = window['輸出至檔案']
export_to_file.wait('ready', 99)
export = export_to_file.wrapper_object()
export.click()
TDicomTagListForm = window['DICOM 標籤清單Dialog']
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()
TDicomTagListForm.close()
# logging.warning("TDicomTagListForm closing")
# TDicomTagListForm.wait_not('exists', 60)
# logging.warning("TDicomTagListForm not exists")
return pahtname
def save_study(chartno, outdir, only_tag):
# TViewerForm
# 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)
app = Application(backend="uia").connect(title_re='.*%s.*'%chartno, timeout=300)
shutil.rmtree(outdir, ignore_errors=True)
os.makedirs(outdir, exist_ok=True)
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')
# logging.warning(str(TFlowPanel.get_properties()))
# print(str(TFlowPanel.get_properties()))
# print(str(window.get_properties()))
# window.dump_tree(filename='test.log')
# exit()
for c in series:
logging.warning(str(c.element_info))
# c.wait('ready') #AttributeError: 'UIAWrapper' object has no attribute 'wait'
c.set_focus()
mouse_click(c)
keyboard.send_keys('^{HOME}')
time.sleep(.1)
p = save_tag(window, outdir)
mouse_click(c)
keyboard.send_keys('^{END}')
time.sleep(.1)
p = save_tag(window, outdir)
# mouse_click(c)
# keyboard.send_keys('^{HOME}')
# time.sleep(1)
# p = save_tag(window, outdir)
if not only_tag:
keyboard.send_keys('^s')
keyboard.send_keys('{DOWN}')
keyboard.send_keys('{DOWN}')
# time.sleep(9)
# logging.warning(str(datetime.datetime.now()))
TFormSaveBitmap = window['選項']
# TFormSaveBitmap.dump_tree(filename='z-%s-TFormSaveBitmap.txt'%chartno)
TFormSaveBitmap.wait('ready')
Edit5 = TFormSaveBitmap.Edit5
Edit5.wait('ready')
Edit5.set_text(outdir)
# TFormSaveBitmap.Edit5.set_text(outdir)
TFormSaveBitmap.Button2.click()
logging.warning('button clicked')
time.sleep(.1)
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')
c.set_focus()
mouse_click(c)
keyboard.send_keys('^q')
# window.wait_not('exists', 9)
# 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)
def save_patient(chartno, outdir, query = "CT,MR", only_tag=False):
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()
# shutil.rmtree(outdir, ignore_errors=True)
# os.makedirs(outdir, exist_ok=True)
items =[]
rows = []
row = None
LeftUpper = ListView.items()[0]
mouse_click(LeftUpper)
for item in ListView.items():
# logging.warning(str(item))
# logging.warning(str(dir(item)))
# logging.warning(str(item.texts()))
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):
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(.3)
logging.warning(str(item.get_properties()))
mouse_click(item)
save_study(chartno, subdir, only_tag)
complete_file.touch()
bottom = False
logging.warning(str(items[i].rectangle()))
try:
if items[i+2].rectangle().top < 1:
bottom = True
except:
bottom = True
if bottom:
logging.warning(str(item.get_properties()))
item.set_focus()
keyboard.send_keys('{DOWN}')
logging.warning('{DOWN}')
# r = item.rectangle()
# coords = (r.left + r.right)//2, (r.top + r.bottom)//2
# mouse.scroll(coords=coords)
time.sleep(.1)
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()