Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ekins_Inventor_API

.pdf
Скачиваний:
19
Добавлен:
26.03.2015
Размер:
792.22 Кб
Скачать

Глубока ли кроличья нора? Матрицы и другие математические и

геометрические объекты Inventor® API.

Brian Ekins – Autodesk

DE205-2 Рассмотрены концепции и объекты Inventor API, предназначенные для работы с геометрией. Показано, каким образом твердые тела и другие геометрические объекты представлены в Инвенторе и его API (B-Rep) и как они взаимодействуют друг с другом. Обсуждаются вспомогательные математические объекты, такие как матрицы и векторы. Рассмотрено применение прокси-объектов для работы с геометрией компонентов в контексте сборки.

О лекторе: Брайан Экинс — разработчик API для Autodesk Inventor®. Работает в области САПР уже свыше 25 лет в разных должностях, включая администратора САПР, инженера САПР, разработчика API для САПР и консультанта. Брайан был в числе первых разработчиков Inventor® API, выступает на конференциях и проводит учебные семинары для тысяч пользователей и разработчиков по всему миру.

brian.ekins@autodesk.com

ОГЛАВЛЕНИЕ

 

ГЕОМЕТРИЯ (Geometry) ...................................................................................................

3

Выделяемые объекты (Entities) и их геометрия ...............................................................

3

Точки (Points) ..............................................................................................................

4

Кривые (Curves)...........................................................................................................

4

Поверхности (Surfaces).................................................................................................

8

Аппроксимация кривых и поверхностей .......................................................................

11

Твердые тела (Solids) .................................................................................................

11

СБОРКИ (Assemblies).....................................................................................................

13

Прокси-объекты (Proxies)............................................................................................

13

Обход дерева сборки (Assembly Traversal)....................................................................

16

МАТЕМАТИЧЕСКИЕ ОБЪЕКТЫ .........................................................................................

17

Объект TransientGeometry (Вспомогательная геометрия) ...............................................

17

Объект Vector ............................................................................................................

17

Объект Matrix.............................................................................................................

19

Матрицы преобразований ...........................................................................................

23

Перевод: Владимир Ананьев, vananiev@gmail.com

Текст в оригинале и демонстрационные примеры вы можете найти в блоге Брайана Экинса

“Mod the Machine” по адресу: http://modthemachine.typepad.com/my_weblog/2008/12/after-autodesk-university.html

2

Морфеус сказал Нео: «Не поздно отказаться. Потом пути назад не будет. Примешь синюю таблетку, — и сказке конец. Ты проснешься в своей постели и поверишь, что это был сон. Примешь красную таблетку, — войдешь в Страну Чудес, и я покажу тебе, глубока ли кроличья нора…»

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

ГЕОМЕТРИЯ (Geometry)

Основными областями применения Инвентора являются либо создание новой геометрии, либо использование существующей для решения тех или иных задач (выпуск чертежей, инженерный анализ и т.п.) Создавая деталь, вы начинаете с двумерной геометрии в эскизе и затем используете ее в конструктивных элементах для создания твердотельных моделей. Благодаря тому, что Инвентор является параметрическим пакетом, вы можете быстро изменять модель с помощью параметров или иных инструментов с последующим перевычислением модели. Инвентор за сценой делает огромную работу, чтобы превратить логические команды в соответствующую геометрию. В данной лекции представлен обзор различных видов геометрии в Инвенторе.

Выделяемые объекты (Entities) и их геометрия

Чтобы подчеркнуть отличия некоторых понятий, в API последовательно применяется определенная терминология. Хотя термины «entity» и «geometry» нередко рассматриваются как эквивалентные, в API им придается разный смысл. Понятие «entity» применяется к любым объектам, которые можно выделить средствами пользовательского интерфейса. Это могут быть конструктивные элементы, размеры, грань твердого тела или окружность на эскизе. Термин «geometry» используется для описания собственно геометрии объекта-entity. Например, если выделить ребро детали, то объектом-entity будет объект Edge (ребро). Из Edge можно извлечь геометрию, которая в данном случае может быть представлена одним из нескольких типов геометрических объектов (линия, дуга, сплайн и т.п.).

В Инвенторе геометрия представлена вспомогательной геометрией («transient geometry»). Этим термином обозначается группа объектов для описания различных видов геометрии. Слово «Transient» (временный) подчеркивает короткоживущий характер этих объектов, поскольку они не сохраняются Инвентором. Вот пример того, как это работает. Предположим, мы имеем тело в виде прямоугольного параллелепипеда, у которого выделено одно из ребер. В данном примере выделенным объектом-entity является объект Edge (ребро). Из объекта Edge мы можем получить ссылку на его геометрию, которая в данном случае вернет нам геометрический объект LineSegment. Объект LineSegment является вспомогательным (и временным). Своими свойствами он предоставляет нам геометрическую информацию о линейном сегменте, в частности, его начальную и конечную точки.

Существенной особенностью объектов вспомогательной геометрии является их неассоциативный характер. Это означает, что извлекаемая из объекта-entity геометрия точно отражает его геометрию на момент рождения, но ассоциативной связи с ним не имеет. Так, возвращаемый ребром объект LineSegment точно описывает его начальную и конечную точки. Но если родительское ребро будет изменено (скажем, вы увеличите длину выдавливания), то полученный до изменений вспомогательный геометрический объект LineSegment актуальным быть уже перестанет — он ничего «не знает» о последующей эволюции ребра-родителя, поскольку представляет своего рода «мгновенный снимок» геометрии родительского ребра в момент своего рождения. Созданные объекты вспомогательной геометрии можно модифицировать. Например, можно передвинуть начальную и конечную точки, однако это не приведет к изменениям в родительской геометрии объекта-entity, т.к. связь между ним разрывается с момента рождения объекта вспомогательной геометрии.

3

Объекты вспомогательной геометрии можно создавать и непосредственно — без привлечения родительских объектов-entity. Этот сервис предоставляется объектом TransientGeometry, доступ к которому обеспечивает одноименное свойство объекта Application. Это вспомогательный объект API, не имеющий средств визуализации в пользовательском интерфейсе Инвентора. Его задача — предоставление ряда методов для создания разнообразных типов геометрий. Например, метод CreateLineSegment служит для создания объекта LineSegment на базе начальной и конечной точек. С точки зрения конечного пользователя в Инвенторе ровным счетом ничего не происходит. Вы не увидите в графическом окне новой линии. Если вы сохраните текущий документ, этот линейный сегмент в нем сохранен не будет. То, что вы создали, является лишь абстрактным геометрическим описанием линейного сегмента, но не «настоящей» линией-entity.

Точки (Points)

ВИнвенторе имеются несколько объектов-entity, которые представляют точки:

вершина (vertex),

рабочая точка (work point),

точка в 3D-эскизе (3D sketch point) и

точка в 2D-эскизе (2D sketch point).

Первые три всегда задают 3D-точку в пространстве модели. Двумерная эскизная точка описывает 2D-точку в пространстве координат плоского эскиза. Из любого из перечисленных объектов можно извлечь геометрическую точку как объект вспомогательной геометрии. Трехмерные объекты возвращают объект Point, точка 2D-эскиза возвращает объект Point2d. Геометрическая точка обеспечивает доступ к своим координатам (x,y,z) или (x,y), соответственно.

Вместо объекта Point для задания геометрической точки вполне можно было бы применять массив из трех действительных чисел. Однако точка как объект Point не только хранит в себе данные о координатах, но, что вероятно самое важное, она поддерживает дополнительные функции, которые очень полезны при манипуляциях с точками. Например, в дополнение к возможности считывать и задавать координаты точки (x,y,z) объект Point поддерживает метод DistanceTo, который возвращает расстояние до другой точки. Имеются еще несколько полезных методов, которые делают объект Point гораздо более удобным в работе, нежели массив из трех координат.

Кривые (Curves)

Когда вы слышите термин «кривая», то вероятно, представляете себе что-нибудь вроде сплайна, но в общем случае кривая является обобщением линий произвольной геометрии: сплайнов, окружностей, дуг, прямых линий и т.д. Инвентор поддерживает множество 2- и 3- мерных объектов-entity, таких как ребро Edge, эскизная линия SketchLine, эскизная дуга SketchArc, рабочая ось WorkAxis, эскизный сплайн SketchSpline и т.д. Из каждого такого объекта можно извлечь геометрический объект, который предоставит информацию о форме родительского объекта-entity. Примерами таких геометрических объектов являются объекты

LineSegment, BSplineCurve, Circle, Arc и др.

Рассмотрим пример выяснения геометрии выделенного пользователем ребра.

4

Public Sub CurveGeometry()

'Ссылка на активный документ

Dim oPartDoc As PartDocument

Set oPartDoc = ThisApplication.ActiveDocument

'Ссылка на выделенное ребро

On Error Resume Next

Dim oEdge As Edge

Set oEdge = oPartDoc.SelectSet.Item(1)

If Err Then

MsgBox "Следует выделить ребро."

Exit Sub

End If

On Error GoTo 0

End Sub

Тип геометрии многих объектов-entity в силу их специфики известен заранее. Например,

SketchLine всегда возвращает объект LineSegment2d, а SketchLine3D — LineSegment, тогда как SketchCircle3D непременно вернет объект Circle. Объект Edge в этом отношении уникален, поскольку может иметь различную форму. Это означает, что тип возвращаемого им объекта вспомогательной геометрии зависит от геометрической формы ребра. Приведенный ниже фрагмент кода дополняет предыдущий пример уточнением типа ребра с помощью проверки его свойства CurveType, после чего печатается соответствующая геометрическая информация.

' Проверка типа геометрии и вывод ее специфических параметров

Select Case oEdge.GeometryType

Case kLineSegmentCurve

Dim oLineSegment As LineSegment

Set oLineSegment = oEdge.Geometry

Debug.Print "Начальная точка: " & PointString(oLineSegment.StartPoint) Debug.Print "Конечная точка: " & PointString(oLineSegment.EndPoint)

Case kCircleCurve

Dim oCircle As Inventor.Circle

Set oCircle = oEdge.Geometry

Debug.Print "Центр: " & PointString(oCircle.Center)

Debug.Print "Радиус: " & Format(oCircle.Radius, "0.0000")

Case kCircularArcCurve

Dim dPi As Double

dPi = Atn(1) * 4

Dim oArc As Inventor.Arc3d

Set oArc = oEdge.Geometry

Debug.Print "Центр: " & PointString(oArc.Center)

Debug.Print "Радиус: " & Format(oArc.Radius, "0.0000")

Debug.Print "Угол: " & Format(oArc.SweepAngle * (180 / dPi), "0.0000")

Case Else

Debug.Print "Геометрия выделенного объекта не поддерживается."

End Select

End Sub

Private Function PointString(PointOrVector As Object) As String

'Для заданного аргументом вектора или точки

'возвращает строку с координатами X,Y,Z

PointString = Format(PointOrVector.X, "0.0000") & "," & _

Format(PointOrVector.Y, "0.0000") & "," & _

Format(PointOrVector.Z, "0.0000")

End Function

Дополнительную информацию о кривой можно получить с помощью объекта CurveEvaluator. Этот объект вспомогательной геометрии можно извлечь из любой кривой, в том числе и из

5

ребра Edge. Подход к анализу геометрии с помощью объекта CurveEvaluator имеет общий характер и применим к любым видам геометрии.

Для извлечения пользы из объекта CurveEvaluator важно освоиться с концепцией параметрического пространства. В случае кривой это будет параметрическое пространство данной кривой. Если поставить числовую ось в соответствие кривой, любую точку на кривой можно задать всего одним числом. На рисунке ниже эта идея проиллюстрирована на примере ребра. Параметрическое пространство этой кривой имеет диапазон от 0 до 2,54. На ребре показана серия точек, положение на ребре любой из них может быть поставлено в соответствие конкретному значению параметра в параметрическом пространстве ребра.

Этот подход применим к ребрам любой формы. Ниже показано параметрические пространства рёбер в форме сплайна и окружности. Как видно из этих трех примеров, диапазон изменения параметра для разных кривых может отличаться. В первом случае параметр изменялся в диапазоне от 0 до 2,54, во втором — от –1 до 0, в третьем — от –π до

+π.

Понимание идеи параметрического пространства является критически важным для полноценного использования функционала объекта CurveEvaluator. Большинство его методов либо используют параметры как входные аргументы, либо возвращают их в качестве результата.

6

Вот список наиболее часто применяемых методов объекта CurveEvaluator.

GetParamExtents — возвращает границы диапазона изменения параметра данной кривой.

GetPointAtParam — по значению параметра определяет точку на кривой в пространстве модели.

GetParamAtPoint — вычисляет значение параметра для заданной точки на кривой.

GetLengthAtParam — вычисляет длину между точками кривой, которые соответствуют двум заданным значениям параметра. Если в качестве входных аргументов задать минимальное и максимальное значения параметра, метод вернет полную длину кривой.

GetParamAtLength — вычисляет значение параметра в точке, удаленной от другой параметрической точки на заданное расстояние вдоль кривой.

GetTangent — возвращает вектор касательной к кривой в точке, заданной параметром.

GetCurvature — вычисляет кривизну в точке, заданной параметром.

Код следующего примера иллюстрирует технику работы с параметрическим пространством кривой. Используются методы GetParamExtents и GetPointAtParam.

' Ссылка на решатель кривой

Dim oCurveEval As CurveEvaluator Set oCurveEval = oEdge.Evaluator

'Вычисление границ диапазона пространства параметров

Dim dMinParam As Double Dim dMaxParam As Double

Call oCurveEval.GetParamExtents(dMinParam, dMaxParam)

'Ссылка на вспомогательную геометрию приложения

Dim oTG As TransientGeometry

Set oTG = ThisApplication.TransientGeometry

'В 11 равноотстоящих точках на кривой вычисляет и

'печатает соответствующие им значения параметра. Dim i As Integer

For i = 0 To 10

'Значение параметра в точке i Dim currentParam As Double

currentParam = dMinParam + ((dMaxParam - dMinParam) / 10) * i

'значение параметра сохраняется в массиве, т.к. метод GetPointAtParam

'использует в качестве аргумента только массив типа Double.

Dim adParam(0) As Double adParam(0) = currentParam

'Вычисление координат в пространстве модели,

'соответствующих заданной параметрической точке

Dim adPoints(2) As Double

Call oCurveEval.GetPointAtParam(adParam, adPoints)

'печать результатов

Debug.Print "Параметр : " & Format(currentParam, "0.0000") & _

"Координаты: " & Format(adPoints(0), "0.000000") & "," & _

Format(adPoints(1), "0.000000") & "," & _

Format(adPoints(2), "0.000000")

Next i

End Sub

7

Поверхности (Surfaces)

Поверхности в Инвенторе встречаются как в твердотельных, так и в поверхностных моделях. Во многих случаях и рабочие плоскости могут рассматриваться как поверхности. Описание поверхностей во многом сходно с описанием кривых и даже в чем-то проще, поскольку поверхности существуют только в трехмерном пространстве, и единственными объектами, имеющими поверхности, являются грани (Face) и рабочие плоскости (WorkPlane).

Как и в случае кривых, вы получаете вспомогательную геометрию из объекта-entity и используете ее данные для выяснения геометрической формы родительского объекта. Объект WorkPlane в качестве своей геометрии всегда возвращает плоскость. Объекты Face в зависимости от формы грани могут возвращать геометрию в виде объектов нескольких типов. Для выяснения типа геометрии, возвращаемой свойством Face.Geometry, следует использовать свойство SurfaceType объекта Face. Ниже приведен пример определения типа выделенной грани.

Public Sub SurfaceGeometry()

'Ссылка на активный документ

Dim oPartDoc As PartDocument

Set oPartDoc = ThisApplication.ActiveDocument

'Ссылка на выделенную грань

On Error Resume Next

Dim oFace As Face

Set oFace = oPartDoc.SelectSet.Item(1)

If Err Then

MsgBox "Следует выделить грань."

Exit Sub

End If

On Error GoTo 0

' Выяснение типа геометрии грани и печать её параметров. Select Case oFace.SurfaceType

Case kPlaneSurface Dim oPlane As Plane

Set oPlane = oFace.Geometry Debug.Print "Planar face"

Debug.Print " Базовая точка : " & PointString(oPlane.RootPoint) Debug.Print " Вектор нормали: " & PointString(oPlane.Normal)

Case kCylinderSurface

Dim oCylinder As Cylinder

Set oCylinder = oFace.Geometry Debug.Print "Cylindrical face"

Debug.Print " Базовая точка: " & PointString(oCylinder.BasePoint) Debug.Print " Воктор оси : " & PointString(oCylinder.AxisVector) Debug.Print " Радиус : " & Format(oCylinder.Radius, "0.000000")

Case kSphereSurface

Dim oSphere As Sphere

8

Set oSphere = oFace.Geometry

Debug.Print "Spherical face"

Debug.Print " Центр : " & PointString(oSphere.CenterPoint)

Debug.Print " Радиус: " & Format(oSphere.Radius, "0.000000")

Case Else

Debug.Print "Этот тип геометрии не поддерживается: " & _

TypeName(oFace.Geometry)

End Select

End Sub

Важно отметить, что большинство поверхностных объектов вспомогательной геометрии границ не имеют. Например, плоскость задана только базовой точкой и вектором нормали и бесконечна в пространстве. Цилиндр задан началом координат, осью и радиусом, но длины не имеет. На рисунке справа показано цилиндрическое дело, которое вполне может существовать в Инвенторе. Вполне очевидно, что этот цилиндр отнюдь не является неограниченным по длине и более того, имеет отверстия и неровные кромки. Такое возможет в Инвенторе, поскольку рёбра в нём определяются не поверхностью цилиндра, а рёбрами грани, которые и определяют ее границы. Это справедливо для поверхностей любого типа.

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

На рисунке справа показан прямоугольный фрагмент плоскости с нанесённой координатной сеткой, иллюстрирующей параметрическое пространство поверхности, очень похожее на обычную двумерную координатную систему. Вы можете определить любую точку на плоскости, задав пару координат X и Y. В параметрическом пространстве аналогами координат X и Y являются переменные U и V.

Ниже показаны примеры поверхностей с нанесенной параметрической сеткой. Несмотря на то, что поверхности не являются плоскими, вы по-прежнему можете любую точку поверхности задать парой координат U-V.

Как и в случае кривых, поверхности также поддерживают решатели. Объект SurfaceEvaluator можно получить либо из объекта Face, либо из любого другого объекта, описывающего поверхность. В общем случае желательно использовать решатель объекта

9

Face, поскольку он учитывает дополнительную информацию, извлекаемую из модели твердого тела. Например, при вычислении вектора нормали к грани тела он всегда возвращает направление наружу. Объект SurfaceEvaluator по функциональности близок к CurveEvalutor. Вот список наиболее часто применяемых его методов и свойств.

ParamRangeRect — возвращает границы диапазона изменения параметров u-v поверхности.

GetPointAtParam — для пары значений параметров u-v возвращает в пространстве модели точку на поверхности.

GetParamAtPoint — для заданной в пространстве модели точки на поверхности возвращает пару значений u-v в пространстве параметров.

IsParamOnFace — свойство определяет, соответствует ли параметрическим координатам u-v реальная точка на поверхности грани или нет. Это особенно полезно, если в грани имеются, скажем, отверстия.

GetNormal — возвращает вектор нормали к поверхности в точке, заданной параметрическими координатами u-v.

Ниже приведен небольшой пример использования этих функций для вычисления вектора нормали к выделенной грани. Использованная в программе точка грани является центром ее параметрического пространства. Способ получения ссылки на выделенную грань был рассмотрен в предыдущем примере.

' ссылка на решатель грани.

Dim oSurfEval As SurfaceEvaluator Set oSurfEval = oFace.Evaluator

'определение диапазонов изменения параметров. Dim oParamRange As Box2d

Set oParamRange = oSurfEval.ParamRangeRect

'вычисление параметрических координат u-v в центре поверхности.

'(Этот фрагмент чуть больше, чем мог бы быть, чтобы обойти проблему в VBA.)

Dim adParamCenter(1) As Double Dim U As Double, V As Double U = oParamRange.MinPoint.X

V = oParamRange.MaxPoint.X adParamCenter(0) = (U + V) / 2

U = oParamRange.MinPoint.X V = oParamRange.MaxPoint.X

adParamCenter(1) = (U + V) / 2

'Вычисление вектора нормали в точке u-v. Dim adNormal(2) As Double

Call oSurfEval.GetNormal(adParamCenter, adNormal)

'Вывод координат вектора нормали.

Debug.Print "Нормаль: " & Format(adNormal(0), "0.000000") & "," & _

Format(adNormal(1), "0.000000") & "," & _

Format(adNormal(2), "0.000000")

'Вычисление точки в пространстве модели,

'в которой вычислен вектор нормали к грани. Dim adPoint(2) As Double

Call oSurfEval.GetPointAtParam(adParamCenter, adPoint)

'Print the coordinate.

Debug.Print "Точка начала вектора нормали: " & _ Format(adPoint(0), "0.000000") & "," & _ Format(adPoint(1), "0.000000") & "," & _ Format(adPoint(2), "0.000000")

End Sub

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]