X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FVTKViewer%2FVTKViewer_Trihedron.cxx;h=46c94f96da463d617c3a4ee1badac10d68652c6e;hb=9a546cba3468822f879c0c829309d7b344fb22b9;hp=c426e0280d7cb5e319e9a4042a8cdbfcfe409c0c;hpb=399155730966dfc225fbb24f66204b05664385f2;p=modules%2Fgui.git diff --git a/src/VTKViewer/VTKViewer_Trihedron.cxx b/src/VTKViewer/VTKViewer_Trihedron.cxx index c426e0280..46c94f96d 100755 --- a/src/VTKViewer/VTKViewer_Trihedron.cxx +++ b/src/VTKViewer/VTKViewer_Trihedron.cxx @@ -1,25 +1,31 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// +// Copyright (C) 2007-2016 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. -// -// 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 +// 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 +// 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 "VTKViewer_Trihedron.h" #include "VTKViewer_Actor.h" +#include "VTKViewer_Algorithm.h" // VTK Includes +#include #include #include #include @@ -32,22 +38,28 @@ #include #include #include +#include +#include +#include +#include +#include -#include "VTKViewer_VectorText.h" +// QT includes +#include vtkStandardNewMacro(VTKViewer_UnScaledActor); /*!Constructor*/ VTKViewer_UnScaledActor::VTKViewer_UnScaledActor() { - Bounds[0] = Bounds[2] = Bounds[4] = VTK_LARGE_FLOAT; - Bounds[1] = Bounds[3] = Bounds[5] = -VTK_LARGE_FLOAT; + Bounds[0] = Bounds[2] = Bounds[4] = VTK_FLOAT_MAX; + Bounds[1] = Bounds[3] = Bounds[5] = -VTK_FLOAT_MAX; } /*! \return bounding box */ -vtkFloatingPointType* +double* VTKViewer_UnScaledActor ::GetBounds() { @@ -68,21 +80,25 @@ void VTKViewer_UnScaledActor::SetSize(int theSize) void VTKViewer_UnScaledActor::Render(vtkRenderer *theRenderer) { if(theRenderer){ - vtkFloatingPointType P[2][3] = {{-1.0, -1.0, 0.0},{+1.0, +1.0, 0.0}}; + double P[2][3] = {{-1.0, -1.0, 0.0},{+1.0, +1.0, 0.0}}; theRenderer->ViewToWorld(P[0][0],P[0][1],P[0][2]); theRenderer->ViewToWorld(P[1][0],P[1][1],P[1][2]); - vtkFloatingPointType aWorldDiag = sqrt((P[1][0]-P[0][0])*(P[1][0]-P[0][0])+ - (P[1][1]-P[0][1])*(P[1][1]-P[0][1])+ - (P[1][2]-P[0][2])*(P[1][2]-P[0][2])); + double aWorldDiag = sqrt((P[1][0]-P[0][0])*(P[1][0]-P[0][0])+ + (P[1][1]-P[0][1])*(P[1][1]-P[0][1])+ + (P[1][2]-P[0][2])*(P[1][2]-P[0][2])); int* aSize = theRenderer->GetRenderWindow()->GetSize(); - vtkFloatingPointType aWinDiag = sqrt(vtkFloatingPointType(aSize[0]*aSize[0]+aSize[1]*aSize[1])); + double aWinDiag = sqrt(double(aSize[0]*aSize[0]+aSize[1]*aSize[1])); vtkDataSet* aDataSet = GetMapper()->GetInput(); - aDataSet->Update(); - vtkFloatingPointType aLength = aDataSet->GetLength(); - vtkFloatingPointType aPrecision = 1.0E-3; - vtkFloatingPointType anOldScale = GetScale()[0]; - vtkFloatingPointType aScale = mySize*aWorldDiag/aWinDiag/aLength*sqrt(vtkFloatingPointType(aSize[0])/vtkFloatingPointType(aSize[1])); - if(fabs(aScale - anOldScale)/aScale > aPrecision){ + GetMapper()->Update(); + double aLength = aDataSet->GetLength(); + double aPrecision = 1.0E-3; + double aZeroTol = 1.0E-12; + double anOldScale = GetScale()[0]; + double aScale = anOldScale; + double aMaxSize = (double)qMax(aSize[1],aSize[0]); + if (qAbs(aWinDiag) > aZeroTol && qAbs(aLength) > aZeroTol && qAbs(aMaxSize) > aZeroTol) + aScale = mySize*aWorldDiag/aWinDiag/aLength*sqrt(double(qMin(aSize[1],aSize[0]))/aMaxSize); + if(qAbs(aScale) > aZeroTol && qAbs(aScale - anOldScale)/aScale > aPrecision){ SetScale(aScale); } } @@ -91,16 +107,22 @@ void VTKViewer_UnScaledActor::Render(vtkRenderer *theRenderer) vtkStandardNewMacro(VTKViewer_LineActor); +#ifdef IPAL21440 +vtkCxxSetObjectMacro(VTKViewer_LineActor,LabelActor,vtkTextActor); +#else vtkCxxSetObjectMacro(VTKViewer_LineActor,LabelActor,VTKViewer_UnScaledActor); -vtkCxxSetObjectMacro(VTKViewer_LineActor,ArrowActor,VTKViewer_UnScaledActor); +#endif +vtkCxxSetObjectMacro(VTKViewer_LineActor,ArrowActor,vtkFollower); /*!Adds Label and Arrow actors to \a theRenderer.*/ void VTKViewer_LineActor::Render(vtkRenderer *theRenderer) { +#ifndef IPAL21440 if(LabelActor && LabelActor->GetVisibility()){ LabelActor->Modified(); LabelActor->Render(theRenderer); } +#endif if(ArrowActor && ArrowActor->GetVisibility()){ ArrowActor->Modified(); ArrowActor->Render(theRenderer); @@ -118,7 +140,7 @@ VTKViewer_Axis::VTKViewer_Axis() myLineSource->SetPoint1(0.0,0.0,0.0); myMapper[0] = vtkPolyDataMapper::New(); - myMapper[0]->SetInput(myLineSource->GetOutput()); + myMapper[0]->SetInputConnection(myLineSource->GetOutputPort()); myLineActor = VTKViewer_LineActor::New(); myLineActor->SetMapper(myMapper[0]); @@ -126,25 +148,38 @@ VTKViewer_Axis::VTKViewer_Axis() /*! \li Initialize the Arrow pipe-line representation*/ myConeSource = vtkConeSource::New(); - myConeSource->SetResolution(2); + myConeSource->SetResolution(16); myConeSource->SetAngle(10); + myConeSource->SetCenter(-0.5,0.0,0.0); myMapper[1] = vtkPolyDataMapper::New(); - myMapper[1]->SetInput(myConeSource->GetOutput()); + myMapper[1]->SetInputConnection(myConeSource->GetOutputPort()); - myArrowActor = VTKViewer_UnScaledActor::New(); + myArrowActor = vtkFollower::New(); myArrowActor->SetMapper(myMapper[1]); - static int aArrowActorSize = 24; - myArrowActor->SetSize(aArrowActorSize); + static int aArrowActorSize = 16; + myArrowActor->SetScale(aArrowActorSize); myArrowActor->PickableOff(); myLineActor->SetArrowActor(myArrowActor); /*! \li Initialize the Label pipe-line representation */ - myVectorText = VTKViewer_VectorText::New(); +#ifdef IPAL21440 + myTextMapper = vtkTextMapper::New(); + + myLabelActor = vtkTextActor::New(); + myLabelActor->SetMapper(myTextMapper); + myLabelActor->SetTextScaleModeToNone(); + myLabelActor->PickableOff(); + + vtkCoordinate* aCoord = vtkCoordinate::New(); + myLabelActor->GetPositionCoordinate()->SetReferenceCoordinate( aCoord ); + aCoord->Delete(); +#else + myVectorText = vtkVectorText::New(); myMapper[2] = vtkPolyDataMapper::New(); - myMapper[2]->SetInput(myVectorText->GetOutput()); + myMapper[2]->SetInputConnection(myVectorText->GetOutputPort()); myLabelActor = VTKViewer_UnScaledActor::New(); myLabelActor->SetMapper(myMapper[2]); @@ -152,6 +187,7 @@ VTKViewer_Axis::VTKViewer_Axis() myLabelActor->SetSize(aLabelActorSize); myLabelActor->PickableOff(); //myLabelActor->DebugOn(); +#endif myLineActor->SetLabelActor(myLabelActor); @@ -170,8 +206,6 @@ VTKViewer_Axis::~VTKViewer_Axis() myMapper[0]->RemoveAllInputs(); myMapper[0]->Delete(); - myVectorText->Delete(); - /*! \li Destroy of the Arrow pipe-line representation */ myArrowActor->Delete(); @@ -183,8 +217,15 @@ VTKViewer_Axis::~VTKViewer_Axis() /*! \li Destroy of the Line pipe-line representation */ myLineActor->Delete(); +#ifdef IPAL21440 + myTextMapper->RemoveAllInputs(); + myTextMapper->Delete(); +#else + myVectorText->Delete(); + myMapper[2]->RemoveAllInputs(); myMapper[2]->Delete(); +#endif myLineSource->Delete(); } @@ -233,30 +274,75 @@ void VTKViewer_Axis::SetVisibility(VTKViewer_Trihedron::TVisibility theVis) /*! Set camera for myLabelActor */ void VTKViewer_Axis::SetCamera(vtkCamera* theCamera){ +#ifndef IPAL21440 myLabelActor->SetCamera(theCamera); +#endif } -/*! Sets \a theProperty for actors: myLineActor,myLabelActor,myArrowActor +/*! Sets color for actors: myLineActor,myLabelActor,myArrowActor */ -void VTKViewer_Axis::SetProperty(vtkProperty* theProperty){ - myLabelActor->SetProperty(theProperty); - myArrowActor->SetProperty(theProperty); - myLineActor->SetProperty(theProperty); +void VTKViewer_Axis::SetColor(double theRed, double theGreen, double theBlue) +{ + // Set color property for arrow and line actors + vtkProperty* aProperty = vtkProperty::New(); + aProperty->SetColor(theRed, theGreen, theBlue); + + myArrowActor->SetProperty(aProperty); + myLineActor->SetProperty(aProperty); +#ifndef IPAL21440 + myLabelActor->SetProperty(aProperty); +#endif + + aProperty->Delete(); + + // Set color property for label actor +#ifdef IPAL21440 + vtkTextProperty* aTextProperty = vtkTextProperty::New(); + aTextProperty->SetColor(theRed, theGreen, theBlue); + + myLabelActor->SetTextProperty(aTextProperty); + + aTextProperty->Delete(); +#endif } /*! Set size of VTKViewer_Axis */ -void VTKViewer_Axis::SetSize(vtkFloatingPointType theSize) +void VTKViewer_Axis::SetSize(double theSize) { - vtkFloatingPointType aPosition[3] = {myDir[0]*theSize, myDir[1]*theSize, myDir[2]*theSize}; - myLineSource->SetPoint2(aPosition); + double aPosition[3] = {myDir[0]*theSize, myDir[1]*theSize, myDir[2]*theSize}; + + double aCoef = 0.99; + double aLinePosition[3] = {aPosition[0]*aCoef, aPosition[1]*aCoef, aPosition[2]*aCoef}; + myLineSource->SetPoint2(aLinePosition); myArrowActor->SetPosition(0.0,0.0,0.0); myArrowActor->AddPosition(aPosition); myArrowActor->SetOrientation(myRot); + myArrowActor->SetScale(theSize / 10.); +#ifdef IPAL21440 + if( vtkCoordinate* aCoord = myLabelActor->GetPositionCoordinate()->GetReferenceCoordinate() ) + aCoord->SetValue( aPosition ); +#else myLabelActor->SetPosition(0.0,0.0,0.0); myLabelActor->AddPosition(aPosition); +#endif +} + +/*! Check if actor belongs to the axis object + * \param theActor - vtkActor pointer + * \retval Return true if the actor belongs to the axis object + */ +bool VTKViewer_Axis::OwnActor(const vtkActor* theActor) +{ + return theActor == myLineActor || + theActor == myArrowActor || +#ifdef IPAL21440 + false; +#else + theActor == myLabelActor; +#endif } /*! \class VTKViewer_XAxis @@ -278,11 +364,12 @@ vtkStandardNewMacro(VTKViewer_XAxis); VTKViewer_XAxis::VTKViewer_XAxis(){ myDir[0] = 1.0; myDir[1] = 0.0; myDir[2] = 0.0; myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 0.0; +#ifdef IPAL21440 + myTextMapper->SetInput("X"); +#else myVectorText->SetText("X"); - vtkProperty* aProperty = vtkProperty::New(); - aProperty->SetColor(1.0,0.0,0.0); - SetProperty(aProperty); - aProperty->Delete(); +#endif + SetColor(1.0,0.0,0.0); } /*! \class VTKViewer_YAxis @@ -304,11 +391,12 @@ VTKViewer_YAxis::VTKViewer_YAxis() { myDir[0] = 0.0; myDir[1] = 1.0; myDir[2] = 0.0; myRot[0] = 0.0; myRot[1] = 0.0; myRot[2] = 90.; +#ifdef IPAL21440 + myTextMapper->SetInput("Y"); +#else myVectorText->SetText("Y"); - vtkProperty* aProperty = vtkProperty::New(); - aProperty->SetColor(0.0,1.0,0.0); - SetProperty(aProperty); - aProperty->Delete(); +#endif + SetColor(0.0,1.0,0.0); } /*! \class VTKViewer_ZAxis @@ -331,11 +419,12 @@ VTKViewer_ZAxis::VTKViewer_ZAxis() { myDir[0] = 0.0; myDir[1] = 0.0; myDir[2] = 1.0; myRot[0] = 0.0; myRot[1] = -90; myRot[2] = 0.0; +#ifdef IPAL21440 + myTextMapper->SetInput("Z"); +#else myVectorText->SetText("Z"); - vtkProperty* aProperty = vtkProperty::New(); - aProperty->SetColor(0.0,0.0,1.0); - SetProperty(aProperty); - aProperty->Delete(); +#endif + SetColor(0.0,0.0,1.0); } vtkStandardNewMacro(VTKViewer_Trihedron); @@ -349,7 +438,7 @@ VTKViewer_Trihedron::VTKViewer_Trihedron() myAxis[0] = VTKViewer_XAxis::New(); myAxis[1] = VTKViewer_YAxis::New(); myAxis[2] = VTKViewer_ZAxis::New(); - static vtkFloatingPointType aSize = 100; + static double aSize = 100; SetSize(aSize); } @@ -366,7 +455,7 @@ VTKViewer_Trihedron::~VTKViewer_Trihedron() /*! Set size of axes */ -void VTKViewer_Trihedron::SetSize(vtkFloatingPointType theSize) +void VTKViewer_Trihedron::SetSize(double theSize) { mySize = theSize; for(int i = 0; i < 3; i++) @@ -420,16 +509,38 @@ int VTKViewer_Trihedron::GetVisibleActorCount(vtkRenderer* theRenderer) { //TVisibility aVis = GetVisibility(); //SetVisibility(eOff); - vtkActorCollection* aCollection = theRenderer->GetActors(); + VTK::ActorCollectionCopy aCopy(theRenderer->GetActors()); + vtkActorCollection* aCollection = aCopy.GetActors(); aCollection->InitTraversal(); int aCount = 0; while(vtkActor* prop = aCollection->GetNextActor()) { - if( prop->GetVisibility()) - if(VTKViewer_Actor* anActor = VTKViewer_Actor::SafeDownCast(prop)) + if( prop->GetVisibility()) { + if(VTKViewer_Actor* anActor = VTKViewer_Actor::SafeDownCast(prop)) { if(!anActor->IsInfinitive()) aCount++; + } + else if ( !OwnActor( anActor ) ) { + aCount++; + } //int aCount = theRenderer->VisibleActorCount(); //SetVisibility(aVis); + } } return aCount; } + +/*! Check if actor belongs to the axis object + * \param theActor - vtkActor pointer + * \retval Return true if the actor belongs to the axis object + */ +bool VTKViewer_Trihedron::OwnActor(const vtkActor* theActor) +{ + myPresent->InitTraversal(); + while(vtkActor* anActor = myPresent->GetNextActor()) { + if ( anActor == theActor ) return true; + } + for(int i = 0; i < 3; i++) { + if ( myAxis[i]->OwnActor(theActor) ) return true; + } + return false; +}