Inventor API деталь на VBA

Автор: | 05.02.2018

Пример создания модели детали
Создание вида детали
Особенности эскизирования
Профили
Доступ к эскизам
Элементы тела (Features)
Рабочие элементы (Work Features)
Граничное представление тела (Boundary Representation, B-Rep)
Контрольные задания

Пример создания модели детали

В этой теме рассматриваются примеры создания модели детали на языке VBA. Чтобы использовать Inventor API, Вы должны познакомиться с объектами, которые он предоставляет, и понять, как получить желаемый объект. Структура API отражена через так называемую объектную модель.

Ниже VBA код демонстрирует создание простого объемного тела, состоящего из блока с карманом.

 

Public Sub DrawBlockWithPocket()
' Create a new part document, using the default part template.
Dim oPartDoc As PartDocument
Set oPartDoc = ThisApplication.Documents.Add(kPartDocumentObject, _
ThisApplication.GetTemplateFile(kPartDocumentObject))
' Set a reference to the component definition.
Dim oCompDef As PartComponentDefinition
Set oCompDef = oPartDoc.ComponentDefinition
Dim oSketch As PlanarSketch
Set oSketch = oCompDef.Sketches.Add(oCompDef.WorkPlanes(3))
' Set a reference to the transient geometry object.
Dim oTransGeom As TransientGeometry
Set oTransGeom = ThisApplication.TransientGeometry
' Draw a 4cm x 3cm rectangle with the corner at (0,0)
Dim oRectangleLines As SketchEntitiesEnumerator
Set oRectangleLines = oSketch.SketchLines.AddAsTwoPointRectangle( _
oTransGeom.CreatePoint2d(0, 0), _
oTransGeom.CreatePoint2d(4, 3))
' Create a profile.
Dim oProfile As Profile
Set oProfile = oSketch.Profiles.AddForSolid
' Create a base extrusion 1cm thick.
Dim oExtrude As ExtrudeFeature
Set oExtrude = _
oCompDef.Features.ExtrudeFeatures.AddByDistanceExtent( _
oProfile, 1, kNegativeExtentDirection, kJoinOperation)
Dim oFrontFace As Face
Set oFrontFace = oExtrude.StartFaces.Item(1)
Set oSketch = oCompDef.Sketches.AddWithOrientation(oFrontFace, _
oCompDef.WorkAxes.Item(1), True, True, oCompDef.WorkPoints(1))
' Determine where in sketch space the point (0.5,0.5,0) is.
Dim oCorner As Point2d
Set oCorner = oSketch.ModelToSketchSpace(oTransGeom.CreatePoint(0.5, 0.5, 0))
' Create the interior 3cm x 2cm rectangle for the pocket.
Set oRectangleLines = oSketch.SketchLines.AddAsTwoPointRectangle( _
oCorner, oTransGeom.CreatePoint2d(oCorner.X + 3, oCorner.Y + 2))
' Create a profile.
Set oProfile = oSketch.Profiles.AddForSolid
' Create a pocket .25 cm deep.
Set oExtrude = _
oCompDef.Features.ExtrudeFeatures.AddByDistanceExtent( _
oProfile, 0.25, kNegativeExtentDirection, kCutOperation)
End Sub

Проектирование трехмерных объектов в Autodesk Inventor начинается с построения двумерного эскиза (Sketch). Эскиз – плоскость с 2d системой координат для задания на ней геометрических примитивов, которые будут использоваться для определения  трехмерных объектов.

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

Последовательность создания модели детали в программе через элементы extrusion (выдавливание) отражена на рисунках.

Деталь (Part) состоит из двух элементов extrusion (Features): один, чтобы создать основной блок и другой, чтобы создать карман. Для элементов extrusion создаются профили для выдавливания, каждый в своем эскизе.

Все плоские эскизы документа детали «живут» в коллекции Sketches объекта PartComponentDefinition . Коллекция эскизов поддерживает два метода, чтобы создать эскиз(более подробно см. ссылку).

Для  эскиза 1 используется метод Sketches.Add, который не обеспечивает контроль над ориентацией. Эскиз унаследует ориентацию и начало координат от рабочей плоскости XY – это одна из трех плоскостей в коллекции WorkPlanes, которые изначально существуют в каждом документе part.

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

  • Первый аргумент определяет поверхность, которая получена непосредственно от предыдущего элемента.
  • Второй аргумент определяет ось X. В этой программе системная рабочая ось X поступает на вход.
  • Третий аргумент определяет, или направление оси X эскиза будет в том же самом направлении как примитив, обеспеченный, как второй аргумент.
  • Четвертый аргумент определяет, является ли определяемая ось осью X или Y.
  • Пятый аргумент определяет начало эскиза. В этой программе начало рабочей системы координат является началом эскиза.
  • Шестой необязательный логический аргумент определяет, должны ли грани входной поверхности быть скопированы на эскиз (как делалось бы это при создании эскиза в интерактивном режиме).

Кроме эскизов через объект класса PartComponentDefinition  обеспечивается рабочая геометрия. Она создается только средствами API, служит для вспомогательных построений и совершенно скрыта от конечного пользователя – она не видна на экране и никак не отображается в дереве построений модели.

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

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

Создание вида детали

Вид – 2D представление 3D модели. API Inventor позволяет программно создавать виды (Drawing Views) и манипулировать ими на листах чертежей (drawing sheet). Виды могут быть масштабированы, на них можно отображать сечения детали и т.д. Кроме этого, API поддерживает через объект DrawingViewEvents событие OnViewUpdate, чтобы вид обновлялся при изменении модели, связанной с ним в проекте.

Ниже программный код демонстрирует создание в документе чертежа вид (проекцию)  детали. Программный код моделирования этой детали  был рассмотрен выше.

Public Sub DrawPart()
Dim oDrawingDoc As DrawingDocument
Set oDrawingDoc = ThisApplication.ActiveDocument
Dim oSheet As Sheet
Set oSheet = oDrawingDoc.Sheets.Item(1)
Dim oPoint1 As Point2d
Set oPoint1 = ThisApplication.TransientGeometry.CreatePoint2d(5#, 25#)
Dim oPartDoc As PartDocument
Set oPartDoc = ThisApplication.Documents.Open("c:\temp\part.ipt", False)
Dim oView1 As DrawingView
Set oView1 = oSheet.DrawingViews.AddBaseView(oPartDoc, _
oPoint1, 1#, kBottomViewOrientation, kHiddenLineDrawingViewStyle)
Call oPartDoc.Close(True)
End Sub

API обеспечивает функциональность, относящуюся к видам на чертеже, через коллекцию объектов DrawingViews.

В рассматриваемом примере сначала получаем объект oSheet – лист, на котором необходимо поместить вид. Положение вида определяется точкой с координатами X=5 и  Y=25. Невидимые линии добавляются к объекту oView1, используя вид kBottomViewOrientation для детали открытого файла part.ipt. После этого part файл закрывается.

Особенности эскизирования

Некоторые из концепций эскизов в интерактивном режиме немного отличны от концепций эскизов при использовании API. Когда эскиз определяется интерактивно, Вы имеете возможности контроля геометрических условий размещения примитивов. При использовании API эти условия необходимо определять явно.

Как пример, посмотрим на рисунок.

Чтобы определить такой профиль на эскизе интерактивно от Вас требуется – четыре щелчка мышкой (clicks) и одна протяжка (drag).

Давайте более внимательно рассмотрим то, что фактически происходило в течение этого процесса.

  • Чтобы создать линию 1, Вы щелкаете мышью, чтобы определить начальную точку. Пока Вы перемещаете мышь, Inventor показывает глиф, подсказывая, что линия будет горизонтальной. После повторного щелчка мышью определяется вторая точка и ограничение «горизонтальность» автоматически применяется.
  • Заканчивая линию 1, Вы начинаете линию 2, при этом ограничение «Совпадение» между конечной и начальной точками предполагается. Когда Вы двигаете мышь, Inventor подсказывает, что линия 2 будет перпендикулярной к линии 1. Когда выполняете щелчок мышью, автоматически применяется ограничение «Перпендикулярность».
  • Дуга 3 создается перетаскиванием (dragging) мыши от конца линии 2. После того, как линия 3 создается, автоматически применяются ограничения совпадения между точками и касания к линии 2.
  • Отрезок 4 начинается там, где закончилась дуга 3. Используя глиф, Inventor уведомляет Вас, что линия касательная к дуге и параллельна линии 1. После щелчка, чтобы определить линию 4, автоматически применяются ограничения совпадения, касания и параллельности.
  • Отрезок 5 начинается там, где заканчивается отрезок 4. После щелчка автоматически применяются ограничения совпадения между точками линий 1 и 4 , а также ограничение параллельности с линией 2.

Итак, четыре clicks, и один drag мышки обеспечили создание 5 объектов эскиза (sketch entities) и 11 ограничений (constraints). Теперь давайте посмотрим на тот же самый процесс с точки зрения API.

Public Sub DrawSketchLine()
' Check to make sure a sketch is open.
If Not TypeOf ThisApplication.ActiveEditObject Is PlanarSketch Then
MsgBox "A sketch must be active."
Exit Sub
End If
' Set a reference to the active sketch.
Dim oSketch As PlanarSketch
Set oSketch = ThisApplication.ActiveEditObject
' 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))
End Sub

Если Вы взгляните в online help, то увидите, что метод AddByTwoPoints объекта SketchLines берет две точки, чтобы определить отрезок.

AddByTwoPoints(StartPoint As Object, EndPoint As Object) As SketchLine

Обратите внимание, что тип объекта, ожидаемого как вход для точек, определен как «Объект». Это позволяет Вам вводить объект Point2d или использовать существующий объект SketchPoint. При определении местоположения объектов эскиза используются координаты на эскизе, они определяются через объекты Point2d. Эти объекты не определяют графическую точку, а только лишь координаты в 2d пространстве. Когда Вы используете объект Point2d на входе, то сначала создается в этом месте SketchPoint, а затем линия присоединяется к точке эскиза с ограничением coincident (совпадение). В случае, когда SketchPoint является входной, линия прикладывается непосредственно к входной точке эскиза, используя ограничение «Совпадение».

При создании объектов эскиза через API отсутствует возможность ввода ограничений (за исключением ограничения совпадения, когда Вы используете точку эскиза как вход). Поэтому Вы должны явно создавать геометрические ограничения перпендикулярности, параллельности и касания.

Ограничения можно воспринимать, как правила, которые регулируют положение, наклон, стык, размеры и отношения между геометрией эскиза. Inventor API имеет набор объектов ограничений, которые могут быть применены к эскизам.

Профили

Другое важное понятие, которое явно не определяется через пользовательский интерфейс – концепция профилей. Эскиз по существу только контейнер для 2d объектов и связывающих их ограничений. Сам эскиз не определяет связанные наборы объектов, которые могут использоваться для определения формы. Эта информация определена профилями. Например, Вы можете создать эскиз из 3-х окружностей. Перед созданием элемента extrude нужно определить профиль. В интерактивном режиме он определяется через перемещение мыши в пределах различных закрытых областей и clicking. Любая комбинация следующих форм на эскизе может использоваться, чтобы определить профиль.

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

Public Sub SketchProfileControl()
' 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(3))
Dim oTransGeom As TransientGeometry
Set oTransGeom = ThisApplication.TransientGeometry
Dim oCircle1 As SketchCircle
Set oCircle1 = oSketch.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(5, 5), 6)
Dim oCircle2 As SketchCircle
Set oCircle2 = oSketch.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(5, 5), 4)
Dim oCircle3 As SketchCircle
Set oCircle3 = oSketch.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(5, 5), 2)
Dim oProfile As Profile
Set oProfile = oSketch.Profiles.AddForSolid
Dim oProfPath As ProfilePath
For Each oProfPath In oProfile
If oProfPath.Item(1).SketchEntity Is oCircle2 Then
oProfPath.AddsMaterial = True
ElseIf oProfPath.Item(1).SketchEntity Is oCircle3 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(1, kNegativeExtentDirection)
Dim oExtrude As ExtrudeFeature
Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
oSketch.Visible = True
End Sub
 Результат работы программы показан на рисунке

Выбор нужного профиля из замкнутых областей, сформированных на одном эскизе, регулируется свойством AddsMaterial объекта oProfPath. При этом значение свойства  (True или False) имеет смысл только для внутренних областей. Если True, то материалом заполняется область внутри окружности вплоть до следующей окружности, у которой значение свойства AddsMaterial = False. Ниже приведен фрагмент программы для 5 окружностей:

Dim oCircle1 As SketchCircle
Set oCircle1 = oSketch.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(2, 5), 5)
Dim oCircle2 As SketchCircle
Set oCircle2 = oSketch.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(5, 5), 4)
Dim oCircle3 As SketchCircle
Set oCircle3 = oSketch.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(5, 5), 3)
Dim oCircle4 As SketchCircle
Set oCircle4 = oSketch.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(5, 5), 2)
Dim oCircle5 As SketchCircle
Set oCircle5 = oSketch.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(5, 5), 1)
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 = False
ElseIf oProfPath.Item(1).SketchEntity Is oCircle2 Then
oProfPath.AddsMaterial = False
ElseIf oProfPath.Item(1).SketchEntity Is oCircle3 Then
oProfPath.AddsMaterial = True
ElseIf oProfPath.Item(1).SketchEntity Is oCircle4 Then
oProfPath.AddsMaterial = False
Else
oProfPath.Delete
End If
Next

На рисунках показаны результаты для концентричных окружностей и со сдвигом внешней окружности oCircle1. Внутренняя окружность oCircle5 не рассматривается как профиль, поскольку для нее применяется метод oProfPath.Delete.

Доступ к эскизам

Много программ, которые имеют дело с эскизами, не обязательно создают эскиз, а лишь получают доступ к нему.

Типовой код ниже иллюстрирует проверку, активен ли эскиз и, если он активен, устанавливается ссылка на него. Определить, или эскиз активен, можно, используя свойство ActiveEditObject приложения. Это свойство возвращает объект, который является в настоящее время активным для редактирования (это может быть любой из различных типов документа или эскиз). Если эскиз не активен, появляется сообщение, что эскиз должен быть активен.

If Not TypeOf ThisApplication.ActiveEditObject Is Sketch Then
MsgBox "A sketch must be active."
Exit Sub
End If
' Set a reference to the active sketch.
Dim oSketch As Sketch
Set oSketch = ThisApplication.ActiveEditObject

Объект-коллекция Sketches обеспечивает доступ ко всем существующим эскизам в документе. Через него Вы можете получить любой существующий эскиз и, если Вы знаете его имя, то можете получить доступ к нему непосредственно через использование метода Item коллекции Sketches. Например, код ниже проводит итерацию через все эскизы в документе и печатает их имена.

Dim oSketch As Sketch
For Each oSketch in oPartDoc.ComponentDefinition.Sketches
Debug.Print "Sketch: " & oSketch.Name
Next

Код ниже устанавливает ссылку на эскиз по имени «Sketch2». Если эскиз по имени «Sketch2» не существует в документе part, запрос Item потерпит неудачу. По сообщению можно узнать причину этой ошибки.

' Enable error trapping
On Error Resume Next
Dim oSketch As Sketch
Set oSketch in oPartDoc.ComponentDefinition.Sketches.Item("Sketch2")
If Err Then
Err.Clear
MsgBox "A sketch named ""Sketch2"" does not exist."
End If
' Turn off error trapping
On Error Goto 0

Элементы тела (Features)

Термин “Feature” может сбить с толку, поскольку означает отличительную особенность чего-либо. В 3D параметрическом моделировании на него ссылаются, чтобы выделить этапы  построения модели из особенностей (элементов).

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

Типичным примером элемента (Feature) есть выдавливание (Extrusion). Кроме него есть еще много типов элементов, которые генерируют твердые тела из эскизов или профилей.  Некоторые элементы создаются путем модифицирования существующих твердых тел – например, фаски и сопряжения.  Inventor поддерживает список элементов (и соответствующих им параметров), которые могут быть легко изменены. При этом вся модель пересчитывается с учетом изменений.

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

Объект PartComponentDefinition обеспечивает доступ к коллекции  елементов PartFeatures, которые могут быть применены для детали. В свою очередь, PartFeatures содержит коллекции конкретных типов элементов применяемых для детали.

Ниже приводится пример программного кода, в котором пошагово создается твердое тело выдавливанием треугольного профиля.

Public Sub Features ()
Dim oApp As Inventor.Application
Set oApp = ThisApplication
Dim oPartDoc As PartDocument
Set oPartDoc = oApp.Documents.Add(kPartDocumentObject, oApp.GetTemplateFile(kPartDocumentObject))
Dim oSketch As PlanarSketch
Set oSketch = oPartDoc.ComponentDefinition.Sketches.Add(oPartDoc.ComponentDefinition.WorkPlanes.Item(3))
Dim oTG As TransientGeometry
Set oTG = oApp.TransientGeometry
Dim oSkPnts As SketchPoints
Set oSkPnts = oSketch.SketchPoints
Call oSkPnts.Add(oTG.CreatePoint2d(0, 0), False)
Call oSkPnts.Add(oTG.CreatePoint2d(1, 0), False)
Call oSkPnts.Add(oTG.CreatePoint2d(1, 1), False)
Dim oLines As SketchLines
Set oLines = oSketch.SketchLines
Dim oLine(1 To 3) As SketchLine
Set oLine(1) = oLines.AddByTwoPoints(oSkPnts(1), oSkPnts(2))
Set oLine(2) = oLines.AddByTwoPoints(oSkPnts(2), oSkPnts(3))
Set oLine(3) = oLines.AddByTwoPoints(oSkPnts(3), oSkPnts(1))
Dim oProfile As Profile
Set oProfile = oSketch.Profiles.AddForSolid
Dim oExtFeature As ExtrudeFeature
Set oExtFeature = oPartDoc.ComponentDefinition.Features.ExtrudeFeatures.AddByDistanceExtent _
(oProfile, 1#, kSymmetricExtentDirection, kJoinOperation)
oApp.ActiveView.Fit
End Sub

Следующий пример демонстрирует создание твердого тела  путем вращения профиля вокруг оси:

Public Sub Tor()
Dim oApp As Inventor.Application
Set oApp = ThisApplication
Dim oPartDoc As PartDocument
Set oPartDoc = oApp.Documents.Add(kPartDocumentObject, oApp.GetTemplateFile(kPartDocumentObject))
Dim oSketch As PlanarSketch
Set oSketch = oPartDoc.ComponentDefinition.Sketches.Add(oPartDoc.ComponentDefinition.WorkPlanes.Item(3))
Dim oTG As TransientGeometry
Set oTG = oApp.TransientGeometry
Dim oSkPnts As SketchPoints
Set oSkPnts = oSketch.SketchPoints
Call oSkPnts.Add(oTG.CreatePoint2d(0, 0), False)
Call oSkPnts.Add(oTG.CreatePoint2d(1, 1), False)
Call oSkPnts.Add(oTG.CreatePoint2d(1, 0), False)
Dim oLines As SketchLines
Set oLines = oSketch.SketchLines
Dim oLine As SketchLine
Set oLine = oLines.AddByTwoPoints(oSkPnts(1), oSkPnts(2))
Dim oCircs As SketchCircles
Set oCircs = oSketch.SketchCircles
Dim oCirc As SketchCircle
Set oCirc = oCircs.AddByCenterRadius(oSkPnts(3), 0.5)
Dim oProfile As Profile
Set oProfile = oSketch.Profiles.AddForSolid
Dim oRevFeature As RevolveFeature
Set oRevFeature = oPartDoc.ComponentDefinition.Features.RevolveFeatures.AddFull _
(oProfile, oLine, kJoinOperation)
oApp.ActiveView.Fit
End Sub

Рабочие элементы (Work Features)

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

  • рабочие точки (WorkPoint);
  • рабочие оси (WorkAxis);
  • рабочие плоскости (WorkPlane).

Для каждого вида рабочих элементов в API предусмотрены соответствующие коллекции – WorkPoints, WorkAxes и WorkPlanes.

В диалоговом режиме вся необходимая для создания рабочей геометрии информация извлекается из типов выделенных объектов, из их взаимного расположения и из последовательности, в которой они были выделены пользователем. Подобная информация разработчику API  не предоставляется. Поэтому в базовые объекты рабочих элементов (точка, ось, плоскость) введен промежуточный определяющий объект (definition object), однозначно описывающий контекст рождения элемента. Например, для создания рабочей точки (WorkPoint) как точки пересечения трех плоскостей используется определяющий объект ThreePlanesWorkPointDef. Этот подвид рабочих точек создается вызовом метода AddByThreePlanes коллекции WorkPoints с тремя плоскостями в качестве аргументов.

При задании аргументов API обычно предоставляет некоторую свободу. Рабочие элементы могут размещаться с использованием прямоугольных и круговых массивов, к ним применимы операции зеркального отображения. Чтобы выяснить, не является ли элемент частью массива (а значит, не может индивидуально редактироваться), у объектов WorkAxis, WorkPoint и WorkPlane имеется метод IsPatternElement.

Особенностью коллекций рабочих элементов WorkPoints, WorkAxes, WorkPlanes является то, что они НИКОГДА не бывают пустыми. По умолчанию каждая из них содержит точку начала координат, базовые оси или базовые рабочие плоскости. Например, в коллекции WorkAxes всегда первые три элемента являются базовыми рабочими осями X, Y, и Z с номерами 1, 2 и 3, соответственно.

Следующий программный код создает 2 рабочие точки, рабочую ось и рабочую плоскость.

Public Sub WorkFeatures()
Dim oPartDoc As PartDocument
Set oPartDoc = ThisApplication.ActiveDocument
Dim oPartCompDef As PartComponentDefinition
Set oPartCompDef = oPartDoc.ComponentDefinition
Dim oTrans As TransientGeometry
Set oTrans = ThisApplication.TransientGeometry
Dim oPnt As Point
Set oPnt = oTrans.CreatePoint(2, 3, 4)
Dim oWorkPoint1 As WorkPoint
Set oWorkPoint1 = oPartCompDef.WorkPoints.AddFixed(oPnt, False)
Dim oWorkPoint2 As WorkPoint
Set oPnt = oTrans.CreatePoint(0, 0, 0)
Set oWorkPoint2 = oPartCompDef.WorkPoints.AddFixed(oPnt, False)
Dim oWorkAxis As WorkAxis
Set oWorkAxis = oPartCompDef.WorkAxes.AddByTwoPoints(oWorkPoint1, oWorkPoint2, False)
Dim oWorkPlane As WorkPlane
Set oWorkPlane = oPartCompDef.WorkPlanes.AddByLinePlaneAndAngle _
(oWorkAxis, oPartCompDef.WorkPlanes.Item("YZ Plane"), 45, False)
oWorkPlane.Name = "MyFirstWorkPlane"
End Sub

Метод AddByLinePlaneAndAngle создает рабочую плоскость, проходящую через заданную прямую Line под углом Angle к указанной плоскости Plane.

Граничное представление тела (Boundary Representation, B-Rep)

Твердое тело в Инвенторе представлено описанием границ этого тела (Boundary Representation, B-Rep). Структура данных B-Rep является описанием совокупности связанных поверхностей, формирующих внешнюю границу объема тела. И хотя модель представляется нам твердотельной (мы можем что-нибудь из нее вырезать, определить весовые характеристики, проводить расчеты и иные характерные для твердых тел операции), в действительности это лишь набор поверхностей. Связность поверхностей относится к области топологии, и в модели B-Rep для этих задач предусмотрены необходимые инструменты. Диаграмма объектной модели BRep показана на рисунке.

На рисунке ниже приведена простая модель твердого тела, которая будет использована для иллюстрации B-Rep концепций.

Поверхности

С точки зрения API твердое тело описывается объектом SurfaceBody. Несмотря на то, что в его имени присутствует слово «поверхность» (“Surface”), объект SurfaceBody является обобщенным объектом, представляющим любой высокоуровневый объект B-Rep, включая и твердые, и поверхностные тела. Основное отличие твердотельной модели заключается в том, что она формируется замкнутой совокупностью поверхностей. Каждая ограничивающая тело поверхность в объекте SurfaceBody представлена объектом Face (грань). Как видно из рисунка ниже, в нашем примере границы тела сформированы восемью гранями. Объект Face поддерживает грани произвольной геометрии, независимо от их формы.

Ребра и вершины

Для формирования твердотельной модели недостаточно иметь ограничивающие тело поверхности. Важно, чтобы они были связанными между собой. Контакт между гранями описывается объектом Edge (ребро) и геометрически представлен некоторой кривой. Каждая грань «знает» ограничивающие ее ребра, и каждое ребро «знает», какие две грани оно соединяет. Другим полезным для программиста элементом топологии являются замкнутые контуры (loop). В объектной модели API они представлены объектом EdgeLoop. В общем случае замкнутый контур формируется группой последовательно соединенных ребер. На рисунке ниже одна грань имеет границы в виде двух замкнутых контуров. Внутренний контур в центре грани сформирован из одного круглого ребра. Внешний контур состоит из четырех прямолинейных рёбер. Замкнутые контуры образуют границы граней.

Другим распространенным объектом B-Rep является объект Vertex (вершина). Вершины существуют на концах любого ребра и описывают точки контакта между ребрами. Всякое ребро «знает» вершины на своих концах, и всякая вершина «знает», какие ребра в этой вершине соединены.

Объект FaceShell

Еще одним, хотя и не слишком часто применяемым объектом B-Rep, является FaceShell. В Inventor вполне возможна ситуация, когда тело (solid) оказывается состоящим более чем из одной части. Пример такого тела приведен на рисунке.

Тело слева состоит из одной части. Справа то же тело разделилось на две части в результате увеличения диаметра центрального отверстия. Несмотря на то, что визуально модель оказалась разделенной надвое, с точки зрения API она по-прежнему остается моделью одного тела и представлена одним объектом SurfaceBody. Однако, каждый «осколок» представлен своим собственным объектом FaceShell. Большинство деталей имеют лишь один объект FaceShell, но, как видим, их может быть и больше. Другим примером может служить полый шар, сформированный двумя концентрическими сферическими поверхностями. В целом шар является одним телом и представлен одним объектом SurfaceBody, но внешняя и внутренняя сферические поверхности имеют свои собственные объекты FaceShell. Если в таком шаре просверлить отверстие, которое соединит внешнюю и внутреннюю сферы, то грани объединятся, и останется только один объект FaceShell.

Просмотр BRep иерархии с помощью объекта SurfaceEvaluator

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

Public Sub BRep ()
Dim oPartDef As PartComponentDefinition
Set oPartDef = ThisApplication.ActiveDocument.ComponentDefinition
Dim oSurfaceBody As SurfaceBody
Dim oFace As Face
For Each oSurfaceBody In oPartDef.SurfaceBodies
For Each oFace In oSurfaceBody.Faces
If oFace.SurfaceType = kPlaneSurface Then
Dim oEval As SurfaceEvaluator
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 oSketch As PlanarSketch
Set oSketch = oPartDef.Sketches.Add(oFace)
Dim oPoint2D As Point2d
Set oPoint2D = oSketch.ModelToSketchSpace(oPoint)
Dim oSkPnt As SketchPoint
Set oSkPnt = oSketch.SketchPoints.Add(oPoint2D)
End If
Next
Next
End Sub

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

Задание 1

Разработать  VBA приложения для создания  деталей автомобиля: ось, колесо и корпус. Размеры деталей указаны на чертеже.

Размеры на чертеже указаны в мм, как это принято в стандартах . Размеры в документе Inventor по умолчанию указываются в см, т.е., на чертеже размер 100 (длина оси),  в документе Inventor он соответствует 1000 (100 см) .  В Inventor можно явно указывать размерность, обрамляя число с размерностью в кавычки «100 мм». При выполнении заданий в программах будем использовать размерные числа, которые взяты непосредственно из чертежей (без указания размерности).

При выполнении задания обратите внимание на то, чтобы детали на чертеже были расположены в соответствии с их положением на сборке.

При разработке приложений используйте фрагменты программ, которые наиболее близки по содержанию к заданию.

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

Начните с разработки приложений для деталей ось (Axle) и колесо (Wheel). Для этих деталей по содержанию наиболее близка программа из раздела Профили. Также рекомендуется ознакомиться с описанием программ из  разделов Пример создания модели детали и Элементы тела (Features).

Разработку приложения для детали корпус (Body) начните с создания основы тела (без пазов и выпуклостей).  Фрагмент кода для создания основы профиля корпусной детали (Body) берется из приложения в разделе Особенности эскизирования. Как выдавливается профиль отражено в приложении из раздела Элементы тела (Features).

В основании корпусной детали на угловых ребрах размещены цилиндрические пазы для совмещения с осями колесных пар. Профили окружностей для этих пазов создаются на том же эскизе, что и основной профиль. К центрам окружностей применяется ограничения совпадения (Coincident) с нижними угловыми точками основного профиля корпусной детали.

Выдавливание цилиндров реализуется аналогично с созданием основы тела, но при этом в методе ExtrudeFeatures.AddByDistanceExtent  вместо константы kJoinOperation используется константа kCutOperation. Перед выдавливанием необходимо подавить основной профиль методом oProfPath.Delete (см. приложение из раздела Профили). Если этого не выполнить, то вместе с цилиндрами вырезается и созданная  перед этим основа тела.

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

Задание 2

Разработать программное приложение для создания пространственной модели детали в соответствии с вариантом задания. При этом обеспечить возможность контроля геометрических условий при формировании эскиза. Разработать приложение для создания чертежа детали на основе пространственной модели (см. Создание вида детали).

Примеры программной реализации  приводятся ниже:

Пример 1. Моделирование детали для варианта №7

Public Sub Model()
'Создать новый документ детали, используя шаблон за умолчанием.
 Dim oPartDoc As PartDocument
 Set oPartDoc = ThisApplication.Documents.Add(kPartDocumentObject, _
 ThisApplication.FileManager.GetTemplateFile(kPartDocumentObject))
 'Установить ссылку на определение компонента.
 Dim oCompDef As PartComponentDefinition
 Set oCompDef = oPartDoc.ComponentDefinition
 'Создать новый эскиз на рабочей плоскости X-Y. Поскольку он создается
 'на одной из рабочих плоскостей мы знаем его ориентацию, и 
 'положение начальной точки(0,0,0) в пространстве модели.
 Dim oSketch As PlanarSketch
 Set oSketch = oCompDef.Sketches.Add(oCompDef.WorkPlanes(3))
 'Установить ссылку на объект вспомогательной геометрии
 Dim oTransGeom As TransientGeometry
 Set oTransGeom = ThisApplication.TransientGeometry
 ' создать прямоугольник 64х34
 Dim oRectangleLines As SketchEntitiesEnumerator
 Set oRectangleLines = oSketch.SketchLines.AddAsTwoPointRectangle( _
 oTransGeom.CreatePoint2d(-32, -17), _
 oTransGeom.CreatePoint2d(32, 17))
'Создать профиль (из прямоугольника)
 Dim oProfile As Profile
 Set oProfile = oSketch.Profiles.AddForSolid
 ' Создать экструзию (ExtrudeFeature) с толщиной 54.
 Dim oExtrudeDef As ExtrudeDefinition
 Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile, kJoinOperation)
 Call oExtrudeDef.SetDistanceExtent(54, kPositiveExtentDirection)
 Dim oExtrude As ExtrudeFeature
 Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
 ' Получить грань экструзии для создания нового эскиза.
 Dim oFrontFace As Face
 Set oFrontFace = oExtrude.StartFaces.Item(1)
 'Создать новый эскиз на этой грани методом, который
 'контролирует его ориентацию
 Set oSketch = oCompDef.Sketches.AddWithOrientation(oFrontFace, _
 oCompDef.WorkAxes.Item(1), True, True, oCompDef.WorkPoints(1))
 ' Определяем в пространстве эскиза точку.
 Dim oCorner As Point2d
 Set oCorner = oSketch.ModelToSketchSpace(oTransGeom.CreatePoint(-15, 15, 0))
 'Создать прямоугольник 44 х 48 
 Set oRectangleLines = oSketch.SketchLines.AddAsTwoPointRectangle( _
 oTransGeom.CreatePoint2d(-22, -24), _
 oTransGeom.CreatePoint2d(22, 24))
 'Создать профиль (из прямоугольника)
 Set oProfile = oSketch.Profiles.AddForSolid
 'Создать экструзию (ExtrudeFeature) с толщиной 38
 Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile, kJoinOperation)
 Call oExtrudeDef.SetDistanceExtent(38, kNegativeExtentDirection)
 Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
 'Создать новый эскиз и окружность в нем радиусом 22
 Set oSketch = oCompDef.Sketches.Add(oCompDef.WorkPlanes(2))
 Dim oCircle1 As SketchCircle
 Set oCircle1 = oSketch.SketchCircles.AddByCenterRadius( _
 oTransGeom.CreatePoint2d(0, 38), 22)
 'Создать профиль (из окружности)
 Set oProfile = oSketch.Profiles.AddForSolid
 'Создать экструзию (ExtrudeFeature) с толщиной 48
 Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile, kJoinOperation)
 Call oExtrudeDef.SetDistanceExtent(48, kSymmetricExtentDirection)
 Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
 ' Создать новый эскиз и окружность в нем радиусом 14 
 Set oSketch2 = oCompDef.Sketches.Add(oCompDef.WorkPlanes(2))
 Dim oCircle2 As SketchCircle
 Set oCircle2 = oSketch2.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(0, 38), 14)
 Set oProfile = oSketch2.Profiles.AddForSolid
 'Создать экструзию (ExtrudeFeature) с толщиной 48.
 Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile, kCutOperation)
 Call oExtrudeDef.SetDistanceExtent(48, kSymmetricExtentDirection)
 Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
 'Создать эскиз и прямоугольник 32*14
 Set oSketch3 = oCompDef.Sketches.Add(oCompDef.WorkPlanes(2))
 Dim oRectangleLines1 As SketchEntitiesEnumerator
 Set oRectangleLines1 = oSketch3.SketchLines.AddAsTwoPointRectangle( _
 oTransGeom.CreatePoint2d(-16, 0), _
 oTransGeom.CreatePoint2d(16, 14))
 Set oProfile = oSketch3.Profiles.AddForSolid
 'Создать экструзию (ExtrudeFeature) с толщиной 48
 Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile, kCutOperation)
 Call oExtrudeDef.SetDistanceExtent(48, kSymmetricExtentDirection)
 Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
'Создать новый эскиз и окружность радиусом 10 в нем
 Set oSketch4 = oCompDef.Sketches.Add(oCompDef.WorkPlanes(1))
 Dim oCircle3 As SketchCircle
 Set oCircle3 = oSketch4.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(0, 38), 10)
 Set oProfile = oSketch4.Profiles.AddForSolid
 'Создать экструзию (ExtrudeFeature) с толщиной 64
 Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile, kCutOperation)
 Call oExtrudeDef.SetDistanceExtent(64, kSymmetricExtentDirection)
 Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
 ' Создать новый эскиз и прямоугольник в нем 20*6.
 Set oSketch5 = oCompDef.Sketches.Add(oCompDef.WorkPlanes(1))
 Dim oRectangleLines2 As SketchEntitiesEnumerator
 Set oRectangleLines2 = oSketch5.SketchLines.AddAsTwoPointRectangle( _
 oTransGeom.CreatePoint2d(-10, 0), _
 oTransGeom.CreatePoint2d(10, 6))
 Set oProfile = oSketch5.Profiles.AddForSolid
 'Создать экструзию (ExtrudeFeature) с толщиной 64
 Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile, kCutOperation)
 Call oExtrudeDef.SetDistanceExtent(64, kSymmetricExtentDirection)
 Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
 'Создать новый эскиз и 2 симметричных окружности радиусом 10 в нем 
 Set oSketch6 = oCompDef.Sketches.Add(oCompDef.WorkPlanes(3))
 Dim oCircle4 As SketchCircle
 Set oCircle4 = oSketch6.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(-25, 0), 4)
 Dim oCircle5 As SketchCircle
 Set oCircle5 = oSketch6.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(25, 0), 4)
 Set oProfile = oSketch6.Profiles.AddForSolid
 'Создать экструзию (ExtrudeFeature) с толщиной 110
 Set oExtrudeDef = oCompDef.Features.ExtrudeFeatures.CreateExtrudeDefinition(oProfile, kCutOperation)
 Call oExtrudeDef.SetDistanceExtent(110, kSymmetricExtentDirection)
 Set oExtrude = oCompDef.Features.ExtrudeFeatures.Add(oExtrudeDef)
ThisApplication.ActiveView.Fit
End Sub

Пример 2. Моделирование детали для варианта №19

Public Sub Model()

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(1))
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(74, 0)
Dim oLines(1 To 5) As SketchLine
Set oLines(1) = oSketch.SketchLines.AddByTwoPoints(oCoord1, oCoord2)
Set oCoord1 = oTransGeom.CreatePoint2d(74, 28)
Set oLines(2) = oSketch.SketchLines.AddByTwoPoints(oLines(1).EndSketchPoint, oCoord1)
Set oCoord1 = oTransGeom.CreatePoint2d(34, 28)
Set oLines(3) = oSketch.SketchLines.AddByTwoPoints(oLines(2).EndSketchPoint, oCoord1)
Set oCoord1 = oTransGeom.CreatePoint2d(0, 20)
Set oLines(4) = oSketch.SketchLines.AddByTwoPoints(oLines(3).EndSketchPoint, oCoord1)
Set oLines(5) = oSketch.SketchLines.AddByTwoPoints(oLines(4).EndSketchPoint, oLines(1).StartSketchPoint)

Call oSketch.GeometricConstraints.AddHorizontal(oLines(1))
Call oSketch.GeometricConstraints.AddPerpendicular(oLines(1), oLines(2))
Call oSketch.GeometricConstraints.AddPerpendicular(oLines(2), oLines(3))
Call oSketch.GeometricConstraints.AddPerpendicular(oLines(3), oLines(5))

Dim oProfile As Profile
Set oProfile = oSketch.Profiles.AddForSolid
Dim oExtFeature As ExtrudeFeature
Set oExtFeature = oPartDoc.ComponentDefinition.Features.ExtrudeFeatures.AddByDistanceExtent _
(oProfile, 42#, kSymmetricExtentDirection, kJoinOperation)

Set oSketch = oCompDef.Sketches.Add(oCompDef.WorkPlanes(3))

Set oCoord1 = oTransGeom.CreatePoint2d(15, 39)
Set oCoord2 = oTransGeom.CreatePoint2d(15, 69)
Set oLines(1) = oSketch.SketchLines.AddByTwoPoints(oCoord1, oCoord2)
Set oCoord1 = oTransGeom.CreatePoint2d(-15, 69)
Set oLines(2) = oSketch.SketchLines.AddByTwoPoints(oLines(1).EndSketchPoint, oCoord1)
Set oCoord1 = oTransGeom.CreatePoint2d(-15, 39)
Set oLines(3) = oSketch.SketchLines.AddByTwoPoints(oLines(2).EndSketchPoint, oCoord1)
Set oLines(4) = oSketch.SketchLines.AddByTwoPoints(oLines(3).EndSketchPoint, oLines(1).StartSketchPoint)
Set oLines(5) = oSketch.SketchLines.AddByTwoPoints(oLines(1).StartSketchPoint, oLines(3).StartSketchPoint)
Set oCoord1 = oLines(5).Geometry.MidPoint

Call oSketch.GeometricConstraints.AddVertical(oLines(1))
Call oSketch.GeometricConstraints.AddPerpendicular(oLines(1), oLines(2))
Call oSketch.GeometricConstraints.AddPerpendicular(oLines(2), oLines(3))
Call oSketch.GeometricConstraints.AddPerpendicular(oLines(3), oLines(4))

Set oProfile = oSketch.Profiles.AddForSolid
Set oExtFeature = oPartDoc.ComponentDefinition.Features.ExtrudeFeatures.AddByDistanceExtent _
(oProfile, 48#, kPositiveExtentDirection, kJoinOperation)

Set oSketch = oCompDef.Sketches.Add(oCompDef.WorkPlanes(3))

Dim oCircle1 As SketchCircle
Set oCircle1 = oSketch.SketchCircles.AddByCenterRadius(oLines(5).Geometry.MidPoint, 10)

Set oCoord1 = oTransGeom.CreatePoint2d(6, 7)
Set oCoord2 = oTransGeom.CreatePoint2d(6, 27)
Set oLines(1) = oSketch.SketchLines.AddByTwoPoints(oCoord1, oCoord2)
Set oCoord1 = oTransGeom.CreatePoint2d(-6, 27)
Set oLines(2) = oSketch.SketchLines.AddByTwoPoints(oLines(1).EndSketchPoint, oCoord1)
Set oCoord1 = oTransGeom.CreatePoint2d(-6, 7)
Set oLines(3) = oSketch.SketchLines.AddByTwoPoints(oLines(2).EndSketchPoint, oCoord1)
Set oLines(4) = oSketch.SketchLines.AddByTwoPoints(oLines(3).EndSketchPoint, oLines(1).StartSketchPoint)

Call oSketch.GeometricConstraints.AddVertical(oLines(1))
Call oSketch.GeometricConstraints.AddPerpendicular(oLines(1), oLines(2))
Call oSketch.GeometricConstraints.AddPerpendicular(oLines(2), oLines(3))
Call oSketch.GeometricConstraints.AddPerpendicular(oLines(3), oLines(4))

Set oProfile = oSketch.Profiles.AddForSolid
Set oExtFeature = oPartDoc.ComponentDefinition.Features.ExtrudeFeatures.AddByDistanceExtent _
(oProfile, 48#, kPositiveExtentDirection, kCutOperation)

Set oSketch = oCompDef.Sketches.Add(oCompDef.WorkPlanes(2))

Set oCircle1 = oSketch.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(0, 0), 15)
Call oSketch.GeometricConstraints.AddGround(oCircle1)
Set oCircle1 = oSketch.SketchCircles.AddByCenterRadius(oTransGeom.CreatePoint2d(0, 38), 6)
Call oSketch.GeometricConstraints.AddGround(oCircle1)

Set oProfile = oSketch.Profiles.AddForSolid
Set oExtFeature = oPartDoc.ComponentDefinition.Features.ExtrudeFeatures.AddByDistanceExtent _
(oProfile, 74#, kPositiveExtentDirection, kCutOperation)

End Sub

 

 

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

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

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