Try   HackMD

Настройка фильтров для Selection Set

tags: AutoCAD

Добавление объектов в Selection Set:

object.select(mode,point1,point2,FilterType,FilterData) <Объектом (object) является selection set (SelSet)>

Расшифровка параметров:

  • mode, point1, point2 - определяют область выделения объектов в чертеже.

    Подробнее о параметрах
    1. point1, point2 - координаты, определяющие границы области выделения объектов [x,y,z]. Данные параметры опциональны;
    2. Значения параметра mode и описание:
      1 - выбирает все объекты, полностью входящие в прямоугольную область;
      2 - выбирает все объекты, полностью входящие в прямоугольную область, а также пересекающие ее границы;
      3 - выбирает последний сохраненный в памяти SelSet. Не работает, если перед вызовом метода было переключение между ModelSpace и PaperSpace. Параметры point1 и point2 передаются как None;
      4 - выбирает последние созданные видимые объекты. Параметры point1 и point2 передаются как None;
      5 - выбирает все объекты чертежа. Параметры point1 и point2 передаются как None;
  • FilterType, FilterData - задают параметры фильтра, который применяется к выбранным объектам. Данные параметры опциональны.

    Подробнее о параметрах
    1. FilterType - явлеятеся кодом DXF, определяет свойство, по которому будут фильтроваться объекты. Ниже таблица частоиспользуемых свойств фильтра:

      DXF code Filter type
      0 Object type (String) e.g.: "Line", "Circle", "Arc" etc
      2 Block Name (String)
      8 Layer Name (String)
      60 Object Visibility (Integer) e.g.: 0 = visible, 1 - invisible
      62 Color Number (Integer) e.g.: 0-BYBLOCK, 256 - BYLAYER
      67 Model/Paper space indicator e.g.: 0 - model space, 1 - paper space
    2. FilterData - определяет значение свойства, по которому работает фильтр. Тип данных зависит от выбранного свойства FilterType, прим. в таблице выше.

Примеры кода для Python

Пример 1.Задаем границы области выделения, фильтр по типу объекта (кружочек):

import win32com.client from pythoncom import VT_R8, VT_ARRAY, VT_I2, VT_VARIANT app = win32com.client.Dispatch("AutoCAD.Application") doc = app.ActiveDocument ''' Запрашиваем у пользователя границы области выбора объектов ''' doc.Utility.Prompt('первая точка давай') coord1 = doc.Utility.GetPoint() doc.Utility.Prompt('вторая точка давай') coord2 = doc.Utility.GetPoint() print(coord1, coord2) ''' готовим координаты к отправке в AutoCad. Координаты передаются как 8-байтный real ''' point1 = win32com.client.VARIANT(VT_ARRAY | VT_R8, coord1) point2 = win32com.client.VARIANT(VT_ARRAY | VT_R8, coord2) try: sel_set = doc.SelectionSets.Add('piece_of_sheet') '''DXF код передается в AutoCad как 2-байтный integer''' FilterType = win32com.client.VARIANT(VT_ARRAY | VT_I2, [0]) '''Строка передается как var. знать бы что это''' FilterData = win32com.client.VARIANT(VT_ARRAY | VT_VARIANT, ['Circle']) sel_set.Select(1, point1, point2, FilterType, FilterData) '''Выделяет объекты в чертеже для наглядного примера''' sel_set.Highlight(True) finally: sel_set.Delete()

Пример 2. Выделение всех блоков чертежа, фильтр по имени блока:

from pythoncom import VT_R8, VT_ARRAY, VT_I2, VT_VARIANT import win32com.client app = win32com.client.Dispatch("AutoCAD.Application") doc = app.ActiveDocument def filtered_block_set(set_name, block_name): """ set_name - str block_name - str """ sel_set = doc.SelectionSets.Add(set_name) FilterType = win32com.client.VARIANT(VT_ARRAY | VT_I2, [2]) FilterData = win32com.client.VARIANT(VT_ARRAY | VT_VARIANT, [block_name]) sel_set.Select(5, None, None, FilterType, FilterData) return sel_set