1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

PROGRESS BAR

Тема в разделе "MAXScript", создана пользователем -, 15 апр 2004.

Модераторы: Savin Denis
  1. Guest

    Имеет место быть такая проблема. Написал 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. Guest

    С on ... set ... do я кажется, сам понял. Он вызывается 1 раз при инициализации и потом при изменении параметра через привязанный к нему элемент интерфейса или из самого скрипта. В моем случае изменение сплайна происходит извне и обработчик этот его просто не видит...
    Как же всетаки отвязать параметер от Buildmesh? Чтобы параметр в каких-то условиях можно было изменить, не вызвыв выполнения BuildMesh етого?
    А когда я проверку выделенного объекта в Buildmesh засунул, чтобы если сплайн выделен, ничего не происходило, интересный эффект - если после изменения сплайна кликнуть в любом месте экрана - все тип-топ. Объект обновляется и можно работать дальше. А если после выхода из редактирования сплайна на объект мой кликнуть - слетает макс...
     
  3. Savin Denis vip

    Savin Denis Moderator Команда форума

    С нами с:
    05.05.2005
    Сообщения:
    1.633
    Симпатии:
    0
    Баллы:
    210
    Прогресс бар нормально видится из под Buildmesh
    пиши только полное имя переменной включая и имя Rollout-a

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

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


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

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

Поделиться этой страницей