Работая в конструкторском отделе, я столкнулся с задачей — рассчитать трудоёмкость разработки конструкторской документации. Если брать за основу документ: «Типовые нормативы времени на разработку конструкторской документации. ШИФР 13.01.01″ (утв. Минтрудом России 07.03.2014 N 003)», то для расчета трудоёмкости чертежа детали нам необходимы следующие данные:
- Формат чертежа и количество листов
- Масштаб
- Количество размеров на чертеже (включая знаки шероховатости и выносные линии)
- Количество технических требований
Из имеющихся инструментов на предприятии имеем: Kompas 3D v14 и Python 3.5.
В интернете не так много статей о написании программ с использованием API Kompas 3D, и ещё меньше информации о том, как это сделать на Python. Попробую рассказать по шагам, как решалась поставленная задача и на какие грабли приходилось наступать. Статья рассчитана на людей, владеющих основами программирования и знакомых с языком Python. Итак, приступим.
Компас-3D. Python. Hello world. Урок №1
Подготовительная операция:
Убедитесь, что на вашем компьютере установлена программа Kompas 3D, версии не ниже 14 и Python 3. Вам также необходимо установить pywin3 (Python for Windows extensions).
Подключение к Kompas 3D:
Система Kompas 3D имеет две версии API: API5, которая предоставляет интерфейс KompasObject, и API7, предоставляющая интерфейс IKompasAPIObject. API версии 5 и 7 во многом дублируют свой функционал, но, со слов разработчиков, в 7-ой версии более выражен объектно-ориентированный подход. В данной статье акцент сделан на 7-ю версию.
Функция подключения выглядит следующим образом:
import pythoncom from win32com.client import Dispatch, gencache # Подключение к API7 программы Kompas 3D def get_kompas_api7(): module = gencache.EnsureModule(«», 0, 1, 0) api = module.IKompasAPIObject( Dispatch(«Kompas.Application.7»)._oleobj_.QueryInterface(module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch)) const = gencache.EnsureModule(«», 0, 1, 0).constants return module, api, const
Чуть подробнее о модуле win32com здесь.
Теперь, чтобы подключиться к интерфейсу, нам понадобиться следующий код:
module7, api7, const7 = get_kompas_api7() # Подключаемся к API7 app7 = api7.Application # Получаем основной интерфейс app7.Visible = True # Показываем окно пользователю (если скрыто) app7.HideMessage = const7.ksHideMessageNo # Отвечаем НЕТ на любые вопросы программы print(app7.ApplicationName(FullName=True)) # Печатаем название программы
Для более глубокого понимания API заглянем в SDK. На моём компьютере она находится по адресу: C:Program FilesASCONKOMPAS-3D V16SDKSDK.chm. Здесь можно подробнее узнать, например, о методе HideMessage:
После выполнения нашего кода вернём всё на свои места: если Kompas 3D был запущен нами (в процессе работы скрипта), мы его и закроем. Самый простой способ определить, запущен ли процесс, — использовать стандартный модуль subprocess:
Говорят, у нас не умеют делать ПО? Короткая история и разговор про САПР с разработчиками Компас 3D
import subprocess # Функция проверяет, запущена ли программа Kompas 3D def is_running(): proc_list = subprocess.Popen(‘tasklist /NH /FI «IMAGENAME eq KOMPAS*»‘, shell=False, stdout=subprocess.PIPE).communicate()[0] return True if proc_list else False
Данная функция проверяет, запущен ли процесс «KOMPAS» стандартными методами Windows. Обратите внимание, что разные версии программы Kompas 3D могут иметь разные наименования процессов!
Считаем количество листов и их формат:
Тут всё просто: у нашего документа doc7 имеется интерфейс коллекции листов оформления LayoutSheets. Каждый лист обладает свойством формата и кратности. Для Компаса, начиная с 15 версии, интерфейс LayoutSheets доступен не только для файлов чертежей, но и для спецификаций и текстовых документов.
# Посчитаем количество листов каждого из формата def amount_sheet(doc7): sheets = for sheet in range(doc7.LayoutSheets.Count): format = doc7.LayoutSheets.Item(sheet).Format # sheet — номер листа, отсчёт начинается от 0 sheets[«A» + str(format.Format)] += 1 * format.FormatMultiplicity return sheets
Посмотрим на процесс изучения SDK для поиска интересующих нас функций:
Читаем основную надпись:
Здесь нам поможет всё тот же LayoutSheets:
# Прочитаем масштаб из штампа, ячейка №6 def stamp_scale(doc7): stamp = doc7.LayoutSheets.Item(0).Stamp # Item(0) указывает на штамп первого листа return stamp.Text(6).Str
На самом деле ячейка №6 для листа с другим оформлением может содержать не масштаб, а совсем иную информацию. Посмотрим, как в Kompas 3D определяются стили оформления чертежа:
Таким образом, важно проверять, какому файлу и номеру оформления соответствует лист чертежа. Также стоит помнить, что документ может содержать титульный лист! Поэтому придётся усложнить код. Применим регулярные выражения, т.к. текст в ячейке может являться ссылкой:
import os import re # Прочитаем основную надпись чертежа def stamp(doc7): for sheet in range(doc7.LayoutSheets.Count): style_filename = os.path.basename(doc7.LayoutSheets.Item(sheet).LayoutLibraryFileName) style_number = int(doc7.LayoutSheets.Item(sheet).LayoutStyleNumber) if style_filename in [‘graphic.lyt’, ‘Graphic.lyt’] and style_number == 1: stamp = doc7.LayoutSheets.Item(sheet).Stamp return return
Остался последний вопрос: как узнать нужный номер ячейки? Для этих целей удобно создать файл чертежа, в котором интересующие нас ячейки будут заполнены, а после — прочитать все возможные варианты с помощью следующей функции:
# Просмотр всех ячеек def parse_stamp(doc7, number_sheet): stamp = doc7.LayoutSheets.Item(number_sheet).Stamp for i in range(10000): if stamp.Text(i).Str: print(‘Номер ячейки = %-5d Значение = %s’ % (i, stamp.Text(i).Str))
Считаем количество пунктов технических требований:
Согласно SDK, нам всего-то нужно получить интерфейс TechnicalDemand от IDrawingDocument, а
IDrawingDocument можно получить от iDocuments с помощью замечательного метода с говорящим названием IUnknown::QueryInterface. И только в SDK 16 версии Kompas 3D появилось разъяснение, как это сделать:
С такими разъяснениями легко написать следующее:
# Подсчет технических требований, в том случае, если включена автоматическая нумерация def count_TT(doc7, module7): doc2D_s = doc7._oleobj_.QueryInterface(module7.NamesToIIDMap[‘IDrawingDocument’], pythoncom.IID_IDispatch) doc2D = module7.IDrawingDocument(doc2D_s) text_TT = doc2D.TechnicalDemand.Text count_tt = 0 # Количество пунктов технических требований for i in range(text_TT.Count): # Проходим по каждой строчке технических требований if text_TT.TextLines[i].Numbering == 1: # и проверяем, есть ли у строки нумерация count_tt += 1 # Если нет нумерации, но есть текст if not count_tt and text_TT.TextLines[0]: count_tt += 1 return count_tt
Стоит отметить, что данный код полагается на автоматическую нумерацию технических требований. Так что, если автоматическая нумерация не применялась или технические требования набраны с использованием простого инструмента «Текст», код будет сложнее. Оставляю решение данной задачи на читателя.
Считаем количество размеров на чертеже:
При подсчёте размеров, надо иметь в виду, что необходимо посчитать их на каждом из видов чертежа:
# Подсчёт размеров на чертеже, для каждого вида по отдельности def count_dimension(doc7, module7): IKompasDocument2D = doc7._oleobj_.QueryInterface(module7.NamesToIIDMap[‘IKompasDocument2D’], pythoncom.IID_IDispatch) doc2D = module7.IKompasDocument2D(IKompasDocument2D) views = doc2D.ViewsAndLayersManager.Views count_dim = 0 for i in range(views.Count): ISymbols2DContainer = views.View(i)._oleobj_.QueryInterface(module7.NamesToIIDMap[‘ISymbols2DContainer’], pythoncom.IID_IDispatch) dimensions = module7.ISymbols2DContainer(ISymbols2DContainer) # Складываем все необходимые размеры count_dim += dimensions.AngleDimensions.Count + dimensions.ArcDimensions.Count + dimensions.Bases.Count + dimensions.BreakLineDimensions.Count + dimensions.BreakRadialDimensions.Count + dimensions.DiametralDimensions.Count + dimensions.Leaders.Count + dimensions.LineDimensions.Count + dimensions.RadialDimensions.Count + dimensions.RemoteElements.Count + dimensions.Roughs.Count + dimensions.Tolerances.Count return count_dim
Основная функция скрипта
В результате проделанной работы мы получили следующее:
def parse_design_documents(paths): is_run = is_running() # Установим флаг, который нам говорит, # запущена ли программа до запуска нашего скрипта module7, api7, const7 = get_kompas_api7() # Подключаемся к программе app7 = api7.Application # Получаем основной интерфейс программы app7.Visible = True # Показываем окно пользователю (если скрыто) app7.HideMessage = const7.ksHideMessageNo # Отвечаем НЕТ на любые вопросы программы table = [] # Создаём таблицу параметров for path in paths: doc7 = app7.Documents.Open(PathName=path, Visible=True, ReadOnly=True) # Откроем файл в видимом режиме без права его изменять row = amount_sheet(doc7) # Посчитаем кол-во листов каждого формат row.update(stamp(doc7)) # Читаем основную надпись row.update(< «Filename»: doc7.Name, # Имя файла «CountTD»: count_demand(doc7, module7), # Количество пунктов технических требований «CountDim»: count_dimension(doc7, module7), # Количество размеров на чертеже >) table.append(row) # Добавляем строку параметров в таблицу doc7.Close(const7.kdDoNotSaveChanges) # Закроем файл без изменения if not is_run: app7.Quit() # Выходим из программы return table
Диалоговое окно выбора файлов
Для удобного использования нашего скрипта воспользуемся возможностями стандартного модуля tkinter и выведем диалоговое окно выбора файлов:
from tkinter import Tk from tkinter.filedialog import askopenfilenames if __name__ == «__main__»: root = Tk() root.withdraw() # Скрываем основное окно и сразу окно выбора файлов filenames = askopenfilenames(title=»Выберете чертежи деталей», filetypes=[(‘Kompas 3D’, ‘*.cdw’),]) print_to_excel(parse_design_documents(filenames)) root.destroy() # Уничтожаем основное окно root.mainloop()
Отчётность
Чтобы не рисовать в tkintere интерфейс пользователя, предлагаю воспользоваться хорошей программой Excel, куда и выведем результат нашего труда:
def print_to_excel(result): excel = Dispatch(«Excel.Application») # Подключаемся к Excel excel.Visible = True # Делаем окно видимым wb = excel.Workbooks.Add() # Добавляем новую книгу sheet = wb.ActiveSheet # Получаем ссылку на активный лист # Создаём заголовок таблицы sheet.Range(«A1:J1»).value = [«Имя файла», «Разработчик», «Кол-во размеров», «Кол-во пунктов ТТ», «А0», «А1», «А2», «А3», «А4», «Масштаб»] # Заполняем таблицу for i, row in enumerate(result): sheet.Range(«A%d:J%d» % i+2).value = [row[‘Filename’], row[‘Designer’], row[‘CountDim’], row[‘CountTD’], row[‘A0’], row[‘A1’], row[‘A2’], row[‘A3’], row[‘A4’], «».join((‘=»‘, row[‘Scale’], ‘»‘))]
Если не полениться и правильно подготовить Excel файл, то результат работы нашего скрипта можно сразу представить в наглядном виде:
На графике изображено участие каждого сотрудника отдела в выпуске документации на изделие.
Заключение
Используя скрипт для чертежа, созданного специально для данной статьи, мы получим следующие результаты:
- Количество размеров: 25 штук
- Количество пунктов технических требований: 3 штуки
- Масштаб: 1:1
- Количество листов: 1, формата А3
Трудозатраты, согласно упомянутому в начале статьи документу, составили: 1 час 20 минут. Как ни странно, примерно столько и было потрачено времени на разработку чертежа.
Конечно, для внедрения подобных норм на предприятии нужны более серьёзные исследования и совершенно другие объёмы конструкторской документации. Данная же статья поможет упростить работу с API Kompas 3D при решении аналогичных задач.
Буду рад любым вашим замечаниями и предложениями к статье.
Исходный код
Ресурсы в помощь:
- SDK (C:Program FilesASCONKOMPAS-3D V16SDKSDK.chm)
- forum.ascon.ru
Источник: habrparser.blogspot.com
Система автоматизированного проектирования КОМПАС
КОМПАС — это, с моей точки зрения, лучшая САПР (во всяком случае для России и для машиностроения или для других отраслей, использующих стандарты ЕСКД и СПДС).
Я помню ещё версии этого программного обеспечения для ДОС. Но сегодня это программы для Windows. Поддерживаются версии Windows 8.1…11. С некоторыми ограничения поддерживается Windows 7. Но это я говорю о новой версии КОМПАС (на день написания статьи это версия 21). Более старые версии, конечно, могут работать и на более ранних версиях Windows.
Лично я начал знакомство с КОМПАС с версии 5.1 (затем перешёл сразу на 9-ю), которые работали у меня тогда на Windows XP.
При желании можно найти бесплатные старые демо-версии КОМПАС, возможностей которых вполне достаточно для большинства задач. Лично я довольно долго пользовался 8-й демо-версией, поскольку она достаточно удобна и проста. Однако демо-версии запрещают вам использовать их в коммерческих целях и имеют много ограничений. Поэтому лучше купить годовую лицензию и не париться. Для домашних целей это будет стоить недорого.
Базовая версия КОМПАС для дома содержит почти все инструменты, которые есть и в коммерческих версиях. Но только запрещено её использование в коммерческих целях. Однако для создания ваших личных проектов (например, для проектирования электропроводки в вашем доме) вы можете её использовать в полной мере.
САПР КОМПАС содержит по сути две разных САПР — для двухмерной (2D) и для трёхмерной (3D) графики. Но эти системы взаимосвязаны. Например, создав 3D-модель, вы автоматически можете создать на её основе 2D-чертежи. Кроме этого к системам прилагаются модули и библиотеки для облегчения разработки в области машиностроения и строительства.
Коммерческие версии продукта стоят дорого. Они приобретаются в основном профессионалами или предприятиями. Но, не забываем, что мы живём в России. Если очень хочется, то можно найти и профессиональную версию бесплатно. Но я вам этого не говорил )))
Кроме разработки конструкторской документации (КД), КОМПАС содержит в себе много других полезных мелочей. Например, вы можете сохранить ваш чертёж почти во всех графических форматах, а также в PDF. Это очень удобно для отправки заказчику, поскольку не у всех заказчиков имеется КОМПАС, и в этом случае они не смогут посмотреть ваши чертежи в формате файлов КОМПАС.
Впрочем, есть полностью бесплатный просмотрщик файлов КОМПАС. С его помощью можно просматривать файлы, но нельзя редактировать.
Вы также можете сохранить файлы КОМПАС в файлы формата АВТОКАД. И наоборот — файлы, созданные в АВТОКАД, вы можете загрузить в КОМПАС, а затем сохранить их в формате КОМПАС и редактировать их, если это нужно.
Я этим часто пользуюсь, потому что нередко чертежи нужных мне шкафов или приборов на сайтах производителей имеются только в формате АВТОКАД (ну а у зарубежных производителей вы вообще не найдёте чертежи в формате КОМПАС).
В общем, рассказывать долго об этом смысла нет. Лучше один раз попробовать. Поэтому я заканчиваю. Новые статьи о КОМПАС будут добавляться в этот раздел. Подписывайтесь на новости, чтобы ничего не пропустить (красная кнопка вверху справа), или подключайтесь к группе ВК.
Ну и для визуального восприятия покажу пару картинок.
На этом рисунке пример простейшей 3D-модели. Вообще для разработки мебели лучше использовать специализированные программы, которые заточены именно под мебель (например, Базис-Мебельщик). Но при желании можно применить и КОМПАС (во всяком случае для эскизов он будет даже в чём-то лучше, чем мебельные программы). На рисунке простейшая полка. Здесь только основные детали — без крепежа.
Но моя задача просто показать, как это выглядит.
Создав 3D-модель, вы можете лёгким движением руки сделать все чертежи по этой модели. Пример таких чертежей для показанной выше полки на втором рисунке:
Вы можете сделать те виды, которые вам нужны, и в нужном вам масштабе. При этом вес изделия вычисляется автоматически и автоматически подставляется в штамп. А если вы измените модель, то чертежи будут изменены автоматически (точнее, вас предупредят, что модель изменена и спросят, надо ли изменять чертежи).
В общем, КОМПАС — это очень крутая программа. И в такой короткой статье я не могу рассказать даже об 1% её возможностей. Поэтому будут другие статьи. Так что ещё раз напоминаю — подписывайтесь на обновления, чтобы ничего не пропустить.
Книги по КОМПАС 3D
Интерфейс у программы интуитивно понятен. Но если вы раньше никогда не работали ни с какими САПР, то разобраться в некоторых вопросах (особенно в 3D-моделировании) самостоятельно будет непросто. Поэтому лучше вооружиться какой-либо книжкой. Ниже приведён список наиболее полезных книг по этому вопросу.
Некоторые из них немного устарели, но общие принципы работы в КОМПАС не сильно меняются от версии к версии. Поэтому, если вы научитесь работать в КОМПАС 5.1, то и в КОМПАС 21 работать сможете.
Источник: asu-app.ru
Практическое занятие 1 Введение
Разработанная компанией АСКОН система автоматизированного проектирования КОМПАС 3D получила широчайшее распространение в промышленности. КОМПАС – это еще и великолепная платформа для разработки собственных приложений и библиотек, которые до бесконечности расширяют функциональные возможности данной САПР.
Для освоения предлагаемого материала вполне достаточно базовых навыков работы в КОМПАС (в первую очередь — построения трехмерных моделей деталей и сборок) и начальных познаний в программировании.
Если вы, как инженер, ежедневно выполняете одни и те же сложные, трудные, скучные операции (расчеты механизмов, черчение, оформление документации…), то рано или поздно у вас возникнет вопрос: «почему это делаю я, а не компьютер?»
А так как решаемые задачи на каждом предприятии свои, стандартные средства и библиотеки КОМПАС, несмотря на их обширность, подойдут далеко не всегда. И самое правильное решение – взяться за дело самому.
Отлаженная библиотека будет точно выполнять расчеты и построения, а безошибочность – это гарантия качества проектных решений. Конструирование является крайне ответственным делом, ошибки здесь недопустимы, поэтому время, затраченное на разработку своей библиотеки, непременно окупится, превратившись в безошибочные проектные решения.
Наконец, нельзя не признать, что число лиц, владеющих и инженерным делом, и программированием, и навыками разработки приложений для КОМПАС, весьма невелико, а спрос на их услуги только растет.
КОМПАС есть в каждом городе, на большинстве предприятий, и знание того, как резко повысить эффективность работы с ним – это ваше огромное конкурентное преимущество на рынке труда.
Принципы программирования для компас
КОМПАС, в отличие от AutoCAD, не имеет встроенного языка программирования. Причина этого очень проста: если в фактически полностью двухмерном AutoCAD еще можно было как-то обойтись встроенным языком то сложность исходно трехмерной САПР такова, что лучше всего с ней справляется «нормальная» внешняя система программирования. Такой подход в трехмерных САПР стал общепринятым: и SolidWorks, и SolidEdge, и Inventor не имеют встроенных средств программирования.
Чем, «приложение» отличается от «библиотеки»?
Приложение – это внешний исполнимый (с расширением .exe) файл, который запускается отдельно от КОМПАСа, затем этот файл загружает в память КОМПАС или подключается к уже запущенному приложению и реализует функции кправления. Таким образом, при использовании приложения в памяти одновременно находятся и ваша программа, и КОМПАС. Схематически это показано на Рис. 1.
Рис. 1. — Взаимодействие внешнего приложения с КОМПАС
При втором способе мы создаем библиотеку (файл с расширением .rtw), который сам по себе запустить нельзя – он запускается только из КОМПАС (точно так же, как запускаются встроенные в него многочисленные библиотеки типа Shaft 3D). При этом одновременно можно загрузить в память несколько библиотек (Рис. 2).
Рис. 2. — Взаимодействие КОМПАС с библиотеками
Библиотека – более стандартное и «правильное» решение, потому что все управление библиотекой происходит из окна КОМПАС привычными пользователю средствами.
Но и приложение имеет право на жизнь, если, скажем, КОМПАС применяется для «тихого» вывода в графический файл результатов расчетов.
В любом случае команды и в приложении, и в библиотеке одни и те же, небольшая разница возникает лишь при создании экранных окон — в библиотеке это требует чуть больше усилий. Отладка библиотеки также чуть более сложна. Кстати, вполне допускается сначала отладить приложение, а затем преобразовать его в библиотеку.
Источник: studfile.net