123
This commit is contained in:
146
auto_pkzo.py
Normal file
146
auto_pkzo.py
Normal file
@@ -0,0 +1,146 @@
|
||||
import os
|
||||
import pandas as pd
|
||||
from openpyxl import load_workbook
|
||||
import pyautogui
|
||||
import time
|
||||
import subprocess
|
||||
|
||||
SOURCE_TABLE = r'13. ВВОД в ПКЗО/Исходные данные для программы/Исходная таблица.xlsx'
|
||||
MIF_FOLDER = r'13. ВВОД в ПКЗО/Исходные данные для программы/все миф/'
|
||||
RESULT_TABLE = r'13. ВВОД в ПКЗО/Итоговая таблица пример.xlsx'
|
||||
|
||||
ERRORS = {
|
||||
'нет миф': 'НЕТ МИФ',
|
||||
'площадь': 'площадь',
|
||||
'нет кн': 'НЕТ КН',
|
||||
'нет выписки': 'НЕТ ВЫПИСКИ',
|
||||
'вид он': 'ВИД ОН',
|
||||
'тип': 'ТИП',
|
||||
}
|
||||
|
||||
class DataLoader:
|
||||
def __init__(self, source_table, mif_folder):
|
||||
self.source_table = source_table
|
||||
self.mif_folder = mif_folder
|
||||
self.df = pd.read_excel(self.source_table)
|
||||
|
||||
def find_mif_file(self, kn):
|
||||
kn_variants = [
|
||||
kn.replace(':', ' '),
|
||||
kn.replace(':', '_'),
|
||||
kn.replace(':', ''),
|
||||
]
|
||||
for name in os.listdir(self.mif_folder):
|
||||
for variant in kn_variants:
|
||||
if variant in name and name.lower().endswith('.mif'):
|
||||
return os.path.join(self.mif_folder, name)
|
||||
return None
|
||||
|
||||
def get_mif_area(self, mif_path):
|
||||
# Заглушка: возвращает None
|
||||
return None
|
||||
|
||||
def make_comment(self, row):
|
||||
doc = str(row['Реквизиты и наименование документов - обоснование опр.границ']).strip()
|
||||
if not doc.endswith('.'):
|
||||
doc += '.'
|
||||
comment = doc + ' ' + str(row['Пояснения по границам']).strip()
|
||||
return comment
|
||||
|
||||
def check_pkzo(self, kn, vid_on, type_on):
|
||||
# Заглушка: всегда возвращает True
|
||||
return True, True, True, True
|
||||
|
||||
class PKZOAutomator:
|
||||
def __init__(self, pkzo_path=None):
|
||||
self.pkzo_path = pkzo_path or r'C:\Program Files\PKZO\pkzo.exe'
|
||||
|
||||
def start_pkzo(self):
|
||||
if os.path.exists(self.pkzo_path):
|
||||
subprocess.Popen(self.pkzo_path)
|
||||
time.sleep(10)
|
||||
else:
|
||||
print('ПКЗО не найден, запустите вручную.')
|
||||
|
||||
def automate_object(self, row, mif_path, comment):
|
||||
time.sleep(2)
|
||||
pyautogui.hotkey('ctrl', 'f')
|
||||
time.sleep(0.5)
|
||||
pyautogui.typewrite(str(row['КН']))
|
||||
pyautogui.press('enter')
|
||||
time.sleep(1)
|
||||
pyautogui.rightClick()
|
||||
time.sleep(0.5)
|
||||
pyautogui.typewrite(['down', 'down', 'enter'])
|
||||
time.sleep(0.5)
|
||||
pyautogui.typewrite(mif_path)
|
||||
pyautogui.press('enter')
|
||||
time.sleep(1)
|
||||
pyautogui.rightClick()
|
||||
time.sleep(0.5)
|
||||
pyautogui.typewrite(['down', 'enter'])
|
||||
time.sleep(0.5)
|
||||
if str(row['Тип']).strip().lower() == 'уточнение':
|
||||
pyautogui.typewrite('уточняемый')
|
||||
else:
|
||||
pyautogui.typewrite('исправляемый')
|
||||
pyautogui.press('enter')
|
||||
time.sleep(1)
|
||||
pyautogui.doubleClick()
|
||||
time.sleep(0.5)
|
||||
pyautogui.typewrite(['tab', 'tab'])
|
||||
pyautogui.typewrite(comment)
|
||||
pyautogui.press('enter')
|
||||
time.sleep(1)
|
||||
|
||||
def main():
|
||||
loader = DataLoader(SOURCE_TABLE, MIF_FOLDER)
|
||||
automator = PKZOAutomator()
|
||||
automator.start_pkzo()
|
||||
results = []
|
||||
for idx, row in loader.df.iterrows():
|
||||
kn = str(row['КН']).strip()
|
||||
vid_on = str(row['Вид ОН']).strip()
|
||||
s_table = row['S определенная, кв.м.']
|
||||
type_on = str(row['Тип']).strip().lower()
|
||||
errors = []
|
||||
result = 'загружено'
|
||||
mif_path = loader.find_mif_file(kn)
|
||||
if not mif_path:
|
||||
result = 'не загружено'
|
||||
errors.append(ERRORS['нет миф'])
|
||||
else:
|
||||
if vid_on == 'ЗУ':
|
||||
s_mif = loader.get_mif_area(mif_path)
|
||||
if s_mif is not None and round(s_mif) != round(s_table):
|
||||
result = 'не загружено'
|
||||
errors.append(ERRORS['площадь'])
|
||||
pkzo_kn, pkzo_vyp, pkzo_vid, pkzo_type = loader.check_pkzo(kn, vid_on, type_on)
|
||||
if not pkzo_kn:
|
||||
result = 'не загружено'
|
||||
errors.append(ERRORS['нет кн'])
|
||||
if not pkzo_vyp:
|
||||
result = 'не загружено'
|
||||
errors.append(ERRORS['нет выписки'])
|
||||
if not pkzo_vid:
|
||||
result = 'не загружено'
|
||||
errors.append(ERRORS['вид он'])
|
||||
if not pkzo_type:
|
||||
result = 'не загружено'
|
||||
errors.append(ERRORS['тип'])
|
||||
if result == 'загружено' and not errors:
|
||||
comment = loader.make_comment(row)
|
||||
automator.automate_object(row, mif_path, comment)
|
||||
comment = loader.make_comment(row)
|
||||
results.append({
|
||||
**row,
|
||||
'Результат загрузки': result,
|
||||
'Причина незагрузки': ', '.join(errors),
|
||||
'Площадь по МИФ': None,
|
||||
'Пояснения': comment,
|
||||
})
|
||||
result_df = pd.DataFrame(results)
|
||||
result_df.to_excel(RESULT_TABLE, index=False)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user