Всем привет!

Решил немного отойти от своей любимой темы нейронных сетей и написать небольшой скрипт на Python для работы с конструкторской документацией в САПР «SolidWorks». Так как изначально у меня инженерное образование, то мне периодически приходится заниматься конструкторской деятельностью и, по своему опыту, я знаю, как много иногда приходится тратить времени для оформления чертежей и сохранения их в формате pdf или dwg (особенно, если мы говорим о большом количестве деталей сборок). И тут я подумал, почему не упростить жизнь себе и своим коллегам-конструкторам и не подружить Python и SolidWorks.

В этой статье я вкратце опишу, как можно быстро (буквально за один день) написать простой скрипт, с максимально простым графическим интерфейсом для работы с Системой автоматизированного проектирования SolidWorks. Очень надеюсь, что эта статья поможет всем инженерам-конструкторам в их непростой, но крайне интересной деятельности.

Работа будет состоять из двух основных частей (соответственно и статей будет две):

Часть 1 – Создание общей базы для работы с SolidWorks, написание простого графического интерфейса на tkinter, реализация возможности сохранения чертежей в форматах pdf и dwg.

Часть 2 – Реализация возможности автоматизированного заполнения полей таблицы чертежей из единого excel файла, и самая интересная фича этого проекта: автоматическое создание чертежей деталей из 3D-моделей (для начала реализация простых деталей из листового металла).

По итогу «завернём» программу в один .exe файл для возможности использовать на любых машинах. Используем Python 3 и SolidWorks 2020.

Итак, ТЗ готово, можем приступать!


В этой статье я опишу процесс реализации Части 1 (думаю для начала, многим хватит и этого функционала программы). Основная цель – экономия времени, представим, что у вас есть сборка, в которой огромное количество деталей и на каждую делать сделан чертеж (предположим, 100 чертежей) и открывать каждый чертеж и вручную его сохранять, это очень много человеко-часов. А если у вас 100 сборок по 100 деталей? Сделаем так, чтобы при выборе нужной папки все происходило автоматически (загружаем программу и спокойно косячим дальше занимаемся своими делами, пока скрипт всё сохраняет за вас).

#Библиотеки
from tkinter import filedialog
from tkinter.messagebox import showinfo, askyesno
from tkinter import ttk
import os
import subprocess as sb
import win32com.client

В __init__ инициализируем небольшое приветственное окно с описанием:

class PySolW:
    def __init__(self):
        self.window = Tk()
        self.window.title("Программа сохранения файлов Solid")
        self. window.geometry('600x300')
        self.lbl_start = Label(self.window, text="Добрый день! \n "
                                                 "\tДобро пожаловать в программу для работы с САПР SolidWorks!\n"
                                                 "Для начала работы необходимо запустить SolidWorks.\n "
                                                 "Нажмите кнопку запуска.", font='GOST 12')
        self.lbl_start.grid(column=0, row=0)
        #Кнопка уно
        self.btn = Button(self.window, text="Запустить SolidWorks", command=self.start_SolidW)
        self.btn.grid(column=0, row=3, ipadx=6, ipady=20, padx=5, pady=20)
        #Кнопка дос
        self.btn_2 = Button(self.window, text="Узнать подробнее о программе", command=self.info_prog)
        self.btn_2.grid(column=0, row=4, ipadx=6, ipady=20, padx=5, pady=20)

        self.window.mainloop()

Визуально всё этого мракобесие будет выглядеть так:

Первое окно приветствия

Сразу попрошу прощения у Гуру tkinter и ООП на Python, если вдруг что-то написано не оптимально или криво :) Подробное описание работы с tkinter вы можете найти в свободном доступе, так что на этом я долго останавливаться не буду. Перейдем к работе с SolidWorks.

Кликаем на «Запустить SolidWorks» и получаем выбор основного функционала программы:

Окно выбора функционала

В настоящий момент кнопка создания чертежей из 3D модели «заглушена», так как ведутся работы по написанию соответствующего кода. Так что жмём «сохранить чертежи в pdf/dwg формат» и выбираем нужный формат и папку с чертежами:

Выбор формата сохранения чертежей

И процесс сохранения пошёл!

Один чертеж сохраняется в среднем за 10-15 секунд (время зависит от машины)

Самые внимательные заметили (в списке библиотек), что мы пользуемся win32com.client для взаимодействия с Component Object Model (COM). Этот пакет позволяет нам залезть в SolidWorks (или любое другое приложение на windows) и автоматизировать очень многое. В текущем коде порядок действий следующий:

1)      Открываем SolidWorks (здесь и далее описаны функции, используемые в классе, но можно написать линейно, без написания функций):

def startSolidWorks(self):
    sb.Popen(r'C:/Program Files/SOLIDWORKS Corp/SOLIDWORKS/SLDWORKS.exe')

2)      Подключаемся к SW:

def connectToSolidWorks(self):
    sw = win32com.client.Dispatch("SLDWORKS.Application")
    return sw

3)      Открываем нужный нам файл чертежа:

def openDocFile(self, sw, Path):
    f = sw.getopendocspec(Path)
    model = sw.opendoc7(f)
    return model

4)      Сохраняем открытый файл в нужный формат:

model.SaveAs3(save_path_dir + f'/{name_drawning}.pdf', 0, 2)
model.SaveAs3(save_path_dir + f'/{name_drawning}.dwg', 0, 2)

5)      Закрываем файл чертежа:

sw.CloseAllDocuments(True)

И повторяем n количество раз, где n – число чертежей в папке.

6)      В самом конце закрываем SolidWorks:

def shutSolidWorks(self):
    sb.call('Taskkill /IM SLDWORKS.exe /F')

Ну, вот и всё, это все процесс! В цикле всё делает скрипт, а мы спокойно идём кушать борщ в столовую нашего КБ.

Напоследок завернём всю нашу замечательную программу в .exe файл для удобства пользования на других машинах. Тут всё довольно просто, воспользуемся библиотекой Pyinstaller. (устанавливаем pip3 install pyinstaller –> заходим в папку со скриптом в формате .py –> пишем в терминале pyinstaller --onefile ИМЯ_СКРИПТА.py -> Создается exe-файл –> Хэппи Енд).

В репозитории на моем github (https://github.com/Mazepov/PySolW) вы сможете скачать .exe файл для альфа-теста, любой желающий может протестировать и пользоваться в своё удовольствие. Итак, первая часть нашего ТЗ выполнена (можно аванс и в отпуск? :))

Закрытие программы (немного криво с кнопками, но на релизе поправим :)))

В целом на этом у меня всё! Сам код не выкладываю, так как он в процессе доработки (сделана только первая часть, всё сыро), но, если кому потребуется помощь – с радостью подскажу, помогу, предоставлю версию скрипта для работы.

Следующий этап разработки программы опубликую в ближайшем будущем! Всем программистам, аналитикам и инженерам - привет, будут вопросы или желание посотрудничать – пишите! Всем добра

PS: В следующей статье я опишу Часть 2. И в ближайшее время будет новая статья по нейронным сетям (спойлер: создадим голосового ассистента, который научим узнавать и запоминать новых пользователей с помощью веб-камеры).

Мой канал на github