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. Тип и номер этой рабочей точки изменены быть не могут.
|
Фиксированная рабочая точка
правитьОсобенностью фиксированных рабочих точек является независимость их положения в пространстве по отношению к конструктивным или рабочим элементам, по которым было выполнено первоначальное позиционирование точки «при рождении».
Фиксированные точки создаются методом 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
|
Перемещение фиксированной рабочей точки
правитьПоложение фиксированной рабочей точки в пространстве контролируется ее определяющим объектом (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
Всего их свыше двух тысяч.