Файл: Методические указания по выполнению лабораторных работ по дисциплине (модулю) Лингвистическое и программное обеспечение автоматизированных систем.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.01.2024
Просмотров: 620
Скачиваний: 3
СОДЕРЖАНИЕ
2.Общие положения (теоретические сведения)
2.1. Принцип рекурсии в правилах грамматики
2.2. Запись правил грамматик с использованием метасимволов
2.3. Запись правил грамматик в графическом виде
3. Задание на лабораторную работу
4. Ход работы (порядок выполнения работы)
2.Общие положения (теоретические сведения)
2.1. Разработка лексического анализатора
2.2. Разработка синтаксического анализатора
2.3. Пример построения простого синтаксического анализатора
2.4. Анализаторы для сложных рекурсивных грамматик
2. Общие положения (теоретические сведения)
2.5. Логическая структура XML-документа
2.8. Описание структуры XML-документов
2.9. Язык XML Sсhema Definition (XSD)
2.10. Программная обработка XML-документов
2.11. Обработка XML-данных с использованием модели DOM
2.14. Сопоставление объектной иерархии с XML-данными
2.16. Считывание XML-документа в DOM
2.17. Директивы таблицы стилей, встроенные в документ
2.18. Загрузка данных из модуля чтения
2.19. Доступ к атрибутам в модели DOM
2.20. Получение всех атрибутов в виде коллекции
2.21. Получение единичного узла атрибута
2.22. Считывание объявлений сущностей и ссылок на сущности в DOM
2.23. Сохраняемые ссылки на сущности
2.24. Разворачиваемые и не сохраняемые ссылки на сущности
2.25. Создание новых узлов в модели DOM
2.26. Создание новых атрибутов для элементов в модели DOM
2.29. Проверка имен XML-элементов и атрибутов при создании новых узлов
2.30. Создание новых ссылок на сущности
2.32. Копирование существующих узлов
2.33. Копирование существующих узлов из одного документа в другой
2.34. Копирование фрагментов документа
2.35. Удаление узлов, содержимого и значений из XML-документа
2.36. Изменение узлов, содержимого и значений в XML-документе
2.37. Проверка XML-документа в DOM
2.38. Проверка XML-документа в DOM
2.39. Обработка ошибок проверки и предупреждений
2.40. Сохранение и запись документа
2.42. Запись содержимого документа с помощью свойства OuterXml
3.Задание на лабораторную работу
4. Ход работы (порядок выполнения работы)
2. Общие положения (теоретические сведения)
3. Задание на лабораторную работу
4. Ход работы (порядок выполнения работы)
2. Общие положения (теоретические сведения)
4. Ход работы (порядок выполнения работы)
2. Общие положения (теоретические сведения)
3.5. Эскизы в документах Деталей
3.6. Взаимодействие с пользователем
3 Задание на работу (рабочее задание)
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), и в итоге у нас получается схематичная модель электромуфты:
Итак, самое главное сделано, муфта чертится, все что нужно было – было параметризовано. Осталось обеспечить ввод данных пользователем, чтобы можно было конфигурировать модель.
Организация ввода данных
Чтобы можно было параметрически изменять значения размеров модели (т.е. не строить одну и ту же муфту, а иметь возможность построения целого семейства параметрических конструкций), необходимо обеспечить ввод значений пользователем. Проще всего это сделать при помощи встроенных в сам КОМПАС диалоговых окон.
Пример:
r=0.0 r = iKompasObject.ksReadDouble( 'R=', 100, 0, 200, r )[1] |
Сначала необходимо инициализировать переменную (в данном случае r) любым значением. Зачем? А затем, что все переменные в Python динамические и, чтобы КОМПАСу было куда поместить введенное пользователем значение, по переменную должна быть выделена ячейка памяти.
Далее у объекта iKompasObject (ссылка на который получается командой iKompasObject = KAPI.KompasObject(iKompasObject) в начале программы) имеется ряд свойств, выводящих на экран КОМПАС диалоговые окна ввода данных:
Ввод вещественного числа:
ksReadDouble(подсказка, значение по умолчанию, минимальное значение, максимальное значение, переменная)
Ввод целого числа:
ksReadInt(подсказка, значение по умолчанию, минимальное значение, максимальное значение, переменная)
Ввод текстовой строки:
ksReadString(подсказка, значение по умолчанию, переменная)
Здесь:
Подсказка – текстовая строка, выводимая в окне (скажем, «Введите радиус, мм»);
значение по умолчанию – значение, которое будет сразу подставлено в окно ввода;
минимальное значение – минимально допустимое для ввода значение. Если вводимое число меньше его, будет выдано предупреждение, а ввод запрошен снова;
максимальное значение – максимально допустимое для ввода значение. Если вводимое число больше его, будет выдано предупреждение, а ввод запрошен снова;
переменная – ссылка на ту же переменную, что стоит слева от знака присваивания (так надо!).
Самое главное – не забыть после вызова метода поставить [1]. Дело в том, что КОМПАС возвращает значение в виде массива, из которого нам нужен только первый элемент.
Ниже показано стандартное окно ввода вещественного числа: