Вспомогательная геометрия Inventor API

Автор: | 03.02.2018

Введение
Точки
Кривые
Поверхности
Вектора
Матрицы
Матрицы системы координат
Матрица преобразования

Введение

Вспомогательная геометрия предназначена для решения через API комплекса математических задач, преимущественно геометрических. Объекты вспомогательной геометрии создаются посредством вызовов соответствующих методов объекта TransientGeometry и чрезвычайно широко используются в Inventor API. В отличие от большинства других геометрических объектов API, объекты вспомогательной геометрии не имеют средств визуального отображения. Чаще всего, это абстрактные математические объекты-посредники, предназначенные для управления объектами «реальной» геометрии Autodesk Inventor. Например, математические 2D и 3D точки TransientGeometry используются для создания и манипуляции рабочими и эскизными точками, построения матриц преобразований и т.п..

Слово «transient» (временный) подчеркивает короткоживущий характер этих объектов. Срок их жизни ограничен одним сеансом работы Инвентора, и в файлах они не сохраняются.

В Inventor API в составе TransientGeometry разработчиками предусмотрены три группы объектов: геометрические (Geometry), математические (Math) и вспомогательные (Utility).

Объекты вспомогательной геометрии представляют собой математические абстракции реальных геометрических объектов и лишены многих их свойств. Например, объект Line, в отличие, скажем, от эскизной линии SketchLine, имеет бесконечную длину. Line имеет выделенное направление Direction, заданное единичным вектором типа UnitVector.

Аналогично и объект Plane отличается от плоской грани отсутствием пространственных границ. В отличие от геометрической плоскости, известной нам из школьного курса математики, объект Plane имеет выделенное направление – это направление вектора нормали к плоскости, заданное единичным вектором типа UnitVector. Именно это обстоятельство позволяет отличать одну сторону плоскости от другой.

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

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

Созданные объекты вспомогательной геометрии можно модифицировать. Например, можно передвинуть начальную и конечную точки, однако это не приведет к изменениям в родительской геометрии объекта-entity, т.к. связь между ним разрывается с момента рождения объекта вспомогательной геометрии.

Объект TransientGeometry, доступ к которому обеспечивает одноименное свойство объекта Application, позволяет также создавать объекты вспомогательной геометрии и непосредственно – без привлечения родительских объектов-entity. Например, метод CreateLineSegment служит для создания объекта LineSegment на базе начальной и конечной точек.

С точки зрения конечного пользователя в Inventor ровным счетом ничего не происходит. Вы не увидите в графическом окне новой линии. Если вы сохраните текущий документ, этот линейный сегмент сохранен не будет. То, что вы создали, является лишь абстрактным геометрическим описанием линейного сегмента, но не «настоящей» линией-entity.

Точки

В Inventor имеются несколько объектов-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 гораздо более удобным в работе, нежели массив из трех координат.

Объект Point описывает трехмерную математическую точку в декартовом пространстве на основе списка из трех ее координат X, Y и Z. Его двумерный аналог – объект Point2d, который представляет собой математическую точку с координатами X и Y на плоскости. Оба объекта обеспечивают доступ к координатам и поддерживают ряд методов для проверки эквивалентности и геометрических преобразований.

Точки Point2d широко применяются при работе с двумерными эскизами. Чтобы создать в эскизе точку SketchPoint, используется метод Add коллекции эскизных точек SketchPoints. Методу Add требуется знать положение, в котором следует создавать эскизную точку SketchPoint. Но эта точка может быть результатом произвольной последовательности преобразований и перемещений, или может быть точкой другого объекта. По этой причине метод Add опирается на объект Point2d.

Dim oApp As Inventor.Application
Set oApp = ThisApplication
Dim oPartDoc As PartDocument
Set oPartDoc = oApp.Documents.Add(kPartDocumentObject,oApp.GetTemplateFile(kPartDocumentObject))
' Создаем эскиз в плоскости XY
Dim oSketch As PlanarSketch
Set oSketch = oPartDoc.ComponentDefinition.Sketches.Add(oPartDoc.ComponentDefinition.WorkPlanes.Item(3))
Dim oTG As TransientGeometry
Set oTG = oApp.TransientGeometry
Dim oSkPnts As SketchPoints
Set oSkPnts = oSketch.SketchPoints
Call oSkPnts.Add(oTG.CreatePoint2d(30, 20), False)

Приведенный фрагмент программы создает эскиз с единственной эскизной точкой с координатами X=30, Y=20. Последний аргумент метода Add является логическим значением, которое определяет, является ли создаваемая эскизная точка центром отверстия. Но это влияет лишь на ее графическое отображение.

Эскизные точки в коллекции SketchPoints всегда двумерные, имеют тип SketchPoint. Методу Add для их создания требуется предоставить объект Point2d, для чего обычно применяется метод CreatePoint2D.

Трехмерные эскизные точки типа SketchPoint3D хранятся в другой коллекции – SketchPoints3Ds.

Кривые

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

Ниже программный код определяет геометрию выделенного пользователем ребра.

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, а SketchLine3DLineSegment, тогда как SketchCircle3D обязательно вернет объект Circle.

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

Public Sub CurveGeometry()
' Ссылка на активный документ
' Проверка типа геометрии и вывод ее специфических параметров
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. Этот объект вспомогательной геометрии можно извлечь из любой кривой, в том числе и из ребра Edge. Подход к анализу геометрии с помощью объекта CurveEvaluator имеет общий характер и применим к любым видам геометрии. Для извлечения пользы из объекта CurveEvaluator важно понять концепцию параметрического пространства.

В случае кривой это будет однопараметрическое пространство. Если поставить числовую ось в соответствие кривой, любую точку на кривой можно задать всего одним числом. На рисунках показаны параметрические пространства рёбер в форме сплайна и окружности.

Как видно из этих примеров, диапазон изменения параметра для разных кривых может отличаться. В первом случае параметр изменялся от -1 до 0, во втором – от -π до +π .

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

Вот список наиболее часто применяемых методов объекта 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

Поверхности

Поверхности в Inventor встречаются как в твердотельных, так и в поверхностных моделях. Во многих случаях и рабочие плоскости могут рассматриваться как поверхности. Описание поверхностей во многом сходно с описанием кривых и даже в чем-то проще, поскольку поверхности существуют только в трехмерном пространстве, и единственными объектами, имеющими поверхности, являются грани (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
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.

Как и в случае кривых, поверхности также поддерживают Evaluators (оценщики, вычислители). Объект SurfaceEvaluator можно получить либо из объекта Face, либо из любого другого объекта, описывающего поверхность. В общем случае желательно использовать Evaluator объекта 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 в центре поверхности.
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

Вектора

Вектор предоставляет удобный способ задания направления и величины. 3D-вектор имеет три компоненты (X,Y,Z), а 2D-вектор – только две (X,Y). Несмотря на простоту, объект Vector поддерживает богатый набор методов и свойств, которые облегчают векторные операции.

Рассмотрим пару примеров с векторами. Весьма распространенным применением векторов является задание направления и величины перемещения объектов. Операция перемещения (трансляция) объекта в пространстве не предполагает вращения объекта. Например, вектор (3,1,0) определяет перемещение объекта на 3 единицы вдоль оси X, на 1 единицу вдоль оси Y и 0 единиц вдоль оси Z, что приводит к смещению объекта на расстояние 3.162 единиц, как показано на рисунке.

 

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

Примером, когда векторы используются для задания направлений, является получение от некоторых объектов вспомогательной геометрии данных об ориентации. Например, объект Cylinder (Цилиндр) поддерживает свойство AxisVector (вектор оси), которое возвращает единичный вектор типа UnitVector. Он описывает направление в пространстве оси цилиндра.

Функционал объекта Vector определяется набором его методов и свойств. Рассмотрим наиболее употребительные из них. При определении прямоугольной системы координат вы обычно имеете точку, которая станет началом системы координат (Origin), и три вектора, которые задают направления осей X, Y и Z. Ими могут быть и единичные векторы, поскольку их длины значения не имеют. Чтобы система координат была действительно прямоугольной, векторы должны удовлетворять следующим условиям:

  • Направление оси Y должно быть перпендикулярно направлению оси X.
  • Направление оси Z должно быть перпендикулярно направлениям осей X и Y, а также удовлетворять правилу правой руки, т.к. в Инвенторе используются только правые системы координат.

Рассмотрим на конкретном примере простой метод создания трех векторов, одновременно удовлетворяющих перечисленным условиям. Предположим, требуется задать координатную систему, в которой ось x направлена вдоль направления (3,7,6), ось y должна быть направлена вверх, это будет её положительное направление. И наконец, ось Z должна быть корректно сориентирована относительно осей X и Y.

Для векторов определена операция, называемая векторным произведением, которая по двум неколлинеарным векторам позволяет вычислить третий вектор. Любые два непараллельных вектора задают плоскость. Если вы совместите начала двух таких векторов, они будут лежать в одной плоскости. Результатом векторного произведения этих векторов является третий вектор, перпендикулярный этой плоскости. Направление вектора Z зависит от последовательности векторов x и y в операции векторного произведения. Вектор Z, показанный на рисунке, является результатом векторного произведения вектора X на вектор Y и удовлетворяет правилу правой руки. Направьте указательный палец правой руки вдоль оси X, а средний палец влево вдоль оси Y, тогда направленный вверх большой палец правой руки укажет положительное направление вектора Z. Если в векторном произведении векторы X и Y поменять местами, то направление результирующего вектора Z изменится на противоположное.

Посмотрим, как с помощью векторного произведения можно построить описанную в задаче систему координат. Сначала пошагово опишем алгоритм, а затем рассмотрим его программную реализацию:

  1. Создать вектор в известном направлении оси X, (3,7,6).
  2. Создать вектор, который определяет ось y, направление (0,1,0). Это не точное направление оси Y, а лишь его грубое приближение.
  3. Вычислить вектор Z как векторное произведение вектора X на вектор Y. Полученное направление является точным (это направление нормали к плоскости, в которой лежат векторы x и y).
  4. Вычислить вектор Y как векторное произведение вектора Z на вектор X. Полученное направление вектора y является точным.
Public Sub CreateCoordSystem()
' Ссылка на вспомогательную геометрию.
Dim oTG As TransientGeometry
Set oTG = ThisApplication.TransientGeometry
' создание вектора для оси x.
Dim oXAxis As UnitVector
Set oXAxis = oTG.CreateUnitVector(3, 7, 6)
' создание первого приближения для вектора в направлении оси y.
Dim oYAxis As UnitVector
Set oYAxis = oTG.CreateUnitVector(0, 1, 0)
' Вычисление вектора z как векторного произведения x на y.
Dim oZAxis As UnitVector
Set oZAxis = oXAxis.CrossProduct(oYAxis)
' Создание вектора y как векторного произведения z на x.
Set oYAxis = oZAxis.CrossProduct(oXAxis)
' Вывод результатов
Debug.Print "Ось x: " & oXAxis.X & ", " & oXAxis.Y & ", " & oXAxis.Z
Debug.Print "Ось y: " & oYAxis.X & ", " & oYAxis.Y & ", " & oYAxis.Z
Debug.Print "Ось z: " & oZAxis.X & ", " & oZAxis.Y & ", " & oZAxis.Z
End Sub

Матрицы

Матрицы очень широко применяются в задачах точного позиционирования и изменения ориентация компонентов в сборках Inventor.

Матрица представляет собой двумерный массив чисел. Для трехмерного пространства Inventor поддерживает объект Matrix, для двумерных пространств предусмотрен объект Matrix2d. Объект Matrix представляет собой матрицу размерностью 4×4 (4 строки и 4 столбца). Объект Matrix2d представляет собой матрицу размерностью 3×3. Ниже показана типичная 3D-матрица 4×4.

Объект Matrix инкапсулирует в себе 16 значений и выглядит довольно просто. Тем не менее, из всей вспомогательной геометрии именно матрицы оказываются наименее очевидными объектами, освоение которых обычно требует некоторых усилий. Более подробно о использовании матриц в геометрическом моделировании см. ссылку.

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

Матрицы системы координат

Рассмотрим, из чего состоит система координат, и каким образом матрица обеспечивает требуемую информацию. Координатная система описывает положение и ориентацию в пространстве. В трехмерном пространстве начало координат есть трехмерная координатная точка (X,Y,Z), заданная в пространстве модели. Она задает положение системы координат. Ориентация системы координат описывается направлениями главных осей X, Y и Z.

В ортогональных системах координат, которые всегда используются Inventor, действует ряд упомянутых выше жёстких правил, а именно, оси X, Y и Z являются взаимно перпендикулярными, а направление оси Z удовлетворяет правилу правой руки. Все три вектора направлений являются единичными.

Рисунок показывает, каким образом матрица хранит геометрическую информацию о системе координат.

 

Во-первых, при использовании матрицы вы можете игнорировать нижнюю строку. В ней всегда хранятся одни и те же значения 0, 0, 0, 1 (см. ссылку). Остальные 12 значений определяют координатную систему. Первый столбец описывает компоненты направления оси X(1,0,0). Второй столбец задает направление оси Y(0,1,0), третий – оси Z (0,0,1). Последний столбец определяет положение начала системы координат (0,0,0). Показанная матрица называется единичной. Начало координат и направления единичных векторов совпадают с базовой системой координат. Такая матрица не описывает ни перемещения, ни вращения.

Как будет выглядеть матрица для задания системы координат с началом в точке (10,5,0) и повёрнутой на 45° вокруг оси Z показано на рисунке.

Рассмотрим сначала ось X. Если новая система координат повернута на 45° вокруг оси z, значит и ось x повернута относительно базовой оси X на 45° в положительном направлении отсчета углов. Таким образом, ось X направлена в направлении вектора (1, 1, 0), но поскольку вектор системы координат должен быть единичным, то результат должен выглядеть так (0.707, 0.707, 0). Соответственно, ось Y имеет отрицательную компоненту по X и положительную по Y и будет выглядеть следующим образом (-0.707, 0.707, 0). Ось Z направления не меняет (0, 0, 1). Наконец, в четвертом столбце вписываются координаты точки начала системы координат (10, 5, 0).

Приведенный ниже фрагмент кода демонстрирует технику применения средств API для формирования описанной матрицы. Во-первых, для задания осевых векторов применяются объекты UnitVector. Это гарантирует, что все векторы, как и требуется, будут единичными. Во-вторых, для задания матрицы используется метод SetCoordinateSystem объекта Matrix, что упрощает заполнение матрицы значениями.

При задании координатной системы не следует забывать, что все геометрические величины задаются во внутренних единицах Inventor, в частности, длина всегда задается в сантиметрах.

Public Sub MatrixDefineSample()
' ссылка на вспомогательную геометрию и создание переменной для числа Pi
Dim oTG As TransientGeometry
Set oTG = ThisApplication.TransientGeometry
Dim dPi As Double
dPi = Atn(1) * 4
' Точка начала координат
Dim oOrigin As Point
Set oOrigin = oTG.CreatePoint(10, 5, 0)
' Задание осевых векторов
Dim oXAxis As UnitVector
Dim oYAxis As UnitVector
Dim oZAxis As UnitVector
Set oXAxis = oTG.CreateUnitVector(Cos(dPi / 4), Sin(dPi / 4), 0)
Set oYAxis = oTG.CreateUnitVector(-Cos(dPi / 4), Sin(dPi / 4), 0)
Set oZAxis = oTG.CreateUnitVector(0, 0, 1)
' Создание матрицы с описанием новой системы координат
Dim oMatrix As Matrix
Set oMatrix = oTG.CreateMatrix
Call oMatrix.SetCoordinateSystem( _
oOrigin, oXAxis.AsVector, oYAxis.AsVector, oZAxis.AsVector)
End Sub

Вместо использования метода SetCoordinateSystem вы можете сформировать матрицу поэлементно. Доступ к ячейкам матрицы на чтение и запись обеспечивает свойство Matrix.Cell. Приведенный ниже фрагмент кода поэлементно формирует ту же самую матрицу, что и предыдущая программа с помощью метода SetCoordinateSystem. Легко видеть, что вариант с SetCoordinateSystem проще. Тем не менее, применение Matrix.Cell может оказаться вполне уместным в случае внесения в ячейки матрицы малых изменений.

Public Sub MatrixDefineSample()
' Создание матрицы с описанием новой системы координат
Dim oMatrix As Matrix
Set oMatrix = oTG.CreateMatrix
oMatrix.Cell(1, 1) = oXAxis.X
oMatrix.Cell(2, 1) = oXAxis.Y
oMatrix.Cell(3, 1) = oXAxis.Z
oMatrix.Cell(1, 2) = oYAxis.X
oMatrix.Cell(2, 2) = oYAxis.Y
oMatrix.Cell(3, 2) = oYAxis.Z
oMatrix.Cell(1, 3) = oZAxis.X
oMatrix.Cell(2, 3) = oZAxis.Y
oMatrix.Cell(3, 3) = oZAxis.Z
oMatrix.Cell(1, 4) = oOrigin.X
oMatrix.Cell(2, 4) = oOrigin.Y
oMatrix.Cell(3, 4) = oOrigin.Z

Приведенная ниже отладочная процедура DumpMatrix также весьма полезна при работе с матрицами. Она выводит в отформатированном виде содержимое матрицы.

Public Sub DumpMatrix(oMatrix As Matrix)
Dim i As Integer
For i = 1 To 4
Debug.Print Format(oMatrix.Cell(i, 1), "0.000000") & ", " & _
Format(oMatrix.Cell(i, 2), "0.000000") & ", " & _
Format(oMatrix.Cell(i, 3), "0.000000") & ", " & _
Format(oMatrix.Cell(i, 4), "0.000000")
Next
End Sub

Для матрицы в этом примере DumpMatrix выведет следующие результаты:

0.707107, -0.707107, 0.000000, 10.000000

0.707107,  0.707107, 0.000000,  5.000000

0.000000,  0.000000, 1.000000,  0.000000

0.000000,  0.000000, 0.000000,  1.000000

Чаще всего матрицы применяются при работе с компонентами сборок, а именно, матрицы используются для задания положения и ориентации вставляемых в сборку компонентов. Рассмотрим конкретный пример, используя деталь, показанную на следующем рисунке.

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

Если вы откроете новую сборку и вручную вставите в сборку экземпляр такой детали, то увидите, что компонент оказался в начале координат сборки, а ориентация системы координат компонента будет эквивалентна ориентации системы координат сборки. Дело в том, что для позиционирования первого компонента Inventor использует единичную матрицу. Если мы добавим к предыдущей программе следующий фрагмент кода, деталь будет вставлена в точке (10,5,0) и повернута вокруг оси Z на 45°.

‘ вставка компонента в активную сборку с помощью заданной матрицы

Dim oOcc As ComponentOccurrence
Set oOcc = ThisApplication.ActiveDocument.ComponentDefinition. _
Occurrences.Add("C:\Temp\Arrow.ipt", oMatrix)

В результате будет получена сборка, в которой компонент справа вверху был вставлен средствами API.

 

Изменяя матрицу компонента, можно переопределять его положение в сборке. Свойство Transformation объекта ComponentOccurrence обеспечивает доступ к матрице на чтение и запись. Ниже приведены несколько примеров изменения положения компонента.

Public Sub ModifyOccurrence()
' Ссылка на активную сборку
Dim oAsmDoc As AssemblyDocument
Set oAsmDoc = ThisApplication.ActiveDocument
' Ссылка на существующий компонент "Arrow:1"
Dim oOcc As ComponentOccurrence
Set oOcc = oAsmDoc.ComponentDefinition.Occurrences.ItemByName("Arrow:1")
Dim oTG As TransientGeometry
Set oTG = ThisApplication.TransientGeometry
' перемещение в точку (3,2,1).
Dim oMatrix As Matrix
Set oMatrix = oOcc.Transformation
Call oMatrix.SetTranslation(oTG.CreateVector(3, 2, 1))
oOcc.Transformation = oMatrix
' Смещение компонента на 5 см вдоль оси X
' непосредственным редактированием его матрицы
Set oMatrix = oOcc.Transformation
oMatrix.Cell(1, 4) = oMatrix.Cell(1, 4) + 5
oOcc.Transformation = oMatrix
End Sub


Следует обратить внимание на один немаловажный момент – редактировать следует объект Matrix, полученный перед этим с помощью свойства Transformation этого компонента. Измененная матрица возвращается компоненту с помощью того же свойства Transformation. Напрямую редактировать матрицу компонента нельзя. Всегда следует создать её копию, копию изменить и затем вернуть её компоненту.

Матрица преобразования

Другой вариант интерпретации матриц – матрица задает изменение положения и ориентации. Этот подход концептуально иной, нежели использование матриц для задания систем координат, поскольку задается не абсолютное положение, а изменение положения. Чтобы это сделать, вы создаете матрицу, которая определяет желаемое изменение, а затем применяете его к другой матрице.

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

' Последовательный перебор компонентов сборки
Dim oOcc As ComponentOccurrence
For Each oOcc In oAsmDoc.ComponentDefinition.Occurrences
' Получение матрицы текущего компонента
Dim oMatrix As Matrix
Set oMatrix = oOcc.Transformation
' Изменение ячейки матрицы, которая отвечает за положение
' начала системы координат компонента относительно оси X
oMatrix.Cell(1, 4) = oMatrix.Cell(1, 4) + 5
' Переопределение свойства Transformation
' компонента с помощью изменённой матрицы.
oOcc.Transformation = oMatrix
Next

Второе решение той же задачи основано на преобразовании текущей ориентационной матрицы компонента.

' Создание матрицы, которая описывает преобразование.
Dim oTransMatrix As Matrix
Set oTransMatrix = ThisApplication.TransientGeometry. _
CreateMatrix oTransMatrix.Cell(1, 4) = 5
' Последовательный перебор компонентов сборки
Dim oOcc As ComponentOccurrence
For Each oOcc In oAsmDoc.ComponentDefinition.Occurrences
' получение матрицы текущего компонента
Dim oMatrix As Matrix
Set oMatrix = oOcc.Transformation
' Применение матрицы преобразования oTransMatrix
Call oMatrix.TransformBy(oTransMatrix)
' Переопределение свойства Transformation
' компонента с помощью изменённой матрицы.
oOcc.Transformation = oMatrix
Next

Этот пример не слишком отличается от предыдущего, за исключением процедуры формирования матрицы комбинированного преобразования последовательностью матричных операций. Чтобы облегчить нашу задачу, использованы и некоторые другие функции объекта Matrix. Например, для описания вращения применён метод SetToRotation, а для превращения матрицы в единичную – метод SetToIdentity.

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

Public Sub ModelPointInAssembly()
Dim oAsmDoc As AssemblyDocument
Set oAsmDoc = ThisApplication.ActiveDocument
' Получим ссылку на компонент сборки.
' Здесь мы просто выберем первый по списку.
' Чтобы результат был интереснее, компонент будет
' смещён и повёрнут относительно исходного положения.
Dim oOcc As ComponentOccurrence
Set oOcc = oAsmDoc.ComponentDefinition.Occurrences.Item(1)
' Создадим координатную точку с координатами (0,0,0)
' Она будет представлять начало системы координат детали.
Dim oPartOrigin As Point
Set oPartOrigin = ThisApplication.TransientGeometry.CreatePoint(0, 0, 0)
' Получим матрицу компонента. Она описывает его
' положение в системе координат сборки.
' Эта матрица определяет и преобразование из системы
' координат детали в систему координат сборки
Dim oTransMatrix As Matrix
Set oTransMatrix = oOcc.Transformation
' Применим преобразование к точке oPartOrigin.
' Это преобразует её к системе координат сборки.
Call oPartOrigin.TransformBy(oTransMatrix)
' Создадим видимую фиксированную рабочую точку
' чтобы увидеть новое положение начала координат детали
Call oAsmDoc.ComponentDefinition.WorkPoints.AddFixed(oPartOrigin)
End Sub

Свойство ComponentOccurrence.Transformation описывает матрицу преобразования из системы координат детали в систему координат сборки. Возможна и обратная операция, если вы имеете точку в пространстве сборки и хотите узнать ее координаты в пространстве детали. Объект Matrix поддерживает метод Invert. Метод преобразует матрицу для выполнения обратного преобразования. Инвертирование матрицы, возвращаемой объектом ComponentOccurrence, определяет преобразование из пространства сборки в систему координат детали.

Inventor API поддерживает матрицы, которые определяют преобразования:

  • из пространства детали в пространство сборки;
  • из пространства модели (детали или сборки) в пространство вида чертежа;
  • из пространства модели в пространство листа;
  • из пространства вида в пространство модели;
  • из пространства листа в пространство модели;
  • из пространства вида в пространство листа;
  • из пространства листа в пространство вида;
  • из пространства эскиза в пространство модели;
  • из пространства модели в пространство эскиза.

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

Автор: Николай Свирневский

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *