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

Автор Тема: Видимость плоскостей координат компонентов в сборке.  (Прочитано 7394 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн niksasaАвтор темы

  • ADN Club
  • **
  • Сообщений: 91
  • Карма: 0
  • Skype: niksasa1979
Приветствую всех. Хочу программно включать и выключать видимость плоскостей компонента в сборке. И что-то не могу понять как. Как включить/выключить видимость плоскостей сборки и детали понятно.
Сборка:
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?
Нет?
« Последнее редактирование: 20-10-2013, 02:38:58 от Владимир Ананьев »

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Компоненты в сборках представлены объектом 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.  См. тот же обзор про сборки.

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Вариант 1.
Работаем в сборке,  выделяем рабочую плоскость, нужно инвертировать ее видимость.
Для выделения используем метод Pick с фильтром для рабочих плоскостей.
Поскольку работаем в контексте сборки, метод Pick возвращает объект
типа WorkPlaneProxy.  В данном случае на наш код это практически не влияет,
поскольку у прокси-объекта присутствуют все свойства и методы родителя.
Код - vb.net [Выбрать]
  1. Private Sub ToggleWorkPlaneVisibility_1()
  2.  
  3.   Dim oAsmDoc As AssemblyDocument
  4.   Set oAsmDoc = ThisApplication.ActiveDocument
  5.   Dim oAsmDef As AssemblyComponentDefinition
  6.   Set oAsmDef = oAsmDoc.ComponentDefinition
  7.  
  8.   Dim oObj As Object
  9.   Set oObj = ThisApplication.CommandManager.Pick( _
  10.      SelectionFilterEnum.kWorkPlaneFilter, "Укажите раб. плоскость")
  11.  
  12.   Dim wp As WorkPlaneProxy
  13.   Set wp = oObj
  14.   wp.Visible = Not wp.Visible
  15.  
  16.   Beep
  17. End Sub 'ToggleWorkPlaneVisibility_1

Вариант 2.
Работаем в сборке,  выделяем компонент (здесь только деталь),
нужно инвертировать видимость всех рабочих плоскостей в компоненте. 
В компоненте могут быть вспомогательные конструкционные рабочие плоскости. 
Они создаются программно и без какой-либо визуализации. 
В данном примере процедура изменения видимости игнорирует
не только конструкционные плоскости, что следует делать всегда,
но и главные плоскости системы координат (это опция).
Код - vb.net [Выбрать]
  1. Private Sub ToggleWorkPlaneVisibility_2()
  2.  
  3.   Dim oObj As Object
  4.   Set oObj = ThisApplication.CommandManager.Pick( _
  5.     SelectionFilterEnum.kAssemblyLeafOccurrenceFilter, "Укажите компонент")
  6.   Dim oOcc As ComponentOccurrence
  7.   Set oOcc = oObj
  8.   'Фильтр kAssemblyLeafOccurrenceFilter допускает
  9.   'выделение только деталей, но не подсборок
  10.   Dim oDef As PartComponentDefinition
  11.   Set oDef = oOcc.Definition
  12.  
  13.   Dim oWPlanes As WorkPlanes
  14.   Set oWPlanes = oDef.WorkPlanes
  15.  
  16.   Dim wp As WorkPlane
  17.  
  18.   For Each wp In oWPlanes
  19.     'игнорируем
  20.     '(a) главные плоскости системы координат,
  21.     '(b) вспомогательные конструкционные рабочие плоскости,
  22.     '    у которых свойство Visible не определено.
  23.     If (Not wp.IsCoordinateSystemElement) And (Not wp.Construction) Then
  24.       'найдем прокси-плоскость wpProxy для плоскости wp
  25.       Dim wpProxy As WorkPlaneProxy
  26.       Set wpProxy = Nothing
  27.       Call oOcc.CreateGeometryProxy(wp, wpProxy)
  28.       wpProxy.Visible = Not wpProxy.Visible
  29.     End If
  30.   Next
  31.  
  32.   Beep
  33. End Sub 'ToggleWorkPlaneVisibility_2


Вариант 3.
Аналог команды  Alt-]  в пользовательском интерфейсе Inventor,
которая управляет видимостью рабочих плоскостей (Object Visibility).

Код - vb.net [Выбрать]
  1. Sub ToggleAllWorkPlaneVisibility()
  2.    'неизбирательное инвертирование видимости рабочих плоскостей
  3.    'соответствует команде в UI Инвентора   Alt-]
  4.    Dim oControlDef As ControlDefinition
  5.    Set oControlDef = ThisApplication.CommandManager _
  6.       .ControlDefinitions.Item("AppUserWorkPlanesVisibilityCmd")
  7.    oControlDef.Execute
  8.    Beep
  9. End Sub

В общем, есть из чего выбрать.
« Последнее редактирование: 24-10-2013, 02:37:09 от Александр Ривилис »

Оффлайн niksasaАвтор темы

  • ADN Club
  • **
  • Сообщений: 91
  • Карма: 0
  • Skype: niksasa1979
Вариант 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

Огромное спасибо, Владимир. Вы просто кладезь знаний. Этот вариант то, что надо.
Только я убрал игнорирование координатных и вспомогательных  плоскостей.
Нужно тщательно проанализировать код. Возможно ещё проверку добавлю, что должны быть включены все рабочие элементы. Я так понимаю это обязательное условие и без него никак.
В данном примере процедура изменения видимости игнорирует
не только конструкционные плоскости, что следует делать всегда,
но и главные плоскости системы координат (это опция).
Не понял, а почему нужно делать игнорирование? Мне наоборот без игнорирования надо.
С уважением, Александр.
« Последнее редактирование: 24-10-2013, 03:44:50 от niksasa »

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
«Игнорирование» приведено лишь в демонстрационных целях.  Надо или нет зажигать/гасить главные плоскости системы координат – зависит от контекста решаемой задачи.  Здесь лишь показан один из способов, как их можно отфильтровать при переборе.  Другой способ – вспомнить, что главные плоскости являются первыми тремя неубиваемыми членами коллекции рабочих плоскостей.  Соответственно, если они не нужны, то можно перебирать плоскости не в цикле For Each – Next, а в цикле For – Next, где счетчик цикла стартует с 4.
Конструкционные рабочие плоскости те, у которых свойство Construction равно True.  Они не отображаются в принципе.  Операция изменения видимости там просто игнорируется.
Кстати, создать их можно только программно.  Пользователь ничего о них ни узнать, ни сделать с ними  не может.  Иногда это весьма полезный инструмент построений.
Желаю успехов!
« Последнее редактирование: 24-10-2013, 14:03:46 от Владимир Ананьев »

Оффлайн niksasaАвтор темы

  • ADN Club
  • **
  • Сообщений: 91
  • Карма: 0
  • Skype: niksasa1979
Владимир, спасибо на добром слове.
Мне единственно не понятно: почему исторически так сложилось, что нельзя в сборке отобразить плоскости координат для параметрических моделей и сборок?

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Честно говоря, не знаю.

Оффлайн Алексей Романов

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Мне единственно не понятно: почему исторически так сложилось, что нельзя в сборке отобразить плоскости координат для параметрических моделей и сборок?
Как я понимаю, речь идет о iPart? Просто мысли вслух... В сборках отображаются исполнения iPart на базе производных компонентов, редактирование которых напрямую наглухо закрыто, даже через API... Может здесь причина?