Задача состоит в следующем - я указываю точку в трехмерном пространстве и радиус, описывающий сферу вокруг нее. Мне нужно выделить все объекты сцены, у которых хотя-бы одна из вершин попала в эту сферу.
Самый тупой вариант - перебрать все вершины всех объектов, но это долго, нудно и некрасиво. Нет ли более эффективного решения, вроде деревьев поиска или чего-нибудь в том-же ключе, в конце концов, мышкой мы примерно так и выделяем области мышью?
Нет. Вариант вполне нормальный, только, как сказано в описании - это " make a sub-object selection of vertices or faces ", а мне нужны сами объекты (меши), а не их элементы.
Пример:
В новой сцене создаем один объект Sphere и два объекта Teapot.
Перемещаем сферу, чтобы "дотронутся" до объекта Teapot1.
Выделяем сферу. Запускаем скрипт. В новом окне нажимаем кнопку Select.
try(destroyDialog igorznag_test) catch()
rollout igorznag_test "Select"
(
button btn_apply "Select"; on btn_apply pressed do
(
try
(
if selection.count==1 then
(
obj=selection[1]
if classof obj ==sphere and geometry.count>1 then
(
objs_to_select=#()
for g in geometry where g!=obj do
(
vs=volumeselect();vs.level=1;vs.method=1;vs.volume=3;
addmodifier g vs; setCommandPanelTaskMode mode:#modify;
g.modifiers[1].Node=obj; setCommandPanelTaskMode mode:#create;
theMesh = snapshotasmesh g
fs_ba=getVertSelection theMesh; delete theMesh;
if fs_ba.numberSet!=0 then append objs_to_select g
deletemodifier g 1;
)--for g in geometry do
select objs_to_select
)--if classof obj ==sphere and geometry.count>1 then
)--if selection.count==1 then
)catch()
)--on btn_apply pressed do
); createdialog igorznag_test 80 30
Доступ к резюме доступен только по пакетному доступу HR менеджерам зарегистрированных компаний. Узнать о вариантах корпоративных пакетов можно по ссылке.
Erik945
Самый тупой вариант - перебрать все вершины всех объектов, но это долго, нудно и некрасиво. Нет ли более эффективного решения, вроде деревьев поиска или чего-нибудь в том-же ключе, в конце концов, мышкой мы примерно так и выделяем области мышью?
igorznag
Erik945
igorznag
В новой сцене создаем один объект Sphere и два объекта Teapot.
Перемещаем сферу, чтобы "дотронутся" до объекта Teapot1.
Выделяем сферу. Запускаем скрипт. В новом окне нажимаем кнопку Select.
try(destroyDialog igorznag_test) catch() rollout igorznag_test "Select" ( button btn_apply "Select"; on btn_apply pressed do ( try ( if selection.count==1 then ( obj=selection[1] if classof obj ==sphere and geometry.count>1 then ( objs_to_select=#() for g in geometry where g!=obj do ( vs=volumeselect();vs.level=1;vs.method=1;vs.volume=3; addmodifier g vs; setCommandPanelTaskMode mode:#modify; g.modifiers[1].Node=obj; setCommandPanelTaskMode mode:#create; theMesh = snapshotasmesh g fs_ba=getVertSelection theMesh; delete theMesh; if fs_ba.numberSet!=0 then append objs_to_select g deletemodifier g 1; )--for g in geometry do select objs_to_select )--if classof obj ==sphere and geometry.count>1 then )--if selection.count==1 then )catch() )--on btn_apply pressed do ); createdialog igorznag_test 80 30Erik945