| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как удалить Selection Set, не зная его имени?

Как удалить Selection Set, не зная его имени?

Ответ
Поиск в этой теме
Непрочитано 12.12.2004, 15:33 #1
Как удалить Selection Set, не зная его имени?
Torino
 
Штаб
Регистрация: 21.08.2003
Сообщений: 943

Либо как удалить все наборы из чертежа (не зная из имени)?
Просмотров: 6201
 
Непрочитано 12.12.2004, 15:49
#2
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Думаю что так:
Код:
[Выделить все]
(setq selSets(vla-get-SelectionSets
	       (vla-get-ActiveDocument
		 (vlax-get-acad-object))))
(vlax-for sSet selSets
  (vla-delete sSet)
  ); end vlax-for
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 12.12.2004, 20:51
#3
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


Спасибо!
Torino вне форума  
 
Непрочитано 08.11.2017, 11:28
#4
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 425
<phrase 1=


Добрый день!
Как тоже самое (см. ответ №2) сделать на VBA?
Ну и далее, как получить все имена наборов SelectionSets?
Количество наборов можно получить через
Код:
[Выделить все]
Private sub Kol_vo_Naborov ()
Msgbox ThisDrawing.SelectionSets.Count
End sub
Alexeipost вне форума  
 
Непрочитано 08.11.2017, 12:05
#5
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Alexeipost Посмотреть сообщение
...как получить все имена наборов SelectionSets?...
Код:
[Выделить все]
Private Sub Kol_vo_Naborov()
    For i = 0 To ThisDrawing.SelectionSets.Count - 1
        MsgBox ThisDrawing.SelectionSets.Item(i).Name
    Next
End Sub
Boxa вне форума  
 
Непрочитано 08.11.2017, 13:45
#6
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 425
<phrase 1=


Спасибо.
Да уж, это начало массива элементов не с "1", а с "0" и немедленная перенумерация наборов - столько времени потратил....
А удалять лучше с конца
Код:
[Выделить все]
    If ThisDrawing.SelectionSets.count > 0 Then
        For i = ThisDrawing.SelectionSets.count - 1 To 0 Step -1
            ThisDrawing.SelectionSets.item(i).Delete
        Next
    End If
или так
Код:
[Выделить все]
    If ThisDrawing.SelectionSets.count > 0 Then
        For i = 0 To ThisDrawing.SelectionSets.count - 1
            ThisDrawing.SelectionSets.item(0).Delete
        Next
    End If
Допустим было 10 наборов SelectionSets (от 0 до 9).
Если удалить сначала нулевой, потом первый, потом второй, потом ........, то на пятой итерации вывалится ошибка.
И вот почему:
было 0,1,2,3,...,9, после удаления набора с номером "0"
стало 0*,1*,2*,3*,...,8*, после удаления набора с номером "1" (звездочкой отмечены наборы, у которых поменялся порядковый номер)
стало 0,1*,2*,3*,...,7*, после удаления набора с номером "2"
стало 0,1,2*,3*,...,6*, после удаления набора с номером "3"
стало 0,1,2,3*,...,5*, после удаления набора с номером "4"
стало 0,1,2,3,4*, при удалении набора с номером "5" вывалится ошибка, что такого набора не существует.

В первом коде удаляем наборы с конца и перенумерации не происходит. (Как клавиша "Backspace")
Во втором коде всегда удаляем набор с номером "0". (Как клавиша "Delete")

Последний раз редактировалось Alexeipost, 08.11.2017 в 14:06.
Alexeipost вне форума  
 
Непрочитано 08.11.2017, 15:01
#7
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Я не большой знаток VBA, но разве так не проще:
Код:
[Выделить все]
    
Do While ThisDrawing.SelectionSets.Count >= 1
        ThisDrawing.SelectionSets.Item(0).Delete
Loop
Boxa вне форума  
 
Непрочитано 08.11.2017, 15:20
#8
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 425
<phrase 1=


Так тоже можно
Alexeipost вне форума  
 
Непрочитано 08.11.2017, 17:42
#9
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,002


Цитата:
Сообщение от Boxa Посмотреть сообщение
Do While ThisDrawing.SelectionSets.Count >= 1
ThisDrawing.SelectionSets.Item(0).Delete
Loop
спорно в плане ресурсов:
1. Идет постоянное обращение к ThisDrawing.SelectionSets.Count при каждой иттерации (ну это копейки).
2. Если удалять первый элемент, то происходит постоянное смещение оставшихся к началу коллекции.
Сергей812 вне форума  
 
Непрочитано 08.11.2017, 17:49
#10
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Сергей812,
1. Ну обращается, не страшно. Больше 255 коллекций там все равно быть не может(может, но отладчик не показывает), так что вообще копейки.
2. Это же не массив, а "связный список", так какая разница, ресурсов на это смещение не тратиться, был бы массив, я бы согласился.

Последний раз редактировалось Boxa, 08.11.2017 в 17:55.
Boxa вне форума  
 
Непрочитано 08.11.2017, 18:00
#11
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,002


Цитата:
Сообщение от Boxa Посмотреть сообщение
Это же не массив, а "связный список"
А точно связанный список, а не массив объектов? В том же .Net большинство коллекций основано именно на массивах, исключение составляет LinkedList.
Сергей812 вне форума  
 
Непрочитано 08.11.2017, 18:45
#12
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Сергей812, Класс LinkedList это вроде двухсвязный список, каждый элемент ссылается на следующий и предыдущий. Я имел ввиду что-то типа динамического массива (в .net это наверное ближе к List или ArrayList), т.е. "связный список" в простейшем Си понимании, если можно так выразится, каждый последующий элемент имеет ссылку на адрес предыдущего и при изменении размера этой структуры данных не происходит выделение новой памяти и перекопирование ее с изменениями, т.е. ресурсы тратятся, но по сравнению с массивами незначительно. Как то сумбурно написал...
Boxa вне форума  
 
Непрочитано 08.11.2017, 19:02
#13
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,002


Цитата:
Сообщение от Boxa Посмотреть сообщение
Я имел ввиду что-то типа динамического массива (в .net это наверное ближе к List или ArrayList), т.е. "связный список" в простейшем Си понимании, если можно так выразится, каждый последующий элемент имеет ссылку на адрес предыдущего и при изменении размера этой структуры данных не происходит выделение новой памяти и перекопирование ее с изменениями, т.е. ресурсы тратятся, но по сравнению с массивами незначительно.
Нет, динамический массив и связанный список - это разные вещи на мой взгляд. Упрощенно говоря, динамический массив основан на создании нового массива, копировании туда содержимого старого, и присваиванию уже существующему указателю ссылки на новый массив (в .Net указатели для безопасности скрыты "внутри", но суть от этого не меняется). А старый массив удаляется или помечается на удаление. Именно так работает тот же List<T> в .Net (Майкрософт открыла исходники этих классов, можно посмотреть реализацию - все идет через базовый класс Array).
Сергей812 вне форума  
 
Непрочитано 08.11.2017, 19:37
#14
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Сергей812, Да, спасибо ознакомился с кодом. Действительно не верно сравнил связный список с List<T>, хотя с другой стороны VBA модуль не на .NET написан и потому я хотел бы надеяться, что коллекции и словари в VBA сделаны все таки связными списками (хотя кого я обманываю...).
Т.к. я не знаток VBA, то буду считать, что конструкция с do while несколько более читабельная и простая, а по затратам сравнима с другими реализациями.
Boxa вне форума  
 
Непрочитано 08.11.2017, 20:14
#15
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,002


Кстати
Цитата:
Сообщение от Alexeipost Посмотреть сообщение
If ThisDrawing.SelectionSets.count > 0 Then
For i = ThisDrawing.SelectionSets.count - 1 To 0 Step -1
ThisDrawing.SelectionSets.item(i).Delete
Next
End If
условие If не имеет смысла - при нулевом количестве наборов цикл просто не будет выполняться и не будет ошибки при обращении к коллекции ThisDrawing.SelectionSets по несуществующему индексу.
Сергей812 вне форума  
 
Непрочитано 08.11.2017, 22:01
#16
Alexeipost


 
Регистрация: 07.12.2010
Уфа
Сообщений: 425
<phrase 1=


Ну это чтобы наверняка)))
А так да, согласен что без if в данном случае можно обойтись.
Хотя если наборов будет ноль, то for начнётся с цифры -1 и тут либо не сработает, либо выдаст ошибку. Надо попробовать.
Alexeipost вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как удалить Selection Set, не зная его имени?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск