Главная страница

МУ_ЛР_ЛиПОАС. Методические указания по выполнению лабораторных работ по дисциплине (модулю) Лингвистическое и программное обеспечение автоматизированных систем


Скачать 2.76 Mb.
НазваниеМетодические указания по выполнению лабораторных работ по дисциплине (модулю) Лингвистическое и программное обеспечение автоматизированных систем
Дата12.04.2023
Размер2.76 Mb.
Формат файлаdoc
Имя файлаМУ_ЛР_ЛиПОАС.doc
ТипМетодические указания
#1057976
страница28 из 32
1   ...   24   25   26   27   28   29   30   31   32

4. Ход работы (порядок выполнения работы)



1) Ознакомится теоретической справкой.

2) Разработать ПО для реализации задания.

3) Оформить отчет.

4) Защитить работу преподавателю.

5. Содержание отчета



1) Титульный лист

2) Задание

3) Чертеж с указанием параметров.

4) Описание процесса подготовки макроса.

5) Скриншоты с демонстрацией работы программы.

6) Выводы по работе

7) Список используемой литературы

8) Приложение – текст макроса.

Лабораторная работа № 5

Разработка программных продуктов для трехмерного моделирования с использованием встроенных языков среды САПР

1. Цель и задачи работы


Научиться реализовавать библиотеки САПР в среде КОМПАС-Макро с использованием языка Python.

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

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

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

  3. Освоить основы языка Python.

2. Общие положения (теоретические сведения)


Чтобы продемонстрировать работу с библиотекой Компас-МАКРО, напишем скрипт, на вход которого будут подаваться параметры, а на выходе будет строиться 3D-модель в Компас. За моделируемый объект возьмем электромуфту. Построим ее схематичную модель:



Изменяемыми параметрами будут:

  • диаметр вала, на который будет сажаться муфта;

  • количество пластин;

  • количество отверстий под крепления;

  • высота передней и задней частей муфты;

  • цвета основы муфты и ее пластин.

Очевидно, что перед нами тело вращения, а значит создать модель соответствующей операцией будет проще всего. Вся задача состоит в том, чтобы описать параметрические эскизы,а затем создать операцию вращения.

Строить будем в таком порядке: сделаем основу муфты, срежем фаски, вырежем отверстия и добавим пластины.

Опишем для начала основную операцию вращения, необходимые переменные и временные с заданными значениями для упрощения описаний:

# coding: cp1251

# Муфта|macro
import Kompas6API5, LDefin2D, LDefin3D

Kompas, doc3d = start3d()

Kompas.Visible = 1

iPart = Kompas6API5.ksPart(doc3d.GetPart(LDefin3D.pNew_Part))

iPart2 = Kompas6API5.ksPart(doc3d.GetPart(LDefin3D.pNew_Part))
d=42 # временные переменные,

front=11 # позже будет обеспечен

back=10 # графический интерфейс

plastines=8

holes=6

red1=140

green1=0

blue1=0

red2=190

green2=190

blue2=190
def Rotator(Part, iEntitySketch, R, G, B): # Операция вращения

# Получение операции

iEntityRotate = Kompas6API5.ksEntity(Part.NewEntity(LDefin3D.o3d_baseRotated))

# Определение цвета результирущей части

iEntityRotate.SetAdvancedColor(LDefin3D.RGB(R,G,B), 0.8, 0.8, 0.8, 0.8, 1, 0.8)

# Получение плоскости операции

iRotateDef = Kompas6API5.ksBaseRotatedDefinition(iEntityRotate.GetDefinition())

# Определение параметров операции

iRotproperty = Kompas6API5.ksRotatedParam(iRotateDef.RotatedParam())

iRotproperty.direction = LDefin3D.dtReverse

iRotproperty.toroidShape = 0

# эскиз операции вращения

iRotateDef.SetSketch (iEntitySketch)

# обновление параметров операции и эскиза

iEntitySketch.Update()

iEntityRotate.Update()
На вход функции подаются следующие параметры:

Part – часть муфты: основа или пластины;

iEntitySketch – эскиз для операции;

R, G, B – цвета для операции.


Основные операции:

Метод

Значение

o3d_baseRotated

Поворот

o3d_baseLoft

Лофтинг

o3d_baseExtrusion

Выдавливание

o3d_cutExtrusion

Вырезать выдавливанием

o3d_cutLoft

Вырезать лофтингом

o3d_cutRotated

Вырезать вращением


Принцип всех операций примерно одинаков – получение операции  выбор плоскости  определение параметров  определение эскиза.
Толщину одной пластины зададим в 1 мм, расстояние между соседними пластинами и основой муфты тоже определим в 1 мм. Отсюда получается, что толщина участка муфты, где находятся пластины вычисляется по формуле:

L = N*2+1 (мм), где:

L – толщина участка;

N – число пластин.



Для создания основы муфты нужно начертить эскиз с учетом количества пластин и остальных параметров:



Теперь определим функцию отрисовки тела муфты:
def Body(d,front,back,plastines,holes,red1,green1,blue1):

# получаем эскиз

iEntitySketch = Kompas6API5.ksEntity(iPart.NewEntity(LDefin3D.o3d_sketch))

# интерфейс свойств эскиза

isketchDef = Kompas6API5.ksSketchDefinition(iEntitySketch.GetDefinition())

# получим интерфейс базовой плоскости XOZ

iBasePlane = Kompas6API5.ksEntity(iPart.GetDefaultEntity(LDefin3D.o3d_planeXOZ))

isketchDef.SetPlane (iBasePlane) # установим плоскость XOZ базовой для эскиза

iEntitySketch.Create() # создадим эскиз

# интерфейс редактора эскиза, параметрическое задание эскиза

isketchEdit = Kompas6API5.ksDocument2D(isketchDef.BeginEdit())

isketchEdit.ksLineSeg (-(d/2+2), 0, -(d/2+2+27), 0, 1)

isketchEdit.ksLineSeg (-(d/2+2+27), 0, -(d/2+2+27), -back, 1)

isketchEdit.ksLineSeg (-(d/2+2+27), -(back), -(d/2+2+27-5), -(back), 1)

isketchEdit.ksLineSeg (-(d/2+2+27-5), -(back), -(d/2+2+27-5), -(back+plastines*2+1), 1)

isketchEdit.ksLineSeg (-(d/2+2+27-5), -(back+plastines*2+1), -(d/2+2+27), -(back+plastines*2+1), 1)

isketchEdit.ksLineSeg (-(d/2+2+27), -(back+plastines*2+1), -(d/2+2+27), -(back+plastines*2+1+front-4), 1)

isketchEdit.ksLineSeg (-(d/2+2+27), -(back+plastines*2+1+front-4), -(d/2+16), -(back+plastines*2+1+front-4), 1)

isketchEdit.ksLineSeg (-(d/2+16), -(back+plastines*2+1+front-4), -(d/2+16), -(back+plastines*2+1+front), 1)

isketchEdit.ksLineSeg (-(d/2+16), -(back+plastines*2+1+front), -(d/2+2), -(back+plastines*2+1+front), 1)

isketchEdit.ksLineSeg (-(d/2+2), -(plastines*2+1+front+back), -(d/2+2), 0, 1)

isketchEdit.ksLineSeg (0, -20, 0, 20, 3)

isketchDef.EndEdit() #завершение редактирования эскиза
Rotator(iPart, iEntitySketch, red1, green1, blue1)

Body(d,front,back,plastines,holes,red1,green1,blue1)
Все координаты с отрицательным знаком для того, чтобы муфта рисовалась не вверх ногами, а нормально ориентировано.

Переменная holes понадобится, когда будем чертить крепления. Через нее передается количество отверстий.

Наш скрипт уже можно запускать. Как из PythonWin (по F5), так из самого Компаса, подключив библиотеку Компас-МАКРО и добавив этот макрос.

В результате получим:


Значит в эскиз описан верно. Можно попробовать изменить значения переменных, чтобы проверить арифметику на глюки.

Теперь нужно снять фаски. Это делается методом o3d_chamfer. Чтобы совершить какую-либо операцию на уже созданных гранях, ребрах, плоскостях и прочих, необходимо их выделить. Проще всего сделать выделение по принадлежащей поверхности/плоскости точке. Следует заметить, что точка может принадлежать, например, нескольким плоскостям одновременно – лежать на ребре.

Для этого случая существуют коллекции ksEntityCollection, хранящие объекты одинаковых типов. Для фаски нам нужно ребро - o3d_edge. В эту коллекцию и занесутся все ребра, к которым относится выбранная точка. Коллекция – массив, к элементу которого обращаются по индексу.

Функция снятия фаски выглядит так:

def Faska(x,y,z,FasLen,R,G,B):

# создаем коллекцию

iCollect = Kompas6API5.ksEntityCollection(iPart.EntityCollection(LDefin3D.o3d_edge))

# выбираем точку X,Y,Z и проверяем множество на пустоту

if iCollect and iCollect.SelectByPoint(x,y,z) and iCollect.GetCount():

iEntityChamfer = Kompas6API5.ksEntity(iPart.NewEntity(LDefin3D.o3d_chamfer))

# устанавливаем цвет

iEntityChamfer.SetAdvancedColor(LDefin3D.RGB(R,G,B), 0.8, 0.8, 0.8, 0.8, 1, 0.8)

iChamferDef = Kompas6API5.ksChamferDefinition(iEntityChamfer.GetDefinition())

# FasLen - ширина сторроны фаски

iChamferDef.SetChamferParam (True, FasLen, FasLen)

iChamferDef.tangent = False # продолжить по касательной

# динамический массив объектов - ksEntityCollection

iArr = Kompas6API5.ksEntityCollection(iChamferDef.array())

iArr.Add (iCollect.GetByIndex(0))

iEntityChamfer.Create()
Для корректного вызова функции необходимо передать ей координату точки, принадлежащей ребру, ширину фаски и цвет результирующей грани.

Теперь опишем функцию для отрисовки креплений. Определим функцию создания отверстий под крепления следующим образом:

def Krepez(DelD,Height,holes):

iSketch = iPart.NewEntity(LDefin3D.o3d_sketch)

iDefinition = iSketch.GetDefinition()

# Поверхность

iCollection = iPart.EntityCollection(LDefin3D.o3d_face)

# Выделяем грань по точке на ней

iCollection.SelectByPoint(DelD+14, 0.0, Height)

iPlane = iCollection.GetByIndex(0)

iDefinition.SetPlane(iPlane)

# Создаем эскиз на 6 отверстий

iSketch.Create()

iDocument2D = iDefinition.BeginEdit()

for i in range(holes):

iDocument2D.ksCircle(math.sin(360/holes*i*math.pi/180)*(DelD+7), math.cos(360/holes*i*math.pi/180)*(DelD+7), 2.0, 1)

iDefinition.EndEdit()

# Операция вырезать выдавливанием

obj = iPart.NewEntity(LDefin3D.o3d_cutExtrusion)

iDefinition = obj.GetDefinition()

# Параметры операции (глубина, направление, тонкая стенка)

iExtrusionParam = iDefinition.ExtrusionParam()

# Глубина вырезания

iExtrusionParam.depthNormal = 6.0

iExtrusionParam.direction = LDefin3D.dtNormal

iThinParam = iDefinition.ThinParam()

iThinParam.thin = False

iDefinition.SetSketch(iSketch)

# Обновление операции и эскиза

iSketch.Update()

obj.Update()

Передаваемыми параметрами выступают переменные DelD – диаметр верхней части муфты, по которому пройдут центры отверстий, Height – их глубина и holes – собственно количество отверстий.

Добавим в функцию Body вызов соответствующих функций:
Kompas.ksMessage ("Создание фасок")

Faska((d/2+16), 0, (back+plastines*2+1+front), 2, red1, green1, blue1)

Faska((d/2+2+27), 0, (back+plastines*2+1+front)-4, 3, red1, green1, blue1)

Faska((d/2+2+27), 0, 0, 1, red1, green1, blue1)

Kompas.ksMessage ("Нарезание отверстий")

Krepez((d/2),(back+plastines*2+1+front),holes)
Отработав данный скрипт, результат будет таким:

Почти то, что мы задумывали. Осталось добавить пластины серого цвета. Их сделаем на отдельном эскизе, в той же плоскости, что и тело муфты. Эскиз тоже должен быть параметрическим и зависеть от диаметра вала, на котором сидит муфта, от высоты передней и задней частей.

Повторяющиеся части пластин будем чертить в цикле.



def Plastin(d,front,back,plastines,red2,green2,blue2):

iEntitySketch2 = Kompas6API5.ksEntity(iPart2.NewEntity(LDefin3D.o3d_sketch))

# интерфейс свойств эскиза

isketchDef2 = Kompas6API5.ksSketchDefinition(iEntitySketch2.GetDefinition())

# получим интерфейс базовой плоскости XOZ

iBasePlane2 = Kompas6API5.ksEntity(iPart2.GetDefaultEntity(LDefin3D.o3d_planeXOZ))

# установим плоскость XOZ базовой для эскиза

isketchDef2.SetPlane (iBasePlane2)

iEntitySketch2.Create() # создадим эскиз

# интерфейс редактора эскиза

isketchEdit2 = Kompas6API5.ksDocument2D(isketchDef2.BeginEdit())

isketchEdit2.ksLineSeg (0, -20, 0, 20, 3)

isketchEdit2.ksLineSeg (-(d/2), 0, -(d/2+2), 0, 1)

isketchEdit2.ksLineSeg (-(d/2), -(plastines*2+1+front+back), -(d/2+2), -(plastines*2+1+front+back), 1)

isketchEdit2.ksLineSeg (-(d/2), -0, -(d/2), -(plastines*2+1+front+back), 1)

isketchEdit2.ksLineSeg (-(d/2+2), -0, -(d/2+2), -(back+1), 1)

isketchEdit2.ksLineSeg (-(d/2+2), -(plastines*2+1+back), -(d/2+2), -(plastines*2+1+front+back), 1)

# создадим одинаковые чаcти в цикле

for i in range(plastines):

isketchEdit2.ksLineSeg (-(d/2+2), -(2*i+back+1), -(d/2+2+27), -(2*i+back+1), 1)

isketchEdit2.ksLineSeg (-(d/2+2+27), -(2*i+back+1), -(d/2+2+27), -(2*i+1+back+1), 1)

isketchEdit2.ksLineSeg (-(d/2+2+27), -(2*i+1+back+1), -(d/2+2), -(2*i+1+back+1), 1)

isketchEdit2.ksLineSeg (-(d/2+2), -(2*i+1+back+1), -(d/2+2), -(2*i+2+back+1), 1)

isketchDef2.EndEdit() #завершение редактирования эскиза

# и провернем

Rotator(iPart2, iEntitySketch2, red2, green2, blue2)
Добавим строчку вызова этой функции Plastin(d,front, back, plastines, red2, green2, blue2), и в итоге у нас получается схематичная модель электромуфты:



Итак, самое главное сделано, муфта чертится, все что нужно было – было параметризовано. Осталось обеспечить ввод данных пользователем, чтобы можно было конфигурировать модель.

1   ...   24   25   26   27   28   29   30   31   32


написать администратору сайта