Получить набор выбранных объектов

Автор Тема: Получить набор выбранных объектов  (Прочитано 9958 раз)

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Подскажите или дайте ссылку, если этот вопрос уже  обсуждался.
Как получить в SelectionSet набор выбранных на чертеже объектов.
Если я сделаю команду, то выбранный набор объектов сбрасывается.
Нужно чтобы выполняемая команда не сбрасывала текущий выбранный пользователем набор.
Может это делать нужно вообще не по команде, а по событию?



Отмечено как Решение Алексей (IdeaSoft) 16-03-2016, 18:29:25

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus

Оффлайн German

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получить набор выбранных объектов
« Ответ #3 : 16-03-2016, 11:38:24 »
Нужно чтобы выполняемая команда не сбрасывала текущий выбранный пользователем набор.
У команды должны быть флаги CommandFlags.UsePickSet и CommandFlags.Redraw
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Получить набор выбранных объектов
« Ответ #4 : 16-03-2016, 18:29:18 »
Спасибо ребята . Ваши советы помогли решить проблему.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Получить набор выбранных объектов
« Ответ #5 : 16-03-2016, 18:46:38 »
Нужно чтобы выполняемая команда не сбрасывала текущий выбранный пользователем набор.
У команды должны быть флаги CommandFlags.UsePickSet и CommandFlags.Redraw
А зачем CommandFlags.Redraw?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получить набор выбранных объектов
« Ответ #6 : 16-03-2016, 18:57:17 »
А зачем CommandFlags.Redraw?
Этот флаг нужен если ты в своей команде меняешь набор предварительного выбора и хочешь, чтобы после завершения команды он остался таким, как сделала твоя команда. По постановке вопроса я не понял нужно ли менять/оставлять неизменным набор предварительного выбора. Из документации:
Redraw = 4When the pickfirst set or grip set are retrieved, they are not cleared within AutoCAD.
Command can retrieve the pickfirst set and the grip set by using the ads_ssgetfirst function.
Command can retrieve the pickfirst set via ads_ssget("I.").
Command can set both the pickfirst and grip sets using the ads_sssetfirst function. Objects in these sets are redrawn with the proper grip handles and highlighting upon completion of the command.

Мы уже где-то на форуме обсуждали, что в .NET в отличие от ObjectARX (вроде бы) достаточно UsePickSet, но лучше делать по правилам.



Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Получить набор выбранных объектов
« Ответ #7 : 18-03-2016, 20:59:11 »
https://knowledge.autodesk.com/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-NET/files/GUID-D4987D00-1164-4217-A82E-B8B49FFB7A29-htm.html
Вот по это ссылке посмотрел код
Все работает, но в какой-то момент строка с операцией выбора SelectImplied()

 acSSPrompt = acDocEd.SelectImplied()
при проверке
возвращает ошибку
acSSPrompt.Status = Error {-5001}

Чтобы это могло значить?
И соотв. набор объектов не может быть получен.



Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получить набор выбранных объектов
« Ответ #8 : 18-03-2016, 21:35:22 »
Когда набор SelectionSet перестаёт быть нужен не забывай вызывать для него .Dispose(), т.е. всего может быть максимум 127 SelectionSet в AutoCAD (суммарно во всех открытых документах)
Полезный пример: http://spiderinnet1.typepad.com/blog/2012/09/autocad-net-count-limit-of-available-selection-sets.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Получить набор выбранных объектов
« Ответ #9 : 18-03-2016, 23:56:27 »
Саша, спасибо вызов метода Dispose решил мой вопрос!

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Получить набор выбранных объектов
« Ответ #10 : 30-03-2016, 13:42:10 »
Когда набор SelectionSet перестаёт быть нужен не забывай вызывать для него .Dispose()
А как быть с методом Dispose для SelectionSet к примеру в API acad 2010? Этого метода нет.
Ведь метод Dispose опубликован начиная только с версии API acad 2011.
Как высвобождать память для работы c API acad 2010, 2009 и другими...

Я посмотрел пример вот тут

https://msdn.microsoft.com/ru-ru/library/fs2xkftw(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-3

Заключить в оболочку каждый неуправляемый класс.
Может нужно через интерфейс IDisposable сделать 


« Последнее редактирование: 30-03-2016, 21:48:50 от Алексей (IdeaSoft) »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получить набор выбранных объектов
« Ответ #11 : 30-03-2016, 17:48:11 »
Заключить в оболочку каждый неуправляемый класс.
И что это тебе даст? Ничего...
А как быть с методом Dispose для SelectionSet к примеру в API acad 2010? Этого метода нет.
Увы, но никак.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Получить набор выбранных объектов
« Ответ #12 : 30-03-2016, 21:48:23 »
Увы, но никак.
Тогда что же получается, что в более ранних версиях я не высвобождал память под объекты
SelectionSet, а теперь такая возможность появилась. И получается что в ранних версиях AutoCAD API
я мог ограничиваться только 127 экземплярами SelectionSet. Интересно проверить в цикле создать
больше 127 объектов и посмотреть что будет?

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Получить набор выбранных объектов
« Ответ #13 : 30-03-2016, 22:26:18 »
Сделал небольшой тест с Dispose и без него.
В цикле создавал 2000 шт. SelectionSet все норм сработало.
Для примера выборка 1500 примитивов в чертеже.
С методом Dispose ОЗУ acad.exe не меняется
Без метода Dispose ОЗУ acad.exe вырастает на 5-10 МБ
Ограничений 127 объектов SelectionSet не заметил.
Может из-за того что объект SelectionSet объявлен локально внутри подпрограммы, а не глобально?
 
Вот код теста проверял на AutoCAD API 2012
Код - vb.net [Выбрать]
  1. Imports CAD_DBS = Autodesk.AutoCAD.DatabaseServices
  2. Imports CAD_RTM = Autodesk.AutoCAD.Runtime
  3. Imports CAD_EDI = Autodesk.AutoCAD.EditorInput
  4. Imports CAD_APS = Autodesk.AutoCAD.ApplicationServices
  5. <Assembly: CAD_RTM.CommandClass(GetType(cmds.psm_commads))>
  6. Namespace cmds
  7.     Public Class psm_commads
  8.         <CAD_RTM.CommandMethod("PSM_T")> _
  9.         Public Sub test_SelectionSet()
  10.             Dim k As Integer = 0 ' счетчик объектов ss
  11.             Dim cErr As Integer = 0 ' счетчик ошибок
  12.             Dim Doc As CAD_APS.Document = CAD_APS.Application.DocumentManager.MdiActiveDocument
  13.             If Doc Is Nothing Then Exit Sub
  14.             Dim Ed As CAD_EDI.Editor = Doc.Editor
  15.             For i As Integer = 0 To 1999
  16.                 Try
  17.                     Dim ss = Ed.SelectAll().Value
  18.                     If ss IsNot Nothing Then k += 1
  19.                     ss.Dispose()
  20.                 Catch ex As Exception
  21.                     cErr += 1
  22.                 End Try
  23.             Next
  24.             MsgBox("Selection = " & k & "Errors =  " & cErr)
  25.         End Sub
  26.     End Class
  27. End Namespace
  28.  


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Получить набор выбранных объектов
« Ответ #14 : 30-03-2016, 23:10:08 »
Может из-за того что объект SelectionSet объявлен локально внутри подпрограммы, а не глобально?
Возможно срабатывает сборка мусора.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение