Файл: Лабораторная работа 4 Разработка программных продуктов для двухмерного моделирования с использованием встроенных языков среды сапр.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.01.2024

Просмотров: 42

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНОБРНАУКИ РОССИИ
Федеральное государственное бюджетное образовательное учреждение

высшего образования

«Тульский государственный университет»

Кафедра вычислительной техники

Лингвистическое и программное обеспечение автоматизированных

систем

ЛАБОРАТОРНАЯ РАБОТА №4
Разработка программных продуктов для двухмерного моделирования с использованием встроенных языков среды САПР


Выполнил: студент группы 220292

Рогожин А.Ю.____________

Проверил: доц., к.т.н. кафедры ВТ

Пестин М.С____________


Тула 2023
Целью работы является реализация макроса САПР в среде КОМПАС-Макро с использованием языка Python для двухмерного проектирования.

Задачами работы являются:

  1. Изучить задание;

  2. Освоить работу с КОМПАС-Макро;

  3. Освоить основы языка 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]