This commit is contained in:
2025-07-12 13:54:12 +05:00
parent d8fbfb6fb8
commit 2cc16eb0c7
321 changed files with 8746 additions and 0 deletions

146
auto_pkzo.py Normal file
View 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()