Autodesk Inventor API. Первые шаги/2D эскиз: различия между версиями

Содержимое удалено Содержимое добавлено
Авиакомпании требуются сотрудники для работы на дому.
м Откат правок 5.228.3.118 (обс.) к версии 46.200.255.77
Строка 1:
Эскиз — это профиль элемента или любой геометрический объект (траектория сдвига, ось вращения и т.п.), необходимый для создания конструктивного элемента.
Ведущая компания в России и странах СНГ по продаже авиабилетов «Airline-online»
Это один из ключевых компонентов Инвентора. Вся двумерная геометрия в Инвенторе создается в 2D эскизах.
 
 
 
__TOC__
 
 
== Особенности 2D эскизов ==
 
[[Файл: Sketch2D_01_prim.jpg| ]]
 
 
Все плоские эскизы документа детали «живут» в коллекции Sketches объекта PartComponentDefinition.
 
Интерфейс коллекции весьма прост и включает лишь пару методов создания новых эскизов да средства получения ссылок на существующие эскизы.
 
Количество эскизов в детали можно определить через свойство Sketches.Count.
 
Доступ к конкретному эскизу можно получить с помощью свойства Item двумя способами.
 
Формат Sketches.Item(2) вернет ссылку на второй эскиз в коллекции. Контроль диапазона изменения задаваемого номера возлагается на вызывающую программу. Если указанный номер превышает число эскизов Sketches.Count, будет сгенерирована ошибка. Обычно более удобно находить эскиз по его имени, например, Sketches .Item("Боковой") возвращает ссылку на эскиз с именем «Боковой».
 
Другой важной функцией коллекции Sketches является создание новых эскизов. Для этого у нее предусмотрены два метода — Add и AddWithOrientation.
 
 
 
'''Введение в плоские эскизы'''
 
Эскиз можно представить как двумерную плоскость, которая содержит произвольное количество двумерных геометрических объектов. При работе в трехмерной среде, например, в контексте детали, плоскость эскиза должным образом ориентируется в 3D пространстве.
Плоский эскиз может содержать только действительно двумерные объекты. Любые координаты содержат только компоненты X и Y. Поскольку эскиз существует в трехмерном пространстве, у него имеется собственная 2D координатная система. Все операции создания и изменения объектов в эскизе выполняются в системе координат эскиза.
 
Эскизы могут содержать несколько отличающихся разновидностей двумерных объектов в зависимости от типа документов, в котором они используются.
В документе детали можно создавать эскизы, которые содержат дуги, окружности, эллиптические дуги, эллипсы, линии, сплайны, наложенные геометрические и размерные зависимости. Эскизы в чертежах поддерживают те же объекты, что и в документе детали, но дополнительно поддерживают средства работы с текстом и некоторые специфические средства редактирования.
 
Эскиз можно рассматривать как контейнер для 2D объектов. Сам по себе эскиз не добавляет никакой информации к содержащимся в нем 2D объектам. Рассмотрим, к примеру, эскиз на рисунке ниже. В нем содержатся несколько объектов различных видов: линии, окружность, сплайн, геометрические зависимости и размерные ограничения. Эскиз для этих объектов определяет лишь двумерную систему координат.
 
[[Файл: Sketch2D_02.jpg| ]]
 
Замкнутые или незамкнутые контуры геометрических объектов, как таковые, еще ничего не говорят о назначении эскиза. Смысловую информацию несут профильные пути, о которых речь ниже.
 
Работа с эскизом через API несколько отличается от интерактивной работы с эскизом в пользовательском режиме. Дело в том, что API предоставляет доступ к эскизу на более низком уровне, чем пользовательский интерфейс Инвентора, и эта разница заслуживает более подробного рассмотрения.
 
Первое отличие обнаруживается уже при создании эскиза. Пользовательский интерфейс Инвентора обеспечивает существенно больший сервис и контроль за построениями вследствие автоматического предугадывания Инвентором действий пользователя. Рассмотрим эскиз на рисунке ниже. Единственное, что от вас требуется при создании эскиза, это указать мышью начало линии 1, еще клик мышью для завершения создания линии 1, клик для создания линии 2, перемещением курсора мыши при нажатой левой кнопке создать дугу 3, создать линию 4 и, наконец, клик мышью для создания замыкающей контур линии 5. Всего для создания замкнутого контура потребовалось 5 кликов мышью и одно перемещение для создания дуги. А теперь рассмотрим более детально, что же в действительности происходило в процессе создания эскизе.
 
[[Файл: Sketch2D_03.jpg| ]]
 
 
* Чтобы создать линию 1, потребовался клик мышью для указания начальной точки. По мере смещения курсора Инвентор отображает символ зависимости, свидетельствующий о горизонтальности либо вертикальности линии. После второго клика определяется положение конца линии и автоматически накладывается зависимость горизонтальности.
* Поскольку мы по-прежнему находимся в контексте команды Line, перемещение курсора мыши порождает построение линии 2 с началом в конце линии 1. Зависимость совмещения предполагается автоматически. Когда курсор движется вертикально вверх, Инвентор отображает индикатор перпендикулярности новой линии по отношению к предыдущей. В момент указания мышью конца линии 2 создаются две зависимости: совмещение концов линий и перпендикулярности линий друг другу.
* Построение на следующем шаге дуги сопровождается наложением еще двух зависимостей: совмещения конца линии 2 с началом дуги и зависимости касательности линии 2 и дуги.
* Линия 4 начинается в момент окончания построения дуги 3. С помощью символа зависимости Инвентор информирует пользователя, при какой ориентации линии 4 будет установлена зависимость касательности с дугой 3 и параллельности линии 1. После завершения построения линии 4 автоматически создаются обе указанных зависимости.
* Построение линии 5 начинается в момент завершения построения линии 4. При совмещении курсора мыши и точки начала линии 1 Инвентор показывает символ зависимости совмещения. Показывается также символ предполагаемой зависимости параллельности с линией 2. После клика мышью указанные зависимости создаются автоматически.
 
За пять кликов и операцию сдвига сформировано пять эскизных примитивов и наложено 11 зависимостей.
 
Теперь рассмотрим построение ровно того же контура, но средствами API. Работа через API отличается рядом существенных обстоятельств. Во-первых, нет никаких средств прогноза возможных зависимостей. Эти предположения целиком и полностью опираются на контекст активной команды и перемещения курсора мыши. API не предоставляет этот функционал программисту. Все зависимости должны назначаться явным образом.
 
Второе отличие связано с тем, что API открывает низкоуровневую информацию об эскизе, которая скрыта от пользователя интерфейсом Инвентора. Речь идет, прежде всего, о том, что вся эскизная геометрия в действительности зависит от эскизных точек. Так, при интерактивном построении двух линий вы двумя кликами задаете концы первой линии и третьим кликом — конец второй.
 
[[Файл: Sketch2D_04.jpg| ]]
 
 
Конечный пользователь в качестве результата видит две эскизных линии, связанных зависимостью совмещения концов. А на самом деле были созданы три эскизных точки, две опирающиеся на них эскизных линии и четыре зависимости совмещения, как показано на следующем рисунке. Эскизная точка — единственный объект эскиза, который может существовать сам по себе. Все остальные геометрические примитивы зависят от точек и определяются их положением через наложенные зависимости.
 
[[Файл: Sketch2D_05.jpg| ]]
 
 
От пользователя скрыта значительная часть эскизных точек. Подобное сокрытие в API привело бы к множеству нестыковок, а кроме того, прямой доступ к множеству эскизных точек упрощает многие функции API.
 
Рассмотрим пошаговое построение того же самого контура средствами API.
 
[[Файл: Sketch2D_06.jpg| ]]
 
 
У коллекции эскизных линий SketchLines для создания линии имеется метод AddByTwoPoints, которому в качестве аргументов передаются две точки.
 
<pre>
AddByTwoPoints(StartPoint As Object, EndPoint As Object) As SketchLine
</pre>
 
Обратите внимание на тип аргументов — они объявлены не как эскизные точки, а как "Object". Это позволяет нам использовать и Point2d, и существующие SketchPoint. Объект Point2d описывает положение абстрактной математической точки на эскизе. Если аргумент имеет тип Point2d, в этом месте сначала создается эскизная точка SketchPoint, а уже затем линия связывается с этой эскизной точкой зависимостью совмещения. Если аргумент имеет тип SketchPoint, то создавать эскизную точку не требуется и сразу создается зависимость совмещения линии с точкой.
 
Поскольку любая эскизная геометрия всегда зависят от эскизных точек, API обеспечивает прямой доступ к множеству опорных точек всякого эскизного объекта. Рассмотрим фрагмент программы, которая создает рассмотренный выше замкнутый контур. Предполагается, что сам эскиз уже каким-либо образом создан. Как это делается, будет показано ниже.
 
Координаты для создания графических примитивов задаются посредством объектов типа Point2d. Это не эскизные геометрические точки, но просто координаты в двумерном пространстве.
 
Сначала создается ссылка (указатель) на вспомогательную геометрию — объект [[TransientGeometry]]. Его функционал потребуется позже.
 
<pre>
' Ссылка на вспомогательную геометрию приложения
Dim oTransGeom As TransientGeometry
Set oTransGeom = ThisApplication.TransientGeometry
</pre>
 
 
Далее создадим две точки Point2d, которые понадобятся для определения координат концов линии.
 
<pre>
Dim oCoord1 As Point2d
Set oCoord1 = oTransGeom.CreatePoint2d(0, 0)
Dim oCoord2 As Point2d
Set oCoord2 = oTransGeom.CreatePoint2d(5, 0)
</pre>
 
 
Следующие две строки создают «настоящий» эскизный объект — SketchLine. Аргументами служат обе созданные ранее точки Point2d. Эскизные точки для концов линии создаются автоматически. Эскизная линия «привязывается» к этим точкам зависимостями совмещения.
 
<pre>
Dim oLines(1 To 4) As SketchLine
Set oLines(1) = oSketch.SketchLines.AddByTwoPoints(oCoord1, oCoord2)
</pre>
 
Следующие две строки создают вторую эскизную линию. Ее началом служит явно указанная точка на конце первой линии, а концом — точка в координатах (5,3):
 
<pre>
Set oCoord1 = oTransGeom.CreatePoint2d(5, 3)
Set oLines(2) = oSketch.SketchLines.AddByTwoPoints( _
oLines(1).EndSketchPoint, _
oCoord1)
</pre>
 
Теперь создадим дугу. Ее центр и конечная точка задаются посредством объектов Point2d, а начальная точка — явной ссылкой на эскизную точку на конце линии 2.
 
<pre>
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)
</pre>
 
Третья линия опирается на конец дуги и новый объект Point2d:
 
<pre>
Set oCoord1 = oTransGeom.CreatePoint2d(0, 4)
Set oLines(3) = oSketch.SketchLines.AddByTwoPoints( _
oArc.EndSketchPoint, _
oCoord1)
</pre>
 
И наконец, последняя линия ставится на эскизные точки на концах первой и предпоследней линий.
 
<pre>
Set oLines(4) = oSketch.SketchLines.AddByTwoPoints( _
oLines(1).StartSketchPoint, _
oLines(3).EndSketchPoint)
</pre>
 
 
Внешне полученная фигура совпадает с требуемой. Но это только первое впечатление. Эскиз не содержит целого ряда требуемых зависимостей, в чем легко убедиться, поработав с полученным эскизом в пользовательском интерфейсе. Вы обнаружите наличие лишь зависимостей совмещения концов линий и дуги. Следующий код создает все требуемые зависимости.
 
<pre>
' горизонтальность линии 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))
</pre>
 
Вот теперь эскиз принимает завершенный вид.
 
Все прочие виды эскизных графических объектов создаются аналогичным образом. Они также опираются при создании на эскизные точки. Если же координаты передаются через объекты Point2d, то эскизные точки будут созданы автоматически неявным образом. Манипуляции эскизными объектами, как правило, должны производиться через опорные эскизные точки. Например, для перемещения линии потребуется переместить две эскизных точки, на которые опираются концы линии.
 
В общем случае, API не поддерживает никакие средства автоматического наложения зависимостей. Единственное исключение составляет создание зависимостей совмещения, когда в качестве аргумента используется уже существующая эскизная точка. Геометрические зависимости и размерные ограничения программисту приходится задавать явным образом.
 
== Создание 2D эскиза ==
 
 
Создание новых эскизов является важной функцией коллекции Sketches.
Для этого у нее предусмотрены всего два метода — Add и AddWithOrientation.
 
 
=== Создание 2D эскиза без изменения его ориентации ===
 
Метод создания нового плоского эскиза зависит от типа
заданного на входе плоского объекта.
 
<pre>
Public Function Add( _
ByVal PlanarEntity As Object, _
Optional ByVal UseFaceEdges As Boolean = False _
) As PlanarSketch
</pre>
 
Входные параметры:
 
* ''PlanarEntity'' — плоский объект, на котором будет создан 2D эскиз. Допускаются либо плоские грани, либо рабочие плоскости.
 
* ''UseFaceEdges'' — необязательный логический параметр, который определят, следует ли проецировать на эскиз все ребра входной грани, как это происходит при работе в интерактивном режиме. Этот аргумент игнорируется, если первым аргументом является рабочая плоскость. Как видно из объявления метода Add, значением по умолчанию является False. т.е. геометрия эскиза автоматически проецироваться не будет.
 
 
'''Пример'''
Крупнейшая международная компания по продаже А/В билетов
 
срочно набирает сотрудников на постоянную основу для несложной
Пример иллюстрирует технику создания плоского эскиза на указанной плоской грани существующей детали. Перед выполнением примера откройте документ детали и создайте в нем кубик.
работы через интернет, с ежедневными выплатами от 11 000 руб.
 
<pre>
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
</pre>
 
 
Попробуйте повторно выполнить эту процедуру. Ее выполнение будет прервано ошибкой:
 
[[Файл:Error-2.png| ]]
 
Все дело в том, что второй запуск программы создает очередной эскиз, а вот присвоить ему имя уже существующего эскиза нельзя. Это означает, что перед присвоением эскизу имени следует убедиться, что другого эскиза с этим именем в документе детали нет.
 
<pre>
On Error Resume Next
'Сменим имя на удобное нам
oSketch.Name = "Мой новый эскиз"
If Err Then
MsgBox "Эскиз с таким именем уже существует." & vbNewLine & _
"Измените имя вручную."
Exit Sub
End If
</pre>
 
 
Если первая грань заданной детали окажется неплоской, работа процедуры будет прервана, и пользователь увидит следующее сообщение об ошибке:
 
[[Файл:Error-1.png| ]]
 
 
Выход довольно очевиден. Прежде чем вызывать метод <tt>Add</tt>, следует убедиться, что грань плоская. Это можно сделать, проверив значение свойства <tt>oFace.SurfaceType</tt> нашей грани. И только, если оно равно <tt>kPlaneSurface</tt>, можно обращаться к методу <tt>Add</tt>.
 
<pre>
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
</pre>
 
{{Info|МИНЗДРАВ предупреждает: <br /> Систематическое пренебрежение проверкой типов входных аргументов приводит к хроническому состоянию глубокого уныния.}}
 
=== Создание ориентированного 2D эскиза ===
 
В целом ряде практических задач чрезвычайно важно не просто уметь программно создавать эскиз, но создавать его в заданной ориентации.
Для создания ориентированных 2D эскизов в коллекции Sketches предусмотрен специальный метод <tt>AddWithOrientation</tt>. Рассмотрим его синтаксис.
 
<pre>
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
</pre>
 
Параметры
 
'''PlanarEntity''' <br/>
Плоская грань или рабочая плоскость, на которых должен быть создан эскиз.
 
'''AxisEntity''' <br />
Прямое ребро, эскизная линия из другого эскиза либо рабочая ось, которые задают направление оси X или Y создаваемого эскиза. Какая именно из осей будет ориентирована в этом направлении, задается параметром AxisIsX. Задаваемый объект не обязан находится в плоскости эскиза, но не должен быть ей перпендикулярен.
 
'''NaturalAxisDirection''' <br />
Логический параметр. Если равен TRUE, то направление координатной оси X или Y эскиза совпадает с направлением объекта AxisEntity, если FALSE, то ему противоположно.
 
'''AxisIsX''' <br />
Логический параметр. Если он равен TRUE, то опорным направлением, задаваемым параметром AxisEntity, считается ось X, если FALSE, то ось Y.
 
'''Origin''' <br />
Входной аргумент, определяющий положение начала координат создаваемого эскиза. Допустимые варианты: вершина (vertex), рабочая точка или эскизная точка в другом эскизе. Задаваемый здесь объект не обязан находится в плоскости эскиза.
 
'''UseFaceEdges''' <br />
Необязательный логический аргумент. Задает, следует ли автоматически проецировать ребра входной грани на создаваемый эскиз, как это происходит при работе в интерактивном пользовательском режиме.
Значение по умолчанию FALSE означает, что проецирование не выполняется.
Игнорируется, если в аргументе PlanarEntity была задана рабочая плоскость, что логично, т.к. ребра есть у грани, но не у плоскости.
 
<pre>
' Пример создания ориентированного 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
</pre>
 
== Изменение существующего эскиза ==
 
 
=== Открытие эскиза для редактирования в интерактивном режиме ===
 
Пример открывает пользователю плоский эскиз с именем "Sketch1" в режиме редактирования. На случай, если в документе детали такого эскиза нет, выполняется соответствующая проверка.
 
<pre>
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
</pre>
 
=== Внесение изменений в эскиз ===
 
В данном примере сначала на базовой рабочей плоскости XY создается новый эскиз, затем эскиз переводится в режим редактирования и в нем создается эскизная линия между точками (0,0) и (5,5). На этом режим редактирования завершается.
 
<pre>
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
</pre>
 
Вообще говоря, переводить эскиз в режим редактирования, чтобы программно вносить в него изменения, вовсе не требуется. В следующем примере решается ровно та же задача, что и в предыдущем, но без активации режима редактирования.
 
<pre>
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
</pre>
 
Операции изменения эскиза без входа в режим редактирования программно выполняются более эффективно.
Режим редактирования эскиза в детали нужен, например, если вы планируете предоставить пользователю возможность самому вносить в эскиз изменения в интерактивном режиме.
 
=== Изменение ориентации эскиза ===
 
Для начала рассмотрим задачу изменения плоскости, в которой лежит эскиз. Разместим имеющийся в документе детали произвольно ориенированный эскиз в базовой рабочей плоскости YZ системы координат детали. С точки зрения эскиза изменится его свойство PlanarEntity. В результате преобразования будут совмещены начало координат и направления осей X и Y эскиза и детали.
 
<pre>
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
</pre>
 
 
В следующем примере изменению подлежит не только плоскость эскиза, но и ориентация его координатных осей.
 
<pre>
' Пример управления ориентацией эскиза.
' Пример следует выполнить при открытом документе детали,
' содержащим прямоугольный параллелепипед.
 
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
</pre>
 
== Удаление эскиза ==
 
 
Для удаления эскиза из документа детали предназначен метод PlanarSketch.Delete.
 
Метод работает только для тех эскизов, которые не используются конструктивными элементами. Зависимости этого рода отслеживаются коллекцией PanarSketch.Dependents. Если она не пуста, т.е. PanarSketch.Dependents.Count > 0, то попытка удаления эскиза приведет к ошибке. Чтобы удалить такой эскиз, требуется сначала ликвидировать все зависимые объекты.
 
Метод не будет работать и в случае производных компонентов. Для выявления подобных ситуаций служит свойство HasReferenceComponent, которое возвращает TRUE, если объект принадлежит производному компоненту. В таких случаях свойство ReferenceComponent хранит ссылку на объект-источник.
 
 
Рассмотрим пример программного удаления эскиза. Пример потребует открыть документ детали, содержащий эскиз с именем «Sketch1». Эскиз не должен иметь никаких зависимых конструктивных элементов.
 
<pre>
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
</pre>
 
== Эскизные элементы ==
 
=== Эскизная точка SketchPoint ===
 
==== Создание эскизных точек ====
 
Эскизные точки хранятся в коллекции SketchPoints эскиза.
Счетчик SketchPoints.Count показывает количество эскизных точек в эскизе.
Для их создания предусмотрен единственный метод Add с довольно простым синтаксисом:
<pre>
Public Function Add( _
ByVal Point As Point2d, _
Optional ByVal HoleCenter As Boolean = True _
) As SketchPoint
</pre>
 
Первый аргумент имеет тип Point2d и задает координаты будущей эскизной точки. Необязательный логический аргумент HoleCenter определяет, является ли эскизная точка центром отверстия (вариант по умолчанию) или нет. Влияет это, главным образом, на способ ее визуального отображения в эскизе.
 
Рассмотрим пример создания точек. Активируйте режим редактирования эскиза и запустите на исполнение следующую процедуру:
<pre>
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
</pre>
 
 
Свойство Geometry объекта SketchPoint возвращает объект Point2d, через который можно получить координаты (x,y) эскизной точки в системе координат эскиза: <br/>
<tt>
x = SketchPoint.Geometry.X <br/>
y = SketchPoint.Geometry.Y
</tt>
 
 
==== Перемещение эскизных точек ====
 
Для перемещения эскизных точек предусмотрены методы MoveTo и MoveBy.
Например, команда <br />
<tt>Call oPoint.MoveTo(oTg.CreatePoint2d(1, 2))</tt> <br />
переместит точку oPoint в положение с явно указанными с координатами x=10 мм, y=20 мм.
А команда <br />
<tt>Call oPoint.MoveBy(oTg.CreateVector2d(-1, 0))</tt> <br />
задает вектор смещения точки oPoint из текущего положения на 10 мм влево.
 
{{Info|В обоих случаях результат будет зависеть от наложенных на точку геометрических зависимостей. При наличии конфликта действительное перемещение точки может оказаться не тем, на которое вы рассчитывали.}}
 
 
==== Расстояние между эскизными точками ====
 
Для вычисления расстояния L между двумя существующими эскизными точками oPoint1 и oPoint2 можно воспользоваться методом SketchPoint.DistanceTo:
 
<tt>
L = oPoint1.Geometry.DistanceTo(oPoint2.Geometry)
</tt>
 
То же самое, естественно, можно вычислить и по теореме Пифагора:
<pre>
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)
</pre>
 
Но этот вариант работает примерно на 60% медленнее метода DistanceTo. Впрочем, если вспомнить, что возведение в степень выполняется существенно дольше умножения, и слегка модифицировать команду вычисления расстояния<br />
<tt>
L = Sqr((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)),
</tt> <br />
то можно сравняться и по скорости:
 
Вы вольны выбрать любой способ. Лично мне больше нравится встроенный метод SketchPoint.DistanceTo.
 
 
==== Слияние эскизных точек ====
 
Метод SketchPoint.Merge выполняет слияние текущей эскизной точки с другой. Текущая точка при этом исчезает, а все зависевшие от текущей точки объекты теперь зависят уже от точки, заданной методу Merge в качестве входного аргумента.
 
=== Эскизная линия SketchLine ===
 
==== Создание эскизных линий ====
 
Для создания эскизных линий в коллекции SketchLines предусмотрены три метода.
* <tt>AddByTwoPoints</tt>
* <tt>AddAsTwoPointRectangle</tt>
* <tt>AddAsThreePointRectangle</tt>
 
 
'''AddByTwoPoints'''
 
Синтаксис метода AddByTwoPoints:
<pre>
Public Function AddByTwoPoints( _
ByVal StartPoint As Object, _
ByVal EndPoint As Object _
) As SketchLine
</pre>
 
Здесь StartPoint и EndPoint — объекты, которые определяют начальную и конечную точку создаваемой линии. Допускаются либо объект типа Point2d, задающий координатную точку (x,y), либо уже существующий объект SketchPoint. В последнем случае заданная эскизная точка и становится начальной или конечной точкой линии, соответственно.
 
Пример 1. Создание линии методом AddByTwoPoints
<pre>
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
</pre>
 
Умножение на 10 в последней команде понадобилось, чтобы перейти к миллиметрам от внутренней единицы измерения расстояний в Инвенторе — сантиметра.
 
 
'''AddAsTwoPointRectangle'''
 
Этот метод за один прием создает сразу четыре эскизных линии в форме прямоугольника со сторонами, параллельными осям X и Y эскиза.
Аргументами являются две точки на концах диагонали прямоугольника.
Если точки будут лежать на одной горизонтали или одной вертикали, метод AddAsTwoPointRectangle выдаст ошибку.
 
Синтаксис метода:
<pre>
Public Function AddAsTwoPointRectangle( _
ByVal CornerPointOne As Object, _
ByVal CornerPointTwo As Object _
) As SketchEntitiesEnumerator
</pre>
 
Допустимые типы входных аргументов — Point2d или SketchPoint. В последнем случае указанная эскизная точка становится началом/концом создаваемых линий и, таким образом, угловой точкой прямоугольника.
 
Тип возвращаемого результата — коллекция типа SketchEntitiesEnumerator, состоящая в данном случае из четырех объектов типа SketchLine.
 
<pre>
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
</pre>
 
Контрольный вывод в MsgBox показывает четыре одинаковых значения 83896064, которые соответствуют типу объекта kSketchLineObject.
 
 
[[Файл:Rectangle_01.png| AddAsTwoPointRectangle ]]
 
Вся прелесть метода заключается в том, что прямоугольник создается со всеми полагающимися этой фигуре геометрическими зависимостями. Размерные ограничения методом AddAsTwoPointRectangle не вводятся.
 
 
'''AddAsThreePointRectangle'''
 
Этот метод за один прием создает сразу четыре эскизных линии в форме прямоугольника на основе трех входных точек в качестве аргументов.
 
Синтаксис метода:
 
<pre>
Public Function AddAsThreePointRectangle( _
ByVal BasePointOne As Object, _
ByVal BasePointTwo As Object, _
ByVal HeightPoint As Point2d _
) As SketchEntitiesEnumerator
</pre>
 
Основание прямоугольника задается первыми двумя точками, а высота — третьей. Точками для основания могут служить либо точки вспомогательной геометрии Point2d, либо существующие эскизные точки SketchPoint. В последнем случае заданные точки становятся концами линии основания.
 
[[Файл:Rectangle_02.png| AddAsThreePointRectangle ]]
 
 
Линия основания задает как длину основания, так и ориентацию прямоугольника. Задающей высоту прямоугольника точкой всегда является объект Point2d, как показано на рисунке. Эта точка может располагаться в произвольном месте. Высота прямоугольника равняется расстоянию от этой точки до прямой, на которой лежит отрезок основания прямоугольника. При нулевой высоте метод выдаст ошибку.
 
Создаваемые данным методом эскизные линии возвращаются в составе коллекции SketchEntitiesEnumerator.
 
Прямоугольник на рисунке построен с помощью следующего примера.
Размеры были проставлены вручную, чтобы прояснить смысло параметров.
 
<pre>
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
</pre>
 
==== Свойства эскизной линии ====
 
 
Centerline
 
Construction
 
StartSketchPoint
 
EndSketchPoint
 
Length
 
Parent
 
 
 
==== Направление двумерной эскизной линии ====
 
У всякой эскизной линии, независимо от способа ее построения, имеется направление. Оно задано единичным вектором типа UnitVector2d. На рисунке показано, как получить доступ к этому объекту.
 
[[Файл:Direction_01.png| ]]
 
 
<pre>
dim UVec2d as UnitVector2d
set UVec2d = oSketchLine.Geometry.LineSegment2d.Direction
</pre>
 
Это направление неявным образом будет участвовать в дальнейших построениях с использованием этой линии. Например, рабочая ось, построенная по эскизной линии, будет наследовать ее направление Direction.
 
=== Окружность SketchCircle ===
 
В плоском эскизе PlanarSketch окружность представлена объектом SketchCircle.
 
Ссылки на все окружности эскиза хранятся в отдельной коллекции SketchCircles. Как обычно, ее свойство Count возвращает количество окружностей в данном эскизе, а свойство Item обеспечивает доступ к конкретной окружности по ее номеру в коллекции. Нумерация объектов начинается с единицы.
 
Разработчиками API предусмотрены два метода создания окружностей:
* AddByCenterRadius — требуется указание положения центра и радиуса;
* AddByThreePoints — по трем несовпадающим и не лежащим на одной прямой координатным точкам Point2d.
 
Ниже приведен пример построения окружности с центром в точке (20,20) и радиусом 10 мм.
 
В примере использованы три полезных свойства объекта SketchCircle:
* SketchCircle.Geomery возвращает объект Circle2d, из которого можно извлечь ее центр — объект типа Point2d;
* SketchCircle.Radius возвращает радиус окружности в сантиметрах;
* SketchCircle.Area возвращает площадь окружности, выраженную в квадратных сантиметрах.
 
<pre>
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
</pre>
 
=== Дуга SketchArc ===
 
В плоском эскизе PlanarSketch круглая дуга представлена объектом SketchArc.
 
В эскизе ссылки на дуги хранятся в коллекции SketchArcs. Ее свойство Count возвращает количество дуг в эскизе, а свойство Item обеспечивает доступ к конкретной дуге по ее номеру в коллекции. Нумерация объектов начинается с единицы.
 
Разработчиками API предусмотрены следующие методы создания дуг:
 
* AddByCenterStartSweepAngle — требуется указание положения центра дуги, ее радиуса, начального угла и угла раствора дуги.
<pre>
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
</pre>
 
 
* AddByCenterStartEndPoint — требуется указание положенияцентра дуги, начальной и конечной точек. Направление дуги и, соответственно, угол раствора дуги задается необязательным четвертым логическим параметром CounterClockwise. По умолчанию принимается положительное направления отсчета углов. Радиус дуги определяется по начальной точке.
 
<pre>
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
</pre>
 
 
* AddByFillet — дуга создается как результат сопряжения двух эскизных элементов. Задаются сами эскизные элементы, радиус и точки на эскизных элементах, где начинается и завершается дуга.
 
<pre>
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
</pre>
 
 
* AddByThreePoints — дуга строится по трем точкам (начальной, средней и конечной). Положение центра и радиус дуги определяются автоматически.
<pre>
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
</pre>
 
 
Углы измеряются в радианах,
положительное направление — против часовой стрелки.
 
Стоит отметить, что начальная и конечная точки дуги (StartSketchPoint и EndSketchPoint, соответственно) не зависят от направления построения дуги. Дуга ВСЕГДА идет от начальной к конечной точке в положительном направлении изменения углов, т.е. против часовой стрелки.
 
Метод Delete() удаляет дугу из эскиза.
 
Свойства объекта SketchArc обеспечивают доступ ко всем геометрическим параметрам дуги. В частности, свойство Length() возвращает ее длину.
 
=== Эллипс SketchEllipse ===
 
В плоском эскизе PlanarSketch эллипс представлен объектом SketchEllipse.
 
В эскизе ссылки на эллипсы хранятся в коллекции SketchEllipses. Ее свойство Count возвращает количество эллипсов в эскизе, а свойство Item обеспечивает доступ к конкретному эллипсу по его номеру в коллекции. Нумерация объектов начинается с единицы.
 
Методу Add для создания эллипса следует сообщить центральную точку эллипса (SketchPoint или Point2d), направление главной оси (единичный вектор UnitVector2d) и два радиуса (Double).
 
<pre>
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
</pre>
 
=== Эллиптическая дуга SketchEllipticalArc ===
 
В плоском эскизе PlanarSketch эллиптические дуги представлены объектом SketchEllipticalArc.
 
В эскизе ссылки на эллипсы хранятся в коллекции SketchEllipses. Ее свойство Count возвращает количество дуг в эскизе, а свойство Item обеспечивает доступ к конкретной дуге по ее номеру в коллекции. Нумерация объектов начинается с единицы.
 
Методу Add для создания эллиптической дуги следует сообщить центральную точку эллипса (SketchPoint или Point2d), направление главной оси (единичный вектор UnitVector2d) и оба радиуса (см), начальный угол и угол раствора дуги (радианы).
<pre>
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
</pre>
 
Все углы измеряются в радианах, положительное направление — против часовой стрелки.
 
Для удаления дуги применяется метод Delete().
 
Свойства объекта SketchEllipticalArc обеспечивают доступ ко всем геометрическим параметрам дуги. Например, свойство Length() возвращает ее длину в сантиметрах.
 
=== Сплайн SketchSpline ===
 
В плоском эскизе PlanarSketch сплайны представлены объектом SketchSpline.
 
В эскизе ссылки на сплайны хранятся в коллекции SketchSplines. Ее свойство Count возвращает количество сплайнов в эскизе, а свойство Item обеспечивает доступ к конкретному сплайну по его номеру в коллекции. Нумерация объектов начинается с единицы.
 
Метод Add создает интерполяционный сплайн на множестве задающих точек — вершин (SketchPoint или Point2d), переданных на вход в составе коллекции объектов типа ObjectCollection.
Если координаты вершины заданы объектом Point2d, то в этом месте автоматически будет создана эскизная точка SketchPoint. Сплайн будет проходить через все вершины с автоматическим наложением геометрических зависимостей типа SplineFitPointConstraints.
 
Необязательный второй аргумент имеет тип SplineFitMethodEnum и определяет метод подгонки. Имеются следующие варианты:
 
* kSmoothSplineFit — интерполяция сглаженным сплайном с одинаковой кривизной сегментов по обе стороны от вершины.
* kSweetSplineFit — интерполяция эрмитовой кривой «с минимальной энергией»
* kACADSplineFit — интерполяция методом, принятым в AutoCAD, — NURBS (неоднородный рациональный B-сплайн).
 
 
<pre>
' Пример из справочной системы 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
</pre>
 
=== Фиксированный SketchFixedSpline ===
 
Объект SketchFixedSpline представляет собой фиксированный сплайн в эскизе. Геометрия для его создания передается объектом BSplineCurve2d (NURBS — неоднородный рациональный B-сплайн).
 
Ссылки на такие сплайны хранятся в коллекции SketchFixedSplines эскиза. Ее свойство Count возвращает количество сплайнов в эскизе, а свойство Item обеспечивает доступ к конкретному сплайну по его номеру в коллекции. Нумерация объектов начинается с единицы.
 
 
Метод Add коллекции SketchFixedSplines создает в эскизе новый фиксированный сплайн на базе геометрии, представленной входным аргументом в виде объекта BSplineCurve2d.
 
Два необязательных аргумента позволяют задать начальную и конечную точки сплайна. Если эти аргументы опущены, то на концах сплайна эскизные точки будут созданы автоматически.
 
Возможно преобразование фиксированного сплайна в «обычный» SketchSpline. Этой цели служит метод ConvertToSpline().
 
<pre>
' Пример из справочной системы 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
</pre>
 
=== 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".
 
<pre>
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
</pre>
 
 
В справочной системе Autodesk Inventor указано, что объект SketchImage в чертеже ведет себя несколько иначе, чем в контексте документа детали. Отличия сведены в следующей таблице.
 
{| class="wikitable"
|-
! Свойство / Метод
! В чертеже
! В детали
|-
| BoundaryGeometry
| Возвращает Nothing
| Возвращает четыре эскизных линии (SketchLines), образующих прямоугольную рамку вокруг изображения
|-
| Height and Width
| Height и Width независимы
| Соотношение сторон изображения (пропорции) сохраняются.
|-
| Visible
| Не определено
| Доступны чтение и запись
|-
| Transparent
| Не определено
| Доступны чтение и запись
|-
| Name
| Только чтение (имя BMP файла FullFileName)
| Доступны чтение и запись
|-
| SketchImages.Item
| Использование строк в качестве индекса в Item не допускается
| В качестве индекса в Item допускается использовать как целые числа, так и строки.
|-
| MirrorHorizontal
| Не поддерживается
| Поддерживается
|-
| MirrorVertical
| Не поддерживается
| Поддерживается
|-
| RotateLeft
| Не поддерживается
| Поддерживается
|-
| RotateRight
| Не поддерживается
| Поддерживается
|-
| Update
| Не поддерживается
| Поддерживается
|}
 
=== SketchTextBox ===
 
Коллекция SketchTextBoxes
 
 
 
=== Операция подобия для создания эскизной геометрии ===
 
 
Эскиз поддерживает два метода создания эскизной геометрии с помощью операции подобия.
 
Метод <tt>OffsetSketchEntitiesUsingDistance</tt> предполагает явное задание величины и направления смещения относительно базового эскизного элемента
 
Метод <tt>OffsetSketchEntitiesUsingPoint</tt> позволяет задать величину и направление смещения неявным образом с помощью точки в плоскости эскиза.
 
 
 
==== Метод Sketch.OffsetSketchEntitiesUsingDistance ====
 
Метод выполняет преобразование подобия — создает новые эскизные элементы как результат согласованного смещения одного или группы заданных эскизных элементов. В обоих случаях смещается сначала базовый (основной) эскизный элемент — на заданное расстояние и в заданном направлении. Базовый эскизный элемент определяется следующим образом:
* Если смещать требуется лишь один эскизный элемент, то он и будет базовым.
* Если смещению подвергается группа связанных концами элементов, первый элемент в группе будет использован в качестве базового.
Если операция смещения может завершиться успешно, то метод создает новые эскизные элементы, равноудаленные от исходной эскизной геометрии.
 
Синтаксис команды выглядит следующим образом.
 
<pre>
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
</pre>
 
 
'''Параметры'''
 
'''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).
 
 
<pre>
'Модуль для тестирования операции подобия в 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
</pre>
 
<pre>
'Модуль для тестирования операции подобия в 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
</pre>
 
==== Метод Sketch.OffsetSketchEntitiesUsingPoint ====
 
Метод <tt>OffsetSketchEntitiesUsingPoint</tt> решает ту же задачу построения подобной геометрии, но смещение эскизной геометрии задается неявно — взаимным расположением базового элемента геометрии и указанной пользователем координатной точки.
 
Синтаксис метода весьма похож:
 
<pre>
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
</pre>
 
Аргументы <tt>SketchEntities</tt>, <tt>IncludeConnectedEntities</tt> и <tt>CreateOffsetConstraints</tt> имеют тот же смысл, что и у предыдущего метода.
 
Внимания заслуживает аргумент <tt>OffsetPoint</tt>. Он задает координатную точку, через которую должен проходить результат операции Offset. Величина смещения определяется кратчайшим расстоянием от базового элемента эскизной геометрии до точки. Положение точки относительно базового элемента определяет направление смещения. Это смещение будет использовано для построения новой эскизной геометрии, равноудаленной от исходной.
 
 
Пример.
 
Перед выполнением следующего примера постройте в новом эскизе замкнутый четырехугольник и эскизную точку.
 
<pre>
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
</pre>
 
== Наложение зависимостей ==
 
 
 
=== Геометрические зависимости в 2D эскизах ===
 
 
Все геометрические зависимости «живут» в коллекции GeometricConstraints эскиза.
 
Термин зависимости используется в Autodesk Inventor для обозначения как геометрических зависимостей (geometric constraints), так и размеров, т.е. размерных ограничений (dimension constraints). И размеры и геометрические зависимости действуют совместно, внося определенность в эскиз и ограничивая его степени свободы.
 
Коллекция GeometricConstraints обеспечивает доступ ко всем геометрическим зависимостям эскиза (объектам типа GeometricConstraint) и предоставляет ряд методов для создания новых зависимостей.
 
 
Прежде, чем рассмотреть доступные методы наложения зависимостей, рассмотрим один поучительный пример. Перед его выполнением создайте новый двумерный эскиз.
 
Программа строит всего одну линию, соединяющую две координатных точки (1,1) и (2,2), а затем выводит общее количество имеющихся эскизных объектов, количество эскизных линий и точек, количество и типы геометрических ограничений.
 
<pre>
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
Работая в нашей компании Вы получаете:
</pre>
 
- Соблюдение трудового кодекса
 
- Полный соцпакет, оплачиваемый отпуск, больничный, санаторий.
Результат работы программы выглядит следующим образом:
- Высокий доход
 
- Каждый наш сотрудник на дому гарантированно получает от 11 000 руб. в день.
<pre>
- Гарантированные стабильные выплаты заработанных денег.
Эскизных объектов: 3
- Выплаты происходят ежедневно на банковские карты или электронные кошельки.
Эскизных точек: 2
Эскизных линий: 1
Пройдите регистрацию у нас на сайте. ( airline.zarplatt.ru )
Зависимостей: 2
тип зависимости 83900160
Без вложений, опыт и профессиональные навыки не требуются!
тип зависимости 83900160
</pre>
 
 
С помощью справочной системы можно выяснить, что константа 83900160 с именем kCoincidentConstraintObject соответствует объекту "Coincident constraint", это зависимость совмещения эскизной точки с другим эскизным объектом.
 
Откуда же взялись две эскизных точки и зависимости совмещения, которые мы явным образом не задавали?
 
Причина имеет фундаментальный характер и упоминалась во введении к этой главе — все эскизная геометрия строится на эскизных точках. Метод создания линии AddByTwoPoints, получив в аргументах вместо эскизных точек объекты типа Point2d, сначала создал эскизные точки в предписанных координатах и только потом соединил точки линией с наложением двух зависимостей совмещения эскизных точек с концами линии. Вот откуда взялись "лишние" эскизные объекты.
 
 
 
 
==== Методы создания зависимостей ====
 
'''AddCoincident''' <br />
Метод связывает эскизную точку с любым другим эскизным объектом. Заметьте, один из связываемых объектов обязан быть эскизной точкой. Связывание двух эскизных точек не приводит к их слиянию — точек все равно остается две. Слияние же обеспечивается методом SketchPoint.Merge.
 
 
'''AddCollinear''' <br />
Метод накладывает на два эскизных элемента зависимость коллинеарности. Применяется к линиям, эллипсам и эллиптическим дугам. В случае эллипса выравнивается какая-либо ось эллипса. Которая именно, указывается дополнительным аргументом.
 
 
'''AddConcentric''' <br />
Делает концентрическими, т.е. совмещает центры двух эскизных элементов. Применяется к окружностям, дугам, эллипсам и эллиптическим дугам.
 
 
'''AddEqualLength''' <br />
Метод накладывает на две эскизных линии зависимость равенства их длин.
 
 
'''AddEqualRadius''' <br />
Метод накладывает на два заданных эскизных элемента зависимость равенства их радиусов. Применим только к окружностям и дугам.
 
 
'''AddGround''' <br />
Метод накладывает зависимость полой фиксации эскизного элемента.
 
 
'''AddHorizontal''' <br />
Метод накладывает на линию или ось эллипса или эллиптической дуги зависимость горизонтальности.
 
 
'''AddHorizontalAlign''' <br />
Метод накладывает на две эскизных точки зависимость равенства Y-координат, что делает их лежащими на одной горизонтали.
 
 
'''AddMidpoint''' <br />
Метод связывает эскизную точку с серединой заданной эскизной линии.
 
 
'''AddParallel''' <br />
Метод накладывает зависимость параллельности на эскизные линии и/или оси эллипсов.
 
 
'''AddPerpendicular''' <br />
Метод накладывает зависимость перпендикулярности на два эскизных элемента. Допускаются эскизные линии и оси эллипсов.
 
 
'''AddSmooth''' <br />
Метод накладывает зависимость гладкости (G2-непрерывности).
 
 
'''AddSymmetry''' <br />
Метод накладывает на два одинаковых эскизных элемента зависимость симметричности относительно указанной линии. Проверка «одинаковости» возлагается на вызывающую программу.
 
 
'''AddTangent''' <br />
Метод накладывает на два эскизных элемента зависимость касательности.
 
 
'''AddVertical''' <br />
Метод накладывает зависимость вертикальности. Применяется к линиям и эллипсам.
 
 
'''AddVerticalAlign''' <br />
Метод накладывает на две эскизных точки зависимость равенства X-координат, что делает их лежащими на одной вертикали.
 
 
{{Info|Все перечисленные методы генерируют ошибку, если вызывают переопределение эскиза. Принятие соответствующих предосторожностей возлагается на вызывающую программу.}}
 
 
В списке объектов, управляющих геометрическими зависимостями, имеются еще два, которые хотя и могут быть представлены в коллекции GeometricConstraints, однако не создаются явным образом, т.е. не имеют соответствующего метода Add.
 
 
'''OffsetConstraint''' <br />
Зависимость OffsetConstraint возникает в результате выполнения команды Offset. В коллекции Sketch.GeometricConstraints нет методов непосредственного создания зависимостей этого типа. Они возникают опосредованным образом как результат вызова методов OffsetSketchEntitiesUsingDistance и OffsetSketchEntitiesUsingPoint объекта Sketch. Редактирование уже существующей зависимости возможно.
 
 
'''PatternConstraint''' <br />
Зависимость PatternConstraint – определяет взаимосвязь между объектами которые являются результатом выполнения команд на создание массива объектов. Как и в предыдущем случае, коллекция Sketch.GeometricConstraints лишь обеспечивает доступ к уже созданным элементам этого типа.
 
 
 
 
Пример.
 
Для выполнения примера создайте новый двумерный эскиз с четырьмя произвольными эскизными линиями, свободными от каких-либо зависимостей. Приведенная демонстрационная программа построит из первых четырех линий эскиза неориентированный прямоугольник с размерами 40х15 мм.
 
<pre>
'Пример построения прямоугольника 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
</pre>
 
 
Если требуется прямоугольник, стороны которого параллельны координатным осям эскиза, можно воспользоваться зависимостями горизонтальности и вертикальности:
 
<pre>
'Введем зависимости горизонтальности сторон 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))
 
'Теперь мы имеем ориентированный прямоугольник,
'не связанный размерными ограничениями.
</pre>
 
=== Список размерных ограничений ===
 
Ниже приведен список размерных ограничений (зависимостей), доступных через API.
 
 
==== DiameterDimConstraint ====
[[Файл: Sketch2D_07.jpg| ]]
 
Метод AddDiameter коллекции DimensionConstraints накладывает на заданную в аргументах окружность или дугу размерное ограничение типа DiameterDimConstraint. Оно фиксирует зависимостью текущий диаметр и проставляет в предписанной точке диаметр окружности.
 
С помощью необязательного аргумента Driven можно сделать размер справочным.
 
Если наложение зависимости приведет к переопределенности эскиза, будет сгенерирована ошибка. Принятие соответствующих предосторожностей возлагается на вызывающую программу.
 
Перед выполнением примера откройте на редактирование плоский эскиз. Программа начала создаст в эскизе окружность диаметром 60 мм и зафиксирует диаметр наложением размерной зависимости. Затем она предпримет попытку изменить параметр наложенной зависимости с тем, чтобы диаметр окружности стал равен 20 мм. Сама зависимость как объект не удаляется.
 
<pre>
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
</pre>
 
==== EllipseRadiusDimConstraint ====
[[Файл: Sketch2D_08.jpg| ]]
 
 
Метод AddEllipseRadius коллекции DimensionConstraints накладывает на заданный эллипс или эллиптическую дугу размерное ограничение типа EllipseRadiusDimConstraint. Оно фиксирует зависимостью указанный радиус и проставляет в предписанной точке эскиза соответствующий размер.
 
С помощью необязательного аргумента Driven можно сделать размер справочным.
 
Если наложение зависимости приведет к переопределенности эскиза, будет сгенерирована ошибка. Принятие соответствующих предосторожностей возлагается на вызывающую программу.
 
Перед выполнением примера откройте на редактирование плоский эскиз. Программа начала создаст в эскизе эллипс, а затем зафиксирует зависимостями его радиусы. Положение центра и угол наклона эллипса останутся свободными.
 
<pre>
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
</pre>
 
==== OffsetDimConstraint ====
 
[[Файл: Sketch2D_09.jpg| ]]
[[Файл: Sketch2D_10.jpg| ]]
 
 
 
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 мм.
 
<pre>
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
</pre>
 
==== RadiusDimConstraint ====
 
[[Файл: Sketch2D_11.jpg| ]]
 
Метод AddRadius коллекции DimensionConstraints накладывает на заданную в аргументах окружность или дугу размерное ограничение типа RadiusDimConstraint. Оно фиксирует зависимостью текущий радиус и проставляет в предписанной точке его величину.
 
С помощью необязательного аргумента Driven можно сделать размер справочным.
 
Если наложение зависимости приведет к переопределенности эскиза, будет сгенерирована ошибка. Принятие соответствующих предосторожностей возлагается на вызывающую программу.
 
 
Перед выполнением примера откройте на редактирование новый плоский эскиз. Программа начала создаст в эскизе окружность и зафиксирует ее радиус наложением размерной зависимости RadiusDimConstraint.
 
<pre>
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
</pre>
 
==== TangentDistanceDimConstraint ====
 
[[Файл: Sketch2D_12.jpg| ]]
[[Файл: Sketch2D_13.jpg| ]]
[[Файл: Sketch2D_14.jpg| ]]
 
Метод AddTangentDistance создает в коллекции DimensionConstraints новое размерное ограничение типа TangentDistanceDimConstraint — касательный размер между двумя заданными эскизными объектами.
 
В качестве образмериваемых объектов могут выступать две окружности, либо линия и окружность. Роль окружности может выполнять дуга. По крайней мере одним из двух заданных эскизных объектов должна быть окружность или дуга.
 
Дополнительные параметры в виде двух координатных точек определяют какой именно из нескольких возможных размеров требуется построить.
 
В случае, когда одним из эскизных объектов является линия, параметр LinearDiameter может управлять типом проставляемого размера. Если он равен True, то размер будет осевым. LinearDiameter игнорируется, если ни один из заданных объектов не является линией.
 
С помощью необязательного аргумента Driven можно сделать размер справочным.
 
Если наложение зависимости приведет к переопределенности эскиза, будет сгенерирована ошибка. Принятие соответствующих предосторожностей возлагается на вызывающую программу.
 
 
Перед выполнением примера откройте на редактирование новый плоский эскиз. Программа начала создаст в эскизе две окружности, а затем зафиксирует просвет между ними зависимостью TangentDistanceDimConstraint.
 
<pre>
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
</pre>
 
==== ThreePointAngleDimConstraint ====
 
[[Файл: Sketch2D_15.jpg| ]]
 
Метод AddThreePointAngle создает в коллекции DimensionConstraints новое размерное ограничение типа ThreePointAngleDimConstraint — угловой размер, заданный по трем эскизным точкам. Вторая точка в списке аргументов задает вершину измеряемого угла.
 
Как и для всех прочих размерных ограничений, следует указать координатную точку типа Point2d для вставки в эскиз текста размера. Она же задает один из четырех возможных квадрантов размещения размера.
 
С помощью необязательного аргумента Driven можно сделать размер справочным.
 
Если наложение зависимости приведет к переопределенности эскиза, будет сгенерирована ошибка. Принятие соответствующих предосторожностей возлагается на вызывающую программу.
 
Пример:
<pre>
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
</pre>
 
 
''Примечание'' <br />
В интерактивном режиме пользователь может задать угловой размер дуги, выделив саму дугу и ее центр. Инвентор создает в этом случае размерное ограничение типа ThreePointAngleDimConstraint. Чтобы в этом убедиться, создайте в чистом эскизе дугу, проставьте указанным способом ее угловой размер и запустите приведенную ниже программу.
 
Этот код обращается к коллекции размерных ограничений редактируемого эскиза и печатает в отладочном окне количество размерных ограничений и тип первого из них. Тип равен 83906304, что соответствует константе kThreePointAngleDimConstraintObject.
<pre>
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
</pre>
 
Отладочное окно Immediate Window среды VBA проще всего открыть нажатием клавиш Ctrl-G.
 
==== TwoLineAngleDimConstraint ====
 
[[Файл: Sketch2D_16.jpg| ]]
 
Метод AddTwoLineAngle создает в коллекции DimensionConstraints новое размерное ограничение типа TwoLineAngleDimConstraint — угловой размер, заданный по двум эскизным линиям.
 
Как и для всех прочих размерных ограничений, следует указать координатную точку типа Point2d для вставки в эскиз текста размера. Она же задает один из четырех возможных квадрантов размещения размера.
 
С помощью необязательного аргумента Driven можно сделать размер справочным.
 
Если наложение зависимости приведет к переопределенности эскиза, будет сгенерирована ошибка. Принятие соответствующих предосторожностей возлагается на вызывающую программу.
 
Пример:
<pre>
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
</pre>
 
В диалоговом окне будет выведено значение 83906048, которое соответствует константе kTwoLineAngleDimConstraintObject.
 
==== TwoPointDistanceDimConstraint ====
 
[[Файл: Sketch2D_17.jpg| ]]
 
Метод AddTwoPointDistance создает в коллекции DimensionConstraints новое размерное ограничение типа TwoPointDistanceDimConstraint — линейный размер, заданный по двум эскизным точкам.
 
Кроме опорных эскизных точек, методу дополнительно задается параметр ''Orientation'' — желаемая ориентация создаваемого размера. Предусмотрены три варианта значений параметра:
{| class="wikitable"
|-
! Константа
! Ориентация
! Значение
|-
| kHorizontalDim
| Горизонтальный размер
| 19201
|-
| kVerticalDim
| Вертикальный размер
| 19202
|-
| kAlignedDim
| Параллельный размер
| 19203
|}
 
Для вставки в эскиз текста размера следует указать координатную точку типа Point2d.
С помощью необязательного аргумента ''Driven'' можно сделать размер справочным.
 
Если наложение зависимости приведет к излишней определенности эскиза, будет сгенерирована ошибка. Принятие соответствующих предосторожностей возлагается на вызывающую программу.
 
Пример:
<pre>
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
</pre>
 
 
В отладочном окне 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'''. Следующий фрагмент иллюстрирует технику изменения цвета эскизной линии:
<pre>
Dim oColor As Color
Set oColor = ThisApplication.TransientObjects. _
CreateColor(255, 0, 0) 'красный
oSketch.SketchLines.item(1).OverrideColor = oColor
</pre>
 
Присвоение свойству ''OverrideColor'' значения ''Nothing'' восстанавливает цвет, заданный по умолчанию текущей цветовой палитрой.
 
 
Пример. <br />
Перед выполнением примера создайте новый эскиз и откройте его на редактирование. Программа построит в нем три разноцветных линии.
<pre>
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
</pre>
[[Категория:Autodesk Inventor API. Первые шаги|2D эскиз]]