МУ_ЛР_ЛиПОАС. Методические указания по выполнению лабораторных работ по дисциплине (модулю) Лингвистическое и программное обеспечение автоматизированных систем
Скачать 2.76 Mb.
|
4. Ход работы (порядок выполнения работы)1) Ознакомится теоретической справкой. 2) Разработать ПО для реализации задания. 3) Оформить отчет. 4) Защитить работу преподавателю. 5. Содержание отчета1) Титульный лист 2) Задание 3) Чертеж с указанием параметров. 4) Описание процесса подготовки макроса. 5) Скриншоты с демонстрацией работы программы. 6) Выводы по работе 7) Список используемой литературы 8) Приложение – текст макроса. Лабораторная работа № 5 Разработка программных продуктов для трехмерного моделирования с использованием встроенных языков среды САПР 1. Цель и задачи работыНаучиться реализовавать библиотеки САПР в среде КОМПАС-Макро с использованием языка Python. Задачами работы являются Изучить задание. Освоить работу с КОМПАС-Макро. Освоить основы языка 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 – цвета для операции. Основные операции:
Принцип всех операций примерно одинаков – получение операции выбор плоскости определение параметров определение эскиза. Толщину одной пластины зададим в 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), и в итоге у нас получается схематичная модель электромуфты: Итак, самое главное сделано, муфта чертится, все что нужно было – было параметризовано. Осталось обеспечить ввод данных пользователем, чтобы можно было конфигурировать модель. |