Render.ru

PROGRESS BAR

#1
Имеет место быть такая проблема. Написал SimpeObject scripted plugin, в нем заложена возможность построения объекта вдоль сплайна, как в AEC Railung из шестого макса. Скрипт довольно большой и сложный, если сплайн для пути выбран достаточно длинный, объект строится долговато, около минуты на моем 900 целероне. Это, в принципе, ничего, только очень не хотелось пугать пользователя "зависшим" максом. Решил забацат Progress Bar в одном из свитков (на панели create). Натолкнулся на первую проблему - процент выполнения должен считаться, естественно, в теле обработчика On Buildmesh Do, где само длительное построение объекта и происходит, а обратиться оттуда к элементу интерфейса мне не удалось - его имя воспринимается как неописанная переменная. Из rollaut конечно, доступ к счетчику есть (по <progressbar>.value), но процент выполнения там не посчитаешь...
Ладно, плюнул на прогрессбар в свитке, решил сделать внешний Progress Bar Display (на панели состояния). Результат ошеломил просто - все проиходить стало быстрее на порядок, хотя я и Undo выключал в Buildmesh, и обновление экрана, и flagForeground true для самого объекта выставлял... Видимо, Макс когда с Progress Bar Display работает, отвлекается от своих раздумий внутренних каких-то и ведет себя бодрее на порядок. Радости предела не было... Пока не обнаружил что при попытке отредактировать сплайн, который назначен моему объекту в качестве пути, макс входит в бесконечный цыкл обновления объекта к пути привязанного (с этим спайном по Pickbutton связанно значение одной переменной в Parameters, так что при измении спайна объект естественным образом обнавляется, но если раньше он хоть и рывками, с задержками, позвалял точки в спайне подвигать, то теперь при выделении сплайна и переключении на панель модифай он сразу начинает обновляться по кругу, хотя я еще не то чтобы точку выделить - дотронуться до него не успел). Естественно, в теле ON Buildmesh обращений к переменным, которые заданы в параметрах и вызывают обновление объекта, нет. Ни чего не меняю, убираю только все progressStart/Update/End (все что связанно с Progress Bar Display) - снова все работает. Такое ощущение, что Progress Bar Display обновляет непрерывно панель Modify, ее обновление обновляет открытый в ней спайн, а он в свою очередь - мой объект...
Итак, вопрос первый
1) почему при переходе к панели Create при выделенном сплайне пути Progress Bar Display загоняет скрипт в бесконечный цикл и как с этим бороться?

Далее попытался с этим бороться, ввел новую переменную OkToRebuild, значение которой проверялось в начале BuildMesh и при определеноом значении этой переменной ничего в теле обработчика не выполнялось. Это позволило избежать некоторых лишних выполнений Buildmesh (когда при изменении способа создания объекта изменялись некоторые параметры). В блоке параметров поставил связанный с переменной (хранящей сплайн пути) обработчик on PTHOBJ set VAL do, в котором задавалось значение той переменной, которая определяет выполняется ли что-либо в Buidmesh. Таким образом я думал избежать ненужным обновлений объекта при обращению к сплайну. Но оказалось, что значение этой переменной (управляющей Buildmesh) задается по on PTHOBJ set VAL do только при первом обращении к этому параметру, а при дальнейших обращениях ничего не происходит. Когда я задавал значение переменной из других мест, все срабатывало. Но мне нужно отключить обновление объекта именно при обращении к сплайну и связанной с ним переменной PTHOBJ... Вопрос второй:
2) Как вообще работает обработчик on ... set ... do? Не может же он только один раз срабатывать! Что я сделал неправильно:

parameters Fencing type:#bowtop rollout:Fencing
(
PTHOBJ type: #node ui: PTH
on PTHOBJ set Val do OkToRebuild = false
)

Изменил тактику. Учитывая, что когда я пытаюсь изменить спайн пути, у меня во вьюпорте выделен, естественно, именно сплайн, а не сам объект, поставил в BuildMesh проверку типа выделенного обекта. Если сплайн - ничего не выполняется. Почти сработало:) Бесконечный цикл при обращении к сплайну из панели модифай прекратился, появилась возможность изменить сплайн. Но после изменения сплайна и выделения самго моего объекта он обнавляется (это как и было задумано) и... Макс вылетает!
3) Почему при пропуске выполнения содержимого Buildmesh при изменившемся параметре, при последующем выполнении Buildmesh Макс вылетает?

Решил вообще отвязать злощастный сплайн от параметра - чтобы избежать обновлний обекта при обращениях к сплайну. Ввел кнопку Update по которой обновление после изменения сплайна можно было произвести вручную. Сам сплайн связал c persistent global переменной, из расчета что она будет сохраняться в файл вместе с объектом и при загрузке сцены связь объекта и пути сохраниться, а обновлений обекта при обращении к ней происходить не будет. Все заработало как часы. Пока я не сохранил сцену - при загрузке мой объект, привязанный к сплайну, почему-то не хочет выделяться - все выделяется, а его будто вообще нет, хотя он во вьюпорте и виден. Выделяется он только если его весь обвести регионом - после этого начинает себя вести прилично. А самое гадкое, что новые объекты начинают создаваться по образу и подобию уже существующего, а не прямые!!! Это я как раз понял потом - если параметр сохраняется для каждого экземпляра объекта отдельно, то persistent global одна на всех. Не понимаю только одного - как мне быть. Если в обработчике on create do обнулить эту persistent global, новые обекты рисуются правильно, а старые рушатся. Тоже не катит... И последний вопрос:
4) Что бы мне еще придумать!!!

Люди!!! Помогите чем можете! Я сдуру успел не разобравшись вариант скрипта с Progress Bar заказчику показать, он теперь без него жить не может. А ведь работало все, хоть и медленно - возникало ощущение, что макс висит... Честно говоря, с Progress Bar действительно лучше было-бы...
 
#2
С on ... set ... do я кажется, сам понял. Он вызывается 1 раз при инициализации и потом при изменении параметра через привязанный к нему элемент интерфейса или из самого скрипта. В моем случае изменение сплайна происходит извне и обработчик этот его просто не видит...
Как же всетаки отвязать параметер от Buildmesh? Чтобы параметр в каких-то условиях можно было изменить, не вызвыв выполнения BuildMesh етого?
А когда я проверку выделенного объекта в Buildmesh засунул, чтобы если сплайн выделен, ничего не происходило, интересный эффект - если после изменения сплайна кликнуть в любом месте экрана - все тип-топ. Объект обновляется и можно работать дальше. А если после выхода из редактирования сплайна на объект мой кликнуть - слетает макс...
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#3
Прогресс бар нормально видится из под Buildmesh
пиши только полное имя переменной включая и имя Rollout-a

1)Почему при переходе к панели Create при выделенном сплайне пути Progress Bar Display загоняет скрипт в бесконечный цикл и как с этим бороться?

Сказать то почему не трудно, повидимому команда progressStart
зачемто падает запрос на обновление геометрии
потому сразу после выхода из Buildmesh
он снова вызавается.
Была идейка в первом вызове Buildmesh
только вызвать progressStart
а седующем за ним (который и провацирует progressStart)
считать геометрию и закрывать progressBar
но у меня это подвешивает макс. так что не судьба.
А если и есть в скрипте метод запрещаюший на прямую обновлять геометрию то мне на глаза не попался.


>3) Почему при пропуске выполнения содержимого Buildmesh при изменившемся параметре, при последующем выполнении Buildmesh Макс вылетает?

Пустой Buildmesh работает вроде нормально значит
навено что-то не так с твоими хитрыми событиями
 
Сверху