-// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-#include "OCCViewer_ClippingDlg.h"
-
-#include <QtxDoubleSpinBox.h>
-#include <QtxDoubleSpinSlider.h>
-#include <QtxIntSpinSlider.h>
-#include <QtxAction.h>
-
-#include "SUIT_Session.h"
-#include "SUIT_ViewWindow.h"
-#include "SUIT_ViewManager.h"
-#include "OCCViewer_ClipPlane.h"
-#include "OCCViewer_ViewWindow.h"
-#include "OCCViewer_ViewPort3d.h"
-#include "OCCViewer_ViewModel.h"
-#include "OCCViewer_ViewManager.h"
-#include "OCCViewer_ClipPlaneInteractor.h"
-
-#include <V3d_View.hxx>
-#include <Visual3d_View.hxx>
-#include <Geom_Plane.hxx>
-#include <Prs3d_Presentation.hxx>
-#include <AIS_ListIteratorOfListOfInteractive.hxx>
-#include <AIS_ListOfInteractive.hxx>
-#include <AIS_InteractiveObject.hxx>
-#include <AIS_InteractiveContext.hxx>
-#include <IntAna_IntConicQuad.hxx>
-#include <gp_Lin.hxx>
-#include <gp_Pln.hxx>
-#include <math.h>
-
-// QT Includes
-#include <QApplication>
-#include <QGroupBox>
-#include <QHBoxLayout>
-#include <QVBoxLayout>
-#include <QGridLayout>
-#include <QLabel>
-#include <QPushButton>
-#include <QComboBox>
-#include <QCheckBox>
-#include <QStackedLayout>
-#include <QSlider>
-#include <QMenu>
-
-/**********************************************************************************
- ************************ Internal functions ************************
- *********************************************************************************/
-
-void getMinMaxFromContext( Handle(AIS_InteractiveContext) ic,
- double theDefaultSize,
- double& theXMin,
- double& theYMin,
- double& theZMin,
- double& theXMax,
- double& theYMax,
- double& theZMax) {
-
- double aXMin, aYMin, aZMin, aXMax, aYMax, aZMax;
- aXMin = aYMin = aZMin = DBL_MAX;
- aXMax = aYMax = aZMax = -DBL_MAX;
-
- bool isFound = false;
- AIS_ListOfInteractive aList;
- ic->DisplayedObjects( aList );
- for ( AIS_ListIteratorOfListOfInteractive it( aList ); it.More(); it.Next() ) {
- Handle(AIS_InteractiveObject) anObj = it.Value();
- if ( !anObj.IsNull() && anObj->HasPresentation() &&
- !anObj->IsKind( STANDARD_TYPE(AIS_Plane) ) ) {
- Handle(Prs3d_Presentation) aPrs = anObj->Presentation();
- if ( !aPrs->IsEmpty() && !aPrs->IsInfinite() ) {
- isFound = true;
- double xmin, ymin, zmin, xmax, ymax, zmax;
- aPrs->MinMaxValues( xmin, ymin, zmin, xmax, ymax, zmax );
- aXMin = qMin( aXMin, xmin ); aXMax = qMax( aXMax, xmax );
- aYMin = qMin( aYMin, ymin ); aYMax = qMax( aYMax, ymax );
- aZMin = qMin( aZMin, zmin ); aZMax = qMax( aZMax, zmax );
- }
- }
- }
-
- if(!isFound) {
- if(theDefaultSize == 0.0)
- theDefaultSize = 100.;
- aXMin = aYMin = aZMin = -theDefaultSize;
- aXMax = aYMax = aZMax = theDefaultSize;
- }
- theXMin = aXMin;theYMin = aYMin;theZMin = aZMin;
- theXMax = aXMax;theYMax = aYMax;theZMax = aZMax;
-}
-
-/*!
- Compute the point of bounding box and current clipping plane
- */
-void ComputeBoundsParam( double theBounds[6],
- double theDirection[3],
- double theMinPnt[3],
- double& theMaxBoundPrj,
- double& theMinBoundPrj )
-{
- //Enlarge bounds in order to avoid conflicts of precision
- for(int i = 0; i < 6; i += 2) {
- static double EPS = 1.0E-3;
- double aDelta = (theBounds[i+1] - theBounds[i])*EPS;
- theBounds[i] -= aDelta;
- theBounds[i+1] += aDelta;
- }
-
- double aBoundPoints[8][3] = { { theBounds[0], theBounds[2], theBounds[4] },
- { theBounds[1], theBounds[2], theBounds[4] },
- { theBounds[0], theBounds[3], theBounds[4] },
- { theBounds[1], theBounds[3], theBounds[4] },
- { theBounds[0], theBounds[2], theBounds[5] },
- { theBounds[1], theBounds[2], theBounds[5] },
- { theBounds[0], theBounds[3], theBounds[5] },
- { theBounds[1], theBounds[3], theBounds[5] } };
-
- int aMaxId = 0;
- theMaxBoundPrj = theDirection[0] * aBoundPoints[aMaxId][0] + theDirection[1] * aBoundPoints[aMaxId][1]
- + theDirection[2] * aBoundPoints[aMaxId][2];
- theMinBoundPrj = theMaxBoundPrj;
- for(int i = 1; i < 8; i++) {
- double aTmp = theDirection[0] * aBoundPoints[i][0] + theDirection[1] * aBoundPoints[i][1]
- + theDirection[2] * aBoundPoints[i][2];
- if(theMaxBoundPrj < aTmp) {
- theMaxBoundPrj = aTmp;
- aMaxId = i;
- }
- if(theMinBoundPrj > aTmp) {
- theMinBoundPrj = aTmp;
- }
- }
- double *aMinPnt = aBoundPoints[aMaxId];
- theMinPnt[0] = aMinPnt[0];
- theMinPnt[1] = aMinPnt[1];
- theMinPnt[2] = aMinPnt[2];
-}
-
-/*!
- Compute the position of current plane by distance
- */
-void DistanceToPosition( double theBounds[6],
- double theDirection[3],
- double theDist,
- double thePos[3] )
-{
- double aMaxBoundPrj, aMinBoundPrj, aMinPnt[3];
- ComputeBoundsParam( theBounds,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj );
- double aLength = (aMaxBoundPrj - aMinBoundPrj)*theDist;
- thePos[0] = aMinPnt[0] - theDirection[0]*aLength;
- thePos[1] = aMinPnt[1] - theDirection[1]*aLength;
- thePos[2] = aMinPnt[2] - theDirection[2]*aLength;
-}
-
-/*!
- Compute the parameters of clipping plane
- */
-bool ComputeClippingPlaneParameters( double theNormal[3],
- double theDist,
- double theOrigin[3],
- Handle(AIS_InteractiveContext) ic,
- double theDefaultSize)
-{
- double aBounds[6] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
- getMinMaxFromContext(ic,theDefaultSize,aBounds[0], aBounds[2], aBounds[4], aBounds[1], aBounds[3], aBounds[5]);
-
- DistanceToPosition( aBounds, theNormal, theDist, theOrigin );
- return true;
-}
-
-/*!
- Cross product of two 3-vectors. Result vector in result[3].
- */
-void Cross(const double first[3], const double second[3], double result[3])
-{
- result[0] = first[1]*second[2] - first[2]*second[1];
- result[1] = first[2]*second[0] - first[0]*second[2];
- result[2] = first[0]*second[1] - first[1]*second[0];
-}
-
-/*!
- Compute relative clipping plane in absolute coordinates
- */
-void relativePlaneToAbsolute (OCCViewer_ClipPlane& thePlane, Handle(AIS_InteractiveContext) ic, double theDefaultSize )
-{
- double aNormal[3];
- double aDir[2][3] = { { 0, 0, 0 }, { 0, 0, 0 } };
- {
- static double aCoeff = M_PI/180.0;
-
- double anU[2] = { cos( aCoeff * thePlane.RelativeMode.Rotation1 ), cos( aCoeff * thePlane.RelativeMode.Rotation2 ) };
- double aV[2] = { sqrt( 1.0 - anU[0]*anU[0] ), sqrt( 1.0 - anU[1] * anU[1] ) };
- aV[0] = thePlane.RelativeMode.Rotation1 > 0? aV[0]: -aV[0];
- aV[1] = thePlane.RelativeMode.Rotation2 > 0? aV[1]: -aV[1];
-
- switch ( thePlane.RelativeMode.Orientation ) {
- case 0:
- aDir[0][1] = anU[0];
- aDir[0][2] = aV[0];
- aDir[1][0] = anU[1];
- aDir[1][2] = aV[1];
- break;
- case 1:
- aDir[0][2] = anU[0];
- aDir[0][0] = aV[0];
- aDir[1][1] = anU[1];
- aDir[1][0] = aV[1];
- break;
- case 2:
- aDir[0][0] = anU[0];
- aDir[0][1] = aV[0];
- aDir[1][2] = anU[1];
- aDir[1][1] = aV[1];
- break;
- }
-
- Cross( aDir[1], aDir[0], aNormal );
- // Normalize
- double den;
- den = sqrt( aNormal[0] * aNormal[0] + aNormal[1] * aNormal[1] + aNormal[2] * aNormal[2] );
- if ( den != 0.0 ) {
- for (int i=0; i < 3; i++) {
- aNormal[i] /= den;
- }
- }
- }
-
- double anOrigin[3];
-
- anOrigin[0] = anOrigin[1] = anOrigin[2] = 0;
- bool anIsOk = true;
-
- anIsOk = ComputeClippingPlaneParameters( aNormal,
- thePlane.RelativeMode.Distance,
- anOrigin,
- ic,
- theDefaultSize );
- if( !anIsOk )
- return;
- thePlane.X = anOrigin[0];
- thePlane.Y = anOrigin[1];
- thePlane.Z = anOrigin[2];
- thePlane.Dx = aNormal[0];
- thePlane.Dy = aNormal[1];
- thePlane.Dz = aNormal[2];
-}
-
-/*!
- \brief Converts absolute plane definition to relative system.
- \param thePlane [in/out] the plane to convert.
- \param theIC [in] the interactive context.
- \param theDefaultSize [in] the default trihedron size.
- */
-void absolutePlaneToRelative( OCCViewer_ClipPlane& thePlane, Handle(AIS_InteractiveContext) theIC, double theDefaultSize )
-{
- gp_Pnt aPlaneP( thePlane.X, thePlane.Y, thePlane.Z );
- gp_Dir aPlaneN( thePlane.Dx, thePlane.Dy, thePlane.Dz );
-
- double aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
-
- getMinMaxFromContext( theIC, theDefaultSize, aXmin, aYmin, aZmin, aXmax, aYmax, aZmax );
-
- Bnd_Box aMinMax;
- aMinMax.Update( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax );
-
- gp_Trsf aRelativeTransform;
- aRelativeTransform.SetTransformation( gp_Ax3(), gp_Ax3( aPlaneP, aPlaneN ) );
- Bnd_Box aRelativeBounds = aMinMax.Transformed( aRelativeTransform );
-
- aRelativeBounds.Get( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax );
-
- double aLength = aZmax - aZmin;
- double aDistance = aZmax;
-
- double aRelativeDistance = aLength > 0.01 ? aDistance / aLength : 0.0;
- aRelativeDistance = qMin( aRelativeDistance, aLength );
- aRelativeDistance = qMax( aRelativeDistance, 0.0 );
- thePlane.RelativeMode.Distance = aRelativeDistance;
-
- const gp_Dir& aDX = gp::DX();
- const gp_Dir& aDY = gp::DY();
- const gp_Dir& aDZ = gp::DZ();
- double anAng1 = 0.0;
- double anAng2 = 0.0;
- switch ( thePlane.RelativeMode.Orientation )
- {
- case 0:
- {
- if ( aDY.IsParallel( aPlaneN, Precision::Angular() ) )
- {
- anAng1 = 0.0;
- anAng2 = 0.0;
- break;
- }
-
- if ( aDX.IsParallel( aPlaneN, Precision::Angular() ) )
- {
- anAng1 = 0.0;
- anAng2 = 0.0;
- break;
- }
-
- gp_Dir aDir1 = aPlaneN ^ aDX;
- gp_Dir aDir2 = aDY ^ aPlaneN;
- gp_Ax3 aRightHand( gp::Origin(), aPlaneN, aDY ^ aPlaneN );
-
- if ( aDir1 * aRightHand.YDirection() < 0.0 )
- {
- aDir1.Reverse();
- }
- if ( aDir2 * aRightHand.XDirection() < 0.0 )
- {
- aDir2.Reverse();
- }
-
- anAng1 = aDY.AngleWithRef( aDir1, aDX );
- anAng2 = aDX.AngleWithRef( aDir2, -aDY );
- break;
- }
- case 1:
- {
- if ( aDZ.IsParallel( aPlaneN, Precision::Angular() ) )
- {
- anAng1 = 0.0;
- anAng2 = 0.0;
- break;
- }
-
- if ( aDY.IsParallel( aPlaneN, Precision::Angular() ) )
- {
- anAng1 = 0.0;
- anAng2 = 0.0;
- break;
- }
-
- gp_Dir aDir1 = aPlaneN ^ aDY;
- gp_Dir aDir2 = aDZ ^ aPlaneN;
- gp_Ax3 aRightHand( gp::Origin(), aPlaneN, aDZ ^ aPlaneN );
-
- if ( aDir1 * aRightHand.YDirection() < 0.0 )
- {
- aDir1.Reverse();
- }
- if ( aDir2 * aRightHand.XDirection() < 0.0 )
- {
- aDir2.Reverse();
- }
-
- anAng1 = aDZ.AngleWithRef( aDir1, aDY );
- anAng2 = aDY.AngleWithRef( aDir2, -aDZ );
- break;
- }
- case 2:
- {
- if ( aDX.IsParallel( aPlaneN, Precision::Angular() ) )
- {
- anAng1 = 0.0;
- anAng2 = 0.0;
- break;
- }
-
- if ( aDZ.IsParallel( aPlaneN, Precision::Angular() ) )
- {
- anAng1 = 0.0;
- anAng2 = 0.0;
- break;
- }
-
- gp_Dir aDir1 = aPlaneN ^ aDZ;
- gp_Dir aDir2 = aDX ^ aPlaneN;
- gp_Ax3 aRightHand( gp::Origin(), aPlaneN, aDX ^ aPlaneN );
-
- if ( aDir1 * aRightHand.YDirection() < 0.0 )
- {
- aDir1.Reverse();
- }
- if ( aDir2 * aRightHand.XDirection() < 0.0 )
- {
- aDir2.Reverse();
- }
-
- anAng1 = aDX.AngleWithRef( aDir1, aDZ );
- anAng2 = aDZ.AngleWithRef( aDir2, -aDX );
- break;
- }
- }
-
- thePlane.RelativeMode.Rotation1 = anAng1 * ( 180.0 / M_PI );
- thePlane.RelativeMode.Rotation2 = anAng2 * ( 180.0 / M_PI );
-}
-
-/*!
- Compute clipping plane size base point and normal
- */
-
-void clipPlaneParams(OCCViewer_ClipPlane& theClipPlane, Handle(AIS_InteractiveContext) theContext,
- double& theSize, gp_Pnt& theBasePnt, gp_Dir& theNormal, double defaultSize) {
- double aXMin, aYMin, aZMin, aXMax, aYMax, aZMax;
- aXMin = aYMin = aZMin = DBL_MAX;
- aXMax = aYMax = aZMax = -DBL_MAX;
-
- getMinMaxFromContext(theContext,defaultSize,aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);
- double aSize = 50;
-
-
- gp_Pnt aBasePnt(theClipPlane.X , theClipPlane.Y , theClipPlane.Z);
- gp_Dir aNormal(theClipPlane.Dx, theClipPlane.Dy, theClipPlane.Dz );
-
- // compute clipping plane size
- gp_Pnt aCenter = gp_Pnt( ( aXMin + aXMax ) / 2, ( aYMin + aYMax ) / 2, ( aZMin + aZMax ) / 2 );
- double aDiag = aCenter.Distance( gp_Pnt( aXMax, aYMax, aZMax ) )*2;
- aSize = aDiag * 1.1;
-
- // compute clipping plane center ( redefine the base point )
- IntAna_IntConicQuad intersector = IntAna_IntConicQuad();
-
- intersector.Perform( gp_Lin( aCenter, aNormal), gp_Pln( aBasePnt, aNormal), Precision::Confusion() );
-
- if ( intersector.IsDone() && intersector.NbPoints() == 1 )
- aBasePnt = intersector.Point( 1 );
-
- theSize = aSize;
- theBasePnt = aBasePnt;
- theNormal = aNormal;
-}
-
-
-/*********************************************************************************
- ********************* class OCCViewer_ClippingDlg *********************
- *********************************************************************************/
-/*!
- Constructor
- \param view - view window
- \param parent - parent widget
-*/
-OCCViewer_ClippingDlg::OCCViewer_ClippingDlg(OCCViewer_ViewWindow* parent , OCCViewer_Viewer* model)
- : QDialog( parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint ),
- myCurrentClipPlaneMode (Absolute)
-{
- setObjectName( "OCCViewer_ClippingDlg" );
- setModal( false );
-
- setWindowTitle( tr( "Clipping" ) );
-
- setAttribute (Qt::WA_DeleteOnClose, true);
-
- QVBoxLayout* topLayout = new QVBoxLayout( this );
- topLayout->setMargin( 11 ); topLayout->setSpacing( 6 );
-
- /***************************************************************/
- // Controls for selecting, creating, deleting planes
- QGroupBox* GroupPlanes = new QGroupBox( tr("CLIPPING_PLANES"), this );
- QHBoxLayout* GroupPlanesLayout = new QHBoxLayout( GroupPlanes );
- ComboBoxPlanes = new QComboBox( GroupPlanes );
- isActivePlane = new QCheckBox( tr("IS_ACTIVE_PLANE"), this );
- buttonNew = new QPushButton( tr("BTN_NEW"), GroupPlanes );
- buttonDelete = new QPushButton( tr("BTN_DELETE"), GroupPlanes );
- buttonDisableAll = new QPushButton( tr("BTN_DISABLE_ALL"), GroupPlanes );
- MenuMode = new QMenu( "MenuMode", buttonNew );
- MenuMode->addAction( tr( "ABSOLUTE" ), this, SLOT( onModeAbsolute() ) );
- MenuMode->addAction( tr( "RELATIVE" ), this, SLOT( onModeRelative() ) );
- buttonNew->setMenu( MenuMode );
-
- GroupPlanesLayout->addWidget( ComboBoxPlanes );
- GroupPlanesLayout->addWidget( isActivePlane );
- GroupPlanesLayout->addWidget( buttonNew );
- GroupPlanesLayout->addWidget( buttonDelete );
- GroupPlanesLayout->addWidget( buttonDisableAll );
-
- ModeStackedLayout = new QStackedLayout();
-
- /********************** Mode Absolute **********************/
- /* Controls for absolute mode of clipping plane:
- X, Y, Z - coordinates of the intersection of cutting plane and the three axes
- Dx, Dy, Dz - components of normal to the cutting plane
- Orientation - direction of cutting plane
- */
- const double min = -1e+7;
- const double max = 1e+7;
- const double step = 5;
- const int precision = -7;
-
- // Croup Point
- QGroupBox* GroupAbsolutePoint = new QGroupBox( this );
- GroupAbsolutePoint->setObjectName( "GroupPoint" );
- GroupAbsolutePoint->setTitle( tr("BASE_POINT") );
- QGridLayout* GroupPointLayout = new QGridLayout( GroupAbsolutePoint );
- GroupPointLayout->setAlignment( Qt::AlignTop );
- GroupPointLayout->setSpacing( 6 ); GroupPointLayout->setMargin( 11 );
-
- TextLabelX = new QLabel( GroupAbsolutePoint );
- TextLabelX->setObjectName( "TextLabelX" );
- TextLabelX->setText( tr("X:") );
- GroupPointLayout->addWidget( TextLabelX, 0, 0 );
-
- SpinBox_X = new QtxDoubleSpinBox( min, max, step, GroupAbsolutePoint );
- SpinBox_X->setObjectName("SpinBox_X" );
- SpinBox_X->setPrecision( precision );
- GroupPointLayout->addWidget( SpinBox_X, 0, 1 );
-
- TextLabelY = new QLabel( GroupAbsolutePoint );
- TextLabelY->setObjectName( "TextLabelY" );
- TextLabelY->setText( tr("Y:") );
- GroupPointLayout->addWidget( TextLabelY, 0, 2 );
-
- SpinBox_Y = new QtxDoubleSpinBox( min, max, step, GroupAbsolutePoint );
- SpinBox_Y->setObjectName("SpinBox_Y" );
- SpinBox_Y->setPrecision( precision );
- GroupPointLayout->addWidget( SpinBox_Y, 0, 3 );
-
- TextLabelZ = new QLabel( GroupAbsolutePoint );
- TextLabelZ->setObjectName( "TextLabelZ" );
- TextLabelZ->setText( tr("Z:") );
- GroupPointLayout->addWidget( TextLabelZ, 0, 4 );
-
- SpinBox_Z = new QtxDoubleSpinBox( min, max, step, GroupAbsolutePoint );
- SpinBox_Z->setObjectName("SpinBox_Z" );
- SpinBox_Z->setPrecision( precision );
- GroupPointLayout->addWidget( SpinBox_Z, 0, 5 );
-
- resetButton = new QPushButton( GroupAbsolutePoint );
- resetButton->setObjectName( "resetButton" );
- resetButton->setText( tr( "RESET" ) );
- GroupPointLayout->addWidget( resetButton, 0, 6 );
-
- // Group Direction
- GroupAbsoluteDirection = new QGroupBox( this );
- GroupAbsoluteDirection->setObjectName( "GroupDirection" );
- GroupAbsoluteDirection->setTitle( tr("DIRECTION") );
- QGridLayout* GroupDirectionLayout = new QGridLayout( GroupAbsoluteDirection );
- GroupDirectionLayout->setAlignment( Qt::AlignTop );
- GroupDirectionLayout->setSpacing( 6 );
- GroupDirectionLayout->setMargin( 11 );
-
- TextLabelDx = new QLabel( GroupAbsoluteDirection );
- TextLabelDx->setObjectName( "TextLabelDx" );
- TextLabelDx->setText( tr("Dx:") );
- GroupDirectionLayout->addWidget( TextLabelDx, 0, 0 );
-
- SpinBox_Dx = new QtxDoubleSpinBox( min, max, step, GroupAbsoluteDirection );
- SpinBox_Dx->setObjectName("SpinBox_Dx" );
- SpinBox_Dx->setPrecision( precision );
- GroupDirectionLayout->addWidget( SpinBox_Dx, 0, 1 );
-
- TextLabelDy = new QLabel( GroupAbsoluteDirection );
- TextLabelDy->setObjectName( "TextLabelDy" );
- TextLabelDy->setText( tr("Dy:") );
- GroupDirectionLayout->addWidget( TextLabelDy, 0, 2 );
-
- SpinBox_Dy = new QtxDoubleSpinBox( min, max, step, GroupAbsoluteDirection );
- SpinBox_Dy->setObjectName("SpinBox_Dy" );
- SpinBox_Dy->setPrecision( precision );
- GroupDirectionLayout->addWidget( SpinBox_Dy, 0, 3 );
-
- TextLabelDz = new QLabel( GroupAbsoluteDirection );
- TextLabelDz->setObjectName( "TextLabelDz" );
- TextLabelDz->setText( tr("Dz:") );
- GroupDirectionLayout->addWidget( TextLabelDz, 0, 4 );
-
- SpinBox_Dz = new QtxDoubleSpinBox( min, max, step, GroupAbsoluteDirection );
- SpinBox_Dz->setObjectName("SpinBox_Dz" );
- SpinBox_Dz->setPrecision( precision );
- GroupDirectionLayout->addWidget( SpinBox_Dz, 0, 5 );
-
- invertButton = new QPushButton( GroupAbsoluteDirection );
- invertButton->setObjectName( "invertButton" );
- invertButton->setText( tr( "INVERT" ) );
- GroupDirectionLayout->addWidget( invertButton, 0, 6 );
-
- CBAbsoluteOrientation = new QComboBox( GroupAbsoluteDirection );
- CBAbsoluteOrientation->setObjectName( "AbsoluteOrientation" );
- CBAbsoluteOrientation->insertItem( CBAbsoluteOrientation->count(), tr( "CUSTOM" ) );
- CBAbsoluteOrientation->insertItem( CBAbsoluteOrientation->count(), tr( "||X-Y" ) );
- CBAbsoluteOrientation->insertItem( CBAbsoluteOrientation->count(), tr( "||Y-Z" ) );
- CBAbsoluteOrientation->insertItem( CBAbsoluteOrientation->count(), tr( "||Z-X" ) );
- GroupDirectionLayout->addWidget( CBAbsoluteOrientation, 1, 0, 1, 6 );
-
- QVBoxLayout* ModeActiveLayout = new QVBoxLayout();
- ModeActiveLayout->setMargin( 11 ); ModeActiveLayout->setSpacing( 6 );
- ModeActiveLayout->addWidget( GroupAbsolutePoint );
- ModeActiveLayout->addWidget( GroupAbsoluteDirection );
-
- QWidget* ModeActiveWidget = new QWidget( this );
- ModeActiveWidget->setLayout( ModeActiveLayout );
-
- /********************** Mode Relative **********************/
- /* Controls for relative mode of clipping plane:
- Distance - Value from 0 to 1.
- Specifies the distance from the minimum value in a given direction of bounding box to the current position
- Rotation1, Rotation2 - turn angles of cutting plane in given directions
- Orientation - direction of cutting plane
- */
- QGroupBox* GroupParameters = new QGroupBox( tr("PARAMETERS"), this );
- QGridLayout* GroupParametersLayout = new QGridLayout( GroupParameters );
- GroupParametersLayout->setMargin( 11 ); GroupParametersLayout->setSpacing( 6 );
-
- TextLabelOrientation = new QLabel( tr("ORIENTATION"), GroupParameters);
- TextLabelOrientation->setObjectName( "TextLabelOrientation" );
- GroupParametersLayout->addWidget( TextLabelOrientation, 0, 0 );
-
- CBRelativeOrientation = new QComboBox(GroupParameters);
- CBRelativeOrientation->setObjectName( "RelativeOrientation" );
- CBRelativeOrientation->addItem( tr("ALONG_XY") );
- CBRelativeOrientation->addItem( tr("ALONG_YZ") );
- CBRelativeOrientation->addItem( tr("ALONG_ZX") );
- GroupParametersLayout->addWidget( CBRelativeOrientation, 0, 1 );
-
- TextLabelDistance = new QLabel( tr("DISTANCE"), GroupParameters );
- TextLabelDistance->setObjectName( "TextLabelDistance" );
- GroupParametersLayout->addWidget( TextLabelDistance, 1, 0 );
-
- SpinSliderDistance = new QtxDoubleSpinSlider( 0., 1., 0.01, GroupParameters );
- SpinSliderDistance->setObjectName( "SpinSliderDistance" );
- SpinSliderDistance->setPrecision( precision );
- QFont fnt = SpinSliderDistance->font(); fnt.setBold( true ); SpinSliderDistance->setFont( fnt );
- GroupParametersLayout->addWidget( SpinSliderDistance, 1, 1 );
-
- QString aUnitRot = "\xB0";
-
- TextLabelRotation1 = new QLabel( tr("ROTATION_AROUND_X_Y2Z"), GroupParameters );
- TextLabelRotation1->setObjectName( "TextLabelRotation1" );
- GroupParametersLayout->addWidget( TextLabelRotation1, 2, 0 );
-
- SpinSliderRotation1 = new QtxIntSpinSlider( -180, 180, 1, GroupParameters );
- SpinSliderRotation1->setObjectName( "SpinSliderRotation1" );
- SpinSliderRotation1->setUnit( aUnitRot );
- SpinSliderRotation1->setFont( fnt );
- GroupParametersLayout->addWidget( SpinSliderRotation1, 2, 1 );
-
- TextLabelRotation2 = new QLabel(tr("ROTATION_AROUND_Y_X2Z"), GroupParameters);
- TextLabelRotation2->setObjectName( "TextLabelRotation2" );
- TextLabelRotation2->setObjectName( "TextLabelRotation2" );
- GroupParametersLayout->addWidget( TextLabelRotation2, 3, 0 );
-
- SpinSliderRotation2 = new QtxIntSpinSlider( -180, 180, 1, GroupParameters );
- SpinSliderRotation2->setObjectName( "SpinSliderRotation2" );
- SpinSliderRotation2->setUnit( aUnitRot );
- SpinSliderRotation2->setFont( fnt );
- GroupParametersLayout->addWidget( SpinSliderRotation2, 3, 1 );
-
- /***************************************************************/
- QGroupBox* CheckBoxWidget = new QGroupBox( this );
- QHBoxLayout* CheckBoxLayout = new QHBoxLayout( CheckBoxWidget );
-
- PreviewCheckBox = new QCheckBox( tr("PREVIEW"), CheckBoxWidget );
- PreviewCheckBox->setObjectName( "PreviewCheckBox" );
- PreviewCheckBox->setChecked( true );
- CheckBoxLayout->addWidget( PreviewCheckBox, 0, Qt::AlignCenter );
-
- AutoApplyCheckBox = new QCheckBox( tr("AUTO_APPLY"), CheckBoxWidget );
- AutoApplyCheckBox->setObjectName( "AutoApplyCheckBox" );
- CheckBoxLayout->addWidget( AutoApplyCheckBox, 0, Qt::AlignCenter );
-
- /***************************************************************/
- QGroupBox* GroupButtons = new QGroupBox( this );
- QHBoxLayout* GroupButtonsLayout = new QHBoxLayout( GroupButtons );
- GroupButtonsLayout->setAlignment( Qt::AlignTop );
- GroupButtonsLayout->setMargin( 11 ); GroupButtonsLayout->setSpacing( 6 );
-
- buttonOk = new QPushButton( GroupButtons );
- buttonOk->setObjectName( "buttonOk" );
- buttonOk->setText( tr( "BUT_APPLY_AND_CLOSE" ) );
- buttonOk->setAutoDefault( TRUE );
- buttonOk->setDefault( TRUE );
- GroupButtonsLayout->addWidget( buttonOk );
-
- buttonApply = new QPushButton( GroupButtons );
- buttonApply->setObjectName( "buttonApply" );
- buttonApply->setText( tr( "BUT_APPLY" ) );
- buttonApply->setAutoDefault( TRUE );
- buttonApply->setDefault( TRUE );
- GroupButtonsLayout->addWidget( buttonApply );
-
- GroupButtonsLayout->addStretch();
-
- buttonClose = new QPushButton( GroupButtons );
- buttonClose->setObjectName( "buttonClose" );
- buttonClose->setText( tr( "BUT_CLOSE" ) );
- buttonClose->setAutoDefault( TRUE );
- GroupButtonsLayout->addWidget( buttonClose );
-
- QPushButton* buttonHelp = new QPushButton( tr( "SMESH_BUT_HELP" ), GroupButtons );
- buttonHelp->setAutoDefault( TRUE );
- GroupButtonsLayout->addWidget( buttonHelp );
-
- /***************************************************************/
- ModeStackedLayout->addWidget( ModeActiveWidget );
- ModeStackedLayout->addWidget( GroupParameters );
-
- topLayout->addWidget( GroupPlanes );
- topLayout->addLayout( ModeStackedLayout );
- topLayout->addWidget( CheckBoxWidget );
- topLayout->addWidget( GroupButtons );
-
- this->setLayout( topLayout );
-
- // Initializations
- initParam();
-
- // Signals and slots connections
- connect( ComboBoxPlanes, SIGNAL( activated( int ) ), this, SLOT( onSelectPlane( int ) ) );
- connect( isActivePlane, SIGNAL ( toggled ( bool ) ), this, SLOT( onValueChanged() ) );
- connect( buttonNew, SIGNAL( clicked() ), buttonNew, SLOT( showMenu() ) );
- connect( buttonDelete, SIGNAL( clicked() ), this, SLOT( ClickOnDelete() ) );
- connect( buttonDisableAll, SIGNAL( clicked() ), this, SLOT( ClickOnDisableAll() ) );
-
- connect( resetButton, SIGNAL (clicked() ), this, SLOT( onReset() ) );
- connect( invertButton, SIGNAL (clicked() ), this, SLOT( onInvert() ) ) ;
- connect( SpinBox_X, SIGNAL ( valueChanged( double ) ), this, SLOT( onValueChanged() ) );
- connect( SpinBox_Y, SIGNAL ( valueChanged( double ) ), this, SLOT( onValueChanged() ) );
- connect( SpinBox_Z, SIGNAL ( valueChanged( double ) ), this, SLOT( onValueChanged() ) );
- connect( SpinBox_Dx, SIGNAL ( valueChanged( double ) ), this, SLOT( onValueChanged() ) );
- connect( SpinBox_Dy, SIGNAL ( valueChanged( double ) ), this, SLOT( onValueChanged() ) );
- connect( SpinBox_Dz, SIGNAL ( valueChanged( double ) ), this, SLOT( onValueChanged() ) );
- connect( CBAbsoluteOrientation, SIGNAL ( activated ( int ) ), this, SLOT( onOrientationAbsoluteChanged( int ) ) ) ;
-
- connect( CBRelativeOrientation, SIGNAL( activated( int ) ), this, SLOT( onOrientationRelativeChanged( int ) ) );
- connect( SpinSliderDistance, SIGNAL( valueChanged( double ) ), this, SLOT( onValueChanged() ) );
- connect( SpinSliderRotation1, SIGNAL( valueChanged( int ) ), this, SLOT( onValueChanged() ) );
- connect( SpinSliderRotation2, SIGNAL( valueChanged( int ) ), this, SLOT( onValueChanged() ) );
-
- connect( PreviewCheckBox, SIGNAL ( toggled ( bool ) ), this, SLOT( onPreview( bool ) ) ) ;
- connect( AutoApplyCheckBox, SIGNAL ( toggled( bool ) ), this, SLOT( onAutoApply( bool ) ) );
-
- connect( buttonClose, SIGNAL( clicked() ), this, SLOT( ClickOnClose() ) ) ;
- connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );
- connect( buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
- connect( buttonHelp, SIGNAL( clicked() ), this, SLOT( ClickOnHelp() ) );
-
- myBusy = false;
- myIsSelectPlane = false;
- myIsPlaneCreation = false;
- myIsUpdatingControls = false;
- myModel = model;
-
- myModel->getViewer3d()->InitActiveViews();
-
- OCCViewer_ViewManager* aViewMgr = (OCCViewer_ViewManager*) myModel->getViewManager();
- myInteractor = new OCCViewer_ClipPlaneInteractor( aViewMgr, this );
- connect( myInteractor, SIGNAL( planeClicked( const Handle_AIS_Plane& ) ), SLOT( onPlaneClicked( const Handle_AIS_Plane& ) ) );
- connect( myInteractor, SIGNAL( planeDragged( const Handle_AIS_Plane& ) ), SLOT( onPlaneDragged( const Handle_AIS_Plane& ) ) );
-
- myLocalPlanes = myModel->getClipPlanes();
- synchronize();
-}
-
-/*!
- Destructor
- Destroys the object and frees any allocated resources
-*/
-OCCViewer_ClippingDlg::~OCCViewer_ClippingDlg()
-{
- myLocalPlanes.clear();
-}
-
-/*!
- Custom handling of close event: erases preview
-*/
-void OCCViewer_ClippingDlg::closeEvent( QCloseEvent* e )
-{
- erasePreview();
- QDialog::closeEvent( e );
- OCCViewer_ViewWindow* v = qobject_cast<OCCViewer_ViewWindow*>(parent());
- if(v)
- v->onClipping(false);
-}
-
-/*!
- Custom handling of show event: displays preview
-*/
-void OCCViewer_ClippingDlg::showEvent( QShowEvent* e )
-{
- QDialog::showEvent( e );
- onPreview( PreviewCheckBox->isChecked() );
-}
-
-/*!
- Custom handling of hide event: erases preview
-*/
-void OCCViewer_ClippingDlg::hideEvent( QHideEvent* e )
-{
- erasePreview();
- QDialog::hideEvent( e );
- OCCViewer_ViewWindow* v = qobject_cast<OCCViewer_ViewWindow*>(parent());
- if(v)
- v->onClipping(false);
-
-}
-
-/*!
- Initialization of initial values of widgets
-*/
-void OCCViewer_ClippingDlg::initParam()
-{
- SpinBox_X->setValue( 0.0 );
- SpinBox_Y->setValue( 0.0 );
- SpinBox_Z->setValue( 0.0 );
-
- SpinBox_Dx->setValue( 1.0 );
- SpinBox_Dy->setValue( 1.0 );
- SpinBox_Dz->setValue( 1.0 );
-
- CBAbsoluteOrientation->setCurrentIndex(0);
-
- SpinSliderDistance->setValue( 0.5 );
- SpinSliderRotation1->setValue( 0 );
- SpinSliderRotation2->setValue( 0 );
- CBRelativeOrientation->setCurrentIndex( 0 );
-}
-
-/*!
- Synchronize dialog's widgets with data
-*/
-void OCCViewer_ClippingDlg::synchronize()
-{
- ComboBoxPlanes->clear();
- int aNbPlanesAbsolute = myLocalPlanes.size();
-
- QString aName;
- for(int i = 1; i<=aNbPlanesAbsolute; i++ ) {
- aName = QString("Plane %1").arg(i);
- ComboBoxPlanes->addItem( aName );
- }
-
- int aPos = ComboBoxPlanes->count() - 1;
- ComboBoxPlanes->setCurrentIndex( aPos );
-
- bool anIsControlsEnable = ( aPos >= 0 );
- if ( anIsControlsEnable ) {
- onSelectPlane( aPos );
- }
- else {
- ComboBoxPlanes->addItem( tr( "NO_PLANES" ) );
- initParam();
- }
- if ( myCurrentClipPlaneMode == Absolute ) {
- SpinBox_X->setEnabled( anIsControlsEnable );
- SpinBox_Y->setEnabled( anIsControlsEnable );
- SpinBox_Z->setEnabled( anIsControlsEnable );
- SpinBox_Dx->setEnabled( anIsControlsEnable );
- SpinBox_Dy->setEnabled( anIsControlsEnable );
- SpinBox_Dz->setEnabled( anIsControlsEnable );
- CBAbsoluteOrientation->setEnabled( anIsControlsEnable );
- invertButton->setEnabled( anIsControlsEnable );
- resetButton->setEnabled( anIsControlsEnable );
- }
- else if( myCurrentClipPlaneMode == Relative ) {
- CBRelativeOrientation->setEnabled( anIsControlsEnable );
- SpinSliderDistance->setEnabled( anIsControlsEnable );
- SpinSliderRotation1->setEnabled( anIsControlsEnable );
- SpinSliderRotation2->setEnabled( anIsControlsEnable );
- isActivePlane->setEnabled( anIsControlsEnable );
- }
- isActivePlane->setEnabled( anIsControlsEnable );
-}
-
-/*!
- Displays preview of clipping plane
-*/
-void OCCViewer_ClippingDlg::displayPreview()
-{
- if ( myBusy || !isValid() || !myModel)
- return;
-
- Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
-
- int aCurPlaneIndex = ComboBoxPlanes->currentIndex();
-
- for ( int i=0; i < clipPlanesCount(); i++ ) {
- OCCViewer_ClipPlane& aClipPlane = getClipPlane(i);
- if ( aClipPlane.IsOn ) {
- Handle(AIS_Plane) myPreviewPlane;
- double aSize;
- gp_Pnt aBasePnt;
- gp_Dir aNormal;
- clipPlaneParams(aClipPlane, ic, aSize, aBasePnt, aNormal, myModel->trihedronSize());
- myPreviewPlane = new AIS_Plane( new Geom_Plane( aBasePnt, aNormal ), aBasePnt );
- myPreviewPlane->SetTypeOfSensitivity( Select3D_TOS_INTERIOR );
- myPreviewPlane->SetSize( aSize, aSize );
- ic->SetWidth( myPreviewPlane, 10, false );
- ic->SetMaterial( myPreviewPlane, Graphic3d_NOM_PLASTIC, false );
- ic->SetTransparency( myPreviewPlane, 0.5, false );
- Quantity_Color c = (aCurPlaneIndex == i) ? Quantity_Color( 255. / 255., 70. / 255., 0. / 255., Quantity_TOC_RGB ) : Quantity_Color( 85 / 255., 85 / 255., 255 / 255., Quantity_TOC_RGB );
- ic->SetColor( myPreviewPlane, c , false );
- ic->Display( myPreviewPlane, 1, 0, false );
- myPreviewPlaneVector.push_back( myPreviewPlane );
- }
- }
- myModel->update();
-
- double aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
- getMinMaxFromContext( ic, myModel->trihedronSize(), aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
- gp_Pnt aRotationCenter( (aXmax + aXmin) * 0.5,
- (aYmax + aYmin) * 0.5,
- (aZmax + aZmin) * 0.5 );
- Bnd_Box aMinMax;
- aMinMax.Update( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax );
-
- myInteractor->setPlanes( myPreviewPlaneVector );
- myInteractor->setRotationCenter( aRotationCenter );
- myInteractor->setMinMax( aMinMax );
- myInteractor->setEnabled( true );
-}
-
-void OCCViewer_ClippingDlg::updatePreview() {
- int aCurPlaneIndex = ComboBoxPlanes->currentIndex();
- int count = clipPlanesCount();
- if ( myBusy ||
- !isValid() ||
- myIsPlaneCreation ||
- !myModel ||
- count == 0 ||
- (aCurPlaneIndex +1 > count) ||
- !PreviewCheckBox->isChecked())
- return;
-
- Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
-
- OCCViewer_ClipPlane& aClipPlane = getClipPlane(aCurPlaneIndex);
- Handle(AIS_Plane) myPreviewPlane;
-
- if (aClipPlane.IsOn) {
- double aSize;
- gp_Pnt aBasePnt;
- gp_Dir aNormal;
- clipPlaneParams(aClipPlane, ic, aSize, aBasePnt, aNormal, myModel->trihedronSize());
- if(myPreviewPlaneVector.size() < clipPlanesCount()) {
- myPreviewPlaneVector.resize(clipPlanesCount());
- }
- myPreviewPlane = myPreviewPlaneVector[aCurPlaneIndex];
- if(myPreviewPlane.IsNull()) {
- //Plane was not created
- myPreviewPlane = new AIS_Plane( new Geom_Plane( aBasePnt, aNormal ), aBasePnt );
- myPreviewPlane->SetTypeOfSensitivity( Select3D_TOS_INTERIOR );
- myPreviewPlane->SetSize( aSize, aSize );
- ic->Display( myPreviewPlane, 1, 0, false );
- ic->SetWidth( myPreviewPlane, 10, false );
- ic->SetMaterial( myPreviewPlane, Graphic3d_NOM_PLASTIC, false );
- ic->SetTransparency( myPreviewPlane, 0.5, false );
- myPreviewPlaneVector[aCurPlaneIndex] = myPreviewPlane;
- } else {
- myPreviewPlane->SetComponent( new Geom_Plane( aBasePnt, aNormal ) );
- myPreviewPlane->SetCenter( aBasePnt );
- myPreviewPlane->SetSize( aSize, aSize );
- }
-
- ic->SetColor( myPreviewPlane, Quantity_Color( 255. / 255., 70. / 255., 0. / 255., Quantity_TOC_RGB ), false );
- ic->Update( myPreviewPlane, Standard_False );
- } else {
- if(myPreviewPlaneVector.size() > aCurPlaneIndex ) {
- myPreviewPlane = myPreviewPlaneVector[aCurPlaneIndex];
- if(ic->IsDisplayed(myPreviewPlane)) {
- ic->Erase( myPreviewPlane, false );
- ic->Remove( myPreviewPlane, false );
- }
- myPreviewPlaneVector[aCurPlaneIndex].Nullify();
- }
- }
- for(int i = 0; i < myPreviewPlaneVector.size(); i++) {
- if( i == aCurPlaneIndex ) continue;
- if(!myPreviewPlaneVector[i].IsNull())
- ic->SetColor( myPreviewPlaneVector[i], Quantity_Color( 85 / 255., 85 / 255., 255 / 255., Quantity_TOC_RGB ), false );
- }
- myModel->update();
-
- double aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
- getMinMaxFromContext( ic, myModel->trihedronSize(), aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
- gp_Pnt aRotationCenter( (aXmax + aXmin) * 0.5,
- (aYmax + aYmin) * 0.5,
- (aZmax + aZmin) * 0.5 );
- Bnd_Box aMinMax;
- aMinMax.Update( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax );
-
- myInteractor->setPlanes( myPreviewPlaneVector );
- myInteractor->setRotationCenter( aRotationCenter );
- myInteractor->setMinMax( aMinMax );
-}
-
-/*!
- Erases preview of clipping plane
-*/
-void OCCViewer_ClippingDlg::erasePreview()
-{
- if ( !myModel )
- return;
-
- Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
-
- for ( int i=0; i < myPreviewPlaneVector.size(); i++ ) {
- Handle(AIS_Plane) myPreviewPlane = myPreviewPlaneVector[i];
- if ( !myPreviewPlane.IsNull() && ic->IsDisplayed( myPreviewPlane ) ) {
- ic->Erase( myPreviewPlane, false );
- ic->Remove( myPreviewPlane, false );
- myPreviewPlane.Nullify();
- }
- }
- myPreviewPlaneVector.clear();
- myModel->update();
- myInteractor->setEnabled( false );
-}
-
-/*!
- Return true if plane parameters are valid
-*/
-bool OCCViewer_ClippingDlg::isValid()
-{
- return ( SpinBox_Dx->value() !=0 || SpinBox_Dy->value() !=0 || SpinBox_Dz->value() !=0 );
-}
-
-/*!
- Update view after changes
-*/
-void OCCViewer_ClippingDlg::updateClipping()
-{
- if (PreviewCheckBox->isChecked() || AutoApplyCheckBox->isChecked())
- {
- if (AutoApplyCheckBox->isChecked()) {
- onApply();
- }
-
- if (!PreviewCheckBox->isChecked())
- myModel->update();
- else
- updatePreview();
- }
-}
-
-/*!
- Updates state of user controls.
-*/
-void OCCViewer_ClippingDlg::updateControls()
-{
- if ( clipPlanesCount() == 0 )
- {
- initParam();
- return;
- }
-
- int aPlaneIdx = ComboBoxPlanes->currentIndex();
-
- OCCViewer_ClipPlane& aPlane = getClipPlane( aPlaneIdx );
-
- if ( aPlane.PlaneMode == Absolute )
- {
- ModeStackedLayout->setCurrentIndex( 0 );
- myCurrentClipPlaneMode = Absolute;
- int anOrientation = aPlane.Orientation;
- // Set plane parameters in the dialog
- SpinBox_X->setValue( aPlane.X );
- SpinBox_Y->setValue( aPlane.Y );
- SpinBox_Z->setValue( aPlane.Z );
- SpinBox_Dx->setValue( aPlane.Dx );
- SpinBox_Dy->setValue( aPlane.Dy );
- SpinBox_Dz->setValue( aPlane.Dz );
- CBAbsoluteOrientation->setCurrentIndex( anOrientation );
- onOrientationAbsoluteChanged( anOrientation );
- }
- else if( aPlane.PlaneMode == Relative )
- {
- ModeStackedLayout->setCurrentIndex( 1 );
- myCurrentClipPlaneMode = Relative;
- int anOrientation = aPlane.RelativeMode.Orientation;
-
- // Set plane parameters in the dialog
- double aFmtDistance = double(aPlane.RelativeMode.Distance);
- int aFmtRotation1 = int(aPlane.RelativeMode.Rotation1);
- int aFmtRotation2 = int(aPlane.RelativeMode.Rotation2);
-
- SpinSliderDistance->setValue( aFmtDistance );
- SpinSliderRotation1->setValue( aFmtRotation1 );
- SpinSliderRotation2->setValue( aFmtRotation2 );
- CBRelativeOrientation->setCurrentIndex( anOrientation );
- onOrientationRelativeChanged( anOrientation );
- }
-
- isActivePlane->setChecked( aPlane.IsOn );
-}
-
-/*!
- SLOT on new button click: create a new clipping plane
-*/
-void OCCViewer_ClippingDlg::ClickOnNew()
-{
- OCCViewer_ClipPlane aPlane;
- aPlane.PlaneMode = (ClipPlaneMode )myCurrentClipPlaneMode;
- myLocalPlanes.push_back(aPlane);
- synchronize();
-}
-
-/*!
- SLOT on delete button click: Delete selected clipping plane
-*/
-void OCCViewer_ClippingDlg::ClickOnDelete()
-{
- int aPlaneIndex = ComboBoxPlanes->currentIndex();
- if ( (clipPlanesCount() == 0) || (aPlaneIndex+1 > clipPlanesCount()))
- return;
-
- myLocalPlanes.erase(myLocalPlanes.begin() + aPlaneIndex);
-
- Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
-
- if(aPlaneIndex+1 <= myPreviewPlaneVector.size()) {
- Handle(AIS_Plane) myPreviewPlane = myPreviewPlaneVector[aPlaneIndex];
- if ( !myPreviewPlane.IsNull() && ic->IsDisplayed( myPreviewPlane ) ) {
- ic->Erase( myPreviewPlane, false );
- ic->Remove( myPreviewPlane, false );
- }
- myPreviewPlaneVector.erase(myPreviewPlaneVector.begin() + aPlaneIndex);
- }
- synchronize();
- if (AutoApplyCheckBox->isChecked()) {
- onApply();
- }
- myModel->update();
-}
-
-/*!
- SLOT on disable all button click: Restore initial state of viewer,
- erase all clipping planes
-*/
-void OCCViewer_ClippingDlg::ClickOnDisableAll()
-{
- AutoApplyCheckBox->setChecked (false);
- int aClipPlanesCount = clipPlanesCount();
- for ( int anIndex = 0; anIndex < aClipPlanesCount; anIndex++)
- {
- OCCViewer_ClipPlane& aPlane = getClipPlane(anIndex);
- aPlane.IsOn = false;
- }
- erasePreview();
- isActivePlane->setChecked(false);
- myModel->setClipPlanes(myLocalPlanes);
- myModel->update();
-}
-
-/*!
- SLOT on ok button click: sets cutting plane and closes dialog
-*/
-void OCCViewer_ClippingDlg::ClickOnOk()
-{
- onApply();
- ClickOnClose();
-}
-
-/*!
- SLOT on Apply button click: sets cutting plane and update viewer
-*/
-void OCCViewer_ClippingDlg::ClickOnApply()
-{
- onApply();
- myModel->update();
-}
-
-/*!
- SLOT on close button click: erases preview and rejects dialog
-*/
-void OCCViewer_ClippingDlg::ClickOnClose()
-{
- erasePreview();
- OCCViewer_ViewWindow* v = qobject_cast<OCCViewer_ViewWindow*>(parent());
- if(v)
- v->onClipping(false);
-}
-
-/*!
- SLOT on help button click: opens a help page
-*/
-void OCCViewer_ClippingDlg::ClickOnHelp()
-{
- SUIT_Application* app = SUIT_Session::session()->activeApplication();
- if ( app )
- app->onHelpContextModule( "GUI", "occ_3d_viewer_page.html", "clipping_planes" );
-}
-
-/*!
- Set absolute mode of clipping plane
-*/
-void OCCViewer_ClippingDlg::onModeAbsolute()
-{
- myIsPlaneCreation = true;
- ModeStackedLayout->setCurrentIndex(0);
- myCurrentClipPlaneMode = Absolute;
- ClickOnNew();
- myIsPlaneCreation = false;
- updateClipping();
-}
-
-/*!
- Set relative mode of clipping plane
-*/
-void OCCViewer_ClippingDlg::onModeRelative()
-{
- myIsPlaneCreation = true;
- ModeStackedLayout->setCurrentIndex(1);
- myCurrentClipPlaneMode = Relative;
- ClickOnNew();
- myIsPlaneCreation = false;
- SetCurrentPlaneParam();
- updateClipping();
-}
-
-/*!
- SLOT: called on value of clipping plane changed
-*/
-void OCCViewer_ClippingDlg::onValueChanged()
-{
- if ( myIsUpdatingControls )
- {
- return;
- }
-
- SetCurrentPlaneParam();
-
- if ( myIsSelectPlane )
- {
- return;
- }
-
- updateClipping();
-}
-
-/*!
- Set current parameters of selected plane
-*/
-void OCCViewer_ClippingDlg::onSelectPlane ( int theIndex )
-{
- if ( clipPlanesCount() == 0 )
- {
- return;
- }
-
- OCCViewer_ClipPlane& aClipPlane = getClipPlane( theIndex );
-
- myIsSelectPlane = true;
- updateControls();
- ComboBoxPlanes->setCurrentIndex( theIndex );
- myIsSelectPlane = false;
-}
-
-/*!
- Restore parameters of selected plane
-*/
-void OCCViewer_ClippingDlg::SetCurrentPlaneParam()
-{
- if ( clipPlanesCount() == 0 || myIsSelectPlane || myBusy)
- return;
-
- int aCurPlaneIndex = ComboBoxPlanes->currentIndex();
-
- OCCViewer_ClipPlane& aPlane = getClipPlane( aCurPlaneIndex );
-
- if ( aPlane.PlaneMode == Absolute )
- {
- if( qFuzzyIsNull( SpinBox_Dx->value() ) &&
- qFuzzyIsNull( SpinBox_Dy->value() ) &&
- qFuzzyIsNull( SpinBox_Dz->value() ) ) {
- return;
- }
- aPlane.Orientation = CBAbsoluteOrientation->currentIndex();
- aPlane.X = SpinBox_X->value();
- aPlane.Y = SpinBox_Y->value();
- aPlane.Z = SpinBox_Z->value();
- aPlane.Dx = SpinBox_Dx->value();
- aPlane.Dy = SpinBox_Dy->value();
- aPlane.Dz = SpinBox_Dz->value();
- absolutePlaneToRelative( aPlane, myModel->getAISContext(),myModel->trihedronSize() );
- }
- else if( aPlane.PlaneMode == Relative )
- {
- aPlane.RelativeMode.Orientation = CBRelativeOrientation->currentIndex();
- aPlane.RelativeMode.Distance = SpinSliderDistance->value();
- aPlane.RelativeMode.Rotation1 = SpinSliderRotation1->value();
- aPlane.RelativeMode.Rotation2 = SpinSliderRotation2->value();
- relativePlaneToAbsolute( aPlane, myModel->getAISContext(),myModel->trihedronSize() );
- }
- aPlane.IsOn = isActivePlane->isChecked();
-}
-
-/*!
- SLOT on reset button click: sets default values
-*/
-void OCCViewer_ClippingDlg::onReset()
-{
- myBusy = true;
- SpinBox_X->setValue(0);
- SpinBox_Y->setValue(0);
- SpinBox_Z->setValue(0);
- myBusy = false;
-
- updateClipping();
-}
-
-/*!
- SLOT on invert button click: inverts normal of cutting plane
-*/
-void OCCViewer_ClippingDlg::onInvert()
-{
- double Dx = SpinBox_Dx->value();
- double Dy = SpinBox_Dy->value();
- double Dz = SpinBox_Dz->value();
-
- myBusy = true;
- SpinBox_Dx->setValue( -Dx );
- SpinBox_Dy->setValue( -Dy );
- SpinBox_Dz->setValue( -Dz );
- myBusy = false;
-
- if ( clipPlanesCount() != 0 ) {
- int aCurPlaneIndex = ComboBoxPlanes->currentIndex();
- OCCViewer_ClipPlane& aPlane = getClipPlane( aCurPlaneIndex );
- aPlane.IsInvert = !aPlane.IsInvert;
- }
- updateClipping();
-}
-
-/*!
- SLOT: called on orientation of clipping plane in absolute mode changed
-*/
-void OCCViewer_ClippingDlg::onOrientationAbsoluteChanged( int mode )
-{
- bool isUserMode = (mode==0);
-
- TextLabelX->setEnabled( isUserMode );
- TextLabelY->setEnabled( isUserMode );
- TextLabelZ->setEnabled( isUserMode );
-
- SpinBox_X->setEnabled( isUserMode );
- SpinBox_Y->setEnabled( isUserMode );
- SpinBox_Z->setEnabled( isUserMode );
-
- TextLabelDx->setEnabled( isUserMode );
- TextLabelDy->setEnabled( isUserMode );
- TextLabelDz->setEnabled( isUserMode );
-
- SpinBox_Dx->setEnabled( isUserMode );
- SpinBox_Dy->setEnabled( isUserMode );
- SpinBox_Dz->setEnabled( isUserMode );
-
- if ( !isUserMode ) {
-
- double aDx = 0, aDy = 0, aDz = 0;
-
- if ( mode == 1 )
- {
- aDz = 1;
- TextLabelZ->setEnabled( true );
- SpinBox_Z->setEnabled( true );
- SpinBox_Z->setFocus();
- }
- else if ( mode == 2 )
- {
- aDx = 1;
- TextLabelX->setEnabled( true );
- SpinBox_X->setEnabled( true );
- SpinBox_X->setFocus();
- }
- else if ( mode == 3 )
- {
- aDy = 1;
- TextLabelY->setEnabled( true );
- SpinBox_Y->setEnabled( true );
- SpinBox_Y->setFocus();
- }
-
- int aCurPlaneIndex = ComboBoxPlanes->currentIndex();
- OCCViewer_ClipPlane& aPlane = getClipPlane( aCurPlaneIndex );
- if ( aPlane.IsInvert == true ) {
- aDx = -aDx; aDy = -aDy; aDz = -aDz;
- }
-
- myBusy = true;
- SpinBox_Dx->setValue( aDx );
- SpinBox_Dy->setValue( aDy );
- SpinBox_Dz->setValue( aDz );
- myBusy = false;
- }
-
- if ( !myIsUpdatingControls )
- {
- SetCurrentPlaneParam();
- updateClipping();
- }
-}
-
-/*!
- SLOT: called on orientation of clipping plane in relative mode changed
-*/
-void OCCViewer_ClippingDlg::onOrientationRelativeChanged (int theItem)
-{
- if ( clipPlanesCount() == 0 )
- return;
-
- if ( theItem == 0 ) {
- TextLabelRotation1->setText( tr( "ROTATION_AROUND_X_Y2Z" ) );
- TextLabelRotation2->setText( tr( "ROTATION_AROUND_Y_X2Z" ) );
- }
- else if ( theItem == 1 ) {
- TextLabelRotation1->setText( tr( "ROTATION_AROUND_Y_Z2X" ) );
- TextLabelRotation2->setText( tr( "ROTATION_AROUND_Z_Y2X" ) );
- }
- else if ( theItem == 2 ) {
- TextLabelRotation1->setText( tr( "ROTATION_AROUND_Z_X2Y" ) );
- TextLabelRotation2->setText( tr( "ROTATION_AROUND_X_Z2Y" ) );
- }
-
- if ( !myIsUpdatingControls )
- {
- if( (QComboBox*)sender() == CBRelativeOrientation )
- {
- SetCurrentPlaneParam();
- }
-
- updateClipping();
- }
-}
-
-/*!
- SLOT: called on preview check box toggled
-*/
-void OCCViewer_ClippingDlg::onPreview( bool on )
-{
- erasePreview();
- if ( on )
- displayPreview();
-}
-
-/*!
- SLOT: called on Auto Apply check box toggled
-*/
-void OCCViewer_ClippingDlg::onAutoApply( bool toggled )
-{
- if ( toggled ) {
- onApply();
- myModel->update();
- }
-}
-
-/*!
- SLOT on Apply button click: sets cutting plane
-*/
-void OCCViewer_ClippingDlg::onApply()
-{
- if ( myBusy )
- return;
- myIsSelectPlane = true;
-
- qApp->processEvents();
- QApplication::setOverrideCursor( Qt::WaitCursor );
- qApp->processEvents();
-
- myModel->setClipPlanes(myLocalPlanes);
-
- QApplication::restoreOverrideCursor();
- myIsSelectPlane = false;
-}
-
-/*!
- SLOT: Called when clip plane is clicked in viewer.
-*/
-void OCCViewer_ClippingDlg::onPlaneClicked( const Handle(AIS_Plane)& thePlane )
-{
- for ( int aPlaneIt = 0; aPlaneIt < myPreviewPlaneVector.size(); aPlaneIt++ )
- {
- Handle(AIS_Plane)& aPlane = myPreviewPlaneVector.at( aPlaneIt );
- if ( aPlane != thePlane )
- {
- continue;
- }
-
- ComboBoxPlanes->setCurrentIndex( aPlaneIt );
-
- break;
- }
-}
-
-/*!
- SLOT: Called when clip plane is changed by dragging in viewer.
-*/
-void OCCViewer_ClippingDlg::onPlaneDragged( const Handle(AIS_Plane)& thePlane )
-{
- for ( int aPlaneIt = 0; aPlaneIt < myPreviewPlaneVector.size(); aPlaneIt++ )
- {
- Handle(AIS_Plane)& aPlane = myPreviewPlaneVector.at( aPlaneIt );
- if ( aPlane != thePlane )
- {
- continue;
- }
-
- OCCViewer_ClipPlane& aClipPlane = getClipPlane( aPlaneIt );
-
- gp_Pln aPln = thePlane->Component()->Pln();
- const gp_Pnt& aPlaneP = aPln.Location();
- const gp_Dir& aPlaneN = aPln.Axis().Direction();
-
- aClipPlane.X = aPlaneP.X();
- aClipPlane.Y = aPlaneP.Y();
- aClipPlane.Z = aPlaneP.Z();
- aClipPlane.Dx = aPlaneN.X();
- aClipPlane.Dy = aPlaneN.Y();
- aClipPlane.Dz = aPlaneN.Z();
- absolutePlaneToRelative( aClipPlane, myModel->getAISContext(), myModel->trihedronSize() );
-
- myIsUpdatingControls = true;
- updateControls();
- myIsUpdatingControls = false;
-
- if ( AutoApplyCheckBox->isChecked() )
- {
- onApply();
- }
-
- break;
- }
-}
-
-OCCViewer_ClipPlane& OCCViewer_ClippingDlg::getClipPlane( int theIdx )
-{
- return myLocalPlanes[theIdx];
-}
-
-int OCCViewer_ClippingDlg::clipPlanesCount()
+// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE\r
+//\r
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,\r
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS\r
+//\r
+// This library is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU Lesser General Public\r
+// License as published by the Free Software Foundation; either\r
+// version 2.1 of the License, or (at your option) any later version.\r
+//\r
+// This library is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+// Lesser General Public License for more details.\r
+//\r
+// You should have received a copy of the GNU Lesser General Public\r
+// License along with this library; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+//\r
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com\r
+//\r
+\r
+#include "OCCViewer_ClippingDlg.h"\r
+\r
+#include <QtxDoubleSpinBox.h>\r
+#include <QtxDoubleSpinSlider.h>\r
+#include <QtxIntSpinSlider.h>\r
+#include <QtxAction.h>\r
+\r
+#include "SUIT_Session.h"\r
+#include "SUIT_ViewWindow.h"\r
+#include "SUIT_ViewManager.h"\r
+#include "OCCViewer_ClipPlane.h"\r
+#include "OCCViewer_ViewWindow.h"\r
+#include "OCCViewer_ViewPort3d.h"\r
+#include "OCCViewer_ViewModel.h"\r
+#include "OCCViewer_ViewManager.h"\r
+#include "OCCViewer_ClipPlaneInteractor.h"\r
+\r
+#include <V3d_View.hxx>\r
+#include <Visual3d_View.hxx>\r
+#include <Geom_Plane.hxx>\r
+#include <Prs3d_Presentation.hxx>\r
+#include <AIS_ListIteratorOfListOfInteractive.hxx>\r
+#include <AIS_ListOfInteractive.hxx>\r
+#include <AIS_InteractiveObject.hxx>\r
+#include <AIS_InteractiveContext.hxx>\r
+#include <IntAna_IntConicQuad.hxx>\r
+#include <gp_Lin.hxx>\r
+#include <gp_Pln.hxx>\r
+#include <math.h>\r
+\r
+// QT Includes\r
+#include <QApplication>\r
+#include <QGroupBox>\r
+#include <QHBoxLayout>\r
+#include <QVBoxLayout>\r
+#include <QGridLayout>\r
+#include <QLabel>\r
+#include <QPushButton>\r
+#include <QComboBox>\r
+#include <QCheckBox>\r
+#include <QStackedLayout>\r
+#include <QSlider>\r
+#include <QMenu>\r
+\r
+/**********************************************************************************\r
+ ************************ Internal functions ************************\r
+ *********************************************************************************/\r
+\r
+void getMinMaxFromContext( Handle(AIS_InteractiveContext) ic,\r
+ double theDefaultSize,\r
+ double& theXMin,\r
+ double& theYMin,\r
+ double& theZMin,\r
+ double& theXMax,\r
+ double& theYMax,\r
+ double& theZMax) {\r
+\r
+ double aXMin, aYMin, aZMin, aXMax, aYMax, aZMax;\r
+ aXMin = aYMin = aZMin = DBL_MAX;\r
+ aXMax = aYMax = aZMax = -DBL_MAX;\r
+ \r
+ bool isFound = false;\r
+ AIS_ListOfInteractive aList;\r
+ ic->DisplayedObjects( aList );\r
+ for ( AIS_ListIteratorOfListOfInteractive it( aList ); it.More(); it.Next() ) {\r
+ Handle(AIS_InteractiveObject) anObj = it.Value();\r
+ if ( !anObj.IsNull() && anObj->HasPresentation() &&\r
+ !anObj->IsKind( STANDARD_TYPE(AIS_Plane) ) ) {\r
+ Handle(Prs3d_Presentation) aPrs = anObj->Presentation();\r
+ if ( !aPrs->IsEmpty() && !aPrs->IsInfinite() ) {\r
+ isFound = true;\r
+ double xmin, ymin, zmin, xmax, ymax, zmax;\r
+ aPrs->MinMaxValues( xmin, ymin, zmin, xmax, ymax, zmax );\r
+ aXMin = qMin( aXMin, xmin ); aXMax = qMax( aXMax, xmax );\r
+ aYMin = qMin( aYMin, ymin ); aYMax = qMax( aYMax, ymax );\r
+ aZMin = qMin( aZMin, zmin ); aZMax = qMax( aZMax, zmax );\r
+ }\r
+ }\r
+ }\r
+\r
+ if(!isFound) {\r
+ if(theDefaultSize == 0.0)\r
+ theDefaultSize = 100.;\r
+ aXMin = aYMin = aZMin = -theDefaultSize;\r
+ aXMax = aYMax = aZMax = theDefaultSize;\r
+ }\r
+ theXMin = aXMin;theYMin = aYMin;theZMin = aZMin;\r
+ theXMax = aXMax;theYMax = aYMax;theZMax = aZMax;\r
+}\r
+\r
+/*!\r
+ Compute the point of bounding box and current clipping plane\r
+ */\r
+void ComputeBoundsParam( const double theBounds[6],\r
+ const double theDirection[3],\r
+ double theMinPnt[3],\r
+ double& theMaxBoundPrj,\r
+ double& theMinBoundPrj )\r
+{\r
+ double aEnlargeBounds[6];\r
+\r
+ // Enlarge bounds in order to avoid conflicts of precision\r
+ for(int i = 0; i < 6; i += 2)\r
+ {\r
+ static double EPS = 1.0E-3;\r
+ double aDelta = (theBounds[i+1] - theBounds[i])*EPS;\r
+ aEnlargeBounds[i ] = theBounds[i ] - aDelta;\r
+ aEnlargeBounds[i+1] = theBounds[i+1] + aDelta;\r
+ }\r
+\r
+ double aBoundPoints[8][3] = { { aEnlargeBounds[0], aEnlargeBounds[2], aEnlargeBounds[4] },\r
+ { aEnlargeBounds[1], aEnlargeBounds[2], aEnlargeBounds[4] },\r
+ { aEnlargeBounds[0], aEnlargeBounds[3], aEnlargeBounds[4] },\r
+ { aEnlargeBounds[1], aEnlargeBounds[3], aEnlargeBounds[4] },\r
+ { aEnlargeBounds[0], aEnlargeBounds[2], aEnlargeBounds[5] },\r
+ { aEnlargeBounds[1], aEnlargeBounds[2], aEnlargeBounds[5] },\r
+ { aEnlargeBounds[0], aEnlargeBounds[3], aEnlargeBounds[5] },\r
+ { aEnlargeBounds[1], aEnlargeBounds[3], aEnlargeBounds[5] } };\r
+\r
+ int aMaxId = 0;\r
+ theMaxBoundPrj = theDirection[0] * aBoundPoints[aMaxId][0] + theDirection[1] * aBoundPoints[aMaxId][1]\r
+ + theDirection[2] * aBoundPoints[aMaxId][2];\r
+ theMinBoundPrj = theMaxBoundPrj;\r
+ for(int i = 1; i < 8; i++) {\r
+ double aTmp = theDirection[0] * aBoundPoints[i][0] + theDirection[1] * aBoundPoints[i][1]\r
+ + theDirection[2] * aBoundPoints[i][2];\r
+ if(theMaxBoundPrj < aTmp) {\r
+ theMaxBoundPrj = aTmp;\r
+ aMaxId = i;\r
+ }\r
+ if(theMinBoundPrj > aTmp) {\r
+ theMinBoundPrj = aTmp;\r
+ }\r
+ }\r
+ double *aMinPnt = aBoundPoints[aMaxId];\r
+ theMinPnt[0] = aMinPnt[0];\r
+ theMinPnt[1] = aMinPnt[1];\r
+ theMinPnt[2] = aMinPnt[2];\r
+}\r
+\r
+/*!\r
+ Compute the position of current plane by distance\r
+ */\r
+void DistanceToPosition( const double theBounds[6],\r
+ const double theDirection[3],\r
+ const double theDist,\r
+ double thePos[3] )\r
+{\r
+ double aMaxBoundPrj, aMinBoundPrj, aMinPnt[3];\r
+ ComputeBoundsParam( theBounds, theDirection, aMinPnt, aMaxBoundPrj, aMinBoundPrj );\r
+ double aLength = (aMaxBoundPrj - aMinBoundPrj) * theDist;\r
+ thePos[0] = aMinPnt[0] - theDirection[0] * aLength;\r
+ thePos[1] = aMinPnt[1] - theDirection[1] * aLength;\r
+ thePos[2] = aMinPnt[2] - theDirection[2] * aLength;\r
+}\r
+\r
+/*!\r
+ Compute the parameters of clipping plane\r
+ */\r
+bool ComputeClippingPlaneParameters( const Handle(AIS_InteractiveContext)& theIC,\r
+ const double theDefaultSize,\r
+ const double theNormal[3],\r
+ const double theDist,\r
+ double theOrigin[3] )\r
+{\r
+ double aBounds[6] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };\r
+\r
+ getMinMaxFromContext( theIC, theDefaultSize, aBounds[0], aBounds[2], aBounds[4], aBounds[1], aBounds[3], aBounds[5] );\r
+\r
+ DistanceToPosition( aBounds, theNormal, theDist, theOrigin );\r
+ return true;\r
+}\r
+\r
+/*!\r
+ \brief Converts relative plane parameters to absolute.\r
+ \param theIC [in] the interactive context.\r
+ \param theDefaultSize [in] the default trihedron size.\r
+ \param theDistance [in] the plane distance relative to minimum corner of model boundaries.\r
+ \param theDX [in] x component of plane direction.\r
+ \param theDY [in] y component of plane direction.\r
+ \param theDZ [in] z component of plane direction.\r
+ \param theX [out] x coordinate of plane origin.\r
+ \param theY [out] y coordinate of plane origin.\r
+ \param theZ [out] z coordinate of plane origin.\r
+ */\r
+bool DistanceToXYZ ( const Handle(AIS_InteractiveContext)& theIC,\r
+ const double theDefaultSize,\r
+ const double theDistance,\r
+ const double theDX,\r
+ const double theDY,\r
+ const double theDZ,\r
+ double& theX,\r
+ double& theY,\r
+ double& theZ )\r
+{\r
+ double aNormal[3] = { theDX, theDY, theDZ };\r
+ double anOrigin[3] = { 0.0, 0.0, 0.0 };\r
+\r
+ bool anIsOk = ComputeClippingPlaneParameters( theIC, theDefaultSize, aNormal, theDistance, anOrigin );\r
+\r
+ if( !anIsOk )\r
+ {\r
+ return false;\r
+ }\r
+\r
+ theX = anOrigin[0];\r
+ theY = anOrigin[1];\r
+ theZ = anOrigin[2];\r
+\r
+ return true;\r
+}\r
+\r
+/*!\r
+ \brief Converts absolute position and direction to bounding box distance.\r
+ \param theIC [in] the interactive context.\r
+ \param theDefaultSize [in] the default trihedron size.\r
+ \param theX [in] x coordinate of plane origin.\r
+ \param theY [in] y coordinate of plane origin.\r
+ \param theZ [in] z coordinate of plane origin.\r
+ \param theDX [in] x component of plane direction.\r
+ \param theDY [in] y component of plane direction.\r
+ \param theDZ [in] z component of plane direction.\r
+ \param theDistance [out] the plane distance relative to minimum corner of model boundaries.\r
+ */\r
+void XYZToDistance ( const Handle(AIS_InteractiveContext)& theIC,\r
+ const double theDefaultSize,\r
+ const double theX,\r
+ const double theY,\r
+ const double theZ,\r
+ const double theDX,\r
+ const double theDY,\r
+ const double theDZ,\r
+ double& theDistance )\r
+{\r
+ gp_Pnt aPlaneP( theX, theY, theZ );\r
+ gp_Dir aPlaneN( theDX, theDY, theDZ );\r
+\r
+ double aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;\r
+\r
+ getMinMaxFromContext( theIC, theDefaultSize, aXmin, aYmin, aZmin, aXmax, aYmax, aZmax );\r
+\r
+ Bnd_Box aMinMax;\r
+ aMinMax.Update( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax );\r
+\r
+ gp_Trsf aRelativeTransform;\r
+ aRelativeTransform.SetTransformation( gp_Ax3(), gp_Ax3( aPlaneP, aPlaneN ) );\r
+ Bnd_Box aRelativeBounds = aMinMax.Transformed( aRelativeTransform );\r
+\r
+ aRelativeBounds.Get( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax );\r
+\r
+ double aLength = aZmax - aZmin;\r
+ double aDistance = aZmax;\r
+\r
+ double aRelativeDistance = aLength > 0.01 ? aDistance / aLength : 0.0;\r
+ aRelativeDistance = qMin( aRelativeDistance, aLength );\r
+ aRelativeDistance = qMax( aRelativeDistance, 0.0 );\r
+ theDistance = aRelativeDistance;\r
+}\r
+\r
+/*!\r
+ Compute clipping plane size base point and normal\r
+ */\r
+\r
+void clipPlaneParams(OCCViewer_ClipPlane& theClipPlane, Handle(AIS_InteractiveContext) theContext,\r
+ double& theSize, gp_Pnt& theBasePnt, gp_Dir& theNormal, double defaultSize) {\r
+ double aXMin, aYMin, aZMin, aXMax, aYMax, aZMax;\r
+ aXMin = aYMin = aZMin = DBL_MAX;\r
+ aXMax = aYMax = aZMax = -DBL_MAX;\r
+ \r
+ getMinMaxFromContext(theContext,defaultSize,aXMin, aYMin, aZMin, aXMax, aYMax, aZMax);\r
+ double aSize = 50;\r
+\r
+ double aNormalX = 0.0;\r
+ double aNormalY = 0.0;\r
+ double aNormalZ = 0.0;\r
+ theClipPlane.OrientationToXYZ( aNormalX, aNormalY, aNormalZ );\r
+ gp_Pnt aBasePnt( theClipPlane.X, theClipPlane.Y, theClipPlane.Z );\r
+ gp_Dir aNormal( aNormalX, aNormalY, aNormalZ );\r
+\r
+ // compute clipping plane size\r
+ gp_Pnt aCenter = gp_Pnt( ( aXMin + aXMax ) / 2, ( aYMin + aYMax ) / 2, ( aZMin + aZMax ) / 2 );\r
+ double aDiag = aCenter.Distance( gp_Pnt( aXMax, aYMax, aZMax ) )*2;\r
+ aSize = aDiag * 1.1;\r
+ \r
+ // compute clipping plane center ( redefine the base point )\r
+ IntAna_IntConicQuad intersector = IntAna_IntConicQuad();\r
+ \r
+ intersector.Perform( gp_Lin( aCenter, aNormal), gp_Pln( aBasePnt, aNormal), Precision::Confusion() );\r
+\r
+ if ( intersector.IsDone() && intersector.NbPoints() == 1 )\r
+ aBasePnt = intersector.Point( 1 );\r
+ \r
+ theSize = aSize;\r
+ theBasePnt = aBasePnt;\r
+ theNormal = aNormal;\r
+}\r
+\r
+\r
+/*********************************************************************************\r
+ ********************* class OCCViewer_ClippingDlg *********************\r
+ *********************************************************************************/\r
+/*!\r
+ Constructor\r
+ \param view - view window\r
+ \param parent - parent widget\r
+*/\r
+OCCViewer_ClippingDlg::OCCViewer_ClippingDlg(OCCViewer_ViewWindow* parent , OCCViewer_Viewer* model)\r
+ : QDialog( parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint )\r
+{\r
+ setObjectName( "OCCViewer_ClippingDlg" );\r
+ setModal( false );\r
+\r
+ setWindowTitle( tr( "Clipping" ) );\r
+\r
+ setAttribute (Qt::WA_DeleteOnClose, true);\r
+ \r
+ QVBoxLayout* topLayout = new QVBoxLayout( this );\r
+ topLayout->setMargin( 11 ); topLayout->setSpacing( 6 );\r
+\r
+ /***************************************************************/\r
+ // Controls for selecting, creating, deleting planes\r
+ QGroupBox* GroupPlanes = new QGroupBox( tr("CLIPPING_PLANES"), this );\r
+ QHBoxLayout* GroupPlanesLayout = new QHBoxLayout( GroupPlanes );\r
+ ComboBoxPlanes = new QComboBox( GroupPlanes );\r
+ isActivePlane = new QCheckBox( tr("IS_ACTIVE_PLANE"), this );\r
+ buttonNew = new QPushButton( tr("BTN_NEW"), GroupPlanes );\r
+ buttonDelete = new QPushButton( tr("BTN_DELETE"), GroupPlanes );\r
+ buttonDisableAll = new QPushButton( tr("BTN_DISABLE_ALL"), GroupPlanes );\r
+ MenuMode = new QMenu( "MenuMode", buttonNew );\r
+ MenuMode->addAction( tr( "ABSOLUTE" ), this, SLOT( onModeAbsolute() ) );\r
+ MenuMode->addAction( tr( "RELATIVE" ), this, SLOT( onModeRelative() ) );\r
+ buttonNew->setMenu( MenuMode );\r
+\r
+ GroupPlanesLayout->addWidget( ComboBoxPlanes );\r
+ GroupPlanesLayout->addWidget( isActivePlane );\r
+ GroupPlanesLayout->addWidget( buttonNew );\r
+ GroupPlanesLayout->addWidget( buttonDelete );\r
+ GroupPlanesLayout->addWidget( buttonDisableAll );\r
+\r
+ ModeStackedLayout = new QStackedLayout();\r
+\r
+ /********************** Mode Absolute **********************/\r
+ /* Controls for absolute mode of clipping plane:\r
+ X, Y, Z - coordinates of the intersection of cutting plane and the three axes\r
+ Dx, Dy, Dz - components of normal to the cutting plane\r
+ Orientation - direction of cutting plane\r
+ */\r
+ const double min = -1e+7;\r
+ const double max = 1e+7;\r
+ const double step = 5;\r
+ const int precision = -7;\r
+\r
+ // Croup Point\r
+ QGroupBox* GroupAbsolutePoint = new QGroupBox( this );\r
+ GroupAbsolutePoint->setObjectName( "GroupPoint" );\r
+ GroupAbsolutePoint->setTitle( tr("BASE_POINT") );\r
+ QGridLayout* GroupPointLayout = new QGridLayout( GroupAbsolutePoint );\r
+ GroupPointLayout->setAlignment( Qt::AlignTop );\r
+ GroupPointLayout->setSpacing( 6 ); GroupPointLayout->setMargin( 11 );\r
+\r
+ TextLabelX = new QLabel( GroupAbsolutePoint );\r
+ TextLabelX->setObjectName( "TextLabelX" );\r
+ TextLabelX->setText( tr("X:") );\r
+ GroupPointLayout->addWidget( TextLabelX, 0, 0 );\r
+ \r
+ SpinBox_X = new QtxDoubleSpinBox( min, max, step, GroupAbsolutePoint );\r
+ SpinBox_X->setObjectName("SpinBox_X" );\r
+ SpinBox_X->setPrecision( precision );\r
+ GroupPointLayout->addWidget( SpinBox_X, 0, 1 );\r
+\r
+ TextLabelY = new QLabel( GroupAbsolutePoint );\r
+ TextLabelY->setObjectName( "TextLabelY" );\r
+ TextLabelY->setText( tr("Y:") );\r
+ GroupPointLayout->addWidget( TextLabelY, 0, 2 );\r
+\r
+ SpinBox_Y = new QtxDoubleSpinBox( min, max, step, GroupAbsolutePoint );\r
+ SpinBox_Y->setObjectName("SpinBox_Y" );\r
+ SpinBox_Y->setPrecision( precision );\r
+ GroupPointLayout->addWidget( SpinBox_Y, 0, 3 );\r
+\r
+ TextLabelZ = new QLabel( GroupAbsolutePoint );\r
+ TextLabelZ->setObjectName( "TextLabelZ" );\r
+ TextLabelZ->setText( tr("Z:") );\r
+ GroupPointLayout->addWidget( TextLabelZ, 0, 4 );\r
+\r
+ SpinBox_Z = new QtxDoubleSpinBox( min, max, step, GroupAbsolutePoint );\r
+ SpinBox_Z->setObjectName("SpinBox_Z" );\r
+ SpinBox_Z->setPrecision( precision );\r
+ GroupPointLayout->addWidget( SpinBox_Z, 0, 5 );\r
+\r
+ resetButton = new QPushButton( GroupAbsolutePoint );\r
+ resetButton->setObjectName( "resetButton" );\r
+ resetButton->setText( tr( "RESET" ) );\r
+ GroupPointLayout->addWidget( resetButton, 0, 6 );\r
+\r
+ // Group Direction\r
+ GroupAbsoluteDirection = new QGroupBox( this );\r
+ GroupAbsoluteDirection->setObjectName( "GroupDirection" );\r
+ GroupAbsoluteDirection->setTitle( tr("DIRECTION") );\r
+ QGridLayout* GroupDirectionLayout = new QGridLayout( GroupAbsoluteDirection );\r
+ GroupDirectionLayout->setAlignment( Qt::AlignTop );\r
+ GroupDirectionLayout->setSpacing( 6 );\r
+ GroupDirectionLayout->setMargin( 11 );\r
+ \r
+ TextLabelDx = new QLabel( GroupAbsoluteDirection );\r
+ TextLabelDx->setObjectName( "TextLabelDx" );\r
+ TextLabelDx->setText( tr("Dx:") );\r
+ GroupDirectionLayout->addWidget( TextLabelDx, 0, 0 );\r
+ \r
+ SpinBox_Dx = new QtxDoubleSpinBox( min, max, step, GroupAbsoluteDirection );\r
+ SpinBox_Dx->setObjectName("SpinBox_Dx" );\r
+ SpinBox_Dx->setPrecision( precision );\r
+ GroupDirectionLayout->addWidget( SpinBox_Dx, 0, 1 );\r
+\r
+ TextLabelDy = new QLabel( GroupAbsoluteDirection );\r
+ TextLabelDy->setObjectName( "TextLabelDy" );\r
+ TextLabelDy->setText( tr("Dy:") );\r
+ GroupDirectionLayout->addWidget( TextLabelDy, 0, 2 );\r
+ \r
+ SpinBox_Dy = new QtxDoubleSpinBox( min, max, step, GroupAbsoluteDirection );\r
+ SpinBox_Dy->setObjectName("SpinBox_Dy" );\r
+ SpinBox_Dy->setPrecision( precision );\r
+ GroupDirectionLayout->addWidget( SpinBox_Dy, 0, 3 );\r
+\r
+ TextLabelDz = new QLabel( GroupAbsoluteDirection );\r
+ TextLabelDz->setObjectName( "TextLabelDz" );\r
+ TextLabelDz->setText( tr("Dz:") );\r
+ GroupDirectionLayout->addWidget( TextLabelDz, 0, 4 );\r
+ \r
+ SpinBox_Dz = new QtxDoubleSpinBox( min, max, step, GroupAbsoluteDirection );\r
+ SpinBox_Dz->setObjectName("SpinBox_Dz" );\r
+ SpinBox_Dz->setPrecision( precision );\r
+ GroupDirectionLayout->addWidget( SpinBox_Dz, 0, 5 );\r
+\r
+ invertButton = new QPushButton( GroupAbsoluteDirection );\r
+ invertButton->setObjectName( "invertButton" );\r
+ invertButton->setText( tr( "INVERT" ) );\r
+ GroupDirectionLayout->addWidget( invertButton, 0, 6 );\r
+ \r
+ CBAbsoluteOrientation = new QComboBox( GroupAbsoluteDirection );\r
+ CBAbsoluteOrientation->setObjectName( "AbsoluteOrientation" );\r
+ CBAbsoluteOrientation->insertItem( CBAbsoluteOrientation->count(), tr( "CUSTOM" ) );\r
+ CBAbsoluteOrientation->insertItem( CBAbsoluteOrientation->count(), tr( "||X-Y" ) );\r
+ CBAbsoluteOrientation->insertItem( CBAbsoluteOrientation->count(), tr( "||Y-Z" ) );\r
+ CBAbsoluteOrientation->insertItem( CBAbsoluteOrientation->count(), tr( "||Z-X" ) );\r
+ GroupDirectionLayout->addWidget( CBAbsoluteOrientation, 1, 0, 1, 6 );\r
+\r
+ QVBoxLayout* ModeActiveLayout = new QVBoxLayout();\r
+ ModeActiveLayout->setMargin( 11 ); ModeActiveLayout->setSpacing( 6 );\r
+ ModeActiveLayout->addWidget( GroupAbsolutePoint );\r
+ ModeActiveLayout->addWidget( GroupAbsoluteDirection );\r
+\r
+ QWidget* ModeActiveWidget = new QWidget( this );\r
+ ModeActiveWidget->setLayout( ModeActiveLayout );\r
+\r
+ /********************** Mode Relative **********************/\r
+ /* Controls for relative mode of clipping plane:\r
+ Distance - Value from 0 to 1.\r
+ Specifies the distance from the minimum value in a given direction of bounding box to the current position\r
+ Rotation1, Rotation2 - turn angles of cutting plane in given directions\r
+ Orientation - direction of cutting plane\r
+ */\r
+ QGroupBox* GroupParameters = new QGroupBox( tr("PARAMETERS"), this );\r
+ QGridLayout* GroupParametersLayout = new QGridLayout( GroupParameters );\r
+ GroupParametersLayout->setMargin( 11 ); GroupParametersLayout->setSpacing( 6 );\r
+\r
+ TextLabelOrientation = new QLabel( tr("ORIENTATION"), GroupParameters);\r
+ TextLabelOrientation->setObjectName( "TextLabelOrientation" );\r
+ GroupParametersLayout->addWidget( TextLabelOrientation, 0, 0 );\r
+\r
+ CBRelativeOrientation = new QComboBox(GroupParameters);\r
+ CBRelativeOrientation->setObjectName( "RelativeOrientation" );\r
+ CBRelativeOrientation->addItem( tr("ALONG_XY") );\r
+ CBRelativeOrientation->addItem( tr("ALONG_YZ") );\r
+ CBRelativeOrientation->addItem( tr("ALONG_ZX") );\r
+ GroupParametersLayout->addWidget( CBRelativeOrientation, 0, 1 );\r
+\r
+ TextLabelDistance = new QLabel( tr("DISTANCE"), GroupParameters );\r
+ TextLabelDistance->setObjectName( "TextLabelDistance" );\r
+ GroupParametersLayout->addWidget( TextLabelDistance, 1, 0 );\r
+ \r
+ SpinSliderDistance = new QtxDoubleSpinSlider( 0., 1., 0.01, GroupParameters );\r
+ SpinSliderDistance->setObjectName( "SpinSliderDistance" );\r
+ SpinSliderDistance->setPrecision( precision );\r
+ QFont fnt = SpinSliderDistance->font(); fnt.setBold( true ); SpinSliderDistance->setFont( fnt );\r
+ GroupParametersLayout->addWidget( SpinSliderDistance, 1, 1 );\r
+\r
+ QString aUnitRot = "\xB0";\r
+\r
+ TextLabelRotation1 = new QLabel( tr("ROTATION_AROUND_X_Y2Z"), GroupParameters );\r
+ TextLabelRotation1->setObjectName( "TextLabelRotation1" );\r
+ GroupParametersLayout->addWidget( TextLabelRotation1, 2, 0 );\r
+ \r
+ SpinSliderRotation1 = new QtxIntSpinSlider( -180, 180, 1, GroupParameters );\r
+ SpinSliderRotation1->setObjectName( "SpinSliderRotation1" );\r
+ SpinSliderRotation1->setUnit( aUnitRot );\r
+ SpinSliderRotation1->setFont( fnt );\r
+ GroupParametersLayout->addWidget( SpinSliderRotation1, 2, 1 );\r
+\r
+ TextLabelRotation2 = new QLabel(tr("ROTATION_AROUND_Y_X2Z"), GroupParameters);\r
+ TextLabelRotation2->setObjectName( "TextLabelRotation2" );\r
+ TextLabelRotation2->setObjectName( "TextLabelRotation2" );\r
+ GroupParametersLayout->addWidget( TextLabelRotation2, 3, 0 );\r
+\r
+ SpinSliderRotation2 = new QtxIntSpinSlider( -180, 180, 1, GroupParameters );\r
+ SpinSliderRotation2->setObjectName( "SpinSliderRotation2" );\r
+ SpinSliderRotation2->setUnit( aUnitRot );\r
+ SpinSliderRotation2->setFont( fnt );\r
+ GroupParametersLayout->addWidget( SpinSliderRotation2, 3, 1 );\r
+\r
+ /***************************************************************/\r
+ QGroupBox* CheckBoxWidget = new QGroupBox( this );\r
+ QHBoxLayout* CheckBoxLayout = new QHBoxLayout( CheckBoxWidget );\r
+ \r
+ PreviewCheckBox = new QCheckBox( tr("PREVIEW"), CheckBoxWidget );\r
+ PreviewCheckBox->setObjectName( "PreviewCheckBox" );\r
+ PreviewCheckBox->setChecked( true );\r
+ CheckBoxLayout->addWidget( PreviewCheckBox, 0, Qt::AlignCenter );\r
+ \r
+ AutoApplyCheckBox = new QCheckBox( tr("AUTO_APPLY"), CheckBoxWidget );\r
+ AutoApplyCheckBox->setObjectName( "AutoApplyCheckBox" );\r
+ CheckBoxLayout->addWidget( AutoApplyCheckBox, 0, Qt::AlignCenter );\r
+\r
+ /***************************************************************/\r
+ QGroupBox* GroupButtons = new QGroupBox( this );\r
+ QHBoxLayout* GroupButtonsLayout = new QHBoxLayout( GroupButtons );\r
+ GroupButtonsLayout->setAlignment( Qt::AlignTop );\r
+ GroupButtonsLayout->setMargin( 11 ); GroupButtonsLayout->setSpacing( 6 );\r
+ \r
+ buttonOk = new QPushButton( GroupButtons );\r
+ buttonOk->setObjectName( "buttonOk" );\r
+ buttonOk->setText( tr( "BUT_APPLY_AND_CLOSE" ) );\r
+ buttonOk->setAutoDefault( TRUE );\r
+ buttonOk->setDefault( TRUE );\r
+ GroupButtonsLayout->addWidget( buttonOk );\r
+\r
+ buttonApply = new QPushButton( GroupButtons );\r
+ buttonApply->setObjectName( "buttonApply" );\r
+ buttonApply->setText( tr( "BUT_APPLY" ) );\r
+ buttonApply->setAutoDefault( TRUE );\r
+ buttonApply->setDefault( TRUE );\r
+ GroupButtonsLayout->addWidget( buttonApply );\r
+\r
+ GroupButtonsLayout->addStretch();\r
+ \r
+ buttonClose = new QPushButton( GroupButtons );\r
+ buttonClose->setObjectName( "buttonClose" );\r
+ buttonClose->setText( tr( "BUT_CLOSE" ) );\r
+ buttonClose->setAutoDefault( TRUE );\r
+ GroupButtonsLayout->addWidget( buttonClose );\r
+\r
+ QPushButton* buttonHelp = new QPushButton( tr( "SMESH_BUT_HELP" ), GroupButtons );\r
+ buttonHelp->setAutoDefault( TRUE );\r
+ GroupButtonsLayout->addWidget( buttonHelp );\r
+\r
+ /***************************************************************/\r
+ ModeStackedLayout->addWidget( ModeActiveWidget );\r
+ ModeStackedLayout->addWidget( GroupParameters );\r
+\r
+ topLayout->addWidget( GroupPlanes );\r
+ topLayout->addLayout( ModeStackedLayout );\r
+ topLayout->addWidget( CheckBoxWidget );\r
+ topLayout->addWidget( GroupButtons );\r
+\r
+ this->setLayout( topLayout );\r
+\r
+ // Initializations\r
+ initParam();\r
+\r
+ // Signals and slots connections\r
+ connect( ComboBoxPlanes, SIGNAL( activated( int ) ), this, SLOT( onSelectPlane( int ) ) );\r
+ connect( isActivePlane, SIGNAL ( toggled ( bool ) ), this, SLOT( onValueChanged() ) );\r
+ connect( buttonNew, SIGNAL( clicked() ), buttonNew, SLOT( showMenu() ) );\r
+ connect( buttonDelete, SIGNAL( clicked() ), this, SLOT( ClickOnDelete() ) );\r
+ connect( buttonDisableAll, SIGNAL( clicked() ), this, SLOT( ClickOnDisableAll() ) );\r
+\r
+ connect( resetButton, SIGNAL (clicked() ), this, SLOT( onReset() ) );\r
+ connect( invertButton, SIGNAL (clicked() ), this, SLOT( onInvert() ) ) ;\r
+ connect( SpinBox_X, SIGNAL ( valueChanged( double ) ), this, SLOT( onValueChanged() ) );\r
+ connect( SpinBox_Y, SIGNAL ( valueChanged( double ) ), this, SLOT( onValueChanged() ) );\r
+ connect( SpinBox_Z, SIGNAL ( valueChanged( double ) ), this, SLOT( onValueChanged() ) );\r
+ connect( SpinBox_Dx, SIGNAL ( valueChanged( double ) ), this, SLOT( onValueChanged() ) );\r
+ connect( SpinBox_Dy, SIGNAL ( valueChanged( double ) ), this, SLOT( onValueChanged() ) );\r
+ connect( SpinBox_Dz, SIGNAL ( valueChanged( double ) ), this, SLOT( onValueChanged() ) );\r
+ connect( CBAbsoluteOrientation, SIGNAL ( activated ( int ) ), this, SLOT( onOrientationAbsoluteChanged( int ) ) ) ;\r
+\r
+ connect( CBRelativeOrientation, SIGNAL( activated( int ) ), this, SLOT( onOrientationRelativeChanged( int ) ) );\r
+ connect( SpinSliderDistance, SIGNAL( valueChanged( double ) ), this, SLOT( onValueChanged() ) );\r
+ connect( SpinSliderRotation1, SIGNAL( valueChanged( int ) ), this, SLOT( onValueChanged() ) );\r
+ connect( SpinSliderRotation2, SIGNAL( valueChanged( int ) ), this, SLOT( onValueChanged() ) );\r
+\r
+ connect( PreviewCheckBox, SIGNAL ( toggled ( bool ) ), this, SLOT( onPreview( bool ) ) ) ;\r
+ connect( AutoApplyCheckBox, SIGNAL ( toggled( bool ) ), this, SLOT( onAutoApply( bool ) ) );\r
+ \r
+ connect( buttonClose, SIGNAL( clicked() ), this, SLOT( ClickOnClose() ) ) ;\r
+ connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );\r
+ connect( buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );\r
+ connect( buttonHelp, SIGNAL( clicked() ), this, SLOT( ClickOnHelp() ) );\r
+\r
+ myBusy = false;\r
+ myIsSelectPlane = false;\r
+ myIsPlaneCreation = false;\r
+ myIsUpdatingControls = false;\r
+ myModel = model;\r
+\r
+ myModel->getViewer3d()->InitActiveViews();\r
+\r
+ OCCViewer_ViewManager* aViewMgr = (OCCViewer_ViewManager*) myModel->getViewManager();\r
+ myInteractor = new OCCViewer_ClipPlaneInteractor( aViewMgr, this );\r
+ connect( myInteractor, SIGNAL( planeClicked( const Handle_AIS_Plane& ) ), SLOT( onPlaneClicked( const Handle_AIS_Plane& ) ) );\r
+ connect( myInteractor, SIGNAL( planeDragged( const Handle_AIS_Plane& ) ), SLOT( onPlaneDragged( const Handle_AIS_Plane& ) ) );\r
+\r
+ myLocalPlanes = myModel->getClipPlanes();\r
+ synchronize();\r
+}\r
+\r
+/*!\r
+ Destructor\r
+ Destroys the object and frees any allocated resources\r
+*/\r
+OCCViewer_ClippingDlg::~OCCViewer_ClippingDlg()\r
+{\r
+ myLocalPlanes.clear();\r
+}\r
+\r
+/*!\r
+ Custom handling of close event: erases preview\r
+*/\r
+void OCCViewer_ClippingDlg::closeEvent( QCloseEvent* e )\r
+{\r
+ erasePreview();\r
+ QDialog::closeEvent( e );\r
+ OCCViewer_ViewWindow* v = qobject_cast<OCCViewer_ViewWindow*>(parent());\r
+ if(v)\r
+ v->onClipping(false);\r
+}\r
+\r
+/*!\r
+ Custom handling of show event: displays preview\r
+*/\r
+void OCCViewer_ClippingDlg::showEvent( QShowEvent* e )\r
+{\r
+ QDialog::showEvent( e );\r
+ onPreview( PreviewCheckBox->isChecked() );\r
+}\r
+\r
+/*!\r
+ Custom handling of hide event: erases preview\r
+*/\r
+void OCCViewer_ClippingDlg::hideEvent( QHideEvent* e )\r
+{\r
+ erasePreview();\r
+ QDialog::hideEvent( e );\r
+ OCCViewer_ViewWindow* v = qobject_cast<OCCViewer_ViewWindow*>(parent());\r
+ if(v)\r
+ v->onClipping(false);\r
+\r
+}\r
+\r
+/*!\r
+ Initialization of initial values of widgets\r
+*/\r
+void OCCViewer_ClippingDlg::initParam()\r
+{\r
+ SpinBox_X->setValue( 0.0 );\r
+ SpinBox_Y->setValue( 0.0 );\r
+ SpinBox_Z->setValue( 0.0 );\r
+\r
+ SpinBox_Dx->setValue( 1.0 );\r
+ SpinBox_Dy->setValue( 1.0 );\r
+ SpinBox_Dz->setValue( 1.0 );\r
+\r
+ CBAbsoluteOrientation->setCurrentIndex(0);\r
+\r
+ SpinSliderDistance->setValue( 0.5 );\r
+ SpinSliderRotation1->setValue( 0 );\r
+ SpinSliderRotation2->setValue( 0 );\r
+ CBRelativeOrientation->setCurrentIndex( 0 );\r
+\r
+ isActivePlane->setChecked( true );\r
+}\r
+\r
+/*!\r
+ Set plane parameters from widgets.\r
+*/\r
+void OCCViewer_ClippingDlg::setPlaneParam( OCCViewer_ClipPlane& thePlane )\r
+{\r
+ OCCViewer_ClipPlane::PlaneMode aMode = currentPlaneMode();\r
+\r
+ thePlane.Mode = aMode;\r
+\r
+ if ( aMode == OCCViewer_ClipPlane::Absolute )\r
+ {\r
+ if( qFuzzyIsNull( SpinBox_Dx->value() ) && \r
+ qFuzzyIsNull( SpinBox_Dy->value() ) && \r
+ qFuzzyIsNull( SpinBox_Dz->value() ) ) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ thePlane.OrientationType = (aMode == OCCViewer_ClipPlane::Absolute)\r
+ ? CBAbsoluteOrientation->currentIndex()\r
+ : CBRelativeOrientation->currentIndex();\r
+\r
+ // Get XYZ, DXYZ\r
+ if ( aMode == OCCViewer_ClipPlane::Absolute )\r
+ {\r
+ if ( thePlane.OrientationType == OCCViewer_ClipPlane::AbsoluteCustom )\r
+ {\r
+ thePlane.AbsoluteOrientation.Dx = SpinBox_Dx->value();\r
+ thePlane.AbsoluteOrientation.Dy = SpinBox_Dy->value();\r
+ thePlane.AbsoluteOrientation.Dz = SpinBox_Dz->value();\r
+ }\r
+ else\r
+ {\r
+ thePlane.AbsoluteOrientation.IsInvert = SpinBox_Dx->value() < 0.0\r
+ || SpinBox_Dy->value() < 0.0\r
+ || SpinBox_Dz->value() < 0.0;\r
+ }\r
+\r
+ thePlane.X = SpinBox_X->value();\r
+ thePlane.Y = SpinBox_Y->value();\r
+ thePlane.Z = SpinBox_Z->value();\r
+ }\r
+ else\r
+ {\r
+ thePlane.RelativeOrientation.Rotation1 = SpinSliderRotation1->value();\r
+ thePlane.RelativeOrientation.Rotation2 = SpinSliderRotation2->value();\r
+\r
+ double aPlaneDx = 0.0;\r
+ double aPlaneDy = 0.0;\r
+ double aPlaneDz = 0.0;\r
+ double aX = 0.0;\r
+ double aY = 0.0;\r
+ double aZ = 0.0;\r
+\r
+ OCCViewer_ClipPlane::RelativeToDXYZ( thePlane.OrientationType,\r
+ thePlane.RelativeOrientation.Rotation1,\r
+ thePlane.RelativeOrientation.Rotation2,\r
+ aPlaneDx, aPlaneDy, aPlaneDz );\r
+\r
+ DistanceToXYZ( myModel->getAISContext(),\r
+ myModel->trihedronSize(),\r
+ SpinSliderDistance->value(),\r
+ aPlaneDx, aPlaneDy, aPlaneDz,\r
+ aX, aY, aZ );\r
+\r
+ thePlane.X = aX;\r
+ thePlane.Y = aY;\r
+ thePlane.Z = aZ;\r
+ }\r
+\r
+ thePlane.IsOn = isActivePlane->isChecked();\r
+}\r
+\r
+/*!\r
+ Synchronize dialog's widgets with data\r
+*/\r
+void OCCViewer_ClippingDlg::synchronize()\r
+{\r
+ ComboBoxPlanes->clear();\r
+ int aNbPlanesAbsolute = myLocalPlanes.size();\r
+\r
+ QString aName;\r
+ for(int i = 1; i<=aNbPlanesAbsolute; i++ ) {\r
+ aName = QString("Plane %1").arg(i);\r
+ ComboBoxPlanes->addItem( aName );\r
+ }\r
+\r
+ int aPos = ComboBoxPlanes->count() - 1;\r
+ ComboBoxPlanes->setCurrentIndex( aPos );\r
+\r
+ bool anIsControlsEnable = ( aPos >= 0 );\r
+ if ( anIsControlsEnable ) {\r
+ onSelectPlane( aPos );\r
+ }\r
+ else {\r
+ ComboBoxPlanes->addItem( tr( "NO_PLANES" ) );\r
+ initParam();\r
+ }\r
+ if ( currentPlaneMode() == OCCViewer_ClipPlane::Absolute )\r
+ {\r
+ SpinBox_X->setEnabled( anIsControlsEnable );\r
+ SpinBox_Y->setEnabled( anIsControlsEnable );\r
+ SpinBox_Z->setEnabled( anIsControlsEnable );\r
+ SpinBox_Dx->setEnabled( anIsControlsEnable );\r
+ SpinBox_Dy->setEnabled( anIsControlsEnable );\r
+ SpinBox_Dz->setEnabled( anIsControlsEnable );\r
+ CBAbsoluteOrientation->setEnabled( anIsControlsEnable );\r
+ invertButton->setEnabled( anIsControlsEnable );\r
+ resetButton->setEnabled( anIsControlsEnable );\r
+ }\r
+ else if ( currentPlaneMode() == OCCViewer_ClipPlane::Relative )\r
+ {\r
+ CBRelativeOrientation->setEnabled( anIsControlsEnable );\r
+ SpinSliderDistance->setEnabled( anIsControlsEnable );\r
+ SpinSliderRotation1->setEnabled( anIsControlsEnable );\r
+ SpinSliderRotation2->setEnabled( anIsControlsEnable );\r
+ isActivePlane->setEnabled( anIsControlsEnable );\r
+ }\r
+ isActivePlane->setEnabled( anIsControlsEnable );\r
+}\r
+\r
+/*!\r
+ Displays preview of clipping plane\r
+*/\r
+void OCCViewer_ClippingDlg::displayPreview()\r
+{\r
+ if ( myBusy || !isValid() || !myModel)\r
+ return;\r
+\r
+ Handle(AIS_InteractiveContext) ic = myModel->getAISContext();\r
+ \r
+ int aCurPlaneIndex = ComboBoxPlanes->currentIndex();\r
+\r
+ for ( int i=0; i < clipPlanesCount(); i++ ) {\r
+ OCCViewer_ClipPlane& aClipPlane = getClipPlane(i);\r
+ if ( aClipPlane.IsOn ) {\r
+ Handle(AIS_Plane) myPreviewPlane;\r
+ double aSize;\r
+ gp_Pnt aBasePnt;\r
+ gp_Dir aNormal;\r
+ clipPlaneParams(aClipPlane, ic, aSize, aBasePnt, aNormal, myModel->trihedronSize());\r
+ myPreviewPlane = new AIS_Plane( new Geom_Plane( aBasePnt, aNormal ), aBasePnt );\r
+ myPreviewPlane->SetTypeOfSensitivity( Select3D_TOS_INTERIOR );\r
+ myPreviewPlane->SetSize( aSize, aSize );\r
+ ic->SetWidth( myPreviewPlane, 10, false );\r
+ ic->SetMaterial( myPreviewPlane, Graphic3d_NOM_PLASTIC, false );\r
+ ic->SetTransparency( myPreviewPlane, 0.5, false );\r
+ Quantity_Color c = (aCurPlaneIndex == i) ? Quantity_Color( 255. / 255., 70. / 255., 0. / 255., Quantity_TOC_RGB ) : Quantity_Color( 85 / 255., 85 / 255., 255 / 255., Quantity_TOC_RGB );\r
+ ic->SetColor( myPreviewPlane, c , false );\r
+ ic->Display( myPreviewPlane, 1, 0, false );\r
+ myPreviewPlaneVector.push_back( myPreviewPlane );\r
+ }\r
+ }\r
+ myModel->update();\r
+\r
+ double aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;\r
+ getMinMaxFromContext( ic, myModel->trihedronSize(), aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);\r
+ gp_Pnt aRotationCenter( (aXmax + aXmin) * 0.5,\r
+ (aYmax + aYmin) * 0.5,\r
+ (aZmax + aZmin) * 0.5 );\r
+ Bnd_Box aMinMax;\r
+ aMinMax.Update( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax );\r
+\r
+ myInteractor->setPlanes( myPreviewPlaneVector );\r
+ myInteractor->setRotationCenter( aRotationCenter );\r
+ myInteractor->setMinMax( aMinMax );\r
+ myInteractor->setEnabled( true );\r
+}\r
+\r
+void OCCViewer_ClippingDlg::updatePreview() {\r
+ int aCurPlaneIndex = ComboBoxPlanes->currentIndex();\r
+ int count = clipPlanesCount();\r
+ if ( myBusy || \r
+ !isValid() || \r
+ myIsPlaneCreation ||\r
+ !myModel || \r
+ count == 0 || \r
+ (aCurPlaneIndex +1 > count) ||\r
+ !PreviewCheckBox->isChecked())\r
+ return;\r
+ \r
+ Handle(AIS_InteractiveContext) ic = myModel->getAISContext();\r
+ \r
+ OCCViewer_ClipPlane& aClipPlane = getClipPlane(aCurPlaneIndex);\r
+ Handle(AIS_Plane) myPreviewPlane;\r
+\r
+ if (aClipPlane.IsOn) {\r
+ double aSize;\r
+ gp_Pnt aBasePnt;\r
+ gp_Dir aNormal;\r
+ clipPlaneParams(aClipPlane, ic, aSize, aBasePnt, aNormal, myModel->trihedronSize());\r
+ if(myPreviewPlaneVector.size() < clipPlanesCount()) {\r
+ myPreviewPlaneVector.resize(clipPlanesCount());\r
+ }\r
+ myPreviewPlane = myPreviewPlaneVector[aCurPlaneIndex];\r
+ if(myPreviewPlane.IsNull()) {\r
+ //Plane was not created\r
+ myPreviewPlane = new AIS_Plane( new Geom_Plane( aBasePnt, aNormal ), aBasePnt );\r
+ myPreviewPlane->SetTypeOfSensitivity( Select3D_TOS_INTERIOR );\r
+ myPreviewPlane->SetSize( aSize, aSize );\r
+ ic->Display( myPreviewPlane, 1, 0, false );\r
+ ic->SetWidth( myPreviewPlane, 10, false );\r
+ ic->SetMaterial( myPreviewPlane, Graphic3d_NOM_PLASTIC, false );\r
+ ic->SetTransparency( myPreviewPlane, 0.5, false );\r
+ myPreviewPlaneVector[aCurPlaneIndex] = myPreviewPlane;\r
+ } else { \r
+ myPreviewPlane->SetComponent( new Geom_Plane( aBasePnt, aNormal ) );\r
+ myPreviewPlane->SetCenter( aBasePnt );\r
+ myPreviewPlane->SetSize( aSize, aSize ); \r
+ }\r
+\r
+ ic->SetColor( myPreviewPlane, Quantity_Color( 255. / 255., 70. / 255., 0. / 255., Quantity_TOC_RGB ), false );\r
+ ic->Update( myPreviewPlane, Standard_False );\r
+ } else {\r
+ if(myPreviewPlaneVector.size() > aCurPlaneIndex ) {\r
+ myPreviewPlane = myPreviewPlaneVector[aCurPlaneIndex];\r
+ if(ic->IsDisplayed(myPreviewPlane)) {\r
+ ic->Erase( myPreviewPlane, false );\r
+ ic->Remove( myPreviewPlane, false );\r
+ }\r
+ myPreviewPlaneVector[aCurPlaneIndex].Nullify();\r
+ }\r
+ }\r
+ for(int i = 0; i < myPreviewPlaneVector.size(); i++) {\r
+ if( i == aCurPlaneIndex ) continue;\r
+ if(!myPreviewPlaneVector[i].IsNull())\r
+ ic->SetColor( myPreviewPlaneVector[i], Quantity_Color( 85 / 255., 85 / 255., 255 / 255., Quantity_TOC_RGB ), false );\r
+ }\r
+ myModel->update();\r
+\r
+ double aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;\r
+ getMinMaxFromContext( ic, myModel->trihedronSize(), aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);\r
+ gp_Pnt aRotationCenter( (aXmax + aXmin) * 0.5,\r
+ (aYmax + aYmin) * 0.5,\r
+ (aZmax + aZmin) * 0.5 );\r
+ Bnd_Box aMinMax;\r
+ aMinMax.Update( aXmin, aYmin, aZmin, aXmax, aYmax, aZmax );\r
+\r
+ myInteractor->setPlanes( myPreviewPlaneVector );\r
+ myInteractor->setRotationCenter( aRotationCenter );\r
+ myInteractor->setMinMax( aMinMax );\r
+}\r
+\r
+/*!\r
+ Erases preview of clipping plane\r
+*/\r
+void OCCViewer_ClippingDlg::erasePreview()\r
+{\r
+ if ( !myModel )\r
+ return;\r
+\r
+ Handle(AIS_InteractiveContext) ic = myModel->getAISContext();\r
+\r
+ for ( int i=0; i < myPreviewPlaneVector.size(); i++ ) {\r
+ Handle(AIS_Plane) myPreviewPlane = myPreviewPlaneVector[i];\r
+ if ( !myPreviewPlane.IsNull() && ic->IsDisplayed( myPreviewPlane ) ) {\r
+ ic->Erase( myPreviewPlane, false );\r
+ ic->Remove( myPreviewPlane, false );\r
+ myPreviewPlane.Nullify();\r
+ }\r
+ }\r
+ myPreviewPlaneVector.clear();\r
+ myModel->update();\r
+ myInteractor->setEnabled( false );\r
+}\r
+\r
+/*!\r
+ Return true if plane parameters are valid\r
+*/\r
+bool OCCViewer_ClippingDlg::isValid()\r
+{\r
+ return ( SpinBox_Dx->value() !=0 || SpinBox_Dy->value() !=0 || SpinBox_Dz->value() !=0 );\r
+}\r
+\r
+/*!\r
+ Update view after changes\r
+*/\r
+void OCCViewer_ClippingDlg::updateClipping()\r
+{\r
+ if (PreviewCheckBox->isChecked() || AutoApplyCheckBox->isChecked())\r
+ {\r
+ if (AutoApplyCheckBox->isChecked()) {\r
+ onApply();\r
+ }\r
+ \r
+ if (!PreviewCheckBox->isChecked())\r
+ myModel->update();\r
+ else \r
+ updatePreview();\r
+ }\r
+}\r
+\r
+/*!\r
+ Updates state of user controls.\r
+*/\r
+void OCCViewer_ClippingDlg::updateControls()\r
+{\r
+ if ( clipPlanesCount() == 0 )\r
+ {\r
+ initParam();\r
+ return;\r
+ }\r
+\r
+ int aPlaneIdx = ComboBoxPlanes->currentIndex();\r
+\r
+ OCCViewer_ClipPlane& aPlane = getClipPlane( aPlaneIdx );\r
+\r
+ double aPlaneDx = 0.0;\r
+ double aPlaneDy = 0.0;\r
+ double aPlaneDz = 0.0;\r
+ double aDistance = 0.0;\r
+ aPlane.OrientationToXYZ( aPlaneDx, aPlaneDy, aPlaneDz );\r
+\r
+ if ( aPlane.Mode == OCCViewer_ClipPlane::Absolute )\r
+ {\r
+ ModeStackedLayout->setCurrentIndex( 0 );\r
+\r
+ // Set plane parameters in the dialog\r
+ SpinBox_X->setValue( aPlane.X );\r
+ SpinBox_Y->setValue( aPlane.Y );\r
+ SpinBox_Z->setValue( aPlane.Z );\r
+ SpinBox_Dx->setValue( aPlaneDx );\r
+ SpinBox_Dy->setValue( aPlaneDy );\r
+ SpinBox_Dz->setValue( aPlaneDz );\r
+ CBAbsoluteOrientation->setCurrentIndex( aPlane.OrientationType );\r
+ onOrientationAbsoluteChanged( aPlane.OrientationType );\r
+ }\r
+ else if( aPlane.Mode == OCCViewer_ClipPlane::Relative )\r
+ {\r
+ ModeStackedLayout->setCurrentIndex( 1 );\r
+\r
+ // Set plane parameters in the dialog\r
+ SpinSliderRotation1->setValue( int( aPlane.RelativeOrientation.Rotation1 ) );\r
+ SpinSliderRotation2->setValue( int( aPlane.RelativeOrientation.Rotation2 ) );\r
+\r
+ XYZToDistance( myModel->getAISContext(),\r
+ myModel->trihedronSize(),\r
+ aPlane.X, aPlane.Y, aPlane.Z,\r
+ aPlaneDx, aPlaneDy, aPlaneDz,\r
+ aDistance );\r
+\r
+ SpinSliderDistance->setValue( aDistance );\r
+\r
+ CBRelativeOrientation->setCurrentIndex( aPlane.OrientationType );\r
+ onOrientationRelativeChanged( aPlane.OrientationType );\r
+ }\r
+\r
+ isActivePlane->setChecked( aPlane.IsOn );\r
+}\r
+\r
+/*!\r
+ SLOT on new button click: create a new clipping plane\r
+*/\r
+void OCCViewer_ClippingDlg::ClickOnNew()\r
+{\r
+ OCCViewer_ClipPlane aClipPlane;\r
+\r
+ // init controls state\r
+ myIsUpdatingControls = true;\r
+ initParam();\r
+ myIsUpdatingControls = false;\r
+\r
+ // init plane according to the state of controls\r
+ setPlaneParam( aClipPlane );\r
+\r
+ // add plane\r
+ myLocalPlanes.push_back( aClipPlane );\r
+ synchronize();\r
+}\r
+\r
+/*!\r
+ SLOT on delete button click: Delete selected clipping plane\r
+*/\r
+void OCCViewer_ClippingDlg::ClickOnDelete()\r
+{\r
+ int aPlaneIndex = ComboBoxPlanes->currentIndex();\r
+ if ( (clipPlanesCount() == 0) || (aPlaneIndex+1 > clipPlanesCount()))\r
+ return;\r
+\r
+ myLocalPlanes.erase(myLocalPlanes.begin() + aPlaneIndex);\r
+\r
+ Handle(AIS_InteractiveContext) ic = myModel->getAISContext();\r
+\r
+ if(aPlaneIndex+1 <= myPreviewPlaneVector.size()) {\r
+ Handle(AIS_Plane) myPreviewPlane = myPreviewPlaneVector[aPlaneIndex];\r
+ if ( !myPreviewPlane.IsNull() && ic->IsDisplayed( myPreviewPlane ) ) {\r
+ ic->Erase( myPreviewPlane, false );\r
+ ic->Remove( myPreviewPlane, false );\r
+ }\r
+ myPreviewPlaneVector.erase(myPreviewPlaneVector.begin() + aPlaneIndex);\r
+ }\r
+ synchronize();\r
+ if (AutoApplyCheckBox->isChecked()) {\r
+ onApply();\r
+ }\r
+ myModel->update();\r
+}\r
+\r
+/*!\r
+ SLOT on disable all button click: Restore initial state of viewer,\r
+ erase all clipping planes\r
+*/\r
+void OCCViewer_ClippingDlg::ClickOnDisableAll()\r
+{\r
+ AutoApplyCheckBox->setChecked (false);\r
+ int aClipPlanesCount = clipPlanesCount();\r
+ for ( int anIndex = 0; anIndex < aClipPlanesCount; anIndex++)\r
+ {\r
+ OCCViewer_ClipPlane& aPlane = getClipPlane(anIndex);\r
+ aPlane.IsOn = false;\r
+ }\r
+ erasePreview();\r
+ isActivePlane->setChecked(false);\r
+ myModel->setClipPlanes(myLocalPlanes);\r
+ myModel->update();\r
+}\r
+\r
+/*!\r
+ SLOT on ok button click: sets cutting plane and closes dialog\r
+*/\r
+void OCCViewer_ClippingDlg::ClickOnOk()\r
+{\r
+ onApply();\r
+ ClickOnClose();\r
+}\r
+\r
+/*!\r
+ SLOT on Apply button click: sets cutting plane and update viewer\r
+*/\r
+void OCCViewer_ClippingDlg::ClickOnApply()\r
+{\r
+ onApply();\r
+ myModel->update();\r
+}\r
+\r
+/*!\r
+ SLOT on close button click: erases preview and rejects dialog\r
+*/\r
+void OCCViewer_ClippingDlg::ClickOnClose()\r
+{\r
+ erasePreview();\r
+ OCCViewer_ViewWindow* v = qobject_cast<OCCViewer_ViewWindow*>(parent());\r
+ if(v)\r
+ v->onClipping(false);\r
+}\r
+\r
+/*!\r
+ SLOT on help button click: opens a help page\r
+*/\r
+void OCCViewer_ClippingDlg::ClickOnHelp()\r
+{\r
+ SUIT_Application* app = SUIT_Session::session()->activeApplication();\r
+ if ( app )\r
+ app->onHelpContextModule( "GUI", "occ_3d_viewer_page.html", "clipping_planes" );\r
+}\r
+\r
+/*!\r
+ Set absolute mode of clipping plane\r
+*/\r
+void OCCViewer_ClippingDlg::onModeAbsolute()\r
+{\r
+ myIsPlaneCreation = true;\r
+ ModeStackedLayout->setCurrentIndex(0);\r
+ ClickOnNew();\r
+ myIsPlaneCreation = false;\r
+ updateClipping();\r
+}\r
+\r
+/*!\r
+ Set relative mode of clipping plane\r
+*/\r
+void OCCViewer_ClippingDlg::onModeRelative()\r
+{\r
+ myIsPlaneCreation = true;\r
+ ModeStackedLayout->setCurrentIndex(1);\r
+ ClickOnNew();\r
+ myIsPlaneCreation = false;\r
+ SetCurrentPlaneParam();\r
+ updateClipping();\r
+}\r
+\r
+/*!\r
+ SLOT: called on value of clipping plane changed\r
+*/\r
+void OCCViewer_ClippingDlg::onValueChanged()\r
+{\r
+ if ( myIsUpdatingControls )\r
+ {\r
+ return;\r
+ }\r
+\r
+ SetCurrentPlaneParam();\r
+\r
+ if ( myIsSelectPlane )\r
+ {\r
+ return;\r
+ }\r
+\r
+ updateClipping();\r
+}\r
+\r
+/*!\r
+ Set current parameters of selected plane\r
+*/\r
+void OCCViewer_ClippingDlg::onSelectPlane ( int theIndex )\r
+{\r
+ if ( clipPlanesCount() == 0 )\r
+ {\r
+ return;\r
+ }\r
+\r
+ OCCViewer_ClipPlane& aClipPlane = getClipPlane( theIndex );\r
+\r
+ myIsSelectPlane = true;\r
+ updateControls();\r
+ ComboBoxPlanes->setCurrentIndex( theIndex );\r
+ myIsSelectPlane = false;\r
+}\r
+\r
+/*!\r
+ Restore parameters of selected plane\r
+*/\r
+void OCCViewer_ClippingDlg::SetCurrentPlaneParam()\r
+{\r
+ if ( clipPlanesCount() == 0 || myIsSelectPlane || myBusy )\r
+ {\r
+ return;\r
+ }\r
+\r
+ int aCurPlaneIndex = ComboBoxPlanes->currentIndex();\r
+\r
+ OCCViewer_ClipPlane& aPlane = getClipPlane( aCurPlaneIndex );\r
+\r
+ setPlaneParam( aPlane );\r
+}\r
+\r
+/*!\r
+ SLOT on reset button click: sets default values\r
+*/\r
+void OCCViewer_ClippingDlg::onReset()\r
+{\r
+ myBusy = true;\r
+ SpinBox_X->setValue(0);\r
+ SpinBox_Y->setValue(0);\r
+ SpinBox_Z->setValue(0);\r
+ myBusy = false;\r
+\r
+ updateClipping();\r
+}\r
+\r
+/*!\r
+ SLOT on invert button click: inverts normal of cutting plane\r
+*/\r
+void OCCViewer_ClippingDlg::onInvert()\r
+{\r
+ double Dx = SpinBox_Dx->value();\r
+ double Dy = SpinBox_Dy->value();\r
+ double Dz = SpinBox_Dz->value();\r
+\r
+ myBusy = true;\r
+ SpinBox_Dx->setValue( -Dx );\r
+ SpinBox_Dy->setValue( -Dy );\r
+ SpinBox_Dz->setValue( -Dz );\r
+ myBusy = false;\r
+\r
+ if ( clipPlanesCount() != 0 )\r
+ {\r
+ int aCurPlaneIndex = ComboBoxPlanes->currentIndex();\r
+ OCCViewer_ClipPlane& aPlane = getClipPlane( aCurPlaneIndex );\r
+ aPlane.AbsoluteOrientation.IsInvert = !aPlane.AbsoluteOrientation.IsInvert;\r
+ }\r
+ updateClipping();\r
+}\r
+\r
+/*!\r
+ SLOT: called on orientation of clipping plane in absolute mode changed\r
+*/\r
+void OCCViewer_ClippingDlg::onOrientationAbsoluteChanged( int mode )\r
+{\r
+ bool isUserMode = (mode==0);\r
+\r
+ TextLabelX->setEnabled( isUserMode );\r
+ TextLabelY->setEnabled( isUserMode );\r
+ TextLabelZ->setEnabled( isUserMode );\r
+\r
+ SpinBox_X->setEnabled( isUserMode );\r
+ SpinBox_Y->setEnabled( isUserMode );\r
+ SpinBox_Z->setEnabled( isUserMode );\r
+\r
+ TextLabelDx->setEnabled( isUserMode );\r
+ TextLabelDy->setEnabled( isUserMode );\r
+ TextLabelDz->setEnabled( isUserMode );\r
+\r
+ SpinBox_Dx->setEnabled( isUserMode );\r
+ SpinBox_Dy->setEnabled( isUserMode );\r
+ SpinBox_Dz->setEnabled( isUserMode );\r
+\r
+ if ( !isUserMode ) {\r
+\r
+ double aDx = 0, aDy = 0, aDz = 0;\r
+\r
+ if ( mode == 1 )\r
+ {\r
+ aDz = 1;\r
+ TextLabelZ->setEnabled( true );\r
+ SpinBox_Z->setEnabled( true );\r
+ SpinBox_Z->setFocus();\r
+ }\r
+ else if ( mode == 2 )\r
+ {\r
+ aDx = 1;\r
+ TextLabelX->setEnabled( true );\r
+ SpinBox_X->setEnabled( true );\r
+ SpinBox_X->setFocus();\r
+ }\r
+ else if ( mode == 3 )\r
+ {\r
+ aDy = 1;\r
+ TextLabelY->setEnabled( true );\r
+ SpinBox_Y->setEnabled( true );\r
+ SpinBox_Y->setFocus();\r
+ }\r
+ \r
+ int aCurPlaneIndex = ComboBoxPlanes->currentIndex();\r
+ OCCViewer_ClipPlane& aPlane = getClipPlane( aCurPlaneIndex );\r
+ if ( aPlane.AbsoluteOrientation.IsInvert == true )\r
+ {\r
+ aDx = -aDx;\r
+ aDy = -aDy;\r
+ aDz = -aDz;\r
+ }\r
+ \r
+ myBusy = true;\r
+ SpinBox_Dx->setValue( aDx );\r
+ SpinBox_Dy->setValue( aDy );\r
+ SpinBox_Dz->setValue( aDz );\r
+ myBusy = false;\r
+ }\r
+\r
+ if ( !myIsUpdatingControls )\r
+ {\r
+ SetCurrentPlaneParam();\r
+ updateClipping();\r
+ }\r
+}\r
+\r
+/*!\r
+ SLOT: called on orientation of clipping plane in relative mode changed\r
+*/\r
+void OCCViewer_ClippingDlg::onOrientationRelativeChanged (int theItem)\r
+{\r
+ if ( clipPlanesCount() == 0 )\r
+ return;\r
+ \r
+ if ( theItem == 0 ) {\r
+ TextLabelRotation1->setText( tr( "ROTATION_AROUND_X_Y2Z" ) );\r
+ TextLabelRotation2->setText( tr( "ROTATION_AROUND_Y_X2Z" ) );\r
+ }\r
+ else if ( theItem == 1 ) {\r
+ TextLabelRotation1->setText( tr( "ROTATION_AROUND_Y_Z2X" ) );\r
+ TextLabelRotation2->setText( tr( "ROTATION_AROUND_Z_Y2X" ) );\r
+ }\r
+ else if ( theItem == 2 ) {\r
+ TextLabelRotation1->setText( tr( "ROTATION_AROUND_Z_X2Y" ) );\r
+ TextLabelRotation2->setText( tr( "ROTATION_AROUND_X_Z2Y" ) );\r
+ }\r
+\r
+ if ( !myIsUpdatingControls )\r
+ {\r
+ if( (QComboBox*)sender() == CBRelativeOrientation )\r
+ {\r
+ SetCurrentPlaneParam();\r
+ }\r
+\r
+ updateClipping();\r
+ }\r
+}\r
+\r
+/*!\r
+ SLOT: called on preview check box toggled\r
+*/\r
+void OCCViewer_ClippingDlg::onPreview( bool on )\r
+{\r
+ erasePreview();\r
+ if ( on ) \r
+ displayPreview();\r
+}\r
+\r
+/*!\r
+ SLOT: called on Auto Apply check box toggled\r
+*/\r
+void OCCViewer_ClippingDlg::onAutoApply( bool toggled )\r
+{\r
+ if ( toggled ) {\r
+ onApply();\r
+ myModel->update();\r
+ } \r
+}\r
+\r
+/*!\r
+ SLOT on Apply button click: sets cutting plane\r
+*/\r
+void OCCViewer_ClippingDlg::onApply()\r
+{\r
+ if ( myBusy )\r
+ return;\r
+ myIsSelectPlane = true;\r
+\r
+ qApp->processEvents();\r
+ QApplication::setOverrideCursor( Qt::WaitCursor );\r
+ qApp->processEvents();\r
+\r
+ myModel->setClipPlanes(myLocalPlanes);\r
+\r
+ QApplication::restoreOverrideCursor();\r
+ myIsSelectPlane = false;\r
+}\r
+\r
+/*!\r
+ SLOT: Called when clip plane is clicked in viewer.\r
+*/\r
+void OCCViewer_ClippingDlg::onPlaneClicked( const Handle(AIS_Plane)& thePlane )\r
+{\r
+ for ( int aPlaneIt = 0; aPlaneIt < myPreviewPlaneVector.size(); aPlaneIt++ )\r
+ {\r
+ Handle(AIS_Plane)& aPlane = myPreviewPlaneVector.at( aPlaneIt );\r
+ if ( aPlane != thePlane )\r
+ {\r
+ continue;\r
+ }\r
+\r
+ ComboBoxPlanes->setCurrentIndex( aPlaneIt );\r
+\r
+ break;\r
+ }\r
+}\r
+\r
+/*!\r
+ SLOT: Called when clip plane is changed by dragging in viewer.\r
+*/\r
+void OCCViewer_ClippingDlg::onPlaneDragged( const Handle(AIS_Plane)& thePlane )\r
+{\r
+ for ( int aPlaneIt = 0; aPlaneIt < myPreviewPlaneVector.size(); aPlaneIt++ )\r
+ {\r
+ Handle(AIS_Plane)& aPlane = myPreviewPlaneVector.at( aPlaneIt );\r
+ if ( aPlane != thePlane )\r
+ {\r
+ continue;\r
+ }\r
+\r
+ OCCViewer_ClipPlane& aClipPlane = getClipPlane( aPlaneIt );\r
+\r
+ gp_Pln aPln = thePlane->Component()->Pln();\r
+ const gp_Pnt& aPlaneP = aPln.Location();\r
+ const gp_Dir& aPlaneN = aPln.Axis().Direction();\r
+\r
+ aClipPlane.X = aPlaneP.X();\r
+ aClipPlane.Y = aPlaneP.Y();\r
+ aClipPlane.Z = aPlaneP.Z();\r
+\r
+ if ( aClipPlane.Mode == OCCViewer_ClipPlane::Absolute )\r
+ {\r
+ if ( aClipPlane.OrientationType == OCCViewer_ClipPlane::AbsoluteCustom )\r
+ {\r
+ aClipPlane.AbsoluteOrientation.Dx = aPlaneN.X();\r
+ aClipPlane.AbsoluteOrientation.Dy = aPlaneN.Y();\r
+ aClipPlane.AbsoluteOrientation.Dz = aPlaneN.Z();\r
+ }\r
+ }\r
+ else\r
+ {\r
+ OCCViewer_ClipPlane::DXYZToRelative( aPlaneN.X(), aPlaneN.Y(), aPlaneN.Z(),\r
+ aClipPlane.OrientationType,\r
+ aClipPlane.RelativeOrientation.Rotation1,\r
+ aClipPlane.RelativeOrientation.Rotation2 );\r
+ }\r
+\r
+ myIsUpdatingControls = true;\r
+ updateControls();\r
+ myIsUpdatingControls = false;\r
+\r
+ if ( AutoApplyCheckBox->isChecked() )\r
+ {\r
+ onApply();\r
+ }\r
+\r
+ break;\r
+ }\r
+}\r
+\r
+OCCViewer_ClipPlane& OCCViewer_ClippingDlg::getClipPlane( int theIdx )\r
+{\r
+ return myLocalPlanes[theIdx];\r
+}\r
+\r
+int OCCViewer_ClippingDlg::clipPlanesCount()\r
+{\r
+ return myLocalPlanes.size();\r
+}\r
+\r
+OCCViewer_ClipPlane::PlaneMode OCCViewer_ClippingDlg::currentPlaneMode() const
{
- return myLocalPlanes.size();
+ return ModeStackedLayout->currentIndex() == 0
+ ? OCCViewer_ClipPlane::Absolute
+ : OCCViewer_ClipPlane::Relative;
}
-// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License, or (at your option) any later version.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// File : OCCViewer_ViewWindow.cxx
-// Author :
-
-#include "OCCViewer_ViewWindow.h"
-#include "OCCViewer_ViewModel.h"
-#include "OCCViewer_ViewPort3d.h"
-#include "OCCViewer_ViewManager.h"
-#include "OCCViewer_ViewSketcher.h"
-#include "OCCViewer_CreateRestoreViewDlg.h"
-#include "OCCViewer_ClipPlane.h"
-#include "OCCViewer_SetRotationPointDlg.h"
-#include "OCCViewer_AxialScaleDlg.h"
-#include "OCCViewer_CubeAxesDlg.h"
-#include "OCCViewer_ClippingDlg.h"
-
-#include <Basics_OCCTVersion.hxx>
-
-#include <SUIT_Desktop.h>
-#include <SUIT_Session.h>
-#include <SUIT_ViewManager.h>
-#include <SUIT_Tools.h>
-#include <SUIT_ResourceMgr.h>
-#include <SUIT_MessageBox.h>
-#include <SUIT_Application.h>
-
-#include <QtxActionToolMgr.h>
-#include <QtxMultiAction.h>
-#include <QtxRubberBand.h>
-
-#include <OpenGLUtils_FrameBuffer.h>
-
-#include <QPainter>
-#include <QTime>
-#include <QImage>
-#include <QKeyEvent>
-#include <QMouseEvent>
-#include <QApplication>
-#include <QMenu>
-
-#include <AIS_ListOfInteractive.hxx>
-#include <AIS_ListIteratorOfListOfInteractive.hxx>
-#include <AIS_Shape.hxx>
-
-#include <BRep_Tool.hxx>
-#include <BRepBndLib.hxx>
-#include <TopoDS.hxx>
-
-#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
-#include <Graphic3d_MapOfStructure.hxx>
-#include <Graphic3d_Structure.hxx>
-#include <Graphic3d_ExportFormat.hxx>
-
-#include <Visual3d_View.hxx>
-#include <V3d_Plane.hxx>
-#include <V3d_Light.hxx>
-
-#include <gp_Dir.hxx>
-#include <gp_Pln.hxx>
-#include <TColgp_Array1OfPnt2d.hxx>
-
-#if OCC_VERSION_LARGE > 0x06060000
-#include <Graphic3d_SequenceOfHClipPlane.hxx>
-#include <Graphic3d_ClipPlane.hxx>
-
-#endif
-
-#include <Standard_Version.hxx>
-
-#include "utilities.h"
-
-// // OpenCV includes
-// #include <cv.h>
-// #include <highgui.h>
-
-static QEvent* l_mbPressEvent = 0;
-
-#ifdef WIN32
-# include <QWindowsStyle>
-#endif
-
-#include <GL/gl.h>
-
-const char* imageZoomCursor[] = {
-"32 32 3 1",
-". c None",
-"a c #000000",
-"# c #ffffff",
-"................................",
-"................................",
-".#######........................",
-"..aaaaaaa.......................",
-"................................",
-".............#####..............",
-"...........##.aaaa##............",
-"..........#.aa.....a#...........",
-".........#.a.........#..........",
-".........#a..........#a.........",
-"........#.a...........#.........",
-"........#a............#a........",
-"........#a............#a........",
-"........#a............#a........",
-"........#a............#a........",
-".........#...........#.a........",
-".........#a..........#a.........",
-".........##.........#.a.........",
-"........#####.....##.a..........",
-".......###aaa#####.aa...........",
-"......###aa...aaaaa.......#.....",
-".....###aa................#a....",
-"....###aa.................#a....",
-"...###aa...............#######..",
-"....#aa.................aa#aaaa.",
-".....a....................#a....",
-"..........................#a....",
-"...........................a....",
-"................................",
-"................................",
-"................................",
-"................................"};
-
-const char* imageRotateCursor[] = {
-"32 32 3 1",
-". c None",
-"a c #000000",
-"# c #ffffff",
-"................................",
-"................................",
-"................................",
-"................................",
-"........#.......................",
-".......#.a......................",
-"......#######...................",
-".......#aaaaa#####..............",
-"........#..##.a#aa##........##..",
-".........a#.aa..#..a#.....##.aa.",
-".........#.a.....#...#..##.aa...",
-".........#a.......#..###.aa.....",
-"........#.a.......#a..#aa.......",
-"........#a.........#..#a........",
-"........#a.........#a.#a........",
-"........#a.........#a.#a........",
-"........#a.........#a.#a........",
-".........#.........#a#.a........",
-"........##a........#a#a.........",
-"......##.a#.......#.#.a.........",
-"....##.aa..##.....##.a..........",
-"..##.aa.....a#####.aa...........",
-"...aa.........aaa#a.............",
-"................#.a.............",
-"...............#.a..............",
-"..............#.a...............",
-"...............a................",
-"................................",
-"................................",
-"................................",
-"................................",
-"................................"};
-
-const char* imageCrossCursor[] = {
- "32 32 3 1",
- ". c None",
- "a c #000000",
- "# c #ffffff",
- "................................",
- "................................",
- "................................",
- "................................",
- "................................",
- "................................",
- "................................",
- "...............#................",
- "...............#a...............",
- "...............#a...............",
- "...............#a...............",
- "...............#a...............",
- "...............#a...............",
- "...............#a...............",
- "...............#a...............",
- ".......#################........",
- "........aaaaaaa#aaaaaaaaa.......",
- "...............#a...............",
- "...............#a...............",
- "...............#a...............",
- "...............#a...............",
- "...............#a...............",
- "...............#a...............",
- "...............#a...............",
- "................a...............",
- "................................",
- "................................",
- "................................",
- "................................",
- "................................",
- "................................",
- "................................"};
-
-
-/*!
- \brief Constructor
- \param theDesktop main window of application
- \param theModel OCC 3D viewer
-*/
-OCCViewer_ViewWindow::OCCViewer_ViewWindow( SUIT_Desktop* theDesktop,
- OCCViewer_Viewer* theModel )
-: SUIT_ViewWindow( theDesktop )
-{
- myModel = theModel;
- myRestoreFlag = 0;
- myEnableDrawMode = false;
- myDrawRect=false;
- updateEnabledDrawMode();
- myScalingDlg = 0;
- mySetRotationPointDlg = 0;
- myRectBand = 0;
-
- IsSketcherStyle = false;
- myIsKeyFree = false;
-
- mypSketcher = 0;
- myCurSketch = -1;
- my2dMode = No2dMode;
-
- myInteractionStyle = SUIT_ViewModel::STANDARD;
- myPreselectionEnabled = true;
- mySelectionEnabled = true;
-
-
- clearViewAspects();
-
-}
-
-/*!
- \brief Destructor.
-*/
-OCCViewer_ViewWindow::~OCCViewer_ViewWindow()
-{
- endDrawRect();
- qDeleteAll( mySketchers );
-}
-
-/*!
- \brief Internal initialization.
-*/
-void OCCViewer_ViewWindow::initLayout()
-{
- myViewPort = new OCCViewer_ViewPort3d( this, myModel->getViewer3d(), V3d_ORTHOGRAPHIC );
- myViewPort->installEventFilter(this);
- setCentralWidget(myViewPort);
- myOperation = NOTHING;
-
- myCurrPointType = GRAVITY;
- myPrevPointType = GRAVITY;
- mySelectedPoint = gp_Pnt(0.,0.,0.);
- myRotationPointSelection = false;
-
- setTransformRequested ( NOTHING );
- setTransformInProcess ( false );
-
- createActions();
- createToolBar();
-
- switch (my2dMode) {
- case XYPlane:
- onTopView();
- break;
- case XZPlane:
- onLeftView();
- break;
- case YZPlane:
- onFrontView();
- break;
- }
-
- // Graduated axes dialog
- QtxAction* anAction = dynamic_cast<QtxAction*>( toolMgr()->action( GraduatedAxesId ) );
- myCubeAxesDlg = new OCCViewer_CubeAxesDlg( anAction, this, "OCCViewer_CubeAxesDlg" );
- myCubeAxesDlg->initialize();
-
- connect( myViewPort, SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), this, SLOT( emitViewModified() ) );
-}
-
-OCCViewer_ViewWindow* OCCViewer_ViewWindow::getView( const int mode ) const
-{
- return mode == get2dMode() ? const_cast<OCCViewer_ViewWindow*>( this ) : 0;
-}
-
-/*!
- \brief Detect viewer operation according the the mouse button pressed
- and key modifiers used.
- \param theEvent mouse event
- \return type of the operation
-*/
-OCCViewer_ViewWindow::OperationType
-OCCViewer_ViewWindow::getButtonState( QMouseEvent* theEvent, int theInteractionStyle )
-{
- OperationType aOp = NOTHING;
- SUIT_ViewModel::InteractionStyle aStyle = (SUIT_ViewModel::InteractionStyle)theInteractionStyle;
- if( (theEvent->modifiers() == SUIT_ViewModel::myStateMap[aStyle][SUIT_ViewModel::ZOOM]) &&
- (theEvent->buttons() == SUIT_ViewModel::myButtonMap[aStyle][SUIT_ViewModel::ZOOM]) )
- aOp = ZOOMVIEW;
- else if( (theEvent->modifiers() == SUIT_ViewModel::myStateMap[aStyle][SUIT_ViewModel::PAN]) &&
- (theEvent->buttons() == SUIT_ViewModel::myButtonMap[aStyle][SUIT_ViewModel::PAN]) )
- aOp = PANVIEW;
- else if( (theEvent->modifiers() == SUIT_ViewModel::myStateMap[aStyle][SUIT_ViewModel::ROTATE]) &&
- (theEvent->buttons() == SUIT_ViewModel::myButtonMap[aStyle][SUIT_ViewModel::ROTATE]) &&
- (my2dMode == No2dMode))
- aOp = ROTATE;
-
- return aOp;
-}
-
-/*!
- \brief Customize event handling
- \param watched event receiver object
- \param e event
- \return \c true if the event processing should be stopped
-*/
-bool OCCViewer_ViewWindow::eventFilter( QObject* watched, QEvent* e )
-{
- if ( watched == myViewPort ) {
- int aType = e->type();
- switch(aType) {
- case QEvent::MouseButtonPress:
- vpMousePressEvent((QMouseEvent*) e);
- return true;
-
- case QEvent::MouseButtonRelease:
- vpMouseReleaseEvent((QMouseEvent*) e);
- return true;
-
- case QEvent::MouseMove:
- vpMouseMoveEvent((QMouseEvent*) e);
- return true;
-
- case QEvent::MouseButtonDblClick:
- emit mouseDoubleClicked(this, (QMouseEvent*)e);
- return true;
-
- case QEvent::Wheel:
- {
- QWheelEvent* aEvent = (QWheelEvent*) e;
- myViewPort->startZoomAtPoint( aEvent->x(), aEvent->y() );
- double delta = (double)( aEvent->delta() ) / ( 15 * 8 );
- int x = aEvent->x();
- int y = aEvent->y();
- int x1 = (int)( aEvent->x() + width()*delta/100 );
- int y1 = (int)( aEvent->y() + height()*delta/100 );
- myViewPort->zoom( x, y, x1, y1 );
- }
- return true;
-
- case QEvent::ContextMenu:
- {
- QContextMenuEvent * aEvent = (QContextMenuEvent*)e;
- if ( aEvent->reason() != QContextMenuEvent::Mouse )
- emit contextMenuRequested( aEvent );
- }
- return true;
-
- case QEvent::KeyPress:
- emit keyPressed(this, (QKeyEvent*) e);
- return true;
-
- default:
- break;
- }
- }
- return SUIT_ViewWindow::eventFilter(watched, e);
-}
-
-/*!
- \brief Update state of enable draw mode state.
-*/
-void OCCViewer_ViewWindow::updateEnabledDrawMode()
-{
- if ( myModel )
- myEnableDrawMode = myModel->isSelectionEnabled() && myModel->isMultiSelectionEnabled();
-}
-
-/*!
- \brief Handle mouse press event
- \param theEvent mouse event
-*/
-void OCCViewer_ViewWindow::vpMousePressEvent( QMouseEvent* theEvent )
-{
- myStartX = theEvent->x();
- myStartY = theEvent->y();
- int anInteractionStyle = interactionStyle();
-
- // in "key free" interaction style zoom operation is activated by two buttons (simultaneously pressed),
- // which are assigned for pan and rotate - these operations are activated immediately after pressing
- // of the first button, so it is necessary to switch to zoom when the second button is pressed
- bool aSwitchToZoom = false;
- if ( anInteractionStyle == SUIT_ViewModel::KEY_FREE &&
- ( myOperation == PANVIEW || myOperation == ROTATE ) ) {
- aSwitchToZoom = getButtonState( theEvent, anInteractionStyle ) == ZOOMVIEW;
- }
-
- switch ( myOperation ) {
- case WINDOWFIT:
- if ( theEvent->button() == Qt::LeftButton )
- emit vpTransformationStarted ( WINDOWFIT );
- break;
-
- case PANGLOBAL:
- if ( theEvent->button() == Qt::LeftButton )
- emit vpTransformationStarted ( PANGLOBAL );
- break;
-
- case ZOOMVIEW:
- if ( theEvent->button() == Qt::LeftButton ) {
- myViewPort->startZoomAtPoint( myStartX, myStartY );
- emit vpTransformationStarted ( ZOOMVIEW );
- }
- break;
-
- case PANVIEW:
- if ( aSwitchToZoom ) {
- myViewPort->startZoomAtPoint( myStartX, myStartY );
- activateZoom();
- }
- else if ( theEvent->button() == Qt::LeftButton )
- emit vpTransformationStarted ( PANVIEW );
- break;
-
- case ROTATE:
- if ( aSwitchToZoom ) {
- myViewPort->startZoomAtPoint( myStartX, myStartY );
- activateZoom();
- }
- else if ( theEvent->button() == Qt::LeftButton ) {
- myViewPort->startRotation(myStartX, myStartY, myCurrPointType, mySelectedPoint);
- emit vpTransformationStarted ( ROTATE );
- }
- break;
-
- default:
- /* Try to activate a transformation */
- OperationType aState;
- if ( interactionStyle() == SUIT_ViewModel::STANDARD )
- aState = getButtonState(theEvent, anInteractionStyle);
- else {
- aState = OCCViewer_ViewWindow::NOTHING;
- myIsKeyFree = true;
- }
- switch ( aState ) {
- case ZOOMVIEW:
- myViewPort->startZoomAtPoint( myStartX, myStartY );
- activateZoom();
- break;
- case PANVIEW:
- activatePanning();
- break;
- case ROTATE:
- activateRotation();
- myViewPort->startRotation(myStartX, myStartY, myCurrPointType, mySelectedPoint);
- break;
- default:
- if ( myRotationPointSelection )
- {
- if ( theEvent->button() == Qt::LeftButton )
- {
- Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
- ic->Select();
- for ( ic->InitSelected(); ic->MoreSelected(); ic->NextSelected() )
- {
- TopoDS_Shape aShape = ic->SelectedShape();
- if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX )
- {
- gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex( ic->SelectedShape() ) );
- if ( mySetRotationPointDlg )
- {
- myRotationPointSelection = false;
- mySetRotationPointDlg->setCoords(aPnt.X(), aPnt.Y(), aPnt.Z());
- }
- }
- else
- {
- myCurrPointType = myPrevPointType;
- break;
- }
- }
- if ( ic->NbSelected() == 0 ) myCurrPointType = myPrevPointType;
- if ( mySetRotationPointDlg ) mySetRotationPointDlg->toggleChange();
- ic->CloseAllContexts();
- myOperation = NOTHING;
- myViewPort->setCursor( myCursor );
- myCursorIsHand = false;
- myRotationPointSelection = false;
- }
- }
- else
- emit mousePressed(this, theEvent);
- break;
- }
- /* notify that we start a transformation */
- if ( transformRequested() )
- emit vpTransformationStarted ( myOperation );
- }
- if ( transformRequested() )
- setTransformInProcess( true );
-
- /* we may need it for sketching... */
- if ( l_mbPressEvent )
- delete l_mbPressEvent;
- l_mbPressEvent = new QMouseEvent( *theEvent );
-}
-
-
-/*!
- \brief Start zooming operation.
-
- Sets the corresponding cursor for the widget.
-*/
-void OCCViewer_ViewWindow::activateZoom()
-{
- if ( !transformRequested() && !myCursorIsHand )
- myCursor = cursor(); /* save old cursor */
-
- if ( myOperation != ZOOMVIEW ) {
- QPixmap zoomPixmap (imageZoomCursor);
- QCursor zoomCursor (zoomPixmap);
- if( setTransformRequested ( ZOOMVIEW ) )
- myViewPort->setCursor( zoomCursor );
- }
-}
-
-
-/*!
- \brief Start panning operation.
-
- Sets the corresponding cursor for the widget.
-*/
-void OCCViewer_ViewWindow::activatePanning()
-{
- if ( !transformRequested() && !myCursorIsHand )
- myCursor = cursor(); // save old cursor
-
- if ( myOperation != PANVIEW ) {
- QCursor panCursor (Qt::SizeAllCursor);
- if( setTransformRequested ( PANVIEW ) )
- myViewPort->setCursor( panCursor );
- }
-}
-
-/*!
- \brief Start rotation operation
-
- Sets the corresponding cursor for the widget.
-*/
-void OCCViewer_ViewWindow::activateRotation()
-{
- if ( !transformRequested() && !myCursorIsHand )
- myCursor = cursor(); // save old cursor
-
- if ( myOperation != ROTATE ) {
- QPixmap rotatePixmap (imageRotateCursor);
- QCursor rotCursor (rotatePixmap);
- if( setTransformRequested ( ROTATE ) )
- myViewPort->setCursor( rotCursor );
- }
-}
-
-/*!
- \brief Compute the gravity center.
- \param theX used to return X coordinate of the gravity center
- \param theY used to return Y coordinate of the gravity center
- \param theZ used to return Z coordinate of the gravity center
- \return \c true if the gravity center is computed
-*/
-bool OCCViewer_ViewWindow::computeGravityCenter( double& theX, double& theY, double& theZ )
-{
- Handle(Visual3d_View) aView = myViewPort->getView()->View();
-
- Standard_Real Xmin,Ymin,Zmin,Xmax,Ymax,Zmax,U,V,W ;
- Standard_Real Umin,Vmin,Umax,Vmax ;
- Standard_Integer Nstruct,Npoint ;
- Graphic3d_MapOfStructure MySetOfStructures;
-
- aView->DisplayedStructures (MySetOfStructures);
- Nstruct = MySetOfStructures.Extent() ;
-
- Graphic3d_MapIteratorOfMapOfStructure MyIterator(MySetOfStructures) ;
-#if OCC_VERSION_LARGE > 0x06070000
- aView->Camera()->WindowLimit(Umin,Vmin,Umax,Vmax);
-#else
- aView->ViewMapping().WindowLimit(Umin,Vmin,Umax,Vmax);
-#endif
- Npoint = 0 ; theX = theY = theZ = 0. ;
- for( ; MyIterator.More(); MyIterator.Next()) {
- if (!(MyIterator.Key())->IsEmpty()) {
- (MyIterator.Key())->MinMaxValues(Xmin,Ymin,Zmin,
- Xmax,Ymax,Zmax) ;
-
- Standard_Real LIM = ShortRealLast() -1.;
- if (! (fabs(Xmin) > LIM || fabs(Ymin) > LIM || fabs(Zmin) > LIM
- || fabs(Xmax) > LIM || fabs(Ymax) > LIM || fabs(Zmax) > LIM )) {
-
- aView->Projects(Xmin,Ymin,Zmin,U,V,W) ;
- if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
- Npoint++ ; theX += Xmin ; theY += Ymin ; theZ += Zmin ;
- }
- aView->Projects(Xmax,Ymin,Zmin,U,V,W) ;
- if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
- Npoint++ ; theX += Xmax ; theY += Ymin ; theZ += Zmin ;
- }
- aView->Projects(Xmin,Ymax,Zmin,U,V,W) ;
- if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
- Npoint++ ; theX += Xmin ; theY += Ymax ; theZ += Zmin ;
- }
- aView->Projects(Xmax,Ymax,Zmin,U,V,W) ;
- if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
- Npoint++ ; theX += Xmax ; theY += Ymax ; theZ += Zmin ;
- }
- aView->Projects(Xmin,Ymin,Zmax,U,V,W) ;
- if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
- Npoint++ ; theX += Xmin ; theY += Ymin ; theZ += Zmax ;
- }
- aView->Projects(Xmax,Ymin,Zmax,U,V,W) ;
- if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
- Npoint++ ; theX += Xmax ; theY += Ymin ; theZ += Zmax ;
- }
- aView->Projects(Xmin,Ymax,Zmax,U,V,W) ;
- if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
- Npoint++ ; theX += Xmin ; theY += Ymax ; theZ += Zmax ;
- }
- aView->Projects(Xmax,Ymax,Zmax,U,V,W) ;
- if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {
- Npoint++ ; theX += Xmax ; theY += Ymax ; theZ += Zmax ;
- }
- }
- }
- }
- if( Npoint > 0 ) {
- theX /= Npoint ; theY /= Npoint ; theZ /= Npoint ;
- }
- return true;
-}
-
-/*!
- \brief Set the gravity center as a rotation point.
-*/
-void OCCViewer_ViewWindow::activateSetRotationGravity()
-{
- if ( myRotationPointSelection )
- {
- Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
- ic->CloseAllContexts();
- myOperation = NOTHING;
- myViewPort->setCursor( myCursor );
- myCursorIsHand = false;
- myRotationPointSelection = false;
- }
-
- myPrevPointType = myCurrPointType;
- myCurrPointType = GRAVITY;
-
- Standard_Real Xcenter, Ycenter, Zcenter;
- if ( computeGravityCenter( Xcenter, Ycenter, Zcenter ) )
- mySetRotationPointDlg->setCoords( Xcenter, Ycenter, Zcenter );
-}
-
-/*!
- \brief Update gravity center in the "Set Rotation Point" dialog box.
- \sa OCCViewer_SetRotationPointDlg class
-*/
-void OCCViewer_ViewWindow::updateGravityCoords()
-{
- if ( mySetRotationPointDlg && mySetRotationPointDlg->isVisible() && myCurrPointType == GRAVITY )
- {
- Standard_Real Xcenter, Ycenter, Zcenter;
- if ( computeGravityCenter( Xcenter, Ycenter, Zcenter ) )
- mySetRotationPointDlg->setCoords( Xcenter, Ycenter, Zcenter );
- }
-}
-
-/*!
- \brief Set the point selected by the user as a rotation point.
- \param theX X coordinate of the rotation point
- \param theY Y coordinate of the rotation point
- \param theZ Z coordinate of the rotation point
-*/
-void OCCViewer_ViewWindow::activateSetRotationSelected( double theX, double theY, double theZ )
-{
- if ( myRotationPointSelection )
- {
- Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
- ic->CloseAllContexts();
- myOperation = NOTHING;
- myViewPort->setCursor( myCursor );
- myCursorIsHand = false;
- myRotationPointSelection = false;
- }
-
- myPrevPointType = myCurrPointType;
- myCurrPointType = SELECTED;
- mySelectedPoint.SetCoord(theX,theY,theZ);
-}
-
-/*!
- \brief Start the point selection process.
-*/
-void OCCViewer_ViewWindow::activateStartPointSelection()
-{
- myPrevPointType = myCurrPointType;
- myCurrPointType = SELECTED;
-
- // activate selection ------>
- Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
-
- ic->OpenLocalContext();
-
- AIS_ListOfInteractive aList;
- ic->DisplayedObjects( aList );
- for ( AIS_ListIteratorOfListOfInteractive it( aList ); it.More(); it.Next() )
- {
- Handle(AIS_InteractiveObject) anObj = it.Value();
- if ( !anObj.IsNull() && anObj->HasPresentation() &&
- anObj->IsKind( STANDARD_TYPE(AIS_Shape) ) )
- {
- ic->Load(anObj,-1);
- ic->Activate(anObj,AIS_Shape::SelectionMode(TopAbs_VERTEX));
- }
- }
- // activate selection <------
-
- if ( !myCursorIsHand )
- {
- QCursor handCursor (Qt::PointingHandCursor);
- myCursorIsHand = true;
- myCursor = cursor();
- myViewPort->setCursor( handCursor );
- }
- myRotationPointSelection = true;
-}
-
-/*!
- \brief Start global panning operation
-
- Sets the corresponding cursor for the widget.
-*/
-void OCCViewer_ViewWindow::activateGlobalPanning()
-{
- Handle(V3d_View) aView3d = myViewPort->getView();
- if ( !aView3d.IsNull() ) {
- QPixmap globalPanPixmap (imageCrossCursor);
- QCursor glPanCursor (globalPanPixmap);
- myCurScale = aView3d->Scale();
- aView3d->FitAll(0.01, false);
- myCursor = cursor(); // save old cursor
- myViewPort->fitAll(); // fits view before selecting a new scene center
- if( setTransformRequested( PANGLOBAL ) )
- myViewPort->setCursor( glPanCursor );
- }
-}
-
-/*!
- \brief Starts fit operation.
-
- Sets the corresponding cursor for the widget.
-*/
-void OCCViewer_ViewWindow::activateWindowFit()
-{
- if ( !transformRequested() && !myCursorIsHand )
- myCursor = cursor(); /* save old cursor */
-
- if ( myOperation != WINDOWFIT ) {
- QCursor handCursor (Qt::PointingHandCursor);
- if( setTransformRequested ( WINDOWFIT ) )
- {
- myViewPort->setCursor ( handCursor );
- myCursorIsHand = true;
- }
- }
-}
-
-/*!
- \brief Start delayed viewer operation.
-*/
-bool OCCViewer_ViewWindow::setTransformRequested( OperationType op )
-{
- bool ok = transformEnabled( op );
- myOperation = ok ? op : NOTHING;
- myViewPort->setMouseTracking( myOperation == NOTHING );
- return ok;
-}
-
-/*!
- \brief Handle mouse move event.
- \param theEvent mouse event
-*/
-void OCCViewer_ViewWindow::vpMouseMoveEvent( QMouseEvent* theEvent )
-{
- if ( myIsKeyFree && interactionStyle() == SUIT_ViewModel::KEY_FREE ) {
- myIsKeyFree = false;
- switch ( getButtonState( theEvent, interactionStyle() ) ) {
- case ZOOMVIEW:
- myViewPort->startZoomAtPoint( myStartX, myStartY );
- activateZoom();
- break;
- case PANVIEW:
- activatePanning();
- break;
- case ROTATE:
- activateRotation();
- myViewPort->startRotation(myStartX, myStartY, myCurrPointType, mySelectedPoint);
- break;
- default:
- break;
- }
- }
-
- myCurrX = theEvent->x();
- myCurrY = theEvent->y();
- switch (myOperation) {
- case ROTATE:
- myViewPort->rotate(myCurrX, myCurrY, myCurrPointType, mySelectedPoint);
- break;
-
- case ZOOMVIEW:
- myViewPort->zoom(myStartX, myStartY, myCurrX, myCurrY);
- myStartX = myCurrX;
- myStartY = myCurrY;
- break;
-
- case PANVIEW:
- myViewPort->pan(myCurrX - myStartX, myStartY - myCurrY);
- myStartX = myCurrX;
- myStartY = myCurrY;
- break;
-
-/* case WINDOWFIT:
- myDrawRect = true;
- repaint();
- break;
-*/
- case PANGLOBAL:
- break;
-
- default:
- if ( myRotationPointSelection || isSketcherStyle() )
- {
- emit mouseMoving( this, theEvent );
- }
- else
- {
- int aState = theEvent->modifiers();
- int aButton = theEvent->buttons();
- int anInteractionStyle = interactionStyle();
- if ( ( anInteractionStyle == SUIT_ViewModel::STANDARD &&
- aButton == Qt::LeftButton && ( aState == Qt::NoModifier || Qt::ShiftModifier ) ) ||
- ( anInteractionStyle == SUIT_ViewModel::KEY_FREE &&
- aButton == Qt::LeftButton && ( aState == Qt::ControlModifier || aState == ( Qt::ControlModifier|Qt::ShiftModifier ) ) ) ) {
- myDrawRect = myEnableDrawMode;
- if ( myDrawRect ) {
- drawRect();
- if ( !myCursorIsHand ) { // we are going to sketch a rectangle
- QCursor handCursor (Qt::PointingHandCursor);
- myCursorIsHand = true;
- myCursor = cursor();
- myViewPort->setCursor( handCursor );
- }
- }
- emit mouseMoving( this, theEvent );
- }
- else if ( ( anInteractionStyle == SUIT_ViewModel::STANDARD &&
- aButton == Qt::RightButton && ( aState == Qt::NoModifier || Qt::ShiftModifier ) ) ||
- ( anInteractionStyle == SUIT_ViewModel::KEY_FREE &&
- aButton == Qt::RightButton && ( aState == Qt::ControlModifier || aState == ( Qt::ControlModifier|Qt::ShiftModifier ) ) ) ) {
- OCCViewer_ViewSketcher* sketcher = 0;
- QList<OCCViewer_ViewSketcher*>::Iterator it;
- for ( it = mySketchers.begin(); it != mySketchers.end() && !sketcher; ++it )
- {
- OCCViewer_ViewSketcher* sk = (*it);
- if( sk->isDefault() && sk->sketchButton() == aButton )
- sketcher = sk;
- }
- if ( sketcher && myCurSketch == -1 )
- {
- activateSketching( sketcher->type() );
- if ( mypSketcher )
- {
- myCurSketch = mypSketcher->sketchButton();
-
- if ( l_mbPressEvent )
- {
- QApplication::sendEvent( getViewPort(), l_mbPressEvent );
- delete l_mbPressEvent;
- l_mbPressEvent = 0;
- }
- QApplication::sendEvent( getViewPort(), theEvent );
- }
- }
- }
- else
- emit mouseMoving( this, theEvent );
- }
- }
-}
-
-/*!
- \brief Handle mouse release event.
- \param theEvent mouse event
-*/
-void OCCViewer_ViewWindow::vpMouseReleaseEvent(QMouseEvent* theEvent)
-{
- switch ( myOperation ) {
- case NOTHING:
- {
- int prevState = myCurSketch;
- if(theEvent->button() == Qt::RightButton)
- {
- QList<OCCViewer_ViewSketcher*>::Iterator it;
- for ( it = mySketchers.begin(); it != mySketchers.end() && myCurSketch != -1; ++it )
- {
- OCCViewer_ViewSketcher* sk = (*it);
- if( ( sk->sketchButton() & theEvent->button() ) && sk->sketchButton() == myCurSketch )
- myCurSketch = -1;
- }
- }
-
- emit mouseReleased(this, theEvent);
- if(theEvent->button() == Qt::RightButton && prevState == -1)
- {
- QContextMenuEvent aEvent( QContextMenuEvent::Mouse,
- theEvent->pos(), theEvent->globalPos() );
- emit contextMenuRequested( &aEvent );
- }
- }
- break;
- case ROTATE:
- myViewPort->endRotation();
- resetState();
- break;
-
- case PANVIEW:
- case ZOOMVIEW:
- resetState();
- break;
-
- case PANGLOBAL:
- if ( theEvent->button() == Qt::LeftButton ) {
- myViewPort->setCenter( theEvent->x(), theEvent->y() );
- myViewPort->getView()->SetScale(myCurScale);
- resetState();
- }
- break;
-
- case WINDOWFIT:
- if ( theEvent->button() == Qt::LeftButton ) {
- myCurrX = theEvent->x();
- myCurrY = theEvent->y();
- drawRect();
- QRect rect = SUIT_Tools::makeRect(myStartX, myStartY, myCurrX, myCurrY);
- if ( !rect.isEmpty() ) myViewPort->fitRect(rect);
- endDrawRect();
- resetState();
- }
- break;
- }
-
- // NOTE: viewer 3D detects a rectangle of selection using this event
- // so we must emit it BEFORE resetting the selection rectangle
-
- if ( theEvent->button() == Qt::LeftButton && myDrawRect ) {
- drawRect();
- endDrawRect();
- resetState();
- myViewPort->update();
- }
-
- if ( l_mbPressEvent )
- {
- delete l_mbPressEvent;
- l_mbPressEvent = 0;
- }
-}
-
-/*!
- \brief Reset the viewport to its initial state
- ( no transformations in process etc. )
-*/
-void OCCViewer_ViewWindow::resetState()
-{
- myDrawRect = false;
-
- if ( myRotationPointSelection )
- {
- QCursor handCursor (Qt::PointingHandCursor);
- myViewPort->setCursor( handCursor );
- }
- else
- {
- if ( transformRequested() || myCursorIsHand )
- myViewPort->setCursor( myCursor );
- myCursorIsHand = false;
- }
-
- if ( transformRequested() )
- emit vpTransformationFinished (myOperation);
-
- setTransformInProcess( false );
- setTransformRequested( NOTHING );
-}
-
-
-/*!
- \brief Draw rubber band rectangle.
-*/
-void OCCViewer_ViewWindow::drawRect()
-{
- if ( !myRectBand ) {
- myRectBand = new QtxRectRubberBand( myViewPort );
- //QPalette palette;
- //palette.setColor(myRectBand->foregroundRole(), Qt::white);
- //myRectBand->setPalette(palette);
- }
- //myRectBand->hide();
-
- myRectBand->setUpdatesEnabled ( false );
- QRect aRect = SUIT_Tools::makeRect(myStartX, myStartY, myCurrX, myCurrY);
- myRectBand->initGeometry( aRect );
-
- if ( !myRectBand->isVisible() )
- myRectBand->show();
-
- myRectBand->setUpdatesEnabled ( true );
- //myRectBand->repaint();
-
- //myRectBand->setVisible( aRect.isValid() );
- //if ( myRectBand->isVisible() )
- // myRectBand->repaint();
- //else
- // myRectBand->show();
- //myRectBand->repaint();
-}
-
-/*!
- \brief Clear rubber band rectangle on the end on the dragging operation.
-*/
-void OCCViewer_ViewWindow::endDrawRect()
-{
- //delete myRectBand;
- //myRectBand = 0;
- if ( myRectBand )
- {
- myRectBand->clearGeometry();
- myRectBand->hide();
- }
-}
-
-/*!
- \brief Create actions.
-*/
-void OCCViewer_ViewWindow::createActions()
-{
- if( !toolMgr()->isEmpty() )
- return;
-
- SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
-
- QtxAction* aAction;
-
- // Dump view
- aAction = new QtxAction(tr("MNU_DUMP_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_DUMP" ) ),
- tr( "MNU_DUMP_VIEW" ), 0, this);
- aAction->setStatusTip(tr("DSC_DUMP_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onDumpView()));
- toolMgr()->registerAction( aAction, DumpId );
-
- // FitAll
- aAction = new QtxAction(tr("MNU_FITALL"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_FITALL" ) ),
- tr( "MNU_FITALL" ), 0, this);
- aAction->setStatusTip(tr("DSC_FITALL"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onFitAll()));
- toolMgr()->registerAction( aAction, FitAllId );
-
- // FitRect
- aAction = new QtxAction(tr("MNU_FITRECT"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_FITAREA" ) ),
- tr( "MNU_FITRECT" ), 0, this);
- aAction->setStatusTip(tr("DSC_FITRECT"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(activateWindowFit()));
- toolMgr()->registerAction( aAction, FitRectId );
-
- // Zoom
- aAction = new QtxAction(tr("MNU_ZOOM_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_ZOOM" ) ),
- tr( "MNU_ZOOM_VIEW" ), 0, this);
- aAction->setStatusTip(tr("DSC_ZOOM_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(activateZoom()));
- toolMgr()->registerAction( aAction, ZoomId );
-
- // Panning
- aAction = new QtxAction(tr("MNU_PAN_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_PAN" ) ),
- tr( "MNU_PAN_VIEW" ), 0, this);
- aAction->setStatusTip(tr("DSC_PAN_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(activatePanning()));
- toolMgr()->registerAction( aAction, PanId );
-
- // Global Panning
- aAction = new QtxAction(tr("MNU_GLOBALPAN_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_GLOBALPAN" ) ),
- tr( "MNU_GLOBALPAN_VIEW" ), 0, this);
- aAction->setStatusTip(tr("DSC_GLOBALPAN_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(activateGlobalPanning()));
- toolMgr()->registerAction( aAction, GlobalPanId );
-
- // Rotation Point
- mySetRotationPointAction = new QtxAction(tr("MNU_CHANGINGROTATIONPOINT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_ROTATION_POINT" ) ),
- tr( "MNU_CHANGINGROTATIONPOINT_VIEW" ), 0, this);
- mySetRotationPointAction->setStatusTip(tr("DSC_CHANGINGROTATIONPOINT_VIEW"));
- mySetRotationPointAction->setCheckable( true );
- connect(mySetRotationPointAction, SIGNAL(toggled( bool )), this, SLOT(onSetRotationPoint( bool )));
- toolMgr()->registerAction( mySetRotationPointAction, ChangeRotationPointId );
-
- // Rotation
- aAction = new QtxAction(tr("MNU_ROTATE_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_ROTATE" ) ),
- tr( "MNU_ROTATE_VIEW" ), 0, this);
- aAction->setStatusTip(tr("DSC_ROTATE_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(activateRotation()));
- toolMgr()->registerAction( aAction, RotationId );
-
- // Projections
- aAction = new QtxAction(tr("MNU_FRONT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_FRONT" ) ),
- tr( "MNU_FRONT_VIEW" ), 0, this, false, "Viewers:Front view");
- aAction->setStatusTip(tr("DSC_FRONT_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onFrontView()));
- this->addAction(aAction);
- toolMgr()->registerAction( aAction, FrontId );
-
- aAction = new QtxAction(tr("MNU_BACK_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_BACK" ) ),
- tr( "MNU_BACK_VIEW" ), 0, this, false, "Viewers:Back view");
- aAction->setStatusTip(tr("DSC_BACK_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onBackView()));
- this->addAction(aAction);
- toolMgr()->registerAction( aAction, BackId );
-
- aAction = new QtxAction(tr("MNU_TOP_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_TOP" ) ),
- tr( "MNU_TOP_VIEW" ), 0, this, false, "Viewers:Top view");
- aAction->setStatusTip(tr("DSC_TOP_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onTopView()));
- this->addAction(aAction);
- toolMgr()->registerAction( aAction, TopId );
-
- aAction = new QtxAction(tr("MNU_BOTTOM_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_BOTTOM" ) ),
- tr( "MNU_BOTTOM_VIEW" ), 0, this, false, "Viewers:Bottom view");
- aAction->setStatusTip(tr("DSC_BOTTOM_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onBottomView()));
- this->addAction(aAction);
- toolMgr()->registerAction( aAction, BottomId );
-
- aAction = new QtxAction(tr("MNU_LEFT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_LEFT" ) ),
- tr( "MNU_LEFT_VIEW" ), 0, this, false, "Viewers:Left view");
- aAction->setStatusTip(tr("DSC_LEFT_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onLeftView()));
- this->addAction(aAction);
- toolMgr()->registerAction( aAction, LeftId );
-
- aAction = new QtxAction(tr("MNU_RIGHT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_RIGHT" ) ),
- tr( "MNU_RIGHT_VIEW" ), 0, this, false, "Viewers:Right view");
- aAction->setStatusTip(tr("DSC_RIGHT_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onRightView()));
- this->addAction(aAction);
- toolMgr()->registerAction( aAction, RightId );
-
- // rotate anticlockwise
- aAction = new QtxAction(tr("MNU_ANTICLOCKWISE_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_ANTICLOCKWISE" ) ),
- tr( "MNU_ANTICLOCKWISE_VIEW" ), 0, this, false, "Viewers:Rotate anticlockwise");
- aAction->setStatusTip(tr("DSC_ANTICLOCKWISE_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onAntiClockWiseView()));
- this->addAction(aAction);
- toolMgr()->registerAction( aAction, AntiClockWiseId );
-
- // rotate clockwise
- aAction = new QtxAction(tr("MNU_CLOCKWISE_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_CLOCKWISE" ) ),
- tr( "MNU_CLOCKWISE_VIEW" ), 0, this, false, "Viewers:Rotate clockwise");
- aAction->setStatusTip(tr("DSC_CLOCKWISE_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onClockWiseView()));
- this->addAction(aAction);
- toolMgr()->registerAction( aAction, ClockWiseId );
-
- // Reset
- aAction = new QtxAction(tr("MNU_RESET_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_RESET" ) ),
- tr( "MNU_RESET_VIEW" ), 0, this, false, "Viewers:Reset view");
- aAction->setStatusTip(tr("DSC_RESET_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onResetView()));
- this->addAction(aAction);
- toolMgr()->registerAction( aAction, ResetId );
-
- // Clone
- aAction = new QtxAction(tr("MNU_CLONE_VIEW"),
- aResMgr->loadPixmap("OCCViewer", tr("ICON_OCCVIEWER_CLONE_VIEW")),
- tr("MNU_CLONE_VIEW"), 0, this);
- aAction->setStatusTip(tr("DSC_CLONE_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onCloneView()));
- toolMgr()->registerAction( aAction, CloneId );
-
- aAction = new QtxAction (tr ("MNU_CLIPPING"), aResMgr->loadPixmap ("OCCViewer", tr ("ICON_OCCVIEWER_CLIPPING")),
- tr ("MNU_CLIPPING"), 0, this);
- aAction->setStatusTip (tr ("DSC_CLIPPING"));
- aAction->setCheckable (true);
- connect (aAction, SIGNAL (toggled (bool)), this, SLOT (onClipping (bool)));
- toolMgr()->registerAction (aAction, ClippingId);
-
- aAction = new QtxAction(tr("MNU_SHOOT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_SHOOT_VIEW" ) ),
- tr( "MNU_SHOOT_VIEW" ), 0, this);
- aAction->setStatusTip(tr("DSC_SHOOT_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onMemorizeView()));
- toolMgr()->registerAction( aAction, MemId );
-
- aAction = new QtxAction(tr("MNU_PRESETS_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_PRESETS_VIEW" ) ),
- tr( "MNU_PRESETS_VIEW" ), 0, this);
- aAction->setStatusTip(tr("DSC_PRESETS_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onRestoreView()));
- toolMgr()->registerAction( aAction, RestoreId );
-
- if (myModel->trihedronActivated()) {
- aAction = new QtxAction(tr("MNU_SHOW_TRIHEDRE"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_TRIHEDRON" ) ),
- tr( "MNU_SHOW_TRIHEDRE" ), 0, this);
- aAction->setStatusTip(tr("DSC_SHOW_TRIHEDRE"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onTrihedronShow()));
- toolMgr()->registerAction( aAction, TrihedronShowId );
- }
-
- // Scale
- aAction = new QtxAction(tr("MNU_SCALING"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_SCALING" ) ),
- tr( "MNU_SCALING" ), 0, this);
- aAction->setStatusTip(tr("DSC_SCALING"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onAxialScale()));
- toolMgr()->registerAction( aAction, AxialScaleId );
-
- // Enable/disable preselection
- aAction = new QtxAction(tr("MNU_ENABLE_PRESELECTION"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_PRESELECTION" ) ),
- tr( "MNU_ENABLE_PRESELECTION" ), 0, this);
- aAction->setStatusTip(tr("DSC_ENABLE_PRESELECTION"));
- aAction->setCheckable(true);
- connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchPreselection(bool)));
- toolMgr()->registerAction( aAction, SwitchPreselectionId );
-
- // Enable/disable selection
- aAction = new QtxAction(tr("MNU_ENABLE_SELECTION"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_SELECTION" ) ),
- tr( "MNU_ENABLE_SELECTION" ), 0, this);
- aAction->setStatusTip(tr("DSC_ENABLE_SELECTION"));
- aAction->setCheckable(true);
- connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchSelection(bool)));
- toolMgr()->registerAction( aAction, SwitchSelectionId );
-
- // Graduated axes
- aAction = new QtxAction(tr("MNU_GRADUATED_AXES"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_GRADUATED_AXES" ) ),
- tr( "MNU_GRADUATED_AXES" ), 0, this);
- aAction->setStatusTip(tr("DSC_GRADUATED_AXES"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onGraduatedAxes()));
- toolMgr()->registerAction( aAction, GraduatedAxesId );
-
- // Active only ambient light or not
- aAction = new QtxAction(tr("MNU_AMBIENT"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_AMBIENT" ) ),
- tr( "MNU_AMBIENT" ), 0, this);
- aAction->setStatusTip(tr("DSC_AMBIENT"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onAmbientToogle()));
- toolMgr()->registerAction( aAction, AmbientId );
-
- // Switch between interaction styles
- aAction = new QtxAction(tr("MNU_STYLE_SWITCH"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_STYLE_SWITCH" ) ),
- tr( "MNU_STYLE_SWITCH" ), 0, this);
- aAction->setStatusTip(tr("DSC_STYLE_SWITCH"));
- aAction->setCheckable(true);
- connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchInteractionStyle(bool)));
- toolMgr()->registerAction( aAction, SwitchInteractionStyleId );
-
- // Switch between zooming styles
- aAction = new QtxAction(tr("MNU_ZOOMING_STYLE_SWITCH"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_ZOOMING_STYLE_SWITCH" ) ),
- tr( "MNU_ZOOMING_STYLE_SWITCH" ), 0, this);
- aAction->setStatusTip(tr("DSC_ZOOMING_STYLE_SWITCH"));
- aAction->setCheckable(true);
- connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchZoomingStyle(bool)));
- toolMgr()->registerAction( aAction, SwitchZoomingStyleId );
-
- // Maximized view
- aAction = new QtxAction(tr("MNU_MINIMIZE_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_MINIMIZE" ) ),
- tr( "MNU_MINIMIZE_VIEW" ), 0, this );
- aAction->setStatusTip(tr("DSC_MINIMIZE_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(onMaximizedView()));
- toolMgr()->registerAction( aAction, MaximizedId );
-
- // Return to 3d view
- if (my2dMode!=No2dMode){
- aAction = new QtxAction(tr("MNU_RETURN_3D_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_RETURN_3D_VIEW" ) ),
- tr( "MNU_RETURN_3D_VIEW" ), 0, this );
- aAction->setStatusTip(tr("DSC_RETURN_3D_VIEW"));
- connect(aAction, SIGNAL(triggered()), this, SLOT(returnTo3dView()));
- toolMgr()->registerAction( aAction, ReturnTo3dViewId );
- }
-
- // Synchronize View
- toolMgr()->registerAction( synchronizeAction(), SynchronizeId );
-}
-
-/*!
- \brief Create toolbar.
-*/
-void OCCViewer_ViewWindow::createToolBar()
-{
- QString aToolbarName;
- switch (my2dMode) {
- case XYPlane:
- aToolbarName = tr( "LBL_XYTOOLBAR_LABEL" );
- break;
- case XZPlane:
- aToolbarName = tr( "LBL_XZTOOLBAR_LABEL" );
- break;
- case YZPlane:
- aToolbarName = tr( "LBL_YZTOOLBAR_LABEL" );
- break;
- default:
- aToolbarName = tr( "LBL_3DTOOLBAR_LABEL" );
- }
-
- int tid = toolMgr()->createToolBar( aToolbarName, false );
- if ( my2dMode != No2dMode ){
- toolMgr()->append( ReturnTo3dViewId, tid );
- toolMgr()->append( toolMgr()->separator(), tid );
- }
- toolMgr()->append( DumpId, tid );
- toolMgr()->append( SwitchInteractionStyleId, tid );
-#if OCC_VERSION_LARGE > 0x0603000A // available only with OCC-6.3-sp11 and higher version
- toolMgr()->append( SwitchZoomingStyleId, tid );
-#endif
- toolMgr()->append( SwitchPreselectionId, tid );
- toolMgr()->append( SwitchSelectionId, tid );
- if( myModel->trihedronActivated() )
- toolMgr()->append( TrihedronShowId, tid );
-
- QtxMultiAction* aScaleAction = new QtxMultiAction( this );
- aScaleAction->insertAction( toolMgr()->action( FitAllId ) );
- aScaleAction->insertAction( toolMgr()->action( FitRectId ) );
- aScaleAction->insertAction( toolMgr()->action( ZoomId ) );
- toolMgr()->append( aScaleAction, tid );
-
- QtxMultiAction* aPanningAction = new QtxMultiAction( this );
- aPanningAction->insertAction( toolMgr()->action( PanId ) );
- aPanningAction->insertAction( toolMgr()->action( GlobalPanId ) );
- toolMgr()->append( aPanningAction, tid );
-
- if (my2dMode == No2dMode) {
- toolMgr()->append( ChangeRotationPointId, tid );
- toolMgr()->append( RotationId, tid );
-
- QtxMultiAction* aViewsAction = new QtxMultiAction( this );
- aViewsAction->insertAction( toolMgr()->action( FrontId ) );
- aViewsAction->insertAction( toolMgr()->action( BackId ) );
- aViewsAction->insertAction( toolMgr()->action( TopId ) );
- aViewsAction->insertAction( toolMgr()->action( BottomId ) );
- aViewsAction->insertAction( toolMgr()->action( LeftId ) );
- aViewsAction->insertAction( toolMgr()->action( RightId ) );
- toolMgr()->append( aViewsAction, tid );
-
- toolMgr()->append( AntiClockWiseId, tid );
- toolMgr()->append( ClockWiseId, tid );
-
- toolMgr()->append( ResetId, tid );
- }
-
- QtxMultiAction* aMemAction = new QtxMultiAction( this );
- aMemAction->insertAction( toolMgr()->action( MemId ) );
- aMemAction->insertAction( toolMgr()->action( RestoreId ) );
- toolMgr()->append( aMemAction, tid );
-
- toolMgr()->append( toolMgr()->separator(), tid );
- toolMgr()->append( CloneId, tid );
-
- toolMgr()->append( toolMgr()->separator(), tid );
- toolMgr()->append( ClippingId, tid );
- toolMgr()->append( AxialScaleId, tid );
-#if OCC_VERSION_LARGE > 0x06030009 // available only with OCC-6.3-sp10 and higher version
- toolMgr()->append( GraduatedAxesId, tid );
-#endif
- toolMgr()->append( AmbientId, tid );
-
- toolMgr()->append( MaximizedId, tid );
- toolMgr()->append( SynchronizeId, tid );
-}
-
-/*!
- \brief Perform 'fit all' operation.
-*/
-void OCCViewer_ViewWindow::onViewFitAll()
-{
- myViewPort->fitAll();
-}
-
-/*!
- \brief Perform "front view" transformation.
-*/
-void OCCViewer_ViewWindow::onFrontView()
-{
- emit vpTransformationStarted ( FRONTVIEW );
- Handle(V3d_View) aView3d = myViewPort->getView();
- if ( !aView3d.IsNull() ) aView3d->SetProj (V3d_Xpos);
- onViewFitAll();
- emit vpTransformationFinished ( FRONTVIEW );
-}
-
-/*!
- \brief Perform "back view" transformation.
-*/
-void OCCViewer_ViewWindow::onBackView()
-{
- emit vpTransformationStarted ( BACKVIEW );
- Handle(V3d_View) aView3d = myViewPort->getView();
- if ( !aView3d.IsNull() ) aView3d->SetProj (V3d_Xneg);
- onViewFitAll();
- emit vpTransformationFinished ( BACKVIEW );
-}
-
-/*!
- \brief Perform "top view" transformation.
-*/
-void OCCViewer_ViewWindow::onTopView()
-{
- emit vpTransformationStarted ( TOPVIEW );
- Handle(V3d_View) aView3d = myViewPort->getView();
- if ( !aView3d.IsNull() ) aView3d->SetProj (V3d_Zpos);
- onViewFitAll();
- emit vpTransformationFinished ( TOPVIEW );
-}
-
-/*!
- \brief Perform "bottom view" transformation.
-*/
-void OCCViewer_ViewWindow::onBottomView()
-{
- emit vpTransformationStarted ( BOTTOMVIEW );
- Handle(V3d_View) aView3d = myViewPort->getView();
- if ( !aView3d.IsNull() ) aView3d->SetProj (V3d_Zneg);
- onViewFitAll();
- emit vpTransformationFinished ( BOTTOMVIEW );
-}
-
-/*!
- \brief Perform "left view" transformation.
-*/
-void OCCViewer_ViewWindow::onLeftView()
-{
- emit vpTransformationStarted ( LEFTVIEW );
- Handle(V3d_View) aView3d = myViewPort->getView();
- if ( !aView3d.IsNull() ) aView3d->SetProj (V3d_Yneg);
- onViewFitAll();
- emit vpTransformationFinished ( LEFTVIEW );
-}
-
-/*!
- \brief Perform "right view" transformation.
-*/
-void OCCViewer_ViewWindow::onRightView()
-{
- emit vpTransformationStarted ( RIGHTVIEW );
- Handle(V3d_View) aView3d = myViewPort->getView();
- if ( !aView3d.IsNull() ) aView3d->SetProj (V3d_Ypos);
- onViewFitAll();
- emit vpTransformationFinished ( RIGHTVIEW );
-}
-
-/*!
- \brief Rotate view 90 degrees clockwise
-*/
-void OCCViewer_ViewWindow::onClockWiseView()
-{
- emit vpTransformationStarted ( CLOCKWISEVIEW );
- myViewPort->rotateXY( 90. );
- emit vpTransformationFinished ( CLOCKWISEVIEW );
-}
-
-/*!
- \brief Rotate view 90 degrees conterclockwise
-*/
-void OCCViewer_ViewWindow::onAntiClockWiseView()
-{
- emit vpTransformationStarted ( ANTICLOCKWISEVIEW );
- myViewPort->rotateXY( -90. );
- emit vpTransformationFinished ( ANTICLOCKWISEVIEW );
-}
-
-/*!
- \brief Perform "reset view" transformation.
-
- Sets default orientation of the viewport camera.
-*/
-void OCCViewer_ViewWindow::onResetView()
-{
- emit vpTransformationStarted( RESETVIEW );
- bool upd = myViewPort->getView()->SetImmediateUpdate( false );
- myViewPort->getView()->Reset( false );
- myViewPort->fitAll( false, true, false );
- myViewPort->getView()->SetImmediateUpdate( upd );
- myViewPort->getView()->Update();
- emit vpTransformationFinished( RESETVIEW );
-}
-
-/*!
- \brief Perform "fit all" transformation.
-*/
-void OCCViewer_ViewWindow::onFitAll()
-{
- emit vpTransformationStarted( FITALLVIEW );
- myViewPort->fitAll();
- emit vpTransformationFinished( FITALLVIEW );
-}
-
-/*!
- \brief Called if 'change rotation point' operation is activated.
- \param on action state
-*/
-void OCCViewer_ViewWindow::onSetRotationPoint( bool on )
-{
- if (on)
- {
- if (!mySetRotationPointDlg)
- {
- mySetRotationPointDlg = new OCCViewer_SetRotationPointDlg (this);
- mySetRotationPointDlg->SetAction(mySetRotationPointAction);
- }
-
- if (!mySetRotationPointDlg->isVisible())
- {
- //if (mySetRotationPointDlg->IsFirstShown())
- if (myCurrPointType == GRAVITY)
- {
- Standard_Real Xcenter, Ycenter, Zcenter;
- if (computeGravityCenter(Xcenter, Ycenter, Zcenter))
- mySetRotationPointDlg->setCoords(Xcenter, Ycenter, Zcenter);
- }
- mySetRotationPointDlg->show();
- }
- }
- else
- {
- if (mySetRotationPointDlg->isVisible())
- mySetRotationPointDlg->hide();
- }
-}
-
-/*!
- \brief Create one more window with same content.
-*/
-void OCCViewer_ViewWindow::onCloneView()
-{
- SUIT_ViewWindow* vw = myManager->createViewWindow();
- //vw->show();
- emit viewCloned( vw );
-}
-
-/*!
- Creates one more window with same content
-*/
-void OCCViewer_ViewWindow::onAxialScale()
-{
- if ( !myScalingDlg )
- myScalingDlg = new OCCViewer_AxialScaleDlg( this );
-
- if ( !myScalingDlg->isVisible() )
- {
- myScalingDlg->Update();
- myScalingDlg->show();
- }
-}
-
-/*!
- Shows Graduated Axes dialog
-*/
-void OCCViewer_ViewWindow::onGraduatedAxes()
-{
- myCubeAxesDlg->Update();
- myCubeAxesDlg->show();
-}
-
-void OCCViewer_ViewWindow::onAmbientToogle()
-{
- Handle(V3d_Viewer) viewer = myViewPort->getViewer();
- viewer->InitDefinedLights();
- while(viewer->MoreDefinedLights())
- {
- Handle(V3d_Light) light = viewer->DefinedLight();
- if(light->Type() != V3d_AMBIENT)
- {
- Handle(V3d_View) aView3d = myViewPort->getView();
- if( aView3d->IsActiveLight(light) ) viewer->SetLightOff(light);
- else viewer->SetLightOn(light);
- }
- viewer->NextDefinedLights();
- }
- viewer->Update();
-}
-
-/*!
- \brief Store view parameters.
-*/
-void OCCViewer_ViewWindow::onMemorizeView()
-{
- appendViewAspect( getViewParams() );
-}
-
-/*!
- \brief Restore view parameters.
-*/
-void OCCViewer_ViewWindow::onRestoreView()
-{
- OCCViewer_CreateRestoreViewDlg* aDlg = new OCCViewer_CreateRestoreViewDlg( centralWidget(), this );
- connect( aDlg, SIGNAL( dlgOk() ), this, SLOT( setRestoreFlag() ) );
- aDlg->exec();
- updateViewAspects( aDlg->parameters() );
- if( myRestoreFlag && aDlg->parameters().count() )
- performRestoring( aDlg->currentItem() );
-}
-
-/*!
- \brief Restore view parameters.
- \param anItem view parameters
-*/
-void OCCViewer_ViewWindow::performRestoring( const viewAspect& anItem, bool baseParamsOnly )
-{
- Handle(V3d_View) aView3d = myViewPort->getView();
-
- Standard_Boolean prev = aView3d->SetImmediateUpdate( Standard_False );
- aView3d->SetScale( anItem.scale );
- aView3d->SetCenter( anItem.centerX, anItem.centerY );
- aView3d->SetTwist( anItem.twist );
- aView3d->SetAt( anItem.atX, anItem.atY, anItem.atZ );
- aView3d->SetImmediateUpdate( prev );
- aView3d->SetEye( anItem.eyeX, anItem.eyeY, anItem.eyeZ );
- aView3d->SetProj( anItem.projX, anItem.projY, anItem.projZ );
- aView3d->SetAxialScale( anItem.scaleX, anItem.scaleY, anItem.scaleZ );
-
- if ( !baseParamsOnly ) {
-
- myModel->setTrihedronShown( anItem.isVisible );
- myModel->setTrihedronSize( anItem.size );
-
-#if OCC_VERSION_LARGE > 0x06030009 // available only with OCC-6.3-sp10 and higher version
- // graduated trihedron
- bool anIsVisible = anItem.gtIsVisible;
- OCCViewer_AxisWidget::AxisData anAxisData[3];
- anAxisData[0].DrawName = anItem.gtDrawNameX;
- anAxisData[1].DrawName = anItem.gtDrawNameZ;
- anAxisData[2].DrawName = anItem.gtDrawNameZ;
- anAxisData[0].Name = anItem.gtNameX;
- anAxisData[1].Name = anItem.gtNameZ;
- anAxisData[2].Name = anItem.gtNameZ;
- anAxisData[0].NameColor = QColor( anItem.gtNameColorRX,
- anItem.gtNameColorGX,
- anItem.gtNameColorBX );
- anAxisData[1].NameColor = QColor( anItem.gtNameColorRY,
- anItem.gtNameColorGY,
- anItem.gtNameColorBY );
- anAxisData[2].NameColor = QColor( anItem.gtNameColorRZ,
- anItem.gtNameColorGZ,
- anItem.gtNameColorBZ );
- anAxisData[0].DrawValues = anItem.gtDrawValuesX;
- anAxisData[1].DrawValues = anItem.gtDrawValuesY;
- anAxisData[2].DrawValues = anItem.gtDrawValuesZ;
- anAxisData[0].NbValues = anItem.gtNbValuesX;
- anAxisData[1].NbValues = anItem.gtNbValuesY;
- anAxisData[2].NbValues = anItem.gtNbValuesZ;
- anAxisData[0].Offset = anItem.gtOffsetX;
- anAxisData[1].Offset = anItem.gtOffsetY;
- anAxisData[2].Offset = anItem.gtOffsetZ;
- anAxisData[0].Color = QColor( anItem.gtColorRX,
- anItem.gtColorGX,
- anItem.gtColorBX );
- anAxisData[1].Color = QColor( anItem.gtColorRY,
- anItem.gtColorGY,
- anItem.gtColorBY );
- anAxisData[2].Color = QColor( anItem.gtColorRZ,
- anItem.gtColorGZ,
- anItem.gtColorBZ );
- anAxisData[0].DrawTickmarks = anItem.gtDrawTickmarksX;
- anAxisData[1].DrawTickmarks = anItem.gtDrawTickmarksY;
- anAxisData[2].DrawTickmarks = anItem.gtDrawTickmarksZ;
- anAxisData[0].TickmarkLength = anItem.gtTickmarkLengthX;
- anAxisData[1].TickmarkLength = anItem.gtTickmarkLengthY;
- anAxisData[2].TickmarkLength = anItem.gtTickmarkLengthZ;
-
- myCubeAxesDlg->SetData( anIsVisible, anAxisData );
- myCubeAxesDlg->ApplyData( aView3d );
-#endif
-
- } // if ( !baseParamsOnly )
-
- myRestoreFlag = 0;
-}
-
-/*!
- \brief Set restore flag.
-*/
-void OCCViewer_ViewWindow::setRestoreFlag()
-{
- myRestoreFlag = 1;
-}
-
-/*!
- \brief Called when action "show/hide trihedron" is activated.
-*/
-void OCCViewer_ViewWindow::onTrihedronShow()
-{
- myModel->toggleTrihedron();
-}
-
-/*!
- \brief Toggles preselection (highlighting) on/off
-*/
-void OCCViewer_ViewWindow::onSwitchPreselection( bool on )
-{
- myPreselectionEnabled = on;
- myModel->setSelectionOptions( isPreselectionEnabled(), myModel->isSelectionEnabled() );
-
- // unhighlight all highlighted objects
- /*if ( !on ) {
- myModel->unHighlightAll( true, false );
- }*/
-
- // update action state if method is called outside
- QtxAction* a = dynamic_cast<QtxAction*>( toolMgr()->action( SwitchPreselectionId ) );
- if ( a && a->isChecked() != on ) {
- a->setChecked( on );
- }
-}
-
-/*!
- \brief Toggles selection on/off
-*/
-void OCCViewer_ViewWindow::onSwitchSelection( bool on )
-{
- mySelectionEnabled = on;
- myModel->setSelectionOptions( myModel->isPreselectionEnabled(), isSelectionEnabled() );
-
- // update action state if method is called outside
-
- // preselection
- QtxAction* a = dynamic_cast<QtxAction*>( toolMgr()->action( SwitchPreselectionId ) );
- if ( a ) {
- a->setEnabled( on );
- }
-
- // selection
- a = dynamic_cast<QtxAction*>( toolMgr()->action( SwitchSelectionId ) );
- if ( a && a->isChecked() != on ) {
- a->setChecked( on );
- }
-}
-
-/*!
- \brief Switches "keyboard free" interaction style on/off
-*/
-void OCCViewer_ViewWindow::onSwitchInteractionStyle( bool on )
-{
- myInteractionStyle = on ? (int)SUIT_ViewModel::KEY_FREE : (int)SUIT_ViewModel::STANDARD;
-
- // update action state if method is called outside
- QtxAction* a = dynamic_cast<QtxAction*>( toolMgr()->action( SwitchInteractionStyleId ) );
- if ( a->isChecked() != on )
- a->setChecked( on );
-}
-
-/*!
- \brief Toogles advanced zooming style (relatively to the cursor position) on/off
-*/
-void OCCViewer_ViewWindow::onSwitchZoomingStyle( bool on )
-{
- myViewPort->setAdvancedZoomingEnabled( on );
-
- // update action state if method is called outside
- QtxAction* a = dynamic_cast<QtxAction*>( toolMgr()->action( SwitchZoomingStyleId ) );
- if ( a->isChecked() != on )
- a->setChecked( on );
-}
-
-/*!
- \brief Get current interaction style
- \return interaction style
-*/
-int OCCViewer_ViewWindow::interactionStyle() const
-{
- return myInteractionStyle;
-}
-
-/*!
- \brief Set current interaction style
- \param theStyle interaction style
-*/
-void OCCViewer_ViewWindow::setInteractionStyle( const int theStyle )
-{
- onSwitchInteractionStyle( theStyle == (int)SUIT_ViewModel::KEY_FREE );
-}
-
-/*!
- \brief Get current zooming style
- \return zooming style
-*/
-int OCCViewer_ViewWindow::zoomingStyle() const
-{
- return myViewPort->isAdvancedZoomingEnabled() ? 1 : 0;
-}
-
-/*!
- \brief Set current zooming style
- \param theStyle zooming style
-*/
-void OCCViewer_ViewWindow::setZoomingStyle( const int theStyle )
-{
- onSwitchZoomingStyle( theStyle == 1 );
-}
-
-/*!
- \brief Dump view window contents to the pixmap.
- \return pixmap containing all scene rendered in the window
-*/
-QImage OCCViewer_ViewWindow::dumpView()
-{
- Handle(V3d_View) view = myViewPort->getView();
- if ( view.IsNull() )
- return QImage();
-
- int aWidth = myViewPort->width();
- int aHeight = myViewPort->height();
- QApplication::syncX();
- view->Redraw(); // In order to reactivate GL context
- //view->Update();
-
- OpenGLUtils_FrameBuffer aFrameBuffer;
- if( aFrameBuffer.init( aWidth, aHeight ) )
- {
- QImage anImage( aWidth, aHeight, QImage::Format_RGB32 );
-
- glPushAttrib( GL_VIEWPORT_BIT );
- glViewport( 0, 0, aWidth, aHeight );
- aFrameBuffer.bind();
-
- // draw scene
- view->Redraw();
-
- aFrameBuffer.unbind();
- glPopAttrib();
-
- aFrameBuffer.bind();
- glReadPixels( 0, 0, aWidth, aHeight, GL_RGBA, GL_UNSIGNED_BYTE, anImage.bits() );
- aFrameBuffer.unbind();
-
- anImage = anImage.rgbSwapped();
- anImage = anImage.mirrored();
- return anImage;
- }
- // if frame buffers are unsupported, use old functionality
- //view->Redraw();
-
- unsigned char* data = new unsigned char[ aWidth*aHeight*4 ];
-
- QPoint p = myViewPort->mapFromParent(myViewPort->geometry().topLeft());
-
- glReadPixels( p.x(), p.y(), aWidth, aHeight, GL_RGBA, GL_UNSIGNED_BYTE,
- data);
-
- QImage anImage( data, aWidth, aHeight, QImage::Format_ARGB32 );
- anImage = anImage.mirrored();
- anImage = anImage.rgbSwapped();
- return anImage;
-}
-
-bool OCCViewer_ViewWindow::dumpViewToFormat( const QImage& img,
- const QString& fileName,
- const QString& format )
-{
- if ( format != "PS" && format != "EPS")
- return SUIT_ViewWindow::dumpViewToFormat( img, fileName, format );
-
- Handle(Visual3d_View) a3dView = myViewPort->getView()->View();
-
- if (format == "PS")
- a3dView->Export(strdup(qPrintable(fileName)), Graphic3d_EF_PostScript);
- else if (format == "EPS")
- a3dView->Export(strdup(qPrintable(fileName)), Graphic3d_EF_EnhPostScript);
-
- return true;
-}
-
-
-QString OCCViewer_ViewWindow::filter() const
-{
- return tr( "OCC_IMAGE_FILES" );
-}
-
-
-/*!
- \brief Set parameters of the cutting plane
- \param on if \c true, cutting plane is enabled
- \param x X position of plane point
- \param y Y position of plane point
- \param z Z position of plane point
- \param dx X coordinate of plane normal
- \param dy Y coordinate of plane normal
- \param dz Z coordinate of plane normal
-*/
-void OCCViewer_ViewWindow::setCuttingPlane( bool on, const double x, const double y, const double z,
- const double dx, const double dy, const double dz )
-{
- Handle(V3d_View) view = myViewPort->getView();
- if ( view.IsNull() )
- return;
-
- if ( on ) {
- Handle(V3d_Viewer) viewer = myViewPort->getViewer();
-
- // try to use already existing plane or create a new one
- Handle(V3d_Plane) clipPlane;
-
- // calculate new a,b,c,d values for the plane
- gp_Pln pln (gp_Pnt(x, y, z), gp_Dir(dx, dy, dz));
- double a, b, c, d;
- pln.Coefficients(a, b, c, d);
-
- Graphic3d_SequenceOfHClipPlane aPlanes = view->GetClipPlanes();
- Handle(Graphic3d_ClipPlane) aClipPlane;
- if(aPlanes.Size() > 0 ) {
- Graphic3d_SequenceOfHClipPlane::Iterator anIter (aPlanes);
- aClipPlane = anIter.Value();
- aClipPlane->SetEquation(pln);
- aClipPlane->SetOn(Standard_True);
- } else {
- aClipPlane = new Graphic3d_ClipPlane(pln);
- view->AddClipPlane(aClipPlane);
- aClipPlane->SetOn(Standard_True);
- }
- }
- else {
- Graphic3d_SequenceOfHClipPlane aPlanes = view->GetClipPlanes();
- Graphic3d_SequenceOfHClipPlane::Iterator anIter (aPlanes);
- for( ;anIter.More();anIter.Next() ){
- Handle(Graphic3d_ClipPlane) aClipPlane = anIter.Value();
- aClipPlane->SetOn(Standard_False);
- }
- }
-
- view->Update();
- view->Redraw();
-}
-
-void OCCViewer_ViewWindow::setCuttingPlane( bool on, const gp_Pln pln )
-{
- gp_Dir aDir = pln.Axis().Direction();
- gp_Pnt aPnt = pln.Location();
- setCuttingPlane(on, aPnt.X(), aPnt.Y(), aPnt.Z(), aDir.X(), aDir.Y(), aDir.Z());
-}
-
-
-/*!
- \brief Check if any cutting plane is enabled
- \return \c true if at least one cutting plane is enabled
-*/
-bool OCCViewer_ViewWindow::isCuttingPlane()
-{
- Handle(V3d_View) view = myViewPort->getView();
- bool res = false;
- Graphic3d_SequenceOfHClipPlane aPlanes = view->GetClipPlanes();
- Graphic3d_SequenceOfHClipPlane::Iterator anIter (aPlanes);
- for( ;anIter.More();anIter.Next() ) {
- Handle(Graphic3d_ClipPlane) aClipPlane = anIter.Value();
- if(aClipPlane->IsOn()) {
- res = true;
- break;
- }
- }
- return res;
-}
-
-/*!
- \brief Get the visual parameters of the view window.
- \return visual parameters of view window
-*/
-viewAspect OCCViewer_ViewWindow::getViewParams() const
-{
- double centerX, centerY, projX, projY, projZ, twist;
- double atX, atY, atZ, eyeX, eyeY, eyeZ;
- double aScaleX, aScaleY, aScaleZ;
-
- Handle(V3d_View) aView3d = myViewPort->getView();
-
- aView3d->Center( centerX, centerY );
- aView3d->Proj( projX, projY, projZ );
- aView3d->At( atX, atY, atZ );
- aView3d->Eye( eyeX, eyeY, eyeZ );
- twist = aView3d->Twist();
-
- aView3d->AxialScale(aScaleX,aScaleY,aScaleZ);
-
- bool isShown = myModel->isTrihedronVisible();
- double size = myModel->trihedronSize();
-
- QString aName = QTime::currentTime().toString() + QString::fromLatin1( " h:m:s" );
-
- viewAspect params;
- params.scale = aView3d->Scale();
- params.centerX = centerX;
- params.centerY = centerY;
- params.projX = projX;
- params.projY = projY;
- params.projZ = projZ;
- params.twist = twist;
- params.atX = atX;
- params.atY = atY;
- params.atZ = atZ;
- params.eyeX = eyeX;
- params.eyeY = eyeY;
- params.eyeZ = eyeZ;
- params.scaleX = aScaleX;
- params.scaleY = aScaleY;
- params.scaleZ = aScaleZ;
- params.name = aName;
- params.isVisible= isShown;
- params.size = size;
-
-#if OCC_VERSION_LARGE > 0x06030009 // available only with OCC-6.3-sp10 and higher version
- // graduated trihedron
- bool anIsVisible = false;
- OCCViewer_AxisWidget::AxisData anAxisData[3];
- myCubeAxesDlg->GetData( anIsVisible, anAxisData );
-
- params.gtIsVisible = anIsVisible;
- params.gtDrawNameX = anAxisData[0].DrawName;
- params.gtDrawNameY = anAxisData[1].DrawName;
- params.gtDrawNameZ = anAxisData[2].DrawName;
- params.gtNameX = anAxisData[0].Name;
- params.gtNameY = anAxisData[1].Name;
- params.gtNameZ = anAxisData[2].Name;
- params.gtNameColorRX = anAxisData[0].NameColor.red();
- params.gtNameColorGX = anAxisData[0].NameColor.green();
- params.gtNameColorBX = anAxisData[0].NameColor.blue();
- params.gtNameColorRY = anAxisData[1].NameColor.red();
- params.gtNameColorGY = anAxisData[1].NameColor.green();
- params.gtNameColorBY = anAxisData[1].NameColor.blue();
- params.gtNameColorRZ = anAxisData[2].NameColor.red();
- params.gtNameColorGZ = anAxisData[2].NameColor.green();
- params.gtNameColorBZ = anAxisData[2].NameColor.blue();
- params.gtDrawValuesX = anAxisData[0].DrawValues;
- params.gtDrawValuesY = anAxisData[1].DrawValues;
- params.gtDrawValuesZ = anAxisData[2].DrawValues;
- params.gtNbValuesX = anAxisData[0].NbValues;
- params.gtNbValuesY = anAxisData[1].NbValues;
- params.gtNbValuesZ = anAxisData[2].NbValues;
- params.gtOffsetX = anAxisData[0].Offset;
- params.gtOffsetY = anAxisData[1].Offset;
- params.gtOffsetZ = anAxisData[2].Offset;
- params.gtColorRX = anAxisData[0].Color.red();
- params.gtColorGX = anAxisData[0].Color.green();
- params.gtColorBX = anAxisData[0].Color.blue();
- params.gtColorRY = anAxisData[1].Color.red();
- params.gtColorGY = anAxisData[1].Color.green();
- params.gtColorBY = anAxisData[1].Color.blue();
- params.gtColorRZ = anAxisData[2].Color.red();
- params.gtColorGZ = anAxisData[2].Color.green();
- params.gtColorBZ = anAxisData[2].Color.blue();
- params.gtDrawTickmarksX = anAxisData[0].DrawTickmarks;
- params.gtDrawTickmarksY = anAxisData[1].DrawTickmarks;
- params.gtDrawTickmarksZ = anAxisData[2].DrawTickmarks;
- params.gtTickmarkLengthX = anAxisData[0].TickmarkLength;
- params.gtTickmarkLengthY = anAxisData[1].TickmarkLength;
- params.gtTickmarkLengthZ = anAxisData[2].TickmarkLength;
-#endif
-
- return params;
-}
-
-/*!
- \brief Get visual parameters of this view window.
- \return visual parameters of view window
-*/
-QString OCCViewer_ViewWindow::getVisualParameters()
-{
- viewAspect params = getViewParams();
-
- QStringList data;
-
- data << QString( "scale=%1" ) .arg( params.scale, 0, 'e', 12 );
- data << QString( "centerX=%1" ) .arg( params.centerX, 0, 'e', 12 );
- data << QString( "centerY=%1" ) .arg( params.centerY, 0, 'e', 12 );
- data << QString( "projX=%1" ) .arg( params.projX, 0, 'e', 12 );
- data << QString( "projY=%1" ) .arg( params.projY, 0, 'e', 12 );
- data << QString( "projZ=%1" ) .arg( params.projZ, 0, 'e', 12 );
- data << QString( "twist=%1" ) .arg( params.twist, 0, 'e', 12 );
- data << QString( "atX=%1" ) .arg( params.atX, 0, 'e', 12 );
- data << QString( "atY=%1" ) .arg( params.atY, 0, 'e', 12 );
- data << QString( "atZ=%1" ) .arg( params.atZ, 0, 'e', 12 );
- data << QString( "eyeX=%1" ) .arg( params.eyeX, 0, 'e', 12 );
- data << QString( "eyeY=%1" ) .arg( params.eyeY, 0, 'e', 12 );
- data << QString( "eyeZ=%1" ) .arg( params.eyeZ, 0, 'e', 12 );
- data << QString( "scaleX=%1" ) .arg( params.scaleX, 0, 'e', 12 );
- data << QString( "scaleY=%1" ) .arg( params.scaleY, 0, 'e', 12 );
- data << QString( "scaleZ=%1" ) .arg( params.scaleZ, 0, 'e', 12 );
- data << QString( "isVisible=%1" ).arg( params.isVisible );
- data << QString( "size=%1" ) .arg( params.size, 0, 'f', 2 );
-
- ClipPlanesList aPlanes = myModel->getClipPlanes();
- for ( int i=0; i < aPlanes.size(); i++ ) {
- OCCViewer_ClipPlane& aPlane = aPlanes[i];
- QString ClippingPlane = QString( "ClippingPlane%1=").arg( i+1 );
- ClippingPlane += QString( "Mode~%1;").arg( (int)aPlane.PlaneMode );
- ClippingPlane += QString( "IsActive~%1;").arg( aPlane.IsOn );
- ClippingPlane += QString( "AbsoluteOrientation~%1;" ).arg( aPlane.Orientation );
- ClippingPlane += QString( "IsInvert~%1;" ).arg( aPlane.IsInvert );
- ClippingPlane += QString( "X~%1;" ).arg( aPlane.X );
- ClippingPlane += QString( "Y~%1;" ).arg( aPlane.Y );
- ClippingPlane += QString( "Z~%1;" ).arg( aPlane.Z );
- ClippingPlane += QString( "Dx~%1;" ).arg( aPlane.Dx );
- ClippingPlane += QString( "Dy~%1;" ).arg( aPlane.Dy );;
- ClippingPlane += QString( "Dz~%1;" ).arg( aPlane.Dz );
- ClippingPlane += QString( "RelativeOrientation~%1;" ).arg( aPlane.RelativeMode.Orientation );
- ClippingPlane += QString( "Distance~%1;" ).arg( aPlane.RelativeMode.Distance );
- ClippingPlane += QString( "Rotation1~%1;" ).arg( aPlane.RelativeMode.Rotation1 );
- ClippingPlane += QString( "Rotation2~%1" ).arg( aPlane.RelativeMode.Rotation2 );
- data << ClippingPlane;
- }
-
-
-#if OCC_VERSION_LARGE > 0x06030009 // available only with OCC-6.3-sp10 or newer version
- // graduated trihedron
- data << QString( "gtIsVisible=%1" ) .arg( params.gtIsVisible );
- data << QString( "gtDrawNameX=%1" ) .arg( params.gtDrawNameX );
- data << QString( "gtDrawNameY=%1" ) .arg( params.gtDrawNameY );
- data << QString( "gtDrawNameZ=%1" ) .arg( params.gtDrawNameZ );
- data << QString( "gtNameX=%1" ) .arg( params.gtNameX );
- data << QString( "gtNameY=%1" ) .arg( params.gtNameY );
- data << QString( "gtNameZ=%1" ) .arg( params.gtNameZ );
- data << QString( "gtNameColorRX=%1" ) .arg( params.gtNameColorRX );
- data << QString( "gtNameColorGX=%1" ) .arg( params.gtNameColorGX );
- data << QString( "gtNameColorBX=%1" ) .arg( params.gtNameColorBX );
- data << QString( "gtNameColorRY=%1" ) .arg( params.gtNameColorRY );
- data << QString( "gtNameColorGY=%1" ) .arg( params.gtNameColorGY );
- data << QString( "gtNameColorBY=%1" ) .arg( params.gtNameColorBY );
- data << QString( "gtNameColorRZ=%1" ) .arg( params.gtNameColorRZ );
- data << QString( "gtNameColorGZ=%1" ) .arg( params.gtNameColorGZ );
- data << QString( "gtNameColorBZ=%1" ) .arg( params.gtNameColorBZ );
- data << QString( "gtDrawValuesX=%1" ) .arg( params.gtDrawValuesX );
- data << QString( "gtDrawValuesY=%1" ) .arg( params.gtDrawValuesY );
- data << QString( "gtDrawValuesZ=%1" ) .arg( params.gtDrawValuesZ );
- data << QString( "gtNbValuesX=%1" ) .arg( params.gtNbValuesX );
- data << QString( "gtNbValuesY=%1" ) .arg( params.gtNbValuesY );
- data << QString( "gtNbValuesZ=%1" ) .arg( params.gtNbValuesZ );
- data << QString( "gtOffsetX=%1" ) .arg( params.gtOffsetX );
- data << QString( "gtOffsetY=%1" ) .arg( params.gtOffsetY );
- data << QString( "gtOffsetZ=%1" ) .arg( params.gtOffsetZ );
- data << QString( "gtColorRX=%1" ) .arg( params.gtColorRX );
- data << QString( "gtColorGX=%1" ) .arg( params.gtColorGX );
- data << QString( "gtColorBX=%1" ) .arg( params.gtColorBX );
- data << QString( "gtColorRY=%1" ) .arg( params.gtColorRY );
- data << QString( "gtColorGY=%1" ) .arg( params.gtColorGY );
- data << QString( "gtColorBY=%1" ) .arg( params.gtColorBY );
- data << QString( "gtColorRZ=%1" ) .arg( params.gtColorRZ );
- data << QString( "gtColorGZ=%1" ) .arg( params.gtColorGZ );
- data << QString( "gtColorBZ=%1" ) .arg( params.gtColorBZ );
- data << QString( "gtDrawTickmarksX=%1" ) .arg( params.gtDrawTickmarksX );
- data << QString( "gtDrawTickmarksY=%1" ) .arg( params.gtDrawTickmarksY );
- data << QString( "gtDrawTickmarksZ=%1" ) .arg( params.gtDrawTickmarksZ );
- data << QString( "gtTickmarkLengthX=%1" ).arg( params.gtTickmarkLengthX );
- data << QString( "gtTickmarkLengthY=%1" ).arg( params.gtTickmarkLengthY );
- data << QString( "gtTickmarkLengthZ=%1" ).arg( params.gtTickmarkLengthZ );
-#endif
- QString bg = Qtx::backgroundToString( background() ).replace( "=", "$" );
- data << QString( "background=%1" ).arg( bg );
-
- return data.join("*");
-}
-
-/*!
- \brief Restore visual parameters of the view window.
- \param parameters visual parameters of view window
-*/
-void OCCViewer_ViewWindow::setVisualParameters( const QString& parameters )
-{
- viewAspect params;
- ClipPlanesList aClipPlanes;
- QStringList data = parameters.split( '*' );
- Qtx::BackgroundData bgData;
- if ( parameters.contains( '=' ) ) // new format - "scale=1.000e+00*centerX=0.000e+00..."
- {
- foreach( QString param, data ) {
- QString paramName = param.section( '=', 0, 0 ).trimmed();
- QString paramValue = param.section( '=', 1, 1 ).trimmed();
- if ( paramName == "scale" ) params.scale = paramValue.toDouble();
- else if ( paramName == "centerX" ) params.centerX = paramValue.toDouble();
- else if ( paramName == "centerY" ) params.centerY = paramValue.toDouble();
- else if ( paramName == "projX" ) params.projX = paramValue.toDouble();
- else if ( paramName == "projY" ) params.projY = paramValue.toDouble();
- else if ( paramName == "projZ" ) params.projZ = paramValue.toDouble();
- else if ( paramName == "twist" ) params.twist = paramValue.toDouble();
- else if ( paramName == "atX" ) params.atX = paramValue.toDouble();
- else if ( paramName == "atY" ) params.atY = paramValue.toDouble();
- else if ( paramName == "atZ" ) params.atZ = paramValue.toDouble();
- else if ( paramName == "eyeX" ) params.eyeX = paramValue.toDouble();
- else if ( paramName == "eyeY" ) params.eyeY = paramValue.toDouble();
- else if ( paramName == "eyeZ" ) params.eyeZ = paramValue.toDouble();
- else if ( paramName == "scaleX" ) params.scaleX = paramValue.toDouble();
- else if ( paramName == "scaleY" ) params.scaleY = paramValue.toDouble();
- else if ( paramName == "scaleZ" ) params.scaleZ = paramValue.toDouble();
- else if ( paramName == "isVisible" ) params.isVisible = paramValue.toInt();
- else if ( paramName == "size" ) params.size = paramValue.toDouble();
- else if ( paramName.contains( "ClippingPlane" ) ) {
- QStringList ClipPlaneData = paramValue.split( ';' );
- OCCViewer_ClipPlane aPlane;
- foreach( QString ClipPlaneParam, ClipPlaneData ) {
- QString ClipPlane_paramName = ClipPlaneParam.section( '~', 0, 0 ).trimmed();
- QString ClipPlane_paramValue = ClipPlaneParam.section( '~', 1, 1 ).trimmed();
- if ( ClipPlane_paramName == "Mode" ) aPlane.PlaneMode = ( ClipPlaneMode )ClipPlane_paramValue.toInt();
- else if ( ClipPlane_paramName == "IsActive" ) aPlane.IsOn = ClipPlane_paramValue.toInt();
- else if ( ClipPlane_paramName == "AbsoluteOrientation" ) aPlane.Orientation = ClipPlane_paramValue.toInt();
- else if ( ClipPlane_paramName == "IsInvert" ) aPlane.IsInvert = ClipPlane_paramValue.toInt();
- else if ( ClipPlane_paramName == "X" ) aPlane.X = ClipPlane_paramValue.toDouble();
- else if ( ClipPlane_paramName == "Y" ) aPlane.Y = ClipPlane_paramValue.toDouble();
- else if ( ClipPlane_paramName == "Z" ) aPlane.Z = ClipPlane_paramValue.toDouble();
- else if ( ClipPlane_paramName == "Dx" ) aPlane.Dx = ClipPlane_paramValue.toDouble();
- else if ( ClipPlane_paramName == "Dy" ) aPlane.Dy = ClipPlane_paramValue.toDouble();
- else if ( ClipPlane_paramName == "Dz" ) aPlane.Dz = ClipPlane_paramValue.toDouble();
- else if ( ClipPlane_paramName == "RelativeOrientation" ) aPlane.RelativeMode.Orientation = ClipPlane_paramValue.toInt();
- else if ( ClipPlane_paramName == "Distance" ) aPlane.RelativeMode.Distance = ClipPlane_paramValue.toDouble();
- else if ( ClipPlane_paramName == "Rotation1" ) aPlane.RelativeMode.Rotation1 = ClipPlane_paramValue.toDouble();
- else if ( ClipPlane_paramName == "Rotation2" ) aPlane.RelativeMode.Rotation2 = ClipPlane_paramValue.toDouble();
- }
- aClipPlanes.push_back(aPlane);
- }
- // graduated trihedron
- else if ( paramName == "gtIsVisible" ) params.gtIsVisible = paramValue.toInt();
- else if ( paramName == "gtDrawNameX" ) params.gtDrawNameX = paramValue.toInt();
- else if ( paramName == "gtDrawNameY" ) params.gtDrawNameY = paramValue.toInt();
- else if ( paramName == "gtDrawNameZ" ) params.gtDrawNameZ = paramValue.toInt();
- else if ( paramName == "gtNameX" ) params.gtNameX = paramValue;
- else if ( paramName == "gtNameY" ) params.gtNameY = paramValue;
- else if ( paramName == "gtNameZ" ) params.gtNameZ = paramValue;
- else if ( paramName == "gtNameColorRX" ) params.gtNameColorRX = paramValue.toInt();
- else if ( paramName == "gtNameColorGX" ) params.gtNameColorGX = paramValue.toInt();
- else if ( paramName == "gtNameColorBX" ) params.gtNameColorBX = paramValue.toInt();
- else if ( paramName == "gtNameColorRY" ) params.gtNameColorRY = paramValue.toInt();
- else if ( paramName == "gtNameColorGY" ) params.gtNameColorGY = paramValue.toInt();
- else if ( paramName == "gtNameColorBY" ) params.gtNameColorBY = paramValue.toInt();
- else if ( paramName == "gtNameColorRZ" ) params.gtNameColorRZ = paramValue.toInt();
- else if ( paramName == "gtNameColorGZ" ) params.gtNameColorGZ = paramValue.toInt();
- else if ( paramName == "gtNameColorBZ" ) params.gtNameColorBZ = paramValue.toInt();
- else if ( paramName == "gtDrawValuesX" ) params.gtDrawValuesX = paramValue.toInt();
- else if ( paramName == "gtDrawValuesY" ) params.gtDrawValuesY = paramValue.toInt();
- else if ( paramName == "gtDrawValuesZ" ) params.gtDrawValuesZ = paramValue.toInt();
- else if ( paramName == "gtNbValuesX" ) params.gtNbValuesX = paramValue.toInt();
- else if ( paramName == "gtNbValuesY" ) params.gtNbValuesY = paramValue.toInt();
- else if ( paramName == "gtNbValuesZ" ) params.gtNbValuesZ = paramValue.toInt();
- else if ( paramName == "gtOffsetX" ) params.gtOffsetX = paramValue.toInt();
- else if ( paramName == "gtOffsetY" ) params.gtOffsetY = paramValue.toInt();
- else if ( paramName == "gtOffsetZ" ) params.gtOffsetZ = paramValue.toInt();
- else if ( paramName == "gtColorRX" ) params.gtColorRX = paramValue.toInt();
- else if ( paramName == "gtColorGX" ) params.gtColorGX = paramValue.toInt();
- else if ( paramName == "gtColorBX" ) params.gtColorBX = paramValue.toInt();
- else if ( paramName == "gtColorRY" ) params.gtColorRY = paramValue.toInt();
- else if ( paramName == "gtColorGY" ) params.gtColorGY = paramValue.toInt();
- else if ( paramName == "gtColorBY" ) params.gtColorBY = paramValue.toInt();
- else if ( paramName == "gtColorRZ" ) params.gtColorRZ = paramValue.toInt();
- else if ( paramName == "gtColorGZ" ) params.gtColorGZ = paramValue.toInt();
- else if ( paramName == "gtColorBZ" ) params.gtColorBZ = paramValue.toInt();
- else if ( paramName == "gtDrawTickmarksX" ) params.gtDrawTickmarksX = paramValue.toInt();
- else if ( paramName == "gtDrawTickmarksY" ) params.gtDrawTickmarksY = paramValue.toInt();
- else if ( paramName == "gtDrawTickmarksZ" ) params.gtDrawTickmarksZ = paramValue.toInt();
- else if ( paramName == "gtTickmarkLengthX" ) params.gtTickmarkLengthX = paramValue.toInt();
- else if ( paramName == "gtTickmarkLengthY" ) params.gtTickmarkLengthY = paramValue.toInt();
- else if ( paramName == "gtTickmarkLengthZ" ) params.gtTickmarkLengthZ = paramValue.toInt();
- else if ( paramName == "background" ) {
- QString bg = paramValue.replace( "$", "=" );
- bgData = Qtx::stringToBackground( bg );
- }
- }
- }
- else // old format - "1.000e+00*0.000e+00..."
- {
- int idx = 0;
- params.scale = data.count() > idx ? data[idx++].toDouble() : 1.0;
- params.centerX = data.count() > idx ? data[idx++].toDouble() : 0.0;
- params.centerY = data.count() > idx ? data[idx++].toDouble() : 0.0;
- params.projX = data.count() > idx ? data[idx++].toDouble() : sqrt(1./3);
- params.projY = data.count() > idx ? data[idx++].toDouble() : -sqrt(1./3);
- params.projZ = data.count() > idx ? data[idx++].toDouble() : sqrt(1./3);
- params.twist = data.count() > idx ? data[idx++].toDouble() : 0.0;
- params.atX = data.count() > idx ? data[idx++].toDouble() : 0.0;
- params.atY = data.count() > idx ? data[idx++].toDouble() : 0.0;
- params.atZ = data.count() > idx ? data[idx++].toDouble() : 0.0;
- params.eyeX = data.count() > idx ? data[idx++].toDouble() : sqrt(250000./3);
- params.eyeY = data.count() > idx ? data[idx++].toDouble() : -sqrt(250000./3);
- params.eyeZ = data.count() > idx ? data[idx++].toDouble() : sqrt(250000./3);
- params.scaleX = data.count() > idx ? data[idx++].toDouble() : 1.0;
- params.scaleY = data.count() > idx ? data[idx++].toDouble() : 1.0;
- params.scaleZ = data.count() > idx ? data[idx++].toDouble() : 1.0;
- params.isVisible = data.count() > idx ? data[idx++].toInt() : 1;
- params.size = data.count() > idx ? data[idx++].toDouble() : 100.0;
- }
- performRestoring( params );
- setBackground( bgData );
- myModel->setClipPlanes(aClipPlanes);
-}
-
-/*!
- \brief Handle show event.
-
- Emits Show() signal.
-
- \param theEvent show event
-*/
-void OCCViewer_ViewWindow::showEvent( QShowEvent* theEvent )
-{
- emit Show( theEvent );
-}
-
-/*!
- \brief Handle hide event.
-
- Emits Hide() signal.
-
- \param theEvent hide event
-*/
-void OCCViewer_ViewWindow::hideEvent( QHideEvent* theEvent )
-{
- emit Hide( theEvent );
-}
-
-
-/*!
- Creates default sketcher. [ virtual protected ]
-*/
-OCCViewer_ViewSketcher* OCCViewer_ViewWindow::createSketcher( int type )
-{
- if ( type == Rect )
- return new OCCViewer_RectSketcher( this, type );
- if ( type == Polygon )
- return new OCCViewer_PolygonSketcher( this, type );
- return 0;
-}
-
-void OCCViewer_ViewWindow::initSketchers()
-{
- if ( mySketchers.isEmpty() )
- {
- mySketchers.append( createSketcher( Rect ) );
- mySketchers.append( createSketcher( Polygon ) );
- }
-}
-
-OCCViewer_ViewSketcher* OCCViewer_ViewWindow::getSketcher( const int typ )
-{
- OCCViewer_ViewSketcher* sketcher = 0;
- QList<OCCViewer_ViewSketcher*>::Iterator it;
- for ( it = mySketchers.begin(); it != mySketchers.end() && !sketcher; ++it )
- {
- OCCViewer_ViewSketcher* sk = (*it);
- if ( sk->type() == typ )
- sketcher = sk;
- }
- return sketcher;
-}
-
-/*!
- Handles requests for sketching in the active view. [ virtual public ]
-*/
-void OCCViewer_ViewWindow::activateSketching( int type )
-{
- OCCViewer_ViewPort3d* vp = getViewPort();
- if ( !vp )
- return;
-
- if ( !vp->isSketchingEnabled() )
- return;
-
- /* Finish current sketching */
- if ( type == NoSketching )
- {
- if ( mypSketcher )
- {
- onSketchingFinished();
- mypSketcher->deactivate();
- mypSketcher = 0;
- }
- }
- /* Activate new sketching */
- else
- {
- activateSketching( NoSketching ); /* concurrency not suported */
- mypSketcher = getSketcher( type );
- if ( mypSketcher )
- {
- mypSketcher->activate();
- onSketchingStarted();
- }
- }
-}
-
-/*!
- Unhilights detected entities. [ virtual protected ]
-*/
-void OCCViewer_ViewWindow::onSketchingStarted()
-{
-}
-
-/*!
- Selection by rectangle or polygon. [ virtual protected ]
-*/
-void OCCViewer_ViewWindow::onSketchingFinished()
-{
- MESSAGE("OCCViewer_ViewWindow::onSketchingFinished()")
- if ( mypSketcher && mypSketcher->result() == OCCViewer_ViewSketcher::Accept )
- {
- Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
- bool append = bool( mypSketcher->buttonState() && mypSketcher->isHasShift() );
- switch( mypSketcher->type() )
- {
- case Rect:
- {
- QRect* aRect = (QRect*)mypSketcher->data();
- if( aRect )
- {
- int aLeft = aRect->left();
- int aRight = aRect->right();
- int aTop = aRect->top();
- int aBottom = aRect->bottom();
-// myRect = aRect;
-
- if( append )
- ic->ShiftSelect( aLeft, aBottom, aRight, aTop, getViewPort()->getView(), Standard_False );
- else
- ic->Select( aLeft, aBottom, aRight, aTop, getViewPort()->getView(), Standard_False );
- }
- }
- break;
- case Polygon:
- {
- QPolygon* aPolygon = (QPolygon*)mypSketcher->data();
- if( aPolygon )
- {
- int size = aPolygon->size();
- TColgp_Array1OfPnt2d anArray( 1, size );
-
- QPolygon::Iterator it = aPolygon->begin();
- QPolygon::Iterator itEnd = aPolygon->end();
- for( int index = 1; it != itEnd; ++it, index++ )
- {
- QPoint aPoint = *it;
- anArray.SetValue( index, gp_Pnt2d( aPoint.x(), aPoint.y() ) );
- }
-
- if( append )
- ic->ShiftSelect( anArray, getViewPort()->getView(), Standard_False );
- else
- ic->Select( anArray, getViewPort()->getView(), Standard_False );
- }
- }
- break;
- default:
- break;
- }
-
- OCCViewer_ViewManager* aViewMgr = ( OCCViewer_ViewManager* )getViewManager();
- aViewMgr->getOCCViewer()->performSelectionChanged();
- }
-}
-
-OCCViewer_ViewPort3d* OCCViewer_ViewWindow::getViewPort()
-{
- return myViewPort;
-}
-
-bool OCCViewer_ViewWindow::transformRequested() const
-{
- return ( myOperation != NOTHING );
-}
-
-bool OCCViewer_ViewWindow::transformInProcess() const
-{
- return myEventStarted;
-}
-
-void OCCViewer_ViewWindow::setTransformInProcess( bool bOn )
-{
- myEventStarted = bOn;
-}
-
-/*!
- Set enabled state of transformation (rotate, zoom, etc)
-*/
-void OCCViewer_ViewWindow::setTransformEnabled( const OperationType id, const bool on )
-{
- if ( id != NOTHING ) myStatus.insert( id, on );
-}
-
-/*!
- \return enabled state of transformation (rotate, zoom, etc)
-*/
-bool OCCViewer_ViewWindow::transformEnabled( const OperationType id ) const
-{
- return myStatus.contains( id ) ? myStatus[ id ] : true;
-}
-
-void OCCViewer_ViewWindow::onMaximizedView()
-{
- setMaximized(!isMaximized());
-}
-
-void OCCViewer_ViewWindow::returnTo3dView()
-{
- setReturnedTo3dView( true );
-}
-
-void OCCViewer_ViewWindow::setReturnedTo3dView(bool isVisible3dView)
-{
- if ( !toolMgr()->action( ReturnTo3dViewId ) ||
- toolMgr()->isShown(ReturnTo3dViewId) != isVisible3dView ) return;
- if ( !isVisible3dView )
- toolMgr()->show( ReturnTo3dViewId );
- else
- toolMgr()->hide( ReturnTo3dViewId );
- if ( isVisible3dView ) emit returnedTo3d( );
-}
-
-
-void OCCViewer_ViewWindow::setMaximized(bool toMaximize, bool toSendSignal)
-{
- QAction* anAction = toolMgr()->action( MaximizedId );
- QAction* anAction2 = toolMgr()->action( ReturnTo3dViewId );
- SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
- if ( toMaximize ) {
- anAction->setText( tr( "MNU_MINIMIZE_VIEW" ) );
- anAction->setToolTip( tr( "MNU_MINIMIZE_VIEW" ) );
- anAction->setIcon( aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_MINIMIZE" ) ) );
- anAction->setStatusTip( tr( "DSC_MINIMIZE_VIEW" ) );
- if ( anAction2 && my2dMode != No2dMode ) toolMgr()->show( ReturnTo3dViewId );
- if (toSendSignal) {
- emit maximized( this, true );
- }
- }
- else {
- anAction->setText( tr( "MNU_MAXIMIZE_VIEW" ) );
- anAction->setToolTip( tr( "MNU_MAXIMIZE_VIEW" ) );
- anAction->setIcon( aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_MAXIMIZE" ) ) );
- anAction->setStatusTip( tr( "DSC_MAXIMIZE_VIEW" ) );
- if ( anAction2 && my2dMode != No2dMode ) toolMgr()->hide( ReturnTo3dViewId );
- if (toSendSignal) {
- emit maximized( this, false );
- }
- }
-}
-
-bool OCCViewer_ViewWindow::isMaximized() const
-{
- return !(toolMgr()->action( MaximizedId )->text() == tr( "MNU_MAXIMIZE_VIEW" ));
-}
-
-void OCCViewer_ViewWindow::setSketcherStyle( bool enable )
-{
- IsSketcherStyle = enable;
-}
-
-bool OCCViewer_ViewWindow::isSketcherStyle() const
-{
- return IsSketcherStyle;
-}
-
-
-void OCCViewer_ViewWindow::set2dMode(Mode2dType theType)
-{
- my2dMode = theType;
-}
-
-// obsolete
-QColor OCCViewer_ViewWindow::backgroundColor() const
-{
- return myViewPort ? myViewPort->backgroundColor() : Qt::black;
-}
-
-// obsolete
-void OCCViewer_ViewWindow::setBackgroundColor( const QColor& theColor )
-{
- if ( myViewPort ) myViewPort->setBackgroundColor( theColor );
-}
-
-Qtx::BackgroundData OCCViewer_ViewWindow::background() const
-{
- return myViewPort ? myViewPort->background() : Qtx::BackgroundData();
-}
-
-void OCCViewer_ViewWindow::setBackground( const Qtx::BackgroundData& theBackground )
-{
- if ( myViewPort ) myViewPort->setBackground( theBackground );
-}
-
-/*!
- Clears view aspects
-*/
-void OCCViewer_ViewWindow::clearViewAspects()
-{
- myViewAspects.clear();
-}
-
-/*!
- \return const reference to list of view aspects
-*/
-const viewAspectList& OCCViewer_ViewWindow::getViewAspects()
-{
- return myViewAspects;
-}
-
-/*!
- Appends new view aspect
- \param aParams - new view aspects
-*/
-void OCCViewer_ViewWindow::appendViewAspect( const viewAspect& aParams )
-{
- myViewAspects.append( aParams );
-}
-
-/*!
- Replaces old view aspects by new ones
- \param aViewList - list of new view aspects
-*/
-void OCCViewer_ViewWindow::updateViewAspects( const viewAspectList& aViewList )
-{
- myViewAspects = aViewList;
-}
-
-/*!
- Get camera properties for the OCC view window.
- \return shared pointer on camera properties.
-*/
-SUIT_CameraProperties OCCViewer_ViewWindow::cameraProperties()
-{
- SUIT_CameraProperties aProps;
-
- Handle(V3d_View) aSourceView = getViewPort()->getView();
- if ( aSourceView.IsNull() )
- return aProps;
-
- if ( get2dMode() == No2dMode ) {
- aProps.setDimension( SUIT_CameraProperties::Dim3D );
- }
- else {
- aProps.setDimension( SUIT_CameraProperties::Dim2D );
- aProps.setViewSide( (SUIT_CameraProperties::ViewSide)(int)get2dMode() );
- }
-
- // read common properites of the view
- Standard_Real anUpDir[3];
- Standard_Real aPrjDir[3];
- Standard_Real aMapScale[2];
- Standard_Real aTranslation[3];
- Standard_Real anAxialScale[3];
-
- aSourceView->Up(anUpDir[0], anUpDir[1], anUpDir[2]);
- aSourceView->Proj(aPrjDir[0], aPrjDir[1], aPrjDir[2]);
- aSourceView->At(aTranslation[0], aTranslation[1], aTranslation[2]);
- aSourceView->Size(aMapScale[0], aMapScale[1]);
-
- getViewPort()->getAxialScale(anAxialScale[0], anAxialScale[1], anAxialScale[2]);
-
- // we use similar depth to the one used in perspective projection
- // to proivde a convinience synchronization with other camera views that
- // can switch between orthogonal & perspective projection. otherwise,
- // the camera will get to close when switching from orthogonal to perspective.
- Standard_Real aCameraDepth = aSourceView->Depth() + aSourceView->ZSize() * 0.5;
-
- // store common props
- aProps.setViewUp(anUpDir[0], anUpDir[1], anUpDir[2]);
- aProps.setMappingScale(aMapScale[1] / 2.0);
- aProps.setAxialScale(anAxialScale[0], anAxialScale[1], anAxialScale[2]);
-
- // generate view orientation matrix for transforming OCC projection reference point
- // into a camera (eye) position.
- gp_Dir aLeftDir = gp_Dir(anUpDir[0], anUpDir[1], anUpDir[2]).Crossed(
- gp_Dir(aPrjDir[0], aPrjDir[1], aPrjDir[2]));
-
- gp_Trsf aTrsf;
- aTrsf.SetValues( aLeftDir.X(), anUpDir[0], aPrjDir[0], aTranslation[0],
- aLeftDir.Y(), anUpDir[1], aPrjDir[1], aTranslation[1],
- aLeftDir.Z(), anUpDir[2], aPrjDir[2], aTranslation[2],
- Precision::Confusion(),
- Precision::Confusion() );
-
-// get projection reference point in view coordinates
-#if OCC_VERSION_LARGE > 0x06070000
- gp_Pnt aProjRef = aSourceView->Camera()->ProjectionShift();
- aProjRef.SetX( -aProjRef.X() );
- aProjRef.SetY( -aProjRef.Y() );
-#else
- Graphic3d_Vertex aProjRef = aSourceView->ViewMapping().ProjectionReferencePoint();
-#endif
-
- // transform to world-space coordinate system
- gp_Pnt aPosition = gp_Pnt(aProjRef.X(), aProjRef.Y(), aCameraDepth).Transformed(aTrsf);
-
- // compute focal point
- double aFocalPoint[3];
-
- aFocalPoint[0] = aPosition.X() - aPrjDir[0] * aCameraDepth;
- aFocalPoint[1] = aPosition.Y() - aPrjDir[1] * aCameraDepth;
- aFocalPoint[2] = aPosition.Z() - aPrjDir[2] * aCameraDepth;
-
- aProps.setFocalPoint(aFocalPoint[0], aFocalPoint[1], aFocalPoint[2]);
- aProps.setPosition(aPosition.X(), aPosition.Y(), aPosition.Z());
-
- return aProps;
-}
-
-/*!
- Synchronize views.
- This implementation synchronizes OCC view's camera propreties.
-*/
-void OCCViewer_ViewWindow::synchronize( SUIT_ViewWindow* theView )
-{
- bool blocked = blockSignals( true );
-
- SUIT_CameraProperties aProps = theView->cameraProperties();
- if ( !cameraProperties().isCompatible( aProps ) ) {
- // other view, this one is being currently synchronized to, seems has become incompatible
- // we have to break synchronization
- updateSyncViews();
- return;
- }
-
- Handle(V3d_View) aDestView = getViewPort()->getView();
-
- aDestView->SetImmediateUpdate( Standard_False );
-
- double anUpDir[3];
- double aPosition[3];
- double aFocalPoint[3];
- double aMapScaling;
- double anAxialScale[3];
-
- // get common properties
- aProps.getFocalPoint(aFocalPoint[0], aFocalPoint[1], aFocalPoint[2]);
- aProps.getPosition(aPosition[0], aPosition[1], aPosition[2]);
- aProps.getViewUp(anUpDir[0], anUpDir[1], anUpDir[2]);
- aProps.getAxialScale(anAxialScale[0], anAxialScale[1], anAxialScale[2]);
- aMapScaling = aProps.getMappingScale() * 2.0;
-
- gp_Dir aProjDir(aPosition[0] - aFocalPoint[0],
- aPosition[1] - aFocalPoint[1],
- aPosition[2] - aFocalPoint[2]);
-
- // get custom view translation
- Standard_Real aTranslation[3];
- aDestView->At(aTranslation[0], aTranslation[1], aTranslation[2]);
-
- gp_Dir aLeftDir = gp_Dir(anUpDir[0], anUpDir[1], anUpDir[2]).Crossed(
- gp_Dir(aProjDir.X(), aProjDir.Y(), aProjDir.Z()));
-
- // convert camera position into a view reference point
- gp_Trsf aTrsf;
- aTrsf.SetValues( aLeftDir.X(), anUpDir[0], aProjDir.X(), aTranslation[0],
- aLeftDir.Y(), anUpDir[1], aProjDir.Y(), aTranslation[1],
- aLeftDir.Z(), anUpDir[2], aProjDir.Z(), aTranslation[2],
- Precision::Confusion(),
- Precision::Confusion() );
- aTrsf.Invert();
-
- // transform to view-space coordinate system
- gp_Pnt aProjRef(aPosition[0], aPosition[1], aPosition[2]);
- aProjRef.Transform(aTrsf);
-
-#if OCC_VERSION_LARGE > 0x06070000
- aDestView->Camera()->SetDirection( -aProjDir );
- aDestView->Camera()->SetUp( gp_Dir( anUpDir[0], anUpDir[1], anUpDir[2] ) );
- aDestView->Camera()->SetProjectionShift( gp_Pnt( -aProjRef.X(), -aProjRef.Y(), 0.0 ) );
-#else
- // set view camera properties using low-level approach. this is done
- // in order to avoid interference with static variables in v3d view used
- // when rotation is in process in another view.
- Visual3d_ViewMapping aMapping = aDestView->View()->ViewMapping();
- Visual3d_ViewOrientation anOrientation = aDestView->View()->ViewOrientation();
-
- Graphic3d_Vector aMappingProj(aProjDir.X(), aProjDir.Y(), aProjDir.Z());
- Graphic3d_Vector aMappingUp(anUpDir[0], anUpDir[1], anUpDir[2]);
-
- aMappingProj.Normalize();
- aMappingUp.Normalize();
-
- anOrientation.SetViewReferencePlane(aMappingProj);
- anOrientation.SetViewReferenceUp(aMappingUp);
-
- aDestView->SetViewMapping(aMapping);
- aDestView->SetViewOrientation(anOrientation);
-
- // set panning
- aDestView->SetCenter(aProjRef.X(), aProjRef.Y());
-#endif
-
- // set mapping scale
- Standard_Real aWidth, aHeight;
- aDestView->Size(aWidth, aHeight);
-
- if ( aWidth > aHeight )
- aDestView->SetSize (aMapScaling * (aWidth / aHeight));
- else
- aDestView->SetSize (aMapScaling);
-
- getViewPort()->setAxialScale(anAxialScale[0], anAxialScale[1], anAxialScale[2]);
-
- aDestView->ZFitAll();
- aDestView->SetImmediateUpdate( Standard_True );
- aDestView->Redraw();
-
- blockSignals( blocked );
-}
-
-/*!
- \brief Indicates whether preselection is enabled
- \return true if preselection is enabled
-*/
-bool OCCViewer_ViewWindow::isPreselectionEnabled() const
-{
- return myPreselectionEnabled;
-}
-
-/*!
- \brief Enables/disables preselection
- \param theIsToEnable if true - preselection will be enabled
-*/
-void OCCViewer_ViewWindow::enablePreselection( bool theIsToEnable )
-{
- onSwitchPreselection( theIsToEnable );
-}
-
-/*!
- \brief Indicates whether selection is enabled
- \return true if selection is enabled
-*/
-bool OCCViewer_ViewWindow::isSelectionEnabled() const
-{
- return mySelectionEnabled;
-}
-
-/*!
- \brief Enables/disables selection
- \param theIsToEnable if true - selection will be enabled
-*/
-void OCCViewer_ViewWindow::enableSelection( bool theIsToEnable )
-{
- onSwitchSelection( theIsToEnable );
-}
-
-
-/*!
- \brief called if clipping operation is activated / deactivated.
-
- Enables/disables clipping plane displaying.
-
- \parma on action state
-*/
-void OCCViewer_ViewWindow::onClipping (bool theIsOn)
-{
- if(!myModel) return;
- OCCViewer_ClippingDlg* aClippingDlg = myModel->getClippingDlg();
-
- if (theIsOn) {
- if (!aClippingDlg) {
- aClippingDlg = new OCCViewer_ClippingDlg (this, myModel);
- myModel->setClippingDlg(aClippingDlg);
- }
- if (!aClippingDlg->isVisible())
- aClippingDlg->show();
- } else {
- if ( aClippingDlg ) {
- aClippingDlg->close();
- myModel->setClippingDlg(0);
- }
- }
-
- SUIT_ViewManager* mgr = getViewManager();
- if( mgr ) {
- QVector<SUIT_ViewWindow*> aViews = mgr->getViews();
- for(int i = 0, iEnd = aViews.size(); i < iEnd; i++) {
- if(SUIT_ViewWindow* aViewWindow = aViews.at(i)) {
- QtxActionToolMgr* mgr = aViewWindow->toolMgr();
- if(!mgr) continue;
- QAction* a = toolMgr()->action( ClippingId );
- if(!a) continue;
- if(theIsOn != a->isChecked()){
- disconnect (a, SIGNAL (toggled (bool)), aViewWindow, SLOT (onClipping (bool)));
- a->setChecked(theIsOn);
- connect (a, SIGNAL (toggled (bool)), aViewWindow, SLOT (onClipping (bool)));
- }
- }
- }
- }
-}
+// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE\r
+//\r
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,\r
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS\r
+//\r
+// This library is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU Lesser General Public\r
+// License as published by the Free Software Foundation; either\r
+// version 2.1 of the License, or (at your option) any later version.\r
+//\r
+// This library is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+// Lesser General Public License for more details.\r
+//\r
+// You should have received a copy of the GNU Lesser General Public\r
+// License along with this library; if not, write to the Free Software\r
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+//\r
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com\r
+//\r
+\r
+// File : OCCViewer_ViewWindow.cxx\r
+// Author :\r
+\r
+#include "OCCViewer_ViewWindow.h"\r
+#include "OCCViewer_ViewModel.h"\r
+#include "OCCViewer_ViewPort3d.h"\r
+#include "OCCViewer_ViewManager.h"\r
+#include "OCCViewer_ViewSketcher.h"\r
+#include "OCCViewer_CreateRestoreViewDlg.h"\r
+#include "OCCViewer_ClipPlane.h"\r
+#include "OCCViewer_SetRotationPointDlg.h"\r
+#include "OCCViewer_AxialScaleDlg.h"\r
+#include "OCCViewer_CubeAxesDlg.h"\r
+#include "OCCViewer_ClippingDlg.h"\r
+\r
+#include <Basics_OCCTVersion.hxx>\r
+\r
+#include <SUIT_Desktop.h>\r
+#include <SUIT_Session.h>\r
+#include <SUIT_ViewManager.h>\r
+#include <SUIT_Tools.h>\r
+#include <SUIT_ResourceMgr.h>\r
+#include <SUIT_MessageBox.h>\r
+#include <SUIT_Application.h>\r
+\r
+#include <QtxActionToolMgr.h>\r
+#include <QtxMultiAction.h>\r
+#include <QtxRubberBand.h>\r
+\r
+#include <OpenGLUtils_FrameBuffer.h>\r
+\r
+#include <QPainter>\r
+#include <QTime>\r
+#include <QImage>\r
+#include <QKeyEvent>\r
+#include <QMouseEvent>\r
+#include <QApplication>\r
+#include <QMenu>\r
+\r
+#include <AIS_ListOfInteractive.hxx>\r
+#include <AIS_ListIteratorOfListOfInteractive.hxx>\r
+#include <AIS_Shape.hxx>\r
+\r
+#include <BRep_Tool.hxx>\r
+#include <BRepBndLib.hxx>\r
+#include <TopoDS.hxx>\r
+\r
+#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>\r
+#include <Graphic3d_MapOfStructure.hxx>\r
+#include <Graphic3d_Structure.hxx>\r
+#include <Graphic3d_ExportFormat.hxx>\r
+\r
+#include <Visual3d_View.hxx>\r
+#include <V3d_Plane.hxx>\r
+#include <V3d_Light.hxx>\r
+\r
+#include <gp_Dir.hxx>\r
+#include <gp_Pln.hxx>\r
+#include <TColgp_Array1OfPnt2d.hxx>\r
+\r
+#if OCC_VERSION_LARGE > 0x06060000 \r
+#include <Graphic3d_SequenceOfHClipPlane.hxx>\r
+#include <Graphic3d_ClipPlane.hxx>\r
+\r
+#endif\r
+\r
+#include <Standard_Version.hxx>\r
+\r
+#include "utilities.h"\r
+\r
+// // OpenCV includes\r
+// #include <cv.h>\r
+// #include <highgui.h>\r
+\r
+static QEvent* l_mbPressEvent = 0;\r
+\r
+#ifdef WIN32\r
+# include <QWindowsStyle>\r
+#endif\r
+\r
+#include <GL/gl.h>\r
+\r
+const char* imageZoomCursor[] = {\r
+"32 32 3 1",\r
+". c None",\r
+"a c #000000",\r
+"# c #ffffff",\r
+"................................",\r
+"................................",\r
+".#######........................",\r
+"..aaaaaaa.......................",\r
+"................................",\r
+".............#####..............",\r
+"...........##.aaaa##............",\r
+"..........#.aa.....a#...........",\r
+".........#.a.........#..........",\r
+".........#a..........#a.........",\r
+"........#.a...........#.........",\r
+"........#a............#a........",\r
+"........#a............#a........",\r
+"........#a............#a........",\r
+"........#a............#a........",\r
+".........#...........#.a........",\r
+".........#a..........#a.........",\r
+".........##.........#.a.........",\r
+"........#####.....##.a..........",\r
+".......###aaa#####.aa...........",\r
+"......###aa...aaaaa.......#.....",\r
+".....###aa................#a....",\r
+"....###aa.................#a....",\r
+"...###aa...............#######..",\r
+"....#aa.................aa#aaaa.",\r
+".....a....................#a....",\r
+"..........................#a....",\r
+"...........................a....",\r
+"................................",\r
+"................................",\r
+"................................",\r
+"................................"};\r
+\r
+const char* imageRotateCursor[] = {\r
+"32 32 3 1",\r
+". c None",\r
+"a c #000000",\r
+"# c #ffffff",\r
+"................................",\r
+"................................",\r
+"................................",\r
+"................................",\r
+"........#.......................",\r
+".......#.a......................",\r
+"......#######...................",\r
+".......#aaaaa#####..............",\r
+"........#..##.a#aa##........##..",\r
+".........a#.aa..#..a#.....##.aa.",\r
+".........#.a.....#...#..##.aa...",\r
+".........#a.......#..###.aa.....",\r
+"........#.a.......#a..#aa.......",\r
+"........#a.........#..#a........",\r
+"........#a.........#a.#a........",\r
+"........#a.........#a.#a........",\r
+"........#a.........#a.#a........",\r
+".........#.........#a#.a........",\r
+"........##a........#a#a.........",\r
+"......##.a#.......#.#.a.........",\r
+"....##.aa..##.....##.a..........",\r
+"..##.aa.....a#####.aa...........",\r
+"...aa.........aaa#a.............",\r
+"................#.a.............",\r
+"...............#.a..............",\r
+"..............#.a...............",\r
+"...............a................",\r
+"................................",\r
+"................................",\r
+"................................",\r
+"................................",\r
+"................................"};\r
+\r
+const char* imageCrossCursor[] = {\r
+ "32 32 3 1",\r
+ ". c None",\r
+ "a c #000000",\r
+ "# c #ffffff",\r
+ "................................",\r
+ "................................",\r
+ "................................",\r
+ "................................",\r
+ "................................",\r
+ "................................",\r
+ "................................",\r
+ "...............#................",\r
+ "...............#a...............",\r
+ "...............#a...............",\r
+ "...............#a...............",\r
+ "...............#a...............",\r
+ "...............#a...............",\r
+ "...............#a...............",\r
+ "...............#a...............",\r
+ ".......#################........",\r
+ "........aaaaaaa#aaaaaaaaa.......",\r
+ "...............#a...............",\r
+ "...............#a...............",\r
+ "...............#a...............",\r
+ "...............#a...............",\r
+ "...............#a...............",\r
+ "...............#a...............",\r
+ "...............#a...............",\r
+ "................a...............",\r
+ "................................",\r
+ "................................",\r
+ "................................",\r
+ "................................",\r
+ "................................",\r
+ "................................",\r
+ "................................"};\r
+\r
+\r
+/*!\r
+ \brief Constructor\r
+ \param theDesktop main window of application\r
+ \param theModel OCC 3D viewer\r
+*/\r
+OCCViewer_ViewWindow::OCCViewer_ViewWindow( SUIT_Desktop* theDesktop,\r
+ OCCViewer_Viewer* theModel )\r
+: SUIT_ViewWindow( theDesktop )\r
+{\r
+ myModel = theModel;\r
+ myRestoreFlag = 0;\r
+ myEnableDrawMode = false;\r
+ myDrawRect=false;\r
+ updateEnabledDrawMode();\r
+ myScalingDlg = 0;\r
+ mySetRotationPointDlg = 0;\r
+ myRectBand = 0;\r
+ \r
+ IsSketcherStyle = false;\r
+ myIsKeyFree = false;\r
+\r
+ mypSketcher = 0;\r
+ myCurSketch = -1;\r
+ my2dMode = No2dMode;\r
+\r
+ myInteractionStyle = SUIT_ViewModel::STANDARD;\r
+ myPreselectionEnabled = true;\r
+ mySelectionEnabled = true;\r
+\r
+\r
+ clearViewAspects();\r
+ \r
+}\r
+\r
+/*!\r
+ \brief Destructor.\r
+*/\r
+OCCViewer_ViewWindow::~OCCViewer_ViewWindow()\r
+{\r
+ endDrawRect();\r
+ qDeleteAll( mySketchers );\r
+}\r
+\r
+/*!\r
+ \brief Internal initialization.\r
+*/\r
+void OCCViewer_ViewWindow::initLayout()\r
+{\r
+ myViewPort = new OCCViewer_ViewPort3d( this, myModel->getViewer3d(), V3d_ORTHOGRAPHIC );\r
+ myViewPort->installEventFilter(this);\r
+ setCentralWidget(myViewPort);\r
+ myOperation = NOTHING;\r
+\r
+ myCurrPointType = GRAVITY;\r
+ myPrevPointType = GRAVITY;\r
+ mySelectedPoint = gp_Pnt(0.,0.,0.);\r
+ myRotationPointSelection = false;\r
+\r
+ setTransformRequested ( NOTHING );\r
+ setTransformInProcess ( false );\r
+\r
+ createActions();\r
+ createToolBar();\r
+\r
+ switch (my2dMode) {\r
+ case XYPlane:\r
+ onTopView();\r
+ break;\r
+ case XZPlane:\r
+ onLeftView();\r
+ break;\r
+ case YZPlane:\r
+ onFrontView();\r
+ break;\r
+ }\r
+\r
+ // Graduated axes dialog\r
+ QtxAction* anAction = dynamic_cast<QtxAction*>( toolMgr()->action( GraduatedAxesId ) );\r
+ myCubeAxesDlg = new OCCViewer_CubeAxesDlg( anAction, this, "OCCViewer_CubeAxesDlg" );\r
+ myCubeAxesDlg->initialize();\r
+ \r
+ connect( myViewPort, SIGNAL( vpTransformed( OCCViewer_ViewPort* ) ), this, SLOT( emitViewModified() ) );\r
+}\r
+\r
+OCCViewer_ViewWindow* OCCViewer_ViewWindow::getView( const int mode ) const\r
+{\r
+ return mode == get2dMode() ? const_cast<OCCViewer_ViewWindow*>( this ) : 0;\r
+}\r
+\r
+/*!\r
+ \brief Detect viewer operation according the the mouse button pressed\r
+ and key modifiers used.\r
+ \param theEvent mouse event\r
+ \return type of the operation\r
+*/\r
+OCCViewer_ViewWindow::OperationType\r
+OCCViewer_ViewWindow::getButtonState( QMouseEvent* theEvent, int theInteractionStyle )\r
+{\r
+ OperationType aOp = NOTHING;\r
+ SUIT_ViewModel::InteractionStyle aStyle = (SUIT_ViewModel::InteractionStyle)theInteractionStyle;\r
+ if( (theEvent->modifiers() == SUIT_ViewModel::myStateMap[aStyle][SUIT_ViewModel::ZOOM]) &&\r
+ (theEvent->buttons() == SUIT_ViewModel::myButtonMap[aStyle][SUIT_ViewModel::ZOOM]) )\r
+ aOp = ZOOMVIEW;\r
+ else if( (theEvent->modifiers() == SUIT_ViewModel::myStateMap[aStyle][SUIT_ViewModel::PAN]) &&\r
+ (theEvent->buttons() == SUIT_ViewModel::myButtonMap[aStyle][SUIT_ViewModel::PAN]) )\r
+ aOp = PANVIEW;\r
+ else if( (theEvent->modifiers() == SUIT_ViewModel::myStateMap[aStyle][SUIT_ViewModel::ROTATE]) &&\r
+ (theEvent->buttons() == SUIT_ViewModel::myButtonMap[aStyle][SUIT_ViewModel::ROTATE]) &&\r
+ (my2dMode == No2dMode))\r
+ aOp = ROTATE;\r
+\r
+ return aOp;\r
+}\r
+\r
+/*!\r
+ \brief Customize event handling\r
+ \param watched event receiver object\r
+ \param e event\r
+ \return \c true if the event processing should be stopped\r
+*/\r
+bool OCCViewer_ViewWindow::eventFilter( QObject* watched, QEvent* e )\r
+{\r
+ if ( watched == myViewPort ) {\r
+ int aType = e->type();\r
+ switch(aType) {\r
+ case QEvent::MouseButtonPress:\r
+ vpMousePressEvent((QMouseEvent*) e);\r
+ return true;\r
+\r
+ case QEvent::MouseButtonRelease:\r
+ vpMouseReleaseEvent((QMouseEvent*) e);\r
+ return true;\r
+\r
+ case QEvent::MouseMove:\r
+ vpMouseMoveEvent((QMouseEvent*) e);\r
+ return true;\r
+\r
+ case QEvent::MouseButtonDblClick:\r
+ emit mouseDoubleClicked(this, (QMouseEvent*)e);\r
+ return true;\r
+\r
+ case QEvent::Wheel:\r
+ {\r
+ QWheelEvent* aEvent = (QWheelEvent*) e;\r
+ myViewPort->startZoomAtPoint( aEvent->x(), aEvent->y() );\r
+ double delta = (double)( aEvent->delta() ) / ( 15 * 8 );\r
+ int x = aEvent->x();\r
+ int y = aEvent->y();\r
+ int x1 = (int)( aEvent->x() + width()*delta/100 );\r
+ int y1 = (int)( aEvent->y() + height()*delta/100 );\r
+ myViewPort->zoom( x, y, x1, y1 );\r
+ }\r
+ return true;\r
+\r
+ case QEvent::ContextMenu:\r
+ {\r
+ QContextMenuEvent * aEvent = (QContextMenuEvent*)e;\r
+ if ( aEvent->reason() != QContextMenuEvent::Mouse )\r
+ emit contextMenuRequested( aEvent );\r
+ }\r
+ return true;\r
+\r
+ case QEvent::KeyPress:\r
+ emit keyPressed(this, (QKeyEvent*) e);\r
+ return true;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ return SUIT_ViewWindow::eventFilter(watched, e);\r
+}\r
+\r
+/*!\r
+ \brief Update state of enable draw mode state.\r
+*/\r
+void OCCViewer_ViewWindow::updateEnabledDrawMode()\r
+{\r
+ if ( myModel )\r
+ myEnableDrawMode = myModel->isSelectionEnabled() && myModel->isMultiSelectionEnabled();\r
+}\r
+\r
+/*!\r
+ \brief Handle mouse press event\r
+ \param theEvent mouse event\r
+*/\r
+void OCCViewer_ViewWindow::vpMousePressEvent( QMouseEvent* theEvent )\r
+{\r
+ myStartX = theEvent->x();\r
+ myStartY = theEvent->y();\r
+ int anInteractionStyle = interactionStyle();\r
+\r
+ // in "key free" interaction style zoom operation is activated by two buttons (simultaneously pressed),\r
+ // which are assigned for pan and rotate - these operations are activated immediately after pressing \r
+ // of the first button, so it is necessary to switch to zoom when the second button is pressed\r
+ bool aSwitchToZoom = false;\r
+ if ( anInteractionStyle == SUIT_ViewModel::KEY_FREE && \r
+ ( myOperation == PANVIEW || myOperation == ROTATE ) ) {\r
+ aSwitchToZoom = getButtonState( theEvent, anInteractionStyle ) == ZOOMVIEW;\r
+ }\r
+\r
+ switch ( myOperation ) {\r
+ case WINDOWFIT:\r
+ if ( theEvent->button() == Qt::LeftButton )\r
+ emit vpTransformationStarted ( WINDOWFIT );\r
+ break;\r
+\r
+ case PANGLOBAL:\r
+ if ( theEvent->button() == Qt::LeftButton )\r
+ emit vpTransformationStarted ( PANGLOBAL );\r
+ break;\r
+\r
+ case ZOOMVIEW:\r
+ if ( theEvent->button() == Qt::LeftButton ) {\r
+ myViewPort->startZoomAtPoint( myStartX, myStartY );\r
+ emit vpTransformationStarted ( ZOOMVIEW );\r
+ }\r
+ break;\r
+\r
+ case PANVIEW:\r
+ if ( aSwitchToZoom ) {\r
+ myViewPort->startZoomAtPoint( myStartX, myStartY );\r
+ activateZoom();\r
+ }\r
+ else if ( theEvent->button() == Qt::LeftButton )\r
+ emit vpTransformationStarted ( PANVIEW );\r
+ break;\r
+\r
+ case ROTATE:\r
+ if ( aSwitchToZoom ) {\r
+ myViewPort->startZoomAtPoint( myStartX, myStartY );\r
+ activateZoom();\r
+ }\r
+ else if ( theEvent->button() == Qt::LeftButton ) {\r
+ myViewPort->startRotation(myStartX, myStartY, myCurrPointType, mySelectedPoint);\r
+ emit vpTransformationStarted ( ROTATE );\r
+ }\r
+ break;\r
+\r
+ default:\r
+ /* Try to activate a transformation */\r
+ OperationType aState;\r
+ if ( interactionStyle() == SUIT_ViewModel::STANDARD )\r
+ aState = getButtonState(theEvent, anInteractionStyle);\r
+ else {\r
+ aState = OCCViewer_ViewWindow::NOTHING;\r
+ myIsKeyFree = true;\r
+ }\r
+ switch ( aState ) {\r
+ case ZOOMVIEW:\r
+ myViewPort->startZoomAtPoint( myStartX, myStartY );\r
+ activateZoom();\r
+ break;\r
+ case PANVIEW:\r
+ activatePanning();\r
+ break;\r
+ case ROTATE:\r
+ activateRotation();\r
+ myViewPort->startRotation(myStartX, myStartY, myCurrPointType, mySelectedPoint);\r
+ break;\r
+ default:\r
+ if ( myRotationPointSelection )\r
+ {\r
+ if ( theEvent->button() == Qt::LeftButton )\r
+ {\r
+ Handle(AIS_InteractiveContext) ic = myModel->getAISContext();\r
+ ic->Select();\r
+ for ( ic->InitSelected(); ic->MoreSelected(); ic->NextSelected() )\r
+ {\r
+ TopoDS_Shape aShape = ic->SelectedShape();\r
+ if ( !aShape.IsNull() && aShape.ShapeType() == TopAbs_VERTEX )\r
+ {\r
+ gp_Pnt aPnt = BRep_Tool::Pnt( TopoDS::Vertex( ic->SelectedShape() ) );\r
+ if ( mySetRotationPointDlg )\r
+ {\r
+ myRotationPointSelection = false;\r
+ mySetRotationPointDlg->setCoords(aPnt.X(), aPnt.Y(), aPnt.Z());\r
+ }\r
+ }\r
+ else\r
+ {\r
+ myCurrPointType = myPrevPointType;\r
+ break;\r
+ }\r
+ }\r
+ if ( ic->NbSelected() == 0 ) myCurrPointType = myPrevPointType;\r
+ if ( mySetRotationPointDlg ) mySetRotationPointDlg->toggleChange();\r
+ ic->CloseAllContexts();\r
+ myOperation = NOTHING;\r
+ myViewPort->setCursor( myCursor );\r
+ myCursorIsHand = false;\r
+ myRotationPointSelection = false;\r
+ }\r
+ }\r
+ else\r
+ emit mousePressed(this, theEvent);\r
+ break;\r
+ }\r
+ /* notify that we start a transformation */\r
+ if ( transformRequested() )\r
+ emit vpTransformationStarted ( myOperation );\r
+ }\r
+ if ( transformRequested() )\r
+ setTransformInProcess( true );\r
+\r
+ /* we may need it for sketching... */\r
+ if ( l_mbPressEvent )\r
+ delete l_mbPressEvent;\r
+ l_mbPressEvent = new QMouseEvent( *theEvent );\r
+}\r
+\r
+\r
+/*!\r
+ \brief Start zooming operation.\r
+\r
+ Sets the corresponding cursor for the widget.\r
+*/\r
+void OCCViewer_ViewWindow::activateZoom()\r
+{\r
+ if ( !transformRequested() && !myCursorIsHand )\r
+ myCursor = cursor(); /* save old cursor */\r
+\r
+ if ( myOperation != ZOOMVIEW ) {\r
+ QPixmap zoomPixmap (imageZoomCursor);\r
+ QCursor zoomCursor (zoomPixmap);\r
+ if( setTransformRequested ( ZOOMVIEW ) )\r
+ myViewPort->setCursor( zoomCursor );\r
+ }\r
+}\r
+\r
+\r
+/*!\r
+ \brief Start panning operation.\r
+\r
+ Sets the corresponding cursor for the widget.\r
+*/\r
+void OCCViewer_ViewWindow::activatePanning()\r
+{\r
+ if ( !transformRequested() && !myCursorIsHand )\r
+ myCursor = cursor(); // save old cursor\r
+\r
+ if ( myOperation != PANVIEW ) {\r
+ QCursor panCursor (Qt::SizeAllCursor);\r
+ if( setTransformRequested ( PANVIEW ) )\r
+ myViewPort->setCursor( panCursor );\r
+ }\r
+}\r
+\r
+/*!\r
+ \brief Start rotation operation\r
+\r
+ Sets the corresponding cursor for the widget.\r
+*/\r
+void OCCViewer_ViewWindow::activateRotation()\r
+{\r
+ if ( !transformRequested() && !myCursorIsHand )\r
+ myCursor = cursor(); // save old cursor\r
+\r
+ if ( myOperation != ROTATE ) {\r
+ QPixmap rotatePixmap (imageRotateCursor);\r
+ QCursor rotCursor (rotatePixmap);\r
+ if( setTransformRequested ( ROTATE ) )\r
+ myViewPort->setCursor( rotCursor );\r
+ }\r
+}\r
+\r
+/*!\r
+ \brief Compute the gravity center.\r
+ \param theX used to return X coordinate of the gravity center\r
+ \param theY used to return Y coordinate of the gravity center\r
+ \param theZ used to return Z coordinate of the gravity center\r
+ \return \c true if the gravity center is computed\r
+*/\r
+bool OCCViewer_ViewWindow::computeGravityCenter( double& theX, double& theY, double& theZ )\r
+{\r
+ Handle(Visual3d_View) aView = myViewPort->getView()->View();\r
+\r
+ Standard_Real Xmin,Ymin,Zmin,Xmax,Ymax,Zmax,U,V,W ;\r
+ Standard_Real Umin,Vmin,Umax,Vmax ;\r
+ Standard_Integer Nstruct,Npoint ;\r
+ Graphic3d_MapOfStructure MySetOfStructures;\r
+\r
+ aView->DisplayedStructures (MySetOfStructures);\r
+ Nstruct = MySetOfStructures.Extent() ;\r
+\r
+ Graphic3d_MapIteratorOfMapOfStructure MyIterator(MySetOfStructures) ;\r
+#if OCC_VERSION_LARGE > 0x06070000\r
+ aView->Camera()->WindowLimit(Umin,Vmin,Umax,Vmax);\r
+#else\r
+ aView->ViewMapping().WindowLimit(Umin,Vmin,Umax,Vmax);\r
+#endif\r
+ Npoint = 0 ; theX = theY = theZ = 0. ;\r
+ for( ; MyIterator.More(); MyIterator.Next()) {\r
+ if (!(MyIterator.Key())->IsEmpty()) {\r
+ (MyIterator.Key())->MinMaxValues(Xmin,Ymin,Zmin,\r
+ Xmax,Ymax,Zmax) ;\r
+\r
+ Standard_Real LIM = ShortRealLast() -1.;\r
+ if (! (fabs(Xmin) > LIM || fabs(Ymin) > LIM || fabs(Zmin) > LIM\r
+ || fabs(Xmax) > LIM || fabs(Ymax) > LIM || fabs(Zmax) > LIM )) {\r
+\r
+ aView->Projects(Xmin,Ymin,Zmin,U,V,W) ;\r
+ if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {\r
+ Npoint++ ; theX += Xmin ; theY += Ymin ; theZ += Zmin ;\r
+ }\r
+ aView->Projects(Xmax,Ymin,Zmin,U,V,W) ;\r
+ if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {\r
+ Npoint++ ; theX += Xmax ; theY += Ymin ; theZ += Zmin ;\r
+ }\r
+ aView->Projects(Xmin,Ymax,Zmin,U,V,W) ;\r
+ if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {\r
+ Npoint++ ; theX += Xmin ; theY += Ymax ; theZ += Zmin ;\r
+ }\r
+ aView->Projects(Xmax,Ymax,Zmin,U,V,W) ;\r
+ if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {\r
+ Npoint++ ; theX += Xmax ; theY += Ymax ; theZ += Zmin ;\r
+ }\r
+ aView->Projects(Xmin,Ymin,Zmax,U,V,W) ;\r
+ if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {\r
+ Npoint++ ; theX += Xmin ; theY += Ymin ; theZ += Zmax ;\r
+ }\r
+ aView->Projects(Xmax,Ymin,Zmax,U,V,W) ;\r
+ if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {\r
+ Npoint++ ; theX += Xmax ; theY += Ymin ; theZ += Zmax ;\r
+ }\r
+ aView->Projects(Xmin,Ymax,Zmax,U,V,W) ;\r
+ if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {\r
+ Npoint++ ; theX += Xmin ; theY += Ymax ; theZ += Zmax ;\r
+ }\r
+ aView->Projects(Xmax,Ymax,Zmax,U,V,W) ;\r
+ if( U >= Umin && U <= Umax && V >= Vmin && V <= Vmax ) {\r
+ Npoint++ ; theX += Xmax ; theY += Ymax ; theZ += Zmax ;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ if( Npoint > 0 ) {\r
+ theX /= Npoint ; theY /= Npoint ; theZ /= Npoint ;\r
+ }\r
+ return true;\r
+}\r
+\r
+/*!\r
+ \brief Set the gravity center as a rotation point.\r
+*/\r
+void OCCViewer_ViewWindow::activateSetRotationGravity()\r
+{\r
+ if ( myRotationPointSelection )\r
+ {\r
+ Handle(AIS_InteractiveContext) ic = myModel->getAISContext();\r
+ ic->CloseAllContexts();\r
+ myOperation = NOTHING;\r
+ myViewPort->setCursor( myCursor );\r
+ myCursorIsHand = false;\r
+ myRotationPointSelection = false;\r
+ }\r
+\r
+ myPrevPointType = myCurrPointType;\r
+ myCurrPointType = GRAVITY;\r
+\r
+ Standard_Real Xcenter, Ycenter, Zcenter;\r
+ if ( computeGravityCenter( Xcenter, Ycenter, Zcenter ) )\r
+ mySetRotationPointDlg->setCoords( Xcenter, Ycenter, Zcenter );\r
+}\r
+\r
+/*!\r
+ \brief Update gravity center in the "Set Rotation Point" dialog box.\r
+ \sa OCCViewer_SetRotationPointDlg class\r
+*/\r
+void OCCViewer_ViewWindow::updateGravityCoords()\r
+{\r
+ if ( mySetRotationPointDlg && mySetRotationPointDlg->isVisible() && myCurrPointType == GRAVITY )\r
+ {\r
+ Standard_Real Xcenter, Ycenter, Zcenter;\r
+ if ( computeGravityCenter( Xcenter, Ycenter, Zcenter ) )\r
+ mySetRotationPointDlg->setCoords( Xcenter, Ycenter, Zcenter );\r
+ }\r
+}\r
+\r
+/*!\r
+ \brief Set the point selected by the user as a rotation point.\r
+ \param theX X coordinate of the rotation point\r
+ \param theY Y coordinate of the rotation point\r
+ \param theZ Z coordinate of the rotation point\r
+*/\r
+void OCCViewer_ViewWindow::activateSetRotationSelected( double theX, double theY, double theZ )\r
+{\r
+ if ( myRotationPointSelection )\r
+ {\r
+ Handle(AIS_InteractiveContext) ic = myModel->getAISContext();\r
+ ic->CloseAllContexts();\r
+ myOperation = NOTHING;\r
+ myViewPort->setCursor( myCursor );\r
+ myCursorIsHand = false;\r
+ myRotationPointSelection = false;\r
+ }\r
+\r
+ myPrevPointType = myCurrPointType;\r
+ myCurrPointType = SELECTED;\r
+ mySelectedPoint.SetCoord(theX,theY,theZ);\r
+}\r
+\r
+/*!\r
+ \brief Start the point selection process.\r
+*/\r
+void OCCViewer_ViewWindow::activateStartPointSelection()\r
+{\r
+ myPrevPointType = myCurrPointType;\r
+ myCurrPointType = SELECTED;\r
+\r
+ // activate selection ------>\r
+ Handle(AIS_InteractiveContext) ic = myModel->getAISContext();\r
+\r
+ ic->OpenLocalContext();\r
+\r
+ AIS_ListOfInteractive aList;\r
+ ic->DisplayedObjects( aList );\r
+ for ( AIS_ListIteratorOfListOfInteractive it( aList ); it.More(); it.Next() )\r
+ {\r
+ Handle(AIS_InteractiveObject) anObj = it.Value();\r
+ if ( !anObj.IsNull() && anObj->HasPresentation() &&\r
+ anObj->IsKind( STANDARD_TYPE(AIS_Shape) ) )\r
+ {\r
+ ic->Load(anObj,-1);\r
+ ic->Activate(anObj,AIS_Shape::SelectionMode(TopAbs_VERTEX));\r
+ }\r
+ }\r
+ // activate selection <------\r
+\r
+ if ( !myCursorIsHand )\r
+ {\r
+ QCursor handCursor (Qt::PointingHandCursor);\r
+ myCursorIsHand = true;\r
+ myCursor = cursor();\r
+ myViewPort->setCursor( handCursor );\r
+ }\r
+ myRotationPointSelection = true;\r
+}\r
+\r
+/*!\r
+ \brief Start global panning operation\r
+\r
+ Sets the corresponding cursor for the widget.\r
+*/\r
+void OCCViewer_ViewWindow::activateGlobalPanning()\r
+{\r
+ Handle(V3d_View) aView3d = myViewPort->getView();\r
+ if ( !aView3d.IsNull() ) {\r
+ QPixmap globalPanPixmap (imageCrossCursor);\r
+ QCursor glPanCursor (globalPanPixmap);\r
+ myCurScale = aView3d->Scale();\r
+ aView3d->FitAll(0.01, false);\r
+ myCursor = cursor(); // save old cursor\r
+ myViewPort->fitAll(); // fits view before selecting a new scene center\r
+ if( setTransformRequested( PANGLOBAL ) )\r
+ myViewPort->setCursor( glPanCursor );\r
+ }\r
+}\r
+\r
+/*!\r
+ \brief Starts fit operation.\r
+\r
+ Sets the corresponding cursor for the widget.\r
+*/\r
+void OCCViewer_ViewWindow::activateWindowFit()\r
+{\r
+ if ( !transformRequested() && !myCursorIsHand )\r
+ myCursor = cursor(); /* save old cursor */\r
+\r
+ if ( myOperation != WINDOWFIT ) {\r
+ QCursor handCursor (Qt::PointingHandCursor);\r
+ if( setTransformRequested ( WINDOWFIT ) )\r
+ {\r
+ myViewPort->setCursor ( handCursor );\r
+ myCursorIsHand = true;\r
+ }\r
+ }\r
+}\r
+\r
+/*!\r
+ \brief Start delayed viewer operation.\r
+*/\r
+bool OCCViewer_ViewWindow::setTransformRequested( OperationType op )\r
+{\r
+ bool ok = transformEnabled( op );\r
+ myOperation = ok ? op : NOTHING;\r
+ myViewPort->setMouseTracking( myOperation == NOTHING ); \r
+ return ok;\r
+}\r
+\r
+/*!\r
+ \brief Handle mouse move event.\r
+ \param theEvent mouse event\r
+*/\r
+void OCCViewer_ViewWindow::vpMouseMoveEvent( QMouseEvent* theEvent )\r
+{\r
+ if ( myIsKeyFree && interactionStyle() == SUIT_ViewModel::KEY_FREE ) {\r
+ myIsKeyFree = false;\r
+ switch ( getButtonState( theEvent, interactionStyle() ) ) {\r
+ case ZOOMVIEW:\r
+ myViewPort->startZoomAtPoint( myStartX, myStartY );\r
+ activateZoom();\r
+ break;\r
+ case PANVIEW:\r
+ activatePanning();\r
+ break;\r
+ case ROTATE:\r
+ activateRotation();\r
+ myViewPort->startRotation(myStartX, myStartY, myCurrPointType, mySelectedPoint);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+\r
+ myCurrX = theEvent->x();\r
+ myCurrY = theEvent->y();\r
+ switch (myOperation) {\r
+ case ROTATE:\r
+ myViewPort->rotate(myCurrX, myCurrY, myCurrPointType, mySelectedPoint);\r
+ break;\r
+\r
+ case ZOOMVIEW:\r
+ myViewPort->zoom(myStartX, myStartY, myCurrX, myCurrY);\r
+ myStartX = myCurrX;\r
+ myStartY = myCurrY;\r
+ break;\r
+\r
+ case PANVIEW:\r
+ myViewPort->pan(myCurrX - myStartX, myStartY - myCurrY);\r
+ myStartX = myCurrX;\r
+ myStartY = myCurrY;\r
+ break;\r
+\r
+/* case WINDOWFIT:\r
+ myDrawRect = true;\r
+ repaint();\r
+ break;\r
+*/\r
+ case PANGLOBAL:\r
+ break;\r
+\r
+ default:\r
+ if ( myRotationPointSelection || isSketcherStyle() )\r
+ {\r
+ emit mouseMoving( this, theEvent );\r
+ }\r
+ else\r
+ {\r
+ int aState = theEvent->modifiers();\r
+ int aButton = theEvent->buttons();\r
+ int anInteractionStyle = interactionStyle();\r
+ if ( ( anInteractionStyle == SUIT_ViewModel::STANDARD &&\r
+ aButton == Qt::LeftButton && ( aState == Qt::NoModifier || Qt::ShiftModifier ) ) ||\r
+ ( anInteractionStyle == SUIT_ViewModel::KEY_FREE &&\r
+ aButton == Qt::LeftButton && ( aState == Qt::ControlModifier || aState == ( Qt::ControlModifier|Qt::ShiftModifier ) ) ) ) {\r
+ myDrawRect = myEnableDrawMode;\r
+ if ( myDrawRect ) {\r
+ drawRect();\r
+ if ( !myCursorIsHand ) { // we are going to sketch a rectangle\r
+ QCursor handCursor (Qt::PointingHandCursor);\r
+ myCursorIsHand = true;\r
+ myCursor = cursor();\r
+ myViewPort->setCursor( handCursor );\r
+ }\r
+ }\r
+ emit mouseMoving( this, theEvent );\r
+ }\r
+ else if ( ( anInteractionStyle == SUIT_ViewModel::STANDARD &&\r
+ aButton == Qt::RightButton && ( aState == Qt::NoModifier || Qt::ShiftModifier ) ) ||\r
+ ( anInteractionStyle == SUIT_ViewModel::KEY_FREE &&\r
+ aButton == Qt::RightButton && ( aState == Qt::ControlModifier || aState == ( Qt::ControlModifier|Qt::ShiftModifier ) ) ) ) {\r
+ OCCViewer_ViewSketcher* sketcher = 0;\r
+ QList<OCCViewer_ViewSketcher*>::Iterator it;\r
+ for ( it = mySketchers.begin(); it != mySketchers.end() && !sketcher; ++it )\r
+ {\r
+ OCCViewer_ViewSketcher* sk = (*it);\r
+ if( sk->isDefault() && sk->sketchButton() == aButton )\r
+ sketcher = sk;\r
+ }\r
+ if ( sketcher && myCurSketch == -1 )\r
+ {\r
+ activateSketching( sketcher->type() );\r
+ if ( mypSketcher )\r
+ {\r
+ myCurSketch = mypSketcher->sketchButton();\r
+\r
+ if ( l_mbPressEvent )\r
+ {\r
+ QApplication::sendEvent( getViewPort(), l_mbPressEvent );\r
+ delete l_mbPressEvent;\r
+ l_mbPressEvent = 0;\r
+ }\r
+ QApplication::sendEvent( getViewPort(), theEvent );\r
+ }\r
+ }\r
+ }\r
+ else\r
+ emit mouseMoving( this, theEvent );\r
+ }\r
+ }\r
+}\r
+\r
+/*!\r
+ \brief Handle mouse release event.\r
+ \param theEvent mouse event\r
+*/\r
+void OCCViewer_ViewWindow::vpMouseReleaseEvent(QMouseEvent* theEvent)\r
+{\r
+ switch ( myOperation ) {\r
+ case NOTHING:\r
+ {\r
+ int prevState = myCurSketch;\r
+ if(theEvent->button() == Qt::RightButton)\r
+ {\r
+ QList<OCCViewer_ViewSketcher*>::Iterator it;\r
+ for ( it = mySketchers.begin(); it != mySketchers.end() && myCurSketch != -1; ++it )\r
+ {\r
+ OCCViewer_ViewSketcher* sk = (*it);\r
+ if( ( sk->sketchButton() & theEvent->button() ) && sk->sketchButton() == myCurSketch )\r
+ myCurSketch = -1;\r
+ }\r
+ }\r
+\r
+ emit mouseReleased(this, theEvent);\r
+ if(theEvent->button() == Qt::RightButton && prevState == -1)\r
+ {\r
+ QContextMenuEvent aEvent( QContextMenuEvent::Mouse,\r
+ theEvent->pos(), theEvent->globalPos() );\r
+ emit contextMenuRequested( &aEvent );\r
+ }\r
+ }\r
+ break;\r
+ case ROTATE:\r
+ myViewPort->endRotation();\r
+ resetState();\r
+ break;\r
+\r
+ case PANVIEW:\r
+ case ZOOMVIEW:\r
+ resetState();\r
+ break;\r
+\r
+ case PANGLOBAL:\r
+ if ( theEvent->button() == Qt::LeftButton ) {\r
+ myViewPort->setCenter( theEvent->x(), theEvent->y() );\r
+ myViewPort->getView()->SetScale(myCurScale);\r
+ resetState();\r
+ }\r
+ break;\r
+\r
+ case WINDOWFIT:\r
+ if ( theEvent->button() == Qt::LeftButton ) {\r
+ myCurrX = theEvent->x();\r
+ myCurrY = theEvent->y();\r
+ drawRect();\r
+ QRect rect = SUIT_Tools::makeRect(myStartX, myStartY, myCurrX, myCurrY);\r
+ if ( !rect.isEmpty() ) myViewPort->fitRect(rect);\r
+ endDrawRect();\r
+ resetState();\r
+ }\r
+ break;\r
+ }\r
+\r
+ // NOTE: viewer 3D detects a rectangle of selection using this event\r
+ // so we must emit it BEFORE resetting the selection rectangle\r
+\r
+ if ( theEvent->button() == Qt::LeftButton && myDrawRect ) {\r
+ drawRect();\r
+ endDrawRect();\r
+ resetState();\r
+ myViewPort->update();\r
+ }\r
+\r
+ if ( l_mbPressEvent )\r
+ {\r
+ delete l_mbPressEvent;\r
+ l_mbPressEvent = 0;\r
+ }\r
+}\r
+\r
+/*!\r
+ \brief Reset the viewport to its initial state\r
+ ( no transformations in process etc. )\r
+*/\r
+void OCCViewer_ViewWindow::resetState()\r
+{\r
+ myDrawRect = false;\r
+\r
+ if ( myRotationPointSelection )\r
+ {\r
+ QCursor handCursor (Qt::PointingHandCursor);\r
+ myViewPort->setCursor( handCursor );\r
+ }\r
+ else\r
+ {\r
+ if ( transformRequested() || myCursorIsHand )\r
+ myViewPort->setCursor( myCursor );\r
+ myCursorIsHand = false;\r
+ }\r
+\r
+ if ( transformRequested() )\r
+ emit vpTransformationFinished (myOperation);\r
+\r
+ setTransformInProcess( false );\r
+ setTransformRequested( NOTHING );\r
+}\r
+\r
+\r
+/*!\r
+ \brief Draw rubber band rectangle.\r
+*/\r
+void OCCViewer_ViewWindow::drawRect()\r
+{\r
+ if ( !myRectBand ) {\r
+ myRectBand = new QtxRectRubberBand( myViewPort );\r
+ //QPalette palette;\r
+ //palette.setColor(myRectBand->foregroundRole(), Qt::white);\r
+ //myRectBand->setPalette(palette);\r
+ }\r
+ //myRectBand->hide();\r
+ \r
+ myRectBand->setUpdatesEnabled ( false );\r
+ QRect aRect = SUIT_Tools::makeRect(myStartX, myStartY, myCurrX, myCurrY);\r
+ myRectBand->initGeometry( aRect );\r
+\r
+ if ( !myRectBand->isVisible() )\r
+ myRectBand->show();\r
+\r
+ myRectBand->setUpdatesEnabled ( true );\r
+ //myRectBand->repaint();\r
+\r
+ //myRectBand->setVisible( aRect.isValid() );\r
+ //if ( myRectBand->isVisible() )\r
+ // myRectBand->repaint();\r
+ //else\r
+ // myRectBand->show();\r
+ //myRectBand->repaint();\r
+}\r
+\r
+/*!\r
+ \brief Clear rubber band rectangle on the end on the dragging operation.\r
+*/\r
+void OCCViewer_ViewWindow::endDrawRect()\r
+{\r
+ //delete myRectBand;\r
+ //myRectBand = 0;\r
+ if ( myRectBand )\r
+ {\r
+ myRectBand->clearGeometry();\r
+ myRectBand->hide();\r
+ }\r
+}\r
+\r
+/*!\r
+ \brief Create actions.\r
+*/\r
+void OCCViewer_ViewWindow::createActions()\r
+{\r
+ if( !toolMgr()->isEmpty() )\r
+ return;\r
+ \r
+ SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();\r
+\r
+ QtxAction* aAction;\r
+\r
+ // Dump view\r
+ aAction = new QtxAction(tr("MNU_DUMP_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_DUMP" ) ),\r
+ tr( "MNU_DUMP_VIEW" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_DUMP_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onDumpView()));\r
+ toolMgr()->registerAction( aAction, DumpId );\r
+\r
+ // FitAll\r
+ aAction = new QtxAction(tr("MNU_FITALL"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_FITALL" ) ),\r
+ tr( "MNU_FITALL" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_FITALL"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onFitAll()));\r
+ toolMgr()->registerAction( aAction, FitAllId );\r
+\r
+ // FitRect\r
+ aAction = new QtxAction(tr("MNU_FITRECT"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_FITAREA" ) ),\r
+ tr( "MNU_FITRECT" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_FITRECT"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(activateWindowFit()));\r
+ toolMgr()->registerAction( aAction, FitRectId );\r
+ \r
+ // Zoom\r
+ aAction = new QtxAction(tr("MNU_ZOOM_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_ZOOM" ) ),\r
+ tr( "MNU_ZOOM_VIEW" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_ZOOM_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(activateZoom()));\r
+ toolMgr()->registerAction( aAction, ZoomId );\r
+\r
+ // Panning\r
+ aAction = new QtxAction(tr("MNU_PAN_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_PAN" ) ),\r
+ tr( "MNU_PAN_VIEW" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_PAN_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(activatePanning()));\r
+ toolMgr()->registerAction( aAction, PanId );\r
+\r
+ // Global Panning\r
+ aAction = new QtxAction(tr("MNU_GLOBALPAN_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_GLOBALPAN" ) ),\r
+ tr( "MNU_GLOBALPAN_VIEW" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_GLOBALPAN_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(activateGlobalPanning()));\r
+ toolMgr()->registerAction( aAction, GlobalPanId );\r
+\r
+ // Rotation Point\r
+ mySetRotationPointAction = new QtxAction(tr("MNU_CHANGINGROTATIONPOINT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_ROTATION_POINT" ) ),\r
+ tr( "MNU_CHANGINGROTATIONPOINT_VIEW" ), 0, this);\r
+ mySetRotationPointAction->setStatusTip(tr("DSC_CHANGINGROTATIONPOINT_VIEW"));\r
+ mySetRotationPointAction->setCheckable( true );\r
+ connect(mySetRotationPointAction, SIGNAL(toggled( bool )), this, SLOT(onSetRotationPoint( bool )));\r
+ toolMgr()->registerAction( mySetRotationPointAction, ChangeRotationPointId );\r
+\r
+ // Rotation\r
+ aAction = new QtxAction(tr("MNU_ROTATE_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_ROTATE" ) ),\r
+ tr( "MNU_ROTATE_VIEW" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_ROTATE_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(activateRotation()));\r
+ toolMgr()->registerAction( aAction, RotationId );\r
+\r
+ // Projections\r
+ aAction = new QtxAction(tr("MNU_FRONT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_FRONT" ) ),\r
+ tr( "MNU_FRONT_VIEW" ), 0, this, false, "Viewers:Front view");\r
+ aAction->setStatusTip(tr("DSC_FRONT_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onFrontView()));\r
+ this->addAction(aAction);\r
+ toolMgr()->registerAction( aAction, FrontId );\r
+\r
+ aAction = new QtxAction(tr("MNU_BACK_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_BACK" ) ),\r
+ tr( "MNU_BACK_VIEW" ), 0, this, false, "Viewers:Back view");\r
+ aAction->setStatusTip(tr("DSC_BACK_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onBackView()));\r
+ this->addAction(aAction);\r
+ toolMgr()->registerAction( aAction, BackId );\r
+\r
+ aAction = new QtxAction(tr("MNU_TOP_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_TOP" ) ),\r
+ tr( "MNU_TOP_VIEW" ), 0, this, false, "Viewers:Top view");\r
+ aAction->setStatusTip(tr("DSC_TOP_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onTopView()));\r
+ this->addAction(aAction);\r
+ toolMgr()->registerAction( aAction, TopId );\r
+\r
+ aAction = new QtxAction(tr("MNU_BOTTOM_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_BOTTOM" ) ),\r
+ tr( "MNU_BOTTOM_VIEW" ), 0, this, false, "Viewers:Bottom view");\r
+ aAction->setStatusTip(tr("DSC_BOTTOM_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onBottomView()));\r
+ this->addAction(aAction);\r
+ toolMgr()->registerAction( aAction, BottomId );\r
+ \r
+ aAction = new QtxAction(tr("MNU_LEFT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_LEFT" ) ),\r
+ tr( "MNU_LEFT_VIEW" ), 0, this, false, "Viewers:Left view");\r
+ aAction->setStatusTip(tr("DSC_LEFT_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onLeftView()));\r
+ this->addAction(aAction);\r
+ toolMgr()->registerAction( aAction, LeftId );\r
+\r
+ aAction = new QtxAction(tr("MNU_RIGHT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_RIGHT" ) ),\r
+ tr( "MNU_RIGHT_VIEW" ), 0, this, false, "Viewers:Right view");\r
+ aAction->setStatusTip(tr("DSC_RIGHT_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onRightView()));\r
+ this->addAction(aAction);\r
+ toolMgr()->registerAction( aAction, RightId );\r
+\r
+ // rotate anticlockwise\r
+ aAction = new QtxAction(tr("MNU_ANTICLOCKWISE_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_ANTICLOCKWISE" ) ),\r
+ tr( "MNU_ANTICLOCKWISE_VIEW" ), 0, this, false, "Viewers:Rotate anticlockwise");\r
+ aAction->setStatusTip(tr("DSC_ANTICLOCKWISE_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onAntiClockWiseView()));\r
+ this->addAction(aAction);\r
+ toolMgr()->registerAction( aAction, AntiClockWiseId );\r
+\r
+ // rotate clockwise\r
+ aAction = new QtxAction(tr("MNU_CLOCKWISE_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_CLOCKWISE" ) ),\r
+ tr( "MNU_CLOCKWISE_VIEW" ), 0, this, false, "Viewers:Rotate clockwise");\r
+ aAction->setStatusTip(tr("DSC_CLOCKWISE_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onClockWiseView()));\r
+ this->addAction(aAction);\r
+ toolMgr()->registerAction( aAction, ClockWiseId );\r
+\r
+ // Reset\r
+ aAction = new QtxAction(tr("MNU_RESET_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_RESET" ) ),\r
+ tr( "MNU_RESET_VIEW" ), 0, this, false, "Viewers:Reset view");\r
+ aAction->setStatusTip(tr("DSC_RESET_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onResetView()));\r
+ this->addAction(aAction);\r
+ toolMgr()->registerAction( aAction, ResetId );\r
+\r
+ // Clone\r
+ aAction = new QtxAction(tr("MNU_CLONE_VIEW"),\r
+ aResMgr->loadPixmap("OCCViewer", tr("ICON_OCCVIEWER_CLONE_VIEW")),\r
+ tr("MNU_CLONE_VIEW"), 0, this);\r
+ aAction->setStatusTip(tr("DSC_CLONE_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onCloneView()));\r
+ toolMgr()->registerAction( aAction, CloneId );\r
+\r
+ aAction = new QtxAction (tr ("MNU_CLIPPING"), aResMgr->loadPixmap ("OCCViewer", tr ("ICON_OCCVIEWER_CLIPPING")),\r
+ tr ("MNU_CLIPPING"), 0, this);\r
+ aAction->setStatusTip (tr ("DSC_CLIPPING"));\r
+ aAction->setCheckable (true);\r
+ connect (aAction, SIGNAL (toggled (bool)), this, SLOT (onClipping (bool)));\r
+ toolMgr()->registerAction (aAction, ClippingId);\r
+\r
+ aAction = new QtxAction(tr("MNU_SHOOT_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_SHOOT_VIEW" ) ),\r
+ tr( "MNU_SHOOT_VIEW" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_SHOOT_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onMemorizeView()));\r
+ toolMgr()->registerAction( aAction, MemId );\r
+\r
+ aAction = new QtxAction(tr("MNU_PRESETS_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_PRESETS_VIEW" ) ),\r
+ tr( "MNU_PRESETS_VIEW" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_PRESETS_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onRestoreView()));\r
+ toolMgr()->registerAction( aAction, RestoreId );\r
+\r
+ if (myModel->trihedronActivated()) {\r
+ aAction = new QtxAction(tr("MNU_SHOW_TRIHEDRE"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_VIEW_TRIHEDRON" ) ),\r
+ tr( "MNU_SHOW_TRIHEDRE" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_SHOW_TRIHEDRE"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onTrihedronShow()));\r
+ toolMgr()->registerAction( aAction, TrihedronShowId );\r
+ }\r
+\r
+ // Scale\r
+ aAction = new QtxAction(tr("MNU_SCALING"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_SCALING" ) ),\r
+ tr( "MNU_SCALING" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_SCALING"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onAxialScale()));\r
+ toolMgr()->registerAction( aAction, AxialScaleId );\r
+\r
+ // Enable/disable preselection\r
+ aAction = new QtxAction(tr("MNU_ENABLE_PRESELECTION"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_PRESELECTION" ) ),\r
+ tr( "MNU_ENABLE_PRESELECTION" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_ENABLE_PRESELECTION"));\r
+ aAction->setCheckable(true);\r
+ connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchPreselection(bool)));\r
+ toolMgr()->registerAction( aAction, SwitchPreselectionId );\r
+\r
+ // Enable/disable selection\r
+ aAction = new QtxAction(tr("MNU_ENABLE_SELECTION"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_SELECTION" ) ),\r
+ tr( "MNU_ENABLE_SELECTION" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_ENABLE_SELECTION"));\r
+ aAction->setCheckable(true);\r
+ connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchSelection(bool)));\r
+ toolMgr()->registerAction( aAction, SwitchSelectionId );\r
+\r
+ // Graduated axes \r
+ aAction = new QtxAction(tr("MNU_GRADUATED_AXES"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_GRADUATED_AXES" ) ),\r
+ tr( "MNU_GRADUATED_AXES" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_GRADUATED_AXES"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onGraduatedAxes()));\r
+ toolMgr()->registerAction( aAction, GraduatedAxesId );\r
+\r
+ // Active only ambient light or not\r
+ aAction = new QtxAction(tr("MNU_AMBIENT"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_AMBIENT" ) ),\r
+ tr( "MNU_AMBIENT" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_AMBIENT"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onAmbientToogle()));\r
+ toolMgr()->registerAction( aAction, AmbientId );\r
+\r
+ // Switch between interaction styles\r
+ aAction = new QtxAction(tr("MNU_STYLE_SWITCH"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_STYLE_SWITCH" ) ),\r
+ tr( "MNU_STYLE_SWITCH" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_STYLE_SWITCH"));\r
+ aAction->setCheckable(true);\r
+ connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchInteractionStyle(bool)));\r
+ toolMgr()->registerAction( aAction, SwitchInteractionStyleId );\r
+\r
+ // Switch between zooming styles\r
+ aAction = new QtxAction(tr("MNU_ZOOMING_STYLE_SWITCH"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_ZOOMING_STYLE_SWITCH" ) ),\r
+ tr( "MNU_ZOOMING_STYLE_SWITCH" ), 0, this);\r
+ aAction->setStatusTip(tr("DSC_ZOOMING_STYLE_SWITCH"));\r
+ aAction->setCheckable(true);\r
+ connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchZoomingStyle(bool)));\r
+ toolMgr()->registerAction( aAction, SwitchZoomingStyleId );\r
+\r
+ // Maximized view\r
+ aAction = new QtxAction(tr("MNU_MINIMIZE_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_MINIMIZE" ) ),\r
+ tr( "MNU_MINIMIZE_VIEW" ), 0, this );\r
+ aAction->setStatusTip(tr("DSC_MINIMIZE_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(onMaximizedView()));\r
+ toolMgr()->registerAction( aAction, MaximizedId );\r
+\r
+ // Return to 3d view\r
+ if (my2dMode!=No2dMode){\r
+ aAction = new QtxAction(tr("MNU_RETURN_3D_VIEW"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_RETURN_3D_VIEW" ) ),\r
+ tr( "MNU_RETURN_3D_VIEW" ), 0, this );\r
+ aAction->setStatusTip(tr("DSC_RETURN_3D_VIEW"));\r
+ connect(aAction, SIGNAL(triggered()), this, SLOT(returnTo3dView()));\r
+ toolMgr()->registerAction( aAction, ReturnTo3dViewId );\r
+ }\r
+\r
+ // Synchronize View \r
+ toolMgr()->registerAction( synchronizeAction(), SynchronizeId );\r
+}\r
+\r
+/*!\r
+ \brief Create toolbar.\r
+*/\r
+void OCCViewer_ViewWindow::createToolBar()\r
+{\r
+ QString aToolbarName;\r
+ switch (my2dMode) {\r
+ case XYPlane:\r
+ aToolbarName = tr( "LBL_XYTOOLBAR_LABEL" );\r
+ break;\r
+ case XZPlane:\r
+ aToolbarName = tr( "LBL_XZTOOLBAR_LABEL" );\r
+ break;\r
+ case YZPlane:\r
+ aToolbarName = tr( "LBL_YZTOOLBAR_LABEL" );\r
+ break;\r
+ default:\r
+ aToolbarName = tr( "LBL_3DTOOLBAR_LABEL" );\r
+ }\r
+ \r
+ int tid = toolMgr()->createToolBar( aToolbarName, false );\r
+ if ( my2dMode != No2dMode ){\r
+ toolMgr()->append( ReturnTo3dViewId, tid );\r
+ toolMgr()->append( toolMgr()->separator(), tid );\r
+ }\r
+ toolMgr()->append( DumpId, tid );\r
+ toolMgr()->append( SwitchInteractionStyleId, tid );\r
+#if OCC_VERSION_LARGE > 0x0603000A // available only with OCC-6.3-sp11 and higher version\r
+ toolMgr()->append( SwitchZoomingStyleId, tid );\r
+#endif\r
+ toolMgr()->append( SwitchPreselectionId, tid );\r
+ toolMgr()->append( SwitchSelectionId, tid );\r
+ if( myModel->trihedronActivated() )\r
+ toolMgr()->append( TrihedronShowId, tid );\r
+\r
+ QtxMultiAction* aScaleAction = new QtxMultiAction( this );\r
+ aScaleAction->insertAction( toolMgr()->action( FitAllId ) );\r
+ aScaleAction->insertAction( toolMgr()->action( FitRectId ) );\r
+ aScaleAction->insertAction( toolMgr()->action( ZoomId ) );\r
+ toolMgr()->append( aScaleAction, tid );\r
+\r
+ QtxMultiAction* aPanningAction = new QtxMultiAction( this );\r
+ aPanningAction->insertAction( toolMgr()->action( PanId ) );\r
+ aPanningAction->insertAction( toolMgr()->action( GlobalPanId ) );\r
+ toolMgr()->append( aPanningAction, tid );\r
+\r
+ if (my2dMode == No2dMode) {\r
+ toolMgr()->append( ChangeRotationPointId, tid );\r
+ toolMgr()->append( RotationId, tid );\r
+\r
+ QtxMultiAction* aViewsAction = new QtxMultiAction( this );\r
+ aViewsAction->insertAction( toolMgr()->action( FrontId ) );\r
+ aViewsAction->insertAction( toolMgr()->action( BackId ) );\r
+ aViewsAction->insertAction( toolMgr()->action( TopId ) );\r
+ aViewsAction->insertAction( toolMgr()->action( BottomId ) );\r
+ aViewsAction->insertAction( toolMgr()->action( LeftId ) );\r
+ aViewsAction->insertAction( toolMgr()->action( RightId ) );\r
+ toolMgr()->append( aViewsAction, tid );\r
+\r
+ toolMgr()->append( AntiClockWiseId, tid );\r
+ toolMgr()->append( ClockWiseId, tid );\r
+\r
+ toolMgr()->append( ResetId, tid );\r
+ }\r
+\r
+ QtxMultiAction* aMemAction = new QtxMultiAction( this );\r
+ aMemAction->insertAction( toolMgr()->action( MemId ) );\r
+ aMemAction->insertAction( toolMgr()->action( RestoreId ) );\r
+ toolMgr()->append( aMemAction, tid );\r
+\r
+ toolMgr()->append( toolMgr()->separator(), tid );\r
+ toolMgr()->append( CloneId, tid );\r
+ \r
+ toolMgr()->append( toolMgr()->separator(), tid );\r
+ toolMgr()->append( ClippingId, tid );\r
+ toolMgr()->append( AxialScaleId, tid );\r
+#if OCC_VERSION_LARGE > 0x06030009 // available only with OCC-6.3-sp10 and higher version\r
+ toolMgr()->append( GraduatedAxesId, tid );\r
+#endif\r
+ toolMgr()->append( AmbientId, tid );\r
+\r
+ toolMgr()->append( MaximizedId, tid );\r
+ toolMgr()->append( SynchronizeId, tid );\r
+}\r
+\r
+/*!\r
+ \brief Perform 'fit all' operation.\r
+*/\r
+void OCCViewer_ViewWindow::onViewFitAll()\r
+{\r
+ myViewPort->fitAll();\r
+}\r
+\r
+/*!\r
+ \brief Perform "front view" transformation.\r
+*/\r
+void OCCViewer_ViewWindow::onFrontView()\r
+{\r
+ emit vpTransformationStarted ( FRONTVIEW );\r
+ Handle(V3d_View) aView3d = myViewPort->getView();\r
+ if ( !aView3d.IsNull() ) aView3d->SetProj (V3d_Xpos);\r
+ onViewFitAll();\r
+ emit vpTransformationFinished ( FRONTVIEW );\r
+}\r
+\r
+/*!\r
+ \brief Perform "back view" transformation.\r
+*/\r
+void OCCViewer_ViewWindow::onBackView()\r
+{\r
+ emit vpTransformationStarted ( BACKVIEW );\r
+ Handle(V3d_View) aView3d = myViewPort->getView();\r
+ if ( !aView3d.IsNull() ) aView3d->SetProj (V3d_Xneg);\r
+ onViewFitAll();\r
+ emit vpTransformationFinished ( BACKVIEW );\r
+}\r
+\r
+/*!\r
+ \brief Perform "top view" transformation.\r
+*/\r
+void OCCViewer_ViewWindow::onTopView()\r
+{\r
+ emit vpTransformationStarted ( TOPVIEW );\r
+ Handle(V3d_View) aView3d = myViewPort->getView();\r
+ if ( !aView3d.IsNull() ) aView3d->SetProj (V3d_Zpos);\r
+ onViewFitAll();\r
+ emit vpTransformationFinished ( TOPVIEW );\r
+}\r
+\r
+/*!\r
+ \brief Perform "bottom view" transformation.\r
+*/\r
+void OCCViewer_ViewWindow::onBottomView()\r
+{\r
+ emit vpTransformationStarted ( BOTTOMVIEW );\r
+ Handle(V3d_View) aView3d = myViewPort->getView();\r
+ if ( !aView3d.IsNull() ) aView3d->SetProj (V3d_Zneg);\r
+ onViewFitAll();\r
+ emit vpTransformationFinished ( BOTTOMVIEW );\r
+}\r
+\r
+/*!\r
+ \brief Perform "left view" transformation.\r
+*/\r
+void OCCViewer_ViewWindow::onLeftView()\r
+{\r
+ emit vpTransformationStarted ( LEFTVIEW );\r
+ Handle(V3d_View) aView3d = myViewPort->getView();\r
+ if ( !aView3d.IsNull() ) aView3d->SetProj (V3d_Yneg);\r
+ onViewFitAll();\r
+ emit vpTransformationFinished ( LEFTVIEW );\r
+}\r
+\r
+/*!\r
+ \brief Perform "right view" transformation.\r
+*/\r
+void OCCViewer_ViewWindow::onRightView()\r
+{\r
+ emit vpTransformationStarted ( RIGHTVIEW );\r
+ Handle(V3d_View) aView3d = myViewPort->getView();\r
+ if ( !aView3d.IsNull() ) aView3d->SetProj (V3d_Ypos);\r
+ onViewFitAll();\r
+ emit vpTransformationFinished ( RIGHTVIEW );\r
+}\r
+\r
+/*!\r
+ \brief Rotate view 90 degrees clockwise\r
+*/\r
+void OCCViewer_ViewWindow::onClockWiseView()\r
+{\r
+ emit vpTransformationStarted ( CLOCKWISEVIEW );\r
+ myViewPort->rotateXY( 90. );\r
+ emit vpTransformationFinished ( CLOCKWISEVIEW );\r
+}\r
+\r
+/*!\r
+ \brief Rotate view 90 degrees conterclockwise\r
+*/\r
+void OCCViewer_ViewWindow::onAntiClockWiseView()\r
+{\r
+ emit vpTransformationStarted ( ANTICLOCKWISEVIEW );\r
+ myViewPort->rotateXY( -90. );\r
+ emit vpTransformationFinished ( ANTICLOCKWISEVIEW );\r
+}\r
+\r
+/*!\r
+ \brief Perform "reset view" transformation.\r
+\r
+ Sets default orientation of the viewport camera.\r
+*/\r
+void OCCViewer_ViewWindow::onResetView()\r
+{\r
+ emit vpTransformationStarted( RESETVIEW );\r
+ bool upd = myViewPort->getView()->SetImmediateUpdate( false );\r
+ myViewPort->getView()->Reset( false );\r
+ myViewPort->fitAll( false, true, false );\r
+ myViewPort->getView()->SetImmediateUpdate( upd );\r
+ myViewPort->getView()->Update();\r
+ emit vpTransformationFinished( RESETVIEW );\r
+}\r
+\r
+/*!\r
+ \brief Perform "fit all" transformation.\r
+*/\r
+void OCCViewer_ViewWindow::onFitAll()\r
+{\r
+ emit vpTransformationStarted( FITALLVIEW );\r
+ myViewPort->fitAll();\r
+ emit vpTransformationFinished( FITALLVIEW );\r
+}\r
+\r
+/*!\r
+ \brief Called if 'change rotation point' operation is activated.\r
+ \param on action state\r
+*/\r
+void OCCViewer_ViewWindow::onSetRotationPoint( bool on )\r
+{\r
+ if (on)\r
+ {\r
+ if (!mySetRotationPointDlg)\r
+ {\r
+ mySetRotationPointDlg = new OCCViewer_SetRotationPointDlg (this);\r
+ mySetRotationPointDlg->SetAction(mySetRotationPointAction);\r
+ }\r
+\r
+ if (!mySetRotationPointDlg->isVisible())\r
+ {\r
+ //if (mySetRotationPointDlg->IsFirstShown())\r
+ if (myCurrPointType == GRAVITY)\r
+ {\r
+ Standard_Real Xcenter, Ycenter, Zcenter;\r
+ if (computeGravityCenter(Xcenter, Ycenter, Zcenter))\r
+ mySetRotationPointDlg->setCoords(Xcenter, Ycenter, Zcenter);\r
+ }\r
+ mySetRotationPointDlg->show();\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if (mySetRotationPointDlg->isVisible())\r
+ mySetRotationPointDlg->hide();\r
+ }\r
+}\r
+\r
+/*!\r
+ \brief Create one more window with same content.\r
+*/\r
+void OCCViewer_ViewWindow::onCloneView()\r
+{\r
+ SUIT_ViewWindow* vw = myManager->createViewWindow();\r
+ //vw->show();\r
+ emit viewCloned( vw );\r
+}\r
+\r
+/*!\r
+ Creates one more window with same content\r
+*/\r
+void OCCViewer_ViewWindow::onAxialScale()\r
+{\r
+ if ( !myScalingDlg )\r
+ myScalingDlg = new OCCViewer_AxialScaleDlg( this );\r
+ \r
+ if ( !myScalingDlg->isVisible() )\r
+ {\r
+ myScalingDlg->Update();\r
+ myScalingDlg->show();\r
+ }\r
+}\r
+\r
+/*!\r
+ Shows Graduated Axes dialog\r
+*/\r
+void OCCViewer_ViewWindow::onGraduatedAxes()\r
+{\r
+ myCubeAxesDlg->Update();\r
+ myCubeAxesDlg->show();\r
+}\r
+\r
+void OCCViewer_ViewWindow::onAmbientToogle()\r
+{\r
+ Handle(V3d_Viewer) viewer = myViewPort->getViewer();\r
+ viewer->InitDefinedLights();\r
+ while(viewer->MoreDefinedLights())\r
+ {\r
+ Handle(V3d_Light) light = viewer->DefinedLight();\r
+ if(light->Type() != V3d_AMBIENT)\r
+ {\r
+ Handle(V3d_View) aView3d = myViewPort->getView();\r
+ if( aView3d->IsActiveLight(light) ) viewer->SetLightOff(light);\r
+ else viewer->SetLightOn(light);\r
+ }\r
+ viewer->NextDefinedLights();\r
+ }\r
+ viewer->Update();\r
+}\r
+\r
+/*!\r
+ \brief Store view parameters.\r
+*/\r
+void OCCViewer_ViewWindow::onMemorizeView()\r
+{\r
+ appendViewAspect( getViewParams() );\r
+}\r
+\r
+/*!\r
+ \brief Restore view parameters.\r
+*/\r
+void OCCViewer_ViewWindow::onRestoreView()\r
+{\r
+ OCCViewer_CreateRestoreViewDlg* aDlg = new OCCViewer_CreateRestoreViewDlg( centralWidget(), this );\r
+ connect( aDlg, SIGNAL( dlgOk() ), this, SLOT( setRestoreFlag() ) );\r
+ aDlg->exec();\r
+ updateViewAspects( aDlg->parameters() );\r
+ if( myRestoreFlag && aDlg->parameters().count() )\r
+ performRestoring( aDlg->currentItem() );\r
+}\r
+\r
+/*!\r
+ \brief Restore view parameters.\r
+ \param anItem view parameters\r
+*/\r
+void OCCViewer_ViewWindow::performRestoring( const viewAspect& anItem, bool baseParamsOnly )\r
+{\r
+ Handle(V3d_View) aView3d = myViewPort->getView();\r
+\r
+ Standard_Boolean prev = aView3d->SetImmediateUpdate( Standard_False );\r
+ aView3d->SetScale( anItem.scale );\r
+ aView3d->SetCenter( anItem.centerX, anItem.centerY );\r
+ aView3d->SetTwist( anItem.twist );\r
+ aView3d->SetAt( anItem.atX, anItem.atY, anItem.atZ );\r
+ aView3d->SetImmediateUpdate( prev );\r
+ aView3d->SetEye( anItem.eyeX, anItem.eyeY, anItem.eyeZ );\r
+ aView3d->SetProj( anItem.projX, anItem.projY, anItem.projZ );\r
+ aView3d->SetAxialScale( anItem.scaleX, anItem.scaleY, anItem.scaleZ );\r
+\r
+ if ( !baseParamsOnly ) {\r
+\r
+ myModel->setTrihedronShown( anItem.isVisible );\r
+ myModel->setTrihedronSize( anItem.size );\r
+ \r
+#if OCC_VERSION_LARGE > 0x06030009 // available only with OCC-6.3-sp10 and higher version\r
+ // graduated trihedron\r
+ bool anIsVisible = anItem.gtIsVisible;\r
+ OCCViewer_AxisWidget::AxisData anAxisData[3];\r
+ anAxisData[0].DrawName = anItem.gtDrawNameX;\r
+ anAxisData[1].DrawName = anItem.gtDrawNameZ;\r
+ anAxisData[2].DrawName = anItem.gtDrawNameZ;\r
+ anAxisData[0].Name = anItem.gtNameX;\r
+ anAxisData[1].Name = anItem.gtNameZ;\r
+ anAxisData[2].Name = anItem.gtNameZ;\r
+ anAxisData[0].NameColor = QColor( anItem.gtNameColorRX,\r
+ anItem.gtNameColorGX,\r
+ anItem.gtNameColorBX );\r
+ anAxisData[1].NameColor = QColor( anItem.gtNameColorRY,\r
+ anItem.gtNameColorGY,\r
+ anItem.gtNameColorBY );\r
+ anAxisData[2].NameColor = QColor( anItem.gtNameColorRZ,\r
+ anItem.gtNameColorGZ,\r
+ anItem.gtNameColorBZ );\r
+ anAxisData[0].DrawValues = anItem.gtDrawValuesX;\r
+ anAxisData[1].DrawValues = anItem.gtDrawValuesY;\r
+ anAxisData[2].DrawValues = anItem.gtDrawValuesZ;\r
+ anAxisData[0].NbValues = anItem.gtNbValuesX;\r
+ anAxisData[1].NbValues = anItem.gtNbValuesY;\r
+ anAxisData[2].NbValues = anItem.gtNbValuesZ;\r
+ anAxisData[0].Offset = anItem.gtOffsetX;\r
+ anAxisData[1].Offset = anItem.gtOffsetY;\r
+ anAxisData[2].Offset = anItem.gtOffsetZ;\r
+ anAxisData[0].Color = QColor( anItem.gtColorRX,\r
+ anItem.gtColorGX,\r
+ anItem.gtColorBX );\r
+ anAxisData[1].Color = QColor( anItem.gtColorRY,\r
+ anItem.gtColorGY,\r
+ anItem.gtColorBY );\r
+ anAxisData[2].Color = QColor( anItem.gtColorRZ,\r
+ anItem.gtColorGZ,\r
+ anItem.gtColorBZ );\r
+ anAxisData[0].DrawTickmarks = anItem.gtDrawTickmarksX;\r
+ anAxisData[1].DrawTickmarks = anItem.gtDrawTickmarksY;\r
+ anAxisData[2].DrawTickmarks = anItem.gtDrawTickmarksZ;\r
+ anAxisData[0].TickmarkLength = anItem.gtTickmarkLengthX;\r
+ anAxisData[1].TickmarkLength = anItem.gtTickmarkLengthY;\r
+ anAxisData[2].TickmarkLength = anItem.gtTickmarkLengthZ;\r
+\r
+ myCubeAxesDlg->SetData( anIsVisible, anAxisData );\r
+ myCubeAxesDlg->ApplyData( aView3d );\r
+#endif\r
+\r
+ } // if ( !baseParamsOnly )\r
+\r
+ myRestoreFlag = 0;\r
+}\r
+\r
+/*!\r
+ \brief Set restore flag.\r
+*/\r
+void OCCViewer_ViewWindow::setRestoreFlag()\r
+{\r
+ myRestoreFlag = 1;\r
+}\r
+\r
+/*!\r
+ \brief Called when action "show/hide trihedron" is activated.\r
+*/\r
+void OCCViewer_ViewWindow::onTrihedronShow()\r
+{\r
+ myModel->toggleTrihedron();\r
+}\r
+\r
+/*!\r
+ \brief Toggles preselection (highlighting) on/off\r
+*/\r
+void OCCViewer_ViewWindow::onSwitchPreselection( bool on )\r
+{\r
+ myPreselectionEnabled = on;\r
+ myModel->setSelectionOptions( isPreselectionEnabled(), myModel->isSelectionEnabled() );\r
+\r
+ // unhighlight all highlighted objects\r
+ /*if ( !on ) {\r
+ myModel->unHighlightAll( true, false );\r
+ }*/\r
+\r
+ // update action state if method is called outside\r
+ QtxAction* a = dynamic_cast<QtxAction*>( toolMgr()->action( SwitchPreselectionId ) );\r
+ if ( a && a->isChecked() != on ) {\r
+ a->setChecked( on );\r
+ }\r
+}\r
+\r
+/*!\r
+ \brief Toggles selection on/off\r
+*/\r
+void OCCViewer_ViewWindow::onSwitchSelection( bool on )\r
+{\r
+ mySelectionEnabled = on;\r
+ myModel->setSelectionOptions( myModel->isPreselectionEnabled(), isSelectionEnabled() );\r
+ \r
+ // update action state if method is called outside\r
+\r
+ // preselection\r
+ QtxAction* a = dynamic_cast<QtxAction*>( toolMgr()->action( SwitchPreselectionId ) );\r
+ if ( a ) {\r
+ a->setEnabled( on );\r
+ }\r
+\r
+ // selection\r
+ a = dynamic_cast<QtxAction*>( toolMgr()->action( SwitchSelectionId ) );\r
+ if ( a && a->isChecked() != on ) {\r
+ a->setChecked( on );\r
+ }\r
+}\r
+\r
+/*!\r
+ \brief Switches "keyboard free" interaction style on/off\r
+*/\r
+void OCCViewer_ViewWindow::onSwitchInteractionStyle( bool on )\r
+{\r
+ myInteractionStyle = on ? (int)SUIT_ViewModel::KEY_FREE : (int)SUIT_ViewModel::STANDARD;\r
+\r
+ // update action state if method is called outside\r
+ QtxAction* a = dynamic_cast<QtxAction*>( toolMgr()->action( SwitchInteractionStyleId ) );\r
+ if ( a->isChecked() != on )\r
+ a->setChecked( on );\r
+}\r
+\r
+/*!\r
+ \brief Toogles advanced zooming style (relatively to the cursor position) on/off\r
+*/\r
+void OCCViewer_ViewWindow::onSwitchZoomingStyle( bool on )\r
+{\r
+ myViewPort->setAdvancedZoomingEnabled( on );\r
+\r
+ // update action state if method is called outside\r
+ QtxAction* a = dynamic_cast<QtxAction*>( toolMgr()->action( SwitchZoomingStyleId ) );\r
+ if ( a->isChecked() != on )\r
+ a->setChecked( on );\r
+}\r
+\r
+/*!\r
+ \brief Get current interaction style\r
+ \return interaction style\r
+*/\r
+int OCCViewer_ViewWindow::interactionStyle() const\r
+{\r
+ return myInteractionStyle;\r
+}\r
+\r
+/*!\r
+ \brief Set current interaction style\r
+ \param theStyle interaction style\r
+*/\r
+void OCCViewer_ViewWindow::setInteractionStyle( const int theStyle )\r
+{\r
+ onSwitchInteractionStyle( theStyle == (int)SUIT_ViewModel::KEY_FREE );\r
+}\r
+\r
+/*!\r
+ \brief Get current zooming style\r
+ \return zooming style\r
+*/\r
+int OCCViewer_ViewWindow::zoomingStyle() const\r
+{\r
+ return myViewPort->isAdvancedZoomingEnabled() ? 1 : 0;\r
+}\r
+\r
+/*!\r
+ \brief Set current zooming style\r
+ \param theStyle zooming style\r
+*/\r
+void OCCViewer_ViewWindow::setZoomingStyle( const int theStyle )\r
+{\r
+ onSwitchZoomingStyle( theStyle == 1 );\r
+}\r
+\r
+/*!\r
+ \brief Dump view window contents to the pixmap.\r
+ \return pixmap containing all scene rendered in the window\r
+*/\r
+QImage OCCViewer_ViewWindow::dumpView()\r
+{\r
+ Handle(V3d_View) view = myViewPort->getView();\r
+ if ( view.IsNull() )\r
+ return QImage();\r
+ \r
+ int aWidth = myViewPort->width();\r
+ int aHeight = myViewPort->height();\r
+ QApplication::syncX();\r
+ view->Redraw(); // In order to reactivate GL context\r
+ //view->Update();\r
+\r
+ OpenGLUtils_FrameBuffer aFrameBuffer;\r
+ if( aFrameBuffer.init( aWidth, aHeight ) )\r
+ {\r
+ QImage anImage( aWidth, aHeight, QImage::Format_RGB32 );\r
+ \r
+ glPushAttrib( GL_VIEWPORT_BIT );\r
+ glViewport( 0, 0, aWidth, aHeight );\r
+ aFrameBuffer.bind();\r
+\r
+ // draw scene\r
+ view->Redraw();\r
+\r
+ aFrameBuffer.unbind();\r
+ glPopAttrib();\r
+\r
+ aFrameBuffer.bind();\r
+ glReadPixels( 0, 0, aWidth, aHeight, GL_RGBA, GL_UNSIGNED_BYTE, anImage.bits() );\r
+ aFrameBuffer.unbind();\r
+\r
+ anImage = anImage.rgbSwapped();\r
+ anImage = anImage.mirrored();\r
+ return anImage;\r
+ }\r
+ // if frame buffers are unsupported, use old functionality\r
+ //view->Redraw();\r
+\r
+ unsigned char* data = new unsigned char[ aWidth*aHeight*4 ];\r
+\r
+ QPoint p = myViewPort->mapFromParent(myViewPort->geometry().topLeft());\r
+\r
+ glReadPixels( p.x(), p.y(), aWidth, aHeight, GL_RGBA, GL_UNSIGNED_BYTE,\r
+ data);\r
+\r
+ QImage anImage( data, aWidth, aHeight, QImage::Format_ARGB32 );\r
+ anImage = anImage.mirrored();\r
+ anImage = anImage.rgbSwapped();\r
+ return anImage;\r
+}\r
+\r
+bool OCCViewer_ViewWindow::dumpViewToFormat( const QImage& img, \r
+ const QString& fileName, \r
+ const QString& format )\r
+{\r
+ if ( format != "PS" && format != "EPS")\r
+ return SUIT_ViewWindow::dumpViewToFormat( img, fileName, format );\r
+\r
+ Handle(Visual3d_View) a3dView = myViewPort->getView()->View();\r
+\r
+ if (format == "PS")\r
+ a3dView->Export(strdup(qPrintable(fileName)), Graphic3d_EF_PostScript);\r
+ else if (format == "EPS")\r
+ a3dView->Export(strdup(qPrintable(fileName)), Graphic3d_EF_EnhPostScript);\r
+\r
+ return true;\r
+}\r
+\r
+\r
+QString OCCViewer_ViewWindow::filter() const\r
+{\r
+ return tr( "OCC_IMAGE_FILES" );\r
+}\r
+\r
+\r
+/*!\r
+ \brief Set parameters of the cutting plane\r
+ \param on if \c true, cutting plane is enabled\r
+ \param x X position of plane point\r
+ \param y Y position of plane point\r
+ \param z Z position of plane point\r
+ \param dx X coordinate of plane normal\r
+ \param dy Y coordinate of plane normal\r
+ \param dz Z coordinate of plane normal\r
+*/\r
+void OCCViewer_ViewWindow::setCuttingPlane( bool on, const double x, const double y, const double z,\r
+ const double dx, const double dy, const double dz )\r
+{\r
+ Handle(V3d_View) view = myViewPort->getView();\r
+ if ( view.IsNull() )\r
+ return;\r
+\r
+ if ( on ) {\r
+ Handle(V3d_Viewer) viewer = myViewPort->getViewer();\r
+\r
+ // try to use already existing plane or create a new one\r
+ Handle(V3d_Plane) clipPlane;\r
+\r
+ // calculate new a,b,c,d values for the plane\r
+ gp_Pln pln (gp_Pnt(x, y, z), gp_Dir(dx, dy, dz));\r
+ double a, b, c, d;\r
+ pln.Coefficients(a, b, c, d);\r
+ \r
+ Graphic3d_SequenceOfHClipPlane aPlanes = view->GetClipPlanes();\r
+ Handle(Graphic3d_ClipPlane) aClipPlane;\r
+ if(aPlanes.Size() > 0 ) {\r
+ Graphic3d_SequenceOfHClipPlane::Iterator anIter (aPlanes);\r
+ aClipPlane = anIter.Value();\r
+ aClipPlane->SetEquation(pln);\r
+ aClipPlane->SetOn(Standard_True);\r
+ } else {\r
+ aClipPlane = new Graphic3d_ClipPlane(pln);\r
+ view->AddClipPlane(aClipPlane);\r
+ aClipPlane->SetOn(Standard_True);\r
+ }\r
+ }\r
+ else {\r
+ Graphic3d_SequenceOfHClipPlane aPlanes = view->GetClipPlanes();\r
+ Graphic3d_SequenceOfHClipPlane::Iterator anIter (aPlanes);\r
+ for( ;anIter.More();anIter.Next() ){\r
+ Handle(Graphic3d_ClipPlane) aClipPlane = anIter.Value();\r
+ aClipPlane->SetOn(Standard_False);\r
+ }\r
+ }\r
+\r
+ view->Update();\r
+ view->Redraw();\r
+}\r
+\r
+void OCCViewer_ViewWindow::setCuttingPlane( bool on, const gp_Pln pln )\r
+{\r
+ gp_Dir aDir = pln.Axis().Direction();\r
+ gp_Pnt aPnt = pln.Location();\r
+ setCuttingPlane(on, aPnt.X(), aPnt.Y(), aPnt.Z(), aDir.X(), aDir.Y(), aDir.Z());\r
+}\r
+\r
+\r
+/*!\r
+ \brief Check if any cutting plane is enabled\r
+ \return \c true if at least one cutting plane is enabled\r
+*/\r
+bool OCCViewer_ViewWindow::isCuttingPlane()\r
+{\r
+ Handle(V3d_View) view = myViewPort->getView();\r
+ bool res = false;\r
+ Graphic3d_SequenceOfHClipPlane aPlanes = view->GetClipPlanes();\r
+ Graphic3d_SequenceOfHClipPlane::Iterator anIter (aPlanes);\r
+ for( ;anIter.More();anIter.Next() ) {\r
+ Handle(Graphic3d_ClipPlane) aClipPlane = anIter.Value();\r
+ if(aClipPlane->IsOn()) {\r
+ res = true;\r
+ break;\r
+ }\r
+ }\r
+ return res;\r
+}\r
+\r
+/*!\r
+ \brief Get the visual parameters of the view window.\r
+ \return visual parameters of view window\r
+*/\r
+viewAspect OCCViewer_ViewWindow::getViewParams() const\r
+{\r
+ double centerX, centerY, projX, projY, projZ, twist;\r
+ double atX, atY, atZ, eyeX, eyeY, eyeZ;\r
+ double aScaleX, aScaleY, aScaleZ;\r
+\r
+ Handle(V3d_View) aView3d = myViewPort->getView();\r
+\r
+ aView3d->Center( centerX, centerY );\r
+ aView3d->Proj( projX, projY, projZ );\r
+ aView3d->At( atX, atY, atZ );\r
+ aView3d->Eye( eyeX, eyeY, eyeZ );\r
+ twist = aView3d->Twist();\r
+\r
+ aView3d->AxialScale(aScaleX,aScaleY,aScaleZ);\r
+\r
+ bool isShown = myModel->isTrihedronVisible();\r
+ double size = myModel->trihedronSize();\r
+\r
+ QString aName = QTime::currentTime().toString() + QString::fromLatin1( " h:m:s" );\r
+\r
+ viewAspect params;\r
+ params.scale = aView3d->Scale();\r
+ params.centerX = centerX;\r
+ params.centerY = centerY;\r
+ params.projX = projX;\r
+ params.projY = projY;\r
+ params.projZ = projZ;\r
+ params.twist = twist;\r
+ params.atX = atX;\r
+ params.atY = atY;\r
+ params.atZ = atZ;\r
+ params.eyeX = eyeX;\r
+ params.eyeY = eyeY;\r
+ params.eyeZ = eyeZ;\r
+ params.scaleX = aScaleX;\r
+ params.scaleY = aScaleY;\r
+ params.scaleZ = aScaleZ;\r
+ params.name = aName;\r
+ params.isVisible= isShown;\r
+ params.size = size;\r
+\r
+#if OCC_VERSION_LARGE > 0x06030009 // available only with OCC-6.3-sp10 and higher version\r
+ // graduated trihedron\r
+ bool anIsVisible = false;\r
+ OCCViewer_AxisWidget::AxisData anAxisData[3];\r
+ myCubeAxesDlg->GetData( anIsVisible, anAxisData );\r
+\r
+ params.gtIsVisible = anIsVisible;\r
+ params.gtDrawNameX = anAxisData[0].DrawName;\r
+ params.gtDrawNameY = anAxisData[1].DrawName;\r
+ params.gtDrawNameZ = anAxisData[2].DrawName;\r
+ params.gtNameX = anAxisData[0].Name;\r
+ params.gtNameY = anAxisData[1].Name;\r
+ params.gtNameZ = anAxisData[2].Name;\r
+ params.gtNameColorRX = anAxisData[0].NameColor.red();\r
+ params.gtNameColorGX = anAxisData[0].NameColor.green();\r
+ params.gtNameColorBX = anAxisData[0].NameColor.blue();\r
+ params.gtNameColorRY = anAxisData[1].NameColor.red();\r
+ params.gtNameColorGY = anAxisData[1].NameColor.green();\r
+ params.gtNameColorBY = anAxisData[1].NameColor.blue();\r
+ params.gtNameColorRZ = anAxisData[2].NameColor.red();\r
+ params.gtNameColorGZ = anAxisData[2].NameColor.green();\r
+ params.gtNameColorBZ = anAxisData[2].NameColor.blue();\r
+ params.gtDrawValuesX = anAxisData[0].DrawValues;\r
+ params.gtDrawValuesY = anAxisData[1].DrawValues;\r
+ params.gtDrawValuesZ = anAxisData[2].DrawValues;\r
+ params.gtNbValuesX = anAxisData[0].NbValues;\r
+ params.gtNbValuesY = anAxisData[1].NbValues;\r
+ params.gtNbValuesZ = anAxisData[2].NbValues;\r
+ params.gtOffsetX = anAxisData[0].Offset;\r
+ params.gtOffsetY = anAxisData[1].Offset;\r
+ params.gtOffsetZ = anAxisData[2].Offset;\r
+ params.gtColorRX = anAxisData[0].Color.red();\r
+ params.gtColorGX = anAxisData[0].Color.green();\r
+ params.gtColorBX = anAxisData[0].Color.blue();\r
+ params.gtColorRY = anAxisData[1].Color.red();\r
+ params.gtColorGY = anAxisData[1].Color.green();\r
+ params.gtColorBY = anAxisData[1].Color.blue();\r
+ params.gtColorRZ = anAxisData[2].Color.red();\r
+ params.gtColorGZ = anAxisData[2].Color.green();\r
+ params.gtColorBZ = anAxisData[2].Color.blue();\r
+ params.gtDrawTickmarksX = anAxisData[0].DrawTickmarks;\r
+ params.gtDrawTickmarksY = anAxisData[1].DrawTickmarks;\r
+ params.gtDrawTickmarksZ = anAxisData[2].DrawTickmarks;\r
+ params.gtTickmarkLengthX = anAxisData[0].TickmarkLength;\r
+ params.gtTickmarkLengthY = anAxisData[1].TickmarkLength;\r
+ params.gtTickmarkLengthZ = anAxisData[2].TickmarkLength;\r
+#endif\r
+\r
+ return params;\r
+}\r
+\r
+/*!\r
+ \brief Get visual parameters of this view window.\r
+ \return visual parameters of view window\r
+*/\r
+QString OCCViewer_ViewWindow::getVisualParameters()\r
+{\r
+ viewAspect params = getViewParams();\r
+\r
+ QStringList data;\r
+\r
+ data << QString( "scale=%1" ) .arg( params.scale, 0, 'e', 12 );\r
+ data << QString( "centerX=%1" ) .arg( params.centerX, 0, 'e', 12 );\r
+ data << QString( "centerY=%1" ) .arg( params.centerY, 0, 'e', 12 );\r
+ data << QString( "projX=%1" ) .arg( params.projX, 0, 'e', 12 );\r
+ data << QString( "projY=%1" ) .arg( params.projY, 0, 'e', 12 );\r
+ data << QString( "projZ=%1" ) .arg( params.projZ, 0, 'e', 12 );\r
+ data << QString( "twist=%1" ) .arg( params.twist, 0, 'e', 12 );\r
+ data << QString( "atX=%1" ) .arg( params.atX, 0, 'e', 12 );\r
+ data << QString( "atY=%1" ) .arg( params.atY, 0, 'e', 12 );\r
+ data << QString( "atZ=%1" ) .arg( params.atZ, 0, 'e', 12 );\r
+ data << QString( "eyeX=%1" ) .arg( params.eyeX, 0, 'e', 12 );\r
+ data << QString( "eyeY=%1" ) .arg( params.eyeY, 0, 'e', 12 );\r
+ data << QString( "eyeZ=%1" ) .arg( params.eyeZ, 0, 'e', 12 );\r
+ data << QString( "scaleX=%1" ) .arg( params.scaleX, 0, 'e', 12 );\r
+ data << QString( "scaleY=%1" ) .arg( params.scaleY, 0, 'e', 12 );\r
+ data << QString( "scaleZ=%1" ) .arg( params.scaleZ, 0, 'e', 12 );\r
+ data << QString( "isVisible=%1" ).arg( params.isVisible );\r
+ data << QString( "size=%1" ) .arg( params.size, 0, 'f', 2 );\r
+\r
+ ClipPlanesList aPlanes = myModel->getClipPlanes();\r
+ for ( int i=0; i < aPlanes.size(); i++ )\r
+ {\r
+ OCCViewer_ClipPlane& aPlane = aPlanes[i];\r
+ QString ClippingPlane = QString( "ClippingPlane%1=").arg( i+1 );\r
+ ClippingPlane += QString( "Mode~%1;").arg( (int)aPlane.Mode );\r
+ ClippingPlane += QString( "IsActive~%1;").arg( aPlane.IsOn );\r
+ switch ( aPlane.Mode )\r
+ {\r
+ case OCCViewer_ClipPlane::Absolute :\r
+ {\r
+ ClippingPlane += QString( "AbsoluteOrientation~%1;" ).arg( aPlane.OrientationType );\r
+\r
+ if ( aPlane.OrientationType == OCCViewer_ClipPlane::AbsoluteCustom )\r
+ {\r
+ ClippingPlane += QString( "Dx~%1;" ).arg( aPlane.AbsoluteOrientation.Dx );\r
+ ClippingPlane += QString( "Dy~%1;" ).arg( aPlane.AbsoluteOrientation.Dy );\r
+ ClippingPlane += QString( "Dz~%1;" ).arg( aPlane.AbsoluteOrientation.Dz );\r
+ }\r
+ else\r
+ {\r
+ ClippingPlane += QString( "IsInvert~%1;" ).arg( aPlane.AbsoluteOrientation.IsInvert );\r
+ }\r
+ }\r
+ break;\r
+\r
+ case OCCViewer_ClipPlane::Relative :\r
+ {\r
+ ClippingPlane += QString( "RelativeOrientation~%1;" ).arg( aPlane.OrientationType );\r
+ ClippingPlane += QString( "Rotation1~%1;" ).arg( aPlane.RelativeOrientation.Rotation1 );\r
+ ClippingPlane += QString( "Rotation2~%1" ).arg( aPlane.RelativeOrientation.Rotation2 );\r
+ }\r
+ break;\r
+ }\r
+\r
+ ClippingPlane += QString( "X~%1;" ).arg( aPlane.X );\r
+ ClippingPlane += QString( "Y~%1;" ).arg( aPlane.Y );\r
+ ClippingPlane += QString( "Z~%1;" ).arg( aPlane.Z );\r
+ data << ClippingPlane;\r
+ }\r
+\r
+\r
+#if OCC_VERSION_LARGE > 0x06030009 // available only with OCC-6.3-sp10 or newer version\r
+ // graduated trihedron\r
+ data << QString( "gtIsVisible=%1" ) .arg( params.gtIsVisible );\r
+ data << QString( "gtDrawNameX=%1" ) .arg( params.gtDrawNameX );\r
+ data << QString( "gtDrawNameY=%1" ) .arg( params.gtDrawNameY );\r
+ data << QString( "gtDrawNameZ=%1" ) .arg( params.gtDrawNameZ );\r
+ data << QString( "gtNameX=%1" ) .arg( params.gtNameX );\r
+ data << QString( "gtNameY=%1" ) .arg( params.gtNameY );\r
+ data << QString( "gtNameZ=%1" ) .arg( params.gtNameZ );\r
+ data << QString( "gtNameColorRX=%1" ) .arg( params.gtNameColorRX );\r
+ data << QString( "gtNameColorGX=%1" ) .arg( params.gtNameColorGX );\r
+ data << QString( "gtNameColorBX=%1" ) .arg( params.gtNameColorBX );\r
+ data << QString( "gtNameColorRY=%1" ) .arg( params.gtNameColorRY );\r
+ data << QString( "gtNameColorGY=%1" ) .arg( params.gtNameColorGY );\r
+ data << QString( "gtNameColorBY=%1" ) .arg( params.gtNameColorBY );\r
+ data << QString( "gtNameColorRZ=%1" ) .arg( params.gtNameColorRZ );\r
+ data << QString( "gtNameColorGZ=%1" ) .arg( params.gtNameColorGZ );\r
+ data << QString( "gtNameColorBZ=%1" ) .arg( params.gtNameColorBZ );\r
+ data << QString( "gtDrawValuesX=%1" ) .arg( params.gtDrawValuesX );\r
+ data << QString( "gtDrawValuesY=%1" ) .arg( params.gtDrawValuesY );\r
+ data << QString( "gtDrawValuesZ=%1" ) .arg( params.gtDrawValuesZ );\r
+ data << QString( "gtNbValuesX=%1" ) .arg( params.gtNbValuesX );\r
+ data << QString( "gtNbValuesY=%1" ) .arg( params.gtNbValuesY );\r
+ data << QString( "gtNbValuesZ=%1" ) .arg( params.gtNbValuesZ );\r
+ data << QString( "gtOffsetX=%1" ) .arg( params.gtOffsetX );\r
+ data << QString( "gtOffsetY=%1" ) .arg( params.gtOffsetY );\r
+ data << QString( "gtOffsetZ=%1" ) .arg( params.gtOffsetZ );\r
+ data << QString( "gtColorRX=%1" ) .arg( params.gtColorRX );\r
+ data << QString( "gtColorGX=%1" ) .arg( params.gtColorGX );\r
+ data << QString( "gtColorBX=%1" ) .arg( params.gtColorBX );\r
+ data << QString( "gtColorRY=%1" ) .arg( params.gtColorRY );\r
+ data << QString( "gtColorGY=%1" ) .arg( params.gtColorGY );\r
+ data << QString( "gtColorBY=%1" ) .arg( params.gtColorBY );\r
+ data << QString( "gtColorRZ=%1" ) .arg( params.gtColorRZ );\r
+ data << QString( "gtColorGZ=%1" ) .arg( params.gtColorGZ );\r
+ data << QString( "gtColorBZ=%1" ) .arg( params.gtColorBZ );\r
+ data << QString( "gtDrawTickmarksX=%1" ) .arg( params.gtDrawTickmarksX );\r
+ data << QString( "gtDrawTickmarksY=%1" ) .arg( params.gtDrawTickmarksY );\r
+ data << QString( "gtDrawTickmarksZ=%1" ) .arg( params.gtDrawTickmarksZ );\r
+ data << QString( "gtTickmarkLengthX=%1" ).arg( params.gtTickmarkLengthX );\r
+ data << QString( "gtTickmarkLengthY=%1" ).arg( params.gtTickmarkLengthY );\r
+ data << QString( "gtTickmarkLengthZ=%1" ).arg( params.gtTickmarkLengthZ );\r
+#endif\r
+ QString bg = Qtx::backgroundToString( background() ).replace( "=", "$" );\r
+ data << QString( "background=%1" ).arg( bg );\r
+\r
+ return data.join("*");\r
+}\r
+\r
+/*!\r
+ \brief Restore visual parameters of the view window.\r
+ \param parameters visual parameters of view window\r
+*/\r
+void OCCViewer_ViewWindow::setVisualParameters( const QString& parameters )\r
+{\r
+ viewAspect params;\r
+ ClipPlanesList aClipPlanes;\r
+ QStringList data = parameters.split( '*' );\r
+ Qtx::BackgroundData bgData;\r
+ if ( parameters.contains( '=' ) ) // new format - "scale=1.000e+00*centerX=0.000e+00..."\r
+ {\r
+ foreach( QString param, data ) {\r
+ QString paramName = param.section( '=', 0, 0 ).trimmed();\r
+ QString paramValue = param.section( '=', 1, 1 ).trimmed();\r
+ if ( paramName == "scale" ) params.scale = paramValue.toDouble();\r
+ else if ( paramName == "centerX" ) params.centerX = paramValue.toDouble();\r
+ else if ( paramName == "centerY" ) params.centerY = paramValue.toDouble();\r
+ else if ( paramName == "projX" ) params.projX = paramValue.toDouble();\r
+ else if ( paramName == "projY" ) params.projY = paramValue.toDouble();\r
+ else if ( paramName == "projZ" ) params.projZ = paramValue.toDouble();\r
+ else if ( paramName == "twist" ) params.twist = paramValue.toDouble();\r
+ else if ( paramName == "atX" ) params.atX = paramValue.toDouble();\r
+ else if ( paramName == "atY" ) params.atY = paramValue.toDouble();\r
+ else if ( paramName == "atZ" ) params.atZ = paramValue.toDouble();\r
+ else if ( paramName == "eyeX" ) params.eyeX = paramValue.toDouble();\r
+ else if ( paramName == "eyeY" ) params.eyeY = paramValue.toDouble();\r
+ else if ( paramName == "eyeZ" ) params.eyeZ = paramValue.toDouble();\r
+ else if ( paramName == "scaleX" ) params.scaleX = paramValue.toDouble();\r
+ else if ( paramName == "scaleY" ) params.scaleY = paramValue.toDouble();\r
+ else if ( paramName == "scaleZ" ) params.scaleZ = paramValue.toDouble();\r
+ else if ( paramName == "isVisible" ) params.isVisible = paramValue.toInt();\r
+ else if ( paramName == "size" ) params.size = paramValue.toDouble();\r
+ else if ( paramName.contains( "ClippingPlane" ) )\r
+ {\r
+ QStringList ClipPlaneData = paramValue.split( ';' );\r
+ OCCViewer_ClipPlane aPlane;\r
+ foreach( QString ClipPlaneParam, ClipPlaneData )\r
+ {\r
+ QString ClipPlane_paramName = ClipPlaneParam.section( '~', 0, 0 ).trimmed();\r
+ QString ClipPlane_paramValue = ClipPlaneParam.section( '~', 1, 1 ).trimmed();\r
+ if ( ClipPlane_paramName == "Mode" )\r
+ {\r
+ aPlane.Mode = ( OCCViewer_ClipPlane::PlaneMode ) ClipPlane_paramValue.toInt();\r
+ }\r
+ else if ( ClipPlane_paramName == "IsActive" ) aPlane.IsOn = ClipPlane_paramValue.toInt();\r
+ else if ( ClipPlane_paramName == "X" ) aPlane.X = ClipPlane_paramValue.toDouble();\r
+ else if ( ClipPlane_paramName == "Y" ) aPlane.Y = ClipPlane_paramValue.toDouble();\r
+ else if ( ClipPlane_paramName == "Z" ) aPlane.Z = ClipPlane_paramValue.toDouble();\r
+ else\r
+ {\r
+ switch ( aPlane.Mode )\r
+ {\r
+ case OCCViewer_ClipPlane::Absolute :\r
+ if ( ClipPlane_paramName == "Dx" ) aPlane.AbsoluteOrientation.Dx = ClipPlane_paramValue.toDouble();\r
+ else if ( ClipPlane_paramName == "Dy" ) aPlane.AbsoluteOrientation.Dy = ClipPlane_paramValue.toDouble();\r
+ else if ( ClipPlane_paramName == "Dz" ) aPlane.AbsoluteOrientation.Dz = ClipPlane_paramValue.toDouble();\r
+ else if ( ClipPlane_paramName == "IsInvert" ) aPlane.AbsoluteOrientation.IsInvert = ClipPlane_paramValue.toInt();\r
+ else if ( ClipPlane_paramName == "AbsoluteOrientation" ) aPlane.OrientationType = ClipPlane_paramValue.toInt();\r
+ break;\r
+\r
+ case OCCViewer_ClipPlane::Relative :\r
+ if ( ClipPlane_paramName == "RelativeOrientation" ) aPlane.OrientationType = ClipPlane_paramValue.toInt();\r
+ else if ( ClipPlane_paramName == "Rotation1" ) aPlane.RelativeOrientation.Rotation1 = ClipPlane_paramValue.toDouble();\r
+ else if ( ClipPlane_paramName == "Rotation2" ) aPlane.RelativeOrientation.Rotation2 = ClipPlane_paramValue.toDouble();\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ aClipPlanes.push_back(aPlane);\r
+ }\r
+ // graduated trihedron\r
+ else if ( paramName == "gtIsVisible" ) params.gtIsVisible = paramValue.toInt();\r
+ else if ( paramName == "gtDrawNameX" ) params.gtDrawNameX = paramValue.toInt();\r
+ else if ( paramName == "gtDrawNameY" ) params.gtDrawNameY = paramValue.toInt();\r
+ else if ( paramName == "gtDrawNameZ" ) params.gtDrawNameZ = paramValue.toInt();\r
+ else if ( paramName == "gtNameX" ) params.gtNameX = paramValue;\r
+ else if ( paramName == "gtNameY" ) params.gtNameY = paramValue;\r
+ else if ( paramName == "gtNameZ" ) params.gtNameZ = paramValue;\r
+ else if ( paramName == "gtNameColorRX" ) params.gtNameColorRX = paramValue.toInt();\r
+ else if ( paramName == "gtNameColorGX" ) params.gtNameColorGX = paramValue.toInt();\r
+ else if ( paramName == "gtNameColorBX" ) params.gtNameColorBX = paramValue.toInt();\r
+ else if ( paramName == "gtNameColorRY" ) params.gtNameColorRY = paramValue.toInt();\r
+ else if ( paramName == "gtNameColorGY" ) params.gtNameColorGY = paramValue.toInt();\r
+ else if ( paramName == "gtNameColorBY" ) params.gtNameColorBY = paramValue.toInt();\r
+ else if ( paramName == "gtNameColorRZ" ) params.gtNameColorRZ = paramValue.toInt();\r
+ else if ( paramName == "gtNameColorGZ" ) params.gtNameColorGZ = paramValue.toInt();\r
+ else if ( paramName == "gtNameColorBZ" ) params.gtNameColorBZ = paramValue.toInt();\r
+ else if ( paramName == "gtDrawValuesX" ) params.gtDrawValuesX = paramValue.toInt();\r
+ else if ( paramName == "gtDrawValuesY" ) params.gtDrawValuesY = paramValue.toInt();\r
+ else if ( paramName == "gtDrawValuesZ" ) params.gtDrawValuesZ = paramValue.toInt();\r
+ else if ( paramName == "gtNbValuesX" ) params.gtNbValuesX = paramValue.toInt();\r
+ else if ( paramName == "gtNbValuesY" ) params.gtNbValuesY = paramValue.toInt();\r
+ else if ( paramName == "gtNbValuesZ" ) params.gtNbValuesZ = paramValue.toInt();\r
+ else if ( paramName == "gtOffsetX" ) params.gtOffsetX = paramValue.toInt();\r
+ else if ( paramName == "gtOffsetY" ) params.gtOffsetY = paramValue.toInt();\r
+ else if ( paramName == "gtOffsetZ" ) params.gtOffsetZ = paramValue.toInt();\r
+ else if ( paramName == "gtColorRX" ) params.gtColorRX = paramValue.toInt();\r
+ else if ( paramName == "gtColorGX" ) params.gtColorGX = paramValue.toInt();\r
+ else if ( paramName == "gtColorBX" ) params.gtColorBX = paramValue.toInt();\r
+ else if ( paramName == "gtColorRY" ) params.gtColorRY = paramValue.toInt();\r
+ else if ( paramName == "gtColorGY" ) params.gtColorGY = paramValue.toInt();\r
+ else if ( paramName == "gtColorBY" ) params.gtColorBY = paramValue.toInt();\r
+ else if ( paramName == "gtColorRZ" ) params.gtColorRZ = paramValue.toInt();\r
+ else if ( paramName == "gtColorGZ" ) params.gtColorGZ = paramValue.toInt();\r
+ else if ( paramName == "gtColorBZ" ) params.gtColorBZ = paramValue.toInt();\r
+ else if ( paramName == "gtDrawTickmarksX" ) params.gtDrawTickmarksX = paramValue.toInt();\r
+ else if ( paramName == "gtDrawTickmarksY" ) params.gtDrawTickmarksY = paramValue.toInt();\r
+ else if ( paramName == "gtDrawTickmarksZ" ) params.gtDrawTickmarksZ = paramValue.toInt();\r
+ else if ( paramName == "gtTickmarkLengthX" ) params.gtTickmarkLengthX = paramValue.toInt();\r
+ else if ( paramName == "gtTickmarkLengthY" ) params.gtTickmarkLengthY = paramValue.toInt();\r
+ else if ( paramName == "gtTickmarkLengthZ" ) params.gtTickmarkLengthZ = paramValue.toInt();\r
+ else if ( paramName == "background" ) {\r
+ QString bg = paramValue.replace( "$", "=" );\r
+ bgData = Qtx::stringToBackground( bg );\r
+ }\r
+ }\r
+ }\r
+ else // old format - "1.000e+00*0.000e+00..."\r
+ {\r
+ int idx = 0;\r
+ params.scale = data.count() > idx ? data[idx++].toDouble() : 1.0;\r
+ params.centerX = data.count() > idx ? data[idx++].toDouble() : 0.0;\r
+ params.centerY = data.count() > idx ? data[idx++].toDouble() : 0.0;\r
+ params.projX = data.count() > idx ? data[idx++].toDouble() : sqrt(1./3);\r
+ params.projY = data.count() > idx ? data[idx++].toDouble() : -sqrt(1./3);\r
+ params.projZ = data.count() > idx ? data[idx++].toDouble() : sqrt(1./3);\r
+ params.twist = data.count() > idx ? data[idx++].toDouble() : 0.0;\r
+ params.atX = data.count() > idx ? data[idx++].toDouble() : 0.0;\r
+ params.atY = data.count() > idx ? data[idx++].toDouble() : 0.0;\r
+ params.atZ = data.count() > idx ? data[idx++].toDouble() : 0.0;\r
+ params.eyeX = data.count() > idx ? data[idx++].toDouble() : sqrt(250000./3);\r
+ params.eyeY = data.count() > idx ? data[idx++].toDouble() : -sqrt(250000./3);\r
+ params.eyeZ = data.count() > idx ? data[idx++].toDouble() : sqrt(250000./3);\r
+ params.scaleX = data.count() > idx ? data[idx++].toDouble() : 1.0;\r
+ params.scaleY = data.count() > idx ? data[idx++].toDouble() : 1.0;\r
+ params.scaleZ = data.count() > idx ? data[idx++].toDouble() : 1.0;\r
+ params.isVisible = data.count() > idx ? data[idx++].toInt() : 1;\r
+ params.size = data.count() > idx ? data[idx++].toDouble() : 100.0;\r
+ }\r
+ performRestoring( params ); \r
+ setBackground( bgData );\r
+ myModel->setClipPlanes(aClipPlanes);\r
+}\r
+\r
+/*!\r
+ \brief Handle show event.\r
+\r
+ Emits Show() signal.\r
+\r
+ \param theEvent show event\r
+*/\r
+void OCCViewer_ViewWindow::showEvent( QShowEvent* theEvent )\r
+{\r
+ emit Show( theEvent );\r
+}\r
+\r
+/*!\r
+ \brief Handle hide event.\r
+\r
+ Emits Hide() signal.\r
+\r
+ \param theEvent hide event\r
+*/\r
+void OCCViewer_ViewWindow::hideEvent( QHideEvent* theEvent )\r
+{\r
+ emit Hide( theEvent );\r
+}\r
+\r
+\r
+/*!\r
+ Creates default sketcher. [ virtual protected ]\r
+*/\r
+OCCViewer_ViewSketcher* OCCViewer_ViewWindow::createSketcher( int type )\r
+{\r
+ if ( type == Rect )\r
+ return new OCCViewer_RectSketcher( this, type );\r
+ if ( type == Polygon )\r
+ return new OCCViewer_PolygonSketcher( this, type );\r
+ return 0;\r
+}\r
+\r
+void OCCViewer_ViewWindow::initSketchers()\r
+{\r
+ if ( mySketchers.isEmpty() )\r
+ {\r
+ mySketchers.append( createSketcher( Rect ) );\r
+ mySketchers.append( createSketcher( Polygon ) );\r
+ }\r
+}\r
+\r
+OCCViewer_ViewSketcher* OCCViewer_ViewWindow::getSketcher( const int typ )\r
+{\r
+ OCCViewer_ViewSketcher* sketcher = 0;\r
+ QList<OCCViewer_ViewSketcher*>::Iterator it;\r
+ for ( it = mySketchers.begin(); it != mySketchers.end() && !sketcher; ++it )\r
+ {\r
+ OCCViewer_ViewSketcher* sk = (*it);\r
+ if ( sk->type() == typ )\r
+ sketcher = sk;\r
+ }\r
+ return sketcher;\r
+}\r
+\r
+/*!\r
+ Handles requests for sketching in the active view. [ virtual public ]\r
+*/\r
+void OCCViewer_ViewWindow::activateSketching( int type )\r
+{\r
+ OCCViewer_ViewPort3d* vp = getViewPort();\r
+ if ( !vp )\r
+ return;\r
+\r
+ if ( !vp->isSketchingEnabled() )\r
+ return;\r
+\r
+ /* Finish current sketching */\r
+ if ( type == NoSketching )\r
+ {\r
+ if ( mypSketcher )\r
+ {\r
+ onSketchingFinished();\r
+ mypSketcher->deactivate();\r
+ mypSketcher = 0;\r
+ }\r
+ }\r
+ /* Activate new sketching */\r
+ else\r
+ {\r
+ activateSketching( NoSketching ); /* concurrency not suported */\r
+ mypSketcher = getSketcher( type );\r
+ if ( mypSketcher )\r
+ {\r
+ mypSketcher->activate();\r
+ onSketchingStarted();\r
+ }\r
+ }\r
+}\r
+\r
+/*!\r
+ Unhilights detected entities. [ virtual protected ]\r
+*/\r
+void OCCViewer_ViewWindow::onSketchingStarted()\r
+{\r
+}\r
+\r
+/*!\r
+ Selection by rectangle or polygon. [ virtual protected ]\r
+*/\r
+void OCCViewer_ViewWindow::onSketchingFinished()\r
+{\r
+ MESSAGE("OCCViewer_ViewWindow::onSketchingFinished()")\r
+ if ( mypSketcher && mypSketcher->result() == OCCViewer_ViewSketcher::Accept )\r
+ {\r
+ Handle(AIS_InteractiveContext) ic = myModel->getAISContext();\r
+ bool append = bool( mypSketcher->buttonState() && mypSketcher->isHasShift() );\r
+ switch( mypSketcher->type() )\r
+ {\r
+ case Rect:\r
+ {\r
+ QRect* aRect = (QRect*)mypSketcher->data();\r
+ if( aRect )\r
+ {\r
+ int aLeft = aRect->left();\r
+ int aRight = aRect->right();\r
+ int aTop = aRect->top();\r
+ int aBottom = aRect->bottom();\r
+// myRect = aRect;\r
+\r
+ if( append )\r
+ ic->ShiftSelect( aLeft, aBottom, aRight, aTop, getViewPort()->getView(), Standard_False );\r
+ else\r
+ ic->Select( aLeft, aBottom, aRight, aTop, getViewPort()->getView(), Standard_False );\r
+ }\r
+ }\r
+ break;\r
+ case Polygon:\r
+ {\r
+ QPolygon* aPolygon = (QPolygon*)mypSketcher->data();\r
+ if( aPolygon )\r
+ {\r
+ int size = aPolygon->size();\r
+ TColgp_Array1OfPnt2d anArray( 1, size );\r
+\r
+ QPolygon::Iterator it = aPolygon->begin();\r
+ QPolygon::Iterator itEnd = aPolygon->end();\r
+ for( int index = 1; it != itEnd; ++it, index++ )\r
+ {\r
+ QPoint aPoint = *it;\r
+ anArray.SetValue( index, gp_Pnt2d( aPoint.x(), aPoint.y() ) );\r
+ }\r
+\r
+ if( append )\r
+ ic->ShiftSelect( anArray, getViewPort()->getView(), Standard_False );\r
+ else\r
+ ic->Select( anArray, getViewPort()->getView(), Standard_False );\r
+ }\r
+ }\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+\r
+ OCCViewer_ViewManager* aViewMgr = ( OCCViewer_ViewManager* )getViewManager();\r
+ aViewMgr->getOCCViewer()->performSelectionChanged();\r
+ }\r
+}\r
+\r
+OCCViewer_ViewPort3d* OCCViewer_ViewWindow::getViewPort()\r
+{\r
+ return myViewPort;\r
+}\r
+\r
+bool OCCViewer_ViewWindow::transformRequested() const\r
+{\r
+ return ( myOperation != NOTHING );\r
+}\r
+\r
+bool OCCViewer_ViewWindow::transformInProcess() const\r
+{\r
+ return myEventStarted;\r
+}\r
+\r
+void OCCViewer_ViewWindow::setTransformInProcess( bool bOn )\r
+{\r
+ myEventStarted = bOn;\r
+}\r
+\r
+/*!\r
+ Set enabled state of transformation (rotate, zoom, etc)\r
+*/\r
+void OCCViewer_ViewWindow::setTransformEnabled( const OperationType id, const bool on )\r
+{\r
+ if ( id != NOTHING ) myStatus.insert( id, on );\r
+}\r
+\r
+/*!\r
+ \return enabled state of transformation (rotate, zoom, etc)\r
+*/\r
+bool OCCViewer_ViewWindow::transformEnabled( const OperationType id ) const\r
+{\r
+ return myStatus.contains( id ) ? myStatus[ id ] : true;\r
+}\r
+\r
+void OCCViewer_ViewWindow::onMaximizedView()\r
+{\r
+ setMaximized(!isMaximized());\r
+}\r
+\r
+void OCCViewer_ViewWindow::returnTo3dView()\r
+{\r
+ setReturnedTo3dView( true );\r
+}\r
+\r
+void OCCViewer_ViewWindow::setReturnedTo3dView(bool isVisible3dView)\r
+{\r
+ if ( !toolMgr()->action( ReturnTo3dViewId ) ||\r
+ toolMgr()->isShown(ReturnTo3dViewId) != isVisible3dView ) return;\r
+ if ( !isVisible3dView )\r
+ toolMgr()->show( ReturnTo3dViewId );\r
+ else\r
+ toolMgr()->hide( ReturnTo3dViewId );\r
+ if ( isVisible3dView ) emit returnedTo3d( );\r
+}\r
+\r
+\r
+void OCCViewer_ViewWindow::setMaximized(bool toMaximize, bool toSendSignal)\r
+{\r
+ QAction* anAction = toolMgr()->action( MaximizedId );\r
+ QAction* anAction2 = toolMgr()->action( ReturnTo3dViewId );\r
+ SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();\r
+ if ( toMaximize ) {\r
+ anAction->setText( tr( "MNU_MINIMIZE_VIEW" ) ); \r
+ anAction->setToolTip( tr( "MNU_MINIMIZE_VIEW" ) ); \r
+ anAction->setIcon( aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_MINIMIZE" ) ) );\r
+ anAction->setStatusTip( tr( "DSC_MINIMIZE_VIEW" ) );\r
+ if ( anAction2 && my2dMode != No2dMode ) toolMgr()->show( ReturnTo3dViewId );\r
+ if (toSendSignal) {\r
+ emit maximized( this, true );\r
+ }\r
+ }\r
+ else {\r
+ anAction->setText( tr( "MNU_MAXIMIZE_VIEW" ) ); \r
+ anAction->setToolTip( tr( "MNU_MAXIMIZE_VIEW" ) ); \r
+ anAction->setIcon( aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_MAXIMIZE" ) ) );\r
+ anAction->setStatusTip( tr( "DSC_MAXIMIZE_VIEW" ) );\r
+ if ( anAction2 && my2dMode != No2dMode ) toolMgr()->hide( ReturnTo3dViewId );\r
+ if (toSendSignal) {\r
+ emit maximized( this, false );\r
+ }\r
+ }\r
+}\r
+\r
+bool OCCViewer_ViewWindow::isMaximized() const\r
+{\r
+ return !(toolMgr()->action( MaximizedId )->text() == tr( "MNU_MAXIMIZE_VIEW" ));\r
+}\r
+\r
+void OCCViewer_ViewWindow::setSketcherStyle( bool enable )\r
+{ \r
+ IsSketcherStyle = enable; \r
+}\r
+\r
+bool OCCViewer_ViewWindow::isSketcherStyle() const \r
+{ \r
+ return IsSketcherStyle; \r
+}\r
+\r
+\r
+void OCCViewer_ViewWindow::set2dMode(Mode2dType theType)\r
+{\r
+ my2dMode = theType;\r
+}\r
+\r
+// obsolete \r
+QColor OCCViewer_ViewWindow::backgroundColor() const\r
+{\r
+ return myViewPort ? myViewPort->backgroundColor() : Qt::black;\r
+}\r
+ \r
+// obsolete\r
+void OCCViewer_ViewWindow::setBackgroundColor( const QColor& theColor )\r
+{\r
+ if ( myViewPort ) myViewPort->setBackgroundColor( theColor );\r
+}\r
+\r
+Qtx::BackgroundData OCCViewer_ViewWindow::background() const\r
+{\r
+ return myViewPort ? myViewPort->background() : Qtx::BackgroundData();\r
+}\r
+ \r
+void OCCViewer_ViewWindow::setBackground( const Qtx::BackgroundData& theBackground )\r
+{\r
+ if ( myViewPort ) myViewPort->setBackground( theBackground );\r
+}\r
+\r
+/*!\r
+ Clears view aspects\r
+*/\r
+void OCCViewer_ViewWindow::clearViewAspects()\r
+{\r
+ myViewAspects.clear();\r
+}\r
+\r
+/*!\r
+ \return const reference to list of view aspects\r
+*/\r
+const viewAspectList& OCCViewer_ViewWindow::getViewAspects()\r
+{\r
+ return myViewAspects;\r
+}\r
+\r
+/*!\r
+ Appends new view aspect\r
+ \param aParams - new view aspects\r
+*/\r
+void OCCViewer_ViewWindow::appendViewAspect( const viewAspect& aParams )\r
+{\r
+ myViewAspects.append( aParams );\r
+}\r
+\r
+/*!\r
+ Replaces old view aspects by new ones\r
+ \param aViewList - list of new view aspects\r
+*/\r
+void OCCViewer_ViewWindow::updateViewAspects( const viewAspectList& aViewList )\r
+{\r
+ myViewAspects = aViewList;\r
+}\r
+\r
+/*!\r
+ Get camera properties for the OCC view window.\r
+ \return shared pointer on camera properties.\r
+*/\r
+SUIT_CameraProperties OCCViewer_ViewWindow::cameraProperties()\r
+{\r
+ SUIT_CameraProperties aProps;\r
+\r
+ Handle(V3d_View) aSourceView = getViewPort()->getView();\r
+ if ( aSourceView.IsNull() )\r
+ return aProps;\r
+\r
+ if ( get2dMode() == No2dMode ) {\r
+ aProps.setDimension( SUIT_CameraProperties::Dim3D );\r
+ }\r
+ else {\r
+ aProps.setDimension( SUIT_CameraProperties::Dim2D );\r
+ aProps.setViewSide( (SUIT_CameraProperties::ViewSide)(int)get2dMode() );\r
+ }\r
+ \r
+ // read common properites of the view\r
+ Standard_Real anUpDir[3];\r
+ Standard_Real aPrjDir[3];\r
+ Standard_Real aMapScale[2];\r
+ Standard_Real aTranslation[3];\r
+ Standard_Real anAxialScale[3];\r
+ \r
+ aSourceView->Up(anUpDir[0], anUpDir[1], anUpDir[2]);\r
+ aSourceView->Proj(aPrjDir[0], aPrjDir[1], aPrjDir[2]);\r
+ aSourceView->At(aTranslation[0], aTranslation[1], aTranslation[2]);\r
+ aSourceView->Size(aMapScale[0], aMapScale[1]);\r
+\r
+ getViewPort()->getAxialScale(anAxialScale[0], anAxialScale[1], anAxialScale[2]);\r
+\r
+ // we use similar depth to the one used in perspective projection \r
+ // to proivde a convinience synchronization with other camera views that\r
+ // can switch between orthogonal & perspective projection. otherwise,\r
+ // the camera will get to close when switching from orthogonal to perspective.\r
+ Standard_Real aCameraDepth = aSourceView->Depth() + aSourceView->ZSize() * 0.5;\r
+\r
+ // store common props\r
+ aProps.setViewUp(anUpDir[0], anUpDir[1], anUpDir[2]);\r
+ aProps.setMappingScale(aMapScale[1] / 2.0);\r
+ aProps.setAxialScale(anAxialScale[0], anAxialScale[1], anAxialScale[2]);\r
+ \r
+ // generate view orientation matrix for transforming OCC projection reference point\r
+ // into a camera (eye) position.\r
+ gp_Dir aLeftDir = gp_Dir(anUpDir[0], anUpDir[1], anUpDir[2]).Crossed(\r
+ gp_Dir(aPrjDir[0], aPrjDir[1], aPrjDir[2]));\r
+\r
+ gp_Trsf aTrsf;\r
+ aTrsf.SetValues( aLeftDir.X(), anUpDir[0], aPrjDir[0], aTranslation[0],\r
+ aLeftDir.Y(), anUpDir[1], aPrjDir[1], aTranslation[1],\r
+ aLeftDir.Z(), anUpDir[2], aPrjDir[2], aTranslation[2],\r
+ Precision::Confusion(),\r
+ Precision::Confusion() );\r
+\r
+// get projection reference point in view coordinates\r
+#if OCC_VERSION_LARGE > 0x06070000\r
+ gp_Pnt aProjRef = aSourceView->Camera()->ProjectionShift();\r
+ aProjRef.SetX( -aProjRef.X() );\r
+ aProjRef.SetY( -aProjRef.Y() );\r
+#else\r
+ Graphic3d_Vertex aProjRef = aSourceView->ViewMapping().ProjectionReferencePoint();\r
+#endif\r
+\r
+ // transform to world-space coordinate system\r
+ gp_Pnt aPosition = gp_Pnt(aProjRef.X(), aProjRef.Y(), aCameraDepth).Transformed(aTrsf);\r
+ \r
+ // compute focal point\r
+ double aFocalPoint[3];\r
+\r
+ aFocalPoint[0] = aPosition.X() - aPrjDir[0] * aCameraDepth;\r
+ aFocalPoint[1] = aPosition.Y() - aPrjDir[1] * aCameraDepth;\r
+ aFocalPoint[2] = aPosition.Z() - aPrjDir[2] * aCameraDepth;\r
+\r
+ aProps.setFocalPoint(aFocalPoint[0], aFocalPoint[1], aFocalPoint[2]);\r
+ aProps.setPosition(aPosition.X(), aPosition.Y(), aPosition.Z());\r
+\r
+ return aProps;\r
+}\r
+\r
+/*!\r
+ Synchronize views.\r
+ This implementation synchronizes OCC view's camera propreties.\r
+*/\r
+void OCCViewer_ViewWindow::synchronize( SUIT_ViewWindow* theView )\r
+{\r
+ bool blocked = blockSignals( true );\r
+\r
+ SUIT_CameraProperties aProps = theView->cameraProperties();\r
+ if ( !cameraProperties().isCompatible( aProps ) ) {\r
+ // other view, this one is being currently synchronized to, seems has become incompatible\r
+ // we have to break synchronization\r
+ updateSyncViews();\r
+ return;\r
+ }\r
+\r
+ Handle(V3d_View) aDestView = getViewPort()->getView();\r
+\r
+ aDestView->SetImmediateUpdate( Standard_False );\r
+\r
+ double anUpDir[3];\r
+ double aPosition[3];\r
+ double aFocalPoint[3];\r
+ double aMapScaling;\r
+ double anAxialScale[3];\r
+\r
+ // get common properties\r
+ aProps.getFocalPoint(aFocalPoint[0], aFocalPoint[1], aFocalPoint[2]);\r
+ aProps.getPosition(aPosition[0], aPosition[1], aPosition[2]);\r
+ aProps.getViewUp(anUpDir[0], anUpDir[1], anUpDir[2]);\r
+ aProps.getAxialScale(anAxialScale[0], anAxialScale[1], anAxialScale[2]);\r
+ aMapScaling = aProps.getMappingScale() * 2.0;\r
+\r
+ gp_Dir aProjDir(aPosition[0] - aFocalPoint[0],\r
+ aPosition[1] - aFocalPoint[1],\r
+ aPosition[2] - aFocalPoint[2]);\r
+ \r
+ // get custom view translation\r
+ Standard_Real aTranslation[3];\r
+ aDestView->At(aTranslation[0], aTranslation[1], aTranslation[2]);\r
+\r
+ gp_Dir aLeftDir = gp_Dir(anUpDir[0], anUpDir[1], anUpDir[2]).Crossed(\r
+ gp_Dir(aProjDir.X(), aProjDir.Y(), aProjDir.Z()));\r
+\r
+ // convert camera position into a view reference point\r
+ gp_Trsf aTrsf;\r
+ aTrsf.SetValues( aLeftDir.X(), anUpDir[0], aProjDir.X(), aTranslation[0],\r
+ aLeftDir.Y(), anUpDir[1], aProjDir.Y(), aTranslation[1],\r
+ aLeftDir.Z(), anUpDir[2], aProjDir.Z(), aTranslation[2], \r
+ Precision::Confusion(),\r
+ Precision::Confusion() );\r
+ aTrsf.Invert();\r
+\r
+ // transform to view-space coordinate system\r
+ gp_Pnt aProjRef(aPosition[0], aPosition[1], aPosition[2]);\r
+ aProjRef.Transform(aTrsf);\r
+\r
+#if OCC_VERSION_LARGE > 0x06070000\r
+ aDestView->Camera()->SetDirection( -aProjDir );\r
+ aDestView->Camera()->SetUp( gp_Dir( anUpDir[0], anUpDir[1], anUpDir[2] ) );\r
+ aDestView->Camera()->SetProjectionShift( gp_Pnt( -aProjRef.X(), -aProjRef.Y(), 0.0 ) );\r
+#else\r
+ // set view camera properties using low-level approach. this is done\r
+ // in order to avoid interference with static variables in v3d view used\r
+ // when rotation is in process in another view.\r
+ Visual3d_ViewMapping aMapping = aDestView->View()->ViewMapping();\r
+ Visual3d_ViewOrientation anOrientation = aDestView->View()->ViewOrientation();\r
+\r
+ Graphic3d_Vector aMappingProj(aProjDir.X(), aProjDir.Y(), aProjDir.Z());\r
+ Graphic3d_Vector aMappingUp(anUpDir[0], anUpDir[1], anUpDir[2]);\r
+\r
+ aMappingProj.Normalize();\r
+ aMappingUp.Normalize();\r
+\r
+ anOrientation.SetViewReferencePlane(aMappingProj);\r
+ anOrientation.SetViewReferenceUp(aMappingUp);\r
+\r
+ aDestView->SetViewMapping(aMapping);\r
+ aDestView->SetViewOrientation(anOrientation);\r
+\r
+ // set panning\r
+ aDestView->SetCenter(aProjRef.X(), aProjRef.Y());\r
+#endif\r
+\r
+ // set mapping scale\r
+ Standard_Real aWidth, aHeight;\r
+ aDestView->Size(aWidth, aHeight);\r
+ \r
+ if ( aWidth > aHeight )\r
+ aDestView->SetSize (aMapScaling * (aWidth / aHeight));\r
+ else\r
+ aDestView->SetSize (aMapScaling);\r
+\r
+ getViewPort()->setAxialScale(anAxialScale[0], anAxialScale[1], anAxialScale[2]);\r
+\r
+ aDestView->ZFitAll();\r
+ aDestView->SetImmediateUpdate( Standard_True );\r
+ aDestView->Redraw();\r
+\r
+ blockSignals( blocked );\r
+}\r
+\r
+/*!\r
+ \brief Indicates whether preselection is enabled\r
+ \return true if preselection is enabled\r
+*/\r
+bool OCCViewer_ViewWindow::isPreselectionEnabled() const\r
+{\r
+ return myPreselectionEnabled;\r
+}\r
+\r
+/*!\r
+ \brief Enables/disables preselection\r
+ \param theIsToEnable if true - preselection will be enabled\r
+*/\r
+void OCCViewer_ViewWindow::enablePreselection( bool theIsToEnable )\r
+{\r
+ onSwitchPreselection( theIsToEnable );\r
+}\r
+\r
+/*!\r
+ \brief Indicates whether selection is enabled\r
+ \return true if selection is enabled\r
+*/\r
+bool OCCViewer_ViewWindow::isSelectionEnabled() const\r
+{\r
+ return mySelectionEnabled;\r
+}\r
+\r
+/*!\r
+ \brief Enables/disables selection\r
+ \param theIsToEnable if true - selection will be enabled\r
+*/\r
+void OCCViewer_ViewWindow::enableSelection( bool theIsToEnable )\r
+{\r
+ onSwitchSelection( theIsToEnable );\r
+}\r
+\r
+\r
+/*!\r
+ \brief called if clipping operation is activated / deactivated.\r
+\r
+ Enables/disables clipping plane displaying.\r
+\r
+ \parma on action state\r
+*/\r
+void OCCViewer_ViewWindow::onClipping (bool theIsOn)\r
+{\r
+ if(!myModel) return;\r
+ OCCViewer_ClippingDlg* aClippingDlg = myModel->getClippingDlg();\r
+ \r
+ if (theIsOn) {\r
+ if (!aClippingDlg) {\r
+ aClippingDlg = new OCCViewer_ClippingDlg (this, myModel);\r
+ myModel->setClippingDlg(aClippingDlg);\r
+ }\r
+ if (!aClippingDlg->isVisible())\r
+ aClippingDlg->show();\r
+ } else {\r
+ if ( aClippingDlg ) {\r
+ aClippingDlg->close();\r
+ myModel->setClippingDlg(0);\r
+ }\r
+ }\r
+\r
+ SUIT_ViewManager* mgr = getViewManager();\r
+ if( mgr ) {\r
+ QVector<SUIT_ViewWindow*> aViews = mgr->getViews();\r
+ for(int i = 0, iEnd = aViews.size(); i < iEnd; i++) {\r
+ if(SUIT_ViewWindow* aViewWindow = aViews.at(i)) {\r
+ QtxActionToolMgr* mgr = aViewWindow->toolMgr();\r
+ if(!mgr) continue;\r
+ QAction* a = toolMgr()->action( ClippingId );\r
+ if(!a) continue;\r
+ if(theIsOn != a->isChecked()){\r
+ disconnect (a, SIGNAL (toggled (bool)), aViewWindow, SLOT (onClipping (bool)));\r
+ a->setChecked(theIsOn);\r
+ connect (a, SIGNAL (toggled (bool)), aViewWindow, SLOT (onClipping (bool)));\r
+ }\r
+ }\r
+ }\r
+ }\r
+}\r