Выбор объектов
В K3 можно осуществлять выбор одного (и только одного) объекта либо выбор нескольких объектов. Очевидно, что выбор одного объекта может быть частным случаем выбора нескольких объектов, а может осуществляться отдельной командой — objident.
Выбор нескольких объектов может выполняться с фильтром и без фильтра. Фильтр может быть по типу объекта (линия, дуга и пр. — см. Работа с фильтрами) и по атрибутам.
select [prompt <Prompt>] [stayblink] [partly|wholly] [done] <Objects>
Команда select осуществляет выбор объектов <Objects> и помещает их в список выбранных. Необязательный ключ prompt <Prompt> задает подсказку выбора объектов. Получить объект из списка выбранных можно, например, с помощью функции GetSelNum. Необязательный ключ stayblink позволяет оставить выделение выбранных объектов по завершению команды select. Команда select сбрасывает выделение ранее выбранных объектов.
Необязательный ключ done позволяет отказаться от выбора объектов без завершения макропрограммы. Нажатие клавиши Esc позволяет отказаться от выбора объектов с завершением макропрограммы.
Примеры:
// Выбор всех объектов сцены
select all done;
// Удаление первого объекта из списка выбранных
delete getselnum(1) done;
// Просим указать объект сцены
objident prompt "Укажите объект сцены" : plg;
// Выбираем его и подсвечиваем
select stayblink plg done ;
// Выбрать мебельные объекты исключая длинномеры
select wholly attribute "ObjType<3" remove attribute "LongsType>-999" done ;
//-- Выбираем только те объекты, которые имеют атрибут FurnType
select partly attribute "IsAssign(\"FurnType\")" done;
sysv=sysvar(61); //-- Общее количество выбранных объектов c FurnType в сцене
selbyattr <Filter> [prompt <Prompt>] [stayblink] [wholly|partly|child] <Objects>
Команда selbyattr позволяет пользователю указывать (выбирать) только те объекты <Objects> сцены, атрибуты которых удовлетворяют условию, записанному в текстовой строке <Filter>, и помещает их в список выбранных. Получить объект из списка выбранных можно, например, с помощью функции GetSelNum. Необязательный ключ prompt <Prompt> задает подсказку выбора объектов. Ключи wholly и partly позволяют осуществлять выбор только среди объектов верхнего уровня (wholly) или выбирать объекты максимального уровня, удовлетворяющие условию <Filter> (partly). Если ключ явно не задан, то считается заданным ключ wholly. Необязательный ключ stayblink позволяет оставить выделение выбранных объектов по завершению команды selbyattr.
Если задан ключ child, то в список выбранных попадут все объекты, удовлетворяющие условию <Filter>, родителями которых являются объекты <Objects>. Если условию удовлетворяют сами объекты <Objects>, то они так же попадут в список выбранных. В список выбранных попадают объекты, минимального уровня вложенности. То есть, если объект типа «Группа» удовлетворяет условию и объекты, входящие в эту группу так же удовлетворяют условию, то в списке выбранных будет только объект «Группа».
Примеры:
//Выбор всех объектов, у которых атрибут "Posit" равен 10
selbyattr "Posit==10" all done;
В качестве фильтра в команде SelByAttr можно использовать функцию InList. Это бывает особенно актуально, когда строка фильтра в обычном варианте может превысить 255 символов.
Допустим нам требуется выбрать вложенные в группы распашные двери и различные типы ящиков. Выбор осуществляем фильтруя по значению атрибута FurnType
В обычном варианте это может выглядеть так:
SelByAttr "FurnType==\"230100\"||FurnType==\"310500\"||FurnType==\"310100\"||FurnType==\"310400\"||FurnType==\"310300\")" partly :
В случае с InList фильтр гораздо короче:
SelByAttr "InList(FurnType,\"230100\",\"310500\",\"310100\",\"310400\",\"310300\")" partly :
тот же выбор, но в случае использования в коде на языке Python.
k3.selbyattr('InList(FurnType,"230100","310500","310100","310400","310300","310200","310600","310310","310410")', k3.k_partly, k3.k_interact)
Aльтернатива прямому указанию фильтра в команде - использовать генератор строки из списка. Это может быть полезным если selbyattr использован в теле функции, а список значений передаётся в качестве аргумента функции
combined_attr_values=[
'230100',
'310500',
'310100',
'310400',
'310300',]
result_string = "InList(FurnType,{})".format(','.join(chr(34) + elem + chr(34) for elem in combined_attr_values))
print(result_string)
k3.selbyattr(result_string, k3.k_partly, k3.k_interact)
sysv=sysvar(61); //-- Общее количество выбранных объектов c указанными FurnType в сцене
9 строка с печатью result_string выведет на экран следующую строку.
На языке Python с помощью генератора списка и метода join для строк можно создать строку фильтра на основе списка.
InList(FurnType,"230100","310500","310100","310400","310300")