Имеет место быть такая проблема. Написал 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 действительно лучше было-бы...
Ладно, плюнул на прогрессбар в свитке, решил сделать внешний 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 действительно лучше было-бы...