ADN Club > Inventor API

Видимость плоскостей координат компонентов в сборке.

(1/2) > >>

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.  Они не отображаются в принципе.  Операция изменения видимости там просто игнорируется.
Кстати, создать их можно только программно.  Пользователь ничего о них ни узнать, ни сделать с ними  не может.  Иногда это весьма полезный инструмент построений.
Желаю успехов!

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии