Autodesk Inventor API. Первые шаги/Рабочая геометрия

Материал из Викиучебника — открытых книг для открытого мира

Обзор рабочих элементов API[править]

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

  • рабочие точки 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, соответственно.

Примечание:

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


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


Объектная модель рабочих элементов[править]

Конструкционные рабочие элементы[править]

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


В работе с элементами этого типа следует иметь ввиду одно обстоятельство.

Конструкционная рабочая геометрия, поглощенная конструктивными элементами, автоматически удаляется вместе с этими конструктивными элементами.

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

Рабочие точки[править]

Как следует из объектной модели, коллекция рабочих точек WorkPoints доступна в объектах PartComponentDefinition или AssemblyComponentDefinition.

Коллекция WorkPoints располагает следующими методами создания рабочих точек.


Метод Результат
AddAtCentroid Рабочая точка в центре тяжести заданных объектов Edge, EdgeLoop и EdgeCollection.
AddByCurveAndEntity Рабочая точка в месте пересечения кривой и заданного объекта.
AddByMidPoint Рабочая точка в середине заданного ребра.
AddByPoint Рабочая точка на другой точке.
AddByThreePlanes Рабочая точка в месте пересечения трех плоскостей
AddByTorusCenterPoint Рабочая точка в центре тора, заданного тороидальной гранью
AddByTwoLines Рабочая точка на пересечении двух линий
AddFixed Создается фиксированная рабочая точка в указанном другой точкой месте. В контексте сборки создаваемая точка возвращает определяющий объект типа AssemblyWorkPointDef.

Коллекция WorkPoints никогда не бывает пустой. Первой в коллекции WorkPoints от рождения присутствует рабочая точка начала координат (Origin). Ее подтип — всегда kFixedWorkPoint. Тип и номер этой рабочей точки изменены быть не могут.

Information

В версии Autodesk Inventor 2008 метод AddFixed является единственным методом создания рабочих точек в документе сборки.


Фиксированная рабочая точка[править]

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

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

'Создание фиксированной рабочей точки в документе детали.
'Тип kFixedWorkPoint
'Перед выполнением активировать документ детали.

Public Sub WorkPoint_01()
   
   ' Создание ссылки на активную деталь
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Ссылка на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   ' Создание ссылки на координаты создаваемой точки (10,10,10) мм
   ' Координаты в API измеряются в сантиметрах !
   Dim oPoint As Point
   Set oPoint = oTG.CreatePoint(1, 1, 1)
   
   ' Создание рабочей точки в указанных координатах oPoint
   Dim oWorkPoint As WorkPoint
   Set oWorkPoint = oPartCompDef.WorkPoints.AddFixed(oPoint, False)

End Sub

Аргумент False у метода AddFixed означает, что создаваемая рабочая точка не должна рассматриваться как вспомогательная конструкционная и, следовательно, будет отображаться в дереве построения в той же манере, как и рабочие точки, созданные пользователем вручную. Если же второму аргументу в методе AddFixed присвоить значение True, то будет создана конструкционная рабочая точка. Таким точкам нельзя присвоить имя и они не отображаются в дереве построения, однако доступны программе через вызовы API.


Код вставки рабочей точки в сборку практически ничем не отличается от случая детали. В случае сборки коллекция рабочих точек будет иметь родителя в виде объекта AssemblyComponentDefinition, а не PartComponentDefinition.

'Создание фиксированной рабочей точки в документе сборки.
'Тип kFixedWorkPoint
'Перед выполнением активировать документ детали.

Public Sub WorkPoint_02()

   ' Создание ссылки активную сборку
   Dim oAsmDoc As AssemblyDocument
   Set oAsmDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа сборки
   Dim oAsmCompDef As AssemblyComponentDefinition
   Set oAsmCompDef = oAsmDoc.ComponentDefinition
   
   ' Ссылка на вспомогательную геометрию.
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   ' Создание ссылки на координаты создаваемой точки (10,10,10) мм
   ' Координаты в API измеряются в сантиметрах !
   Dim oPoint As Point
   Set oPoint = oTG.CreatePoint(1, 1, 1)
   
   ' Создание рабочей точки с заданными координатами в сборке
   Dim oWorkPoint As WorkPoint
   Set oWorkPoint = oAsmCompDef.WorkPoints.AddFixed(oPoint)

End Sub


Более того, можно воспользоваться более общими классами — Document и ComponentDefinition. Объекты PartDocument и AssemblyDocument являются наследниками Document, а PartComponentDefinition и AssemblyComponentDefinition — наследниками объекта ComponentDefinition. Конкретный тип объектов будет определен во время исполнения программы.

Ниже приведен более универсальный вариант той же процедуры. Этот код может исполняться как в контексте детали, так и в контексте сборки.

Public Sub WorkPoint_03()

   ' Создание ссылки активный документ
   Dim oDoc As Document
   Set oDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа
   Dim oCompDef As ComponentDefinition
   Set oCompDef = oDoc.ComponentDefinition
   
   ' Ссылка на вспомогательную геометрию.
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   ' Создание ссылки на координаты создаваемой точки (10,10,10) мм
   ' Координаты в API измеряются в сантиметрах !
   Dim oPoint As Point
   Set oPoint = oTG.CreatePoint(1, 1, 1)
   
   ' Создание рабочей точки с заданными координатами
   Dim oWorkPoint As WorkPoint
   Set oWorkPoint = oCompDef.WorkPoints.AddFixed(oPoint)

End Sub
Information

В версии Autodesk Inventor 2008 метод AddFixed является единственным методом создания рабочих точек в документе сборки.



Перемещение фиксированной рабочей точки[править]

Положение фиксированной рабочей точки в пространстве контролируется ее определяющим объектом (definition object). Он обеспечивает доступ к координатам, с которыми ассоциирована рабочая точка. Для изменения этих координат следует воспользоваться свойством WorkPoint.Definition, чтобы получить ссылку на определяющий объект рабочей точки.

Какой именно объект вернет свойство Definition, зависит от способа, которым была создана рабочая точка. Свойство Definition фиксированной рабочей точки в документе детали вернет объект FixedWorkPointDef, а в случае точки в сборке — объект AssemblyWorkPointDef.

Если в полученном объекте переопределить свойство Point, другими словами, изменить координаты X, Y и Z, рабочая точка будет ассоциирована с новым положением в пространстве, что нам и требуется.


Пример перемещения фиксированной рабочей точки в документе детали из положения (10 мм, 10 мм, 10 мм) в точку (50 мм, 0, 0):

'Создание с последующим перемещением фиксированной рабочей точки.
'Перед выполнением примера активировать документ детали.

Public Sub WorkPoint_04()
   
   ' Ссылка на активную деталь
   Dim oDoc As PartDocument
   Set oDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на вспомогательную геометрию.
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   ' Создание ссылки на координаты создаваемой точки (10,10,10) мм
   ' Координаты в API измеряются в сантиметрах !
   Dim oPoint As Point
   Set oPoint = oTG.CreatePoint(1, 1, 1)
   
   ' Создание рабочей точки в указанных координатах oPoint
   ' Имя ей будет присвоено автоматически.
   Dim oWorkPoint As WorkPoint
   Set oWorkPoint = oDoc.ComponentDefinition.WorkPoints.AddFixed(oPoint)
   
   

   ' Приступим к перемещению существующей фиксированной рабочей точки
   
   If oWorkPoint.DefinitionType = kFixedWorkPoint Then
   
      ' Извлекаем из рабочей точки ее определение (definition object)
      ' Этот объект обеспечивает доступ к координатам,
      ' ассоциированным с рабочей точкой.
      ' В случае фиксированной рабочей точки в документе детали
      ' метод вернет объект FixedWorkPointDef
      
      Dim oWPDef As FixedWorkPointDef
      Set oWPDef = oWorkPoint.Definition
   
      ' В задающий объект фиксированной рабочей точки
      ' вводим новые координаты (50 мм, 0, 0)
      oWPDef.Point = oTG.CreatePoint(5, 0, 0)
   
   End If

End Sub


Пример перемещения фиксированной рабочей точки в сборке:

' Создание в сборке фиксированной рабочей точки
' и ее последующее перемещение в новое положение.
' Перед выполнением примера активировать документ сборки.


Public Sub WorkPoint_05()

   ' Создание ссылки активную сборку
   Dim oAsmDoc As AssemblyDocument
   Set oAsmDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   ' Создание в сборке рабочей точки в координатах (0,0,0).
   ' Это должно быть сделано методом AddFixed.
   Dim oWP As WorkPoint
   Set oWP = oAsmDoc.ComponentDefinition.WorkPoints. _
                        AddFixed(oTG.CreatePoint(0, 0, 0))
   
   
   ' Получим из рабочей точки ее определяющий
   ' объект (definition object). Он обеспечивает доступ
   ' к информации, ассоциированной с рабочей точкой.
   ' В данном случае возвращаемым значением
   ' будет AssemblyWorkPointDef
   
   Dim oAsmWPDef As AssemblyWorkPointDef
   Set oAsmWPDef = oWP.Definition
   
   ' В определяющем объекте рабочей точки
   ' Переопределяем ее координаты на (20 мм, 0, 0 )
   oAsmWPDef.Point = oTG.CreatePoint(2, 0, 0)

End Sub


Тип определяющего объекта рабочей точки можно выяснить с помощью ее свойства WorkPoint.DefinitionType. Оно возвращает значение из множества WorkPointDefinitionEnum.

В справочной системе Autodesk Inventor 2008 API можно найти сводку констант идентификации типов определяющего объекта рабочих точек:

Константа Описание
kThreePlanesWorkPoint Рабочая точка в пересечении трех плоскостей
kTwoLinesWorkPoint Рабочая точка в пересечении двух копланарных линий
kLineAndFaceWorkPoint Рабочая точка на пересечении линии и грани (Line and face work point definition).
kPointWorkPoint Рабочая точка в точке
kMidPointWorkPoint Рабочая точка в средней точке ребра
kCurveAndEntityWorkPoint Рабочая точка в пересечении объекта с кривой (Curve and entity work point definition).
kFixedWorkPoint Фиксированная рабочая точка
kAssemblyWorkPoint Рабочая точка в сборке
kNonLinearEdgeWorkPoint Рабочая точка на нелинейном ребре (Non linear edge work point definition)
kTorusCenterPointWorkPoint Рабочая точка в центре тора
kCentroidWorkPoint Рабочая точка в центре тяжести множества объектов Edge, EdgeLoop и EdgeCollection.

Рабочая точка на середине ребра[править]

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

Активируйте новый документ детали и создайте в нем прямоугольный параллелепипед.

'Предварительно создайте деталь в виде кубика
'
Public Sub WorkPoint_06()

   ' Ссылка на документ активной детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   'Ссылка на поверхностное тело #1
   Dim oSurfaceBody As SurfaceBody
   Set oSurfaceBody = oPartCompDef.SurfaceBodies.Item(1)
   
   ' Создание ссылки на ребро #2
   Dim oEdge As Edge
   Set oEdge = oSurfaceBody.Edges.Item(2)
   
   ' Создание рабочей точки на середине ребра
   Dim oWorkPoint As WorkPoint
   Set oWorkPoint = oPartCompDef.WorkPoints.AddByMidPoint(oEdge, False)

End Sub

Метод AddByMidPoint в контексте сборки не работает.


Рабочая точка на пересечении трёх плоскостей[править]

Рабочая точка на пересечении трёх плоскостей создается методом AddByThreePlanes коллекции WorkPoints. Для существования такой точки необходимо и достаточно, чтобы никакие две из этих плоскостей не были параллельны друг другу.

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

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


Метод AddByThreePlanes в контексте сборки не работает (до версии r2008 включительно).


Для работы программы требуется параллелепипед, у которого скетч создан на плоскости XY. В примере создаются рабочие точки на всех гранях параллелепипеда в точках пересечения Перед выполнением примера создайте параллелепипед выдавливанием прямоугольника вдоль оси Z. Программа создаст рабочие точки в точках пересечения базовых плоскостей YZ и XZ с обеими гранями параллелепипеда, которые перпендикулярны оси Z.


' Перед выполнением примера создайте
' параллелепипед выдавливанием вдоль оси Z

Public Sub WorkPoint_07()

   ' Создание ссылки на открытую деталь
   Dim oDoc As PartDocument
   Set oDoc = ThisApplication.ActiveDocument
   
   ' базовая рабочая плоскость YZ
   Dim oPlane1 As WorkPlane
   Set oPlane1 = oDoc.ComponentDefinition.WorkPlanes.Item(1)
   
   ' базовая рабочая плоскость XZ
   Dim   As WorkPlane
   Set oPlane2 = oDoc.ComponentDefinition.WorkPlanes.Item(2)
   
   'ссылка на коллекцию граней параллелепипеда
   Dim oFacesCollection
   Set oFacesCollection = oDoc.ComponentDefinition.SurfaceBodies.Item(1).Faces
   
   
   ' найдем все грани, перпендикулярные оси Z
   ' и поставим рабочие точки в точках пересечения
   ' этих граней с плоскостями oPlane1 и oPlane2


   'Единичный вектор в направлении базовой рабочей оси Z
   Dim oZ As UnitVector
   Set oZ = oDoc.ComponentDefinition.WorkAxes(3).Definition.Axis
   
   
   Dim oWorkPoint As WorkPoint
   Dim oFace As Face
   
   ' перебор всех элементов коллекции граней
   For Each oFace In oFacesCollection
      
      'проверка: нормаль к грани параллельна оси Z или нет
      If oFace.Geometry.Normal.IsParallelTo(oZ) Then

         ' Эта грань oFace перпендикулярна оси Z.
         ' Создаем рабочую точку в точке пересечения трех плоскостей.
         
         Set oWorkPoint = oDoc.ComponentDefinition.WorkPoints. _
               AddByThreePlanes(oFace, oPlane(1), oPlane(2))
      End If
   Next

End Sub

Рабочая точка, лежащая на вершине или на эскизной точке[править]

Создание рабочей точки на основе другого точечного объекта обеспечивает метод AddByPoint. На входе допускаются объекты Vertex или SketchPoint.

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

В версиях Autodesk Inventor по r2008 включительно API не поддерживает метод AddByPoint в контексте сборки.


В примере WorkPoint_08 рабочая точка ставится на указанную вершину активной детали.

'Перед выполнением примера создайте параллелепипед

Public Sub WorkPoint_08()

   ' Ссылка на документ активной детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Немного статистики по этой детали
   MsgBox "Количество вершин: " & _
               oPartCompDef.SurfaceBodies.Item(1).Vertices.Count & _
               vbNewLine & _
          "Количество граней: " & _
               oPartCompDef.SurfaceBodies.Item(1).Faces.Count
   
   ' Создание ссылки на вершину #1
   Dim oVertex As Vertex
   Set oVertex = oPartCompDef.SurfaceBodies.Item(1).Vertices.Item(1)
   
   ' Создание рабочей точки на вершине oVertex
   Dim oWorkPoint As WorkPoint
   Set oWorkPoint = oPartCompDef.WorkPoints.AddByPoint(oVertex)
   oWorkPoint.Name = "Вершина #1"

End Sub


Из примера видно, каким образом программа получает доступ к конкретной вершине. Деталь (PartDocument) всегда имеет ссылку на исключительной важности объект PartComponentDefinition — определение всех компонентов этой детали. В свою очередь, PartComponentDefinition включает ссылку на коллекцию поверхностных тел SurfaceBodies, а уже она имеет ссылку на коллекции вершин Vertices и граней Faces каждого поверхностного тела. Свойство Count всякой коллекции выдает количество элементов в коллекции, чем мы и воспользовались для вывода статистики в сообщении для пользователя.

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


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

'Перед выполнением примера создайте параллелепипед

Public Sub WorkPoint_09()

   ' Ссылка на документ активной детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Немного статистики по этой детали
   MsgBox "Количество вершин: " & _
               oPartCompDef.SurfaceBodies.Item(1).Vertices.Count & _
               vbNewLine & _
          "Количество граней: " & _
               oPartCompDef.SurfaceBodies.Item(1).Faces.Count
   

   Dim oVertex As Vertex ' вершина детали
   Dim oWorkPoint As WorkPoint 'рабочая точка на вершине детали
   
   Dim oVerticesColl As Vertices 'коллекция вершин детали
   Set oVerticesColl = oPartCompDef.SurfaceBodies.Item(1).Vertices
   
   Dim i As Long  'счетчик вершин
   i = 0
   
   For Each oVertex In oVerticesColl
      
      i = i + 1  'счетчик вершин увеличиваем на единицу
      
      'Создание ссылки на вершину #i
      Set oVertex = oVerticesColl.Item(i)
      
      'Создание рабочей точки на вершине oVertex
      Set oWorkPoint = oPartCompDef.WorkPoints.AddByPoint(oVertex, False)
      
      'переименование очередной рабочей точки
      oWorkPoint.Name = "Вершина #" & i
      
   Next

End Sub

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


Пример WorkPoint_10 демонстрирует вариант создания рабочей точки на указанной методу AddByPoint эскизной точке в плоском эскизе.

Public Sub WorkPoint_10()
   
   ' Ссылка на документ активной детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   'создание ссылки на первый эскиз в детали
   Dim oSketch As PlanarSketch
   Set oSketch = oPartCompDef.Sketches.Item(1)
   
   ' Создание ссылки на эскизную точку #3 в эскизе
   Dim oSketchPoint As SketchPoint
   Set oSketchPoint = oSketch.SketchPoints.Item(3)
   
   ' Создание рабочей точки на эскизной точке
   Dim oWorkPoint As WorkPoint
   Set oWorkPoint = oPartCompDef.WorkPoints.AddByPoint(oSketchPoint, False)

End Sub

Рабочая точка на пересечении двух линий[править]

Рабочую точку на пересечении двух линий создает метод AddByTwoLines. Есл заданные линейные объекты параллельны, будет сгенерирована ошибка. Метод не работает в сборках.

В качестве допустимых аргументов рассматриваются объекты ребро Edge, рабочая ось WorkAxis и эскизная линия SketchLine.


Пример WorkPoint_11 демонстрирует технику создания рабочих точек на пересечении линий. Создайте параллелепипед и выполните пример. Буду созданы рабочие точки на всех пересечениях ребер параллелепипеда и базовой оси Х системы координат детали.

Public Sub WorkPoint_11()

   ' Ссылка на документ активной детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Создание ссылки на базовую рабочую ось X
   Dim oAxis As WorkAxis
   Set oAxis = oPartCompDef.WorkAxes(1)
   oAxis.Visible = True    'делаем рабочую ось Х видимой
   
   
   Dim oEdge As Edge             ' ребро параллелепипеда
   Dim oWorkPoint As WorkPoint   ' рабочая точка
   
   'цикл по всем ребрам детали
   
   'Если точка пересечения оси Х и линии ребра найдена,
   '  ставится рабочая точка.
   'Если нет, то благодаря перехвату ошибки программа
   '  переходит к следующему ребру.
   
   For Each oEdge In oPartCompDef.SurfaceBodies.Item(1).Edges
      
      On Error Resume Next
      
      ' Создание рабочей точки на пересечении ребра и оси Х
      Set oWorkPoint = oPartCompDef.WorkPoints.AddByTwoLines(oEdge, oAxis)
   
   Next
   
   On Error GoTo 0
   
End Sub


Рабочая точка на пересечении кривой с поверхностью[править]

Метод AddByCurveAndEntity предназначен для построения рабочей точки в месте пересечения кривой Curve и поверхности Entity.

Синтаксис и типы аргументов метода AddByCurveAndEntity заслуживают некоторого внимания.

Public Function AddByCurveAndEntity( _
   ByVal Curve As Object, _
   ByVal Entity As Object, _
   Optional ByVal ProximityPoint As Variant, _
   Optional ByVal Construction As Boolean = False _
) As WorkPoint

Curve — ребра, одномерные объекты в 2D или 3D эскизах.
Entity — грань либо рабочая плоскость.

В текущей версии Инвентора (R2008) у метода AddByCurveAndEntity имеется ряд ограничений на сочетание типов входных аргументов:

  • Если входной аргумент Curve представляет собой линейный объект, то Entity может быть гранью любого типа или рабочей плоскостью.
  • Если же Curve представляет собой нелинейный объект, то Entity ДОЛЖЕН быть плоским объектом — плоской гранью, либо рабочей плоскостью.

ProximityPoint — точка в пространстве. Требуется в случаях, когда возможны несколько точек пересечения. Например, окружность может пересечь плоскость дважды, а сплайн — в многих точках. Если этот аргумент указан, то в качестве точки пересечения будет возвращена ближайшая к ProximityPoint точка. Если ProximityPoint не задана, а найдено несколько точек пересечения, то метод AddByCurveAndEntity вернет одно из решений, выбранное случайным образом.

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

В версиях Autodesk Inventor по r2008 включительно API не поддерживает метод AddByPoint в контексте сборки.


Пример WorkPoint_12 проставляет рабочие точки в местах пересечения базовой рабочей оси Z с плоскостями граней заданного программе параллелепипеда в активном документе детали.

Public Sub WorkPoint_12()

   ' Ссылка на документ активной детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition

   ' Создание ссылки на ось Z
   Dim oAxis As WorkAxis
   Set oAxis = oPartCompDef.WorkAxes(3)
   oAxis.Visible = True  'делаем ось Z видимой
   
   
   '-----------------------------------------------
   ' найдем все грани, перпендикулярные оси Z,
   ' и поставим рабочие точки в точках пересечения
   ' с осью Z плоскостей этих граней
   '-----------------------------------------------
   
   'Единичный вектор в направлении базовой рабочей оси Z
   Dim oZ As UnitVector
   Set oZ = oPartCompDef.WorkAxes(3).Definition.Axis
   
   'ссылка на коллекцию граней параллелепипеда
   Dim oFacesCollection as Faces
   Set oFacesCollection = oPartCompDef.SurfaceBodies.Item(1).Faces


   Dim oPlane As WorkPlane
   Dim oWorkPoint As WorkPoint
   Dim oFace As face

   'перебор всех элементов коллекции граней
   For Each oFace In oFacesCollection

      'проверка: нормаль к грани параллельна оси Z или нет
      If oFace.Geometry.Normal.IsParallelTo(oZ) Then

         'Эта грань oFace перпендикулярна оси Z.
         
         'Создаем рабочую плоскость на грани и делаем ее видимой
         Set oPlane = oPartCompDef.WorkPlanes. _
                              AddByPlaneAndOffset(oFace, 0, False)
         oPlane.Visible = True
         
         'Создание рабочей точки в точке пересечения плоскости с осью Z
         Set oWorkPoint = oPartCompDef.WorkPoints. _
                              AddByCurveAndEntity(oAxis, oPlane)
            
      End If
   Next

End Sub 


Рабочая точка в центре тяжести объектов Edge, EdgeLoop и EdgeCollection[править]

Метод AddAtCentroid создает рабочую точку в центре тяжести заданных на вход ребер Edge, контуров из ребер EdgeLoop или объекта EdgeCollection.

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

Пример с ребром на входе метода AddAtCentroid:

Public Sub WorkPoint_13 ()

   ' Ссылка на документ активной детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition

   'ссылка на коллекцию ребер параллелепипеда
   Dim oEdges As Edges
   Set oEdges = oPartCompDef.SurfaceBodies.Item(1).Edges
   
   'ссылка на ребро #1
   Dim oEdge As Edge
   Set oEdge = oEdges.Item(1)


   'Создание рабочей точки в центре тяжести ребра
   Dim oWorkPoint As WorkPoint
   Set oWorkPoint = oPartCompDef. _
          WorkPoints.AddAtCentroid(oEdge, False)

End Sub


Пример с замкнутым контуром из ребер на входе метода AddAtCentroid:

Public Sub WorkPoint_14()

   ' Ссылка на документ активной детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition

   'ссылка на контур из ребер #1 на грани #1 поверхностного тела #1
   Dim oEdgeLoop As EdgeLoop
   Set oEdgeLoop = oPartCompDef.SurfaceBodies.Item(1). _
                        Faces.Item(1).EdgeLoops.Item(1)

   'Создание рабочей точки в центре тяжести замкнутого контура из ребер
   Dim oWorkPoint As WorkPoint
   Set oWorkPoint = oPartCompDef. _
          WorkPoints.AddAtCentroid(oEdgeLoop, False)

End Sub


Пример с коллекцией образующих замкнутый контур ребер на входе метода AddAtCentroid:

Public Sub WorkPoint_15()

   ' Ссылка на документ активной детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition

   ' создание EdgeCollection
   Dim oEC As EdgeCollection
   Set oEC = ThisApplication.TransientObjects.CreateEdgeCollection()


   ' ссылка на коллекцию ребер детали
   Dim oEdges As Edges
   Set oEdges = oPartCompDef.SurfaceBodies.Item(1).Edges
   
   
   Dim oEdge As Edge
   
   Set oEdge = oEdges.Item(1) 'добавляем ребро #1
   oEC.Add oEdge

   Set oEdge = oEdges.Item(3) 'добавляем ребро #3
   oEC.Add oEdge

   Set oEdge = oEdges.Item(2) 'добавляем ребро #2
   oEC.Add oEdge

   Set oEdge = oEdges.Item(4) 'добавляем ребро #4
   oEC.Add oEdge

   'Создание рабочей точки
   Dim oWorkPoint As WorkPoint
   Set oWorkPoint = oPartCompDef. _
          WorkPoints.AddAtCentroid(oEC, False)

End Sub

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

Рабочая точка в центре тора[править]

Рабочую точку в центре тора создает метод AddByTorusCenterPoint.

Главным параметром на входе служит грань, являющаяся поверхностью тора. Грани любой другой геометрии приведут к ошибке. Единственным допустимым значением свойства SurfaceType грани является константа kTorusSurface.

Список констант, идентифицирующих типы граней, можно найти в справочной системе по теме «SurfaceTypeEnum Enumeration».

Public Sub WorkPoint_16()

   ' Ссылка на документ активной детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition

   'ссылка на грань #1 поверхностного тела #1
   Dim oFace As Face
   Set oFace = oPartCompDef.SurfaceBodies.Item(1).Faces.Item(1)
   
   'Проверка: а тор ли это ?
   If oFace.SurfaceType = kTorusSurface Then
      'Создание рабочей точки в центре тора
      Dim oWorkPoint As WorkPoint
      Set oWorkPoint = oPartCompDef. _
             WorkPoints.AddByTorusCenterPoint(oFace, False)
   Else
      MsgBox "Деталь должна представлять собой тор"
   End If

End Sub

Прежде, чем вызывать метод AddByTorusCenterPoint, в программе предприниматся проверка типа входной грани.

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

Рабочие оси[править]

Как следует из объектной модели, коллекция рабочих осей WorkAxes доступна в объектах PartComponentDefinition или AssemblyComponentDefinition.

Коллекция WorkAxes располагает широким спектром методов создания рабочих осей.

Коллекция WorkAxes никогда не бывает пустой. Первые три элемента в коллекции WorkAxes — базовые рабочие оси X, Y и Z с порядковыми номерами 1, 2 и 3, соответственно. Это фиксированные оси. Их тип и положение в коллекции WorkAxes изменены быть не могут.

Пример получения ссылок на базовые рабочие оси:

' Ссылка на активный документ детали
Dim oPartDoc As PartDocument
Set oPartDoc = ThisApplication.ActiveDocument

' Ссылка на определение компонентов документа детали
Dim oPartCompDef As PartComponentDefinition
Set oPartCompDef = oPartDoc.ComponentDefinition

' Создание ссылок на базовые рабочие оси
Dim oAxisX As WorkAxis
Dim oAxisY As WorkAxis
Dim oAxisZ As WorkAxis

Set oAxisX = oPartCompDef.WorkAxes.Item(1)
Set oAxisY = oPartCompDef.WorkAxes.Item(2)
Set oAxisZ = oPartCompDef.WorkAxes.Item(3)


Направление рабочей оси[править]

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

Напротив, у рабочих осей Инвентора направления распространения эквивалентными не являются. Рабочая ось WorkAxis имеет врожденное свойство Direction — единичный вектор, который определяет как ориентацию оси в пространстве, так и положительное и отрицательное направления оси. Вектор Direction принимается во внимание во всех построениях с участием рабочей оси и участвует в векторных вычислениях при определении направляющего вектора результирующего объекта.

Направляющий вектор рабочей оси имеет тип UnitVector, его возвращает команда WorkAxis.Line.Direction.

Фиксированная рабочая ось[править]

Фиксированная рабочая ось создается методом WorkAxes.AddFixed.

Метод, создавая новую рабочую ось, основывается на трех аргументах:

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

В контексте детали создается ось, у которой определяющий объект имеет тип FixedWorkAxisDef, а в контексте сборки — AssemblyWorkAxisDef.

Public Sub WorkAxis_01()
   
   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Создание ссылки на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   ' Задание координат точки в пространстве
   Dim oPoint As Point
   Set oPoint = oTG.CreatePoint(-1, -1, -1)
   
   ' Создание направляющего вектора рабочей оси
   Dim oVector As UnitVector
   Set oVector = oTG.CreateUnitVector(1, 1, 1)
   
   ' Создание фиксированной рабочей оси
   Dim oWorkAxis As WorkAxis
   Set oWorkAxis = oPartCompDef.WorkAxes.AddFixed(oPoint, oVector, False)
   oWorkAxis.Visible = True 'принудительно делаем ось видимой
   oWorkAxis.Name = "Фиксированная_Ось"
   
   MsgBox "Тип оси:   DefinitionType = " & oWorkAxis.DefinitionType

   'В информационном сообщении будет выведено значение 12551,
   'что соответствует типу kFixedWorkAxis

End Sub

Созданной оси присваивается имя "Фиксированная_Ось". Именно оно идентифицирует новую ось в браузере детали.

Изменение фиксированной рабочей оси[править]

Определяющий объект рабочей оси FixedWorkAxisDef (в детали) или AssemblyWorkAxisDef (в сборке) имеет два ключевых свойства, определяющих направление оси и ее положение в пространстве:

  • Свойство Axis, тип UnitVector
  • Свойство OriginPoint, тип Point

Чтобы изменить положение в пространстве фиксированной рабочей оси достаточно модифицировать эти поля объекта FixedWorkAxisDef с помощью вызова метода PutData с новыми значениями OriginPoint и Axis в качестве аргументов.

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

Public Sub WorkAxis_02()
   
   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   '   ' Создание ссылки на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   ' Найдем именованную рабочую ось "Фиксированная_Ось"
   Dim oWorkAxis As WorkAxis
   Set oWorkAxis = oPartCompDef.WorkAxes.Item("Фиксированная_Ось")
   
   If oWorkAxis.DefinitionType = kFixedWorkAxis Then
      
      ' Извлекаем из рабочей оси ее определяющий объект (definition object)
      ' Этот объект обеспечивает доступ к координатам начала и
      ' вектроу направления, ассоциированным с рабочей осью.
      ' В случае фиксированной рабочей оси в документе детали
      ' метод вернет объект типа FixedWorkAxisDef
      
      Dim oWAxisDef As FixedWorkAxisDef
      Set oWAxisDef = oWorkAxis.Definition
      
      ' В задающий объект фиксированной рабочей оси
      ' вводим новые координаты начала и направление вектора
      Call oWAxisDef.PutData(oTG.CreatePoint(2, 0, 0), _
                             oTG.CreateUnitVector(2, 0, 0))      
   End If
End Sub

Ось, проходящая через две точки[править]

Рабочая ось, проходящая через две заданные точки, создается методом AddByTwoPoints. В качестве двух входных точек можно задать произвольную комбинацию рабочих точек, вершин или эскизных точек.

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

Public Sub WorkAxis_03()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition

   ' Создание ссылки на точку начала координат
   Dim oPoint As WorkPoint
   Set oPoint = oPartCompDef.WorkPoints.Item(1)
   oPoint.Visible = True  ' Визуализация точки
   
   ' Создание ссылки на вершину детали #1
   Dim oVertex As Vertex
   Set oVertex = oPartCompDef.SurfaceBodies.Item(1).Vertices.Item(1)
   
   ' Создание рабочей оси
   Dim oWorkAxis As WorkAxis
   Set oWorkAxis = oPartCompDef.WorkAxes.AddByTwoPoints (oPoint, oVertex, False)
   
   MsgBox "Тип оси:   DefinitionType = " & oWorkAxis.DefinitionType
   
End Sub

Программа выведет число 12547, соответствующий типу оси kTwoPointsWorkAxis.

Метод AddByTwoPoints не поддерживается в контексте сборки.

Ось на пересечении двух плоскостей[править]

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

Для примера построим рабочую ось как линию пересечения двух базовых рабочих плоскостей YZ и XZ. Результатом должна быть ось, совпадающая с осью Z.

Public Sub WorkAxis_04()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Создание ссылки на плоскости YZ и XZ
   Dim oPlane1 As WorkPlane
   Dim oPlane2 As WorkPlane
   Set oPlane1 = oPartCompDef.WorkPlanes.Item(1)
   Set oPlane2 = oPartCompDef.WorkPlanes.Item(2)
   
   'Визуализация плоскостей
   oPlane1.Visible = True
   oPlane2.Visible = True
   
   ' Создание рабочей оси на пересечении двух плоскостей
   Dim oWorkAxis As WorkAxis
   Set oWorkAxis = oPartCompDef.WorkAxes. _
                     AddByTwoPlanes(oPlane1, oPlane2, False)
          
   MsgBox "Тип оси  DefinitionType = " & oWorkAxis.DefinitionType

End Sub


Программа выведет число 12546, соответствующий типу оси kTwoPlanesWorkAxis.

Метод AddByTwoPlanes в контексте сборки не поддерживается.




Рабочая ось вдоль оси симметрии поверхности вращения[править]

Метод AddByRevolvedFace создает новую рабочую ось вдоль оси симметрии заданного тела вращения.

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

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


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

Public Sub WorkAxis_05()
   
   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   Dim oWorkAxis As WorkAxis
   Dim oFace As Face
   
   'Переберем все грани. Для цилиндрических граней
   'построим рабочие оси вдоль осей вращения.
   
   For Each oFace In oPartCompDef.SurfaceBodies.Item(1).Faces
      
      If oFace.SurfaceType = kCylinderSurface Then
         'Цилиндрическая поверхность найдена. Создаем рабочую ось.
         Set oWorkAxis = oPartCompDef.WorkAxes.AddByRevolvedFace(oFace)
         
         MsgBox "Тип оси  DefinitionType = " & oWorkAxis.DefinitionType
         
      End If
      
   Next

End Sub
<pre>

После создания очередной рабочей оси программа выведет число 12548, соответствующее типу оси kRevolvedFaceWorkAxis.

Метод AddByRevolvedFace в контексте сборки не поддерживается.

Ось, перпендикулярная поверхности и проходящая через заданную точку[править]

В версии IV2008 метод AddByPointAndPlane объявлен кандидатом на исключение из API, скрыт от пользователя, хотя еще и поддерживается. На замену ему предлагается более универсальный метод AddByNormalToSurface.

Метод создает рабочую ось, перпендикулярную заданной поверхности и проходящую через заданную точку.

В качестве поверхности допускаются плоские и неплоские грани, рабочие плоскости и плоские эскизы. В качестве точки можно задавать рабочие точки, вершины, 2D эскизные точки и 3D эскизные точки. Точкам не обязана лежать на заданной поверхности.

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

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


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

Public Sub WorkAxis_06()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Создание ссылки на точку начала координат
   Dim oPoint As WorkPoint
   Set oPoint = oPartCompDef.WorkPoints.Item(1)
   oPoint.Visible = True
   
   ' Создание ссылки плоскость XY
   Dim oPlane As WorkPlane
   Set oPlane = oPartCompDef.WorkPlanes.Item(3)
   oPlane.Visible = True
   
   ' Создание рабочей оси
   Dim oWorkAxis As WorkAxis
   Set oWorkAxis = oPartCompDef.WorkAxes. _
            AddByNormalToSurface(oPlane, oPoint, False)

End Sub

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

Public Sub WorkAxis_06_1()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   'ссылка на грань #1 поверхностного тела #1
   Dim oFace As Face
   Set oFace = oPartCompDef.SurfaceBodies.Item(1).Faces.Item(1)
   
   'ссылка на контур из ребер #1 грани oFace
   Dim oEdgeLoop As EdgeLoop
   Set oEdgeLoop = oFace.EdgeLoops.Item(1)

   'Создание рабочей точки в центре тяжести грани oFace
   Dim oWorkPoint As WorkPoint
   Set oWorkPoint = oPartCompDef. _
          WorkPoints.AddAtCentroid(oEdgeLoop, False)
  
   ' Создание рабочей оси
   Dim oWorkAxis As WorkAxis
   Set oWorkAxis = oPartCompDef.WorkAxes. _
            AddByNormalToSurface(oFace, oWorkPoint, False)
   
   MsgBox "Тип оси  DefinitionType = " & oWorkAxis.DefinitionType
   
End Sub

Метод AddByNormalToSurface в контексте сборки не поддерживается.

Свойство DefinitionType созданной методом AddByNormalToSurface рабочей оси возвращает значение 12553 (константа kNormalToSurfaceWorkAxis).

Ось вдоль заданной линии[править]

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

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

Направление создаваемой оси наследует направление заданной линии.


В следующем примере создается рабочая ось вдоль ребра детали после проверки его на линейность. Наиболее подходящей деталью для экспериментов является параллелепипед.

Public Sub WorkAxis_07()
   
   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition

   ' Ссылка на ребро параллелепипеда
   Dim oEdge As Edge
   Set oEdge = oPartCompDef.SurfaceBodies.Item(1).Edges.Item(1)
   
   'проверка ребра на линейность
   If oEdge.GeometryType = kLineSegmentCurve Then
      
      ' Создание рабочей оси
      Dim oWorkAxis As WorkAxis
      Set oWorkAxis = oPartCompDef.WorkAxes.AddByLine(oEdge)
      
      MsgBox "Тип оси  DefinitionType = " & oWorkAxis.DefinitionType
      
   End If
End Sub

Метод AddByLine в контексте сборки не поддерживается.

Свойство DefinitionType созданной методом AddByLine рабочей оси возвращает значение 12545 (константа kLineWorkAxis).



Ось как проекция линии на плоскость[править]

Метод AddByLineAndPlane создает рабочую ось, являющуюся проекцией заданной линии на заданную плоскость.

Если заданная линия будет перпендикулярна плоскости, ее проекция вырождаеся в точку, и метод AddByLineAndPlane сгенерирует ошибку.

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

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


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

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

Public Sub WorkAxis_07()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Создание ссылки на рабочую ось - главную диагональ кубика
   Dim oLine As WorkAxis
   Set oLine = oPartCompDef.WorkAxes.Item(4)
   
   'ссылка на грань #1 детали
   Dim oFace As Face
   Set oFace = oPartCompDef.SurfaceBodies.Item(1).Faces.Item(1)
   
   ' Создание рабочей оси - проекции линии oLine на грань oFace
   Dim oWorkAxis As WorkAxis
   Set oWorkAxis = oPartCompDef.WorkAxes. _
                        AddByLineAndPlane(oLine, oFace, False)
   
   'проверка типа рабочей оси
   MsgBox "Тип оси  DefinitionType = " & oWorkAxis.DefinitionType
   
End Sub


Проверка типа созданной оси, как и ожидалось, возвращает значение 12550, соответствующее типу kLineAndPlaneWorkAxis.

Пожалуйста, проверьте направление созданной оси. Оно наследует направление проекции заданной линии.

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


Ось параллельно линии через точку[править]

Для построения рабочей оси параллельно заданной линии и через заданную точку предусмотрен метод AddByLineAndPoint.

Роль линии могут играть прямые ребра, рабочие оси и эскизные линии.
В качестве точки допустимы вершины, рабочие точки и эскизные точки (SketchPoint и SketchPoint3D).

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


Демонстрационная программа WorkAxis_08 строит рабочую ось вдоль вертикальной базовой оси Z через первую вершину заданной детали.

Public Sub WorkAxis_08()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Создание ссылки на базовую рабочую ось Z
   Dim oLine As WorkAxis
   Set oLine = oPartCompDef.WorkAxes.Item(3)
   
   'ссылка на вершину #1 детали
   Dim oLine As Vertex
   Set oVertex = oPartCompDef.SurfaceBodies.Item(1).Vertices(1)
   
   ' Создание рабочей оси параллельно oLine через вершину oVertex
   Dim oWorkAxis As WorkAxis
   Set oWorkAxis = oPartCompDef.WorkAxes. _
                        AddByLineAndPoint(oLine, oVertex, False)
   
   'проверка типа рабочей оси
   MsgBox "Тип оси  DefinitionType = " & oWorkAxis.DefinitionType
   
End Sub

Проверка типа созданной оси, как и ожидалось, возвращает значение 12554, соответствующее типу kLineAndPointWorkAxis.

Пожалуйста, проверьте направление созданной оси. Оно наследует направление заданной методу линии.

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

Рабочая ось вдоль оси вращения круглого или эллиптического ребра[править]

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

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


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

Public Sub WorkAxis_09()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   'ссылка на ребро #1 детали
   Dim oEdge As Edge
   Dim oWorkAxis As WorkAxis
   
   
   'перебор всех ребер, чтобы найти первое подходящее
   For Each oEdge In oPartCompDef.Features.Item(1).Faces.Item(1).Edges
   
      If (oEdge.GeometryType = kCircleCurve) Or _
         (oEdge.GeometryType = kCircularArcCurve) Or _
         (oEdge.GeometryType = kEllipseFullCurve) Or _
         (oEdge.GeometryType = kEllipticalArcCurve) Then
         
         'Найдено ребро допустимого типа.
         'Создаем рабочую ось вдоль характерной оси ребра
         Set oWorkAxis = oPartCompDef.WorkAxes. _
                              AddByAnalyticEdge(oEdge, False)
         'проверка типа рабочей оси
         MsgBox "Тип оси  DefinitionType = " & oWorkAxis.DefinitionType
         
         Exit For
         
      End If
   Next
   
End Sub

Проверка типа созданной оси, как и следовало ожидать, дает значение 12555, соответствующее типу kAnalyticEdgeWorkAxis.

Направление созданной оси ПРОТИВОПОЛОЖНО направлению оси заданного ребра.

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

Рабочие плоскости[править]

Как следует из объектной модели, доступ к коллекции рабочих плоскостей WorkPlanes обеспечивают объекты PartComponentDefinition в контексте детали или AssemblyComponentDefinition при работе в контексте сборки.

Коллекция WorkPlanes располагает широким спектром методов создания рабочих плоскостей.

Коллекция WorkPlanes никогда не бывает пустой. Первые три элемента в коллекции WorkPlanes всегда представляют базовые рабочие плоскости YZ, XZ и XY с порядковыми номерами 1, 2 и 3, соответственно. Эта последовательность совпадает с порядком следования нормалей к плоскостям — ось X, ось Y и ось Z — в коллекции рабочих осей.

Базовые плоскости являются фиксированными. Их тип и положение в коллекции WorkPlanes изменены быть не могут.

Пример получения ссылок на базовые рабочие плоскости:

' Ссылка на активный документ детали
Dim oPartDoc As PartDocument
Set oPartDoc = ThisApplication.ActiveDocument

' Ссылка на определение компонентов документа детали
Dim oPartCompDef As PartComponentDefinition
Set oPartCompDef = oPartDoc.ComponentDefinition

' Создание ссылок на базовые рабочие плоскости
Dim oPlane1 As WorkPlane
Dim oPlane2 As WorkPlane
Dim oPlane3 As WorkPlane

‘Плоскость YZ
Set oPlane1 = oPartCompDef.WorkPlanes.Item(1)

‘Плоскость XZ
Set oPlane2 = oPartCompDef.WorkPlanes.Item(2)

‘Плоскость XY
Set oPlane3 = oPartCompDef.WorkPlanes.Item(3)


Направление нормали рабочей плоскости[править]

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

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

Normal имеет тип UnitVector, его возвращает свойство WorkPlane.Plane.Normal.

Фиксированная рабочая плоскость[править]

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

Для создания такой плоскости применяется метод AddFixed. Если плоскость создана в контексте детали, то ее определяющий объект будет иметь тип PartWorkPlaneDef, если же в контесте сборки, то AssemblyWorkPlaneDef.

В качестве входных аргументов методу AddFixed задаются точка в пространстве OriginPoint и два единичных вектора, задающих направления координатных осей X и Y плоскости.

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

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

Public Sub WorkPlane_1()

   ' Ссылка на активный документ детали
   Dim oDoc As Document
   Set oDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oCompDef As ComponentDefinition
   Set oCompDef = oDoc.ComponentDefinition
   
   ' Ссылка на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   ' Задание точки начала координат
   Dim oRootPoint As Point
   Set oRootPoint = oTG.CreatePoint(1, 2, 3)
   
   ' Задание направлений координатных осей
   Dim oVectorX As UnitVector
   Dim oVectorY As UnitVector
   Set oVectorX = oTG.CreateUnitVector(1, 0, 0)
   Set oVectorY = oTG.CreateUnitVector(0, 1, 0)
   
   ' Создание рабочей плоскости
   Dim oWorkPlane As WorkPlane
   Set oWorkPlane = oCompDef.WorkPlanes. _
                      AddFixed(oRootPoint, oVectorX, oVectorY)

   'проверка типа рабочей плоскости
   MsgBox "DefinitionType = " & oWorkPlane.DefinitionType

End Sub

Проверка типа плоскости, созданной в документе детали, возвращает значение DefinitionType = 12041, соответствующее типу kFixedWorkPlane, а в при работе в сборке — 12044, соответствующее типу kAssemblyWorkPlane.

Плоскость, проходящая через три точки[править]

Метод AddByThreePoints создает рабочую плоскость по трем заданным точкам P1, P2, P3. На входе метода допускаются следующие виды точечных объектов: рабочие точки WorkPoint, вершины детали Vertex и эскизные точки.

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

Начало системы координат рабочей плоскости помещается в первую точку Point1. В направлении от Point1 к Point2 пройдет ось X. Точка Point3 будет задавать положительное направление оси Y. Оси X, Y и направление вектора нормали к плоскости образуют правую тройку векторов.

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

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

Public Sub WorkPlane_4()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition

    ' Создание ссылки на рабочие точки
    Dim oPoint(1 To 3) As WorkPoint
    Set oPoint(1) = oPartCompDef.WorkPoints.Item("P1")
    Set oPoint(2) = oPartCompDef.WorkPoints.Item("P2")
    Set oPoint(3) = oPartCompDef.WorkPoints.Item("P3")

    ' Создание рабочей плоскости
    Dim oWorkPlane As WorkPlane
    Set oWorkPlane = oPartCompDef.WorkPlanes. _
               AddByThreePoints(oPoint(1), oPoint(2), oPoint(3))

   'проверка типа рабочей плоскости
   MsgBox "DefinitionType = " & oWorkPlane.DefinitionType

End Sub

Проверка типа плоскости возвращает значение DefinitionType = 12033, соответствующее типу kThreePointsWorkPlane.

Метод AddByThreePoints не поддерживается в контексте сборки.


Плоскость, проходящая через две прямые[править]

Метод AddByTwoLines создает рабочую плоскость, основываясь на двух прямолинейных объектах. Допустимы прямые ребра Edge, рабочие оси WorkAxis и эскизные линии SketchLine. Первая линия определяет направление оси X системы координат новой рабочей плоскости.

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

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

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

Public Sub WorkPlane_3()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   
   'ссылки на ребра N1 и N2 детали
   Dim N1 As Long
   Dim N2 As Long
   
   N1 = 1           ‘ задаем первое ребро
   N2 = 10          ' задаем второе ребро
   
   Dim oEdge(1 To 2) As Edge
   Set oEdge(1) = oPartCompDef.SurfaceBodies.Item(1).Edges.Item(N1)
   Set oEdge(2) = oPartCompDef.SurfaceBodies.Item(1).Edges.Item(N2)
   
   
   ' Создание ссылки на оси X  и Y.
   Dim oAxis(1 To 2) As WorkAxis
   Set oAxis(1) = oPartCompDef.WorkAxes.AddByLine(oEdge(1))
   Set oAxis(2) = oPartCompDef.WorkAxes.AddByLine(oEdge(2))
   oAxis(1).Visible = True    ' Визуализация осей
   oAxis(2).Visible = True
   
   ' Создание рабочей плоскости
   Dim oWorkPlane As WorkPlane
   Set oWorkPlane = oPartCompDef.WorkPlanes. _
                        AddByTwoLines(oEdge(1), oEdge(2))
   
   'проверка типа рабочей плоскости
   MsgBox "DefinitionType = " & oWorkPlane.DefinitionType
   
End Sub

Проверка типа плоскости возвращает значение DefinitionType = 12034, соответствующее типу kTwoLinesWorkPlane.

Метод AddByTwoLines не поддерживается в контексте сборки.

Плоскость по середине между двух параллельных плоскостей[править]

Среднюю плоскость между двух заданных параллельных плоскостей создает метод AddByTwoPlanes.

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

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


Перед выполнением примера создайте две параллельные плоскости с именами “Plane1” и “Plane2”.

Public Sub WorkPlane_2()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Ссылка на две именованные параллельные плоскости
   ' Проверка существования таких плоскостей и
   ' их параллелности здесь не выполняется (ля упрощения примера)
   Dim oPlane(1 To 2) As WorkPlane
   Set oPlane(1) = oPartCompDef.WorkPlanes.Item("Plane1")
   Set oPlane(2) = oPartCompDef.WorkPlanes.Item("Plane2")
   
   ' Создание рабочей плоскости
   Dim oWorkPlane As WorkPlane
   Set oWorkPlane = oPartCompDef.WorkPlanes. _
                        AddByTwoPlanes(oPlane(1), oPlane(2))
   oWorkPlane.Name = "MidPlane"
   
   'проверка типа рабочей плоскости
   MsgBox "DefinitionType = " & oWorkPlane.DefinitionType

End Sub

Проверка типа плоскости возвращает значение DefinitionType = 12043, соответствующее типу kTwoPlanesWorkPlane.

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


Параллельная плоскость на заданном расстоянии от другой плоскости[править]

Метод AddByPlaneAndOffset позволяет создать рабочую плоскость, параллельную другой плоскости и отстоящую от нее на заданном расстоянии.

Синтаксис метода:

Public Function AddByPlaneAndOffset( _
   ByVal Plane As Object, _
   ByVal Offset As Variant, _
   Optional ByVal Construction As Boolean = False _
) As WorkPlane

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

Параметр Offset задает смещение создаваемой рабочей плоскости относительно исходной плоскости Plane. Значение смещения объявлено переменной типа Variant и допускает задание как числовых значений, так строковых. Смещение рабочей плоскости всегда определяется параметром, который создается автоматически в процессе создания плоскости. Если смещение задано числовым значением, то оно преобразуется в сантиметры и присваивается создаваемому параметру. Если смещение задано строковым выражением, оно используется в качестве выражения для параметра и интерпретируется по тем же правилам, по каким обрабатывается ввод пользователя в интерактивном режиме. Это означает, что если значение задано без указания единицы измерения, то подставляется единица измерения длины по умолчанию в текущем документе. Допустим, что в текущем документе размер d2 уже задан. Тогда строка "d2 + 30 мм" будет рассматриваться как корректное значение смещения. От знака полученной величины будет зависеть направление смещения создаваемой плоскости. Положительным значениям соответствует сдвиг по направлению вектора нормали к плоскости Plane.

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


В примере создается рабочая плоскость, параллельная базовой плоскости YZ и отстоящая от нее на 20 мм в положительном направлении оси X.

Public Sub WorkPlane_06()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Ссылка на первую базовую плоскость YZ
   Dim oPlane As WorkPlane
   Set oPlane = oPartCompDef.WorkPlanes.Item(1)
   oPlane.Visible = True   'Визуализация плоскости YZ
   
   ' Создание рабочей плоскости на расстоянии 20 мм от oPlane
   Dim oWorkPlane As WorkPlane
   Set oWorkPlane = oPartCompDef.WorkPlanes. _
                        AddByPlaneAndOffset(oPlane, "20 мм", False)

   'проверка типа рабочей плоскости
   MsgBox "DefinitionType = " & oWorkPlane.DefinitionType
   
End Sub

Проверка типа плоскости возвращает значение DefinitionType = 12038, соответствующее типу kPlaneAndOffsetWorkPlane.

Метод AddByPlaneAndOffset не поддерживается в контексте сборки.

Плоскость, проходящая через точку параллельно другой плоскости[править]

Метод AddByPlaneAndPoint создает новую рабочую плоскость, которая проходит через заданную точку и параллельна другой плоскости.

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

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


Перед выполнением примера создайте в документе детали рабочую плоскость с названием Plane и рабочую точку с названием Point1.

Public Sub WorkPlane_05()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Ссылка на рабочую точку
   Dim oPoint As WorkPoint
   Set oPoint = oPartCompDef.WorkPoints.Item("Point1")
   
   ' Ссылка на рабочую плоскость
   Dim oPlane As WorkPlane
   Set oPlane = oPartCompDef.WorkPlanes.Item("Plane")
   
   ' Создание новой рабочей плоскости
   Dim oWorkPlane As WorkPlane
   Set oWorkPlane = oPartCompDef.WorkPlanes. _
                        AddByPlaneAndPoint(oPlane, oPoint)

   ' Проверка типа рабочей плоскости
   MsgBox "DefinitionType = " & oWorkPlane.DefinitionType
   
End Sub

Проверка типа плоскости возвращает значение DefinitionType = 12036, соответствующее типу kPlaneAndPointWorkPlane.

Метод AddByPlaneAndPoint не поддерживается в контексте сборки.


Плоскость, перпендикулярная заданной кривой в конкретной ее точке[править]

Метод AddByNormalToCurve создает рабочую плоскость, перпендикулярную заданной кривой в конкретной ее точке.

Под кривой понимается ребро, объект трехмерного эскиза, объект двумерного эскиза или рабочая ось. В случае ребер и объектов 3D эскиза допустимыми видами геометрии кривой являются сплайны Spline, дуги Arc, окружности Circle, эллипсы Ellipse и эллиптические дуги EllipticalArc. Из числа объектов 2D эскиза допускаются сплайны Spline2d, дуги Arc2d, окружности Circle2d, эллиптические дуги EllipticalArc2d и эллипсы Ellipse2d.

В качестве точки кривой можно задавать рабочие точки, вершины детали, эскизные точки 2D и 3D эскизов. Принадлежность точки кривой обязательна. Проверка этих условий возлагается на вызывающую программу.

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


Перед выполнением примера создайте в плоском эскизе дугу. Ориентация эскиза роли не играет. Программа построит рабочие плоскости на концах первой дуги эскиза.

Public Sub WorkPlane_07()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Ссылка на дугу в эскизе
   Dim oCurve As SketchArc
   Set oCurve = oPartCompDef.Sketches.Item(1).SketchArcs.Item(1)
   
   ' Объявление переменной для рабочей плоскости
   Dim oWorkPlane As WorkPlane
   
   
   ' Ссылка на начальную точку дуги
   Dim oPoint As SketchPoint
   Set oPoint = oPartCompDef.Sketches.Item(1). _
                        SketchArcs.Item(1).StartSketchPoint
   ' Создание рабочей плоскости
   Set oWorkPlane = oPartCompDef.WorkPlanes. _
                        AddByNormalToCurve(oCurve, oPoint)
   
   
   ' Ссылка на конечную точку дуги
   Set oPoint = oPartCompDef.Sketches.Item(1). _
                        SketchArcs.Item(1).EndSketchPoint
   ' Создание рабочей плоскости
   Set oWorkPlane = oPartCompDef.WorkPlanes. _
                        AddByNormalToCurve(oCurve, oPoint)
   
   
   'проверка типа рабочей плоскости
   MsgBox "DefinitionType = " & oWorkPlane.DefinitionType

End Sub

Проверка типа плоскости возвращает значение DefinitionType = 12042, соответствующее типу kNormalToCurveWorkPlane.

Метод AddByNormalToCurve не поддерживается в контексте сборки.

Следующий пример демонстрирует применение метода AddByNormalToCurve к 3D сплайну. Перед его выполнением в новом документе детали создайте трехмерный эскиз и в нем — 3D сплайн. Программа построит рабочие плоскости в каждой вершине сплайна.

Public Sub WorkPlane_07_1()
   
   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Ссылка на 3D сплайн в 3D эскизе
   Dim oCurve As SketchSpline3D
   Set oCurve = oPartCompDef.Sketches3D.Item(1).SketchSplines3D.Item(1)
   
   ' Объявление переменных
   Dim oWorkPlane As WorkPlane   ' рабочая плоскость
   Dim oPoint As SketchPoint3D   ' 3D точка эскиза
   Dim i As Long                 ' счетчик вершин сплайна
   
   For i = 1 To oCurve.FitPointCount
   
      'Ссылка на вершину  сплайна
      Set oPoint = oCurve.FitPoint(i)
      
      'Создание рабочей плоскости в точке oPoint
      Set oWorkPlane = oPartCompDef.WorkPlanes. _
                           AddByNormalToCurve(oCurve, oPoint)
   Next i
   
End Sub

Плоскость, проходящая через прямую под углом к другой плоскости[править]

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

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

Роль прямой линии Line могут играть прямые ребра, рабочие оси и эскизные линии. Прямая не обязана быть параллельной плоскости Plane.

Параметр Angle типа Variant определяет угол наклона создаваемой плоскости по отношению к заданной. Может быть задано как число, так и строковое выражение. Угол наклона плоскости всегда задается параметром, который автоматически создается при рождении рабочей плоскости. Если задано числовое значение, то оно преобразуется в радианы и присваивается создаваемому параметру. Если задано строковое выражение, оно используется в качестве выражения для параметра и интерпретируется по тем же правилам, по каким обрабатывается ввод пользователя в интерактивном режиме. Это означает, что если значение задано без указания единицы измерения, то подставляется единица измерения углов по умолчанию в текущем документе. Допустим, что в текущем документе размер d2 уже задан. Тогда строка "d2 + 30 град" будет рассматриваться как корректное значение угла. Положительное направление изменения углов задается векторным произведением вектора оси и вектора нормали к плоскости.


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

Следующий пример построит рабочую плоскость под углом 45 градусов к плоскости YZ и проходящую через ось Y.

Public Sub WorkPlane_08()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Создание ссылки на ось Y
   Dim oAxis As WorkAxis
   Set oAxis = oPartCompDef.WorkAxes.Item(2)
   
   ' Создание ссылки на YZ
   Dim oPlane As WorkPlane
   Set oPlane = oPartCompDef.WorkPlanes.Item(1)
   
   ' Визуализация оси и плоскости
   oAxis.Visible = True
   oPlane.Visible = True
   
   ' Создание рабочей плоскости
   Dim oWorkPlane As WorkPlane
   Set oWorkPlane = oPartCompDef.WorkPlanes. _
            AddByLinePlaneAndAngle(oAxis, oPlane, "45 deg")

End Sub

Метод AddByLinePlaneAndAngle не поддерживается в контексте сборки.

Следующая таблица показывает каким получится угол между плоскостями при различной записи угла в вызове метода AddByLinePlaneAndAngle:

Запись угла Значение параметра
"45 deg" 45 градусов
"45" 45 угловых единиц по умолчанию для данного документа
45 45 рад


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

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

Касательная рабочая плоскость, проходящую через заданную прямую[править]

Метод AddByLineAndTangent создает новую рабочую плоскость, касательную к указанной поверхности и проходящую через заданную прямую.

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

  • прямая обязана быть параллельной оси цилиндра,
  • прямая должна находиться вне цилиндра, либо лежать на его поверхности.

В качестве прямой можно задать прямое ребро детали, рабочую ось, эскизную 2D или 3D линию.

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

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

Метод в контексте сборки не поддерживается.

Перед выполнением примера создайте

  • цилиндр,
  • в стороне от цилиндра и параллельно его оси — рабочую ось «Прямая»,
  • рабочую точку «БлижайшаяТочка» на боковой поверхности цилиндра, чтобы обозначить, с которой стороны цилиндра следует создать касательную плоскость.
Public Sub WorkPlane_09()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Ссылка на рабочую ось "Прямая"
   Dim oLine As WorkAxis
   Set oLine = oPartCompDef.WorkAxes.Item("Прямая")
   
   ' Ссылка на точку "БлижайшаяТочка"
   Dim oProximityPoint As Point
   Set oProximityPoint = oPartCompDef.WorkPoints.Item("БлижайшаяТочка").Point
   
   ' Ссылка на поверхность
   Dim oFace As Face
   Set oFace = oPartCompDef.SurfaceBodies.Item(1).Faces.Item(1)
     
   'Создание рабочей плоскости
   Dim oWorkPlane As WorkPlane
   Set oWorkPlane = oPartCompDef.WorkPlanes. _
            AddByLineAndTangent(oLine, oFace, oProximityPoint, False)
   
End Sub


Касательная рабочая плоскость в заданной точке поверхности[править]

Метод AddByPointAndTangent создает новую рабочую плоскость, касающуюся указанной поверхности в заданной ее точке.

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

Метод в контексте сборки не поддерживается.


Перед выполнением примера создайте, например, конус с рабочей точкой «Точка» на боковой поверхности.

Public Sub WorkPlane_10()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
  
   ' Ссылка на точку
   Dim oPoint As WorkPoint
   Set oPoint = oPartCompDef.WorkPoints.Item("Точка")
   
   ' Ссылка на поверхность
   Dim oFace As Face
   Set oFace = oPartCompDef.SurfaceBodies.Item(1).Faces.Item(1)
            
   ' Создание рабочей плоскости
   Dim oWorkPlane As WorkPlane
   Set oWorkPlane = oPartCompDef.WorkPlanes. _
                        AddByPointAndTangent(oPoint, oFace, False)
                 
End Sub

Касательная рабочая плоскость, параллельная другой плоскости[править]

Метод AddByPlaneAndTangent позволяет построить рабочую плоскость, которая проходит через заданную прямую и является касательной к указанной поверхности.

Допустимая геометрия поверхности — цилиндрическая, конусная или сферическая.

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

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

Задача построения касательной плоскости, параллельной другой плоскости, может более одного решения. Метод AddByLineAndTangent создает ту плоскость, которая ближе к указанной методу точке. Эта точка задается параметром типа Point и используется лишь для первоначального определения стороны касания. При последующих перевычислениях модели плоскость останется с той же стороны от поверхности независимо от нового положения той точки.

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

Метод в контексте сборки пока не поддерживается.


Для проверки метода в работе постройте цилиндрическую деталь выдавливанием вдоль оси Z системы координат и на его цилиндрической поверхности поставьте именованную рабочую точку "БлижайшаяТочка".

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

'Постройте цилиндр, выдавленный вдоль оси Z.
'Программа строит касательную к цилиндру плоскость
'параллельно базовой плоскости YZ системы координат

Public Sub WorkPlane_11()
   
   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   ' Ссылка на рабочую исходную рабочую плоскость
   Dim oPlane As WorkPlane
   Set oPlane = oPartCompDef.WorkPlanes.Item(1)  ' плоскость YZ
   
   
   ' Ссылка на ближайшую точку
   Dim oProximityPoint As Point
   Set oProximityPoint = oPartCompDef.WorkPoints.Item("БлижайшаяТочка").Point
   
   
   ' Ссылка на грань цилиндра
   Dim oFace As Face
   
   'В цикле по всем граням цилиндра найдем его боковую поверхность
   For Each oFace In oPartCompDef.SurfaceBodies.Item(1).Faces
      
      If oFace.SurfaceType = kCylinderSurface Then
      
         'Здесь oFace -- ссылка на боковую поверхность цилиндра
      
         'Создание рабочей плоскости
         Dim oNewWorkPlane As WorkPlane
         Set oNewWorkPlane = oPartCompDef.WorkPlanes. _
               AddByPlaneAndTangent(oPlane, oFace, oProximityPoint, False)
      End If
   
   Next
   
End Sub

Рабочая плоскость как средняя плоскость тора[править]

Метод AddByTorusMidPlane создает рабочую плоскость, которая является средней плоскостью симметрии тора. Эта плоскость перпендикулярна оси тора.

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

Метод в контексте сборки пока не поддерживается.


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

'Постройте деталь, в которой имеются тороидальные грани

Public Sub WorkPlane_12()

   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   Dim oFace         As Face
   Dim oNewWorkPlane As WorkPlane
   
   'В цикле по всем граням найдем все тороидальные поверхности
   For Each oFace In oPartCompDef.SurfaceBodies.Item(1).Faces
      
      If oFace.SurfaceType = kTorusSurface Then
      
         'Здесь oFace -- ссылка на боковую поверхность тора
      
         'Создание рабочей плоскости
         Set oNewWorkPlane = oPartCompDef.WorkPlanes. _
                                 AddByTorusMidPlane(oFace, False)
      End If
      
   Next
   
End Sub

Переопределение рабочей плоскости[править]

Переопределение рабочей плоскости соответствует команде Redefine Feature в контекстном меню при выделенной рабочей плоскости. Позволяет изменить тип и/или параметры определяющего объекта рабочей плоскости.

Для каждого типа определяющего объекта предусмотрен собственный метод переопределения:

  • SetByLineAndTangent
  • SetByLinePlaneAndAngle
  • SetByNormalToCurve
  • SetByPlaneAndOffset
  • SetByPlaneAndPoint
  • SetByPlaneAndTangent
  • SetByPointAndTangent
  • SetByThreePoints
  • SetByTorusMidPlane
  • SetByTwoLines
  • SetByTwoPlanes
  • SetFixed

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


Процедура демонстрирует изменение грани, на которой построена рабочая плоскость. С изменением ориентации рабочей плоскости изменяется и ориентация связанного с ней конструктивного элемента типа выдавливание с вычитанием материала. Перед выполнением примера в новом документе детали создайте прямоугольный параллелепипед со сторонами не менее 20 мм.

Public Sub WorkPlane_13()
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   ' Ссылка на активный документ детали
   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   ' Ссылка на определение компонентов документа детали
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = oPartDoc.ComponentDefinition
   
   
' === Фаза 1. Создание рабочего элемента ===
   
   Dim oFace As Face
   Set oFace = oPartCompDef.SurfaceBodies.Item(1).Faces.Item(1)
   
   ' Создание рабочей плоскости на грани 1
   Dim oWorkPlane As WorkPlane
   Set oWorkPlane = oPartCompDef.WorkPlanes. _
                        AddByPlaneAndOffset(oFace, 0, False)
   'проверка типа рабочей плоскости
'   MsgBox "DefinitionType = " & oWorkPlane.DefinitionType
   
   
' === Фаза 2. Создание конструкционного элемента ===
' Конструкционный элемент наследует ориентацию рабочей плоскости.
   
   ' Создадим на плоскости oWorkPlane новый 2D эскиз.
   Dim oSketch As PlanarSketch
   Set oSketch = oPartCompDef.Sketches.Add(oWorkPlane, False)
   oSketch.Name = "Мой_эскиз"  ' Сменим имя на удобное нам
    
   'Создание координат для центра  окружности
   Dim oCoord As Point2d
   Set oCoord = oTg.CreatePoint2d(0, 0)
   'Создание окружности R = 5 мм
   Dim oCircle As SketchCircle
   Set oCircle = oSketch.SketchCircles.AddByCenterRadius(oCoord, 0.5)
   
   'Формируем профильный путь для выдавливания
   Dim oProfile As Profile
   Set oProfile = oSketch.Profiles.AddForSolid
   ' Выдавливание с вычитанием материала.
   Dim oExtFeature As ExtrudeFeature
   Set oExtFeature = oPartCompDef.Features.ExtrudeFeatures. _
            AddByThroughAllExtent( _
                     oProfile, _
                     kSymmetricExtentDirection, _
                     kCutOperation)
   
   ThisApplication.ActiveView.Fit   'Подгонка масштаба на активном виде
   
   MsgBox "Состояние 1.  DefinitionType = " & oWorkPlane.DefinitionType
   
   
' === Фаза 3. Переопределение рабочей плоскости ===
' Переопределяем нашу рабочую плоскость на другую грань детали
   
   ' Ссылка на другую грань детали #6
   Set oFace = oPartCompDef.SurfaceBodies.Item(1).Faces.Item(6)
   ' переопределение рабочей плоскости
   Call oWorkPlane.SetByPlaneAndOffset(oFace, 0)

   MsgBox "Состояние 2.  DefinitionType = " & oWorkPlane.DefinitionType   
   
End Sub



Управление видимостью рабочей геометрии[править]

Видимость объекта рабочей геометрии управляется его свойством Visible. Это логическая переменная, она может принимать всего два значения: True (видимость включена) и False (видимость отключена).

У конструкционных рабочих плоскостей, осей и точек это свойство всегда равно False, и менять его бессмысленно, т.к. они невидимы по определению. У таких объектов свойство Construction имеет значение True.


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

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'Этот макрос гасит все рабочие плоскости в активном
'документе, за исключением последней созданной.
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Public Sub MakeOnlyLastWorkPlaneVisible()
   
   Dim Doc  As Document
   Dim wp   As WorkPlane
   Dim Last As Long
   
   'Ссылка на активный документ (сборка или деталь)
   Set Doc = ThisApplication.ActiveDocument
   
   'Номер последней рабочей плоскости в документе
   Last = Doc.ComponentDefinition.WorkPlanes.Count
   
   'Гасим видимость всех рабочих плоскостей
   For Each wp In Doc.ComponentDefinition.WorkPlanes
      wp.Visible = False
   Next
   
   'Включаем видимость последней рабочей плоскости #Last
   Doc.ComponentDefinition.WorkPlanes.Item(Last).Visible = True

End Sub


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

Sub HideAllWorkPlanes()

   'Ссылка на команду управления видимостью рабочих плоскостей
   '  "Object Visibility -> All Workfeatures"
   Dim oCtrlDef As ButtonDefinition
   Set oCtrlDef = ThisApplication.CommandManager. _
         ControlDefinitions.Item("AppUserWorkPlanesVisibilityCmd")
   
   'Если "галочка" стоит, т.е. видимость включена, погасить плоскости.
   If oCtrlDef.Pressed Then
      oCtrlDef.Execute
   End If

End Sub  '~~~ HideAllWorkFeatures ~~~

Имя команды задается объекту CommandManager в явном виде.

Вот сводка имен команд управления видимостью объектов рабочей геометрии:

  • "AppUserWorkPointsVisibilityCmd" — для рабочих точек.
  • "AppUserWorkAxesVisibilityCmd" — для рабочих осей.
  • "AppUserWorkPlanesVisibilityCmd" — для рабочих плоскостей.
  • "AppAllWorkfeaturesCmd" — для всей рабочей геометрии.


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

Это можно сделать, например, так.

Sub ВСЕ_КОМАНДЫ_ИНВЕНТОРА()

   Dim oCmdDefinitions As ControlDefinitions
   Set oCmdDefinitions = ThisApplication.CommandManager.ControlDefinitions
   
   Dim oCtrlDef As ControlDefinition
   Open "c:\CMD_2.txt" For Output As #1
   
   Write #1, "Всего команд: ", oCmdDefinitions.Count
   For Each oCtrlDef In oCmdDefinitions
      Write #1, oCtrlDef.InternalName
   Next
   
   Close #1
End Sub

Всего их свыше двух тысяч.