Файл: Лабораторная работа 4 Разработка программных продуктов для двухмерного моделирования с использованием встроенных языков среды сапр.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.01.2024
Просмотров: 42
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНОБРНАУКИ РОССИИ
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Тульский государственный университет»
Кафедра вычислительной техники
Лингвистическое и программное обеспечение автоматизированных
систем
ЛАБОРАТОРНАЯ РАБОТА №4
Разработка программных продуктов для двухмерного моделирования с использованием встроенных языков среды САПР
Выполнил: студент группы 220292
Рогожин А.Ю.____________
Проверил: доц., к.т.н. кафедры ВТ
Пестин М.С____________
Тула 2023
Целью работы является реализация макроса САПР в среде КОМПАС-Макро с использованием языка Python для двухмерного проектирования.
Задачами работы являются:
-
Изучить задание; -
Освоить работу с КОМПАС-Макро; -
Освоить основы языка Python.
2. Задание на работу
Вариант №4
Создать макрос для параметрического построения данной детали (рисунок 1) в 2D в КОМПАС средствами языка Python.
Рисунок 1 – Задание
3. Ход работы
Возможно два способа создания макросов: вручную на языке Python или путем записи действий пользователя и затем редактирования некоторых параметров макроса.
Макрос может не только выполнять построения, но и анализировать уже существующие чертежи.
Для того чтобы создать заданный объект необходимо создать текстовый документ и подключить к нему python, а также другие библиотеки (листинг 1).
Листинг 1 – Подключение
# Подключим python
import pythoncom
from win32com.client import Dispatch, gencache
import LDefin2D
import MiscellaneousHelpers as MH
# Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants
# Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))
MH.iKompasObject = kompas_object
# Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}",0,1,0)application=kompas_api7_module.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))
MH.iApplication = application
Далее выполняется подключение активного документа (листинг 2).
Листинг 2 – Подключение документа
Documents = application.Documents
# Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()
Затем прописываются координаты линий чертежа, для построения заданного объекта (листинг 3).
Листинг 3 – Координаты
obj = iDocument2D.ksLineSeg(172.04632660962, 253.49488340422, 152.04632660962, 253.49488340422, 1)
obj = iDocument2D.ksLineSeg(152.04632660962, 253.49488340422, 120.850925429149, 237.625197043441, 1)
obj = iDocument2D.ksLineSeg(120.850925429149, 237.625197043441, 120.850925429149, 217.625197043441, 1)
obj = iDocument2D.ksLineSeg(120.850925429149, 217.625197043441, 130.850925429149, 217.625197043441, 1)
obj = iDocument2D.ksLineSeg(130.850925429149, 217.625197043441, 130.850925429149, 207.625197043441, 1)
obj = iDocument2D.ksLineSeg(130.850925429149, 207.625197043441, 120.850925429149, 207.625197043441, 1)
obj = iDocument2D.ksLineSeg(120.850925429149, 207.625197043441, 120.850925429149, 187.625197043441, 1)
obj = iDocument2D.ksLineSeg(120.850925429149, 187.625197043441, 152.663492088135, 173.032027320328, 1)
obj = iDocument2D.ksLineSeg(152.663492088135, 173.032027320328, 172.04632660962, 173.032027320328, 1)
obj = iDocument2D.ksLineSeg(172.04632660962, 173.032027320328, 172.04632660962, 253.49488340422, 1)
obj = iDocument2D.ksLineSeg(120.850925429149, 232.591342732517, 136.757208758642, 232.591342732517, 1)
obj = iDocument2D.ksLineSeg(172.04632660962, 230.372197400241, 137.04632660962, 230.372197400241, 1)
obj = iDocument2D.ksLineSeg(136.757208758642, 232.591342732517, 137.04632660962, 230.372197400241, 1)
obj = iDocument2D.ksLineSeg(136.757208758642, 232.591342732517, 136.757208758642, 227.591342732517, 1)
obj = iDocument2D.ksLineSeg(136.757208758642, 227.591342732517, 172.04632660962, 227.591342732517, 1)
obj = iDocument2D.ksLineSeg(107.539369151393, 212.625197043441, 187.539369151393, 212.625197043441, 8)
obj = iDocument2D.ksLineSeg(136.757208758642, 227.591342732517, 136.757208758642, 212.625197043441, 1)
obj = iDocument2D.ksLineSeg(152.663492088135, 173.032027320328, 152.663492088135, 212.625197043441, 1)
obj = iDocument2D.ksLineSeg(152.663492088135, 212.625197043441, 136.757208758642, 212.625197043441, 1)
obj = iDocument2D.ksLineSeg(172.04632660962, 248.932321997461, 162.04632660962, 248.932321997461, 1)
obj = iDocument2D.ksLineSeg(162.04632660962, 248.932321997461, 162.04632660962, 245.560040223831, 1)
obj = iDocument2D.ksLineSeg(162.04632660962, 245.560040223831, 172.04632660962, 245.560040223831, 1)
Далее задаётся штриховка. Сначала дается команда начала штриховки iHatchParam, затем строятся объекты, образующие ее контур, а затем еще одна команда завершает построение.
Параметры штриховки задаются следующим образом (листинг 4).
Листинг 4 – Задание штриховки
iHatchParam = kompas6_api5_module.ksHatchParam(kompas_object.GetParamStruct(kompas6_constants.ko_HatchParam))
iHatchParam.Init()
iHatchParam.ang = 45
iHatchParam.color = -16777216
iHatchParam.sheeting = 1
iHatchParam.step = 3
iHatchParam.width = 0
iHatchParam.x = 0
iHatchParam.y = 0
iHatchParam.style = 0
iHatchParam.boundaries = iDocument2D.ksNewGroup(1)
iDocument2D.ksContour(1)
iDocument2D.ksNewGroup(1)
obj = iDocument2D.ksLineSeg(152.04632660962, 253.49488340422, 120.850925429149, 237.625197043441, 1)
obj = iDocument2D.ksLineSeg(120.850925429149, 237.625197043441, 120.850925429149, 232.591342732517, 1)
obj = iDocument2D.ksLineSeg(120.850925429149, 232.591342732517, 136.757208758642, 232.591342732517, 1)
obj = iDocument2D.ksLineSeg(136.757208758642, 232.591342732517, 136.757208758642, 227.591342732517, 1)
obj = iDocument2D.ksLineSeg(136.757208758642, 227.591342732517, 172.04632660962, 227.591342732517, 1)
obj = iDocument2D.ksLineSeg(172.04632660962, 227.591342732517, 172.046326609619, 245.560040223831, 1)
obj = iDocument2D.ksLineSeg(172.04632660962, 245.560040223831, 162.04632660962, 245.560040223831, 1)
obj = iDocument2D.ksLineSeg(162.04632660962, 245.560040223831, 162.04632660962, 248.932321997461, 1)
obj = iDocument2D.ksLineSeg(162.04632660962, 248.932321997461, 172.04632660962, 248.932321997461, 1)
obj = iDocument2D.ksLineSeg(172.04632660962, 248.932321997461, 172.04632660962, 253.49488340422, 1)
obj = iDocument2D.ksLineSeg(172.04632660962, 253.49488340422, 152.04632660962, 253.49488340422, 1)
iDocument2D.ksEndGroup()
obj = iDocument2D.ksEndObj()
После чего сохраняем данный документ в формате cdm, после этого макрос будет готов к использованию в среде разработки КОМПАС 3d.
Для того чтобы запустить и проверить работоспособность макроса необходимо в менеджере библиотек выбрать папку прочие и перейти в КОМПАС-макро. Далее следует открыть макросы путем нажатия на соответствующую кнопку (рисунок 2).
Рисунок 2 – Макросы
Далее необходимо нажать выполнить, после чего макрос мгновенно начертит заданный ранее чертёж (рисунок 3).
,
Рисунок 3 - Результат
Чтобы можно было параметрически изменять значения размеров модели (т.е. не строить одну и ту же муфту, а иметь возможность построения целого семейства параметрических конструкций), необходимо обеспечить ввод значений пользователем. Проще всего это сделать при помощи встроенных в сам КОМПАС диалоговых окон (листинг 4).
Сначала необходимо инициализировать переменную (в данном случае r) любым значением. Далее у объекта iKompasObject (ссылка на который получается командой iKompasObject = KAPI.KompasObject(iKompasObject) в начале программы) имеется ряд свойств, выводящих на экран КОМПАС диалоговые окна ввода данных (рисунок 4).
Листинг 4 – Задание диалоговых окон
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
4. Вывод
В данной лабораторной работе были получены знания по работе с КОМПАС-Макро, а также был написан собственный макрос с возможностью ввода параметров для создания 2D объектов.
ПРИЛОЖЕНИЕ
# -*- coding: cp1251 -*-
#|11
import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
import pythoncom
from win32com.client import Dispatch
import LDefin2D
import LDefin3D
import ksConstants as CONST2D7
import ksConstants3D as CONST3D7
import MiscellaneousHelpers as MH
iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)
MH.iKompasObject = iKompasObject
iApplication = Dispatch('KOMPAS.Application.7')
iApplication = KAPI7.IApplication(iApplication)
MH.iApplication = iApplication
iDocument2D = iKompasObject.ActiveDocument2D()
iDocument = iApplication.ActiveDocument
iKompasDocument2D = KAPI7.IKompasDocument2D(iDocument)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]
iDocument2D.ksLineSeg(r,r1,r3,r4,1)
r=0.0
r = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r )[1]
r1=0.0
r1 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r1 )[1]
r3=0.0
r3 = iKompasObject.ksReadDouble( 'R=', 100, 0, 300, r3 )[1]
r4=0.0
r4 = iKompasObject.ksReadDouble( 'R1=', 100, 0, 300, r4 )[1]