Inventor API сборка на VBA

Автор: | 05.02.2018

Введение
Простейший пример создания сборки
Прокси-объекты
Обход дерева сборки
Контрольные задания
Ограничения между элементами сборки
Тексты программ:

Процедура Axle()
Процедура Wheel()
Процедура Body()
Процедура WheelAssembly()
Процедура CarAssembly()

Введение

Сборка — соединение компонентов (деталей и подсборок). Например, сборка «Автомобиль» представляет соединение детали «Корпус» и 2-х подсборок «Колесная пара».

В свою очередь сборка «Колесная пара» представляет соединение детали «Ось» с 2-я деталями «Колесо»

.

Детали и сборки в Inventor выполняются в различных документах — детали (файл .ipt) и сборки (файл .iam).
В документе сборки определяют, какие компоненты входят в сборку и как они между собой соединяются. Для определения соединений необходимо указывать геометрию деталей — границы, ребра и точки. Но геометрия определена в документе детали, а в сборках используют только ссылки на входящие в нее компоненты (детали и подсборки). Причем, ссылка на деталь «Колесо» (файл Wheel.ipt) или подсборку «Колесная пара» (файл WheelAssembly.iam) одна, а в рассматриваемых сборках их по паре. Как решаются эти проблемы?
В сборке реальны только ссылки на компоненты высшего уровня. Для сборки «Автомобиль» — это деталь «Корпус» и 2 подсборки «Колесная пара». Для сборки «Колесная пара» — это деталь «Ось» и 2 детали «Колесо».
От ссылок на компоненты высшего уровня через средства API можно просматривать иерархию сборки, получая доступ к к компонентам и их геометрии. При этом, несмотря на то, что ссылка на файл детали (или подсборки) может быть одна, вхождений (компонентов) по этой ссылке в сборке может быть несколько.
Например, по одной ссылке на колесо (файл Wheel.ipt) обеспечиваются 2-а компонента (вхождения) в сборку «Колесная пара». При этом каждое вхождение получает собственное имя, по которому можно получить доступ к геометрии конкретного колеса. То есть, обращаясь к одной и той же поверхности детали через различные компоненты, мы получаем в контексте сборки 2-е разные поверхности. Геометрия детали (поверхности) используется для создания соединения компонентов.

Как видим, все объекты, кроме компонентов высшего уровня, в контексте сборки есть виртуальными. Они называются Proxy-объектами.

Простейший пример создания сборки

В программном коде (см.ниже) предполагается, что файл детали (цилиндр, полученный выдавливанием окружности) с именем cylinder.ipt создан и находится в папке C:\Temp.

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

Public Sub Assembly()
Dim oApp As Inventor.Application
Set oApp = ThisApplication
Dim oAssyDoc As AssemblyDocument
Set oAssyDoc = oApp.Documents.Add(kAssemblyDocumentObject, _
oApp.GetTemplateFile(kAssemblyDocumentObject))
Dim oPositionMatrix As Matrix
Set oPositionMatrix = oApp.TransientGeometry.CreateMatrix
Dim sFileName As String
sFileName = "c:\temp\Cylinder.ipt"
Dim oCylinder1 As ComponentOccurrence
Set oCylinder1 = oAssyDoc.ComponentDefinition.Occurrences.Add(sFileName, _
oPositionMatrix)
Dim oTrans As Vector
Set oTrans = oApp.TransientGeometry.CreateVector(1, 0, 0)
oPositionMatrix.SetTranslation oTrans
Dim oCylinder2 As ComponentOccurrence
Set oCylinder2 = oAssyDoc.ComponentDefinition.Occurrences.AddByComponentDefinition _
(oCylinder1.Definition,oPositionMatrix)
Dim oAxisDef As AssemblyComponentDefinition
Set oAxisDef = oApp.ActiveDocument.ComponentDefinition
Dim oCylAxis1 As Face
Dim oCylAxis2 As Face
Dim oFace As Face
For Each oFace In oCylinder1.SurfaceBodies(1).Faces
If oFace.SurfaceType = kCylinderSurface Then
Set oCylAxis1 = oFace
End If
Next
For Each oFace In oCylinder2.SurfaceBodies(1).Faces
If oFace.SurfaceType = kCylinderSurface Then
Set oCylAxis2 = oFace
End If
Next
Dim oConstr As AssemblyConstraint
Set oConstr = oAxisDef.Constraints.AddMateConstraint(oCylAxis1, oCylAxis2, 0, _
kInferredLine, kInferredLine)
Dim oCylFace1 As Face
Dim oCylFace2 As Face
For Each oFace In oCylinder1.SurfaceBodies(1).Faces
If oFace.SurfaceType = kPlaneSurface Then
Set oCylFace1 = oFace
End If
Next
For Each oFace In oCylinder2.SurfaceBodies(1).Faces
If oFace.SurfaceType = kPlaneSurface Then
Set oCylFace2 = oFace
End If
Next
Set oConstr = oAxisDef.Constraints.AddMateConstraint(oCylFace1, oCylFace2, 0, _
kNoInference, kNoInference)
End Sub

В программе соединяются 2-а компонента (вхождения), которые ссылаются на одну деталь.  Через имя каждого из компонентов можно обратиться к геометрии детали используя  технологию B-Rep. При этом, в контексте сборки  они представляют как бы разные  детали, которые лишь имеют одинаковую геометрию. Т.е., обращаясь к одной и той же поверхности детали через разные компоненты, мы получаем в контексте сборки 2-е разные поверхности. Геометрия детали (поверхности) используется для создания соединения компонентов.

Все в приложении реализуется в соответствии с фрагментом объектной модели.

Вначале создается новый документ сборки (assembly).  Через методы Add и AddByComponentDefinition коллекции ComponentOccurrences создаются  два компонента (oCylinder1 и oCylinder2) по ссылке на одну деталь («c:\temp\cylinder.ipt» ). При этом используется объект matrix для определения положения компонентов сборке. Положение компонента oCylinder1 принимается по умолчанию в точке (0,0,0), положение компонента oCylinder2 определяется вектором переноса в точку (1, 0, 0).

Между компонентами устанавливаются 2 ограничения (Constraint) через метод AddMateConstraint коллекции  Constraints – по осям цилиндров (oCylAxis) и плоским граням (oCylFace). Эти грани в контексте сборки есть виртуальные (Proxy-объекты).

Поиск соответствующего типа поверхности (kCylinderSurface или kPlaneSurface) определяется итерацией коллекции поверхностей (SurfaceBodies).

Прокси-объекты

Прокси-объекты (Proxy) представляют виртуальные объекты в сборке так, как если бы эти объекты на самом деле существовали в сборке. К ним относятся все объекты, кроме входящих компонентов высшего уровня иерархии.

В предыдущем примере программы  реальными объектами в сборке были 2 компонента (oCylinder1 и oCylinder2). Поверхности (oCylAxis и oCylFace), полученные из них через технологию B-Rep имеют статус proxy-объектов.

Некоторые  данные, полученные подобным образом, нужно «явно преобразовывать» в прокси-объекты для работы с ними в  контексте сборки. Здесь понятие «явное преобразование» аналогично явному преобразованию типа переменных.

Ниже приводится упрощенный пример предыдущей программы. Соединяются 2-а компонента цилиндра по рабочим плоскостям (WorkPlane). Метод AddMateConstraint в качестве входных параметров использует объекты  класса WorkPlaneProxy, явно преобразованные из объектов класса WorkPlane. Явное преобразование реализуется методом CreateGeometryProxy объекта класса ComponentOccurrence.

Public Sub Assembly()
 Dim oApp As Inventor.Application
 Set oApp = ThisApplication
 Dim oAssyDoc As AssemblyDocument
 Set oAssyDoc = oApp.Documents.Add(kAssemblyDocumentObject, _
 oApp.GetTemplateFile(kAssemblyDocumentObject))
 Dim oPositionMatrix As Matrix
 Set oPositionMatrix = oApp.TransientGeometry.CreateMatrix
 Dim sFileName As String
 sFileName = "c:\temp\cylinder.ipt"
 Dim oCylinder1 As ComponentOccurrence
 Set oCylinder1 = oAssyDoc.ComponentDefinition.Occurrences.Add (sFileName, oPositionMatrix)
 Dim oCylinder2 As ComponentOccurrence
 Set oCylinder2 = oAssyDoc.ComponentDefinition.Occurrences. _
 AddByComponentDefinition (oCylinder1.Definition, oPositionMatrix)
 Dim oPartPlane1 As WorkPlane
 Set oPartPlane1 = oCylinder1.Definition.WorkPlanes.Item(3)
 Dim oPartPlane2 As WorkPlane
 Set oPartPlane2 = oCylinder2.Definition.WorkPlanes.Item(3)
 Dim oAsmPlane1 As WorkPlaneProxy
 Call oCylinder1.CreateGeometryProxy(oPartPlane1, oAsmPlane1)
 Dim oAsmPlane2 As WorkPlaneProxy
 Call oCylinder2.CreateGeometryProxy(oPartPlane2, oAsmPlane2)
 ' Create the constraint using the work plane proxies.
 Call oAssyDoc.ComponentDefinition.Constraints.AddMateConstraint _
(oAsmPlane1, oAsmPlane2, 0)
 End Sub

Если использовать как параметр в методе Constraints.AddMateConstraint объект oPartPlane1 (вместо объекта oAsmPlane1), то появляется сообщение об ошибке.

Заметьте, что не все виртуальные объекты перед их использованием необходимо преобразовывать методом CreateGeometryProxy. Так, например, для соединения компонентов в предыдущей программе использовались поверхности для соединения компонентов сборки без явного их преобразования, поскольку они являются составной частью объекта 1-го уровня вхождения.

Классы для прокси-объектов наследуются из соответствующих им классов для реальных объектов. По этой причине они поддерживают все методы и свойства родителей. Кроме этого у них есть свойство, которого у родителей нет – NativeObject.

Свойство NativeObject возвращает реальный объект, представляемый прокси-объектом. Например, свойство NativeObject объекта EdgeProxy вернет действительный объект Edge (Ребро).

Одним из общих свойств действительных объектов и их прокси есть свойство Parent (родитель). Но хотя свойство общее, возвращаемая ссылка указывает на разных родителей. Например, свойство Parent настоящей грани вернет объект SurfaceBody реального тела, тогда как свойство Parent прокси-объекта FaceProxy вернет объект SurfaceBodyProxy, представляющий тело в контексте сборки.

Ниже приведена программа, которая в сборке из 2-х компонентов по ссылке на одну деталь (цилиндр)  обеспечивает подсветку компонентов и  прокси-объектов  на различных уровнях вложения. В случае указания через прокси-объект свойства  NativeObject подсвечиваются соответствующие объекты обоих компонентов, поскольку они оба ссылаются на одну деталь.

Private hs As HighlightSet
 Public Sub Assembly()
 Dim oApp As Inventor.Application
 Set oApp = ThisApplication
Dim oAssyDoc As AssemblyDocument
 Set oAssyDoc = oApp.Documents.Add(kAssemblyDocumentObject, _
 oApp.GetTemplateFile(kAssemblyDocumentObject))
Dim oPositionMatrix As Matrix
 Set oPositionMatrix = oApp.TransientGeometry.CreateMatrix
 Dim sFileName As String
 sFileName = "c:\temp\cylinder.ipt"
Dim oCylinder1 As ComponentOccurrence
 Set oCylinder1 = oAssyDoc.ComponentDefinition.Occurrences.Add _
 (sFileName, oPositionMatrix)
Dim oTrans As Vector
 Set oTrans = oApp.TransientGeometry.CreateVector(1, 0, 0)
 oPositionMatrix.SetTranslation oTrans
Dim oCylinder2 As ComponentOccurrence
 Set oCylinder2 = oAssyDoc.ComponentDefinition.Occurrences. _
 AddByComponentDefinition(oCylinder1.Definition, oPositionMatrix)

Dim oGreen As Color
 Set oGreen = ThisApplication.TransientObjects.CreateColor(0, 255, 0)
 Set hs = oAssyDoc.CreateHighlightSet
 hs.Color = oGreen
 'Подсветка компонента и Proxy-объектов
 'hs.AddItem oCylinder2                                     'компонент
 'hs.AddItem oCylinder2.SurfaceBodies(1)                    'тело
 'hs.AddItem oCylinder2.SurfaceBodies(1).Faces(2)           'поверхность
 'hs.AddItem oCylinder2.SurfaceBodies(1).Faces(2).Edges(1)  'ребро
 'hs.AddItem oCylinder2.SurfaceBodies(1).Faces(2).Parent        'тело
 'hs.AddItem oCylinder2.SurfaceBodies(1).Faces(2).Parent.Parent 'компонент

Dim oStyle As RenderStyle
 Set oStyle = oAssyDoc.RenderStyles.Item("Red")
 'Подсветка реальных объектов
 'деталь
 Call oCylinder2.SurfaceBodies(1).NativeObject _
 .SetRenderStyle(kOverrideRenderStyle, oStyle)
 'грань
 'Call oCylinder2.SurfaceBodies(1).Faces(2).NativeObject _
 .SetRenderStyle(kOverrideRenderStyle, oStyle)
 'деталь
 'Call oCylinder2.SurfaceBodies(1).Faces(2).Parent.NativeObject _
 .SetRenderStyle(kOverrideRenderStyle, oStyle)
End Sub

Обход дерева сборки

Обход иерархического дерева сложных сборок является необходимым этапом в решении многих задач. Рассмотрим пример сборки.

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

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

Для просмотра дерева сборки нам сначала необходимо у объекта AssemblyComponentDefinition получить ссылку на коллекцию ComponentOccurrences компонентов данной сборки. Итеративный перебор элементов этой коллекции возвращает объекты типа ComponentOccurrence. Если компонент представляет собой деталь, вы можете исследовать ее геометрию, опираясь на возвращаемую компонентом информацию о поверхностях. Если же компонент оказался подсборкой, свойство SubOccurrences объекта ComponentOccurrence предоставит возможность перебора составляющих ее компонентов. Свойство SubOccurrences возвращает объект ComponentOccurrenceEnumerator, весьма похожий на коллекцию ComponentOccurrences. Отличие состоит в том, что он не поддерживает добавление новых компонентов, а служит исключительно целям эффективного перебора существующих. При обходе дерева сборки произвольной вложенности вы просто опускаетесь на уровень ниже, если объект ComponentOccurrence оказывается подсборкой.  Ниже приводится программный код, который отображает эти действия.

Public Sub AssemblyTraversal()
' Ссылка на активный документ. Полагаем, что это сборка.
Dim oAsmDoc As AssemblyDocument
Set oAsmDoc = ThisApplication.ActiveDocument
' Начинаем обход сборки
Call TraverseAsm(oAsmDoc.ComponentDefinition.Occurrences, 1)
End Sub

' Аргумент Level для вычисления левого отступа при печати.
Private Sub TraverseAsm(oOccurrences As ComponentOccurrences, Level As Integer)
' перебор списка компонентов на текущем уровне иерархии.
Dim oOcc As ComponentOccurrence
For Each oOcc In oOccurrences
' вывод на печать имени текущего компонента
Debug.Print Space(Level * 3) & oOcc.Name
' Если текущий компонент – подсборка, то вызываем эту процедуру
' снова с текущим компонентом в качестве параметра.
If oOcc.DefinitionDocumentType = kAssemblyDocumentObject Then
Call TraverseAsm(oOcc.SubOccurrences, Level + 1)
End If
Next
End Sub


Первое, что бросается в глаза – задача решается не одной процедурой, а двумя. Для просмотра сборочной иерархии произвольной вложенности мы вынуждены воспользоваться рекурсивной процедурой. Здесь рекурсия – вызов функции или процедуры из неё же самой. Процедура TraverseAsm выполняет всю работу по перебору компонентов на уровне текущей сборки и, если наткнется на подсборку, вызывает сама себя для ее просмотра. Так продолжается до тех пор, пока не будут пройдены все подсборки. Процедура же AssemblyTraversal лишь дает старт этому процессу. Результат данного примера очень прост – будут напечатаны имена всех компонентов сборки по мере их обнаружения. Однако с каждым компонентом может быть выполнена гораздо более сложная операция. Например, у деталей могут быть вычислены объемы, которые, будучи просуммированы, дадут общий объем всей сборки. Другой пример – формирование спецификации, в процессе чего потребуется и доступ к документу, на который ссылается компонент, и точная информация о свойствах.

Контрольные задания

Задание 1

Разработать VBA приложение для создания сборки «Колесная пара»

Последовательность выполнения задания

Создайте детали «Ось»  и «Колесо», запустив  процедуры Axle () и Wheel(). Сохраните документы детали  – «Ось» (файл Axle.ipt) и «Колесо» (файл Wheel.ipt).

Запустите процедуру Assembly() из раздела Простейший пример создания сборки  с ссылкой на файл Wheel.ipt вместо Cylinder.ipt.

К 2-м компонентам по ссылке на файл Wheel.ipt добавьте еще компонент (объект класса ComponentOccurrence) по ссылке на файл axle.ipt. Приведите имена переменных компонентов в соответствие с именами деталей (oWheel1, oWheel2, oAxle).

После этих изменений программа обеспечивает создание 3-х компонентов.  Между компонентами oWheel1 и  oWheel2 устанавливаются 2 ограничения (Constraint) через метод AddMateConstraint коллекции  Constraints – по осям цилиндров (oCylAxis) и плоским граням (oCylFace). Ограничения между колесами установлены взамен ограничений между цилиндрами в исходной процедуре. Объект oAxle пока не связан никакими ограничениями, его можно перемещать.

Добавьте в программу ограничение совмещения осей цилиндрических поверхностей между объектами oAxle и oWheel1 – по аналогии, как между цилиндрами колес. Ось (объект oAxle) теперь перемещается только в продольном направлении.

Теперь необходимо убрать ограничение между гранями колес и установить ограничения между плоскими внешними гранями компонентов oWheel1 и oWheel2) и противоположными гранями компонента oAxle. В программе уже созданы объекты-грани для обоих колес (oCylFace1 и  oCylFace2). В отличии от колес, для объекта oAxle необходимо запомнить в переменных обе грани(oAxle1Face и  oCylFace32).

Dim k As Integer
k = 0
Dim oAxleFace1 As Face
Dim oAxleFace2 As Face
For Each oFace In oAxle.SurfaceBodies(1).Faces
If oFace.SurfaceType = kPlaneSurface Then
k = k + 1
If k = 1 Then
Set oAxleFace1 = oFace
End If
If k = 2 Then
Set oAxleFace2 = oFace
End If
End If
Next

Результат запуска показывает, что торцевые грани объекта oAxle соприкасаются с внутренними, а не с внешними гранями. Какой выход? Задаем смещение (-10) в методе AddMateConstraint на величину толщины колеса (см. чертеж).

Запоминаем сборку (WheelAssembly.iam) для ее использования в задании 3.

Задание 2

Разработать VBA приложение для создания сборки, состоящей из деталей  «Корпус» и «Запасное колесо».

Последовательность выполнения задания

Создайте деталь «Корпус», запустив  процедуру Body(). Сохраните документ детали  в файле Body.ipt.

Модифицируем процедуру WheelAssembly(), которая была создана при выполнении предыдущего задания. Уберем из нее все лишнее. Оставим лишь один компонент oWheel1 со ссылкой на файл Wheel.ipt. Он будет использован как запасное колесо, которое крепится на штыре задней грани автомобиля. Добавим в программу  компонент oBody со ссылкой на файл Body.ipt. Сохраним процедуру под именем CarAssembly().

Как совместить колесо со штырем? Точно также, как колеса совмещались с осью в колесной паре (см. процедуру WheelAssembly). Сложность заключается лишь в нахождении граней штыря среди множества граней компонента oWheel1. Как решить эту проблему?

Один из вариантов решения был использован в процедуре WheelAssembly при определении торцевых граней оси:

For Each oFace In oAxle.SurfaceBodies(1).Faces
If oFace.SurfaceType = kPlaneSurface Then
k = k + 1
If k = 1 Then
Set oAxleFace1 = oFace
End If
If k = 2 Then
Set oAxleFace2 = oFace

Нужная поверхность определяется тестированием программы при разных значениях переменной k. В компоненте Body 4 цилиндрических и 7 торцевых граней. Т.е., процесс нахождения нужных поверхностей будет трудоемким.

Другой вариант решения проблемы — определить имя штыря («Pin») при создании детали, чтобы использовать его при поиске  в сборке. Добавьте в конец процедуры Body() рядок кода:

oExtFeature1.Name = "Pin"

Запустите процедуру Body() и сохраните документ детали  в файле Body.ipt.

Поменять имя элемента детали с имени по умолчанию «Выдавливание3» на имя «Pin» можно непосредственно в браузере, открыв документ детали для редактирования в диалоговом режиме.

Процедура совмещение колеса со штырем на корпусе приводится ниже.

Public Sub CarAssembly()
Dim oApp As Inventor.Application
Set oApp = ThisApplication
Dim oDoc As AssemblyDocument

Set oDoc = oApp.Documents.Add(kAssemblyDocumentObject, _
oApp.GetTemplateFile(kAssemblyDocumentObject))

Dim oDef As AssemblyComponentDefinition
Set oDef = oApp.ActiveDocument.ComponentDefinition

Dim oPositionMatrix As Matrix
Set oPositionMatrix = oApp.TransientGeometry.CreateMatrix
Dim sFileName As String

sFileName = "c:\temp\Body.ipt"
Dim oBody As ComponentOccurrence
Set oBody = oDef.Occurrences.Add(sFileName, _
oPositionMatrix)

sFileName = "c:\temp\Wheel.ipt"
Dim oWheel1 As ComponentOccurrence
Set oWheel1 = oDef.Occurrences.Add(sFileName, _
oPositionMatrix)

Dim oFace As Face
Dim oCylAxis1 As Face
For Each oFace In oWheel1.SurfaceBodies(1).Faces
If oFace.SurfaceType = kCylinderSurface Then
Set oCylAxis1 = oFace
End If
If oFace.SurfaceType = kPlaneSurface Then
Set oCylFace1 = oFace
End If
Next

Dim oBodyDef As ComponentDefinition
Set oBodyDef = oBody.Definition
'Dim oExtFeature1 As ExtrudeFeature
'oExtFeature1 = oBodyDef.Features("Pin")
Dim oExtFeature1 As ExtrudeFeatureProxy
Call oBody.CreateGeometryProxy(oBodyDef.Features("Pin"), oExtFeature1)
Dim oPinAxis As Face
Dim oPinFace As Face
Set oPinAxis = oExtFeature1.SideFaces(1)
Set oPinFace = oExtFeature1.EndFaces(1)

Dim oConstr As AssemblyConstraint
Set oConstr = oDef.Constraints.AddMateConstraint(oCylAxis1, oPinAxis, 0, _
kInferredLine, kInferredLine)
Set oConstr = oDef.Constraints.AddMateConstraint(oCylFace1, oPinFace, -10, _
kNoInference, kNoInference)

End Sub

Как видим из кода, обратиться к элементу коллекции можно не только по индексу, но и по имени.

Обратите внимание на закомментированные строки кода. Попытка непосредственно обратиться к элементу Features(«Pin») не удалась. Потребовалось явное преобразование элемента в Proxy-объект методом CreateGeometryProxy, чтобы он был доступен в контексте сборки. При обращении к поверхностям элемента (oPinAxis и oPinFace)  явного преобразования не потребовалось, поскольку доступ уже реализуется через Proxy-объект. 

Задание 3

Разработать VBA приложение для создания сборки «Автомобиль»  , включающей корпус, запасное колесо и 2 подсборки  «Колесная пара» (WheelAssembly.iam)

Последовательность выполнения задания

Продолжаем работать с процедурой CarAssembly(). Добавим компонент со ссылкой на файл сборки колесной пары (WheelAssembly.iam).

sFileName = "c:\temp\WheelAssembly.iam"
Dim oWheelA As ComponentOccurrence
Set WheelA = oDef.Occurrences.Add(sFileName, oPositionMatrix)

Колесную пару пока можно свободно перемещать относительно корпуса. Теперь необходимо совместить цилиндрическую поверхность  оси колесной пары с одним из цилиндрических пазов корпуса, а также торец оси с боковой поверхностью корпуса. Эта задача отличается от совмещения запасного колеса со штырем тем, что ось колесной пары находится в сборке 2-го уровня вхождения.

В чертеже детали Body.ipt поменяем имя элемента  «Выдавливание2» на имя «Groove», а имя элемента  «Выдавливание1» на имя «Base».

Фрагмент программного кода, который реализует совмещение колесной пары с корпусом автомобиля:

Dim oWheelADef As ComponentDefinition
Set oWheelADef = oWheelA.Definition
Dim oAxle As ComponentOccurrenceProxy
Call oWheelA.CreateGeometryProxy(oWheelADef.Occurrences(2), oAxle)

Dim oAxleCyl As Face
Dim oAxlePlane As Face
For Each oFace In oAxle.SurfaceBodies(1).Faces
If oFace.SurfaceType = kCylinderSurface Then
Set oAxleCyl = oFace
End If
If oFace.SurfaceType = kPlaneSurface Then
Set oAxlePlane = oFace
End If
Next

Dim oBodyCyl As Face
Dim oBodyPlane As Face
Call oBody.CreateGeometryProxy(oBodyDef.Features("Groove"), oExtFeature1)
Set oBodyCyl = oExtFeature1.SideFaces(2)
Call oBody.CreateGeometryProxy(oBodyDef.Features("Base"), oExtFeature1)
Set oBodyPlane = oExtFeature1.EndFaces(1)

Set oConstr = oDef.Constraints.AddMateConstraint(oAxleCyl, oBodyCyl, 0, _
kInferredLine, kInferredLine)
Set oConstr = oDef.Constraints.AddMateConstraint(oAxlePlane, oBodyPlane, -90, _
kNoInference, kNoInference)

Попробуйте самостоятельно добавить программный код, который устанавливает 2-ю колесную пару.

Дополнительное задание:

Используя фрагменты кода программы из раздела «Прокси-объекты» обеспечьте закраску частей автомобиля.

Запустите программу из раздела «Обход дерева сборки» и ознакомьтесь с ней.

Задание на олимпиаду по САПР

См. пример моделирования задачи автоматизированного проектирования многодисковой фрикционной муфты

Ограничения между элементами сборки

Ограничения между элементами сборки устанавливаются через методы коллекции  Constraints.

Метод

Описание

AssemblyConstraints.AddAngleConstraint( EntityOne As Object, EntityTwo As Object, Angle As Variant, [SolutionType] As AngleConstraintSolutionTypeEnum, [ReferenceVectorEntity] As Variant, [BiasPointOne] As Variant, [BiasPointTwo] As Variant ) As AngleConstraint

 Метод, который создает ограничение Angle (Угол) между двумя элементами сборки EntityOne и EntityTwo.  Входными объектами могут быть плоская грань, линейное ребро, рабочая плоскость или ось.
SolutionType.  Определяет тип решения. Если указано kDirectionSolution, решение всегда применяет правило правой руки. Если указано, что это kUndirectionSolution, решение допускает любую ориентацию. Если указано, что это kReferenceVectorSolution, аргумент ReferenceVectorEntity должен быть снабжен третьим объектом для решения. Значение по умолчанию — kDirectionSolution. 
ReferenceVectorEntity. Необязательный входной объект, который предоставляет третий объект для ограничения угла. Этот аргумент игнорируется, если аргумент SolutionType не является kReferenceVectorSolution. Этот объект может быть плоской гранью, линейным ребром, рабочей плоскостью или осью.
BiasPoint…Необязательный входной параметр, который используется при определении начальной позиции вхождения.
AssemblyConstraints.AddFlushConstraint( EntityOne As Object, EntityTwo As Object, Offset As Variant, [BiasPointOne] As Variant, [BiasPointTwo] As Variant ) As FlushConstraint

Метод, который создает ограничение Flush (Заподлицо) между EntityOne и EntityTwo — плоскими объектами или рабочими плоскостями.

Offset. Определяет смещение между двумя входными примитивами.
BiasPoint…Необязательный входной параметр, который используется при определении начальной позиции вхождения.
AssemblyConstraints.AddInsertConstraint( EntityOne As Object, EntityTwo As Object, AxesOpposed As Boolean, Distance As Variant, [BiasPointOne] As Variant, [BiasPointTwo] As Variant ) As InsertConstraint

Метод, который создает ограничение Insert (Вставка) между объектами circular edge.

AxesOpposed. Определяет, как направлены оси входных объектов — в одном направлении или противоположно. Значение True указывает, что направления осей противоположны.

Distance. Определяет смещение между двумя входными примитивами.
BiasPoint…Необязательный входной параметр, который используется при определении начальной позиции вхождения.
AssemblyConstraints.AddMateConstraint( EntityOne As Object, EntityTwo As Object, Offset As Variant, [EntityOneInferredType] As InferredTypeEnum, [EntityTwoInferredType] As InferredTypeEnum, [BiasPointOne] As Variant, [BiasPointTwo] As Variant ) As MateConstraint

Метод, который создает ограничение Mate(Сопряжение) между двумя сопрягающимися элементами сборки EntityOne и EntityTwo  (см. пример).

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

Offset. Определяет смещение между двумя входными примитивами. 

Entity…InferredTypeНеобязательная входная константа, которая определяет, как должна интерпретироваться геометрия примитива. В зависимости от геометрии примитива возможны разные варианты. Если примитив 1 цилиндр, то может быть либо kNoInference, либо kInferredLine. Для того чтобы kNoInference было действительным для цилиндра, примитив 2 также должен быть цилиндром, и они оба должны быть одного и того же радиуса. Если примитив  сфера, то может быть либо kNoInference, либо kInferredPoint. Для того чтобы kNoInference был действительным для сферы, примитив 2 также должен быть сферой, и они оба должны быть одного и того же радиуса. Если примитив  конус, то может быть либо kNoInference, либо kInferredLine. Для того, чтобы kNoInference был действительным для конуса, примитив 2 также должен быть конусом, и они оба должны иметь одинаковый угол конуса. Если примитив  тор, то может быть либо kInferredLine, либо kInferredPoint. Для плоскости допустимо только kNoInference.

BiasPoint…Необязательный входной параметр, который используется при определении начальной позиции вхождения. Используя точки смещения (Bias Point), вы можете определить положение двух вхождений относительно друг друга. Если точка смещения не задана, тогда вычисляется та, которая находится в центре диапазона параметров входных объектов.

AssemblyConstraints.AddRotateRotateConstraint( EntityOne As Object, EntityTwo As Object, Ratio As Variant, ForwardDirection As Boolean, [BiasPointOne] As Variant, [BiasPointTwo] As Variant ) As RotateRotateConstraint

Метод, который создает ограничение RotateRotate (передача вращения).

EntityOne и EntityTwo могут определяться осями вращения объектов. Объект ввода должен быть плоскостью, вращающейся точкой, линейным ребром (Edge), рабочей плоскостью (WorkPlane) или рабочей осью (WorkAxis). Для плоских объектов ось вращения нормальна к входной грани.

Ratio определяет коэффициент вращения между двумя входными объектами.
ForwardDirection определяет направление вращения объектов. Если входное значение равно True, оба объекта будут вращаться в одном направлении вокруг своих осей. Если False, то они будут вращаться в противоположных направлениях.
AssemblyConstraints.AddRotateTranslateConstraint( EntityOne As Object, EntityTwo As Object, Ratio As Variant, ForwardDirection As Boolean, [BiasPointOne] As Variant, [BiasPointTwo] As Variant ) As RotateTranslateConstraint

Метод, который создает ограничение Rotate-Translate (от поворота к перемещению).

EntityOne. Объект ввода, который определяет первый объект и его ось вращения.
EntityTwoОбъект ввода, который определяет второй объект и его ось перемещения.
Ratio определяет расстояние перемещения для каждого оборота. По умолчанию в см, или единицы измерения указываются явно, как строковые переменные.
ForwardDirection. Если входное значение равно True, то, когда объект вращения вращается в положительном направлении вокруг своей оси, другой объект  будет перемещаться в положительном направлении его вектора, если False, он будет двигаться в отрицательном направлении.

Метод, который создает ограничение Symmetry (симметрия).
AssemblyConstraints.AddTangentConstraint( EntityOne As Object, EntityTwo As Object, InsideTangency As Boolean, Offset As Variant, [BiasPointOne] As Variant, [BiasPointTwo] As Variant ) As TangentConstraint

Метод, который создает ограничение Tangent (касание).

EntityTwoЭтот объект есть круговое ребро.

InsideTangency определяет ориентацию поверхностей в касательной точке контакта поверхностей.
Offset определяет смещение между двумя входными примитивами. 
AssemblyConstraints.AddTransitionalConstraint( FaceOne As Face, FaceTwo As Face, [BiasPointOne] As Variant, [BiasPointTwo] As Variant ) As TransitionalConstraint

Метод, который создает ограничение Transitional  (переходное).

 

FaceOne и FaceTwo. Ввод, который определяет  грань во  вхождении, которая используется при перемещении вхождений. Как только ограничение помещено, оно может перемещаться по любой из сторон детали.

Тексты программ

Процедура Axle ()

Процедура Axle () открывает новый документ детали и создает в нем цилиндр (ось).

Public Sub Axle()
'Create a new part document, using the default part template.
Dim oPartDoc As PartDocument
Set oPartDoc = _
ThisApplication.Documents.Add(kPartDocumentObject, _
ThisApplication.FileManager.GetTemplateFile _
(kPartDocumentObject))
Dim oCompDef As PartComponentDefinition
Set oCompDef = oPartDoc.ComponentDefinition
Dim oSketch As PlanarSketch
Set oSketch = oCompDef.Sketches.Add(oCompDef.WorkPlanes(2))
Dim oTransGeom As TransientGeometry
Set oTransGeom = ThisApplication.TransientGeometry
Dim oCircle1 As SketchCircle
Set oCircle1 = oSketch.SketchCircles.AddByCenterRadius _
(oTransGeom.CreatePoint2d(0, 0), 5)
Dim oProfile As Profile
Set oProfile = oSketch.Profiles.AddForSolid
Dim oExtrudeDef As ExtrudeDefinition
Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition _
(oProfile, kJoinOperation)
Call oExtrudeDef.SetDistanceExtent(100, kPositiveExtentDirection)
Dim oExtrude As ExtrudeFeature
Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
End Sub

Процедура Wheel()

Процедура Wheel() открывает новый документ детали и создает в нем цилиндр с отверстием (колесо).

Public Sub Wheel()
'Create a new part document, using the default part template.
Dim oPartDoc As PartDocument
Set oPartDoc = _
ThisApplication.Documents.Add(kPartDocumentObject, _
ThisApplication.FileManager.GetTemplateFile _
(kPartDocumentObject))
Dim oCompDef As PartComponentDefinition
Set oCompDef = oPartDoc.ComponentDefinition
Dim oSketch As PlanarSketch
Set oSketch = oCompDef.Sketches.Add(oCompDef.WorkPlanes(2))
Dim oTransGeom As TransientGeometry
Set oTransGeom = ThisApplication.TransientGeometry
Dim oCircle1 As SketchCircle
Set oCircle1 = oSketch.SketchCircles.AddByCenterRadius _
(oTransGeom.CreatePoint2d(0, 0), 25)
Dim oCircle2 As SketchCircle
Set oCircle2 = oSketch.SketchCircles.AddByCenterRadius _
(oTransGeom.CreatePoint2d(0, 0), 5)
Dim oProfile As Profile
Set oProfile = oSketch.Profiles.AddForSolid
Dim oProfPath As ProfilePath
For Each oProfPath In oProfile
If oProfPath.Item(1).SketchEntity Is oCircle1 Then
oProfPath.AddsMaterial = True
ElseIf oProfPath.Item(1).SketchEntity Is oCircle2 Then
oProfPath.AddsMaterial = False
Else
oProfPath.Delete
End If
Next
Dim oExtrudeDef As ExtrudeDefinition
Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures. _
CreateExtrudeDefinition(oProfile, kJoinOperation)
Call oExtrudeDef.SetDistanceExtent(10, kPositiveExtentDirection)
Dim oExtrude As ExtrudeFeature
Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
oSketch.Visible = True
End Sub

Процедура Body()

Процедура Body() открывает новый документ детали и создает в нем корпус автомобиля

Public Sub Body()
' Create a new part document, using the default part template.
Dim oPartDoc As PartDocument
Set oPartDoc = _
ThisApplication.Documents.Add(kPartDocumentObject, _
ThisApplication.FileManager.GetTemplateFile _
(kPartDocumentObject))
Dim oCompDef As PartComponentDefinition
Set oCompDef = oPartDoc.ComponentDefinition
Dim oSketch As PlanarSketch
Set oSketch = oCompDef.Sketches.Add(oCompDef.WorkPlanes(2))
' Set a reference to the transient geometry collection.
Dim oTransGeom As TransientGeometry
Set oTransGeom = ThisApplication.TransientGeometry
Dim oCoord1 As Point2d
Set oCoord1 = oTransGeom.CreatePoint2d(0, 0)
Dim oCoord2 As Point2d
Set oCoord2 = oTransGeom.CreatePoint2d(120, 0)
Dim oLines(1 To 4) As SketchLine
Set oLines(1) = oSketch.SketchLines.AddByTwoPoints(oCoord1, oCoord2)
Set oCoord1 = oTransGeom.CreatePoint2d(120, 20)
Set oLines(2) = oSketch.SketchLines.AddByTwoPoints(oLines(1).EndSketchPoint, oCoord1)
Set oCoord1 = oTransGeom.CreatePoint2d(70, 20)
Set oCoord2 = oTransGeom.CreatePoint2d(70, 70)
Dim oArc As SketchArc
Set oArc = oSketch.SketchArcs.AddByCenterStartEndPoint(oCoord1, oLines(2).EndSketchPoint, oCoord2)
Set oCoord1 = oTransGeom.CreatePoint2d(0, 70)
Set oLines(3) = oSketch.SketchLines.AddByTwoPoints(oArc.EndSketchPoint, oCoord1)
Set oLines(4) = oSketch.SketchLines.AddByTwoPoints(oLines(1).StartSketchPoint, oLines(3).EndSketchPoint)
Call oSketch.GeometricConstraints.AddHorizontal(oLines(1))
Call oSketch.GeometricConstraints.AddPerpendicular(oLines(1), oLines(2))
Call oSketch.GeometricConstraints.AddTangent(oLines(2), oArc)
Call oSketch.GeometricConstraints.AddTangent(oLines(3), oArc)
Call oSketch.GeometricConstraints.AddParallel(oLines(1), oLines(3))
Call oSketch.GeometricConstraints.AddParallel(oLines(4), oLines(2))
Dim oProfile As Profile
Set oProfile = oSketch.Profiles.AddForSolid
Dim oExtFeature As ExtrudeFeature
Set oExtFeature = oPartDoc.ComponentDefinition.Features.ExtrudeFeatures.AddByDistanceExtent _
(oProfile, 80#, kSymmetricExtentDirection, kJoinOperation)
Dim oCirc As SketchCircle
Set oCirc = oSketch.SketchCircles.AddByCenterRadius(oLines(1).StartSketchPoint, 5)
Call oSketch.GeometricConstraints.AddCoincident(oLines(1).StartSketchPoint, oCirc.CenterSketchPoint)
Set oProfile = oSketch.Profiles.AddForSolid 
Set oCirc1 = oSketch.SketchCircles.AddByCenterRadius(oLines(1).EndSketchPoint, 5)
Call oSketch.GeometricConstraints.AddCoincident(oLines(1).EndSketchPoint, oCirc1.CenterSketchPoint)
Set oProfile = oSketch.Profiles.AddForSolid
Dim oProfPath As ProfilePath
For Each oProfPath In oProfile
If oProfPath.Item(1).SketchEntity Is oCirc Then
oProfPath.AddsMaterial = True
ElseIf oProfPath.Item(1).SketchEntity Is oCirc1 Then
oProfPath.AddsMaterial = True
Else
oProfPath.Delete
End If
Next
Set oExtFeature = oPartDoc.ComponentDefinition.Features.ExtrudeFeatures.AddByDistanceExtent _
(oProfile, 80#, kSymmetricExtentDirection, kCutOperation) 
Dim oSurfaceBody As SurfaceBody
Dim oFace As Face
Dim k As Integer
k = 0
For Each oSurfaceBody In oCompDef.SurfaceBodies
For Each oFace In oSurfaceBody.Faces 
If oFace.SurfaceType = kPlaneSurface Then
k = k + 1
If k = 4 Then
Set oEval = oFace.Evaluator
Dim oRange As Box2d
Set oRange = oEval.ParamRangeRect
Dim params(0 To 1) As Double
params(0) = oRange.MinPoint.X + (oRange.MaxPoint.X - oRange.MinPoint.X) * 0.5
params(1) = oRange.MinPoint.Y + (oRange.MaxPoint.Y - oRange.MinPoint.Y) * 0.5
Dim cenPt() As Double
oEval.GetPointAtParam params, cenPt
Dim oPoint As Point
Set oPoint = ThisApplication.TransientGeometry.CreatePoint(cenPt(0), cenPt(1), cenPt(2))
Dim oSketch1 As PlanarSketch
Set oSketch1 = oCompDef.Sketches.Add(oFace)
Dim oPoint2D As Point2d
Set oPoint2D = oSketch1.ModelToSketchSpace(oPoint)
Dim oCirc3 As SketchCircle
Set oCirc3 = oSketch1.SketchCircles.AddByCenterRadius(oPoint2D, 5)
Dim oProfile1 As Profile
Set oProfile1 = oSketch1.Profiles.AddForSolid
End If
End If
Next
Next 
Dim oExtFeature1 As ExtrudeFeature 
Set oExtFeature1 = oCompDef.Features.ExtrudeFeatures.AddByDistanceExtent _ 
(oProfile1, 10#, kPositiveExtentDirection, kJoinOperation) 
ThisApplication.ActiveView.Fit 
End Sub

Процедура WheelAssembly()

Public Sub WheelAssembly()
Dim oApp As Inventor.Application
Set oApp = ThisApplication
Dim oAssyDoc As AssemblyDocument
Set oAssyDoc = oApp.Documents.Add(kAssemblyDocumentObject, _
oApp.GetTemplateFile(kAssemblyDocumentObject))
Dim oPositionMatrix As Matrix
Set oPositionMatrix = oApp.TransientGeometry.CreateMatrix
Dim sFileName As String
sFileName = "c:\temp\wheel.ipt"
Dim oWheel1 As ComponentOccurrence
Set oWheel1 = oAssyDoc.ComponentDefinition.Occurrences.Add(sFileName, _
oPositionMatrix)
sFileName = "c:\temp\axle.ipt"
Dim oAxle As ComponentOccurrence
Set oAxle = oAssyDoc.ComponentDefinition.Occurrences.Add(sFileName, _
oPositionMatrix)
Dim oTrans As Vector
Set oTrans = oApp.TransientGeometry.CreateVector(1, 0, 0)
oPositionMatrix.SetTranslation oTrans
Dim oWheel2 As ComponentOccurrence
Set oWheel2 = oAssyDoc.ComponentDefinition.Occurrences.AddByComponentDefinition _
(oWheel1.Definition, oPositionMatrix)
Dim oAxisDef As AssemblyComponentDefinition
Set oAxisDef = oApp.ActiveDocument.ComponentDefinition
Dim oCylAxis1 As Face
Dim oCylAxis2 As Face
Dim oCylAxis3 As Face
Dim oFace As Face
For Each oFace In oWheel1.SurfaceBodies(1).Faces
If oFace.SurfaceType = kCylinderSurface Then
Set oCylAxis1 = oFace
End If
Next
For Each oFace In oWheel2.SurfaceBodies(1).Faces
If oFace.SurfaceType = kCylinderSurface Then
Set oCylAxis2 = oFace
End If
Next
For Each oFace In oAxle.SurfaceBodies(1).Faces
If oFace.SurfaceType = kCylinderSurface Then
Set oCylAxis3 = oFace
End If
Next
Dim oConstr As AssemblyConstraint
Set oConstr = oAxisDef.Constraints.AddMateConstraint(oCylAxis1, oCylAxis2, 0, _
kInferredLine, kInferredLine)
Set oConstr = oAxisDef.Constraints.AddMateConstraint(oCylAxis3, oCylAxis1, 0, _
kInferredLine, kInferredLine)
Dim oCylFace1 As Face
Dim oCylFace2 As Face
For Each oFace In oWheel1.SurfaceBodies(1).Faces
If oFace.SurfaceType = kPlaneSurface Then
Set oCylFace1 = oFace
End If
Next
For Each oFace In oWheel2.SurfaceBodies(1).Faces
If oFace.SurfaceType = kPlaneSurface Then
Set oCylFace2 = oFace
End If
Next
Dim k As Integer
k = 0
Dim oAxleFace1 As Face
Dim oAxleFace2 As Face
For Each oFace In oAxle.SurfaceBodies(1).Faces
If oFace.SurfaceType = kPlaneSurface Then
k = k + 1
If k = 1 Then
Set oAxleFace1 = oFace
End If
If k = 2 Then
Set oAxleFace2 = oFace
End If
End If
Next
Set oConstr = oAxisDef.Constraints.AddMateConstraint(oAxleFace1, oCylFace1, -10, _
kNoInference, kNoInference)
Set oConstr = oAxisDef.Constraints.AddMateConstraint(oAxleFace2, oCylFace2, -10, _
kNoInference, kNoInference)
End Sub

Процедура CarAssembly()

Public Sub CarAssembly()
Dim oApp As Inventor.Application
Set oApp = ThisApplication
Dim oDoc As AssemblyDocument
Set oDoc = oApp.Documents.Add(kAssemblyDocumentObject, _
oApp.GetTemplateFile(kAssemblyDocumentObject))
Dim oDef As AssemblyComponentDefinition
Set oDef = oApp.ActiveDocument.ComponentDefinition
Dim oPositionMatrix As Matrix
Set oPositionMatrix = oApp.TransientGeometry.CreateMatrix
Dim sFileName As String
Dim oFace As Face
Dim oConstr As AssemblyConstraint

sFileName = "c:\temp\Body.ipt"
Dim oBody As ComponentOccurrence
Set oBody = oDef.Occurrences.Add(sFileName, oPositionMatrix)

sFileName = "c:\temp\Wheel.ipt"
Dim oWheel1 As ComponentOccurrence
Set oWheel1 = oDef.Occurrences.Add(sFileName, oPositionMatrix)

sFileName = "c:\temp\WheelAssembly.iam"
Dim oWheelA As ComponentOccurrence
Set oWheelA = oDef.Occurrences.Add(sFileName, oPositionMatrix)

Dim oWheelA2 As ComponentOccurrence
Set oWheelA2 = oDef.Occurrences.AddByComponentDefinition _
(oWheelA.Definition, oPositionMatrix)

Dim oWheelADef As ComponentDefinition
Set oWheelADef = oWheelA.Definition
Dim oAxle As ComponentOccurrenceProxy
Call oWheelA.CreateGeometryProxy(oWheelADef.Occurrences(2), oAxle)

Dim oWheelA2Def As ComponentDefinition
Set oWheelA2Def = oWheelA2.Definition
Dim oAxle2 As ComponentOccurrenceProxy
Call oWheelA2.CreateGeometryProxy(oWheelA2Def.Occurrences(2), oAxle2)

Dim oAxleCyl As Face
Dim oAxlePlane As Face
For Each oFace In oAxle.SurfaceBodies(1).Faces
If oFace.SurfaceType = kCylinderSurface Then
Set oAxleCyl = oFace
End If
If oFace.SurfaceType = kPlaneSurface Then
Set oAxlePlane = oFace
End If
Next

Dim oAxleCyl2 As Face
Dim oAxlePlane2 As Face
For Each oFace In oAxle2.SurfaceBodies(1).Faces
If oFace.SurfaceType = kCylinderSurface Then
Set oAxleCyl2 = oFace
End If
If oFace.SurfaceType = kPlaneSurface Then
Set oAxlePlane2 = oFace
End If
Next

Dim oCylAxis1 As Face
For Each oFace In oWheel1.SurfaceBodies(1).Faces
If oFace.SurfaceType = kCylinderSurface Then
Set oCylAxis1 = oFace
End If
If oFace.SurfaceType = kPlaneSurface Then
Set oCylFace1 = oFace
End If
Next

Dim oBodyDef As ComponentDefinition
Set oBodyDef = oBody.Definition
'Dim oExtFeature1 As ExtrudeFeature
'oExtFeature1 = oBodyCompDef.Features("Pin")
Dim oExtFeature1 As ExtrudeFeatureProxy
Call oBody.CreateGeometryProxy(oBodyDef.Features("Pin"), oExtFeature1)
Dim oPinAxis As Face
Dim oPinFace As Face
Set oPinAxis = oExtFeature1.SideFaces(1)
Set oPinFace = oExtFeature1.EndFaces(1)

Dim oBodyCyl As Face
Dim oBodyPlane As Face
Call oBody.CreateGeometryProxy(oBodyDef.Features("Groove"), oExtFeature1)
Set oBodyCyl = oExtFeature1.SideFaces(2)
Set oBodyCyl2 = oExtFeature1.SideFaces(1)

Call oBody.CreateGeometryProxy(oBodyDef.Features("Base"), oExtFeature1)
Set oBodyPlane = oExtFeature1.EndFaces(1)

Set oConstr = oDef.Constraints.AddMateConstraint(oAxleCyl, oBodyCyl, 0, _
kInferredLine, kInferredLine)
Set oConstr = oDef.Constraints.AddMateConstraint(oAxlePlane, oBodyPlane, -90, _
kNoInference, kNoInference)

Set oConstr = oDef.Constraints.AddMateConstraint(oAxleCyl2, oBodyCyl2, 0, _
kInferredLine, kInferredLine)
Set oConstr = oDef.Constraints.AddMateConstraint(oAxlePlane2, oBodyPlane, -90, _
kNoInference, kNoInference)

Set oConstr = oDef.Constraints.AddMateConstraint(oCylAxis1, oPinAxis, 0, _
kInferredLine, kInferredLine)
Set oConstr = oDef.Constraints.AddMateConstraint(oCylFace1, oPinFace, -10, _
kNoInference, kNoInference)

End Sub

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

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

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