Введение
Простейший пример создания сборки
Прокси-объекты
Обход дерева сборки
Контрольные задания
Ограничения между элементами сборки
Тексты программ:
Процедура Axle()
Процедура Wheel()
Процедура Body()
Процедура WheelAssembly()
Процедура CarAssembly()
Введение
Сборка — соединение компонентов (деталей и подсборок). Например, сборка «Автомобиль» представляет соединение детали «Корпус» и 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
|
|
AssemblyConstraints.AddFlushConstraint( EntityOne As Object, EntityTwo As Object, Offset As Variant, [BiasPointOne] As Variant, [BiasPointTwo] As Variant ) As FlushConstraint
|
Метод, который создает ограничение Flush (Заподлицо) между EntityOne и EntityTwo — плоскими объектами или рабочими плоскостями.
|
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 указывает, что направления осей противоположны. |
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. Определяет смещение между двумя входными примитивами. |
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). Для плоских объектов ось вращения нормальна к входной грани. |
AssemblyConstraints.AddRotateTranslateConstraint( EntityOne As Object, EntityTwo As Object, Ratio As Variant, ForwardDirection As Boolean, [BiasPointOne] As Variant, [BiasPointTwo] As Variant ) As RotateTranslateConstraint
|
Метод, который создает ограничение Rotate-Translate (от поворота к перемещению).
|
AssemblyConstraints. AddSymmetryConstraint( EntityOne As Object, EntityTwo As Object, SymmetryPlane As Object, [EntityOneInferredType] As InferredTypeEnum, [EntityTwoInferredType] As InferredTypeEnum, [NormalsOpposed] As Boolean) |
Метод, который создает ограничение 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. Этот объект есть круговое ребро. |
AssemblyConstraints.AddTransitionalConstraint( FaceOne As Face, FaceTwo As Face, [BiasPointOne] As Variant, [BiasPointTwo] As Variant ) As TransitionalConstraint
|
Метод, который создает ограничение Transitional (переходное).
|
Тексты программ
Процедура 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
Автор: Николай Свирневский