Форум профессиональных мебельщиков PROMEBELclub

Форум профессиональных мебельщиков PROMEBELclub (https://промебельклуб.рф/forum/index.php)
-   Базис-мебельщик. Скрипты (https://промебельклуб.рф/forum/forumdisplay.php?f=273)
-   -   Скрипт Составной Анимации (https://промебельклуб.рф/forum/showthread.php?t=14935)

Letos 13.10.2019 00:28

Скрипт Составной Анимации
 
Всем доброго времени суток. В 11 версии заработали асинхронные функции. Пара примеров с поворотом камеры и поворотом первого объекта в модели (габаритной рамки по умолчанию):

Поворот камеры

PHP код:

var timers = require('timers');
//var X = 30;
var Model.DS.Camera.AngleY;
function 
Rotate(){
  
//  Model.DS.Camera.AngleX = X;
    
Model.DS.Camera.AngleY Y;
}
const 
inc 0.5;
timers.setInterval(()=>{
    
Rotate();
    
+= inc;
}, 
20);
Action.Continue(); 

[свернуть]

Поворот первого объекта модели


PHP код:

var timers = require('timers');
var 
limits Model.Objects[0];
const 
incAngle 0.5;
timers.setInterval(()=>{
    
Undo.Changing(limits);
    
limits.RotateGCS(AxisYincAngle)
}, 
20);
Action.Continue();
Action.OnFinish = function(){
    
Action.Revert();


[свернуть]

И буквально пару дней назад я наткнулся на то, что не всем хватает стандартной базисной анимации:

Цитата

Цитата:

Сообщение от LeoAN (Сообщение 483556)
Для этого, похоже надо что-то как дерево анимации. В котором будет указано каких вложенных объектов анимация включается, каких с интервалом времени.
За пример возьмем стол, на нем находится корзина с яблоками.
1) Поднимаем стол под угол.
- Настройка анимации: поворот на 60 гр; 2 сек.
2) стол поднялся до угла 15 гр. Корзина с яблоками начала скользить.
- Настройка анимации: сдвиг расстояние х; 1,5 сек. ; 0,5 сек задержка.
3) Корзина соскользнула со стола.
- Настройка анимации: поворот 35 гр (60+35 примерно вертикаль + инерция); время- 1 сек.; Задержка 2 сек.
4) Корзина упала на пол.
- Настройка анимации: сдвиг расстояние у (до пола); время- 1 сек.; Задержка 2 сек.
5) Корзина упала.
- Настройка анимации: поворот; время- 1 сек.; Задержка 3 сек.
6) Яблоки разъезжаются.
- Настройка анимации: сдвиг - z; время- 1 сек.; Задержка 4 сек.
7)Яблоки катятся.
- Настройка анимации: поворот (вокруг своей оси)-1080 гр.; время- 1 сек.; Задержка 4 сек.

Или включение по отдельности.
Как с данной партой.
Парту мы можем регулировать по высоте.
Отрегулировали. Подняли.
Также мы можем регулировать наклон рабочей поверхности.
Т.е. в меню стоит галочка в свойствах анимации - "независимая анимация".

1-й пример - это зависимые процессы;
2-й пример - это независимые процессы.

[свернуть]


И меня осенило - можно же теперь с асинхронными функциями сделать скрипт, который позволит создавать составную анимацию с зависимостями. Учитывая, что создание такого скрипта займёт достаточное количество времени, хотелось бы делать его при наличии большого количества заинтересованных в его применении людей. Я решил создать отдельную тему, потому что обсуждение такого скрипта может затянуться и не хотелось бы засорять ни это обсуждение, ни остальные темы.

Если вы заинтересованы в данном скрипте - оставляйте благодарность к этому сообщению (чтобы мне знать, стоит ли этим вообще заниматься).
Если есть какие-то предложения/дополнения - буду рад обсудить их в этой теме.

Uncle 13.10.2019 12:03

Цитата:

Сообщение от Letos (Сообщение 484053)
Поворот первого объекта модели

При завершении работы скрипта ("Esc" или "Отменить команду") габаритная рамка не возвращается в исходное положение, а остается смещённой на 0,5° относительно оси вращения "Y" :

http://picimage.net/thumbs/15709573775533.png

Letos 13.10.2019 13:57

Цитата:

Сообщение от Uncle (Сообщение 484081)
При завершении работы скрипта ("Esc" или "Отменить команду") габаритная рамка не возвращается в исходное положение, а остается смещённой на 0,5° относительно оси вращения "Y"

Поправил скрипт в шапке.

Uncle 13.10.2019 14:11

Цитата:

Сообщение от Letos (Сообщение 484053)
Если есть какие-то предложения

Как бы для начала...
Возможно ли, используя вышеописанные новые возможности (асинхронность функций), реализовать ситуацию, обсуждаемую в теме с регулируемой партой, откуда, собственно, и была Вами взята цитата в шапке.
Цитата:

Сообщение от Uncle (Сообщение 483527)
В общем, видео...


Letos 21.10.2019 20:09

Цитата:

Сообщение от Uncle (Сообщение 484091)
Как бы для начала...
Возможно ли, используя вышеописанные новые возможности (асинхронность функций), реализовать ситуацию, обсуждаемую в теме с регулируемой партой, откуда, собственно, и была Вами взята цитата в шапке.

Я немного пошарил и оказалось так - идея в моей голове была сумбурна и заморочена (самому реализовывать анимацию), а оказалось всё проще - у блока есть метод AnimateTo(), который принимает числовой параметр от 0 до 1. В связи с чем удалось написать маленький пример по анимации каждого блока по отдельности. При запуске скрипта в свойствах появляется список кнопок с именами блоков. По нажатию на кнопку отрабатывает анимация связанного блока (анимация вложенных не запускается).

Код v1


PHP код:

var blocks = [];

function 
MakeProps() {
    var 
props Action.Properties;
    for (var 
0blocks.lengthi++) {
        var 
block blocks[i];
        var 
props.NewButton(block.Name);
        
b.Tag i;
        
b.OnClick = function (btn) {
            var 
bl blocks[btn.Tag];
            if (
bl._anim)
                
bl.AnimateTo(0);
            else
                
bl.AnimateTo(1);
            
bl._anim = ! bl._anim;
        }
    };
}

/**
 * @param {List3D} list 
 */
function AddToAnimlist(list) {
    var 
anim = list.Animation;
    if (
anim && anim.Duration != 0) {
        
blocks.push(list);
    }
    for (var 
0< list.Counti++) {
        if (list.
Objects[i].List) {
            
AddToAnimlist(list.Objects[i]);
        }
    }
}
AddToAnimlist(Model);
MakeProps()

Action.Continue(); 

[свернуть]


Из-за неиспользования асинхронных функций, работает в ранних версиях БМ. Спешно проверил - работает в 8-11 версиях.

sergio1982 17.03.2020 23:20

Спасибо! Добавил так:

Код:

    for (var i = 0; i < list.Count; i++) {
        if (list.Objects[i].List) {
            AddToAnimlist(list.Objects[i]);

            var bl = list.Objects[i];
            bl.AnimateTo(1);
            bl.AnimateTo(0);
        }
    }

Теперь могу любоваться составной анимацией в БМ8.

Добавлено через 20 минут
https://poster4.radikal.ru/2003/a8/91594877f7cc.jpg

А не подскажете как сделать чтобы запускать анимацию выделенного блока, в идеале конечно просто блока под мышкой?

Letos 18.03.2020 10:22

Цитата:

Сообщение от sergio1982 (Сообщение 492675)
А не подскажете как сделать чтобы запускать анимацию выделенного блока, в идеале конечно просто блока под мышкой?

Объект под курсором можно получить с помощью функции Action.Get3DObject(). Пример с выделением объекта под курсором по клику:
PHP код:

Action.OnClick = function(){
    var 
obj Action.Get3DObject();
    if (
obj){
        
obj.Selected true;
    }


Эта функция не выделяет блоки даже если отключено "Выделение элементов внутри блоков", но у объекта можно посмотреть свойство Owner - блок, в который он вложен. Если это не блок с анимацией, можно посмотреть его Owner и т.д. до нужного блока (либо верхнего уровня - модели).

Ну а выделенный объект получить ещё проще - Model.Selected.

sergio1982 18.03.2020 23:41

Цитата:

можно посмотреть свойство Owner - блок, в который он вложен. Если это не блок с анимацией
В справке к 8ке не нашёл про "AnimateTo" и свойство "_anim".
Вопрос для меня, это - как определить что блок является анимацией?

Letos 19.03.2020 09:17

Цитата:

Сообщение от sergio1982 (Сообщение 492711)
В справке к 8ке не нашёл про "AnimateTo" и свойство "_anim".
Вопрос для меня, это - как определить что блок является анимацией?

про "AnimateTo" нигде не написано, а "_anim" - введённая в скрипте переменная и к Базису отношения не имеет.

Определить, есть ли анимация, можно по свойству AnimationType - оно нулевое, если нет анимации. При анимации поворота возвращает 1, при анимации сдвига возвращает 2.

sergio1982 20.03.2020 14:46

Цитата:

Сообщение от Letos (Сообщение 492724)
про "AnimateTo" нигде не написано

А как же вы это нашли, если не секрет?

Цитата:

Сообщение от Letos (Сообщение 492724)
"_anim" - введённая в скрипте переменная

А, да, пропустил. Не силён в JS.


А как понять что анимация применена.
То есть дверь находится в своём изначальном закрытом состоянии.
Например составной блок, я на одном из элементов нажму среднюю кнопки мыши, он сдвинется, потом применю скрипт выше, и всё поломается.


Текущее время: 13:12. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
© 2007-2023 PROMEBEL