Files
kadastr13/auto_pkzo.py
2025-07-12 13:54:12 +05:00

147 lines
5.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
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.
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()