переделал приложение, сделал нормальное отображение информации, поменял вид

This commit is contained in:
Andrey 2025-03-25 14:41:34 +03:00
parent 310ecb6fda
commit 864af4e1b4
6 changed files with 119 additions and 131 deletions

185
app.py
View File

@ -2,156 +2,123 @@ from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window
from kivy.clock import Clock
from export_opened_to_raster import export_opened_to_raster # Импорт функции обработки
from save_to_iges import save_opened_to_iges # Импорт функции сохранения в IGES
from get_all_sheets import get_all_sheets # Импорт функции для получения всех листов
from project_support import project_support # Импорт функции Project Support
from kivy.metrics import dp
from kivy.properties import StringProperty
from export_opened_to_raster import export_opened_to_raster
from save_to_iges import save_opened_to_iges
from get_all_sheets import get_all_sheets
from project_support import project_support
class MyApp(App):
class ScrollableLabel(ScrollView):
text = StringProperty('')
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.label = Label(
size_hint_y=None,
font_size=dp(18),
halign='left',
valign='top',
padding=(dp(15), dp(15)),
markup=True
)
self.label.bind(
texture_size=self._update_label_size,
width=lambda *x: setattr(self.label, 'text_size', (self.width, None))
)
self.bind(
width=lambda *x: setattr(self.label, 'text_size', (self.width, None))
)
self.add_widget(self.label)
def _update_label_size(self, instance, size):
instance.size = (self.width, size[1])
def on_text(self, instance, value):
self.label.text = value
class KompasApp(App):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.title = "Kompas Saver" # Установка заголовка окна
def build(self):
# Устанавливаем размер окна (подходит для ПК)
Window.size = (800, 600)
# Главный контейнер (горизонтальный)
main_layout = BoxLayout(orientation='horizontal', spacing=10, padding=10)
# Левая панель (на одну треть экрана)
# Левая панель (кнопки)
left_panel = BoxLayout(orientation='vertical', size_hint=(0.3, 1), spacing=10)
# Заголовок
header = Label(text="Kompas Saver", size_hint=(1, 0.1), font_size=24, bold=True)
# Кнопки слева
button1 = Button(text="Создать PDF", on_press=self.process_kompas)
button2 = Button(text="Сохранить в IGES", on_press=self.save_to_iges)
button3 = Button(text="Get All Sheets", on_press=self.get_all_sheets)
button4 = Button(text="Project Support", on_press=self.project_support)
# Добавляем заголовок и кнопки в левую панель
button3 = Button(text="Get all sheets", on_press=self.get_all_sheets)
button4 = Button(text="Создать чертеж 3D модели", on_press=self.project_support)
left_panel.add_widget(header)
left_panel.add_widget(button1)
left_panel.add_widget(button2)
left_panel.add_widget(button3)
left_panel.add_widget(button4)
# Правая панель (пространство для контента)
# Правая панель (прокручиваемый текст)
self.right_panel = BoxLayout(orientation='vertical', size_hint=(0.7, 1))
self.right_panel.add_widget(Label(text="Выберите действие", font_size=18))
self.scroll_label = ScrollableLabel()
self.right_panel.add_widget(self.scroll_label)
# Добавляем левую и правую панели в главный контейнер
main_layout.add_widget(left_panel)
main_layout.add_widget(self.right_panel)
return main_layout
def show_content(self, instance):
# Очищаем правую панель
self.right_panel.clear_widgets()
# Добавляем контент в зависимости от нажатой кнопки
if instance.text == "Кнопка 4":
content = Label(text="Контент для Кнопки 4", font_size=18)
self.right_panel.add_widget(content)
def update_output(self, text):
self.scroll_label.text = text
def process_kompas(self, instance):
# Очищаем правую панель
self.right_panel.clear_widgets()
# Добавляем сообщение о начале обработки
self.right_panel.add_widget(Label(text="Обработка документов КОМПАС...", font_size=18))
# Запускаем обработку в отдельном потоке (чтобы не блокировать интерфейс)
Clock.schedule_once(lambda dt: self.run_kompas_processing(), 0.1)
def run_kompas_processing(self):
self.update_output("Конвертация в PDF...\n")
Clock.schedule_once(lambda dt: self._run_export(), 0.2)
def _run_export(self):
try:
# Вызываем функцию обработки документов КОМПАС
result = export_opened_to_raster()
# Обновляем правую панель с результатом
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=result, font_size=18))
self.update_output(result)
except Exception as e:
# В случае ошибки выводим сообщение
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=f"Ошибка: {e}", font_size=18))
self.update_output(f"[color=ff3333]Ошибка: {str(e)}[/color]")
def save_to_iges(self, instance):
# Очищаем правую панель
self.right_panel.clear_widgets()
# Добавляем сообщение о начале сохранения
self.right_panel.add_widget(Label(text="Сохранение документов в IGES...", font_size=18))
# Запускаем сохранение в отдельном потоке (чтобы не блокировать интерфейс)
Clock.schedule_once(lambda dt: self.run_save_to_iges(), 0.1)
def run_save_to_iges(self):
self.update_output("Экспорт в IGES...")
Clock.schedule_once(lambda dt: self._run_save_iges(), 0.2)
def _run_save_iges(self):
try:
# Вызываем функцию сохранения в IGES
result = save_opened_to_iges()
# Обновляем правую панель с результатом
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=result, font_size=18))
self.update_output(result)
except Exception as e:
# В случае ошибки выводим сообщение
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=f"Ошибка: {e}", font_size=18))
self.update_output(f"[color=ff3333]Ошибка: {str(e)}[/color]")
def get_all_sheets(self, instance):
# Очищаем правую панель
self.right_panel.clear_widgets()
# Добавляем сообщение о начале анализа
self.right_panel.add_widget(Label(text="Анализ документов...", font_size=18))
# Запускаем анализ в отдельном потоке (чтобы не блокировать интерфейс)
Clock.schedule_once(lambda dt: self.run_get_all_sheets(), 0.1)
def run_get_all_sheets(self):
self.update_output("Получение списка листов...")
Clock.schedule_once(lambda dt: self._run_get_sheets(), 0.2)
def _run_get_sheets(self):
try:
# Вызываем функцию для получения всех листов
result = get_all_sheets()
# Обновляем правую панель с результатом
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=result, font_size=18))
self.update_output(result)
except Exception as e:
# В случае ошибки выводим сообщение
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=f"Ошибка: {e}", font_size=18))
self.update_output(f"[color=ff3333]Ошибка: {str(e)}[/color]")
def project_support(self, instance):
# Очищаем правую панель
self.right_panel.clear_widgets()
# Добавляем сообщение о начале поддержки проекта
self.right_panel.add_widget(Label(text="Поддержка проекта...", font_size=18))
# Запускаем поддержку проекта в отдельном потоке (чтобы не блокировать интерфейс)
Clock.schedule_once(lambda dt: self.run_project_support(), 0.1)
def run_project_support(self):
self.update_output("Project Support...")
Clock.schedule_once(lambda dt: self._run_project_support(), 0.2)
def _run_project_support(self):
try:
# Вызываем функцию поддержки проекта
result = project_support()
# Обновляем правую панель с результатом
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=result, font_size=18))
self.update_output(result)
except Exception as e:
# В случае ошибки выводим сообщение
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=f"Ошибка: {e}", font_size=18))
self.update_output(f"[color=ff3333]Ошибка: {str(e)}[/color]")
# Запуск приложения
if __name__ == '__main__':
MyApp().run()
KompasApp().run()

View File

@ -768,7 +768,7 @@
[],
False,
False,
1742562368,
1742809051,
[('runw.exe',
'c:\\projects\\3knopki\\.venv\\Lib\\site-packages\\PyInstaller\\bootloader\\Windows-64bit-intel\\runw.exe',
'EXECUTABLE')],

BIN
dist/app.exe vendored

Binary file not shown.

View File

@ -2,11 +2,18 @@
import pythoncom
from win32com.client import Dispatch, gencache
import os
import sys
def save_opened_to_iges():
try:
# Получи API интерфейсов версии 5
# Инициализация COM системы
pythoncom.CoInitialize()
# Получаем API интерфейсы
api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
if api5_module is None:
raise Exception("Не удалось загрузить API Kompas 5")
api5_api = api5_module.KompasObject(
Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(
api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch
@ -14,6 +21,9 @@ def save_opened_to_iges():
)
module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
if module is None:
raise Exception("Не удалось загрузить API Kompas 7")
api = module.IKompasAPIObject(
Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(
module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch
@ -25,8 +35,12 @@ def save_opened_to_iges():
).constants
application = module.IApplication(api)
application.Visible = True
result = []
ext = "igs"
saved_files = 0
for i in range(application.Documents.Count):
try:
doc = application.Documents.Open(i)
@ -34,32 +48,39 @@ def save_opened_to_iges():
if doc_type in [k_constants.ksDocumentPart, k_constants.ksDocumentAssembly]:
doc.Active = True
doc_path = doc.Path
doc_name = "-".join(doc.Name.split(".")[:-1])
print(f"Попытка сохранить {doc_name}")
doc_name = os.path.splitext(doc.Name)[0]
save_path = os.path.join(doc_path, ext)
os.makedirs(save_path, exist_ok=True)
filename = f"{doc_name}.{ext}"
full_path = os.path.normpath(os.path.join(save_path, filename))
doc_3d = module.IKompasDocument3D(doc)
doc_api5 = api5_api.ActiveDocument3D()
save_params = doc_api5.AdditionFormatParam()
save_params.Init()
save_params.format = k_constants.ksConverterToIGES
ext = "igs"
path = f"{doc_path}{ext}/"
filename = f"{doc_name}.{ext}"
full_path = "".join([path, filename])
if not os.path.exists(path):
os.makedirs(path)
doc_api5.SaveAsToAdditionFormat(full_path, save_params)
print(f"Файл {doc_name} сохранен как IGES: {full_path}")
saved_files += 1
result.append(f"Успешно сохранено: {full_path}")
except Exception as e:
print(f"Ошибка при обработке документа {i}: {e}")
return "Сохранение в IGES завершено."
result.append(f"Ошибка при обработке документа {i} ({doc.Name}): {str(e)}")
if saved_files > 0:
result.insert(0, f"\nУспешно сохранено файлов: {saved_files}")
else:
result.append("Не найдено подходящих документов для сохранения")
return "\n".join(result)
except Exception as e:
return f"Произошла ошибка: {e}"
return f"Критическая ошибка: {str(e)}"
finally:
pythoncom.CoUninitialize()
if __name__ == "__main__":
print(save_opened_to_iges())