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

Ekins_Inventor_API

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

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

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

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 может оказаться вполне уместным в случае внесения в ячейки матрицы малых изменений.

' Создание матрицы с описанием новой системы координат

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

21

Приведенная ниже отладочная процедура 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.

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

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

Dim oOcc As ComponentOccurrence

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

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

22

Изменяя матрицу компонента, можно переопределять его положение в сборке. Свойство 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

23

'Переопределение свойства 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

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

Продемонстрируем «упаковку» последовательных преобразований в одной матрице. Предположим, нам необходимо повернуть компонент на 45° вокруг оси x, затем на 30° вокруг оси y, после чего переместить его на 5 см вдоль оси x и на 3 см вдоль оси z. Как мы могли бы определить матрицу, выполняющую такое преобразование? Гораздо проще определить каждое из последовательных преобразований отдельно, а затем применить функционал матриц, чтобы вычислить итоговую матрицу комбинированного преобразования. Умножение матриц порождает новую матрицу, которая содержит преобразованиекомбинацию исходных. Порядок матриц-сомножителей имеет значение, поскольку влияет на результат. Данная операция выполняется с помощью метода TransformBy. Метод выполняет умножение матрицы-аргумента на текущую. В общем случае, вы имеете матрицу и преобразуете ее, изменяя с помощью другой матрицы. Рассмотрим, как это работает на практике при решении поставленной выше задачи.

'Число Пи

Dim dPi As Double dPi = Atn(1) * 4

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

Dim oTG As TransientGeometry

Set oTG = ThisApplication.TransientGeometry

' Создание матрицы для поворота на 45° вокруг оси x Dim oTransMatrix As Matrix

Set oTransMatrix = oTG.CreateMatrix

Call oTransMatrix.SetToRotation(dPi / 4, _

24

oTG.CreateVector(1, 0, 0), _ oTG.CreatePoint(0, 0, 0))

' Создание матрицы для поворота на 30° вокруг оси y. Dim oTempMatrix As Matrix

Set oTempMatrix = oTG.CreateMatrix

Call oTempMatrix.SetToRotation(dPi / 6, _ oTG.CreateVector(0, 1, 0), _ oTG.CreatePoint(0, 0, 0))

'Изменение матрицы oTransMatrix матрицей oTempMatrix Call oTransMatrix.TransformBy(oTempMatrix)

'Создание матрицы перемещения на 5 см по x и 3 см по z. oTempMatrix.SetToIdentity

Call oTempMatrix.SetTranslation(oTG.CreateVector(5, 0, 3))

'Применение трансляционного преобразования

Call oTransMatrix.TransformBy(oTempMatrix)

' Цикл по компонентам сборки

Dim oOcc As ComponentOccurrence

For Each oOcc In oAsmDoc.ComponentDefinition.Occurrences

'Получение копии ориентационной матрицы очередного компонента

Dim oMatrix As Matrix

Set oMatrix = oOcc.Transformation

'модифицирование матрицы-копии

Call oMatrix.TransformBy(oTransMatrix)

' Переопределение ориентационной матрицы компонента измененной копией. oOcc.Transformation = oMatrix

Next

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

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)

'Получим матрицу компонента. Она описывает его

'положение в системе координат сборки.

25

'Эта матрица определяет и преобразование из системы

'координат детали в систему координат сборки

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 поддерживает матрицы, которые определяют преобразования

из пространства детали в пространство сборки,

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

из пространства модели в пространство листа,

из пространства вида в пространство модели,

из пространства листа в пространство модели,

из пространства вида в пространство листа,

из пространства листа в пространство вида,

из пространства эскиза в пространство модели,

из пространства модели в пространство эскиза.

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

26

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