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 enums import KompasCommand
from logger import logger
from parser.main import KompasDocumentParser
class PythonEventEmitter(QObject):
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):
def __init__(self, browser: QWebEngineView):
super().__init__()
@ -24,26 +33,34 @@ class PythonJSBridge(QObject):
self.channel.registerObject("pyjs", self)
self.channel.registerObject("pyjs_events", self.emitter)
self.kompas = KompasDocumentParser()
@pyqtSlot(str, str, result=str)
def callFromJS(self, command: str, data_json: str):
print(f"[Python] Получена команда: {command}")
data = None
if command == KompasCommand.OPEN_KOMPAS:
data = self.kompas.get_open_documents()
if command == KompasCommand.GET_AVAILABLE_ACTIONS:
data = self.kompas.get_available_actions()
if command == KompasCommand.IGES:
data = self.kompas.save_to_iges()
if command == KompasCommand.EXPORT_RASTER:
data = self.kompas.export_to_raster()
if command == KompasCommand.PROJECT_SUPPORT:
data = self.kompas.create_drawing_for_parts()
if command == KompasCommand.STATS:
data = self.kompas.collect_statistics()
return json.dumps(data, ensure_ascii=False)
logger.info(f"[Python] Получена команда: {command}")
try:
if command == KompasCommand.OPEN_KOMPAS:
data = self.kompas.get_open_documents()
elif command == KompasCommand.GET_AVAILABLE_ACTIONS:
data = self.kompas.get_available_actions()
elif command == KompasCommand.IGES:
data = self.kompas.save_to_iges()
elif command == KompasCommand.EXPORT_RASTER:
data = self.kompas.export_to_raster()
elif command == KompasCommand.PROJECT_SUPPORT:
data = self.kompas.create_drawing_for_parts()
elif command == KompasCommand.STATS:
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):
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 traceback
import pythoncom
import time
from win32com.client import Dispatch, gencache
from PIL import Image, ImageDraw, ImageFont
from enums import KompasCommand
from logger import logger
ids = {
"api_5": "{0422828C-F174-495E-AC5D-D31014DBBE87}",
@ -58,6 +59,23 @@ class KompasDocumentParser:
traceback.print_exc() # <-- Выводит номер строки, файл и стек
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):
"""Возвращает список информации о всех открытых документах"""
@ -82,19 +100,17 @@ class KompasDocumentParser:
print(f"Ошибка при обработке документа #{i + 1}: {e}")
return documents
def create_drawing_for_parts(self):
"""
Создание чертежей для всех уникальных деталей из открытых деталей и сборок.
Также создаёт спецификацию для сборок.
"""
print("Начинаем создание чертежей для деталей...")
saving_path = "../cdw/"
logger.info("Начинаем создание чертежей для деталей...")
result = {"result": []}
# Получаем доступные типы из разрешённых действий
av_actions = self.get_available_actions()
allowed_types = av_actions[KompasCommand.PROJECT_SUPPORT]["allowed_types"]
docs_collection = self.application.Documents
for i in range(docs_collection.Count):
@ -103,58 +119,45 @@ class KompasDocumentParser:
if doc is None:
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
if doc_type not in allowed_types:
continue
doc.Active = True
doc_path = doc.Path
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_components = []
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)
top_part = doc_3d.TopPart
# Используем общую рекурсивную функцию вместо all_elements
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:
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)
if component_ipart.Standard:
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_sheet = c_layout.Item(0)
c_sheet.Format.Format = self.constants.ksFormatA3
@ -165,14 +168,18 @@ class KompasDocumentParser:
c_size = [1, 1, 1]
if component_ipart.Owner.ResultBodies:
gabarit = [0, 0, 0, 0, 0, 0]
component_ipart.Owner.ResultBodies.GetGabarit(*gabarit)
g1 = gabarit[1:4]
g2 = gabarit[4:]
c_size = [abs(g1[i] - g2[i]) for i in range(len(g1))]
g = max(c_size)
if hasattr(component_ipart.Owner.ResultBodies, "GetGabarit"):
component_ipart.Owner.ResultBodies.GetGabarit(*gabarit)
g1 = gabarit[1:4]
g2 = gabarit[4:]
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 документа
c_doc_2d = self.api7_module.IKompasDocument2D(c_doc)
@ -190,19 +197,27 @@ class KompasDocumentParser:
20,
)
filename = "_".join(
filter(
None,
[component_ipart.Marking, component_ipart.Name[:20]],
None, [component_ipart.Marking, component_ipart.Name[:20]]
)
).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)
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:
spec = self.application.Documents.Add(
self.constants.ksDocumentSpecification
@ -211,19 +226,56 @@ class KompasDocumentParser:
spec_doc.AttachedDocuments.Add(doc.PathName, True)
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)
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:
print(f"[ERROR] Ошибка при обработке документа #{i + 1}: {e}")
traceback.print_exc()
logger.error(
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):
"""Сохраняет открытые 3D-документы (детали/сборки) в формате IGES"""
print("Начинаем сохранение документов в формате IGES...")
logger.info("Начинаем сохранение документов в формате IGES...")
result = {"result": []}
av_actions = self.get_available_actions()
docs_collection = self.application.Documents
allowed_types = av_actions[KompasCommand.IGES]["allowed_types"]
for i in range(docs_collection.Count):
try:
@ -232,13 +284,13 @@ class KompasDocumentParser:
continue
doc_type = doc.DocumentType
if doc_type not in av_actions[KompasCommand.IGES]["allowed_types"]:
if doc_type not in allowed_types:
continue
doc.Active = True
doc_path = doc.Path
doc_name = "-".join(doc.Name.split(".")[:-1])
print(f"Попытка сохранить: {doc_name}")
logger.info(f"Попытка сохранить: {doc_name}")
# Получаем 3D-документ через API v5
doc_api5 = self.api5.ActiveDocument3D()
@ -252,163 +304,215 @@ class KompasDocumentParser:
save_params.Init()
save_params.format = self.constants.ksConverterToIGES
ext = "igs"
output_dir = os.path.join(doc_path, ext)
filename = f"{doc_name}.{ext}"
full_path = os.path.join(output_dir, filename)
full_path = self.prepare_export_path(doc_path, doc_name, "igs")
export_success = doc_api5.SaveAsToAdditionFormat(full_path, save_params)
# Добавляем информацию о результате в массив
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 os.path.exists(output_dir):
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}")
if not export_success:
logger.error(f"Не удалось сохранить: {full_path}")
except Exception as e:
print(f"[ERROR] Ошибка при обработке документа #{i + 1}: {e}")
traceback.print_exc()
logger.error(
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):
"""Сбор статистики по элементам, гибам и сваркам в активном документе"""
print("Начинаем сбор статистики по элементам...")
# Получаем доступные типы из разрешённых действий
logger.info("Начинаем сбор статистики по элементам...")
av_actions = self.get_available_actions()
allowed_types = av_actions[KompasCommand.STATS]["allowed_types"]
docs_collection = self.application.Documents
result = {"result": []}
for i in range(docs_collection.Count):
try:
doc = docs_collection.Item(i)
if doc is None:
continue
doc_type = doc.DocumentType
if doc_type not in allowed_types:
continue
doc.Active = True
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 = []
bends = []
welding = []
def look_features(element):
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)
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)
doc_3d = self.api7_module.IKompasDocument3D(doc)
top_part = doc_3d.TopPart
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:
elements.append(top_part)
look_drawing(top_part)
look_features(top_part)
# Для деталей просто добавляем верхнюю часть и собираем данные
elements += [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 = {
"Name": {},
"Material": {},
"Area": {},
}
for e in elements:
for key in sorted_stats.keys():
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('-----')
stats = self._build_statistics_data(elements, welding)
# Формируем объект документа для результата
result["result"].append(
{
"name": doc_name,
"elements_count": len(elements),
"bends_count": len(bends),
"statistics": stats,
}
)
except Exception as e:
print(f"[ERROR] Ошибка при обработке документа #{i + 1}: {e}")
logger.error(f"[ERROR] Ошибка при обработке документа #{i + 1}: {e}")
traceback.print_exc()
return result
def export_to_raster(self):
"""Экспорт открытых 2D-документов (чертежи, фрагменты, спецификации) в JPG и DXF. Создание многостраничного PDF."""
print("Начинаем экспорт документов в растровый формат...")
logger.info("Начинаем экспорт документов в растровый формат...")
images = []
first_doc_name = None
result = {"result": []}
# Получаем доступные типы для экспорта из разрешенных действий
av_actions = self.get_available_actions()
@ -429,12 +533,18 @@ class KompasDocumentParser:
doc.Active = True
doc_path = doc.Path
doc_name = os.path.splitext(doc.Name)[0] # Имя без расширения
print(f"Обрабатываем документ: {doc_name}")
logger.info(f"Обрабатываем документ: {doc_name}")
# Сохраняем имя первого документа
if first_doc_name is None:
doc7 = self.api7_module.IKompasDocument(doc)
first_doc_name = doc7.LayoutSheets.ItemByNumber(1).Stamp.Text(2).Str
try:
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-документа
if doc_type == self.constants.ksDocumentSpecification:
@ -453,27 +563,49 @@ class KompasDocumentParser:
raster_params.extResolution = 96
raster_params.format = 0 # JPEG format
paths = {}
# Сохранение в JPG и DXF
for ext in ["jpg", "dxf"]:
output_dir = os.path.join(doc_path, 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}")
full_path = self.prepare_export_path(doc_path, doc_name, ext)
if ext == "jpg":
doc_api5.SaveAsToRasterFormat(full_path, raster_params)
print(f"[OK] Сохранен JPG: {full_path}")
images.append(Image.open(full_path))
logger.info(f"[OK] Сохранен JPG: {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":
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:
print(f"[ERROR] Ошибка при обработке документа #{i + 1}: {e}")
traceback.print_exc()
logger.error(f"[ERROR] Не удалось создать PDF: {e}", exc_info=True)
result["result"].append(
{
"file": None,
"success": False,
"error": str(e),
"document_index": i + 1,
"timestamp": time.time(),
}
)
# Создание PDF
if images:
@ -503,9 +635,20 @@ class KompasDocumentParser:
format="PDF",
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:
print(f"[ERROR] Не удалось создать PDF: {e}")
logger.info(f"[ERROR] Не удалось создать PDF: {e}")
return result
def get_available_actions(self):
"""