Подавление вхождений, выбранных методом SelectSet.SelectMultiple

Автор Тема: Подавление вхождений, выбранных методом SelectSet.SelectMultiple  (Прочитано 4600 раз)

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

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
    Здравствуйте, уважаемые форумчане. Помогите пожалуйста решить такую вот задачу:
    У меня есть сборка, содержащая 500 одинаковых деталей. Мне необходимо, например, подавить 240, остальные оставить. Давить изделия перебором выходит очень долго.
В пользовательском интерфейсе есть возможность выбрать мышкой множество вхождений и одновременно подавить, и делается это почти мгновенно. Можно ли повторить аналогичную операцию с помощью метода  SelectSet.SelectMultiple (или какого-либо другого) ? Как выбрать изделия, я разобрался, а вот как подавить их додуматься не могу :(
Код - Visual Basic [Выбрать]
  1. Sub supress_by_SelectSet()    
  2.     Dim oDoc As Inventor.Document
  3.     Set oDoc = ThisApplication.ActiveDocument
  4.     Dim oOccs As ComponentOccurrences
  5.     Set oOccs = ThisApplication.ActiveDocument.ComponentDefinition.Occurrences
  6.     Dim oColletionOcc As ObjectCollection
  7.     Set oColletionOcc = ThisApplication.TransientObjects.CreateObjectCollection
  8.    
  9.     Dim i As Integer: Dim i2 As Double
  10.     i2 = 240 ' это число постоянно разное
  11.        For i = 1 To i2
  12.         oColletionOcc.Add oOccs(i)
  13.         Next    
  14.     oDoc.SelectSet.Clear
  15.     oDoc.SelectSet.SelectMultiple oColletionOcc
  16.    
  17.  End Sub

В программировании я новичок...но ненадолго! ;)

Отмечено как Решение R.I.Chernov 23-03-2016, 12:36:56

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

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Давить изделия перебором выходит очень долго.
Это не соответствует действительности. Подавление в SelectSet происходит также методом перебора, НО выполняется штатными командами напрямую, работают на порядок быстрее. Если напишите AddIn на С++, то можете приблизится в скорости...
Просто VBA в АИ2013 - 32 битный работает с АИ через Винду, в АИ2014+ VBA - 64 битный работает с АИ напрямую, код работает заметно быстрее...
Вот "правильный" код, нет лишних действий:
Код - Visual Basic [Выбрать]
  1. Sub supress_by_SelectSet()
  2.     Dim oDoc As Inventor.Document
  3.     Set oDoc = ThisApplication.ActiveDocument
  4.     Dim oOccs As ComponentOccurrences
  5.     Set oOccs = ThisApplication.ActiveDocument.ComponentDefinition.Occurrences
  6.    
  7.     Dim i As Integer: Dim i2 As Double
  8.     i2 = 240
  9.     For i = 1 To i2
  10.         Call oOccs.Item(i).Suppress(True)
  11.     Next
  12.  End Sub

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Это не соответствует действительности. Подавление в SelectSet происходит также методом перебора
Спасибо, Алексей!
:( Просто я тут экспериментировал: подавление кодом аналогичным вашему 900 вхождений занимает 175 секунд. Если выделить их и в меню ПКМ выбрать "подавить", то действие осуществляется за секунду. Неужели перебор, которым пользуется программа в 175 раз быстрее перебора, доступного в VBA?
Нельзя ли обратиться к командам контекстного меню ПКМ? Ну в смысле: выделил программно необходимые вхождения, а котом "как бы нажал ПКМ и выбрал команду подавить"?

П.С. Ваш код будет работать еще быстрее, если 10 строка будет иметь вид:
If oOccs.Item(i).suppressed=False Then Call oOccs.Item(i).Suppress(True)
В программировании я новичок...но ненадолго! ;)