5.3.2. Выбор объектов в чертеже

Источник здесь.[переводчик bandero]; [перевод не проверен]

    Вы можете выбрать объекты через пользовательский интерактивный выбор, либо можете имитировать множество вариантов опций выбора объектов через .NET API. Если в вашей программе  выполняется множество наборов, то вам нужно или отслеживать каждый возвращенный набор или создать объект ObjectIdCollection для отслеживания всех выбранных наборов. Следующие функции позволяют вам выбрать объекты на чертеже:

    • GetSelection  - запрос у пользователя выбрать объекты на чертеже
    • SelectAll – выбор всех объектов в текущем пространстве, которые не выключены или заблокированы.
    • SelectCrossingPolygon – выбор объектов внутри и на пересечении полигона определенного по заданным точкам. Полигон может быть любой формы, но без пересечений и соприкосновений.
    • SelectCrossingWindow – выбор объектов внутри и на пересечении области определенной по двум точкам.
    • SelectFence – выбор всех объектов пересекающих линию выбора. Линия выбора похожа на выбор секущей рамкой (CrossingPolygon), только линия выбора не замкнута, и может пересекатся.
    • SelectLast – выбор последнего созданного объекта в текущем пространстве.
    • SelectPrevious – выбор объектов  выбранных после последнего запроса выбора.
    • SelectWindow – выбор всех объектов полностью попадающих в прямоугольник определяемый двумя точками
    • SelectWindowPolygon – выбор объектов полностью попадающих в полигон определенный точками. Полигон может быть любой формы, но без пересеченй и соприкосновений.
    • SelectAtPoint – выбор объектов проходящих через данную точку и добавление их в активный набор1,2,3.
    • SelectByPolygon – выбор объектов линией выбора и добавление их в активный набор1,3.
1 - прим. Андрея Бушмана: в .Net API AutoCAD такого метода не существует.
2 - прим. Андрея Бушмана: вместо него нужно использовать метод GetNestedEntity (не перечислен выше, но тем не менее присутствует).
3 - прим. Александра Ривилиса: эти методы из COM/ActiveX.

Запрос объектов на экране и итерация по набору

    В этом примере выполняется запрос пользователю на выбор объектов, потом изменяется цвет каждого выбранного объекта на Зеленый или цветовой индекс AutoCAD равный 3.

Код VB.NET

   1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices
   4:  Imports Autodesk.AutoCAD.EditorInput 
   5:   
   6:  <CommandMethod("SelectObjectsOnscreen")> _
   7:  Public Sub SelectObjectsOnscreen()
   8:   
   9:    '' Получение текущего документа и базы данных
  10:    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
  11:    Dim acCurDb As Database = acDoc.Database 
  12:   
  13:    '' Старт транзакции
  14:    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() 
  15:   
  16:        '' Запрос выбора объектов в области чертежа
  17:        Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection() 
  18:   
  19:        '' Если статус запроса равен OK, объекты выбраны
  20:        If acSSPrompt.Status = PromptStatus.OK Then
  21:            Dim acSSet As SelectionSet = acSSPrompt.Value 
  22:   
  23:            '' Перебор объектов в наборе
  24:            For Each acSSObj As SelectedObject In acSSet
  25:                '' Проверка, нужно убедится в правильности полученного объекта
  26:                If Not IsDBNull(acSSObj) Then
  27:                    '' Открытие объекта для записи
  28:                    Dim acEnt As Entity = acTrans.GetObject(acSSObj.ObjectId, _
  29:                                                            OpenMode.ForWrite)
  30:                    If Not IsDBNull(acEnt) Then
  31:                        '' Изменение цвета объекта на Зеленый
  32:                        acEnt.ColorIndex = 3
  33:                    End If
  34:                End If
  35:            Next
  36:   
  37:            '' Сохранение нового объекта в базе данных
  38:            acTrans.Commit()
  39:        End If 
  40:   
  41:        '' Очистка транзакции
  42:    End Using
  43:  End Sub 

Код C#

1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices;
   4:  using Autodesk.AutoCAD.EditorInput; 
   5:   
   6:  [CommandMethod("SelectObjectsOnscreen")]
   7:  public static void SelectObjectsOnscreen()
   8:  {
   9:    // Получение текущего документа и базы данных
  10:    Document acDoc = Application.DocumentManager.MdiActiveDocument;
  11:    Database acCurDb = acDoc.Database; 
  12:   
  13:    // Старт транзакции
  14:    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  15:    {
  16:        // Запрос выбора объектов в области чертежа
  17:        PromptSelectionResult acSSPrompt = acDoc.Editor.GetSelection(); 
  18:   
  19:        // Если статус запроса равен OK, объекты выбраны
  20:        if (acSSPrompt.Status == PromptStatus.OK)
  21:        {
  22:            SelectionSet acSSet = acSSPrompt.Value; 
  23:   
  24:            // Перебор объектов в наборе
  25:            foreach (SelectedObject acSSObj in acSSet)
  26:            {
  27:                // Проверка, нужно убедится в правильности полученного объекта
  28:                if (acSSObj != null)
  29:                {
  30:                    // Открытие объекта для записи
  31:                    Entity acEnt = acTrans.GetObject(acSSObj.ObjectId,
  32:                                                     OpenMode.ForWrite) as Entity;
  33:                    if (acEnt != null)
  34:                    {
  35:                        // Изменение цвета объекта на Зеленый
  36:                        acEnt.ColorIndex = 3;
  37:                    }
  38:                }
  39:            } 
  40:   
  41:            // Сохранение нового объекта в базе данных
  42:            acTrans.Commit();
  43:        } 
  44:   
  45:        // Очистка транзакции
  46:    }
  47:  }

Код VBA/ActiveX

1:  Sub SelectObjectsOnscreen()
   2:   
   3:      ' Создание нового набора
   4:      Dim sset As AcadSelectionSet
   5:      Set sset = ThisDrawing.SelectionSets.Add("SS1") 
   6:   
   7:      ' Запрос пользователю выбрать объекты
   8:      '  и добаволение их в набор
   9:      sset.SelectOnScreen
  10:      Dim acEnt As AcadEntity 
  11:   
  12:      ' Перебор выбранных объектов и изменение цвета на зеленый
  13:      For Each acEnt In sset
  14:          ' Использование свойства Цвета для установки цвета объекту
  15:          acEnt.color = acGreen
  16:      Next acEnt 
  17:   
  18:      ' Удаление набора
  19:      sset.Delete
  20:  End Sub

Выбор объектов с помощью секущей рамки (crossing window )

    В этом примере объекты выбираются внутри и на пересечении секущей рамки.

Код VB.NET

1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices
   4:  Imports Autodesk.AutoCAD.Geometry
   5:  Imports Autodesk.AutoCAD.EditorInput 
   6:   
   7:  <CommandMethod("SelectObjectsByCrossingWindow")> _
   8:  Public Sub SelectObjectsByCrossingWindow()
   9:   
  10:    '' Получение редактора (Editor) текущего документа
  11:    Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor 
  12:   
  13:    '' Создание секущей рамки от (2,2,0) до (10,8,0)
  14:    Dim acSSPrompt As PromptSelectionResult
  15:    acSSPrompt = acDocEd.SelectCrossingWindow(New Point3d(2, 2, 0), _
  16:                                              New Point3d(10, 8, 0)) 
  17:   
  18:    '' Если статус запроса равен OK, объекты выбраны
  19:    If acSSPrompt.Status = PromptStatus.OK Then
  20:        Dim acSSet As SelectionSet = acSSPrompt.Value
  21:        Application.ShowAlertDialog("Количество выбранных объектов:  " & _
  22:                                    acSSet.Count.ToString())
  23:    Else
  24:        Application.ShowAlertDialog("Количество выбранных объектов: 0")
  25:    End If
  26:  End Sub

Код C#

1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices;
   4:  using Autodesk.AutoCAD.Geometry;
   5:  using Autodesk.AutoCAD.EditorInput; 
   6:   
   7:  [CommandMethod("SelectObjectsByCrossingWindow")]
   8:  public static void SelectObjectsByCrossingWindow()
   9:  {
  10:    // Получение редактора (Editor) текущего документа
  11:    Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor; 
  12:   
  13:    // Создание секущей рамки от (2,2,0) до (10,8,0)
  14:    PromptSelectionResult acSSPrompt;
  15:    acSSPrompt = acDocEd.SelectCrossingWindow(new Point3d(2, 2, 0),
  16:                                              new Point3d(10, 8, 0));
  17:   
  18:    // Если статус запроса равен OK, объекты выбраны
  19:    if (acSSPrompt.Status == PromptStatus.OK)
  20:    {
  21:        SelectionSet acSSet = acSSPrompt.Value;
  22:        Application.ShowAlertDialog("Количество выбранных объектов: " +
  23:                                    acSSet.Count.ToString());
  24:    }
  25:    else
  26:    {
  27:        Application.ShowAlertDialog("Количество выбранных объектов: 0");
  28:    }
  29:  }

Код VBA/ActiveX

1:  Sub SelectObjectsByCrossingWindow()
   2:      ' Создание нового набора
   3:      Dim sset As AcadSelectionSet
   4:      Set sset = ThisDrawing.SelectionSets.Add("SS1") 
   5:   
   6:      ' Определение точек для секущей рамки
   7:      Dim pt1(0 To 2) As Double
   8:      Dim pt2(0 To 2) As Double
   9:      pt1(0) = 2#: pt1(1) = 2#: pt1(2) = 0#:
  10:      pt2(0) = 10#: pt2(1) = 8#: pt2(2) = 0#: 
  11:   
  12:      ' Создание секущей рамки от(2,2,0) до (10,8,0)
  13:      sset.Select acSelectionSetCrossing, pt1, pt2 
  14:   
  15:      MsgBox "Количество выбранных объектов: " & sset.Count 
  16:   
  17:      ' Удаление набора
  18:      sset.Delete
  19:  End Sub

Comments