{%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
```