{%hackmd theme-dark %} Настройка фильтров для Selection Set === ###### tags: `AutoCAD` ### Добавление объектов в Selection Set: ```python= object.select(mode,point1,point2,FilterType,FilterData) <Объектом (object) является selection set (SelSet)> ``` ### Расшифровка параметров: * `mode`, `point1`, `point2` - определяют область выделения объектов в чертеже. :::spoiler Подробнее о параметрах 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` - задают параметры фильтра, который применяется к выбранным объектам. Данные параметры опциональны. :::spoiler Подробнее о параметрах 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.Задаем границы области выделения, фильтр по типу объекта (кружочек): ```python= 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. Выделение всех блоков чертежа, фильтр по имени блока: ```python= 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 ```