Compare commits

...

2 Commits

Author SHA1 Message Date
ksenia_mikhailova b021b2fec2 refactoring old func 2025-06-25 13:51:32 +03:00
ksenia_mikhailova 25ee7e317d logic 2025-06-24 17:04:22 +03:00
5 changed files with 1199 additions and 214 deletions

View File

@ -6,12 +6,21 @@ from PyQt6.QtWebChannel import QWebChannel
from PyQt6.QtWebEngineWidgets import QWebEngineView from PyQt6.QtWebEngineWidgets import QWebEngineView
from enums import KompasCommand from enums import KompasCommand
from logger import logger
from parser.main import KompasDocumentParser from parser.main import KompasDocumentParser
class PythonEventEmitter(QObject): class PythonEventEmitter(QObject):
onEvent = pyqtSignal(str, "QVariantMap") # событие: тип + данные onEvent = pyqtSignal(str, "QVariantMap") # событие: тип + данные
def format_response(success: bool, data=None, error: str = None):
return json.dumps(
{"status": "success" if success else "error", "data": data, "error": error},
ensure_ascii=False,
)
class PythonJSBridge(QObject): class PythonJSBridge(QObject):
def __init__(self, browser: QWebEngineView): def __init__(self, browser: QWebEngineView):
super().__init__() super().__init__()
@ -24,26 +33,34 @@ class PythonJSBridge(QObject):
self.channel.registerObject("pyjs", self) self.channel.registerObject("pyjs", self)
self.channel.registerObject("pyjs_events", self.emitter) self.channel.registerObject("pyjs_events", self.emitter)
self.kompas = KompasDocumentParser() self.kompas = KompasDocumentParser()
@pyqtSlot(str, str, result=str) @pyqtSlot(str, str, result=str)
def callFromJS(self, command: str, data_json: str): def callFromJS(self, command: str, data_json: str):
print(f"[Python] Получена команда: {command}") logger.info(f"[Python] Получена команда: {command}")
data = None
if command == KompasCommand.OPEN_KOMPAS: try:
data = self.kompas.get_open_documents() if command == KompasCommand.OPEN_KOMPAS:
if command == KompasCommand.GET_AVAILABLE_ACTIONS: data = self.kompas.get_open_documents()
data = self.kompas.get_available_actions() elif command == KompasCommand.GET_AVAILABLE_ACTIONS:
if command == KompasCommand.IGES: data = self.kompas.get_available_actions()
data = self.kompas.save_to_iges() elif command == KompasCommand.IGES:
if command == KompasCommand.EXPORT_RASTER: data = self.kompas.save_to_iges()
data = self.kompas.export_to_raster() elif command == KompasCommand.EXPORT_RASTER:
if command == KompasCommand.PROJECT_SUPPORT: data = self.kompas.export_to_raster()
data = self.kompas.create_drawing_for_parts() elif command == KompasCommand.PROJECT_SUPPORT:
if command == KompasCommand.STATS: data = self.kompas.create_drawing_for_parts()
data = self.kompas.collect_statistics() elif command == KompasCommand.STATS:
return json.dumps(data, ensure_ascii=False) data = self.kompas.collect_statistics()
else:
return format_response(False, error=f"Неизвестная команда: {command}")
return format_response(True, data=data)
except Exception as e:
logger.error(f"Ошибка при выполнении команды {command}: {e}", exc_info=True)
return format_response(False, error=str(e))
def send_event_to_js(self, event_type: str, data: dict): def send_event_to_js(self, event_type: str, data: dict):
self.emitter.onEvent.emit(event_type, data) self.emitter.onEvent.emit(event_type, data)

BIN
dist/main.exe vendored

Binary file not shown.

29
logger.py Normal file
View File

@ -0,0 +1,29 @@
# logger.py
import logging
import os
# Создаем корневой логгер
logger = logging.getLogger('parser')
logger.setLevel(logging.DEBUG) # Уровень по умолчанию: DEBUG и выше
# Проверяем, существует ли папка logs
logs_dir = "logs"
if not os.path.exists(logs_dir):
os.makedirs(logs_dir)
# Форматтер для записей в логе
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(module)s - %(funcName)s - %(lineno)d - %(message)s'
)
# Обработчик для вывода в консоль
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
# Обработчик для записи в файл
file_handler = logging.FileHandler(os.path.join(logs_dir, 'parser.log'), encoding='utf-8')
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

796
logs/parser.log Normal file
View File

@ -0,0 +1,796 @@
2025-06-24 16:48:58,547 - parser - INFO - main - save_to_iges - 244 - Начинаем сохранение документов в формате IGES...
2025-06-24 16:48:59,394 - parser - INFO - main - save_to_iges - 264 - Попытка сохранить: Проф труба
2025-06-24 16:49:00,892 - parser - INFO - main - save_to_iges - 264 - Попытка сохранить: Сборка изделий
2025-06-24 16:49:02,333 - parser - INFO - main - save_to_iges - 264 - Попытка сохранить: Список деталей
2025-06-24 16:49:03,686 - parser - INFO - main - save_to_iges - 264 - Попытка сохранить: Nema 17
2025-06-24 16:49:04,310 - parser - INFO - main - save_to_iges - 264 - Попытка сохранить: Квадрат
2025-06-24 16:49:04,842 - parser - INFO - main - save_to_iges - 264 - Попытка сохранить: Цилиндр
2025-06-24 16:49:48,697 - parser - INFO - main - save_to_iges - 244 - Начинаем сохранение документов в формате IGES...
2025-06-24 16:49:49,345 - parser - INFO - main - save_to_iges - 264 - Попытка сохранить: Проф труба
2025-06-24 16:49:49,600 - parser - INFO - main - save_to_iges - 281 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Проф труба.igs
2025-06-24 16:49:50,167 - parser - INFO - main - save_to_iges - 264 - Попытка сохранить: Сборка изделий
2025-06-24 16:49:50,554 - parser - INFO - main - save_to_iges - 281 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Сборка изделий.igs
2025-06-24 16:49:50,947 - parser - INFO - main - save_to_iges - 264 - Попытка сохранить: Список деталей
2025-06-24 16:49:51,482 - parser - INFO - main - save_to_iges - 281 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Список деталей.igs
2025-06-24 16:49:52,346 - parser - INFO - main - save_to_iges - 264 - Попытка сохранить: Nema 17
2025-06-24 16:49:52,485 - parser - INFO - main - save_to_iges - 281 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Nema 17.igs
2025-06-24 16:49:52,986 - parser - INFO - main - save_to_iges - 264 - Попытка сохранить: Квадрат
2025-06-24 16:49:53,124 - parser - INFO - main - save_to_iges - 281 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Квадрат.igs
2025-06-24 16:49:53,781 - parser - INFO - main - save_to_iges - 264 - Попытка сохранить: Цилиндр
2025-06-24 16:49:53,923 - parser - INFO - main - save_to_iges - 281 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Цилиндр.igs
2025-06-24 17:00:05,175 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-24 17:00:09,976 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-24 17:01:37,671 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-24 17:01:40,023 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 09:34:42,579 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 09:34:45,472 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 09:35:51,295 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 09:35:51,382 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 09:38:15,666 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 09:38:15,715 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 09:38:25,989 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 09:55:33,907 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 09:58:13,080 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 09:58:13,163 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 09:58:17,257 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 09:58:20,572 - parser - INFO - main - collect_statistics - 453 - Найдено:
Элементов 18
Гибов 2
2025-06-25 09:58:20,587 - parser - ERROR - main - collect_statistics - 464 - [ERROR] Ошибка при обработке документа #2: '<win32com.gen_py.69AC2981-37C0-4379-84FD-5DD2F3C0A520x0x1x0.IPart7 instance at 0x2495111945616>' object has no attribute 'Welding'
2025-06-25 09:58:21,606 - parser - INFO - main - collect_statistics - 453 - Найдено:
Элементов 1
Гибов 0
2025-06-25 09:58:21,627 - parser - ERROR - main - collect_statistics - 464 - [ERROR] Ошибка при обработке документа #3: '<win32com.gen_py.69AC2981-37C0-4379-84FD-5DD2F3C0A520x0x1x0.IPart7 instance at 0x2495111946512>' object has no attribute 'Welding'
2025-06-25 10:00:42,642 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:00:42,679 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:00:46,701 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:00:46,702 - parser - INFO - main - collect_statistics - 421 - Начинаем сбор статистики по элементам...
2025-06-25 10:00:47,284 - parser - INFO - main - collect_statistics - 439 - Обрабатываем документ: Сборка изделий
2025-06-25 10:00:50,174 - parser - INFO - main - collect_statistics - 456 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:00:50,385 - parser - INFO - main - collect_statistics - 461 - Name
2025-06-25 10:00:50,385 - parser - INFO - main - collect_statistics - 463 - Болт М8-6gx55 ГОСТ 7805-70, масса 26.99 -- 1
2025-06-25 10:00:50,387 - parser - INFO - main - collect_statistics - 463 - Шайба A.8.37 ГОСТ 11371-78, масса 1.828 -- 2
2025-06-25 10:00:50,387 - parser - INFO - main - collect_statistics - 463 - Гайка М8-6H ГОСТ 5915-70, масса 5.548 -- 1
2025-06-25 10:00:50,387 - parser - INFO - main - collect_statistics - 463 - Spring cotter 4 DIN 11024, масса 18.9 -- 1
2025-06-25 10:00:50,388 - parser - INFO - main - collect_statistics - 463 - Болт М12-6gx110 (S18) ГОСТ 7805-70, масса 112.0 -- 2
2025-06-25 10:00:50,388 - parser - INFO - main - collect_statistics - 463 - Шайба A.12.37 ГОСТ 11371-78, масса 6.27 -- 4
2025-06-25 10:00:50,389 - parser - INFO - main - collect_statistics - 463 - Гайка М12-6H (S18) ГОСТ 5915-70, масса 15.67 -- 2
2025-06-25 10:00:50,389 - parser - INFO - main - collect_statistics - 463 - Nema 17, масса 600.143 -- 1
2025-06-25 10:00:50,389 - parser - INFO - main - collect_statistics - 463 - Заклепка гаечная Bralo, потайной бортик, с насечкой, оцинкованная сталь - M4 x 11 - 0371304006, масса 0.15 -- 4
2025-06-25 10:00:50,389 - parser - INFO - main - collect_statistics - 464 - -----
2025-06-25 10:00:50,390 - parser - INFO - main - collect_statistics - 461 - Material
2025-06-25 10:00:50,390 - parser - INFO - main - collect_statistics - 463 - Без указания материала -- 6
2025-06-25 10:00:50,390 - parser - INFO - main - collect_statistics - 463 - АД1 ГОСТ 4784-97 -- 6
2025-06-25 10:00:50,392 - parser - INFO - main - collect_statistics - 463 - Steel DIN 17102 -- 1
2025-06-25 10:00:50,392 - parser - INFO - main - collect_statistics - 463 - Сталь 10 ГОСТ 1050-2013 -- 1
2025-06-25 10:00:50,393 - parser - INFO - main - collect_statistics - 463 - Сталь оцинкованная -- 4
2025-06-25 10:00:50,393 - parser - INFO - main - collect_statistics - 464 - -----
2025-06-25 10:00:50,393 - parser - INFO - main - collect_statistics - 461 - Area
2025-06-25 10:00:50,393 - parser - INFO - main - collect_statistics - 463 - Площадь Без указания материала, м²: -- 0.015392
2025-06-25 10:00:50,393 - parser - INFO - main - collect_statistics - 463 - Площадь АД1 ГОСТ 4784-97, м²: -- 0.004548
2025-06-25 10:00:50,393 - parser - INFO - main - collect_statistics - 463 - Площадь Steel DIN 17102, м²: -- 0.002769
2025-06-25 10:00:50,394 - parser - INFO - main - collect_statistics - 463 - Площадь Сталь 10 ГОСТ 1050-2013, м²: -- 0.012833
2025-06-25 10:00:50,394 - parser - INFO - main - collect_statistics - 463 - Площадь Сталь оцинкованная, м²: -- 0.00152
2025-06-25 10:00:50,394 - parser - INFO - main - collect_statistics - 463 - Total -- 0.037062000000000005
2025-06-25 10:00:50,394 - parser - INFO - main - collect_statistics - 464 - -----
2025-06-25 10:00:50,394 - parser - INFO - main - collect_statistics - 461 - Welding
2025-06-25 10:00:50,394 - parser - INFO - main - collect_statistics - 463 - №1 / ГОСТ 5264-80-С2-10@+15~15 -- 10
2025-06-25 10:00:50,394 - parser - INFO - main - collect_statistics - 463 - №0 -- №0
2025-06-25 10:00:50,394 - parser - INFO - main - collect_statistics - 463 - Total -- 10.0
2025-06-25 10:00:50,394 - parser - INFO - main - collect_statistics - 464 - -----
2025-06-25 10:00:50,736 - parser - INFO - main - collect_statistics - 439 - Обрабатываем документ: Квадрат
2025-06-25 10:00:51,301 - parser - INFO - main - collect_statistics - 456 - Найдено:
Элементов 1
Гибов 0
2025-06-25 10:00:51,340 - parser - INFO - main - collect_statistics - 461 - Name
2025-06-25 10:00:51,341 - parser - INFO - main - collect_statistics - 463 - Деталь-листовое тело, масса 267.953 -- 1
2025-06-25 10:00:51,342 - parser - INFO - main - collect_statistics - 464 - -----
2025-06-25 10:00:51,342 - parser - INFO - main - collect_statistics - 461 - Material
2025-06-25 10:00:51,343 - parser - INFO - main - collect_statistics - 463 - Сталь 10 ГОСТ 1050-2013 -- 1
2025-06-25 10:00:51,343 - parser - INFO - main - collect_statistics - 464 - -----
2025-06-25 10:00:51,344 - parser - INFO - main - collect_statistics - 461 - Area
2025-06-25 10:00:51,345 - parser - INFO - main - collect_statistics - 463 - Площадь Сталь 10 ГОСТ 1050-2013, м²: -- 0.041617
2025-06-25 10:00:51,345 - parser - INFO - main - collect_statistics - 463 - Total -- 0.041617
2025-06-25 10:00:51,345 - parser - INFO - main - collect_statistics - 464 - -----
2025-06-25 10:00:51,345 - parser - INFO - main - collect_statistics - 461 - Welding
2025-06-25 10:00:51,347 - parser - INFO - main - collect_statistics - 463 - №1 / ГОСТ 5264-80-С2-10@+15~15 -- 10
2025-06-25 10:00:51,348 - parser - INFO - main - collect_statistics - 463 - Total -- 10.0
2025-06-25 10:00:51,348 - parser - INFO - main - collect_statistics - 464 - -----
2025-06-25 10:11:22,157 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:11:22,193 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:11:25,318 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: iges
2025-06-25 10:11:25,320 - parser - INFO - main - save_to_iges - 243 - Начинаем сохранение документов в формате IGES...
2025-06-25 10:11:25,887 - parser - INFO - main - save_to_iges - 263 - Попытка сохранить: Сборка изделий
2025-06-25 10:11:26,268 - parser - INFO - main - save_to_iges - 280 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Сборка изделий.igs
2025-06-25 10:11:26,853 - parser - INFO - main - save_to_iges - 263 - Попытка сохранить: Квадрат
2025-06-25 10:11:27,043 - parser - INFO - main - save_to_iges - 280 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Квадрат.igs
2025-06-25 10:11:37,597 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:11:37,598 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 10:11:38,081 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 10:11:41,143 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:11:41,362 - parser - ERROR - main - collect_statistics - 473 - [ERROR] Ошибка при обработке документа #2: 'documents'
2025-06-25 10:11:41,379 - parser - ERROR - bridge - callFromJS - 62 - Ошибка при выполнении команды stats: Object of type IPart7 is not JSON serializable
Traceback (most recent call last):
File "C:\Users\user\data-helper-client\bridge.py", line 59, in callFromJS
return format_response(True, data=data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\data-helper-client\bridge.py", line 18, in format_response
return json.dumps(
^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\__init__.py", line 238, in dumps
**kw).encode(obj)
^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\encoder.py", line 200, in encode
chunks = self.iterencode(o, _one_shot=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\encoder.py", line 258, in iterencode
return _iterencode(o, 0)
^^^^^^^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\encoder.py", line 180, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type IPart7 is not JSON serializable
2025-06-25 10:15:40,355 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:15:40,407 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:15:43,248 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:15:43,250 - parser - INFO - main - collect_statistics - 419 - Начинаем сбор статистики по элементам...
2025-06-25 10:15:43,268 - parser - INFO - main - collect_statistics - 439 - Обрабатываем документ: Сборка изделий
2025-06-25 10:15:46,147 - parser - INFO - main - collect_statistics - 461 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:15:46,317 - parser - ERROR - main - collect_statistics - 475 - [ERROR] Ошибка при обработке документа #2: 'documents'
2025-06-25 10:15:46,328 - parser - ERROR - bridge - callFromJS - 62 - Ошибка при выполнении команды stats: Object of type IPart7 is not JSON serializable
Traceback (most recent call last):
File "C:\Users\user\data-helper-client\bridge.py", line 59, in callFromJS
return format_response(True, data=data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\data-helper-client\bridge.py", line 18, in format_response
return json.dumps(
^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\__init__.py", line 238, in dumps
**kw).encode(obj)
^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\encoder.py", line 200, in encode
chunks = self.iterencode(o, _one_shot=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\encoder.py", line 258, in iterencode
return _iterencode(o, 0)
^^^^^^^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\encoder.py", line 180, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type IPart7 is not JSON serializable
2025-06-25 10:16:47,827 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:16:47,868 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:16:50,490 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:16:50,491 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 10:16:50,513 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 10:16:53,547 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:16:53,744 - parser - ERROR - main - collect_statistics - 473 - [ERROR] Ошибка при обработке документа #2: 'result'
2025-06-25 10:16:53,752 - parser - ERROR - bridge - callFromJS - 62 - Ошибка при выполнении команды stats: Object of type IPart7 is not JSON serializable
Traceback (most recent call last):
File "C:\Users\user\data-helper-client\bridge.py", line 59, in callFromJS
return format_response(True, data=data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\data-helper-client\bridge.py", line 18, in format_response
return json.dumps(
^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\__init__.py", line 238, in dumps
**kw).encode(obj)
^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\encoder.py", line 200, in encode
chunks = self.iterencode(o, _one_shot=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\encoder.py", line 258, in iterencode
return _iterencode(o, 0)
^^^^^^^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\encoder.py", line 180, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type IPart7 is not JSON serializable
2025-06-25 10:17:24,483 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:17:24,544 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:17:27,549 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:17:27,549 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 10:17:27,567 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 10:17:30,138 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:17:30,417 - parser - ERROR - main - collect_statistics - 473 - [ERROR] Ошибка при обработке документа #2: 'result'
2025-06-25 10:17:30,423 - parser - ERROR - bridge - callFromJS - 62 - Ошибка при выполнении команды stats: Object of type IPart7 is not JSON serializable
Traceback (most recent call last):
File "C:\Users\user\data-helper-client\bridge.py", line 59, in callFromJS
return format_response(True, data=data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\data-helper-client\bridge.py", line 18, in format_response
return json.dumps(
^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\__init__.py", line 238, in dumps
**kw).encode(obj)
^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\encoder.py", line 200, in encode
chunks = self.iterencode(o, _one_shot=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\encoder.py", line 258, in iterencode
return _iterencode(o, 0)
^^^^^^^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\json\encoder.py", line 180, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type IPart7 is not JSON serializable
2025-06-25 10:17:59,282 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:17:59,342 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:18:02,874 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:18:02,875 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 10:18:02,887 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 10:18:05,065 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:18:23,163 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:18:23,217 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:18:26,210 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:18:26,210 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 10:18:26,229 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 10:18:29,055 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:31:08,061 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:31:27,311 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:33:59,884 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:33:59,979 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:34:02,945 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:34:02,946 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 10:34:02,976 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 10:34:04,639 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:36:09,980 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:36:10,032 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:38:15,107 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:38:15,179 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:38:16,414 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:38:16,621 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:38:24,332 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:38:24,333 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 10:38:24,358 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 10:38:26,636 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:41:50,540 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:41:50,585 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:41:53,767 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:41:53,768 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 10:41:53,846 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 10:41:56,485 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:43:45,196 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:43:47,288 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:43:55,122 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:43:55,122 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 10:43:55,161 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 10:43:57,212 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:51:48,641 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:51:48,641 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 10:51:48,672 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 10:51:50,964 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:56:11,400 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:56:11,402 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 10:56:11,499 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 10:56:13,979 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:56:21,450 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:56:23,240 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:56:29,561 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:56:29,561 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 10:56:29,687 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 10:56:31,574 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 10:56:44,278 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 10:56:44,345 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 10:56:47,374 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 10:56:47,375 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 10:56:47,483 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 10:56:50,026 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:27:05,633 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:27:11,170 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:27:20,171 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:38:56,727 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:38:56,788 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 11:38:59,448 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:38:59,448 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:38:59,622 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:39:02,216 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:39:06,727 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:39:06,824 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 11:39:09,295 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:39:09,297 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:39:09,358 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:39:11,236 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:39:39,158 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:39:39,310 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 11:39:42,027 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:39:42,028 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:39:42,043 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:39:44,507 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:47:09,894 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:47:10,001 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 11:47:12,504 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:47:12,506 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:47:12,623 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:47:14,881 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:47:39,277 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:47:39,341 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 11:47:45,312 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:47:45,313 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:47:45,319 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:47:47,399 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:49:19,380 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:49:19,453 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 11:49:22,604 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:49:22,605 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:49:22,730 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:49:24,626 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:50:06,436 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:50:06,437 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:50:06,543 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:50:08,595 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:51:41,448 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:51:41,501 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 11:51:44,454 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:51:44,455 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:51:44,606 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:51:46,790 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:52:05,262 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:52:05,322 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 11:52:07,790 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:52:07,791 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:52:07,817 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:52:09,769 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:52:31,446 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:52:31,537 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 11:52:36,412 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:52:36,415 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:52:36,436 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:52:38,616 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:53:03,755 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:53:03,938 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 11:53:07,769 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:53:07,771 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:53:07,808 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:53:10,423 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:53:35,385 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:53:35,437 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 11:53:38,130 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:53:38,131 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:53:38,177 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:53:40,565 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:56:13,452 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:56:13,520 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 11:56:16,020 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:56:16,022 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:56:16,066 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:56:18,251 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 11:59:39,944 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 11:59:40,012 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 11:59:42,814 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 11:59:42,814 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 11:59:42,948 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 11:59:44,998 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:00:25,554 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:00:25,642 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:00:30,945 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:00:30,946 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:00:30,996 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:00:32,788 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:04:53,114 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:04:53,215 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:04:53,424 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:04:53,464 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:04:54,809 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:04:54,874 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:05:01,539 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:05:01,540 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:05:01,647 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:05:03,492 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:05:12,976 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:05:12,976 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:05:13,012 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:05:15,020 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:06:11,542 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:06:11,615 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:06:16,062 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:06:16,063 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:06:16,080 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:06:18,660 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:06:24,079 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:06:24,081 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:06:24,096 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:06:26,660 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:06:48,208 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:06:48,275 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:06:51,708 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:06:51,710 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:06:51,812 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:06:53,801 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:07:05,359 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:07:05,434 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:07:08,010 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:07:08,010 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:07:08,032 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:07:10,873 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:07:21,329 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:07:21,406 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:07:24,139 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:07:24,139 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:07:24,166 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:07:27,033 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:08:03,135 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:08:03,297 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:08:05,701 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:08:05,701 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:08:05,730 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:08:08,418 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:08:24,308 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:08:24,432 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:08:27,244 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:08:27,246 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:08:27,281 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:08:30,021 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:09:19,413 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:09:19,675 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:09:22,528 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:09:22,534 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:09:22,573 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:09:24,956 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:10:49,833 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:10:49,974 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:10:52,297 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:10:52,303 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:10:52,338 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:10:54,279 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:10:55,902 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:10:56,117 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:10:58,182 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:10:58,182 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:10:58,198 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:11:00,856 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:11:22,644 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:11:23,013 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:11:25,847 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:11:25,847 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:11:25,847 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:11:29,098 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:11:30,947 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:11:31,291 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:11:32,761 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:11:32,762 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:11:32,776 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:11:35,715 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:12:44,967 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:12:45,497 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:12:48,412 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:12:48,412 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:12:48,419 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:12:51,159 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:30:35,350 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:30:35,770 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:30:38,916 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:30:38,916 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:30:38,916 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:30:40,737 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:33:36,844 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:33:37,236 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:33:40,115 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:33:40,115 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:33:40,222 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:33:42,487 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:34:00,034 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:34:00,393 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:34:02,840 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:34:02,840 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:34:02,840 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:34:05,299 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:35:48,113 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:35:48,506 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:35:50,670 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:35:50,670 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:35:50,670 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:35:52,440 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:37:06,892 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:37:07,263 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:37:09,471 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:37:09,472 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:37:09,485 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:37:11,644 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:37:53,403 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: iges
2025-06-25 12:37:53,403 - parser - INFO - main - save_to_iges - 243 - Начинаем сохранение документов в формате IGES...
2025-06-25 12:37:53,429 - parser - INFO - main - save_to_iges - 263 - Попытка сохранить: Сборка изделий
2025-06-25 12:37:53,793 - parser - INFO - main - save_to_iges - 280 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Сборка изделий.igs
2025-06-25 12:37:54,517 - parser - INFO - main - save_to_iges - 263 - Попытка сохранить: Квадрат
2025-06-25 12:37:54,676 - parser - INFO - main - save_to_iges - 280 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Квадрат.igs
2025-06-25 12:38:28,963 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:38:29,345 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:38:53,336 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: iges
2025-06-25 12:38:53,337 - parser - INFO - main - save_to_iges - 243 - Начинаем сохранение документов в формате IGES...
2025-06-25 12:38:54,222 - parser - INFO - main - save_to_iges - 263 - Попытка сохранить: Сборка изделий
2025-06-25 12:38:54,534 - parser - INFO - main - save_to_iges - 280 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Сборка изделий.igs
2025-06-25 12:38:55,096 - parser - INFO - main - save_to_iges - 263 - Попытка сохранить: Квадрат
2025-06-25 12:38:55,221 - parser - INFO - main - save_to_iges - 280 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Квадрат.igs
2025-06-25 12:43:38,070 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:43:38,600 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:43:41,806 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:43:41,806 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:43:42,096 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:43:43,658 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:43:49,745 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: iges
2025-06-25 12:43:49,745 - parser - INFO - main - save_to_iges - 243 - Начинаем сохранение документов в формате IGES...
2025-06-25 12:43:49,760 - parser - INFO - main - save_to_iges - 263 - Попытка сохранить: Сборка изделий
2025-06-25 12:43:50,068 - parser - INFO - main - save_to_iges - 280 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Сборка изделий.igs
2025-06-25 12:43:50,491 - parser - INFO - main - save_to_iges - 263 - Попытка сохранить: Квадрат
2025-06-25 12:43:50,638 - parser - INFO - main - save_to_iges - 280 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Квадрат.igs
2025-06-25 12:44:47,943 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:44:48,311 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:45:08,982 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: iges
2025-06-25 12:45:08,982 - parser - INFO - main - save_to_iges - 243 - Начинаем сохранение документов в формате IGES...
2025-06-25 12:45:09,471 - parser - INFO - main - save_to_iges - 263 - Попытка сохранить: Сборка изделий
2025-06-25 12:45:09,752 - parser - INFO - main - save_to_iges - 280 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Сборка изделий.igs
2025-06-25 12:45:10,362 - parser - INFO - main - save_to_iges - 263 - Попытка сохранить: Квадрат
2025-06-25 12:45:10,488 - parser - INFO - main - save_to_iges - 280 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Квадрат.igs
2025-06-25 12:46:19,499 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:46:19,910 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:46:22,586 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:46:22,586 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:46:22,892 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:46:25,160 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:46:30,955 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: iges
2025-06-25 12:46:30,955 - parser - INFO - main - save_to_iges - 243 - Начинаем сохранение документов в формате IGES...
2025-06-25 12:46:30,975 - parser - INFO - main - save_to_iges - 263 - Попытка сохранить: Сборка изделий
2025-06-25 12:46:31,359 - parser - INFO - main - save_to_iges - 280 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Сборка изделий.igs
2025-06-25 12:46:31,939 - parser - INFO - main - save_to_iges - 263 - Попытка сохранить: Квадрат
2025-06-25 12:46:32,079 - parser - INFO - main - save_to_iges - 280 - Успешно сохранено: C:\Users\user\Desktop\ЗН 999 test\3D Модель\igs\Квадрат.igs
2025-06-25 12:49:09,009 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:49:09,420 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:50:22,489 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:50:22,967 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 12:51:55,984 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: stats
2025-06-25 12:51:55,984 - parser - INFO - main - collect_statistics - 417 - Начинаем сбор статистики по элементам...
2025-06-25 12:51:56,221 - parser - INFO - main - collect_statistics - 437 - Обрабатываем документ: Сборка изделий
2025-06-25 12:51:57,940 - parser - INFO - main - collect_statistics - 459 - Найдено:
Элементов 18
Гибов 2
2025-06-25 12:52:16,914 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 12:52:17,265 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 13:10:00,073 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: export_raster
2025-06-25 13:10:32,805 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 13:10:33,200 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 13:10:36,387 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: export_raster
2025-06-25 13:11:08,729 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 13:11:09,156 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 13:11:11,774 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: export_raster
2025-06-25 13:11:11,774 - parser - INFO - main - export_to_raster - 482 - Начинаем экспорт документов в растровый формат...
2025-06-25 13:11:11,813 - parser - INFO - main - export_to_raster - 506 - Обрабатываем документ: Таблица
2025-06-25 13:11:12,937 - parser - INFO - main - export_to_raster - 554 - Сохранен DXF: C:\Users\user\Desktop\ЗН 999 test\2D Чертежи\dxf\Таблица.dxf
2025-06-25 13:11:13,095 - parser - INFO - main - export_to_raster - 608 - [OK] PDF успешно сохранен: C:\Users\user\Desktop\_pages.pdf
2025-06-25 13:13:12,779 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 13:13:13,191 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 13:13:16,783 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: export_raster
2025-06-25 13:13:16,783 - parser - INFO - main - export_to_raster - 482 - Начинаем экспорт документов в растровый формат...
2025-06-25 13:13:16,932 - parser - INFO - main - export_to_raster - 506 - Обрабатываем документ: Таблица
2025-06-25 13:13:17,253 - parser - INFO - main - export_to_raster - 542 - [OK] Сохранен JPG: C:\Users\user\Desktop\ЗН 999 test\2D Чертежи\jpg\Таблица.jpg
2025-06-25 13:13:17,636 - parser - INFO - main - export_to_raster - 554 - Сохранен DXF: C:\Users\user\Desktop\ЗН 999 test\2D Чертежи\dxf\Таблица.dxf
2025-06-25 13:13:17,814 - parser - INFO - main - export_to_raster - 608 - [OK] PDF успешно сохранен: C:\Users\user\Desktop\_pages.pdf
2025-06-25 13:31:36,924 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 13:31:37,297 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 13:31:41,187 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: project_support
2025-06-25 13:31:41,187 - parser - INFO - main - create_drawing_for_parts - 109 - Начинаем создание чертежей для деталей...
2025-06-25 13:31:41,924 - parser - INFO - main - create_drawing_for_parts - 129 - Обрабатываем документ: Сборка изделий
2025-06-25 13:31:43,782 - parser - INFO - main - create_drawing_for_parts - 146 - Найдено элементов для создания чертежей: 18
2025-06-25 13:31:43,909 - parser - INFO - main - create_drawing_for_parts - 155 - Создаём чертёж для: Nema 17
2025-06-25 13:31:45,331 - parser - ERROR - main - create_drawing_for_parts - 253 - [ERROR] Ошибка при обработке документа #2: 'tuple' object has no attribute 'GetGabarit'
Traceback (most recent call last):
File "C:\Users\user\data-helper-client\parser\main.py", line 171, in create_drawing_for_parts
component_ipart.Owner.ResultBodies.GetGabarit(*gabarit)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'tuple' object has no attribute 'GetGabarit'
2025-06-25 13:31:46,077 - parser - INFO - main - create_drawing_for_parts - 129 - Обрабатываем документ: Сборка изделий
2025-06-25 13:31:47,923 - parser - INFO - main - create_drawing_for_parts - 146 - Найдено элементов для создания чертежей: 18
2025-06-25 13:31:47,936 - parser - INFO - main - create_drawing_for_parts - 155 - Создаём чертёж для: Nema 17
2025-06-25 13:31:49,202 - parser - ERROR - main - create_drawing_for_parts - 253 - [ERROR] Ошибка при обработке документа #3: 'tuple' object has no attribute 'GetGabarit'
Traceback (most recent call last):
File "C:\Users\user\data-helper-client\parser\main.py", line 171, in create_drawing_for_parts
component_ipart.Owner.ResultBodies.GetGabarit(*gabarit)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'tuple' object has no attribute 'GetGabarit'
2025-06-25 13:33:59,164 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 13:33:59,595 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 13:34:02,992 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: project_support
2025-06-25 13:34:02,993 - parser - INFO - main - create_drawing_for_parts - 109 - Начинаем создание чертежей для деталей...
2025-06-25 13:34:03,599 - parser - INFO - main - create_drawing_for_parts - 129 - Обрабатываем документ: Сборка изделий
2025-06-25 13:34:05,459 - parser - INFO - main - create_drawing_for_parts - 146 - Найдено элементов для создания чертежей: 18
2025-06-25 13:34:05,578 - parser - INFO - main - create_drawing_for_parts - 155 - Создаём чертёж для: Nema 17
2025-06-25 13:34:07,473 - parser - INFO - main - create_drawing_for_parts - 208 - [OK] Сохранён чертёж: C:\Users\user\Desktop\ЗН 999 test\3D Модель\cdw\Nema-17.cdw
2025-06-25 13:34:10,080 - parser - INFO - main - create_drawing_for_parts - 231 - [OK] Сохранена спецификация: C:\Users\user\Desktop\ЗН 999 test\3D Модель\spw\Список_деталей.spw
2025-06-25 13:36:26,933 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 13:36:27,324 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 13:36:31,774 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: project_support
2025-06-25 13:36:31,774 - parser - INFO - main - create_drawing_for_parts - 109 - Начинаем создание чертежей для деталей...
2025-06-25 13:36:32,077 - parser - INFO - main - create_drawing_for_parts - 129 - Обрабатываем документ: Сборка изделий
2025-06-25 13:36:34,505 - parser - INFO - main - create_drawing_for_parts - 146 - Найдено элементов для создания чертежей: 18
2025-06-25 13:36:34,651 - parser - INFO - main - create_drawing_for_parts - 155 - Создаём чертёж для: Nema 17
2025-06-25 13:36:36,033 - parser - INFO - main - create_drawing_for_parts - 208 - [OK] Сохранён чертёж: C:\Users\user\Desktop\ЗН 999 test\3D Модель\cdw\Nema-17.cdw
2025-06-25 13:36:37,960 - parser - INFO - main - create_drawing_for_parts - 231 - [OK] Сохранена спецификация: C:\Users\user\Desktop\ЗН 999 test\3D Модель\spw\Список_деталей.spw
2025-06-25 13:42:57,438 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 13:42:57,820 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 13:43:01,303 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: project_support
2025-06-25 13:43:01,304 - parser - INFO - main - create_drawing_for_parts - 109 - Начинаем создание чертежей для деталей...
2025-06-25 13:43:01,704 - parser - INFO - main - create_drawing_for_parts - 129 - Обрабатываем документ: Сборка изделий
2025-06-25 13:43:04,606 - parser - INFO - main - create_drawing_for_parts - 146 - Найдено элементов для создания чертежей: 18
2025-06-25 13:43:04,669 - parser - INFO - main - create_drawing_for_parts - 155 - Создаём чертёж для: Nema 17
2025-06-25 13:43:06,207 - parser - INFO - main - create_drawing_for_parts - 208 - [OK] Сохранён чертёж: C:\Users\user\Desktop\ЗН 999 test\3D Модель\cdw\Nema-17.cdw
2025-06-25 13:43:07,284 - parser - INFO - main - create_drawing_for_parts - 231 - [OK] Сохранена спецификация: C:\Users\user\Desktop\ЗН 999 test\3D Модель\spw\Список_деталей.spw
2025-06-25 13:44:20,125 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: project_support
2025-06-25 13:44:20,125 - parser - INFO - main - create_drawing_for_parts - 109 - Начинаем создание чертежей для деталей...
2025-06-25 13:44:20,545 - parser - INFO - main - create_drawing_for_parts - 129 - Обрабатываем документ: Сборка изделий
2025-06-25 13:44:23,423 - parser - INFO - main - create_drawing_for_parts - 146 - Найдено элементов для создания чертежей: 18
2025-06-25 13:44:23,521 - parser - INFO - main - create_drawing_for_parts - 155 - Создаём чертёж для: Nema 17
2025-06-25 13:44:25,176 - parser - INFO - main - create_drawing_for_parts - 208 - [OK] Сохранён чертёж: C:\Users\user\Desktop\ЗН 999 test\3D Модель\cdw\Nema-17.cdw
2025-06-25 13:44:26,362 - parser - INFO - main - create_drawing_for_parts - 231 - [OK] Сохранена спецификация: C:\Users\user\Desktop\ЗН 999 test\3D Модель\spw\Список_деталей.spw
2025-06-25 13:45:29,559 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 13:45:30,016 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 13:45:33,612 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: project_support
2025-06-25 13:45:33,612 - parser - INFO - main - create_drawing_for_parts - 109 - Начинаем создание чертежей для деталей...
2025-06-25 13:45:34,389 - parser - INFO - main - create_drawing_for_parts - 129 - Обрабатываем документ: Сборка изделий
2025-06-25 13:45:37,647 - parser - INFO - main - create_drawing_for_parts - 146 - Найдено элементов для создания чертежей: 18
2025-06-25 13:45:37,863 - parser - INFO - main - create_drawing_for_parts - 155 - Создаём чертёж для: Nema 17
2025-06-25 13:45:39,222 - parser - INFO - main - create_drawing_for_parts - 208 - [OK] Сохранён чертёж: C:\Users\user\Desktop\ЗН 999 test\3D Модель\cdw\Nema-17.cdw
2025-06-25 13:45:40,522 - parser - INFO - main - create_drawing_for_parts - 231 - [OK] Сохранена спецификация: C:\Users\user\Desktop\ЗН 999 test\3D Модель\spw\Список_деталей.spw
2025-06-25 13:48:41,365 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: open_kompas
2025-06-25 13:48:41,834 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: get_available_actions
2025-06-25 13:48:45,448 - parser - INFO - bridge - callFromJS - 41 - [Python] Получена команда: project_support
2025-06-25 13:48:45,449 - parser - INFO - main - create_drawing_for_parts - 109 - Начинаем создание чертежей для деталей...
2025-06-25 13:48:46,440 - parser - INFO - main - create_drawing_for_parts - 129 - Обрабатываем документ: Сборка изделий
2025-06-25 13:48:49,924 - parser - INFO - main - create_drawing_for_parts - 146 - Найдено элементов для создания чертежей: 18
2025-06-25 13:48:50,045 - parser - INFO - main - create_drawing_for_parts - 155 - Создаём чертёж для: Nema 17
2025-06-25 13:48:51,315 - parser - INFO - main - create_drawing_for_parts - 208 - [OK] Сохранён чертёж: C:\Users\user\Desktop\ЗН 999 test\3D Модель\cdw\Nema-17.cdw
2025-06-25 13:48:52,571 - parser - INFO - main - create_drawing_for_parts - 231 - [OK] Сохранена спецификация: C:\Users\user\Desktop\ЗН 999 test\3D Модель\spw\Список_деталей.spw

View File

@ -1,10 +1,11 @@
import os import os
import traceback import traceback
import pythoncom import time
from win32com.client import Dispatch, gencache from win32com.client import Dispatch, gencache
from PIL import Image, ImageDraw, ImageFont from PIL import Image, ImageDraw, ImageFont
from enums import KompasCommand from enums import KompasCommand
from logger import logger
ids = { ids = {
"api_5": "{0422828C-F174-495E-AC5D-D31014DBBE87}", "api_5": "{0422828C-F174-495E-AC5D-D31014DBBE87}",
@ -58,6 +59,23 @@ class KompasDocumentParser:
traceback.print_exc() # <-- Выводит номер строки, файл и стек traceback.print_exc() # <-- Выводит номер строки, файл и стек
raise RuntimeError(f"Ошибка при подключении к КОМПАС: {e}") raise RuntimeError(f"Ошибка при подключении к КОМПАС: {e}")
def get_export_path(self, doc_path: str, doc_name: str, ext: str) -> str:
"""
Формирует путь для экспорта файла по шаблону:
- Создаёт подпапку `ext` внутри `doc_path`
- Возвращает полный путь к файлу `<doc_name>.<ext>`
"""
output_dir = os.path.join(doc_path, ext)
filename = f"{doc_name}.{ext}"
full_path = os.path.join(output_dir, filename)
return full_path
def prepare_export_path(self, doc_path: str, doc_name: str, ext: str) -> str:
full_path = self.get_export_path(doc_path, doc_name, ext)
os.makedirs(os.path.dirname(full_path), exist_ok=True)
return full_path
def get_open_documents(self): def get_open_documents(self):
"""Возвращает список информации о всех открытых документах""" """Возвращает список информации о всех открытых документах"""
@ -82,19 +100,17 @@ class KompasDocumentParser:
print(f"Ошибка при обработке документа #{i + 1}: {e}") print(f"Ошибка при обработке документа #{i + 1}: {e}")
return documents return documents
def create_drawing_for_parts(self): def create_drawing_for_parts(self):
""" """
Создание чертежей для всех уникальных деталей из открытых деталей и сборок. Создание чертежей для всех уникальных деталей из открытых деталей и сборок.
Также создаёт спецификацию для сборок. Также создаёт спецификацию для сборок.
""" """
print("Начинаем создание чертежей для деталей...") logger.info("Начинаем создание чертежей для деталей...")
saving_path = "../cdw/" result = {"result": []}
# Получаем доступные типы из разрешённых действий # Получаем доступные типы из разрешённых действий
av_actions = self.get_available_actions() av_actions = self.get_available_actions()
allowed_types = av_actions[KompasCommand.PROJECT_SUPPORT]["allowed_types"] allowed_types = av_actions[KompasCommand.PROJECT_SUPPORT]["allowed_types"]
docs_collection = self.application.Documents docs_collection = self.application.Documents
for i in range(docs_collection.Count): for i in range(docs_collection.Count):
@ -103,58 +119,45 @@ class KompasDocumentParser:
if doc is None: if doc is None:
continue continue
doc_path = doc.Path
# Сохранение чертежа
output_dir = os.path.join(doc_path, saving_path.strip("/"))
if not os.path.exists(output_dir):
os.makedirs(output_dir)
print(f"Создана папка: {output_dir}")
doc_type = doc.DocumentType doc_type = doc.DocumentType
if doc_type not in allowed_types: if doc_type not in allowed_types:
continue continue
doc.Active = True doc.Active = True
doc_path = doc.Path
doc_name = "-".join(doc.Name.split(".")[:-1]) doc_name = "-".join(doc.Name.split(".")[:-1])
print(f"Обрабатываем документ: {doc_name}") logger.info(f"Обрабатываем документ: {doc_name}")
# Сохранение чертежа
output_dir = os.path.join(doc_path, saving_path.strip("/"))
if not os.path.exists(output_dir):
os.makedirs(output_dir)
print(f"Создана папка: {output_dir}")
doc_3d = self.api7_module.IKompasDocument3D(doc) doc_3d = self.api7_module.IKompasDocument3D(doc)
doc_components = [] top_part = doc_3d.TopPart
def all_elements(part):
"""Рекурсивный обход всех компонентов сборки"""
parts = self.api7_module.IParts7(part.Parts)
for j in range(parts.Count):
element = parts.Part(j)
if element.Parts.Count == 0:
if not element.Standard and not any(
el.Name == element.Name for el in doc_components
):
doc_components.append(element)
else:
all_elements(element)
# Используем общую рекурсивную функцию вместо all_elements
if doc_type == self.constants.ksDocumentAssembly: if doc_type == self.constants.ksDocumentAssembly:
all_elements(doc_3d.TopPart) result_recursive = self._traverse_parts_recursive(top_part)
elements = result_recursive["elements"]
welding = result_recursive["welding"]
bends = result_recursive["bends"]
else: else:
doc_components.append(doc_3d.TopPart) # Для отдельной детали просто собираем данные
elements = [top_part]
welding = self._collect_welds_from_drawing(top_part)
bends = self._collect_bends_from_element(top_part)
for component in doc_components: logger.info(f"Найдено элементов для создания чертежей: {len(elements)}")
# Сохранение чертежей
drawings = []
for component in elements:
component_ipart = self.api7_module.IPart7(component) component_ipart = self.api7_module.IPart7(component)
if component_ipart.Standard: if component_ipart.Standard:
continue continue
print(f"Создаём чертёж для: {component.Name}") logger.info(f"Создаём чертёж для: {component.Name}")
# Создаём новый чертёж # Создаём новый чертёж
c_doc = self.application.Documents.Add(self.constants.ksDocumentDrawing) c_doc = self.application.Documents.Add(
self.constants.ksDocumentDrawing
)
c_layout = c_doc.LayoutSheets c_layout = c_doc.LayoutSheets
c_sheet = c_layout.Item(0) c_sheet = c_layout.Item(0)
c_sheet.Format.Format = self.constants.ksFormatA3 c_sheet.Format.Format = self.constants.ksFormatA3
@ -165,14 +168,18 @@ class KompasDocumentParser:
c_size = [1, 1, 1] c_size = [1, 1, 1]
if component_ipart.Owner.ResultBodies: if component_ipart.Owner.ResultBodies:
gabarit = [0, 0, 0, 0, 0, 0] gabarit = [0, 0, 0, 0, 0, 0]
component_ipart.Owner.ResultBodies.GetGabarit(*gabarit) if hasattr(component_ipart.Owner.ResultBodies, "GetGabarit"):
g1 = gabarit[1:4] component_ipart.Owner.ResultBodies.GetGabarit(*gabarit)
g2 = gabarit[4:] g1 = gabarit[1:4]
c_size = [abs(g1[i] - g2[i]) for i in range(len(g1))] g2 = gabarit[4:]
g = max(c_size) c_size = [abs(g1[i] - g2[i]) for i in range(len(g1))]
# Масштабирование # Масштабирование
c_scale = c_sheet.Format.FormatHeight / sum(c_size) c_scale = (
c_sheet.Format.FormatHeight / sum(c_size)
if sum(c_size) > 0
else 1
)
# Получаем интерфейс 2D документа # Получаем интерфейс 2D документа
c_doc_2d = self.api7_module.IKompasDocument2D(c_doc) c_doc_2d = self.api7_module.IKompasDocument2D(c_doc)
@ -190,19 +197,27 @@ class KompasDocumentParser:
20, 20,
) )
filename = "_".join( filename = "_".join(
filter( filter(
None, None, [component_ipart.Marking, component_ipart.Name[:20]]
[component_ipart.Marking, component_ipart.Name[:20]],
) )
).replace(" ", "-") ).replace(" ", "-")
full_path = os.path.join(output_dir, f"{filename}.cdw") full_path = self.prepare_export_path(doc_path, filename, "cdw")
c_doc.SaveAs(full_path) c_doc.SaveAs(full_path)
print(f"[OK] Сохранён чертёж: {full_path}") logger.info(f"[OK] Сохранён чертёж: {full_path}")
drawings.append(
{
"name": f"{filename}.cdw",
"path": full_path,
"success": True,
"timestamp": time.time(),
}
)
# Сохранение спецификации для сборок # Сохранение спецификации для сборок
specifications = []
if doc_type == self.constants.ksDocumentAssembly: if doc_type == self.constants.ksDocumentAssembly:
spec = self.application.Documents.Add( spec = self.application.Documents.Add(
self.constants.ksDocumentSpecification self.constants.ksDocumentSpecification
@ -211,19 +226,56 @@ class KompasDocumentParser:
spec_doc.AttachedDocuments.Add(doc.PathName, True) spec_doc.AttachedDocuments.Add(doc.PathName, True)
filename = "Список_деталей" filename = "Список_деталей"
full_path = os.path.join(output_dir, f"{filename}.spw") full_path = self.prepare_export_path(doc_path, filename, "spw")
spec.SaveAs(full_path) spec.SaveAs(full_path)
print(f"[OK] Сохранена спецификация: {full_path}") logger.info(f"[OK] Сохранена спецификация: {full_path}")
specifications.append(
{
"name": f"{filename}.spw",
"path": full_path,
"success": True,
"timestamp": time.time(),
}
)
# Добавляем результат
result["result"].append(
{
"document_name": doc_name,
"drawings": drawings,
"specifications": specifications,
"success": len(drawings) > 0 or len(specifications) > 0,
"timestamp": time.time(),
}
)
except Exception as e: except Exception as e:
print(f"[ERROR] Ошибка при обработке документа #{i + 1}: {e}") logger.error(
traceback.print_exc() f"[ERROR] Ошибка при обработке документа #{i + 1}: {e}",
exc_info=True,
)
result["result"].append(
{
"document_name": f"Документ #{i + 1}",
"drawings": [],
"specifications": [],
"success": False,
"error": str(e),
"timestamp": time.time(),
}
)
return result
def save_to_iges(self): def save_to_iges(self):
"""Сохраняет открытые 3D-документы (детали/сборки) в формате IGES""" """Сохраняет открытые 3D-документы (детали/сборки) в формате IGES"""
print("Начинаем сохранение документов в формате IGES...") logger.info("Начинаем сохранение документов в формате IGES...")
result = {"result": []}
av_actions = self.get_available_actions() av_actions = self.get_available_actions()
docs_collection = self.application.Documents docs_collection = self.application.Documents
allowed_types = av_actions[KompasCommand.IGES]["allowed_types"]
for i in range(docs_collection.Count): for i in range(docs_collection.Count):
try: try:
@ -232,13 +284,13 @@ class KompasDocumentParser:
continue continue
doc_type = doc.DocumentType doc_type = doc.DocumentType
if doc_type not in av_actions[KompasCommand.IGES]["allowed_types"]: if doc_type not in allowed_types:
continue continue
doc.Active = True doc.Active = True
doc_path = doc.Path doc_path = doc.Path
doc_name = "-".join(doc.Name.split(".")[:-1]) doc_name = "-".join(doc.Name.split(".")[:-1])
print(f"Попытка сохранить: {doc_name}") logger.info(f"Попытка сохранить: {doc_name}")
# Получаем 3D-документ через API v5 # Получаем 3D-документ через API v5
doc_api5 = self.api5.ActiveDocument3D() doc_api5 = self.api5.ActiveDocument3D()
@ -252,163 +304,215 @@ class KompasDocumentParser:
save_params.Init() save_params.Init()
save_params.format = self.constants.ksConverterToIGES save_params.format = self.constants.ksConverterToIGES
ext = "igs" full_path = self.prepare_export_path(doc_path, doc_name, "igs")
output_dir = os.path.join(doc_path, ext) export_success = doc_api5.SaveAsToAdditionFormat(full_path, save_params)
filename = f"{doc_name}.{ext}" # Добавляем информацию о результате в массив
full_path = os.path.join(output_dir, filename) logger.info(f"Успешно сохранено: {full_path}")
result["result"].append(
{
"file": full_path,
"success": bool(export_success),
"document_name": doc_name,
"document_type": doc_type,
"timestamp": time.time(),
}
)
# Создаём директорию, если её нет if not export_success:
if not os.path.exists(output_dir): logger.error(f"Не удалось сохранить: {full_path}")
os.makedirs(output_dir)
# Сохраняем файл
result = doc_api5.SaveAsToAdditionFormat(full_path, save_params)
if result:
print(f"[OK] Сохранено: {full_path}")
else:
print(f"[ERROR] Не удалось сохранить: {full_path}")
except Exception as e: except Exception as e:
print(f"[ERROR] Ошибка при обработке документа #{i + 1}: {e}") logger.error(
traceback.print_exc() f"Ошибка при обработке документа #{i + 1}: {e}",
exc_info=True,
)
result["result"].append(
{
"file": None,
"success": False,
"error": str(e),
"document_index": i + 1,
"timestamp": time.time(),
}
)
return result
def _collect_bends_from_element(self, element):
bends = []
try:
feature = self.api7_module.IFeature7(element)
sub_features = feature.SubFeatures(1, True, False) or []
for item in sub_features:
if type(item) in (
self.api7_module.ISheetMetalBend,
self.api7_module.ISheetMetalLineBend,
self.api7_module.ISheetMetalBody,
):
sub_sheets = item.Owner.SubFeatures(1, True, False)
if sub_sheets:
for b in sub_sheets:
bend = self.api7_module.ISheetMetalBend(b)
bends.append(bend)
except Exception as e:
logger.error("Ошибка при сборе гибов из элемента", exc_info=True)
return bends
def _collect_welds_from_drawing(self, part):
welding = []
try:
drawing_context = self.api7_module.IDrawingContainer(part)
macro = self.api7_module.IMacroObject3D(drawing_context)
sub_features = macro.Owner.SubFeatures(1, True, False) or []
for item in sub_features:
if isinstance(item, self.api7_module.IUserDesignationCompObj):
welding.append(item)
except Exception as e:
logger.error(
"Ошибка при сборе сварок из чертежного контекста", exc_info=True
)
return welding
def _traverse_parts_recursive(self, part):
elements = []
welding = []
bends = []
try:
# Собираем сварки
welding += self._collect_welds_from_drawing(part)
# Обходим подчасти
doc_parts = self.api7_module.IParts7(part.Parts)
for j in range(doc_parts.Count):
element = doc_parts.Part(j)
if element.Parts.Count == 0:
elements.append(element)
bends += self._collect_bends_from_element(element)
result = self._traverse_parts_recursive(element)
elements += result["elements"]
welding += result["welding"]
bends += result["bends"]
except Exception as e:
logger.error("Ошибка при рекурсивном обходе частей", exc_info=True)
return {"elements": elements, "welding": welding, "bends": bends}
def _build_statistics_data(self, elements, welding):
stats = {"Name": {}, "Material": {}, "Area": {}}
# Сбор данных по элементам (кроме "Welding")
for e in elements:
for key in stats.keys():
if key == "Name":
value = f"{getattr(e, key)}, масса {round(getattr(e, 'Mass'), 3)}"
stats[key][value] = stats[key].get(value, 0) + 1
elif key == "Area":
mass_inertial_params = self.api7_module.IMassInertiaParam7(e)
area = mass_inertial_params.Area * 0.0001 # м²
material = getattr(e, "Material", "Неизвестно")
key_area = f"Площадь {material}, м²:"
stats[key][key_area] = round(stats[key].get(key_area, 0) + area, 6)
else:
try:
value = getattr(e, key)
stats[key][value] = stats[key].get(value, 0) + 1
except AttributeError:
logger.warning(f"Элемент не имеет атрибута '{key}', пропускаем")
# Общая площадь
stats["Area"]["Total"] = sum(stats["Area"].values())
# Добавляем сварки в статистику как отдельный раздел
stats["Welding"] = {}
for w in welding:
w_name_split = w.Name.split("-")
w_len = w_name_split[-1].split("@")[0]
stats["Welding"][w.Name] = w_len
if stats["Welding"]:
total_length = sum(
float(w_len)
for w_len in stats["Welding"].values()
if w_len.replace(".", "", 1).isdigit()
)
stats["Welding"]["Total"] = round(total_length, 2)
return stats
def collect_statistics(self): def collect_statistics(self):
"""Сбор статистики по элементам, гибам и сваркам в активном документе""" """Сбор статистики по элементам, гибам и сваркам в активном документе"""
print("Начинаем сбор статистики по элементам...") logger.info("Начинаем сбор статистики по элементам...")
# Получаем доступные типы из разрешённых действий
av_actions = self.get_available_actions() av_actions = self.get_available_actions()
allowed_types = av_actions[KompasCommand.STATS]["allowed_types"] allowed_types = av_actions[KompasCommand.STATS]["allowed_types"]
docs_collection = self.application.Documents docs_collection = self.application.Documents
result = {"result": []}
for i in range(docs_collection.Count): for i in range(docs_collection.Count):
try: try:
doc = docs_collection.Item(i) doc = docs_collection.Item(i)
if doc is None: if doc is None:
continue continue
doc_type = doc.DocumentType doc_type = doc.DocumentType
if doc_type not in allowed_types: if doc_type not in allowed_types:
continue continue
doc.Active = True doc.Active = True
doc_name = "-".join(doc.Name.split(".")[:-1]) doc_name = "-".join(doc.Name.split(".")[:-1])
print(f"Обрабатываем документ: {doc_name}") logger.info(f"Обрабатываем документ: {doc_name}")
doc_3d = self.api7_module.IKompasDocument3D(doc)
top_part = doc_3d.TopPart
elements = [] elements = []
bends = [] bends = []
welding = [] welding = []
def look_features(element): doc_3d = self.api7_module.IKompasDocument3D(doc)
feature = self.api7_module.IFeature7(element) top_part = doc_3d.TopPart
sub_features = feature.SubFeatures(1, True, False) or []
for item in sub_features:
if type(item) in (
self.api7_module.ISheetMetalBend,
self.api7_module.ISheetMetalLineBend,
self.api7_module.ISheetMetalBody,
):
sub_sheets = item.Owner.SubFeatures(1, True, False)
if sub_sheets:
for b in sub_sheets:
bend = self.api7_module.ISheetMetalBend(b)
bends.append(bend)
def look_drawing(part):
drawing_context = self.api7_module.IDrawingContainer(part)
macro = self.api7_module.IMacroObject3D(drawing_context)
sub_features = macro.Owner.SubFeatures(1, True, False) or []
for item in sub_features:
if isinstance(item, self.api7_module.IUserDesignationCompObj):
welding.append(item)
def find_el(part):
try:
drawing_context = self.api7_module.IDrawingContainer(part)
macro = self.api7_module.IMacroObject3D(drawing_context)
sub_features = macro.Owner.SubFeatures(1, True, False) or []
for item in sub_features:
if isinstance(item, self.api7_module.IUserDesignationCompObj):
welding.append(item)
except Exception as e:
print('Ошибка в DrawingContext:', e)
try:
doc_parts = self.api7_module.IParts7(part.Parts)
for j in range(doc_parts.Count):
element = doc_parts.Part(j)
if element.Parts.Count == 0:
elements.append(element)
look_features(element)
find_el(element)
except Exception as e:
print('Ошибка в Parts:', e)
if doc_type == self.constants.ksDocumentAssembly: if doc_type == self.constants.ksDocumentAssembly:
find_el(top_part) # Рекурсивный обход для сборки
res = self._traverse_parts_recursive(top_part)
elements += res["elements"]
bends += res["bends"]
welding += res["welding"]
else: else:
elements.append(top_part) # Для деталей просто добавляем верхнюю часть и собираем данные
look_drawing(top_part) elements += [top_part]
look_features(top_part) bends += self._collect_bends_from_element(top_part)
welding += self._collect_welds_from_drawing(top_part)
print(f"Найдено:\n Элементов {len(elements)}\n Гибов {len(bends)}\n") logger.info(
f"Найдено:\n Элементов {len(elements)}\n Гибов {len(bends)}\n"
)
sorted_stats = { stats = self._build_statistics_data(elements, welding)
"Name": {}, # Формируем объект документа для результата
"Material": {}, result["result"].append(
"Area": {}, {
} "name": doc_name,
"elements_count": len(elements),
for e in elements: "bends_count": len(bends),
for key in sorted_stats.keys(): "statistics": stats,
if key == 'Name': }
value = f"{getattr(e, key)}, масса {round(getattr(e, 'Mass'), 3)}" )
sorted_stats[key][value] = sorted_stats[key].get(value, 0) + 1
elif key == 'Area':
mass_inertial_params = self.api7_module.IMassInertiaParam7(e)
area = mass_inertial_params.Area * 0.0001 # м²
material = getattr(e, 'Material', 'Неизвестно')
key_area = f"Площадь {material}, м²:"
sorted_stats[key][key_area] = round(sorted_stats[key].get(key_area, 0) + area, 6)
else:
value = getattr(e, key)
sorted_stats[key][value] = sorted_stats[key].get(value, 0) + 1
sorted_stats['Area']['Total'] = sum(sorted_stats['Area'].values())
welding_key = "Welding"
for w in welding:
if welding_key not in sorted_stats:
sorted_stats[welding_key] = {}
w_name_split = w.Name.split('-')
w_len = w_name_split[-1].split('@')[0]
sorted_stats[welding_key][w.Name] = w_len
if welding_key in sorted_stats:
def float_f(n):
try:
return float(n)
except:
return 0
total_length = sum(float_f(v) for v in sorted_stats[welding_key].values())
sorted_stats[welding_key]["Total"] = total_length
for section in sorted_stats:
print(section)
for name, value in sorted_stats[section].items():
print(f"{name} -- {value}")
print('-----')
except Exception as e: except Exception as e:
print(f"[ERROR] Ошибка при обработке документа #{i + 1}: {e}") logger.error(f"[ERROR] Ошибка при обработке документа #{i + 1}: {e}")
traceback.print_exc() traceback.print_exc()
return result
def export_to_raster(self): def export_to_raster(self):
"""Экспорт открытых 2D-документов (чертежи, фрагменты, спецификации) в JPG и DXF. Создание многостраничного PDF.""" """Экспорт открытых 2D-документов (чертежи, фрагменты, спецификации) в JPG и DXF. Создание многостраничного PDF."""
print("Начинаем экспорт документов в растровый формат...") logger.info("Начинаем экспорт документов в растровый формат...")
images = [] images = []
first_doc_name = None first_doc_name = None
result = {"result": []}
# Получаем доступные типы для экспорта из разрешенных действий # Получаем доступные типы для экспорта из разрешенных действий
av_actions = self.get_available_actions() av_actions = self.get_available_actions()
@ -429,12 +533,18 @@ class KompasDocumentParser:
doc.Active = True doc.Active = True
doc_path = doc.Path doc_path = doc.Path
doc_name = os.path.splitext(doc.Name)[0] # Имя без расширения doc_name = os.path.splitext(doc.Name)[0] # Имя без расширения
print(f"Обрабатываем документ: {doc_name}") logger.info(f"Обрабатываем документ: {doc_name}")
# Сохраняем имя первого документа # Сохраняем имя первого документа
if first_doc_name is None: if first_doc_name is None:
doc7 = self.api7_module.IKompasDocument(doc) try:
first_doc_name = doc7.LayoutSheets.ItemByNumber(1).Stamp.Text(2).Str doc7 = self.api7_module.IKompasDocument(doc)
first_doc_name = (
doc7.LayoutSheets.ItemByNumber(1).Stamp.Text(2).Str
)
except Exception as e:
first_doc_name = "Без имени"
logger.warning("Не удалось получить имя документа из штампа")
# Получаем интерфейс 2D-документа # Получаем интерфейс 2D-документа
if doc_type == self.constants.ksDocumentSpecification: if doc_type == self.constants.ksDocumentSpecification:
@ -453,27 +563,49 @@ class KompasDocumentParser:
raster_params.extResolution = 96 raster_params.extResolution = 96
raster_params.format = 0 # JPEG format raster_params.format = 0 # JPEG format
paths = {}
# Сохранение в JPG и DXF # Сохранение в JPG и DXF
for ext in ["jpg", "dxf"]: for ext in ["jpg", "dxf"]:
output_dir = os.path.join(doc_path, ext) full_path = self.prepare_export_path(doc_path, doc_name, ext)
filename = f"{doc_name}.{ext}"
full_path = os.path.join(output_dir, filename)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
print(f"Создана папка: {output_dir}")
if ext == "jpg": if ext == "jpg":
doc_api5.SaveAsToRasterFormat(full_path, raster_params) doc_api5.SaveAsToRasterFormat(full_path, raster_params)
print(f"[OK] Сохранен JPG: {full_path}") logger.info(f"[OK] Сохранен JPG: {full_path}")
images.append(Image.open(full_path)) try:
img = Image.open(full_path)
images.append(img.copy())
img.close()
except Exception as e:
logger.error(
f"Не удалось открыть изображение: {full_path}",
exc_info=True,
)
elif ext == "dxf": elif ext == "dxf":
doc_api5.ksSaveToDXF(full_path) doc_api5.ksSaveToDXF(full_path)
print(f"[OK] Сохранен DXF: {full_path}") logger.info(f"Сохранен DXF: {full_path}")
paths[ext] = full_path
# Добавляем результат в список
result["result"].append(
{
"document_name": doc_name,
"document_type": doc_type,
"paths": paths,
"success": True,
"timestamp": time.time(),
}
)
except Exception as e: except Exception as e:
print(f"[ERROR] Ошибка при обработке документа #{i + 1}: {e}") logger.error(f"[ERROR] Не удалось создать PDF: {e}", exc_info=True)
traceback.print_exc() result["result"].append(
{
"file": None,
"success": False,
"error": str(e),
"document_index": i + 1,
"timestamp": time.time(),
}
)
# Создание PDF # Создание PDF
if images: if images:
@ -503,9 +635,20 @@ class KompasDocumentParser:
format="PDF", format="PDF",
resolution=96.0, resolution=96.0,
) )
print(f"[OK] PDF успешно сохранен: {pdf_output_path}") logger.info(f"[OK] PDF успешно сохранен: {pdf_output_path}")
result["result"].append(
{
"document_name": pdf_output_path,
"document_type": "pdf",
"paths": pdf_output_path,
"success": True,
"timestamp": time.time(),
}
)
except Exception as e: except Exception as e:
print(f"[ERROR] Не удалось создать PDF: {e}") logger.info(f"[ERROR] Не удалось создать PDF: {e}")
return result
def get_available_actions(self): def get_available_actions(self):
""" """