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

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 16-03-2016, 10:16:08

Название: Получить набор выбранных объектов
Отправлено: Алексей (IdeaSoft) от 16-03-2016, 10:16:08
Подскажите или дайте ссылку, если этот вопрос уже  обсуждался.
Как получить в SelectionSet набор выбранных на чертеже объектов.
Если я сделаю команду, то выбранный набор объектов сбрасывается.
Нужно чтобы выполняемая команда не сбрасывала текущий выбранный пользователем набор.
Может это делать нужно вообще не по команде, а по событию?


Название: Re: Получить набор выбранных объектов
Отправлено: Александр Пекшев aka Modis от 16-03-2016, 10:21:01
https://knowledge.autodesk.com/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-NET/files/GUID-D4987D00-1164-4217-A82E-B8B49FFB7A29-htm.html
Название: Re: Получить набор выбранных объектов
Отправлено: German от 16-03-2016, 10:34:38
Может это http://adn-cis.org/forum/index.php?topic=1083.msg5247#msg5247?
Название: Re: Получить набор выбранных объектов
Отправлено: Александр Ривилис от 16-03-2016, 11:38:24
Нужно чтобы выполняемая команда не сбрасывала текущий выбранный пользователем набор.
У команды должны быть флаги CommandFlags.UsePickSet и CommandFlags.Redraw
Название: Re: Получить набор выбранных объектов
Отправлено: Алексей (IdeaSoft) от 16-03-2016, 18:29:18
Спасибо ребята . Ваши советы помогли решить проблему.
Название: Re: Получить набор выбранных объектов
Отправлено: Александр Пекшев aka Modis от 16-03-2016, 18:46:38
Нужно чтобы выполняемая команда не сбрасывала текущий выбранный пользователем набор.
У команды должны быть флаги CommandFlags.UsePickSet и CommandFlags.Redraw
А зачем CommandFlags.Redraw?
Название: Re: Получить набор выбранных объектов
Отправлено: Александр Ривилис от 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, но лучше делать по правилам.



Название: Re: Получить набор выбранных объектов
Отправлено: Алексей (IdeaSoft) от 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}

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


Название: Re: Получить набор выбранных объектов
Отправлено: Александр Ривилис от 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
Название: Re: Получить набор выбранных объектов
Отправлено: Алексей (IdeaSoft) от 18-03-2016, 23:56:27
Саша, спасибо вызов метода Dispose решил мой вопрос!
Название: Re: Получить набор выбранных объектов
Отправлено: Алексей (IdeaSoft) от 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 сделать 


Название: Re: Получить набор выбранных объектов
Отправлено: Александр Ривилис от 30-03-2016, 17:48:11
Заключить в оболочку каждый неуправляемый класс.
И что это тебе даст? Ничего...
А как быть с методом Dispose для SelectionSet к примеру в API acad 2010? Этого метода нет.
Увы, но никак.
Название: Re: Получить набор выбранных объектов
Отправлено: Алексей (IdeaSoft) от 30-03-2016, 21:48:23
Увы, но никак.
Тогда что же получается, что в более ранних версиях я не высвобождал память под объекты
SelectionSet, а теперь такая возможность появилась. И получается что в ранних версиях AutoCAD API
я мог ограничиваться только 127 экземплярами SelectionSet. Интересно проверить в цикле создать
больше 127 объектов и посмотреть что будет?
Название: Re: Получить набор выбранных объектов
Отправлено: Алексей (IdeaSoft) от 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.  

Название: Re: Получить набор выбранных объектов
Отправлено: Александр Ривилис от 30-03-2016, 23:10:08
Может из-за того что объект SelectionSet объявлен локально внутри подпрограммы, а не глобально?
Возможно срабатывает сборка мусора.