#include "Animation.h" Animation::Animation(const Handle(V3d_View)& theView, const Handle(AIS_InteractiveContext)& theContext) { _view = theView; _context = theContext; _startState = new Graphic3d_Camera(); _endState = new Graphic3d_Camera(); _viewAnimation = new AIS_AnimationCamera("AIS_ViewCube", _view); _viewAnimation->SetOwnDuration(0.5); } void Animation::SetProjWithAnimation(V3d_TypeOfOrientation orientation) { StartAnimationForProj(orientation); for (; HasAnimation(); ) { UpdateAnimation(true); } } void Animation::StartAnimationForProj(V3d_TypeOfOrientation orientation) { if (!_view.IsNull()) { Initialize(); Handle(Graphic3d_Camera) aBackupCamera = _view->Camera(); const bool wasImmediateUpdate = _view->SetImmediateUpdate(false); _view->SetCamera(_endState); _view->SetProj(orientation, false); _view->SetCamera(aBackupCamera); _view->SetImmediateUpdate(wasImmediateUpdate); ViewFitAll(_endState); ViewAnimationSettings(); } } void Animation::Initialize() { _startState->Copy(_view->Camera()); _endState->Copy(_view->Camera()); } void Animation::ViewAnimationSettings() { _viewAnimation->SetView(_view); _viewAnimation->SetCameraStart(_startState); _viewAnimation->SetCameraEnd(_endState); _viewAnimation->StartTimer(0.0, 1, true, false); } Standard_Boolean Animation::ShouldUpdateAnimation() { const Standard_Real aPts = _viewAnimation->UpdateTimer(); if (aPts >= _viewAnimation->OwnDuration()) { _viewAnimation->Stop(); _viewAnimation->SetView(Handle(V3d_View)()); return Standard_False; } return Standard_True; } Standard_Boolean Animation::UpdateAnimation(const Standard_Boolean theToUpdate) { Handle(V3d_View) aView = _viewAnimation->View(); if (!HasAnimation() || !ShouldUpdateAnimation()) { return Standard_False; } if (theToUpdate && !aView.IsNull()) { aView->IsInvalidated() ? aView->Redraw() : aView->RedrawImmediate(); } return Standard_True; } Standard_Boolean Animation::HasAnimation() { return !_viewAnimation->IsStopped(); } void Animation::ViewFitAll(const Handle(Graphic3d_Camera)& theCamera) { Bnd_Box aBndBox = _context->BoundingBoxOfSelection(); if (aBndBox.IsVoid()) { aBndBox = _view->View()->MinMaxValues(); } if (!aBndBox.IsVoid()) { _view->FitMinMax(theCamera, aBndBox, 0.01, 10.0 * Precision::Confusion()); } }