Autodesk Inventor API. Первые шаги/2D эскиз

Эскиз — это профиль элемента или любой геометрический объект (траектория сдвига, ось вращения и т.п.), необходимый для создания конструктивного элемента. Это один из ключевых компонентов Инвентора. Вся двумерная геометрия в Инвенторе создается в 2D эскизах.



Особенности 2D эскизов править

 


Все плоские эскизы документа детали «живут» в коллекции Sketches объекта PartComponentDefinition.

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

Количество эскизов в детали можно определить через свойство Sketches.Count.

Доступ к конкретному эскизу можно получить с помощью свойства Item двумя способами.

Формат Sketches.Item(2) вернет ссылку на второй эскиз в коллекции. Контроль диапазона изменения задаваемого номера возлагается на вызывающую программу. Если указанный номер превышает число эскизов Sketches.Count, будет сгенерирована ошибка. Обычно более удобно находить эскиз по его имени, например, Sketches .Item("Боковой") возвращает ссылку на эскиз с именем «Боковой».

Другой важной функцией коллекции Sketches является создание новых эскизов. Для этого у нее предусмотрены два метода — Add и AddWithOrientation.


Введение в плоские эскизы

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

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

Эскиз можно рассматривать как контейнер для 2D объектов. Сам по себе эскиз не добавляет никакой информации к содержащимся в нем 2D объектам. Рассмотрим, к примеру, эскиз на рисунке ниже. В нем содержатся несколько объектов различных видов: линии, окружность, сплайн, геометрические зависимости и размерные ограничения. Эскиз для этих объектов определяет лишь двумерную систему координат.

 

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

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

Первое отличие обнаруживается уже при создании эскиза. Пользовательский интерфейс Инвентора обеспечивает существенно больший сервис и контроль за построениями вследствие автоматического предугадывания Инвентором действий пользователя. Рассмотрим эскиз на рисунке ниже. Единственное, что от вас требуется при создании эскиза, это указать мышью начало линии 1, еще клик мышью для завершения создания линии 1, клик для создания линии 2, перемещением курсора мыши при нажатой левой кнопке создать дугу 3, создать линию 4 и, наконец, клик мышью для создания замыкающей контур линии 5. Всего для создания замкнутого контура потребовалось 5 кликов мышью и одно перемещение для создания дуги. А теперь рассмотрим более детально, что же в действительности происходило в процессе создания эскизе.

 


  • Чтобы создать линию 1, потребовался клик мышью для указания начальной точки. По мере смещения курсора Инвентор отображает символ зависимости, свидетельствующий о горизонтальности либо вертикальности линии. После второго клика определяется положение конца линии и автоматически накладывается зависимость горизонтальности.
  • Поскольку мы по-прежнему находимся в контексте команды Line, перемещение курсора мыши порождает построение линии 2 с началом в конце линии 1. Зависимость совмещения предполагается автоматически. Когда курсор движется вертикально вверх, Инвентор отображает индикатор перпендикулярности новой линии по отношению к предыдущей. В момент указания мышью конца линии 2 создаются две зависимости: совмещение концов линий и перпендикулярности линий друг другу.
  • Построение на следующем шаге дуги сопровождается наложением еще двух зависимостей: совмещения конца линии 2 с началом дуги и зависимости касательности линии 2 и дуги.
  • Линия 4 начинается в момент окончания построения дуги 3. С помощью символа зависимости Инвентор информирует пользователя, при какой ориентации линии 4 будет установлена зависимость касательности с дугой 3 и параллельности линии 1. После завершения построения линии 4 автоматически создаются обе указанных зависимости.
  • Построение линии 5 начинается в момент завершения построения линии 4. При совмещении курсора мыши и точки начала линии 1 Инвентор показывает символ зависимости совмещения. Показывается также символ предполагаемой зависимости параллельности с линией 2. После клика мышью указанные зависимости создаются автоматически.

За пять кликов и операцию сдвига сформировано пять эскизных примитивов и наложено 11 зависимостей.

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

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

 


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

 


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

Рассмотрим пошаговое построение того же самого контура средствами API.

 


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

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

Обратите внимание на тип аргументов — они объявлены не как эскизные точки, а как "Object". Это позволяет нам использовать и Point2d, и существующие SketchPoint. Объект Point2d описывает положение абстрактной математической точки на эскизе. Если аргумент имеет тип Point2d, в этом месте сначала создается эскизная точка SketchPoint, а уже затем линия связывается с этой эскизной точкой зависимостью совмещения. Если аргумент имеет тип SketchPoint, то создавать эскизную точку не требуется и сразу создается зависимость совмещения линии с точкой.

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

Координаты для создания графических примитивов задаются посредством объектов типа Point2d. Это не эскизные геометрические точки, но просто координаты в двумерном пространстве.

Сначала создается ссылка (указатель) на вспомогательную геометрию — объект TransientGeometry. Его функционал потребуется позже.

' Ссылка на вспомогательную геометрию приложения
Dim oTransGeom As TransientGeometry
Set oTransGeom = ThisApplication.TransientGeometry

Не рабочий код. И переменная оSketch в самом начале не определена.

Теперь создадим дугу. Ее центр и конечная точка задаются посредством объектов Point2d, а начальная точка — явной ссылкой на эскизную точку на конце линии 2.

Set oCoord1 = oTransGeom.CreatePoint2d(4, 3)
Set oCoord2 = oTransGeom.CreatePoint2d(4, 4)
Dim oArc As SketchArc
Set oArc = oSketch.SketchArcs.AddByCenterStartEndPoint( _
                    oCoord1, _
                    oLines(2).EndSketchPoint, _
                    oCoord2)

Третья линия опирается на конец дуги и новый объект Point2d:

Set oCoord1 = oTransGeom.CreatePoint2d(0, 4)
Set oLines(3) = oSketch.SketchLines.AddByTwoPoints( _
                    oArc.EndSketchPoint, _
                    oCoord1)

И наконец, последняя линия ставится на эскизные точки на концах первой и предпоследней линий.

Set oLines(4) = oSketch.SketchLines.AddByTwoPoints( _
                    oLines(1).StartSketchPoint, _
                    oLines(3).EndSketchPoint)


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

' горизонтальность линии 1
Call oSketch.GeometricConstraints.AddHorizontal(oLines(1))
' перпендикулярность линий 1 и 2
Call oSketch.GeometricConstraints.AddPerpendicular( _
                                     oLines(1), oLines(2))
' касательность линии 2 дуге
Call oSketch.GeometricConstraints.AddTangent(oLines(2), oArc)
' касательность линии 3 дуге
Call oSketch.GeometricConstraints.AddTangent(oLines(3), oArc)
' параллельность линий 1 и 3
Call oSketch.GeometricConstraints.AddParallel(oLines(1), oLines(3))
' параллельность линий 2 и 4
Call oSketch.GeometricConstraints.AddParallel(oLines(4), oLines(2))

Вот теперь эскиз принимает завершенный вид.

Все прочие виды эскизных графических объектов создаются аналогичным образом. Они также опираются при создании на эскизные точки. Если же координаты передаются через объекты Point2d, то эскизные точки будут созданы автоматически неявным образом. Манипуляции эскизными объектами, как правило, должны производиться через опорные эскизные точки. Например, для перемещения линии потребуется переместить две эскизных точки, на которые опираются концы линии.

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

Создание 2D эскиза править

Создание новых эскизов является важной функцией коллекции Sketches. Для этого у нее предусмотрены всего два метода — Add и AddWithOrientation.


Создание 2D эскиза без изменения его ориентации править

Метод создания нового плоского эскиза зависит от типа заданного на входе плоского объекта.

Public Function Add( _
   ByVal PlanarEntity As Object, _
   Optional ByVal UseFaceEdges As Boolean = False _
) As PlanarSketch

Входные параметры:

  • PlanarEntity — плоский объект, на котором будет создан 2D эскиз. Допускаются либо плоские грани, либо рабочие плоскости.
  • UseFaceEdges — необязательный логический параметр, который определят, следует ли проецировать на эскиз все ребра входной грани, как это происходит при работе в интерактивном режиме. Этот аргумент игнорируется, если первым аргументом является рабочая плоскость. Как видно из объявления метода Add, значением по умолчанию является False. т.е. геометрия эскиза автоматически проецироваться не будет.


Пример

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

Public Sub AddSketch_1()
    ' 'Создание ссылки на определение компонентов детали
    ' Предполагается, что документ детали активен.
    Dim oCompDef As PartComponentDefinition
    Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition

    ' Получим ссылку на первую грань детали,
    ' полагая, что она плоская (кубик все же :)
    Dim oFace As Face
    Set oFace = oCompDef.SurfaceBodies.Item(1).Faces.Item(1)

    ' Создадим новый эскиз.В команде Add вторым аргументом зададим 
    ' режим проецирования на эскиз всех ребер заданной грани.
    Dim oSketch As PlanarSketch
    Set oSketch = oCompDef.Sketches.Add(oFace, True)

    ' Сменим имя на удобное нам
    oSketch.Name = "Мой новый эскиз"
End Sub


Попробуйте повторно выполнить эту процедуру. Ее выполнение будет прервано ошибкой:

 

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

On Error Resume Next
'Сменим имя на удобное нам
oSketch.Name = "Мой новый эскиз"
       
If Err Then
   MsgBox "Эскиз с таким именем уже существует." & vbNewLine & _
          "Измените имя вручную."
   Exit Sub
End If


Если первая грань заданной детали окажется неплоской, работа процедуры будет прервана, и пользователь увидит следующее сообщение об ошибке:

 


Выход довольно очевиден. Прежде чем вызывать метод Add, следует убедиться, что грань плоская. Это можно сделать, проверив значение свойства oFace.SurfaceType нашей грани. И только, если оно равно kPlaneSurface, можно обращаться к методу Add.

Public Sub AddSketch_2()

   ' 'Создание ссылки на определение компонентов детали
   ' Предполагается, что документ детали активен.
   Dim oCompDef As PartComponentDefinition
   Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition

   ' Получим ссылку на первую грань детали,
   ' полагая, что она плоская (кубик все же :)
   Dim oFace As Face
   Set oFace = oCompDef.SurfaceBodies.Item(1).Faces.Item(1)


   ' Если грань плоская, то создаем на ней эскиз.
   ' В противном случае выводим информационное сообщение.
   
   If oFace.SurfaceType = kPlaneSurface Then
      ' Грань плоская. Создаем эскиз.
      ' В команде Add вторым аргументом зададим
      ' режим проецирования на эскиз всех ребер заданной грани.
      Dim oSketch As PlanarSketch
      Set oSketch = oCompDef.Sketches.Add(oFace, True)
   
   
      On Error Resume Next
      ' Сменим имя на удобное нам
      oSketch.Name = "Мой новый эскиз"
       
      If Err Then
         MsgBox "Эскиз с таким именем уже существует." & vbNewLine & _
                "Измените имя вручную."
         Exit Sub
      End If
       
   Else
   
      MsgBox "Нельзя создать плоский эскиз на неплоской грани"
   
   End If

End Sub
 

МИНЗДРАВ предупреждает:
Систематическое пренебрежение проверкой типов входных аргументов приводит к хроническому состоянию глубокого уныния.

Создание ориентированного 2D эскиза править

В целом ряде практических задач чрезвычайно важно не просто уметь программно создавать эскиз, но создавать его в заданной ориентации. Для создания ориентированных 2D эскизов в коллекции Sketches предусмотрен специальный метод AddWithOrientation. Рассмотрим его синтаксис.

Public Function AddWithOrientation( _
   ByVal PlanarEntity As Object, _
   ByVal AxisEntity As Object, _
   ByVal NaturalAxisDirection As Boolean, _
   ByVal AxisIsX As Boolean, _
   ByVal Origin As Object, _
   Optional ByVal UseFaceEdges As Boolean = False _
) As PlanarSketch

Параметры

PlanarEntity
Плоская грань или рабочая плоскость, на которых должен быть создан эскиз.

AxisEntity
Прямое ребро, эскизная линия из другого эскиза либо рабочая ось, которые задают направление оси X или Y создаваемого эскиза. Какая именно из осей будет ориентирована в этом направлении, задается параметром AxisIsX. Задаваемый объект не обязан находится в плоскости эскиза, но не должен быть ей перпендикулярен.

NaturalAxisDirection
Логический параметр. Если равен TRUE, то направление координатной оси X или Y эскиза совпадает с направлением объекта AxisEntity, если FALSE, то ему противоположно.

AxisIsX
Логический параметр. Если он равен TRUE, то опорным направлением, задаваемым параметром AxisEntity, считается ось X, если FALSE, то ось Y.

Origin
Входной аргумент, определяющий положение начала координат создаваемого эскиза. Допустимые варианты: вершина (vertex), рабочая точка или эскизная точка в другом эскизе. Задаваемый здесь объект не обязан находится в плоскости эскиза.

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

' Пример создания ориентированного 2D эскиза с использованием
' метода Sketches.AddWithOrientation
'
' Перед выполненим программы откройте документ детали,
' содержащий прямоугольный параллелепипед.
'
Public Sub AddOrientedSketch()

   ' Создание ссылки на определение компонентов
   ' активного документа детали
   Dim oCompDef As PartComponentDefinition
   Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition

   ' Получим ссылку на первую грань детали (первый элемент в коллекции граней)
   ' Молчаливо предполагается, что грани плоские,
   ' Именно поэтому для примера выбран прямоугольный параллелепипед.

   Dim oFace As Face
   Set oFace = oCompDef.SurfaceBodies.Item(1).Faces.Item(1)

   ' Выбираем одно из ребер нашей грани. Здесь это второе ребро.
   ' Ребро будет определять направление оси X будущего эскиза.
   Dim oEdge As Edge
   Set oEdge = oFace.Edges.Item(2)

   ' Указываем стартовую вершину ребра, здесь мы разместим
   ' начало координатной системы будущего эскиза
   Dim oVertex As Vertex
   Set oVertex = oEdge.StartVertex

   ' Создаем ориентированный эскиз.
   '
   ' Вдоль ребра oEdge направлена ось X.
   ' Ребра входной грани oFace проецируются на создаваемый эскиз.
   ' Начало координат эскиза помещается в точку oVertex.
   '
   Dim oSketch As PlanarSketch
   Set oSketch = oCompDef.Sketches.AddWithOrientation( _
                     oFace, _
                     oEdge, _
                     True, _
                     True, _
                     oVertex, _
                     True)

   ' Переименуем эскиз #1. Не забывайте, что двух одноименных эскизов
   ' в детали быть не должно. При попытке дать существующее имя
   ' будет сгенерирована ошибка.
   oSketch.Name = "Ориентированный эскиз 1"

   ' Создаем в эскизе окружность с центром в начале координат эскиза (0,0)
   ' и радиусом 10 мм
   Dim oCircle As SketchCircle
   Set oCircle = oSketch.SketchCircles.AddByCenterRadius( _
               ThisApplication.TransientGeometry.CreatePoint2d(0, 0), 1)

   ' Создаем эскизную линию из начала координат в направлении оси X длиной 10 мм.
   Call oSketch.SketchLines.AddByTwoPoints( _
                     oCircle.CenterSketchPoint, _
                     ThisApplication.TransientGeometry.CreatePoint2d(1, 0))
   
   ' Создадим еще один эскиз на другой грани с номером #5.
   ' Его начало коордитат совместим с началом координат детали
   ' (это первая рабочая точка в коллекции рабочих точек документа детали).
   ' Проецирование ребер на эскиз подавляем - последний аргумент опущен,
   ' следовательно принимается его значение мо умолчанию FALSE.

   Set oFace = oCompDef.SurfaceBodies.Item(1).Faces.Item(5)
   Set oEdge = oFace.Edges.Item(1)
   Set oSketch = oCompDef.Sketches.AddWithOrientation( _
                     oFace, _
                     oEdge, _
                     True, _
                     True, _
                     oCompDef.WorkPoints.Item(1))

   ' Переименуем эскиз #2
   oSketch.Name = "Эскиз в начале координат 2"

   ' Создаем в эскизе окружность с центром в начале координат эскиза (0,0)
   ' и радиусом 10 мм
   Set oCircle = oSketch.SketchCircles.AddByCenterRadius( _
               ThisApplication.TransientGeometry.CreatePoint2d(0, 0), 1)

   ' Создаем эскизную линию из начала координат в направлении оси X длиной 10 мм.
   Call oSketch.SketchLines.AddByTwoPoints( _
                     oCircle.CenterSketchPoint, _
                     ThisApplication.TransientGeometry.CreatePoint2d(1, 0))
                
End Sub

Изменение существующего эскиза править

Открытие эскиза для редактирования в интерактивном режиме править

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

Public Sub StartSketchEdit()

   ' Создание ссылки на коллекцию 2D эскизов
   ' в активном документе детали.
   Dim oSketches As PlanarSketches
   Set oSketches = ThisApplication.ActiveDocument.ComponentDefinition.Sketches

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

   On Error Resume Next
   Dim oSketch As PlanarSketch
   Set oSketch = oSketches.Item("Sketch1")
   If Err Then
       MsgBox "Эскиз с именем ""Sketch1"" на обнаружен." & vbNewLine & _
              "Выполнение процедуры ""StartSketchEdit"" прервано."
       Exit Sub
   End If
   On Error GoTo 0   'восстановление обычного режима обработки ошибок

   ' Открытие эскиза в режиме редактирования (Edit mode)
   oSketch.Edit
   
End Sub

Внесение изменений в эскиз править

В данном примере сначала на базовой рабочей плоскости XY создается новый эскиз, затем эскиз переводится в режим редактирования и в нем создается эскизная линия между точками (0,0) и (5,5). На этом режим редактирования завершается.

Public Sub EditSketch_1()

   'Создание ссылки на определение компонентов активного документа детали
   Dim oCompDef As PartComponentDefinition
   Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
   
   'Создание ссылки на базовую рабочую плоскость XY
   Dim oPlane As WorkPlane
   Set oPlane = oCompDef.WorkPlanes.Item(3)
   
   'Создание эскиза
   Dim oSketch As PlanarSketch
   Set oSketch = oCompDef.Sketches.Add(oPlane)
   
   'Вход в режим редактирования эскиза
   oSketch.Edit
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   'Создание отрезка между точками (0,0) и (5,5)
   'Расстояния  измеряются в сантиметрах!
   Dim oLine As SketchLine
   Set oLine = oSketch.SketchLines.AddByTwoPoints( _
                           oTg.CreatePoint2d(0, 0), _
                           oTg.CreatePoint2d(5, 5))
   
   'Выход из режима редактирования эскиза
   oSketch.ExitEdit
  
End Sub

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

Public Sub EditSketch_2()

   'Создание ссылки на определение компонентов активного документа детали
   Dim oCompDef As PartComponentDefinition
   Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
   
   'Создание ссылки на базовую рабочую плоскость XY
   Dim oPlane As WorkPlane
   Set oPlane = oCompDef.WorkPlanes.Item(3)
   
   'Создание эскиза
   Dim oSketch As PlanarSketch
   Set oSketch = oCompDef.Sketches.Add(oPlane)
   
   'Внесение в эскиз изменений без входа в режим редактирования
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   'Создание отрезка между точками (0,0) и (5,5)
   'Расстояния  измеряются в сантиметрах!
   Dim oLine As SketchLine
   Set oLine = oSketch.SketchLines.AddByTwoPoints( _
                           oTg.CreatePoint2d(0, 0), _
                           oTg.CreatePoint2d(5, 5))
  
End Sub

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

Изменение ориентации эскиза править

Для начала рассмотрим задачу изменения плоскости, в которой лежит эскиз. Разместим имеющийся в документе детали произвольно ориенированный эскиз в базовой рабочей плоскости YZ системы координат детали. С точки зрения эскиза изменится его свойство PlanarEntity. В результате преобразования будут совмещены начало координат и направления осей X и Y эскиза и детали.

Sub RedefineSketch2dPlane()

   Dim oPartDoc As PartDocument
   Set oPartDoc = ThisApplication.ActiveDocument
   
   Dim oCompDef As PartComponentDefinition
   Set oCompDef = oPartDoc.ComponentDefinition
   
   'ссылка на конкретный 2D эскиз документа детали
   Dim oSketch As PlanarSketch
   Set oSketch = oCompDef.Sketches.Item(1)
   
   'Ссылка на базовую плоскость YZ системы координат
   Dim oYZPlane As WorkPlane
   Set oYZPlane = oCompDef.WorkPlanes.Item(1)
   
   'Переопределение плоскости, в которой лежит эскиз
   oSketch.PlanarEntity = oYZPlane

End Sub


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

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

Public Sub ChangeSketchPlane()
    
    ' Получим ссылку на определение компонентов детали.
    ' Документ детали является активным.
    Dim oCompDef As PartComponentDefinition
    Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition
    
    ' Получим ссылку на первую грань модели.
    ' Предполагается, что в модели грани являются плоскими.
    ' Поэтому предлагается применить программу к параллелепипеду.
    Dim oFace As Face
    Set oFace = oCompDef.SurfaceBodies.Item(1).Faces.Item(1)

    ' Создадим новый эскиз на грани oFace
    Dim oSketch As PlanarSketch
    Set oSketch = oCompDef.Sketches.Add(oFace, True)

    ' Создадим окружность с центром в начале координат эскиза
    ' и радиусом 10 мм
    Dim oCircle As SketchCircle
    Set oCircle = oSketch.SketchCircles.AddByCenterRadius( _
                ThisApplication.TransientGeometry.CreatePoint2d(0, 0), 1)
                
    ' Создадим линию из центра окружности вдоль оси X длиной 10 мм
    Call oSketch.SketchLines.AddByTwoPoints(oCircle.CenterSketchPoint, _
                ThisApplication.TransientGeometry.CreatePoint2d(1, 0))


    ' %%%%% Преобразование #1 %%%%%
    
    MsgBox "#1: Эскиз будет перемешен на другую грань."

    ' Перемещаем эскиз на вторую грань модели.
    Set oFace = oCompDef.SurfaceBodies.Item(1).Faces.Item(2)
    oSketch.PlanarEntity = oFace

    MsgBox "Текущее начало СК эскиза: " & _
                    oSketch.OriginPointGeometry.X & ", " & _
                    oSketch.OriginPointGeometry.Y & ", " & _
                    oSketch.OriginPointGeometry.Z & Chr(13) & Chr(13) & _
            "Начало СК эскиза будет установлено в центральную точку."
    
    
    ' %%%%% Преобразование #2 %%%%%
    
    ' Ставим точку начала СК в центральную точку
    oSketch.OriginPoint = oCompDef.WorkPoints.Item(1)
           
    MsgBox "#2: Текущее начало СК эскиза: " & _
                    oSketch.OriginPointGeometry.X & ", " & _
                    oSketch.OriginPointGeometry.Y & ", " & _
                    oSketch.OriginPointGeometry.Z & Chr(13) & Chr(13) & _
            "Начало СК эскиза установлено в центральную точку."

    MsgBox "Текущая ось X: " & _
                    oSketch.AxisEntityGeometry.Direction.X & ", " & _
                    oSketch.AxisEntityGeometry.Direction.Y & ", " & _
                    oSketch.AxisEntityGeometry.Direction.Z

    
    ' %%%%% Преобразование #3 %%%%%
    
    MsgBox "#3: Ось X эскиза сейчас будет переопределена."


    ' Установим ось вдоль одного из ребер грани.
    oSketch.AxisEntity = oFace.Edges.Item(2)

    
    MsgBox "Новая ось X: " & _
                    oSketch.AxisEntityGeometry.Direction.X & ", " & _
                    oSketch.AxisEntityGeometry.Direction.Y & ", " & _
                    oSketch.AxisEntityGeometry.Direction.Z
    
    
    ' %%%%% Преобразование #4 %%%%%
    
    MsgBox "#4: Направление оси будет изменено на противоположное."
    
    ' Реверс направления оси
    oSketch.NaturalAxisDirection = False

    MsgBox "новая ось X: " & _
                    oSketch.AxisEntityGeometry.Direction.X & ", " & _
                    oSketch.AxisEntityGeometry.Direction.Y & ", " & _
                    oSketch.AxisEntityGeometry.Direction.Z

    
    ' %%%%% Преобразование #5 %%%%%
    
    MsgBox "#5: Направление оси будет изменено так, чтобы поменять местами направления X и Y."

    ' Переопределение оси X.
    oSketch.AxisIsX = False
    
End Sub

Удаление эскиза править

Для удаления эскиза из документа детали предназначен метод PlanarSketch.Delete.

Метод работает только для тех эскизов, которые не используются конструктивными элементами. Зависимости этого рода отслеживаются коллекцией PanarSketch.Dependents. Если она не пуста, т.е. PanarSketch.Dependents.Count > 0, то попытка удаления эскиза приведет к ошибке. Чтобы удалить такой эскиз, требуется сначала ликвидировать все зависимые объекты.

Метод не будет работать и в случае производных компонентов. Для выявления подобных ситуаций служит свойство HasReferenceComponent, которое возвращает TRUE, если объект принадлежит производному компоненту. В таких случаях свойство ReferenceComponent хранит ссылку на объект-источник.


Рассмотрим пример программного удаления эскиза. Пример потребует открыть документ детали, содержащий эскиз с именем «Sketch1». Эскиз не должен иметь никаких зависимых конструктивных элементов.

Public Sub DeleteSketch()

    ' Set a reference to the Sketches collection. This assumes
    ' that a part document containing a sketch is active.
    
    ' Обратимся к активному документу детали и
    ' получим ссылку на его коллекцию эскизов.
    Dim oSketches As PlanarSketches
    Set oSketches = ThisApplication.ActiveDocument.ComponentDefinition.Sketches

    ' Получим ссылку на эскиз с именем "Sketch1".
    ' на случай его отсутствия предусматриваем обработку ошибок
    On Error Resume Next
    Dim oSketch As PlanarSketch
    Set oSketch = oSketches.Item("Sketch1")
    If Err Then
        MsgBox "Эскиз с именем ""Sketch1"" не найден."
        Exit Sub
    End If
    On Error GoTo 0

    ' Есть ли зависимые конструктивные элементы
    If oSketch.Dependents.Count > 0 Then
        MsgBox "Нельзя удалить эскиз, на который" & vbNewLine & _
               "ссылаются конструктивные элементы."
    Else
        ' Удаляем эскиз
        oSketch.Delete
    End If
End Sub

Эскизные элементы править

Эскизная точка SketchPoint править

Создание эскизных точек править

Эскизные точки хранятся в коллекции SketchPoints эскиза. Счетчик SketchPoints.Count показывает количество эскизных точек в эскизе. Для их создания предусмотрен единственный метод Add с довольно простым синтаксисом:

Public Function Add( _
   ByVal Point As Point2d, _
   Optional ByVal HoleCenter As Boolean = True _
) As SketchPoint

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

Рассмотрим пример создания точек. Активируйте режим редактирования эскиза и запустите на исполнение следующую процедуру:

Public Sub SketchPointsTest()

   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   Dim oCoord As Point2d
   Dim oPoint As SketchPoint
   
   'Создание точки #1
   Set oCoord = oTg.CreatePoint2d(1, 1)
   Set oPoint = oSketch.SketchPoints.Add(oCoord, True)
   
   'Создание точки #2
   Set oCoord = oTg.CreatePoint2d(2, 2)
   Set oPoint = oSketch.SketchPoints.Add(oCoord, False)

   MsgBox "Общее количество эскизных точек: " & _
                            oSketch.SketchPoints.Count
End Sub


Свойство Geometry объекта SketchPoint возвращает объект Point2d, через который можно получить координаты (x,y) эскизной точки в системе координат эскиза:
x = SketchPoint.Geometry.X
y = SketchPoint.Geometry.Y


Перемещение эскизных точек править

Для перемещения эскизных точек предусмотрены методы MoveTo и MoveBy. Например, команда
Call oPoint.MoveTo(oTg.CreatePoint2d(1, 2))
переместит точку oPoint в положение с явно указанными с координатами x=10 мм, y=20 мм. А команда
Call oPoint.MoveBy(oTg.CreateVector2d(-1, 0))
задает вектор смещения точки oPoint из текущего положения на 10 мм влево.

 

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


Расстояние между эскизными точками править

Для вычисления расстояния L между двумя существующими эскизными точками oPoint1 и oPoint2 можно воспользоваться методом SketchPoint.DistanceTo:

L = oPoint1.Geometry.DistanceTo(oPoint2.Geometry)

То же самое, естественно, можно вычислить и по теореме Пифагора:

With oPoint1.Geometry
   x1 = .X
   y1 = .Y
End With
      
With oPoint2.Geometry
   x2 = .X
   y2 = .Y
End With
      
L = Sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2)

Но этот вариант работает примерно на 60% медленнее метода DistanceTo. Впрочем, если вспомнить, что возведение в степень выполняется существенно дольше умножения, и слегка модифицировать команду вычисления расстояния
L = Sqr((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)),
то можно сравняться и по скорости:

Вы вольны выбрать любой способ. Лично мне больше нравится встроенный метод SketchPoint.DistanceTo.


Слияние эскизных точек править

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

Эскизная линия SketchLine править

Создание эскизных линий править

Для создания эскизных линий в коллекции SketchLines предусмотрены три метода.

  • AddByTwoPoints
  • AddAsTwoPointRectangle
  • AddAsThreePointRectangle


AddByTwoPoints

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

Public Function AddByTwoPoints( _
   ByVal StartPoint As Object, _
   ByVal EndPoint As Object _
) As SketchLine

Здесь StartPoint и EndPoint — объекты, которые определяют начальную и конечную точку создаваемой линии. Допускаются либо объект типа Point2d, задающий координатную точку (x,y), либо уже существующий объект SketchPoint. В последнем случае заданная эскизная точка и становится начальной или конечной точкой линии, соответственно.

Пример 1. Создание линии методом AddByTwoPoints

Public Sub FirstLine()

   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   'Создание координат точек для построения линии
   Dim oCoord(1 To 2) As Point2d
   
   Set oCoord(1) = oTg.CreatePoint2d(1, 1)
   Set oCoord(2) = oTg.CreatePoint2d(2, 2)
   
   'Создание линии
   Dim oLine As SketchLine
   Set oLine = oSketch.SketchLines.AddByTwoPoints(oCoord(1), oCoord(2))
   
   ' Выведем длину последней созданной эскизной линии
   MsgBox "Длина эскизной линии (мм): " & _
      oSketch.SketchLines(oSketch.SketchLines.Count).Length * 10

End Sub

Умножение на 10 в последней команде понадобилось, чтобы перейти к миллиметрам от внутренней единицы измерения расстояний в Инвенторе — сантиметра.


AddAsTwoPointRectangle

Этот метод за один прием создает сразу четыре эскизных линии в форме прямоугольника со сторонами, параллельными осям X и Y эскиза. Аргументами являются две точки на концах диагонали прямоугольника. Если точки будут лежать на одной горизонтали или одной вертикали, метод AddAsTwoPointRectangle выдаст ошибку.

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

Public Function AddAsTwoPointRectangle( _
   ByVal CornerPointOne As Object, _
   ByVal CornerPointTwo As Object _
) As SketchEntitiesEnumerator

Допустимые типы входных аргументов — Point2d или SketchPoint. В последнем случае указанная эскизная точка становится началом/концом создаваемых линий и, таким образом, угловой точкой прямоугольника.

Тип возвращаемого результата — коллекция типа SketchEntitiesEnumerator, состоящая в данном случае из четырех объектов типа SketchLine.

Public Sub AddAsTwoPointRectangle_Example()

   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   'Создание координат точек для построения линии
   Dim oCoord(1 To 2) As Point2d
   
   Set oCoord(1) = oTg.CreatePoint2d(1, 1)
   Set oCoord(2) = oTg.CreatePoint2d(4, 2)
   
   'Создание прямоугольника
   Dim oRectangleLines As SketchEntitiesEnumerator
   Set oRectangleLines = oSketch.SketchLines.AddAsTwoPointRectangle(oCoord(1), oCoord(2))

   ‘Проверка количества и типов созданных эскизных элементов
   Dim St As String
   Dim SkEnt  As SketchEntity

   For Each SkEnt In oRectangleLines
      St = St & SkEnt.Type & vbNewLine
   Next
   MsgBox St

End Sub

Контрольный вывод в MsgBox показывает четыре одинаковых значения 83896064, которые соответствуют типу объекта kSketchLineObject.


 

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


AddAsThreePointRectangle

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

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

Public Function AddAsThreePointRectangle( _
   ByVal BasePointOne As Object, _
   ByVal BasePointTwo As Object, _
   ByVal HeightPoint As Point2d _
) As SketchEntitiesEnumerator

Основание прямоугольника задается первыми двумя точками, а высота — третьей. Точками для основания могут служить либо точки вспомогательной геометрии Point2d, либо существующие эскизные точки SketchPoint. В последнем случае заданные точки становятся концами линии основания.

 


Линия основания задает как длину основания, так и ориентацию прямоугольника. Задающей высоту прямоугольника точкой всегда является объект Point2d, как показано на рисунке. Эта точка может располагаться в произвольном месте. Высота прямоугольника равняется расстоянию от этой точки до прямой, на которой лежит отрезок основания прямоугольника. При нулевой высоте метод выдаст ошибку.

Создаваемые данным методом эскизные линии возвращаются в составе коллекции SketchEntitiesEnumerator.

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

Public Sub AddAsThreePointRectangle_Example()

   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   'Создание координат точек для построения линии
   Dim oCoord(1 To 3) As Point2d
   
   Set oCoord(1) = oTg.CreatePoint2d(1, 1)
   Set oCoord(2) = oTg.CreatePoint2d(4, 2)
   Set oCoord(3) = oTg.CreatePoint2d(-1, 2)
   
   'Создание прямоугольника
   Dim oRectangleLines As SketchEntitiesEnumerator
   Set oRectangleLines = oSketch.SketchLines.AddAsThreePointRectangle( _
                              oCoord(1), _
                              oCoord(2), _
                              oCoord(3))
   'Проверка количества и типов созданных эскизных элементов
   Dim St As String
   Dim SkEnt  As SketchEntity

   For Each SkEnt In oRectangleLines
      St = St & SkEnt.Type & vbNewLine
   Next
   MsgBox St

End Sub

Свойства эскизной линии править

Centerline

Construction

StartSketchPoint

EndSketchPoint

Length

Parent


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

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

 


dim UVec2d as UnitVector2d
set UVec2d = oSketchLine.Geometry.LineSegment2d.Direction

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

Окружность SketchCircle править

В плоском эскизе PlanarSketch окружность представлена объектом SketchCircle.

Ссылки на все окружности эскиза хранятся в отдельной коллекции SketchCircles. Как обычно, ее свойство Count возвращает количество окружностей в данном эскизе, а свойство Item обеспечивает доступ к конкретной окружности по ее номеру в коллекции. Нумерация объектов начинается с единицы.

Разработчиками API предусмотрены два метода создания окружностей:

  • AddByCenterRadius — требуется указание положения центра и радиуса;
  • AddByThreePoints — по трем несовпадающим и не лежащим на одной прямой координатным точкам Point2d.

Ниже приведен пример построения окружности с центром в точке (20,20) и радиусом 10 мм.

В примере использованы три полезных свойства объекта SketchCircle:

  • SketchCircle.Geomery возвращает объект Circle2d, из которого можно извлечь ее центр — объект типа Point2d;
  • SketchCircle.Radius возвращает радиус окружности в сантиметрах;
  • SketchCircle.Area возвращает площадь окружности, выраженную в квадратных сантиметрах.
Public Sub AddCircle()
   
   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   'Создание координат для центра  окружности
   Dim oCoord As Point2d
   Set oCoord = oTg.CreatePoint2d(2, 2)
   
   'Создание окружности R=10 мм
   Dim oCircle As SketchCircle
   Set oCircle = oSketch.SketchCircles.AddByCenterRadius(oCoord, 1)
   
   'сделаем окружность конструкционной
   oCircle.Construction = True
   
   With oCircle
      MsgBox "Площадь окружности (кв.мм): " & Round(oCircle.Area * 100, 2) _
              & vbNewLine & _
             "Центр (мм): (" & .Geometry.Center.x * 10 & " , " & _
                          .Geometry.Center.y * 10 & " )" & vbNewLine & _
             "Радиус (мм): " & .Radius * 10
   
   End With
   
End Sub

Дуга SketchArc править

В плоском эскизе PlanarSketch круглая дуга представлена объектом SketchArc.

В эскизе ссылки на дуги хранятся в коллекции SketchArcs. Ее свойство Count возвращает количество дуг в эскизе, а свойство Item обеспечивает доступ к конкретной дуге по ее номеру в коллекции. Нумерация объектов начинается с единицы.

Разработчиками API предусмотрены следующие методы создания дуг:

  • AddByCenterStartSweepAngle — требуется указание положения центра дуги, ее радиуса, начального угла и угла раствора дуги.
Public Sub AddArc_1()

   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   'Создание координат для вставки дуги
   Dim oCoord As Point2d
   Set oCoord = oTg.CreatePoint2d(-1, 1)
   
   'Cоздание дуги
   Dim oArc As SketchArc
   Set oArc = oSketch.SketchArcs.AddByCenterStartSweepAngle(oCoord, 2, 0, 1)

End Sub


  • AddByCenterStartEndPoint — требуется указание положенияцентра дуги, начальной и конечной точек. Направление дуги и, соответственно, угол раствора дуги задается необязательным четвертым логическим параметром CounterClockwise. По умолчанию принимается положительное направления отсчета углов. Радиус дуги определяется по начальной точке.
Private Sub AddArc_2()

   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   'создадим три точки
   Dim oP(1 To 3) As Point2d
   Set oP(1) = oTg.CreatePoint2d(-4, 0)
   Set oP(2) = oTg.CreatePoint2d(0, -2)
   Set oP(3) = oTg.CreatePoint2d(4, 0)

   'Cоздание дуги
   Dim oArc As SketchArc
   Set oArc = oSketch.SketchArcs.AddByCenterStartEndPoint(oP(2), oP(1), oP(3))

End Sub


  • AddByFillet — дуга создается как результат сопряжения двух эскизных элементов. Задаются сами эскизные элементы, радиус и точки на эскизных элементах, где начинается и завершается дуга.
Public Sub AddArc_3()

   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   'создадим две линии
   Dim oLine1 As SketchLine
   Dim oLine2 As SketchLine
   Set oLine1 = oSketch.SketchLines.AddByTwoPoints( _
                     oTg.CreatePoint2d(-4, -2), _
                     oTg.CreatePoint2d(2, 1))
   Set oLine2 = oSketch.SketchLines.AddByTwoPoints( _
                     oTg.CreatePoint2d(-3, 3), _
                     oTg.CreatePoint2d(2, 2.5))
   
   'Создание координат для вставки дуги
   Dim oCoord1 As Point2d
   Set oCoord1 = oLine1.EndSketchPoint.Geometry
   Dim oCoord2 As Point2d
   Set oCoord2 = oLine2.EndSketchPoint.Geometry
      
   'задаем радиус = 12 мм
   Dim R As Double
   R = 1.2

   'Cоздание дуги
   Dim oArc As SketchArc
   Set oArc = oSketch.SketchArcs.AddByFillet(oLine1, oLine2, R, oCoord1, oCoord2)

End Sub


  • AddByThreePoints — дуга строится по трем точкам (начальной, средней и конечной). Положение центра и радиус дуги определяются автоматически.
Private Sub AddArc_4()

   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   'создадим три точки
   Dim oP(1 To 3) As Point2d
   Set oP(1) = oTg.CreatePoint2d(-4, 0)
   Set oP(2) = oTg.CreatePoint2d(0, -2)
   Set oP(3) = oTg.CreatePoint2d(4, 0)

   'Cоздание дуги
   Dim oArc As SketchArc
   Set oArc = oSketch.SketchArcs.AddByThreePoints(oP(1), oP(3), oP(2))

End Sub


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

Стоит отметить, что начальная и конечная точки дуги (StartSketchPoint и EndSketchPoint, соответственно) не зависят от направления построения дуги. Дуга ВСЕГДА идет от начальной к конечной точке в положительном направлении изменения углов, т.е. против часовой стрелки.

Метод Delete() удаляет дугу из эскиза.

Свойства объекта SketchArc обеспечивают доступ ко всем геометрическим параметрам дуги. В частности, свойство Length() возвращает ее длину.

Эллипс SketchEllipse править

В плоском эскизе PlanarSketch эллипс представлен объектом SketchEllipse.

В эскизе ссылки на эллипсы хранятся в коллекции SketchEllipses. Ее свойство Count возвращает количество эллипсов в эскизе, а свойство Item обеспечивает доступ к конкретному эллипсу по его номеру в коллекции. Нумерация объектов начинается с единицы.

Методу Add для создания эллипса следует сообщить центральную точку эллипса (SketchPoint или Point2d), направление главной оси (единичный вектор UnitVector2d) и два радиуса (Double).

Private Sub AddEllips()
   
   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   'Создание координат центральной точки эллипса
   Dim oCoord As Point2d
   Set oCoord = oTg.CreatePoint2d(1, 1)
   
   'Создание единичного вектора для задания
   'направления главной оси эллипса
   Dim oVector As UnitVector2d
   Set oVector = oTg.CreateUnitVector2d(1, 1)
   
   'Cоздание эллипса
   Dim oEllips As SketchEllipse
   Set oEllips = oSketch.SketchEllipses.Add(oCoord, oVector, 4, 2)
   
End Sub

Эллиптическая дуга SketchEllipticalArc править

В плоском эскизе PlanarSketch эллиптические дуги представлены объектом SketchEllipticalArc.

В эскизе ссылки на эллипсы хранятся в коллекции SketchEllipses. Ее свойство Count возвращает количество дуг в эскизе, а свойство Item обеспечивает доступ к конкретной дуге по ее номеру в коллекции. Нумерация объектов начинается с единицы.

Методу Add для создания эллиптической дуги следует сообщить центральную точку эллипса (SketchPoint или Point2d), направление главной оси (единичный вектор UnitVector2d) и оба радиуса (см), начальный угол и угол раствора дуги (радианы).

Public Sub Add_SketchEllipticalArc()
   
   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   'Создание координат центральной точки эллипса
   Dim oCenterPoint As Point2d
   Set oCenterPoint = oTg.CreatePoint2d(0, 0)
   
   'Создание единичного вектора для задания
   'направления главной оси эллипса
   Dim oMajorAxisVector As UnitVector2d
   Set oMajorAxisVector = oTg.CreateUnitVector2d(1, 0)
   
   Dim PI As Double
   PI = 4 * Atn(1)    'число Пи
   
   Dim MajorRadius As Double
   Dim MinorRadius As Double
   Dim StartAngle As Double
   Dim SweepAngle As Double
   
   MajorRadius = 4
   MinorRadius = 2
   
   StartAngle = 3 * PI / 2
   SweepAngle = PI / 2
   
   'Cоздание эллиптической дуги
   Dim oEArc As SketchEllipticalArc
   Set oEArc = oSketch.SketchEllipticalArcs.Add( _
                              oCenterPoint, _
                              oMajorAxisVector, _
                              MajorRadius, _
                              MinorRadius, _
                              StartAngle, _
                              SweepAngle)
   
   'Координаты точки вставки размера
   Dim oTextCoord As Point2d
   Set oTextCoord = oTg.CreatePoint2d(-1, -0.5)
   
   ' Простановка радиусного размера
   Dim oEllipseRadiusDim As EllipseRadiusDimConstraint
   Set oEllipseRadiusDim = oSketch.DimensionConstraints. _
                              AddEllipseRadius(oEArc, False, oTextCoord)
   
End Sub

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

Для удаления дуги применяется метод Delete().

Свойства объекта SketchEllipticalArc обеспечивают доступ ко всем геометрическим параметрам дуги. Например, свойство Length() возвращает ее длину в сантиметрах.

Сплайн SketchSpline править

В плоском эскизе PlanarSketch сплайны представлены объектом SketchSpline.

В эскизе ссылки на сплайны хранятся в коллекции SketchSplines. Ее свойство Count возвращает количество сплайнов в эскизе, а свойство Item обеспечивает доступ к конкретному сплайну по его номеру в коллекции. Нумерация объектов начинается с единицы.

Метод Add создает интерполяционный сплайн на множестве задающих точек — вершин (SketchPoint или Point2d), переданных на вход в составе коллекции объектов типа ObjectCollection. Если координаты вершины заданы объектом Point2d, то в этом месте автоматически будет создана эскизная точка SketchPoint. Сплайн будет проходить через все вершины с автоматическим наложением геометрических зависимостей типа SplineFitPointConstraints.

Необязательный второй аргумент имеет тип SplineFitMethodEnum и определяет метод подгонки. Имеются следующие варианты:

  • kSmoothSplineFit — интерполяция сглаженным сплайном с одинаковой кривизной сегментов по обе стороны от вершины.
  • kSweetSplineFit — интерполяция эрмитовой кривой «с минимальной энергией»
  • kACADSplineFit — интерполяция методом, принятым в AutoCAD, — NURBS (неоднородный рациональный B-сплайн).


' Пример из справочной системы Autodesk Inventor
' Иллюстрирует создание и модифицирование эскизного сплайна.
'
' Эскиз должен быть активен.
'
Public Sub DrawSketchSpline()
    
    ' Проверка: активен ли эскиз?
    If Not TypeOf ThisApplication.ActiveEditObject Is PlanarSketch Then
        MsgBox "Следует активировать эскиз."
        Exit Sub
    End If

    ' получим ссылку на активный эскиз
    Dim oSketch As PlanarSketch
    Set oSketch = ThisApplication.ActiveEditObject

    ' ссылка на вспомогательную геометрию
    Dim oTransGeom As TransientGeometry
    Set oTransGeom = ThisApplication.TransientGeometry

    ' создадим коллекцию, в которой разместим вершинные точки сплайна
    Dim oFitPoints As ObjectCollection
    Set oFitPoints = ThisApplication.TransientObjects.CreateObjectCollection
   
    
    ' Зададим вершины сплайна.
    ' В данном примере используются точки вспомогательной геометрии.
    ' Но это могут быть и эскизные точки. В этом случае именно к ним
    ' сплайн будет "привязан" зависимостями.
    ' Координаты точек: (0,0), (2,2), (4,0), (6,4), (7,-1).
    
    Dim oPoints(1 To 5) As Point2d
    
    Set oPoints(1) = oTransGeom.CreatePoint2d(0, 0)
    oFitPoints.Add oPoints(1)

    Set oPoints(2) = oTransGeom.CreatePoint2d(2, 2)
    oFitPoints.Add oPoints(2)

    Set oPoints(3) = oTransGeom.CreatePoint2d(4, 0)
    oFitPoints.Add oPoints(3)

    Set oPoints(4) = oTransGeom.CreatePoint2d(6, 4)
    oFitPoints.Add oPoints(4)

    Set oPoints(5) = oTransGeom.CreatePoint2d(7, -1)
    oFitPoints.Add oPoints(5)

    ' Создадим сплайн
    Dim oSpline As SketchSpline
    Set oSpline = oSketch.SketchSplines.Add(oFitPoints)

    ' Сделаем полученную кривую замкнутой
    oSpline.Closed = True

    ' Третью вершину зафиксируем зависимостью Ground
    Call oSketch.GeometricConstraints.AddGround(oSpline.FitPoint(3))

    ' Добавим дополнительную вершину
    Dim oNewPoint As Point2d
    Set oNewPoint = oTransGeom.CreatePoint2d(8, 8)
    Call oSpline.InsertFitPoint(oNewPoint, 5, True)

    ' переопределим вершину #2
    Call oSpline.FitPoint(2).MoveTo(oTransGeom.CreatePoint2d(2, 3))

    ' удаление вершины путем удаления соответствующей эскизной точки
    oSpline.FitPoint(2).Delete
    
End Sub

Фиксированный SketchFixedSpline править

Объект SketchFixedSpline представляет собой фиксированный сплайн в эскизе. Геометрия для его создания передается объектом BSplineCurve2d (NURBS — неоднородный рациональный B-сплайн).

Ссылки на такие сплайны хранятся в коллекции SketchFixedSplines эскиза. Ее свойство Count возвращает количество сплайнов в эскизе, а свойство Item обеспечивает доступ к конкретному сплайну по его номеру в коллекции. Нумерация объектов начинается с единицы.


Метод Add коллекции SketchFixedSplines создает в эскизе новый фиксированный сплайн на базе геометрии, представленной входным аргументом в виде объекта BSplineCurve2d.

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

Возможно преобразование фиксированного сплайна в «обычный» SketchSpline. Этой цели служит метод ConvertToSpline().

' Пример из справочной системы Autodesk Inventor
' Иллюстрирует создание эскизного сплайна
' с использованием задания геометрии (NURB).
' API поддерживает создание 3D сплайнов таким же образом.
' Документ детали должен быть активен.

Public Sub SplineByDefinition()

    ' Ссылка на определение компонентов детали
    ' Предполагается, что документ детали должен быть активен.
    Dim oCompDef As PartComponentDefinition
    Set oCompDef = ThisApplication.ActiveDocument.ComponentDefinition

    ' Ссылка на вспомогательную геометрию
    Dim oTransGeom As TransientGeometry
    Set oTransGeom = ThisApplication.TransientGeometry

    ' создание коллекции со всеми узловыми точками для сплайна
    Dim oFitPoints As ObjectCollection
    Set oFitPoints = ThisApplication.TransientObjects.CreateObjectCollection

    ' Задание вершинных точек. Их координаты:
    ' (0,0), (2,2), (4,0), (6,4).
    Dim oPoints(1 To 4) As Point2d
    
    Set oPoints(1) = oTransGeom.CreatePoint2d(0, 0)
    oFitPoints.Add oPoints(1)

    Set oPoints(2) = oTransGeom.CreatePoint2d(2, 2)
    oFitPoints.Add oPoints(2)

    Set oPoints(3) = oTransGeom.CreatePoint2d(4, 0)
    oFitPoints.Add oPoints(3)

    Set oPoints(4) = oTransGeom.CreatePoint2d(6, 4)
    oFitPoints.Add oPoints(4)

    
    ' Создание эскиза #1 на плоскости X-Y
    Dim oSketch1 As PlanarSketch
    Set oSketch1 = oCompDef.Sketches.Add(oCompDef.WorkPlanes(3))

    ' Создание сплайна.
    Dim oSpline As SketchSpline
    Set oSpline = oSketch1.SketchSplines.Add(oFitPoints)

    ' Создание рабочей плоскости, параллельной плоскости X-Y
    Dim oWorkPlane As WorkPlane
    Set oWorkPlane = oCompDef.WorkPlanes.AddByPlaneAndOffset(oCompDef.WorkPlanes(3), 2)

    ' Создание эскиза #2 на рабочей плоскости плоскости oWorkPlane
    Dim oSketch2 As PlanarSketch
    Set oSketch2 = oCompDef.Sketches.Add(oWorkPlane)

    ' Ссылка на геометрию сплайна на первом эскизе
    Dim oBSplineCurve2d As BSplineCurve2d
    Set oBSplineCurve2d = oSpline.Geometry

    ' Создание фиксированного сплайна на втором эскизе
    ' на базе геометрии сплайна из прервого эскиза.
    Dim oFixedSpline As SketchFixedSpline
    Set oFixedSpline = oSketch2.SketchFixedSplines.Add(oBSplineCurve2d)

End Sub

SketchOffsetSpline править

Коллекция SketchOffsetSplines двумерного эскиза обеспечивает доступ ко всем его объектам типа SketchOffsetSpline.

Коллекция не поддерживает методов создания объектов SketchOffsetSpline, т.к. это специальный вид сплайнов, они создаются опосредованным образом в процессе применения команды Offset к сплайнам и эллипсам.

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

Текущая геометрия сплайна отражается свойством Geometry в виде объекта BSplineCurve2d вспомогательной геометрии (Transient Geometry). Его методы GetBSplineData и GetBSplineInfo предоставляют информацию об определении сплайна, включая данные о количестве и последовательности полюсов и узлов сплайна.

Чтобы во всех деталях исследовать геометрию сплайна, требуется через свойство BSplineCurve2d.Evaluator получить ссылку на низкоуровневый объект Curve2dEvaluator данной кривой. Его методы и свойства дают, в частности, кривизну сплайна в любой его точке, первую, вторую и третью производные, а также средства работы с параметрическим представлением сплайна и многое другое.

Метод ConvertToSpline преобразует SketchOffsetSpline в обычный SketchSpline, разрывая ассоциативную связь с объектом, от которого сплайн был получен.

SketchImage править

Объекты SketchImage «живут» в коллекции SketchImages эскиза.

У этой коллекции имеестя всего-навсего один метод — метод Add для создания нового объекта SketchImage и вставки изображения в эскиз. Изображение специфицируется полным именем файла с изображением, а место вставки задается координатной точкой Point2d.

Точка вставки изображения находится в его левом верхнем углу.

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

Не следует путать имя объекта SketchImage и имя файла изображения. Имя объекта SketchImage хранится в свойстве Name. Для доступа к имени файла требуется воспользоваться свойством ReferencedFileDescriptor, которое возвращает ссылку на объект ReferencedOLEFileDescriptor. В данном случае представляют интерес два его свойства: ReferencedOLEFileDescriptor.DisplayName возвращает короткое имя файла, а ReferencedOLEFileDescriptor.FullFileName — полное имя файла, включающее путь к OLE документу.

Свойство Position возвращает в виде Point2d координаты точки вставки изображения (его левый верхний угол).

Свойства height и width позволяют управлять размером изображения.

Свойство Transparent контролирует прозрачность, а Visible — видимость объекта на эскизе.


Следующий пример вставляет в первый эскиз активного документа детали два изображения, полные имена которых имеют следующий вид: "C:\temp\SampleImage_1.gif" и "C:\temp\SampleImage_2.gif".

Sub SketchImage()
   
   ' Получим ссылку на определение компонентов детали.
   ' Документ детали является активным.
   Dim oPartCompDef As PartComponentDefinition
   Set oPartCompDef = ThisApplication.ActiveDocument.ComponentDefinition

   ' Ссылка на эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = oPartCompDef.Sketches.Item(1)
   
   ' Координатная точка вставки изображения
   Dim oPoint As Point2d
   Set oPoint = ThisApplication.TransientGeometry.CreatePoint2d(2, 1)
   
   ' Вставка первого изображения
   Dim oImage As SketchImage
   Set oImage = oSketch.SketchImages.Add( _
            "C:\temp\SampleImage_1.gif", _
             oPoint, _
             True)
   oImage.Name = "Изображение #1"
            
            
   ' Вставка второго изображения
   Set oPoint = ThisApplication.TransientGeometry.CreatePoint2d(2, 10)
   Set oImage = oSketch.SketchImages.Add( _
            "C:\temp\SampleImage_2.gif", _
             oPoint, _
             True)
   oImage.Name = "Изображение #2"
   
   
   MsgBox oSketch.SketchImages.Item(1).Name & vbNewLine & _
          oSketch.SketchImages.Item(2).Name
   
   MsgBox oImage.ReferencedFileDescriptor.DisplayName
   MsgBox oImage.ReferencedFileDescriptor.FullFileName
   
End Sub


В справочной системе Autodesk Inventor указано, что объект SketchImage в чертеже ведет себя несколько иначе, чем в контексте документа детали. Отличия сведены в следующей таблице.

Свойство / Метод В чертеже В детали
BoundaryGeometry Возвращает Nothing Возвращает четыре эскизных линии (SketchLines), образующих прямоугольную рамку вокруг изображения
Height and Width Height и Width независимы Соотношение сторон изображения (пропорции) сохраняются.
Visible Не определено Доступны чтение и запись
Transparent Не определено Доступны чтение и запись
Name Только чтение (имя BMP файла FullFileName) Доступны чтение и запись
SketchImages.Item Использование строк в качестве индекса в Item не допускается В качестве индекса в Item допускается использовать как целые числа, так и строки.
MirrorHorizontal Не поддерживается Поддерживается
MirrorVertical Не поддерживается Поддерживается
RotateLeft Не поддерживается Поддерживается
RotateRight Не поддерживается Поддерживается
Update Не поддерживается Поддерживается

SketchTextBox править

Коллекция SketchTextBoxes


Операция подобия для создания эскизной геометрии править

Эскиз поддерживает два метода создания эскизной геометрии с помощью операции подобия.

Метод OffsetSketchEntitiesUsingDistance предполагает явное задание величины и направления смещения относительно базового эскизного элемента

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


Метод Sketch.OffsetSketchEntitiesUsingDistance править

Метод выполняет преобразование подобия — создает новые эскизные элементы как результат согласованного смещения одного или группы заданных эскизных элементов. В обоих случаях смещается сначала базовый (основной) эскизный элемент — на заданное расстояние и в заданном направлении. Базовый эскизный элемент определяется следующим образом:

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

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

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

Public Function OffsetSketchEntitiesUsingDistance( _
   ByVal SketchEntities As ObjectCollection, _
   ByVal OffsetDistance As Double, _
   ByVal NaturalOffsetDirection As Boolean, _
   Optional ByVal IncludeConnectedEntities As Boolean = False, _
   Optional ByVal CreateOffsetConstraints As Boolean = True _
) As SketchEntitiesEnumerator


Параметры

SketchEntities

Аргумент представляет входные эскизную геометрию в составе коллекции типа ObjectCollection. В этой коллекции могут содержаться любые эскизные элементы, за исключением эскизных точек — к объекту SketchPoint операция подобия (offset) неприменима. Первый элемент коллекции всегда интерпретируется как базовый эскизный элемент, относительно которого указываются параметры расстояния и направления смещения (аргументы OffsetDistance и NaturalOffsetDirection, соответственно).

Если смещать требуется лишь один эскизный элемент, он должен быть единственным членом коллекции SketchEntities, при этом аргумент IncludeConnectedEntities должен содержать значение False. Этот первый и единственный элемент коллекции интерпретируется как базовый.

Если смещению подлежит группа связанных концами эскизных элементов, их можно задать следующими способами:

  • Можно явно указать точное множество смещаемых эскизных элементов. Только эти элементы должны присутствовать в коллекции SketchEntities. Элементы должны не только быть связаны в цепочку, но и порядок элементов в коллекции должен совпадать с порядком следования элементов в цепочке. Первый элемент коллекции интерпретируется как базовый.
  • Можно указать только базовый эскизный элемент, позволив методу OffsetSketchEntitiesUsingDistance самому достроить цепочку связанных эскизных элементов. В этом случае логический аргумент IncludeConnectedEntities обязан иметь значение TRUE. Это указывает методу, что все составляющие замкнутой или разомкнутой цепочки элементов, в состав которой входит базовый элемент, должны быть автоматически включены в операцию смещения.

Очевидно, что только один из этих способов можно применить при вызове метода OffsetSketchEntitiesUsingDistance для задания цепочки эскизных элементов. Поэтому, если коллекция содержит более одного элемента, предполагается, что в ней в явном виде указано все множество смещаемых элементов, и, следовательно, аргумент IncludeConnectedEntities должен иметь значение FALSE. Указание значения TRUE в этом случае приведет к ошибке, и операция смещения выполнена не будет.


OffsetDistance

Параметр задает величину смещения базового эскизного элемента (первого в коллекции эскизных элементов). На эту же величину будет смещаться и вся группа заданных эскизных объектов. Только лишь величины смещения недостаточно для однозначного определения результата операции. Одно из двух возможных направлений смещения относительно базового эскизного элемента задается логическим аргументом NaturalOffsetDirection.

Таким образом, пара аргументов OffsetDistance и NaturalOffsetDirection однозначно определяют результат геометрического преобразования offset для базового элемента. Соответственно, становятся определенными и результаты смещения всех остальных элементов в цепочке эскизных объектов (коллекция SketchEntities).


NaturalOffsetDirection

Аргумент задает одно из двух возможных направлений смещения. Направление задается относительно базового элемента.

Положительным направлением смещения (natural offset direction) в любой точке базового элемента считается направление, получаемое как результат векторного произведения вектора касательной в данной точке на вектор нормали к плоскости эскиза.

Значение TRUE соответствует положительному направлению смещения для заданной точке базового элемента. Значение FALSE означает противоположное направление. Таким образом, аргумент NaturalOffsetDirection определяет, по какую сторону от базового элемента будет размещен результат операции смещения.

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

Совокупность этой пары аргументов позволяет определить результат смещения всех элементов, заданных в коллекции SketchEntities.


IncludeConnectedEntities

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

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

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


CreateOffsetConstraints

Определяет, будут ли автоматически созданы зависимости между исходными и смещенными эскизными элементами. Если задано значение TRUE, зависимости буду созданы автоматически.

Если задано значение FALSE, зависимости создаваться не будут.

Если аргумент не указан, используется значение по умолчанию — TRUE, т.е. действует режим автоматического создания зависимостей.


Замечания

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

По своему результату изменение знака аргумента OffsetDistance эквивалентно изменению направления смещения на противоположное.


ПРИМЕР

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


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

Public Sub OffsetLines_1()

    'Проверка - активен ли эскиз?
    If Not TypeOf ThisApplication.ActiveEditObject Is PlanarSketch Then
        MsgBox "Следует активировать эскиз"
        Exit Sub
    End If

    'ССылка на активный эскиз
    Dim oSketch As PlanarSketch
    Set oSketch = ThisApplication.ActiveEditObject

    'Создание новой коллекции для эскизной геометрии
    Dim oCollection As ObjectCollection
    Set oCollection = ThisApplication.TransientObjects.CreateObjectCollection

   'Вставка в коллекцию первой эскизной линии - это базовый элемент контура
   oCollection.Add oSketch.SketchLines.Item(1)
  
   Dim bNaturalOffsetDir As Boolean
   Dim IncludeConnectedEntities As Boolean
   Dim CreateOffsetConstraints As Boolean
   
   bNaturalOffsetDir = True         'смещение в положительном направлении
   IncludeConnectedEntities = True  'автоматически достраивать контур
   CreateOffsetConstraints = True   'автоматически накладывать зависимости
   
   'выполнение операции подобия со смещением на 5 мм
   Call oSketch.OffsetSketchEntitiesUsingDistance( _
                        oCollection, _
                        0.5, _
                        bNaturalOffsetDir, _
                        IncludeConnectedEntities, _
                        CreateOffsetConstraints)
End Sub
'Модуль для тестирования операции подобия в 2D эскизе.
'Перед выполнением примера построить в новом эскизе
'замкнутый четырехугольник.

Public Sub OffsetLines_2()

    'Проверка - активен ли эскиз?
    If Not TypeOf ThisApplication.ActiveEditObject Is PlanarSketch Then
        MsgBox "Следует активировать эскиз"
        Exit Sub
    End If

    'ССылка на активный эскиз
    Dim oSketch As PlanarSketch
    Set oSketch = ThisApplication.ActiveEditObject

    'Создание новой коллекции для эскизной геометрии
    Dim oCollection As ObjectCollection
    Set oCollection = ThisApplication.TransientObjects.CreateObjectCollection

   'Вставка в коллекцию всех эскизных линий, которые должны участвовать в подобии
   oCollection.Add oSketch.SketchLines.Item(1)
   oCollection.Add oSketch.SketchLines.Item(2)
   oCollection.Add oSketch.SketchLines.Item(3)
   oCollection.Add oSketch.SketchLines.Item(4)
   
   Dim bNaturalOffsetDir As Boolean
   Dim IncludeConnectedEntities As Boolean
   Dim CreateOffsetConstraints As Boolean
   
   bNaturalOffsetDir = True         'смещение в положительном направлении
   IncludeConnectedEntities = False 'контур задан явно
   CreateOffsetConstraints = True   'автоматически накладывать зависимости
   
   'выполнение операции подобия со смещением на 5 мм
   Call oSketch.OffsetSketchEntitiesUsingDistance( _
                        oCollection, _
                        0.5, _
                        bNaturalOffsetDir, _
                        IncludeConnectedEntities, _
                        CreateOffsetConstraints)
End Sub

Метод Sketch.OffsetSketchEntitiesUsingPoint править

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

Синтаксис метода весьма похож:

Public Function OffsetSketchEntitiesUsingPoint( _
   ByVal SketchEntities As ObjectCollection, _
   ByVal OffsetPoint As Point2d, _
   Optional ByVal IncludeConnectedEntities As Boolean = False, _
   Optional ByVal CreateOffsetConstraints As Boolean = True _
) As SketchEntitiesEnumerator

Аргументы SketchEntities, IncludeConnectedEntities и CreateOffsetConstraints имеют тот же смысл, что и у предыдущего метода.

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


Пример.

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

Public Sub OffsetLines_3()

   'активен ли эскиз?
   If Not TypeOf ThisApplication.ActiveEditObject Is PlanarSketch Then
       MsgBox "Следует активировать эскиз"
       Exit Sub
   End If
   
   'ссылка на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
      
   'создание коллекции для исходной эскизной геометрии
   Dim oCollection As ObjectCollection
   Set oCollection = ThisApplication. _
                        TransientObjects.CreateObjectCollection
   
   'явно задаем исходную эскизную геометрию
   oCollection.Add oSketch.SketchLines.Item(1)
   oCollection.Add oSketch.SketchLines.Item(2)
   oCollection.Add oSketch.SketchLines.Item(3)
   oCollection.Add oSketch.SketchLines.Item(4)


   'Точка, которая задает направление и величину смещения
   Dim oOffsetPoint As Point2d
   Set oOffsetPoint = oSketch.SketchPoints.Item( _
            oSketch.SketchPoints.count).Geometry

   'выполнение операции подобия
   Call oSketch.OffsetSketchEntitiesUsingPoint( _
            oCollection, oOffsetPoint, False, True)

End Sub

Наложение зависимостей править

Геометрические зависимости в 2D эскизах править

Все геометрические зависимости «живут» в коллекции GeometricConstraints эскиза.

Термин зависимости используется в Autodesk Inventor для обозначения как геометрических зависимостей (geometric constraints), так и размеров, т.е. размерных ограничений (dimension constraints). И размеры и геометрические зависимости действуют совместно, внося определенность в эскиз и ограничивая его степени свободы.

Коллекция GeometricConstraints обеспечивает доступ ко всем геометрическим зависимостям эскиза (объектам типа GeometricConstraint) и предоставляет ряд методов для создания новых зависимостей.


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

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

Sub Test()

   'Ссылка на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
    
   ' Ссылка на эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   ' Создадим линию
   Dim oLine As SketchLine
   Set oLine = oSketch.SketchLines.AddByTwoPoints( _
                  oTG.CreatePoint2d(1, 1), _
                  oTG.CreatePoint2d(2, 2))
   
   'Рассмотрим состав появившихся объектов
   Dim St As String
   Dim oGC As GeometricConstraint
   
   St = St & "Эскизных объектов: " & oSketch.SketchEntities.Count & vbNewLine
   St = St & "Эскизных точек: " & oSketch.SketchPoints.Count & vbNewLine
   St = St & "Эскизных линий: " & oSketch.SketchLines.Count & vbNewLine
   St = St & "Зависимостей: " & oSketch.GeometricConstraints.Count
   
   For Each oGC In oSketch.GeometricConstraints
      St = St & vbNewLine & "     тип зависимости  " & oGC.Type
   Next
   
   MsgBox St
 
End Sub


Результат работы программы выглядит следующим образом:

Эскизных объектов:           3 
Эскизных точек:              2 
Эскизных линий:              1 
Зависимостей:                2 
  тип зависимости            83900160 
  тип зависимости            83900160 


С помощью справочной системы можно выяснить, что константа 83900160 с именем kCoincidentConstraintObject соответствует объекту "Coincident constraint", это зависимость совмещения эскизной точки с другим эскизным объектом.

Откуда же взялись две эскизных точки и зависимости совмещения, которые мы явным образом не задавали?

Причина имеет фундаментальный характер и упоминалась во введении к этой главе — все эскизная геометрия строится на эскизных точках. Метод создания линии AddByTwoPoints, получив в аргументах вместо эскизных точек объекты типа Point2d, сначала создал эскизные точки в предписанных координатах и только потом соединил точки линией с наложением двух зависимостей совмещения эскизных точек с концами линии. Вот откуда взялись "лишние" эскизные объекты.



Методы создания зависимостей править

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


AddCollinear
Метод накладывает на два эскизных элемента зависимость коллинеарности. Применяется к линиям, эллипсам и эллиптическим дугам. В случае эллипса выравнивается какая-либо ось эллипса. Которая именно, указывается дополнительным аргументом.


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


AddEqualLength
Метод накладывает на две эскизных линии зависимость равенства их длин.


AddEqualRadius
Метод накладывает на два заданных эскизных элемента зависимость равенства их радиусов. Применим только к окружностям и дугам.


AddGround
Метод накладывает зависимость полой фиксации эскизного элемента.


AddHorizontal
Метод накладывает на линию или ось эллипса или эллиптической дуги зависимость горизонтальности.


AddHorizontalAlign
Метод накладывает на две эскизных точки зависимость равенства Y-координат, что делает их лежащими на одной горизонтали.


AddMidpoint
Метод связывает эскизную точку с серединой заданной эскизной линии.


AddParallel
Метод накладывает зависимость параллельности на эскизные линии и/или оси эллипсов.


AddPerpendicular
Метод накладывает зависимость перпендикулярности на два эскизных элемента. Допускаются эскизные линии и оси эллипсов.


AddSmooth
Метод накладывает зависимость гладкости (G2-непрерывности).


AddSymmetry
Метод накладывает на два одинаковых эскизных элемента зависимость симметричности относительно указанной линии. Проверка «одинаковости» возлагается на вызывающую программу.


AddTangent
Метод накладывает на два эскизных элемента зависимость касательности.


AddVertical
Метод накладывает зависимость вертикальности. Применяется к линиям и эллипсам.


AddVerticalAlign
Метод накладывает на две эскизных точки зависимость равенства X-координат, что делает их лежащими на одной вертикали.


 

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


В списке объектов, управляющих геометрическими зависимостями, имеются еще два, которые хотя и могут быть представлены в коллекции GeometricConstraints, однако не создаются явным образом, т.е. не имеют соответствующего метода Add.


OffsetConstraint
Зависимость OffsetConstraint возникает в результате выполнения команды Offset. В коллекции Sketch.GeometricConstraints нет методов непосредственного создания зависимостей этого типа. Они возникают опосредованным образом как результат вызова методов OffsetSketchEntitiesUsingDistance и OffsetSketchEntitiesUsingPoint объекта Sketch. Редактирование уже существующей зависимости возможно.


PatternConstraint
Зависимость PatternConstraint – определяет взаимосвязь между объектами которые являются результатом выполнения команд на создание массива объектов. Как и в предыдущем случае, коллекция Sketch.GeometricConstraints лишь обеспечивает доступ к уже созданным элементам этого типа.



Пример.

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

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

Public Sub Constraints_1()

   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   'Получим ссылки на первые четыре линии эскиза
   Dim i As Integer
   Dim oL(1 To 4) As SketchLine
   For i = 1 To 4
      Set oL(i) = oSketch.SketchLines.Item(i)
   Next i

   
   'Свяжем линии концами в последовательности 1-2-3-4.
   'Применение здесь AddCoincident является ошибкой.
   'Именно в этом случае следует применять Merge (слияние).
   
   Call oL(1).EndSketchPoint.Merge(oL(2).StartSketchPoint)
   Call oL(2).EndSketchPoint.Merge(oL(3).StartSketchPoint)
   Call oL(3).EndSketchPoint.Merge(oL(4).StartSketchPoint)
   Call oL(4).EndSketchPoint.Merge(oL(1).StartSketchPoint)

   'Введем зависимости параллельности противоположных сторон
   Call oSketch.GeometricConstraints.AddParallel(oL(1), oL(3))
   Call oSketch.GeometricConstraints.AddParallel(oL(2), oL(4))

   'Введем зависимости перпендикулярности сторон 1 и 2
   Call oSketch.GeometricConstraints.AddPerpendicular(oL(1), oL(2))

   'Теперь мы имеем неориентированный прямоугольник,
   'не связанный размерными ограничениями.
   
   
   'Зададим ему размеры  40 х 15 мм
   
   'Сначала поставим размер на линию 1.
   'Для простановки размера следует явно указать
   'точку вставки размерного текста
   
   Dim oDimPoint As Point2d
   Dim X As Double
   Dim Y As Double
   
   X = oL(1).Geometry.MidPoint.X
   Y = oL(1).Geometry.MidPoint.Y
   
   Set oDimPoint = oTG.CreatePoint2d( _
                        X + oL(1).Length / 5, _
                        Y + oL(1).Length / 5)
                        
   'Задаем размерное ограничение
   Call oSketch.DimensionConstraints.AddTwoPointDistance( _
            oL(1).StartSketchPoint, _
            oL(1).EndSketchPoint, _
            kAlignedDim, _
            oDimPoint, _
            False)
   
   'Фиксируем размер 40 мм - через величину параметра объекта
   oSketch.DimensionConstraints.Item( _
            oSketch.DimensionConstraints.Count).Parameter.Value = 4


   'Ставим размер на линию 2
   
   X = oL(2).Geometry.MidPoint.X
   Y = oL(2).Geometry.MidPoint.Y
   
   Set oDimPoint = oTG.CreatePoint2d( _
                        X + oL(2).Length / 5, _
                        Y + oL(2).Length / 5)
   
   Call oSketch.DimensionConstraints.AddTwoPointDistance( _
            oL(2).StartSketchPoint, _
            oL(2).EndSketchPoint, _
            kAlignedDim, _
            oDimPoint, _
            False)
            
   oSketch.DimensionConstraints.Item( _
            oSketch.DimensionConstraints.Count).Parameter.Value = 1.5
            
   oSketch.Solve  'перевычисляем эскиз
            
End Sub


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

'Введем зависимости горизонтальности сторон 1 и 3
Call oSketch.GeometricConstraints.AddHorizontal(oL(1))
Call oSketch.GeometricConstraints.AddHorizontal(oL(3))
   
'Введем зависимости вертикальности сторон 2 и 4
Call oSketch.GeometricConstraints.AddVertical(oL(2))
Call oSketch.GeometricConstraints.AddVertical(oL(4))

'Теперь мы имеем ориентированный прямоугольник,
'не связанный размерными ограничениями.

Список размерных ограничений править

Ниже приведен список размерных ограничений (зависимостей), доступных через API.


DiameterDimConstraint править

 

Метод AddDiameter коллекции DimensionConstraints накладывает на заданную в аргументах окружность или дугу размерное ограничение типа DiameterDimConstraint. Оно фиксирует зависимостью текущий диаметр и проставляет в предписанной точке диаметр окружности.

С помощью необязательного аргумента Driven можно сделать размер справочным.

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

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

Public Sub DiameterDim()

   'Создание ссылки на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry

   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   
   'Этап 1. Создадим окружность радиусом 30 мм
   
   Dim oCircle As SketchCircle
   Set oCircle = oSketch.SketchCircles.AddByCenterRadius( _
                  oTG.CreatePoint2d(1, 1), 3)
   
   'Фиксируем заданный радиус размерным ограничением.
   
   'Размер нуждается в точке вставки текста размера.
   'Зададим ее относительно центра окружности.
   
   'Координатная точка центра окружности
   Dim oCenter2d As Point2d
   Set oCenter2d = oCircle.CenterSketchPoint.Geometry
   
   'Создание координатной точки для вставки текста размера
   Dim oTextCoord As Point2d
   Set oTextCoord = oTG.CreatePoint2d( _
                     oCenter2d.X + oCircle.Radius, _
                     oCenter2d.Y + oCircle.Radius)
   
   'Создание диаметрального размера
   Call oSketch.DimensionConstraints.AddDiameter(oCircle, oTextCoord)

   MsgBox "Этап 1. Проставлен диаметр " & _
            oCircle.Radius * 20 & " мм"
   
   
   'Этап 2. Назначим образмеренной окружности новый диаметр 20 мм
   
   'У окружности может быть много различных зависимостей,
   'но диаметр определяется только одной из них.
   'Требуется ее найти и изменить значение ее параметра.
   'Тип искомой зависимости -  kDiameterDimConstraintObject
   
   Dim oConstr As Object

   For Each oConstr In oCircle.Constraints
      If oConstr.Type = kDiameterDimConstraintObject Then
         oConstr.Parameter.Value = 2
         Exit For
      End If
   Next
   
   oSketch.Solve  'обновляем эскиз
   
   MsgBox "Этап 2. Диаметр изменен на " & _
            oCircle.Radius * 20 & " мм"

End Sub

EllipseRadiusDimConstraint править

 


Метод AddEllipseRadius коллекции DimensionConstraints накладывает на заданный эллипс или эллиптическую дугу размерное ограничение типа EllipseRadiusDimConstraint. Оно фиксирует зависимостью указанный радиус и проставляет в предписанной точке эскиза соответствующий размер.

С помощью необязательного аргумента Driven можно сделать размер справочным.

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

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

Public Sub EllipseDim()

   'Создание ссылки на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry

   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   
   'Этап 1. Создадим эллипс с полуосями 20 и 40 мм
   
   'Ссылка на эллипс
   Dim oE As SketchEllipse
   
   'Координатная точка центра эллипса
   Dim oCenter2d As Point2d
   Set oCenter2d = oTG.CreatePoint2d(2, 2)
   
   'Направление большой полуоси
   Dim oMajorVec As UnitVector2d
   Set oMajorVec = oTG.CreateUnitVector2d(2, 1)
   
   'Длина большой полуоси
   Dim MajorRadius As Double
   MajorRadius = 4
   
   'Длина малой полуоси
   Dim MinorRadius As Double
   MinorRadius = 2
   
   Set oE = oSketch.SketchEllipses.Add( _
                        oCenter2d, _
                        oMajorVec, _
                        MajorRadius, _
                        MinorRadius)
      
   'Этап 2. Зададим размеры радиусов эллипса
      
   'Создание координатной точки для вставки текста размера
   Dim oTextCoord As Point2d
   Set oTextCoord = oTG.CreatePoint2d(4.1)

   'Создание размера большой полуоси
   Call oSketch.DimensionConstraints.AddEllipseRadius( _
            oE, True, oTextCoord, True, False)
   
   'Создание координатной точки для вставки текста размера
   Set oTextCoord = oTG.CreatePoint2d(6, 5)
   
   'Создание размера малой полуоси
   Call oSketch.DimensionConstraints.AddEllipseRadius( _
            oE, False, oTextCoord, True, False)

End Sub

OffsetDimConstraint править

   


OffsetDimConstraint

Метод AddOffset коллекции DimensionConstraints накладывает на заданный эллипс или эллиптическую дугу размерное ограничение типа OffsetDimConstraint. Оно фиксирует зависимостью расстояние между эскизной линией Line и другой линией либо эскизной точкой. Размер проставляется в предписанной координатной точке TextPoint.

Синтаксис метода поддерживает немало вариантов, поэтому обсудим его чуть подробнее.

Public Function AddOffset( _
   ByVal Line As SketchLine, _
   ByVal Entity As SketchEntity, _
   ByVal TextPoint As Point2d, _
   ByVal LinearDiameter As Boolean, _
   Optional ByVal Driven As Boolean = False _
) As OffsetDimConstraint


Аргумент Line обязан быть эскизной линией.

Аргумент Entity может быть либо эскизной линией, либо эскизной точкой.

Размер проставляется в предписанной координатной точке TextPoint.

Логический параметр LinearDiameter указывает, будет ли размер обычным или осевым.

Если предписывается создать осевой размер и Entity является линией, то Entity интерпретируется как осевая линия. Однако если Entity является точкой, то в качестве осевой используется аргумент Line.

С помощью необязательного аргумента Driven можно сделать размер справочным.


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


Перед выполнением примера откройте для редактирования новый эскиз и создайте в нем две линии. Если линии параллельны, то программа проставит осевой размер и сделает диаметр равным 35 мм.

Public Sub OffsetDim()
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Ссылки на две эскизных линии
   Dim oLine(1 To 2) As SketchLine
   Set oLine(1) = oSketch.SketchLines.Item(1)
   Set oLine(2) = oSketch.SketchLines.Item(2)
   
   'Проверим параллельность заданных линий.
   'Если это условие не выполняется,
   'то зависимость накладывать нельзя
   
   If Not oLine(1).Geometry.Direction.IsParallelTo( _
         oLine(2).Geometry.Direction) Then
      
      MsgBox "Линии оказались непараллельными"
      Exit Sub  'прекращаем работу
   End If
   
   
   'Создание координатной точки для вставки текста размера
   Dim oTextCoord As Point2d
   Set oTextCoord = oTG.CreatePoint2d(1, 1)
   
   'Создание размера
   Call oSketch.DimensionConstraints.AddOffset( _
            oLine(1), _
            oLine(2), _
            oTextCoord, _
            True, _
            False)
   
   oLine(2).Centerline = True
   
   
   'назначаем размер 35 мм
   oSketch.DimensionConstraints.Item( _
      oSketch.DimensionConstraints.Count).Parameter.Value = 3.5
   
   oSketch.Solve
   
End Sub

RadiusDimConstraint править

 

Метод AddRadius коллекции DimensionConstraints накладывает на заданную в аргументах окружность или дугу размерное ограничение типа RadiusDimConstraint. Оно фиксирует зависимостью текущий радиус и проставляет в предписанной точке его величину.

С помощью необязательного аргумента Driven можно сделать размер справочным.

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


Перед выполнением примера откройте на редактирование новый плоский эскиз. Программа начала создаст в эскизе окружность и зафиксирует ее радиус наложением размерной зависимости RadiusDimConstraint.

Public Sub RadiusDim()

   'Создание ссылки на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry

   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   
   'Этап 1. Создадим окружность радиусом 30 мм
   
   Dim oCircle As SketchCircle
   Set oCircle = oSketch.SketchCircles.AddByCenterRadius( _
                  oTG.CreatePoint2d(1, 1), 3)
   
   'Фиксируем заданный радиус размерным ограничением.
   
   'Размер нуждается в точке вставки текста размера.
   'Зададим ее относительно центра окружности.
   
   'Координатная точка центра окружности
   Dim oCenter2d As Point2d
   Set oCenter2d = oCircle.CenterSketchPoint.Geometry
   
   'Создание координатной точки для вставки текста размера
   Dim oTextCoord As Point2d
   Set oTextCoord = oTG.CreatePoint2d( _
                     oCenter2d.X + oCircle.Radius, _
                     oCenter2d.Y + oCircle.Radius)
   
   'Создание радиусного размера
   Call oSketch.DimensionConstraints.AddRadius(oCircle, oTextCoord)

   MsgBox "Проставлен радиус " & _
            oCircle.Radius * 10 & " мм"

End Sub

TangentDistanceDimConstraint править

     

Метод AddTangentDistance создает в коллекции DimensionConstraints новое размерное ограничение типа TangentDistanceDimConstraint — касательный размер между двумя заданными эскизными объектами.

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

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

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

С помощью необязательного аргумента Driven можно сделать размер справочным.

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


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

Private Sub TangentDim()
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создадим окружность радиусом 15 мм в точке (-20 мм, 20 мм)
   Dim oCircle1 As SketchCircle
   Set oCircle1 = oSketch.SketchCircles.AddByCenterRadius( _
                  oTG.CreatePoint2d(-2, 2), 1.5)
                  
   'Создадим окружность радиусом 10 мм в точке (20 мм, 30 мм)
   Dim oCircle2 As SketchCircle
   Set oCircle2 = oSketch.SketchCircles.AddByCenterRadius( _
                  oTG.CreatePoint2d(2, 3), 1)
   
   'Вспомогательная точка
   Dim oProximityPoint As Point2d
   Set oProximityPoint = oTG.CreatePoint2d(0.2, 2)
   Dim oSketchPoint As SketchPoint
   Set oSketchPoint = oSketch.SketchPoints.Add(oProximityPoint, False)
   
   'Создание координатной точки для вставки текста размера
   Dim oTextCoord, ProximityPoint As Point2d
   Set oTextCoord = oTG.CreatePoint2d(0, 0)
               
   'Создание касательного размера
   Call oSketch.DimensionConstraints.AddTangentDistance( _
                  oCircle1, _
                  oCircle2, _
                  oProximityPoint, _
                  oProximityPoint, _
                  oTG.CreatePoint2d(1, 1), _
                  False)
   
End Sub

ThreePointAngleDimConstraint править

 

Метод AddThreePointAngle создает в коллекции DimensionConstraints новое размерное ограничение типа ThreePointAngleDimConstraint — угловой размер, заданный по трем эскизным точкам. Вторая точка в списке аргументов задает вершину измеряемого угла.

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

С помощью необязательного аргумента Driven можно сделать размер справочным.

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

Пример:

Private Sub ThreePointAngleDimConstraint()
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   Dim oP(1 To 3) As SketchPoint
   Set oP(1) = oSketch.SketchPoints.Add( _
                  oTG.CreatePoint2d(0.5, 1), False)
   Set oP(2) = oSketch.SketchPoints.Add( _
                  oTG.CreatePoint2d(0.2, 0.2), False)
   Set oP(3) = oSketch.SketchPoints.Add( _
                  oTG.CreatePoint2d(1.5, 0.4), False)
   
   'Создание координатной точки для вставки текста размера
   Dim oTextCoord As Point2d
   Set oTextCoord = oTG.CreatePoint2d(2, 2)
   
   'Cоздание углового размера
   Call oSketch.DimensionConstraints.AddThreePointAngle( _
            oP(1), oP(2), oP(3), _
            oTextCoord, _
            False)
End Sub


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

Этот код обращается к коллекции размерных ограничений редактируемого эскиза и печатает в отладочном окне количество размерных ограничений и тип первого из них. Тип равен 83906304, что соответствует константе kThreePointAngleDimConstraintObject.

Private Sub ThreePointAngleDimConstraint_2()
  
   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'количество размеров
   Debug.Print oSketch.DimensionConstraints.Count
   
   'проверим тип первого размерного ограничения
   Dim oDim As DimensionConstraint
   Set oDim = oSketch.DimensionConstraints.Item(1)
   Debug.Print oDim.Type

End Sub

Отладочное окно Immediate Window среды VBA проще всего открыть нажатием клавиш Ctrl-G.

TwoLineAngleDimConstraint править

 

Метод AddTwoLineAngle создает в коллекции DimensionConstraints новое размерное ограничение типа TwoLineAngleDimConstraint — угловой размер, заданный по двум эскизным линиям.

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

С помощью необязательного аргумента Driven можно сделать размер справочным.

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

Пример:

Private Sub TwoLineAngleDimConstraint()
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTg As TransientGeometry
   Set oTg = ThisApplication.TransientGeometry
   
   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   
   'Создание двух непараллельных эскизных линий
   Dim oL1 As SketchLine
   Dim oL2 As SketchLine
   
   Set oL1 = oSketch.SketchLines.AddByTwoPoints( _
               oTg.CreatePoint2d(1, 1), _
               oTg.CreatePoint2d(2, 1.2))
   
   Set oL2 = oSketch.SketchLines.AddByTwoPoints( _
               oTg.CreatePoint2d(1, 1.5), _
               oTg.CreatePoint2d(2, 2))
               
   'Создание координатной точки для вставки текста размера
   Dim oTextCoord As Point2d
   Set oTextCoord = oTg.CreatePoint2d(3, 2)
   
   'Cоздание углового размера
   Call oSketch.DimensionConstraints.AddTwoLineAngle( _
                  oL1, oL2, oTextCoord, False)
                  

   'Проверка типа созданного размерного ограничения
   Dim oDim As DimensionConstraint
   Set oDim = oSketch.DimensionConstraints.Item( _
                        oSketch.DimensionConstraints.Count)
   MsgBox "Тип ограничения: " & oDim.Type

End Sub

В диалоговом окне будет выведено значение 83906048, которое соответствует константе kTwoLineAngleDimConstraintObject.

TwoPointDistanceDimConstraint править

 

Метод AddTwoPointDistance создает в коллекции DimensionConstraints новое размерное ограничение типа TwoPointDistanceDimConstraint — линейный размер, заданный по двум эскизным точкам.

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

Константа Ориентация Значение
kHorizontalDim Горизонтальный размер 19201
kVerticalDim Вертикальный размер 19202
kAlignedDim Параллельный размер 19203

Для вставки в эскиз текста размера следует указать координатную точку типа Point2d. С помощью необязательного аргумента Driven можно сделать размер справочным.

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

Пример:

Private Sub AngleDim()
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'СОздание эскизных точек
   Dim oP(1 To 2) As SketchPoint
   Set oP(1) = oSketch.SketchPoints.Add( _
                  oTG.CreatePoint2d(0.5, 1), False)
   Set oP(2) = oSketch.SketchPoints.Add( _
                  oTG.CreatePoint2d(3, 2), False)
   
   
   'Координатная точка для вставки текста размера
   Dim oTextCoord As Point2d

   'Cоздание угловых размеров
   
   Set oTextCoord = oTG.CreatePoint2d(1, 3)
   Call oSketch.DimensionConstraints.AddTwoPointDistance( _
                 oP(1), oP(2), kAlignedDim, oTextCoord, False)
   
   Set oTextCoord = oTG.CreatePoint2d(2, 0.5)
   Call oSketch.DimensionConstraints.AddTwoPointDistance( _
                 oP(1), oP(2), kHorizontalDim, oTextCoord, False)

   Set oTextCoord = oTG.CreatePoint2d(4, 1.5)
   Call oSketch.DimensionConstraints.AddTwoPointDistance( _
                 oP(1), oP(2), kVerticalDim, oTextCoord, False)

   
   'Проверка типа созданного размерного ограничения
   Dim oDim As DimensionConstraint
   For Each oDim In oSketch.DimensionConstraints
      Debug.Print "Тип ограничения: " & oDim.Type
   Next

End Sub


В отладочном окне Immediate Window среды VBA программа выведет следующие типы созданных ограничений: Тип ограничения: 83905792 Тип ограничения: 83905792 Тип ограничения: 83905792

Тип ограничения, как и следовало ожидать, от ориентации размера не зависит. Значению 83905792 соответствует именованная константа kTwoPointDistanceDimConstraintObject.

Переопределение цвета эскизного элемента править

Доступ ко всем компонентам, определяющим цвет, обеспечивает объект Color. Основные свойства этого объекта — цветовые компоненты R,G,B (Red — красный, Green — зеленый, Blue — синий). Диапазон изменения интенсивности каждого компонента: 0..255. Свойство Opacity контролирует насыщенность цвета, принимая значения в интервале от 0 (полная прозрачность) до 1 (полная насыщенность).

Объект Color создается методом CreateColor объекта TransientObjects (вспомогательные объекты). Аргументы те же — интенсивности красного, зеленого и синего цвета, а также необязательный аргумент Opacity (насыщенность), по умолчанию имеющий значение 1.

Если эскизный объект допускает изменение своего цвета, он имеет доступное для изменения свойство OverrideColor типа Color. Следующий фрагмент иллюстрирует технику изменения цвета эскизной линии:

Dim oColor As Color
Set oColor = ThisApplication.TransientObjects. _
                         CreateColor(255, 0, 0) 'красный
oSketch.SketchLines.item(1).OverrideColor = oColor

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


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

Private Sub OverrideColor()
   
   'Создание ссылки на вспомогательную геометрию
   Dim oTG As TransientGeometry
   Set oTG = ThisApplication.TransientGeometry
   
   'Создание ссылки на активный эскиз
   Dim oSketch As PlanarSketch
   Set oSketch = ThisApplication.ActiveEditObject
   
   'Создание трех эскизных линий
   Dim oL(1 To 3) As SketchLine
   
   Set oL(1) = oSketch.SketchLines.AddByTwoPoints( _
               oTG.CreatePoint2d(1, 1), _
               oTG.CreatePoint2d(2, 1))
   
   Set oL(2) = oSketch.SketchLines.AddByTwoPoints( _
               oL(1).EndSketchPoint, _
               oTG.CreatePoint2d(2, 2))
               
   Set oL(3) = oSketch.SketchLines.AddByTwoPoints( _
               oL(2).EndSketchPoint, _
               oL(1).StartSketchPoint)
               
   'Создание массива из трех различных цветов
   Dim oColor(1 To 3) As Color
   
   Set oColor(1) = ThisApplication.TransientObjects. _
                     CreateColor(255, 0, 0) 'Красный
   Set oColor(2) = ThisApplication.TransientObjects. _
                     CreateColor(0, 255, 0) 'Зеленый
   Set oColor(3) = ThisApplication.TransientObjects. _
                     CreateColor(0, 0, 255) 'Синий
                                   
   'Переопределение цвета у каждой из трех линий
   Dim i As Integer
   For i = 1 To 3
      oL(i).OverrideColor = oColor(i)
   Next i

End Sub