ADN Club > Inventor API
Видимость плоскостей координат компонентов в сборке.
niksasa:
Приветствую всех. Хочу программно включать и выключать видимость плоскостей компонента в сборке. И что-то не могу понять как. Как включить/выключить видимость плоскостей сборки и детали понятно.
Сборка:
--- Код: ---Dim oAssDoc As AssemblyDocument
oAssDoc = ThisApplication.ActiveDocument
wfBoolean = InputRadioBox("Включить рабочие элементы Да/Нет", "Да", "Нет", False, "iLogic")
For Each oWorkPlane In oAssDoc.ComponentDefinition.WorkPlanes
oWorkPlane.Visible = wfBoolean
Next
--- Конец кода ---
Деталь:
--- Код: ---Dim oDoc As PartDocument
oDoc = ThisDoc.Document
wfBoolean = InputRadioBox("Включить рабочие элементы Да/Нет", "Да", "Нет", False, "iLogic")
For Each oWorkPlane In oDoc.ComponentDefinition.WorkPlanes
oWorkPlane.Visible = wfBoolean
Next
--- Конец кода ---
Как указать на компонент сборки понятно:
--- Код: ---ThisApplication.CommandManager.Pick(SelectionFilterEnum.kAssemblyOccurrenceFilter, "Укажите компонент")
--- Конец кода ---
Какая функция отвечает за компоненты сборки?
--- Код: --- ComponentOccurrence?
--- Конец кода ---
Нет?
Владимир Ананьев:
Компоненты в сборках представлены объектом ComponentOccurence.
Рабочая геометрия, определенная в контексте самого компонента (документа детали или сборки) «живет» в определении соответствующего документа.
Следовательно, порядок действий должен быть примерно таким.
Допустим, имеем дело с вхождением детали.
1) Получаем ссылку на компонент (программно или юзер выделил – не важно).
2) Получаем ссылку на объект PartComponentDefinition
3) Доступ к рабочей геометрии обеспечивают три свойства определения детали – WorkPlanes, WorkAxes и WorkPoints.
Надо также учесть, что в контексте сборки рабочая геометрия детали представлена соответствующими прокси-объектами. Их видимость может отличаться от видимости родительских плоскостей, осей и точек.
Про технику работы с прокси-объектами есть обзорная статья:
http://ru.wikibooks.org/wiki/Autodesk_Inventor_API._%D0%9F%D0%B5%D1%80%D0%B2%D1%8B%D0%B5_%D1%88%D0%B0%D0%B3%D0%B8/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82_Assembly
Ссылки на компоненты сборки ComponentOccurrence «живут» в коллекции
AssemblyComponentDefinition.Occurrences. См. тот же обзор про сборки.
Владимир Ананьев:
Вариант 1.
Работаем в сборке, выделяем рабочую плоскость, нужно инвертировать ее видимость.
Для выделения используем метод Pick с фильтром для рабочих плоскостей.
Поскольку работаем в контексте сборки, метод Pick возвращает объект
типа WorkPlaneProxy. В данном случае на наш код это практически не влияет,
поскольку у прокси-объекта присутствуют все свойства и методы родителя.
--- Код - vb.net [Выбрать] ---Private Sub ToggleWorkPlaneVisibility_1() Dim oAsmDoc As AssemblyDocument Set oAsmDoc = ThisApplication.ActiveDocument Dim oAsmDef As AssemblyComponentDefinition Set oAsmDef = oAsmDoc.ComponentDefinition Dim oObj As Object Set oObj = ThisApplication.CommandManager.Pick( _ SelectionFilterEnum.kWorkPlaneFilter, "Укажите раб. плоскость") Dim wp As WorkPlaneProxy Set wp = oObj wp.Visible = Not wp.Visible BeepEnd Sub 'ToggleWorkPlaneVisibility_1
Вариант 2.
Работаем в сборке, выделяем компонент (здесь только деталь),
нужно инвертировать видимость всех рабочих плоскостей в компоненте.
В компоненте могут быть вспомогательные конструкционные рабочие плоскости.
Они создаются программно и без какой-либо визуализации.
В данном примере процедура изменения видимости игнорирует
не только конструкционные плоскости, что следует делать всегда,
но и главные плоскости системы координат (это опция).
--- Код - vb.net [Выбрать] ---Private Sub ToggleWorkPlaneVisibility_2() Dim oObj As Object Set oObj = ThisApplication.CommandManager.Pick( _ SelectionFilterEnum.kAssemblyLeafOccurrenceFilter, "Укажите компонент") Dim oOcc As ComponentOccurrence Set oOcc = oObj 'Фильтр kAssemblyLeafOccurrenceFilter допускает 'выделение только деталей, но не подсборок Dim oDef As PartComponentDefinition Set oDef = oOcc.Definition Dim oWPlanes As WorkPlanes Set oWPlanes = oDef.WorkPlanes Dim wp As WorkPlane For Each wp In oWPlanes 'игнорируем '(a) главные плоскости системы координат, '(b) вспомогательные конструкционные рабочие плоскости, ' у которых свойство Visible не определено. If (Not wp.IsCoordinateSystemElement) And (Not wp.Construction) Then 'найдем прокси-плоскость wpProxy для плоскости wp Dim wpProxy As WorkPlaneProxy Set wpProxy = Nothing Call oOcc.CreateGeometryProxy(wp, wpProxy) wpProxy.Visible = Not wpProxy.Visible End If Next BeepEnd Sub 'ToggleWorkPlaneVisibility_2
Вариант 3.
Аналог команды Alt-] в пользовательском интерфейсе Inventor,
которая управляет видимостью рабочих плоскостей (Object Visibility).
--- Код - vb.net [Выбрать] ---Sub ToggleAllWorkPlaneVisibility() 'неизбирательное инвертирование видимости рабочих плоскостей 'соответствует команде в UI Инвентора Alt-] Dim oControlDef As ControlDefinition Set oControlDef = ThisApplication.CommandManager _ .ControlDefinitions.Item("AppUserWorkPlanesVisibilityCmd") oControlDef.Execute BeepEnd Sub
В общем, есть из чего выбрать.
niksasa:
--- Цитата: Владимир Ананьев от 23-10-2013, 23:19:51 ---Вариант 2.
Код - vb.net:
Private Sub ToggleWorkPlaneVisibility_2()
Dim oObj As Object
Set oObj = ThisApplication.CommandManager.Pick( _
SelectionFilterEnum.kAssemblyLeafOccurrenceFilter, "Укажите компонент")
Dim oOcc As ComponentOccurrence
Set oOcc = oObj
'Фильтр kAssemblyLeafOccurrenceFilter допускает
'выделение только деталей, но не подсборок
Dim oDef As PartComponentDefinition
Set oDef = oOcc.Definition
Dim oWPlanes As WorkPlanes
Set oWPlanes = oDef.WorkPlanes
Dim wp As WorkPlane
For Each wp In oWPlanes
'найдем прокси-плоскость wpProxy для плоскости wp
Dim wpProxy As WorkPlaneProxy
Set wpProxy = Nothing
Call oOcc.CreateGeometryProxy(wp, wpProxy)
wpProxy.Visible = Not wpProxy.Visible
Next
Beep
End Sub 'ToggleWorkPlaneVisibility_2
--- Конец цитаты ---
Огромное спасибо, Владимир. Вы просто кладезь знаний. Этот вариант то, что надо.
Только я убрал игнорирование координатных и вспомогательных плоскостей.
Нужно тщательно проанализировать код. Возможно ещё проверку добавлю, что должны быть включены все рабочие элементы. Я так понимаю это обязательное условие и без него никак.
--- Цитата: Владимир Ананьев от 23-10-2013, 23:19:51 ---В данном примере процедура изменения видимости игнорирует
не только конструкционные плоскости, что следует делать всегда,
но и главные плоскости системы координат (это опция).
--- Конец цитаты ---
Не понял, а почему нужно делать игнорирование? Мне наоборот без игнорирования надо.
С уважением, Александр.
Владимир Ананьев:
«Игнорирование» приведено лишь в демонстрационных целях. Надо или нет зажигать/гасить главные плоскости системы координат – зависит от контекста решаемой задачи. Здесь лишь показан один из способов, как их можно отфильтровать при переборе. Другой способ – вспомнить, что главные плоскости являются первыми тремя неубиваемыми членами коллекции рабочих плоскостей. Соответственно, если они не нужны, то можно перебирать плоскости не в цикле For Each – Next, а в цикле For – Next, где счетчик цикла стартует с 4.
Конструкционные рабочие плоскости те, у которых свойство Construction равно True. Они не отображаются в принципе. Операция изменения видимости там просто игнорируется.
Кстати, создать их можно только программно. Пользователь ничего о них ни узнать, ни сделать с ними не может. Иногда это весьма полезный инструмент построений.
Желаю успехов!
Навигация
Перейти к полной версии