Сообщество программистов Autodesk в СНГ

ADN Club => VBA => Тема начата: alihovsky от 13-09-2018, 21:02:56

Название: Сортировка в Selectionset
Отправлено: alihovsky от 13-09-2018, 21:02:56
Застрял, на сортировке массива  :'(:

есть Selectionset с фильтром 3DSolid, у данных солидов имеется (или не имеется, не суть) xdata с неким значением (в моем случае:номером детали), причем последовательность номеров не обязательно: 1,2,3 и тд, а вариативно(то есть, может быть: 35,3,6 и тд.),
при этом метод  SelectOnScreen, естественно, по своему нумерует объекты в данной выборке ( то есть Item1,Item2,Item3 и тд. и очередность этих Items, наверняка, зависит от времени создания объекта, но не суть)
 Вопрос к seniors developers :):
Допустим: три солида имеют xdata(1)="35","3","6"
как изменить Selectionset, или я не знаю что нужно изменить :'(, что бы в следующем модуле (или в текущем, не суть ) действия совершались сначала с солидом xdata(1) которого "3", затем следующим с xdata(1)="6" и соответственно  "35", то есть по убыванию
Спасибо
Название: Re: Сортировка в Selectionset
Отправлено: Александр Ривилис от 13-09-2018, 21:21:06
Создай из этого SelectionSet SortedDictionary<string, ObjectId> - вот у тебя и будет отсортированный список.
Название: Re: Сортировка в Selectionset
Отправлено: Александр Ривилис от 13-09-2018, 21:23:24
действия совершались сначала с солидом xdata(1) которого "3", затем следующим с xdata(1)="6" и соответственно  "35", то есть по убыванию
Вообще-то, это называется по возрастанию. Но: 
но не суть
Название: Re: Сортировка в Selectionset
Отправлено: Александр Ривилис от 13-09-2018, 22:35:11
Только сейчас обратил внимание, что этот вопрос в разделе VBA. Тогда сортировку придётся писать самостоятельно или искать в интернете готовую.
Название: Re: Сортировка в Selectionset
Отправлено: alihovsky от 14-09-2018, 07:21:47
Да, по возрастанию. Я нашел метод который так сортирует ячейки в excel, беда в том что в VBA индекс Item: only for input , т. е. ввести то можно а изменить нельзя. Похоже, что нужно чистить Selectionset и заново собирать в нужной последовательности
Название: Re: Сортировка в Selectionset
Отправлено: alihovsky от 14-09-2018, 07:41:27
Создай из этого SelectionSet SortedDictionary<string, ObjectId> - вот у тебя и будет отсортированный список.
А такой метод доступен в VB.Net?
Название: Re: Сортировка в Selectionset
Отправлено: Александр Ривилис от 14-09-2018, 09:36:18
А такой метод доступен в VB.Net?
Доступен. Но я рекомендую сразу забыть про VB.NET и учить C#.
Название: Re: Сортировка в Selectionset
Отправлено: alihovsky от 15-09-2018, 13:54:15
Доступен. Но я рекомендую сразу забыть про VB.NET и учить C#.
Ок, забыл.
 Теперь:
у меня есть VS 2015(отказался от официальной VS 2017, поскольку, очень капризная(сам определил) и тормозная(по отзывам seniors)),acad 2017 студенческий, заготовка С# "pick first"(по моему эти заготовки, загружаются как "Wizard",точно не помню), куда идти за справочным материалом, ну хотя бы что бы C#  определил, что выбранные объекты являются selectionset и за тем колдовать с xdata ????
Название: Re: Сортировка в Selectionset
Отправлено: Александр Ривилис от 15-09-2018, 17:59:37
куда идти за справочным материалом, ну хотя бы что бы C#  определил, что выбранные объекты являются selectionset и за тем колдовать с xdata ??? ?
Вопрос очень странный. Наверное в первую очередь идти сюда и задавать конкретные вопросы:
AutoCAD .NET API (http://adn-cis.org/forum/index.php?board=4.0)
Название: Re: Сортировка в Selectionset
Отправлено: alihovsky от 26-09-2018, 13:36:22
Здравствуйте.
Отсортивал.  Применил метод всплывающего пузырька, затем, как и предпологал,очистил Selectionset  из заново собрал в отсортированном порядке. Показалось странным, что Count Selectionset-а
в VBA задается = 0 Тo Count - 1, приэтом  при сортировке мне пришлось задать = 0 To Count - 2, иначе VBA ругается ::). Код однако, не смотря на мои опасения, получилося коротким.
Название: Re: Сортировка в Selectionset
Отправлено: Александр Ривилис от 26-09-2018, 19:06:20
Показалось странным, что Count Selectionset-а
в VBA задается = 0 Тo Count - 1, приэтом  при сортировке мне пришлось задать = 0 To Count - 2, иначе VBA ругается ::)
Всё правильно. Так и должно было быть.
Название: Re: Сортировка в Selectionset
Отправлено: alihovsky от 02-10-2018, 19:31:05
 Здравствуйте.

 Знаю, что   не пишите в VBA, не подскажите тогда к кому обратиться с таким вопросом:
 Есть два цикла(For.. Next)  для  одного и того же набора объектов. Первый находит объекты с одинаковыми значениями в xdata(номер детали)  и удаляет их из набора, оставляя один объект  , для которого, назначается Xdata (количество деталей с одинаковым номером)   . В следующем цикле хочу вытянуть данные, но Xdata в итоге приходит для всех объектов второго цикла только одна, естественно та которая назначена последнему объекту первого цикла.

 В один цикл не могу поместить код, поскольку действия из второго цикла необходимо применять к набору без лишних объектов(удаленных в первом цикле) .

 Чувствую, что не правильный ход, но как догадываюсь, вместо цикл+цикл  нужна одна конструкция Do While...Exit Do (или эта же конструкция +обычный цикл)  и вот  тут  как раз совсем теряю понимание...

 Спасибо.
Название: Re: Сортировка в Selectionset
Отправлено: Александр Ривилис от 02-10-2018, 22:28:54
Без понимания того зачем это всё надо подсказать что-то сложно. Ну сделай дубликат набора и первый цикл с оригиналом набора, а второй цикл с копией. Хотя у меня есть устойчивое подозрение, что наборы здесь не нужны.
Название: Re: Сортировка в Selectionset
Отправлено: alihovsky от 13-10-2018, 08:19:33
Здравствуйте

 Оказывается если задекларировано
Dim xdata(0 To 2) As Variant
то VBA не читает эти данные в текущем плагине может назначить,но читает только если запустить новый плагин и соответственно считывать xdata

Как я писал, у меня два цикла в одном плагине, в первом назначаю xdata, в следующем пытаюсь считать.
selectionset.update не обновляет
 
 Не знаю на сколько верное решение или нет, но оно срабатывает, нужно просто задекларировать
Dim xdata As Variant
тогда xdata читается, правда не зная как передекларировать в одном модуле эту переменную воспользовался оператором Call ... и в вызываемом модуле задекларировал
Dim xdata As Variant