добавил функционал приложению для работы с компасом

This commit is contained in:
Andrey 2025-03-21 16:08:08 +03:00
parent 05fbce1c43
commit 310ecb6fda
20 changed files with 16295 additions and 7232 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

122
app.py
View File

@ -2,9 +2,12 @@ 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.gridlayout import GridLayout
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
class MyApp(App):
def build(self):
@ -18,18 +21,20 @@ class MyApp(App):
left_panel = BoxLayout(orientation='vertical', size_hint=(0.3, 1), spacing=10)
# Заголовок
header = Label(text="Моё приложение", size_hint=(1, 0.1), font_size=24, bold=True)
header = Label(text="Kompas Saver", size_hint=(1, 0.1), font_size=24, bold=True)
# Кнопки слева
button1 = Button(text="Кнопка 1", on_press=self.show_content)
button2 = Button(text="Кнопка 2", on_press=self.show_content)
button3 = Button(text="Кнопка 3", on_press=self.show_content)
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)
# Добавляем заголовок и кнопки в левую панель
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))
@ -46,16 +51,107 @@ class MyApp(App):
self.right_panel.clear_widgets()
# Добавляем контент в зависимости от нажатой кнопки
if instance.text == "Кнопка 1":
content = Label(text="Контент для Кнопки 1", font_size=18)
elif instance.text == "Кнопка 2":
content = Label(text="Контент для Кнопки 2", font_size=18)
elif instance.text == "Кнопка 3":
content = Label(text="Контент для Кнопки 3", font_size=18)
if instance.text == "Кнопка 4":
content = Label(text="Контент для Кнопки 4", font_size=18)
self.right_panel.add_widget(content)
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):
try:
# Вызываем функцию обработки документов КОМПАС
result = export_opened_to_raster()
# Обновляем правую панель с результатом
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=result, font_size=18))
except Exception as e:
# В случае ошибки выводим сообщение
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=f"Ошибка: {e}", font_size=18))
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):
try:
# Вызываем функцию сохранения в IGES
result = save_opened_to_iges()
# Обновляем правую панель с результатом
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=result, font_size=18))
except Exception as e:
# В случае ошибки выводим сообщение
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=f"Ошибка: {e}", font_size=18))
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):
try:
# Вызываем функцию для получения всех листов
result = get_all_sheets()
# Обновляем правую панель с результатом
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=result, font_size=18))
except Exception as e:
# В случае ошибки выводим сообщение
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=f"Ошибка: {e}", font_size=18))
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):
try:
# Вызываем функцию поддержки проекта
result = project_support()
# Обновляем правую панель с результатом
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=result, font_size=18))
except Exception as e:
# В случае ошибки выводим сообщение
self.right_panel.clear_widgets()
self.right_panel.add_widget(Label(text=f"Ошибка: {e}", font_size=18))
# Запуск приложения
if __name__ == '__main__':
MyApp().run()

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -14,18 +14,17 @@ Types if import:
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
tracking down the missing module yourself. Thanks!
missing module named pyimod02_importers - imported by C:\Users\Андрей\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed)
missing module named 'org.python' - imported by copy (optional), xml.sax (delayed, conditional)
missing module named org - imported by pickle (optional)
missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), http.server (delayed, optional), webbrowser (delayed), netrc (delayed, conditional), getpass (delayed)
missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional)
missing module named posix - imported by posixpath (optional), shutil (conditional), importlib._bootstrap_external (conditional), os (conditional, optional)
missing module named resource - imported by posix (top-level)
missing module named urllib.pathname2url - imported by urllib (conditional), kivy.core.audio.audio_gstplayer (conditional), kivy.core.video.video_gstplayer (conditional)
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
missing module named pwd - imported by posixpath (delayed, conditional, optional), pathlib (delayed, optional), shutil (delayed, optional), tarfile (optional), subprocess (delayed, conditional, optional), http.server (delayed, optional), webbrowser (delayed), netrc (delayed, conditional), getpass (delayed)
missing module named grp - imported by pathlib (delayed, optional), shutil (delayed, optional), tarfile (optional), subprocess (delayed, conditional, optional)
missing module named _posixsubprocess - imported by subprocess (conditional), multiprocessing.util (delayed)
missing module named fcntl - imported by subprocess (optional), kivy.input.providers.hidinput (conditional), kivy.input.providers.linuxwacom (conditional)
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
missing module named org - imported by pickle (optional)
missing module named urllib.pathname2url - imported by urllib (conditional), kivy.core.audio.audio_gstplayer (conditional), kivy.core.video.video_gstplayer (conditional)
missing module named posix - imported by os (conditional, optional), posixpath (optional), importlib._bootstrap_external (conditional), shutil (conditional)
missing module named resource - imported by posix (top-level)
missing module named 'org.python' - imported by copy (optional), xml.sax (delayed, conditional)
missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
missing module named _scproxy - imported by urllib.request (conditional)
missing module named termios - imported by tty (top-level), getpass (optional)
@ -36,53 +35,68 @@ missing module named multiprocessing.get_context - imported by multiprocessing (
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named Queue - imported by kivy.compat (optional)
missing module named PIL - imported by kivy.atlas (delayed, optional), kivy.core.text.text_pil (top-level), kivy.core.image.img_pil (optional), pygments.formatters.img (optional)
missing module named Leap - imported by kivy.input.providers.leapfinger (delayed)
missing module named pygame - imported by kivy.input.providers.androidjoystick (conditional), kivy.app (delayed, conditional), kivy.core.audio.audio_pygame (conditional, optional), kivy.core.window.window_pygame (top-level), kivy.support (delayed), kivy.core.clipboard.clipboard_pygame (optional), kivy.core.image.img_pygame (optional), kivy.core.text.text_pygame (optional)
missing module named oscpy - imported by kivy.input.providers.tuio (delayed, optional)
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
missing module named pyimod02_importers - imported by C:\projects\3knopki\.venv\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgres.py (delayed), C:\projects\3knopki\.venv\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed)
missing module named _manylinux - imported by pkg_resources._vendor.packaging._manylinux (delayed, optional), packaging._manylinux (delayed, optional)
missing module named jinja2 - imported by pkg_resources._vendor.pyparsing.diagram (top-level)
missing module named pyparsing - imported by pkg_resources._vendor.pyparsing.diagram (top-level)
missing module named railroad - imported by pkg_resources._vendor.pyparsing.diagram (top-level)
missing module named readline - imported by site (delayed, optional), rlcompleter (optional), cmd (delayed, conditional, optional), code (delayed, conditional, optional), pdb (delayed, optional)
missing module named 'pkg_resources.extern.pyparsing' - imported by pkg_resources._vendor.packaging.markers (top-level), pkg_resources._vendor.packaging.requirements (top-level)
missing module named 'pkg_resources.extern.importlib_resources' - imported by pkg_resources._vendor.jaraco.text (optional)
missing module named 'pkg_resources.extern.more_itertools' - imported by pkg_resources._vendor.jaraco.functools (top-level)
missing module named 'com.sun' - imported by pkg_resources._vendor.appdirs (delayed, conditional, optional)
missing module named com - imported by pkg_resources._vendor.appdirs (delayed)
missing module named 'win32com.gen_py' - imported by win32com (conditional, optional)
missing module named _winreg - imported by platform (delayed, optional), pkg_resources._vendor.appdirs (delayed, conditional), pygments.formatters.img (optional)
missing module named pkg_resources.extern.packaging - imported by pkg_resources.extern (top-level), pkg_resources (top-level)
missing module named pkg_resources.extern.appdirs - imported by pkg_resources.extern (top-level), pkg_resources (top-level)
missing module named 'pkg_resources.extern.jaraco' - imported by pkg_resources (top-level), pkg_resources._vendor.jaraco.text (top-level)
missing module named vms_lib - imported by platform (delayed, optional)
missing module named java - imported by platform (delayed)
missing module named typing_extensions - imported by PIL._typing (conditional, optional)
missing module named numpy - imported by PIL._typing (conditional, optional), kivy.core.camera.camera_android (delayed), kivy.core.camera.camera_picamera (top-level)
missing module named olefile - imported by PIL.FpxImagePlugin (top-level), PIL.MicImagePlugin (top-level)
missing module named defusedxml - imported by PIL.Image (optional)
missing module named gobject - imported by kivy.support (delayed, optional)
missing module named gi - imported by kivy.support (delayed, optional), kivy.core.clipboard.clipboard_gtk3 (top-level)
missing module named android - imported by kivy.metrics (delayed, conditional), kivy.core.window (delayed, conditional), kivy.base (delayed, optional), kivy.input.providers.androidjoystick (optional), kivy.app (delayed, conditional), kivy.core.window.window_sdl2 (delayed, conditional), kivy.core.clipboard.clipboard_android (top-level), kivy.core.audio.audio_android (top-level), kivy.support (delayed, optional), kivy.core.window.window_pygame (conditional, optional)
missing module named pygame - imported by kivy.input.providers.androidjoystick (conditional), kivy.app (delayed, conditional), kivy.core.clipboard.clipboard_pygame (optional), kivy.core.audio.audio_pygame (conditional, optional), kivy.support (delayed), kivy.core.text.text_pygame (optional), kivy.core.image.img_pygame (optional), kivy.core.window.window_pygame (top-level)
missing module named Image - imported by kivy.core.image.img_pil (optional), docutils.parsers.rst.directives.images (optional)
missing module named 'PIL.Image' - imported by docutils.parsers.rst.directives.images (optional)
missing module named 'gi.repository' - imported by kivy.core.clipboard.clipboard_gtk3 (top-level), kivy.core.camera.camera_gi (top-level)
missing module named pygments.formatters.BBCodeFormatter - imported by pygments.formatters (top-level), kivy.uix.codeinput (top-level)
missing module named ctags - imported by pygments.formatters.html (optional)
missing module named pygments.lexers.PrologLexer - imported by pygments.lexers (top-level), pygments.lexers.cplint (top-level)
missing module named _winreg - imported by platform (delayed, optional), pygments.formatters.img (optional)
missing module named chardet - imported by pygments.lexer (delayed, conditional, optional)
missing module named roman - imported by docutils.writers.latex2e (optional), docutils.writers.manpage (optional)
missing module named gobject - imported by kivy.support (delayed, optional)
missing module named gi - imported by kivy.support (delayed, optional), kivy.core.clipboard.clipboard_gtk3 (top-level)
missing module named 'gi.repository' - imported by kivy.core.clipboard.clipboard_gtk3 (top-level), kivy.core.camera.camera_gi (top-level)
missing module named AppKit - imported by kivy.core.spelling.spelling_osxappkit (top-level)
missing module named ffmpeg - imported by kivy.core.video.video_ffmpeg (optional)
missing module named 'ffpyplayer.tools' - imported by kivy.core.audio.audio_ffpyplayer (optional), kivy.core.image.img_ffpyplayer (top-level), kivy.core.video.video_ffpyplayer (optional)
missing module named 'ffpyplayer.player' - imported by kivy.core.audio.audio_ffpyplayer (optional), kivy.core.video.video_ffpyplayer (optional)
missing module named ffpyplayer - imported by kivy.core.audio.audio_ffpyplayer (optional), kivy.core.image.img_ffpyplayer (top-level), kivy.core.video.video_ffpyplayer (optional)
missing module named numpy - imported by kivy.core.camera.camera_android (delayed), kivy.core.camera.camera_picamera (top-level)
missing module named picamera - imported by kivy.core.camera.camera_picamera (top-level)
missing module named smb - imported by kivy.loader (delayed, conditional, optional)
missing module named ios - imported by kivy.metrics (delayed, conditional), kivy.core.window (delayed)
missing module named jnius - imported by kivy.metrics (delayed, conditional), kivy.app (delayed, conditional), kivy.core.camera.camera_android (top-level), kivy.core.clipboard.clipboard_android (top-level), kivy.core.audio.audio_android (top-level)
missing module named 'ffpyplayer.tools' - imported by kivy.core.video.video_ffpyplayer (optional), kivy.core.image.img_ffpyplayer (top-level), kivy.core.audio.audio_ffpyplayer (optional)
missing module named 'ffpyplayer.player' - imported by kivy.core.video.video_ffpyplayer (optional), kivy.core.audio.audio_ffpyplayer (optional)
missing module named ffpyplayer - imported by kivy.core.video.video_ffpyplayer (optional), kivy.core.image.img_ffpyplayer (top-level), kivy.core.audio.audio_ffpyplayer (optional)
missing module named 'pyobjus.dylib_manager' - imported by kivy.core.audio.audio_avplayer (top-level), kivy.core.clipboard.clipboard_nspaste (optional)
missing module named pyobjus - imported by kivy.core.audio.audio_avplayer (top-level), kivy.core.clipboard.clipboard_nspaste (optional)
missing module named 'kivy.core.text._text_pango' - imported by kivy.core.text.text_pango (top-level)
missing module named jnius - imported by kivy.metrics (delayed, conditional), kivy.app (delayed, conditional), kivy.core.clipboard.clipboard_android (top-level), kivy.core.camera.camera_android (top-level), kivy.core.audio.audio_android (top-level)
missing module named cv2 - imported by kivy.core.camera.camera_opencv (optional), kivy.core.camera.camera_android (delayed)
missing module named enchant - imported by kivy.core.spelling.spelling_enchant (top-level)
missing module named 'pygame.scrap' - imported by kivy.core.clipboard.clipboard_pygame (optional)
missing module named kivy.lib.vidcore_lite.egl - imported by kivy.lib.vidcore_lite (top-level), kivy.core.window.window_egl_rpi (top-level)
missing module named kivy.lib.vidcore_lite.bcm - imported by kivy.lib.vidcore_lite (top-level), kivy.core.window.window_egl_rpi (top-level)
missing module named 'android.runnable' - imported by kivy.core.clipboard.clipboard_android (top-level)
missing module named Leap - imported by kivy.input.providers.leapfinger (delayed)
missing module named oscpy - imported by kivy.input.providers.tuio (delayed, optional)
missing module named dbus - imported by kivy.core.clipboard.clipboard_dbusklipper (optional)
missing module named cv2 - imported by kivy.core.camera.camera_android (delayed), kivy.core.camera.camera_opencv (optional)
missing module named 'opencv.highgui' - imported by kivy.core.camera.camera_opencv (optional)
missing module named opencv - imported by kivy.core.camera.camera_opencv (optional)
missing module named enchant - imported by kivy.core.spelling.spelling_enchant (top-level)
missing module named 'ffpyplayer.pic' - imported by kivy.core.image.img_ffpyplayer (top-level)
missing module named android_mixer - imported by kivy.core.audio.audio_pygame (conditional, optional)
missing module named 'android.mixer' - imported by kivy.core.audio.audio_pygame (conditional, optional)
missing module named smb - imported by kivy.loader (delayed, conditional, optional)
missing module named 'android.runnable' - imported by kivy.core.clipboard.clipboard_android (top-level)
missing module named AppKit - imported by kivy.core.spelling.spelling_osxappkit (top-level)
missing module named picamera - imported by kivy.core.camera.camera_picamera (top-level)
missing module named ffmpeg - imported by kivy.core.video.video_ffmpeg (optional)
missing module named 'pygame.scrap' - imported by kivy.core.clipboard.clipboard_pygame (optional)
missing module named kivy.lib.vidcore_lite.egl - imported by kivy.lib.vidcore_lite (top-level), kivy.core.window.window_egl_rpi (top-level)
missing module named kivy.lib.vidcore_lite.bcm - imported by kivy.lib.vidcore_lite (top-level), kivy.core.window.window_egl_rpi (top-level)
missing module named 'kivy.core.text._text_pango' - imported by kivy.core.text.text_pango (top-level)
missing module named usercustomize - imported by site (delayed, optional)
missing module named sitecustomize - imported by site (delayed, optional)
missing module named readline - imported by site (delayed, optional), rlcompleter (optional)
missing module named vms_lib - imported by platform (delayed, optional)
missing module named java - imported by platform (delayed)
missing module named android - imported by kivy.metrics (delayed, conditional), kivy.core.window (delayed, conditional), kivy.base (delayed, optional), kivy.input.providers.androidjoystick (optional), kivy.app (delayed, conditional), kivy.core.clipboard.clipboard_android (top-level), kivy.core.window.window_pygame (conditional, optional), kivy.support (delayed, optional), kivy.core.audio.audio_android (top-level), kivy.core.window.window_sdl2 (delayed, conditional)
missing module named ios - imported by kivy.metrics (delayed, conditional), kivy.core.window (delayed)
missing module named ConfigParser - imported by kivy.config (optional)
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
missing module named trio - imported by kivy.clock (delayed, conditional)
missing module named Queue - imported by kivy.compat (optional)
missing module named ConfigParser - imported by kivy.config (optional)

File diff suppressed because it is too large Load Diff

BIN
dist/app.exe vendored

Binary file not shown.

147
export_opened_to_raster.py Normal file
View File

@ -0,0 +1,147 @@
import pythoncom
from win32com.client import Dispatch, gencache
import os
from PIL import Image, ImageDraw, ImageFont
def export_opened_to_raster():
try:
# Получаем API интерфейсов версии 5
api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
api5_api = api5_module.KompasObject(
Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(
api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch
)
)
module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
api = module.IKompasAPIObject(
Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(
module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch
)
)
k_constants = gencache.EnsureModule(
"{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0
).constants
application = module.IApplication(api)
save_param = None
images = []
application.Visible = True
first_doc_name = None # Для хранения имени первого документа
print("Начинаем обработку документов КОМПАС...")
for i in range(application.Documents.Count):
try:
doc = application.Documents.Open(i)
doc_type = doc.DocumentType
# Проверяем тип документа: чертеж, фрагмент, спецификация
if doc_type in [
k_constants.ksDocumentDrawing,
k_constants.ksDocumentFragment,
k_constants.ksDocumentSpecification,
]:
doc.Active = True
doc_path = doc.Path
doc_name = "-".join(doc.Name.split(".")[:-1])
print(f"Обрабатываем документ: {doc_name}")
doc_api5 = api5_api.ActiveDocument2D()
doc_api7 = module.IKompasDocument(doc)
# Сохраняем имя первого документа
if first_doc_name is None:
first_doc_name = (
doc_api7.LayoutSheets.ItemByNumber(1).Stamp.Text(2).Str
)
if doc_type == k_constants.ksDocumentSpecification:
doc_api5 = api5_api.SpcActiveDocument()
if doc_api5 and save_param is None:
rasterParJPG = doc_api5.RasterFormatParam()
rasterParJPG.Init()
rasterParJPG.colorBPP = 8
rasterParJPG.colorType = 3
rasterParJPG.extResolution = 96
rasterParJPG.format = 0
rasterParJPG.greyScale = False
for ext in ["jpg", "dxf"]:
path = f"{doc_path}{ext}/"
filename = f"{doc_name}.{ext}"
full_path = os.path.join(path, filename)
if not os.path.exists(path):
os.makedirs(path)
print(f"Создана папка: {path}")
if ext == "jpg":
doc_api5.SaveAsToRasterFormat(full_path, rasterParJPG)
print(f"Сохранен JPG: {full_path}")
# Открываем сохраненное изображение и добавляем его в список
img = Image.open(full_path)
images.append(img)
if ext == "dxf":
doc_api5.ksSaveToDXF(full_path)
print(f"Сохранен DXF: {full_path}")
except Exception as e:
print(f"Ошибка при обработке документа {i}: {e}")
# Если есть изображения, создаем PDF
if images:
desktop_path = os.path.join(
os.path.expanduser("~"), "Desktop"
) # Путь к рабочему столу
pdf_filename = f"{first_doc_name}_pages.pdf" # Имя PDF-файла
pdf_output_path = os.path.join(desktop_path, pdf_filename) # Полный путь к PDF
# Создаем первую страницу с заголовком
try:
# Попытка загрузить шрифт Arial (или другой шрифт с поддержкой кириллицы)
font = ImageFont.truetype(
"arial.ttf", size=48
) # Размер шрифта можно изменить
except IOError:
print(
"Шрифт Arial не найден. Используется стандартный шрифт (без поддержки кириллицы)."
)
font = ImageFont.load_default()
# Создаем изображение для заголовка с увеличенной высотой
title_image = Image.new("RGB", (images[0].width, 200), color="white")
draw = ImageDraw.Draw(title_image)
# Текст заголовка
title_text = f"{first_doc_name}\nКоличество страниц: {len(images)}"
# Рисуем текст на изображении с отступами между строками
draw.text((10, 50), title_text, fill="black", font=font, spacing=10)
# Добавляем заголовок как первую страницу
images.insert(0, title_image)
# Сохраняем все изображения в многостраничный PDF
images[0].save(
pdf_output_path,
"PDF",
resolution=96.0,
save_all=True,
append_images=images[1:],
)
print(
f"Многостраничный PDF успешно сохранен на рабочий стол: {pdf_output_path}"
)
return f"PDF сохранен: {pdf_output_path}"
else:
return "Ошибка: Нет документов для обработки."
except Exception as e:
return f"Произошла ошибка: {e}"

147
get_all_sheets.py Normal file
View File

@ -0,0 +1,147 @@
# pip install pywin32
import pythoncom
from win32com.client import Dispatch, gencache
import os
def get_all_sheets():
try:
# Получи API интерфейсов версии 5
api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
api5_api = api5_module.KompasObject(
Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(
api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch
)
)
module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
api = module.IKompasAPIObject(
Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(
module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch
)
)
application = module.IApplication(api)
application.Visible = True
result = []
for i in range(application.Documents.Count):
try:
doc = application.Documents.Open(i)
doc_type = doc.DocumentType
if doc_type in [4, 5]: # 4 — чертеж, 5 — сборка
doc.Active = True
doc_path = doc.Path
doc_name = "-".join(doc.Name.split(".")[:-1])
print(f"Анализируем документ: {doc_name}")
doc_3d = module.IKompasDocument3D(doc)
top_part = doc_3d.TopPart
elements = []
bends = []
welding = []
def look_features(element):
feature = module.IFeature7(element)
sub_features = feature.SubFeatures(1, True, False) or []
for item in sub_features:
if type(item) in (module.ISheetMetalBend, module.ISheetMetalLineBend, module.ISheetMetalBody):
sub_sheets = item.Owner.SubFeatures(1, True, False)
if sub_sheets:
for b in sub_sheets:
bend = module.ISheetMetalBend(b)
bends.append(bend)
def look_drawing(part):
drawing_context = module.IDrawingContainer(part)
macro = module.IMacroObject3D(drawing_context)
sub_features = macro.Owner.SubFeatures(1, True, False) or []
for item in sub_features:
if type(item) in (module.IUserDesignationCompObj,):
welding.append(item)
def find_elements(part):
try:
drawing_context = module.IDrawingContainer(part)
macro = module.IMacroObject3D(drawing_context)
sub_features = macro.Owner.SubFeatures(1, True, False) or []
for item in sub_features:
if type(item) in (module.IUserDesignationCompObj,):
welding.append(item)
except Exception as e:
print("Ошибка в DrawingContext")
try:
doc_parts = module.IParts7(part.Parts)
for i in range(doc_parts.Count):
element = doc_parts.Part(i)
if element.Parts.Count == 0:
elements.append(element)
look_features(element)
find_elements(element)
except Exception as e:
print("Ошибка в Parts")
if doc_type == 5:
find_elements(top_part)
else:
elements.append(top_part)
look_drawing(top_part)
look_features(top_part)
print(f"Найдено:\n Элементов: {len(elements)}\n Гибов: {len(bends)}\n")
sorted_data = {
"Name": {},
"Material": {},
"Area": {},
}
for e in elements:
for n in sorted_data.keys():
if n == "Name":
v = f"{getattr(e, n)}, масса {round(getattr(e, 'Mass'), 3)}"
res = sorted_data[n].get(v, 0) + 1
elif n == "Area":
mass_inertial_params = module.IMassInertiaParam7(e)
val = mass_inertial_params.Area * 0.0001
v = f"площадь {getattr(e, 'Material')}, м²:"
res = round(sorted_data[n].get(v, 0) + val, 6)
else:
v = getattr(e, n)
res = sorted_data[n].get(v, 0) + 1
sorted_data[n][v] = res
sorted_data["Area"]["Total"] = sum(sorted_data["Area"].values())
welding_key = "Welding"
for w in welding:
if welding_key not in sorted_data:
sorted_data[welding_key] = {}
w_name = w.Name
w_name_split = w_name.split("-")
w_len = w_name_split[-1].split("@")[0]
sorted_data[welding_key][w_name] = w_len
if welding_key in sorted_data:
def float_f(n):
try:
return float(n)
except Exception as e:
return 0
sorted_data[welding_key]["Total"] = sum([float_f(f) for f in sorted_data[welding_key].values()])
result.append(f"Документ: {doc_name}")
for s in sorted_data:
result.append(s)
for n in sorted_data[s]:
result.append(f"{n} -- {sorted_data[s][n]}")
result.append("-----")
except Exception as e:
result.append(f"Ошибка при обработке документа {i}: {e}")
return "\n".join(result)
except Exception as e:
return f"Произошла ошибка: {e}"

123
project_support.py Normal file
View File

@ -0,0 +1,123 @@
# pip install pywin32
import pythoncom
from win32com.client import Dispatch, gencache
import os
import math
def project_support():
try:
# Получи API интерфейсов версии 5
api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
api5_api = api5_module.KompasObject(
Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(
api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch
)
)
module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
api = module.IKompasAPIObject(
Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(
module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch
)
)
k_constants = gencache.EnsureModule(
"{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0
).constants
application = module.IApplication(api)
saving_path = "../cdw/"
application.Visible = True
result = []
for i in range(application.Documents.Count):
try:
doc = application.Documents.Open(i)
doc_type = doc.DocumentType
if doc_type in [k_constants.ksDocumentAssembly, k_constants.ksDocumentPart]:
doc.Active = True
doc_path = doc.Path
doc_name = "-".join(doc.Name.split(".")[:-1])
result.append(f"Анализируем документ: {doc_name}")
doc_3d = module.IKompasDocument3D(doc)
doc_components = []
def all_elements(part):
doc_parts = module.IParts7(part.Parts)
for i in range(doc_parts.Count):
element = doc_parts.Part(i)
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)
if doc_type == k_constants.ksDocumentAssembly:
all_elements(doc_3d.TopPart)
else:
doc_components.append(doc_3d.TopPart)
for component in doc_components:
component_ipart = module.IPart7(component)
if component_ipart.Standard:
continue
result.append(f"Создаем чертеж для {component.Name}")
c_doc = application.Documents.Add(k_constants.ksDocumentDrawing)
# Делаем лист А3 альбомный
c_layout = c_doc.LayoutSheets
c_sheet = c_layout.Item(0)
c_sheet.Format.Format = k_constants.ksFormatA3
c_sheet.Format.VerticalOrientation = False
c_sheet.Update()
c_size = [1, 1, 1]
if component_ipart.Owner.ResultBodies:
gabarit = [0, 0, 0, 0, 0, 0]
gabarit = 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)
c_filename = component_ipart.FileName
c_name = component_ipart.Name
c_doc_2d = module.IKompasDocument2D(c_doc)
c_views = c_doc_2d.ViewsAndLayersManager.Views
c_scale = c_sheet.Format.FormatHeight / sum(c_size)
c_views.AddStandartViews(
c_filename,
c_name,
[1, 3, 5, 7],
c_size[1] * c_scale,
c_sheet.Format.FormatHeight - 25,
c_scale,
20,
20,
)
if not os.path.exists(f"{doc_path}{saving_path}"):
os.makedirs(f"{doc_path}{saving_path}")
filename = "_".join(filter(None, [component_ipart.Marking, c_name[:20]])).replace(" ", "-")
result.append(f"Сохраняем чертеж: {doc_path}{saving_path}{filename}.cdw")
c_doc.SaveAs(f"{doc_path}{saving_path}{filename}.cdw")
if doc_type == k_constants.ksDocumentAssembly:
spec = application.Documents.Add(k_constants.ksDocumentSpecification)
spec_doc = module.ISpecificationDocument(spec)
spec_doc.AttachedDocuments.Add(doc.PathName, True)
filename = "Список_деталей"
result.append(f"Сохраняем спецификацию: {doc_path}{saving_path}{filename}.spw")
spec.SaveAs(f"{doc_path}{saving_path}{filename}.spw")
except Exception as e:
result.append(f"Ошибка при обработке документа {i}: {e}")
return "\n".join(result)
except Exception as e:
return f"Произошла ошибка: {e}"

65
save_to_iges.py Normal file
View File

@ -0,0 +1,65 @@
# pip install pywin32
import pythoncom
from win32com.client import Dispatch, gencache
import os
def save_opened_to_iges():
try:
# Получи API интерфейсов версии 5
api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
api5_api = api5_module.KompasObject(
Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(
api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch
)
)
module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
api = module.IKompasAPIObject(
Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(
module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch
)
)
k_constants = gencache.EnsureModule(
"{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0
).constants
application = module.IApplication(api)
application.Visible = True
for i in range(application.Documents.Count):
try:
doc = application.Documents.Open(i)
doc_type = doc.DocumentType
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_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}")
except Exception as e:
print(f"Ошибка при обработке документа {i}: {e}")
return "Сохранение в IGES завершено."
except Exception as e:
return f"Произошла ошибка: {e}"