From 55eae5869bedc314b0247d3a2fa8b8a543def289 Mon Sep 17 00:00:00 2001 From: ouv Date: Mon, 25 Oct 2010 13:43:31 +0000 Subject: [PATCH] 0020977: EDF 1520 SMESH: Create a clipping plane on several groups --- doc/salome/gui/SMESH/images/a-clipping2.png | Bin 21116 -> 17327 bytes doc/salome/gui/SMESH/images/image79.jpg | Bin 49431 -> 57934 bytes doc/salome/gui/SMESH/images/image99.gif | Bin 10733 -> 15691 bytes doc/salome/gui/SMESH/input/clipping.doc | 13 +- src/OBJECT/SMESH_Actor.cxx | 89 +-- src/OBJECT/SMESH_Actor.h | 10 +- src/OBJECT/SMESH_ActorDef.h | 3 - src/SMESHGUI/SMESHGUI.cxx | 460 +++++++++--- src/SMESHGUI/SMESHGUI.h | 36 + src/SMESHGUI/SMESHGUI_ClippingDlg.cxx | 792 +++++++++++++------- src/SMESHGUI/SMESHGUI_ClippingDlg.h | 116 ++- src/SMESHGUI/SMESHGUI_VTKUtils.cxx | 108 +++ src/SMESHGUI/SMESHGUI_VTKUtils.h | 10 + src/SMESHGUI/SMESH_msg_en.ts | 8 + 14 files changed, 1144 insertions(+), 501 deletions(-) diff --git a/doc/salome/gui/SMESH/images/a-clipping2.png b/doc/salome/gui/SMESH/images/a-clipping2.png index bfac4cea53acd9b713925ea20e3e34e0edf45f19..9d1249c68694fb6d24d18e92d9246522b8648574 100755 GIT binary patch literal 17327 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

b@R{rFI3w-&fUGRNK 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 literal 49431 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%0DsClS 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 diff --git a/doc/salome/gui/SMESH/images/image99.gif b/doc/salome/gui/SMESH/images/image99.gif index 4959ed82548939a522238bb5b9c57adb0d1dfb6d..2672e99f3241466518910e294744154285d7cc9b 100755 GIT binary patch literal 15691 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 C$i&J3 literal 10733 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 diff --git a/doc/salome/gui/SMESH/input/clipping.doc b/doc/salome/gui/SMESH/input/clipping.doc index f3b19f374..df3e39495 100644 --- a/doc/salome/gui/SMESH/input/clipping.doc +++ b/doc/salome/gui/SMESH/input/clipping.doc @@ -9,11 +9,14 @@ To start, click on the \em New button. \image html a-clipping2.png -Now you can define the parameters of your cross-section: \b Orientation -(X-Y, X-Z or Y-Z); \b Distance between the opposite extremities of the -object, if it is set to 0.5 the object is split in two halves; and -\b Rotation (in angle degrees) around X (Y to Z) and around Y (X to -Z). If the Show preview button is on, you can see the clipping plane +Now you can define the parameters of your cross-section: list of +meshes, sub-meshes and groups the cross-section will be applied to +(Select all button allows to select and deselect all available +objects at once), \b Orientation (X-Y, X-Z or Y-Z); \b Distance between the +opposite extremities of the boundary box of selected objects, if it is set +to 0.5 the boundary box is split in two halves; and \b Rotation (in angle +degrees) around X (Y to Z) and around Y (X to Z). +If the Show preview button is on, you can see the clipping plane in the 3D Viewer. \image html image79.jpg "The plane and the cut object" diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index 4e2943ba6..8386faf3a 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -500,6 +500,9 @@ SMESH_ActorDef::~SMESH_ActorDef() { if(MYDEBUG) MESSAGE("~SMESH_ActorDef - "<InvokeEvent( SMESH::DeleteActorEvent, NULL ); + myScalarBarActor->Delete(); myLookupTable->Delete(); @@ -1823,92 +1826,6 @@ GetClippingPlane(vtkIdType theID) return myCippingPlaneCont[theID].Get(); } - -static void ComputeBoundsParam(vtkDataSet* theDataSet, - vtkFloatingPointType theDirection[3], vtkFloatingPointType theMinPnt[3], - vtkFloatingPointType& theMaxBoundPrj, vtkFloatingPointType& theMinBoundPrj) -{ - vtkFloatingPointType aBounds[6]; - theDataSet->GetBounds(aBounds); - - //Enlarge bounds in order to avoid conflicts of precision - for(int i = 0; i < 6; i += 2){ - static double EPS = 1.0E-3; - vtkFloatingPointType aDelta = (aBounds[i+1] - aBounds[i])*EPS; - aBounds[i] -= aDelta; - aBounds[i+1] += aDelta; - } - - vtkFloatingPointType aBoundPoints[8][3] = { {aBounds[0],aBounds[2],aBounds[4]}, - {aBounds[1],aBounds[2],aBounds[4]}, - {aBounds[0],aBounds[3],aBounds[4]}, - {aBounds[1],aBounds[3],aBounds[4]}, - {aBounds[0],aBounds[2],aBounds[5]}, - {aBounds[1],aBounds[2],aBounds[5]}, - {aBounds[0],aBounds[3],aBounds[5]}, - {aBounds[1],aBounds[3],aBounds[5]}}; - - int aMaxId = 0, aMinId = aMaxId; - theMaxBoundPrj = vtkMath::Dot(theDirection,aBoundPoints[aMaxId]); - theMinBoundPrj = theMaxBoundPrj; - for(int i = 1; i < 8; i++){ - vtkFloatingPointType aTmp = vtkMath::Dot(theDirection,aBoundPoints[i]); - if(theMaxBoundPrj < aTmp){ - theMaxBoundPrj = aTmp; - aMaxId = i; - } - if(theMinBoundPrj > aTmp){ - theMinBoundPrj = aTmp; - aMinId = i; - } - } - vtkFloatingPointType *aMinPnt = aBoundPoints[aMaxId]; - theMinPnt[0] = aMinPnt[0]; - theMinPnt[1] = aMinPnt[1]; - theMinPnt[2] = aMinPnt[2]; -} - - -static void DistanceToPosition(vtkDataSet* theDataSet, - vtkFloatingPointType theDirection[3], vtkFloatingPointType theDist, vtkFloatingPointType thePos[3]) -{ - vtkFloatingPointType aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; - ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); - vtkFloatingPointType 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; -} - - -static void PositionToDistance(vtkDataSet* theDataSet, - vtkFloatingPointType theDirection[3], vtkFloatingPointType thePos[3], vtkFloatingPointType& theDist) -{ - vtkFloatingPointType aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; - ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); - vtkFloatingPointType aPrj = vtkMath::Dot(theDirection,thePos); - theDist = (aPrj-aMinBoundPrj)/(aMaxBoundPrj-aMinBoundPrj); -} - - -void SMESH_ActorDef::SetPlaneParam(vtkFloatingPointType theDir[3], vtkFloatingPointType theDist, vtkPlane* thePlane) -{ - thePlane->SetNormal(theDir); - vtkFloatingPointType anOrigin[3]; - ::DistanceToPosition(GetUnstructuredGrid(),theDir,theDist,anOrigin); - thePlane->SetOrigin(anOrigin); -} - - -void SMESH_ActorDef::GetPlaneParam(vtkFloatingPointType theDir[3], vtkFloatingPointType& theDist, vtkPlane* thePlane) -{ - thePlane->GetNormal(theDir); - - vtkFloatingPointType anOrigin[3]; - thePlane->GetOrigin(anOrigin); - ::PositionToDistance(GetUnstructuredGrid(),theDir,anOrigin,theDist); -} - void SMESH_ActorDef::UpdateScalarBar() { SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); diff --git a/src/OBJECT/SMESH_Actor.h b/src/OBJECT/SMESH_Actor.h index 31d5b9f3e..c2d46098a 100644 --- a/src/OBJECT/SMESH_Actor.h +++ b/src/OBJECT/SMESH_Actor.h @@ -31,6 +31,8 @@ #include #include "SMESH_Object.h" +#include + class vtkUnstructuredGrid; class vtkScalarBarActor; @@ -38,6 +40,11 @@ class vtkScalarBarActor; class vtkPlane; class vtkImplicitBoolean; +namespace SMESH +{ + const vtkIdType DeleteActorEvent = vtkCommand::UserEvent + 100; +} + class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor { static SMESH_Actor* New() { return NULL;} @@ -123,9 +130,6 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor virtual vtkScalarBarActor* GetScalarBarActor() = 0; - virtual void SetPlaneParam(vtkFloatingPointType theDir[3], vtkFloatingPointType theDist, vtkPlane* thePlane) = 0; - virtual void GetPlaneParam(vtkFloatingPointType theDir[3], vtkFloatingPointType& theDist, vtkPlane* thePlane) = 0; - virtual void RemoveAllClippingPlanes() = 0; virtual vtkIdType GetNumberOfClippingPlanes() = 0; virtual vtkPlane* GetClippingPlane(vtkIdType theID) = 0; diff --git a/src/OBJECT/SMESH_ActorDef.h b/src/OBJECT/SMESH_ActorDef.h index 44bc4f56a..9b1c4df1d 100644 --- a/src/OBJECT/SMESH_ActorDef.h +++ b/src/OBJECT/SMESH_ActorDef.h @@ -189,9 +189,6 @@ class SMESH_ActorDef : public SMESH_Actor virtual vtkScalarBarActor* GetScalarBarActor(){ return myScalarBarActor;} - virtual void SetPlaneParam(vtkFloatingPointType theDir[3], vtkFloatingPointType theDist, vtkPlane* thePlane); - virtual void GetPlaneParam(vtkFloatingPointType theDir[3], vtkFloatingPointType& theDist, vtkPlane* thePlane); - virtual void RemoveAllClippingPlanes(); virtual vtkIdType GetNumberOfClippingPlanes(); virtual vtkPlane* GetClippingPlane(vtkIdType theID); diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index f766be62e..8601f8147 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -135,6 +135,7 @@ #include #include #include +#include // SALOME KERNEL includes #include @@ -837,17 +838,21 @@ if( !aSel || !appStudy ) return; + if( theCommandID == 1134 ) { // Clipping dialog can be activated without selection + if( SMESHGUI* aModule = SMESHGUI::GetSMESHGUI() ) { + aModule->EmitSignalDeactivateDialog(); + if( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( aModule ) ) + (new SMESHGUI_ClippingDlg( aModule, aViewWindow ))->show(); + } + return; + } + _PTR(Study) aStudy = appStudy->studyDS(); aSel->selectedObjects( selected ); if(selected.Extent() >= 1){ switch(theCommandID){ - case 1134:{ - SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog(); - (new SMESHGUI_ClippingDlg( SMESHGUI::GetSMESHGUI() ))->show(); - return; - } case 1133:{ SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog(); (new SMESHGUI_TransparencyDlg( SMESHGUI::GetSMESHGUI() ))->show(); @@ -1419,6 +1424,12 @@ LightApp_Module( "SMESH" ) myState = -1; myDisplayer = 0; + myEventCallbackCommand = vtkCallbackCommand::New(); + myEventCallbackCommand->Delete(); + myEventCallbackCommand->SetClientData( this ); + myEventCallbackCommand->SetCallback( SMESHGUI::ProcessEvents ); + myPriority = 0.0; + SMESH::GetFilterManager(); SMESH::GetPattern(); @@ -3682,14 +3693,6 @@ void SMESHGUI::initialize( CAM_Application* app ) popupMgr()->insert( action( 1133 ), -1, -1 ); popupMgr()->setRule( action( 1133 ), aMeshInVTK + "&& isVisible", QtxPopupMgr::VisibleRule ); - //------------------------------------------------- - // Clipping - //------------------------------------------------- - popupMgr()->insert( action( 1134 ), -1, -1 ); - popupMgr()->setRule( action( 1134 ), aMeshInVTK + "&& selcount=1 && isVisible", QtxPopupMgr::VisibleRule ); - - popupMgr()->insert( separator(), -1, -1 ); - //------------------------------------------------- // Controls //------------------------------------------------- @@ -3815,8 +3818,19 @@ void SMESHGUI::initialize( CAM_Application* app ) popupMgr()->insert( separator(), -1, -1 ); + //------------------------------------------------- + // Clipping + //------------------------------------------------- + popupMgr()->insert( action( 1134 ), -1, -1 ); + popupMgr()->setRule( action( 1134 ), "client='VTKViewer'", QtxPopupMgr::VisibleRule ); + + popupMgr()->insert( separator(), -1, -1 ); + connect( application(), SIGNAL( viewManagerActivated( SUIT_ViewManager* ) ), this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) ); + + connect( application(), SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ), + this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) ); } //================================================================================ @@ -3973,6 +3987,49 @@ void SMESHGUI::onViewManagerActivated( SUIT_ViewManager* mgr ) SMESH::UpdateSelectionProp( this ); } +void SMESHGUI::onViewManagerRemoved( SUIT_ViewManager* theViewManager ) +{ + if( theViewManager && theViewManager->getType() == SVTK_Viewer::Type() ) + myClippingPlaneInfoMap.erase( theViewManager ); +} + +void SMESHGUI::addActorAsObserver( SMESH_Actor* theActor ) +{ + theActor->AddObserver( SMESH::DeleteActorEvent, + myEventCallbackCommand.GetPointer(), + myPriority ); +} + +void SMESHGUI::ProcessEvents( vtkObject* theObject, + unsigned long theEvent, + void* theClientData, + void* theCallData ) +{ + if( SMESHGUI* aSMESHGUI = reinterpret_cast( theClientData ) ) { + if( theObject && theEvent == SMESH::DeleteActorEvent ) { + if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( theObject ) ) { + SMESHGUI_ClippingPlaneInfoMap& aClippingPlaneInfoMap = aSMESHGUI->getClippingPlaneInfoMap(); + SMESHGUI_ClippingPlaneInfoMap::iterator anIter1 = aClippingPlaneInfoMap.begin(); + for( ; anIter1 != aClippingPlaneInfoMap.end(); anIter1++ ) { + SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = anIter1->second; + SMESHGUI_ClippingPlaneInfoList::iterator anIter2 = aClippingPlaneInfoList.begin(); + for( ; anIter2 != aClippingPlaneInfoList.end(); anIter2++ ) { + SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter2; + std::list& anActorList = aClippingPlaneInfo.ActorList; + SMESH::TActorList::iterator anIter3 = anActorList.begin(); + for ( ; anIter3 != anActorList.end(); anIter3++ ) { + if( anActor == *anIter3 ) { + anActorList.erase( anIter3 ); + break; + } + } + } + } + } + } + } +} + void SMESHGUI::createPreferences() { // General tab ------------------------------------------------------------------------ @@ -4481,12 +4538,9 @@ SALOMEDS::Color SMESHGUI::getUniqueColor( const QList& theReser if( aTolerance < 1 ) break; } - //cout << "Iteration N" << anIterations << " (tolerance=" << aTolerance << ")"<< endl; aHue = (int)( 360.0 * rand() / RAND_MAX ); - //cout << "Hue = " << aHue << endl; - //cout << "Auto colors : "; bool ok = true; QList::const_iterator it = theReservedColors.constBegin(); QList::const_iterator itEnd = theReservedColors.constEnd(); @@ -4497,21 +4551,17 @@ SALOMEDS::Color SMESHGUI::getUniqueColor( const QList& theReser int h, s, v; aQColor.getHsv( &h, &s, &v ); - //cout << h << " "; if( abs( h - aHue ) < aTolerance ) { ok = false; - //cout << "break (diff = " << abs( h - aHue ) << ")"; break; } } - //cout << endl; if( ok ) break; } - //cout << "Hue of the returned color = " << aHue << endl; QColor aColor; aColor.setHsv( aHue, 255, 255 ); @@ -4599,6 +4649,37 @@ void SMESHGUI::storeVisualParameters (int savePoint) // saving VTK actors properties if (vType == SVTK_Viewer::Type()) { + // store the clipping planes attached to the view manager + SMESHGUI_ClippingPlaneInfoList aClippingPlaneInfoList; + SMESHGUI_ClippingPlaneInfoMap::const_iterator anIter = myClippingPlaneInfoMap.find( vman ); + if( anIter != myClippingPlaneInfoMap.end() ) + aClippingPlaneInfoList = anIter->second; + + if( !aClippingPlaneInfoList.empty() ) { + SMESHGUI_ClippingPlaneInfoList::const_iterator anIter = aClippingPlaneInfoList.begin(); + for( int anId = 0; anIter != aClippingPlaneInfoList.end(); anIter++, anId++ ) + { + const SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter; + SMESH::OrientedPlane* aPlane = aClippingPlaneInfo.Plane; + + QString aPropertyName( "ClippingPlane" ); + aPropertyName += gSeparator; + aPropertyName += QString::number( vtkViewers ); + aPropertyName += gSeparator; + aPropertyName += QString::number( anId ); + + QString aPropertyValue = QString::number( (int)aPlane->GetOrientation() ).toLatin1().constData(); + aPropertyValue += gDigitsSep; + aPropertyValue += QString::number( aPlane->GetDistance() ).toLatin1().constData(); + aPropertyValue += gDigitsSep; + aPropertyValue += QString::number( aPlane->myAngle[0] ).toLatin1().constData(); + aPropertyValue += gDigitsSep; + aPropertyValue += QString::number( aPlane->myAngle[1] ).toLatin1().constData(); + + ip->setProperty( aPropertyName.toStdString(), aPropertyValue.toStdString() ); + } + } + QVector views = vman->getViews(); for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++) { @@ -4724,22 +4805,25 @@ void SMESHGUI::storeVisualParameters (int savePoint) // Clipping param = vtkParam + "ClippingPlane"; - int nPlanes = aSmeshActor->GetNumberOfClippingPlanes(); - if (!nPlanes) - ip->setParameter(entry, param, "Off"); - for (int ipl = 0; ipl < nPlanes; ipl++) { - //vtkPlane* plane = aSmeshActor->GetClippingPlane(ipl); - SMESH::Orientation anOrientation; - double aDistance; - vtkFloatingPointType anAngle[2]; - SMESHGUI_ClippingDlg::GetPlaneParam(aSmeshActor, ipl, anOrientation, aDistance, anAngle); - std::string planeValue = QString::number((int)anOrientation).toLatin1().data(); - planeValue += gDigitsSep; planeValue += QString::number(aDistance).toLatin1().data(); - planeValue += gDigitsSep; planeValue += QString::number(anAngle[0]).toLatin1().data(); - planeValue += gDigitsSep; planeValue += QString::number(anAngle[1]).toLatin1().data(); - - ip->setParameter(entry, param + QString::number(ipl+1).toLatin1().data(), planeValue); + int aPlaneId = 0; + if( !aClippingPlaneInfoList.empty() ) { + SMESHGUI_ClippingPlaneInfoList::const_iterator anIter1 = aClippingPlaneInfoList.begin(); + for( int anId = 0; anIter1 != aClippingPlaneInfoList.end(); anIter1++, anId++ ) + { + const SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter1; + std::list anActorList = aClippingPlaneInfo.ActorList; + SMESH::TActorList::iterator anIter2 = anActorList.begin(); + for ( ; anIter2 != anActorList.end(); anIter2++ ) { + if( aSmeshActor == *anIter2 ) { + ip->setParameter( entry, param + QString::number( ++aPlaneId ).toLatin1().constData(), + QString::number( anId ).toLatin1().constData() ); + break; + } + } + } } + if( aPlaneId == 0 ) + ip->setParameter( entry, param, "Off" ); } // if (io->hasEntry()) } // SMESH_Actor && hasIO } // isVisible @@ -4751,6 +4835,25 @@ void SMESHGUI::storeVisualParameters (int savePoint) } // for (viewManagers) } +// data structures for clipping planes processing +typedef struct { + int Id; + vtkIdType Orientation; + vtkFloatingPointType Distance; + vtkFloatingPointType Angle[2]; +} TPlaneData; +typedef std::list TPlaneDataList; +typedef std::map TPlaneDataMap; + +typedef std::list TActorList; +typedef struct { + int PlaneId; + TActorList ActorList; + SUIT_ViewManager* ViewManager; +} TPlaneInfo; +typedef std::list TPlaneInfoList; +typedef std::map TPlaneInfoMap; + /*! * \brief Restore visual parameters * @@ -4775,8 +4878,9 @@ void SMESHGUI::restoreVisualParameters (int savePoint) savePoint); _PTR(IParameters) ip = ClientFactory::getIParameters(ap); - // restore map of custom markers + // restore map of custom markers and map of clipping planes VTK::MarkerMap& aMarkerMap = myMarkerMap[ studyDS->StudyId() ]; + TPlaneDataMap aPlaneDataMap; std::vector properties = ip->getProperties(); for (std::vector::iterator propIt = properties.begin(); propIt != properties.end(); ++propIt) @@ -4786,52 +4890,103 @@ void SMESHGUI::restoreVisualParameters (int savePoint) QString aPropertyValue( ip->getProperty( property ).c_str() ); QStringList aPropertyNameList = aPropertyName.split( gSeparator, QString::SkipEmptyParts ); - if( aPropertyNameList.size() != 2 ) + if( aPropertyNameList.isEmpty() ) continue; - int anId = 0; - bool ok = false; - if( aPropertyNameList[0] == "texture" ) - anId = aPropertyNameList[1].toInt( &ok ); + QString aPropertyType = aPropertyNameList[0]; + if( aPropertyType == "texture" ) + { + if( aPropertyNameList.size() != 2 ) + continue; - if( !ok || anId < 1 ) - continue; + bool ok = false; + int anId = aPropertyNameList[1].toInt( &ok ); + if( !ok || anId < 1 ) + continue; - QStringList aPropertyValueList = aPropertyValue.split( gPathSep, QString::SkipEmptyParts ); - if( aPropertyValueList.size() != 2 ) - continue; + QStringList aPropertyValueList = aPropertyValue.split( gPathSep, QString::SkipEmptyParts ); + if( aPropertyValueList.size() != 2 ) + continue; - std::string aMarkerFileName = aPropertyValueList[0].toStdString(); - QString aMarkerTextureString = aPropertyValueList[1]; - QStringList aMarkerTextureStringList = aMarkerTextureString.split( gDigitsSep, QString::SkipEmptyParts ); - if( aMarkerTextureStringList.size() != 3 ) - continue; + std::string aMarkerFileName = aPropertyValueList[0].toStdString(); + QString aMarkerTextureString = aPropertyValueList[1]; + QStringList aMarkerTextureStringList = aMarkerTextureString.split( gDigitsSep, QString::SkipEmptyParts ); + if( aMarkerTextureStringList.size() != 3 ) + continue; - ok = false; - ushort aWidth = aMarkerTextureStringList[0].toUShort( &ok ); - if( !ok ) - continue; + ok = false; + ushort aWidth = aMarkerTextureStringList[0].toUShort( &ok ); + if( !ok ) + continue; - ok = false; - ushort aHeight = aMarkerTextureStringList[1].toUShort( &ok ); - if( !ok ) - continue; + ok = false; + ushort aHeight = aMarkerTextureStringList[1].toUShort( &ok ); + if( !ok ) + continue; - VTK::MarkerTexture aMarkerTexture; - aMarkerTexture.push_back( aWidth ); - aMarkerTexture.push_back( aHeight ); + VTK::MarkerTexture aMarkerTexture; + aMarkerTexture.push_back( aWidth ); + aMarkerTexture.push_back( aHeight ); - QString aMarkerTextureData = aMarkerTextureStringList[2]; - for( int i = 0, n = aMarkerTextureData.length(); i < n; i++ ) - { - QChar aChar = aMarkerTextureData.at( i ); - if( aChar.isDigit() ) - aMarkerTexture.push_back( aChar.digitValue() ); + QString aMarkerTextureData = aMarkerTextureStringList[2]; + for( int i = 0, n = aMarkerTextureData.length(); i < n; i++ ) + { + QChar aChar = aMarkerTextureData.at( i ); + if( aChar.isDigit() ) + aMarkerTexture.push_back( aChar.digitValue() ); + } + + aMarkerMap[ anId ] = VTK::MarkerData( aMarkerFileName, aMarkerTexture ); } + else if( aPropertyType == "ClippingPlane" ) + { + if( aPropertyNameList.size() != 3 ) + continue; - aMarkerMap[ anId ] = VTK::MarkerData( aMarkerFileName, aMarkerTexture ); + bool ok = false; + int aViewId = aPropertyNameList[1].toInt( &ok ); + if( !ok || aViewId < 0 ) + continue; + + ok = false; + int aClippingPlaneId = aPropertyNameList[2].toInt( &ok ); + if( !ok || aClippingPlaneId < 0 ) + continue; + + QStringList aPropertyValueList = aPropertyValue.split( gDigitsSep, QString::SkipEmptyParts ); + if( aPropertyValueList.size() != 4 ) + continue; + + TPlaneData aPlaneData; + aPlaneData.Id = aClippingPlaneId; + + ok = false; + aPlaneData.Orientation = aPropertyValueList[0].toInt( &ok ); + if( !ok ) + continue; + + ok = false; + aPlaneData.Distance = aPropertyValueList[1].toDouble( &ok ); + if( !ok ) + continue; + + ok = false; + aPlaneData.Angle[0] = aPropertyValueList[2].toDouble( &ok ); + if( !ok ) + continue; + + ok = false; + aPlaneData.Angle[1] = aPropertyValueList[3].toDouble( &ok ); + if( !ok ) + continue; + + TPlaneDataList& aPlaneDataList = aPlaneDataMap[ aViewId ]; + aPlaneDataList.push_back( aPlaneData ); + } } + TPlaneInfoMap aPlaneInfoMap; + std::vector entries = ip->getEntries(); for (std::vector::iterator entIt = entries.begin(); entIt != entries.end(); ++entIt) @@ -4878,39 +5033,40 @@ void SMESHGUI::restoreVisualParameters (int savePoint) if (vtkActors.IsBound(viewIndex)) aSmeshActor = vtkActors.Find(viewIndex); + QList lst; + getApp()->viewManagers(viewerTypStr, lst); + + // SVTK ViewManager always has 1 ViewWindow, so view index is index of view manager + SUIT_ViewManager* vman = NULL; + if (viewIndex >= 0 && viewIndex < lst.count()) + vman = lst.at(viewIndex); + if (paramNameStr == "Visibility") { - if (!aSmeshActor && displayer()) + if (!aSmeshActor && displayer() && vman) { - QList lst; - getApp()->viewManagers(viewerTypStr, lst); - - // SVTK ViewManager always has 1 ViewWindow, so view index is index of view manager - if (viewIndex >= 0 && viewIndex < lst.count()) { - SUIT_ViewManager* vman = lst.at(viewIndex); - SUIT_ViewModel* vmodel = vman->getViewModel(); - // SVTK view model can be casted to SALOME_View - displayer()->Display(entry, true, dynamic_cast(vmodel)); - - // store displayed actor in a temporary map for quicker - // access later when restoring other parameters - SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) vman->getActiveView(); - vtkRenderer* Renderer = vtkView->getRenderer(); - VTK::ActorCollectionCopy aCopy(Renderer->GetActors()); - vtkActorCollection* theActors = aCopy.GetActors(); - theActors->InitTraversal(); - bool isFound = false; - vtkActor *ac = theActors->GetNextActor(); - for (; ac != NULL && !isFound; ac = theActors->GetNextActor()) { - if (ac->IsA("SMESH_Actor")) { - SMESH_Actor* aGeomAc = SMESH_Actor::SafeDownCast(ac); - if (aGeomAc->hasIO()) { - Handle(SALOME_InteractiveObject) io = - Handle(SALOME_InteractiveObject)::DownCast(aGeomAc->getIO()); - if (io->hasEntry() && strcmp(io->getEntry(), entry.toLatin1().data()) == 0) { - isFound = true; - vtkActors.Bind(viewIndex, aGeomAc); - } + SUIT_ViewModel* vmodel = vman->getViewModel(); + // SVTK view model can be casted to SALOME_View + displayer()->Display(entry, true, dynamic_cast(vmodel)); + + // store displayed actor in a temporary map for quicker + // access later when restoring other parameters + SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) vman->getActiveView(); + vtkRenderer* Renderer = vtkView->getRenderer(); + VTK::ActorCollectionCopy aCopy(Renderer->GetActors()); + vtkActorCollection* theActors = aCopy.GetActors(); + theActors->InitTraversal(); + bool isFound = false; + vtkActor *ac = theActors->GetNextActor(); + for (; ac != NULL && !isFound; ac = theActors->GetNextActor()) { + if (ac->IsA("SMESH_Actor")) { + SMESH_Actor* aGeomAc = SMESH_Actor::SafeDownCast(ac); + if (aGeomAc->hasIO()) { + Handle(SALOME_InteractiveObject) io = + Handle(SALOME_InteractiveObject)::DownCast(aGeomAc->getIO()); + if (io->hasEntry() && strcmp(io->getEntry(), entry.toLatin1().data()) == 0) { + isFound = true; + vtkActors.Bind(viewIndex, aGeomAc); } } } @@ -5027,14 +5183,16 @@ void SMESHGUI::restoreVisualParameters (int savePoint) } // Clipping else if (paramNameStr.startsWith("ClippingPlane")) { - cout << "$$$ ClippingPlane 1" << endl; - if (paramNameStr == "ClippingPlane1" || val == "Off") - aSmeshActor->RemoveAllClippingPlanes(); - if (val != "Off") { - cout << "$$$ ClippingPlane 2" << endl; - QStringList vals = val.split(gDigitsSep, QString::SkipEmptyParts); - if (vals.count() == 4) { // format check: 4 values - cout << "$$$ ClippingPlane 3" << endl; + QStringList vals = val.split(gDigitsSep, QString::SkipEmptyParts); + // old format - val looks like "Off" or "0:0.5:0:0" (orientation, distance, two angles) + // new format - val looks like "Off" or "0" (plane id) + // (note: in new format "Off" value is used only for consistency, + // so it is processed together with values in old format) + bool anIsOldFormat = ( vals.count() == 4 || val == "Off" ); + if( anIsOldFormat ) { + if (paramNameStr == "ClippingPlane1" || val == "Off") + aSmeshActor->RemoveAllClippingPlanes(); + if (val != "Off") { SMESH::Orientation anOrientation = (SMESH::Orientation)vals[0].toInt(); double aDistance = vals[1].toFloat(); vtkFloatingPointType anAngle[2]; @@ -5047,8 +5205,43 @@ void SMESHGUI::restoreVisualParameters (int savePoint) if (viewIndex >= 0 && viewIndex < lst.count()) { SUIT_ViewManager* vman = lst.at(viewIndex); SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) vman->getActiveView(); - SMESHGUI_ClippingDlg::AddPlane(aSmeshActor, vtkView, - anOrientation, aDistance, anAngle); + + SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = myClippingPlaneInfoMap[ vman ]; + + SMESH::TActorList anActorList; + anActorList.push_back( aSmeshActor ); + SMESH::OrientedPlane* aPlane = + SMESHGUI_ClippingDlg::AddPlane(anActorList, vtkView, anOrientation, aDistance, anAngle); + if( aPlane ) { + SMESH::ClippingPlaneInfo aClippingPlaneInfo; + aClippingPlaneInfo.Plane = aPlane; + aClippingPlaneInfo.ActorList = anActorList; + aClippingPlaneInfoList.push_back( aClippingPlaneInfo ); + } + } + } + } + else { + bool ok = false; + int aPlaneId = val.toInt( &ok ); + if( ok && aPlaneId >= 0 ) { + bool anIsDefinedPlane = false; + TPlaneInfoList& aPlaneInfoList = aPlaneInfoMap[ viewIndex ]; + TPlaneInfoList::iterator anIter = aPlaneInfoList.begin(); + for( ; anIter != aPlaneInfoList.end(); anIter++ ) { + TPlaneInfo& aPlaneInfo = *anIter; + if( aPlaneInfo.PlaneId == aPlaneId ) { + aPlaneInfo.ActorList.push_back( aSmeshActor ); + anIsDefinedPlane = true; + break; + } + } + if( !anIsDefinedPlane ) { + TPlaneInfo aPlaneInfo; + aPlaneInfo.PlaneId = aPlaneId; + aPlaneInfo.ActorList.push_back( aSmeshActor ); + aPlaneInfo.ViewManager = vman; + aPlaneInfoList.push_back( aPlaneInfo ); } } } @@ -5059,6 +5252,55 @@ void SMESHGUI::restoreVisualParameters (int savePoint) } // for names/parameters iterator } // for entries iterator + // add clipping planes to actors according to the restored parameters + // and update the clipping plane map + TPlaneInfoMap::const_iterator anIter1 = aPlaneInfoMap.begin(); + for( ; anIter1 != aPlaneInfoMap.end(); anIter1++ ) { + int aViewId = anIter1->first; + const TPlaneInfoList& aPlaneInfoList = anIter1->second; + + TPlaneDataMap::const_iterator anIter2 = aPlaneDataMap.find( aViewId ); + if( anIter2 == aPlaneDataMap.end() ) + continue; + const TPlaneDataList& aPlaneDataList = anIter2->second; + + TPlaneInfoList::const_iterator anIter3 = aPlaneInfoList.begin(); + for( ; anIter3 != aPlaneInfoList.end(); anIter3++ ) { + const TPlaneInfo& aPlaneInfo = *anIter3; + int aPlaneId = aPlaneInfo.PlaneId; + const TActorList& anActorList = aPlaneInfo.ActorList; + SUIT_ViewManager* aViewManager = aPlaneInfo.ViewManager; + if( !aViewManager ) + continue; + + SVTK_ViewWindow* aViewWindow = dynamic_cast( aViewManager->getActiveView() ); + if( !aViewWindow ) + continue; + + SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = myClippingPlaneInfoMap[ aViewManager ]; + + TPlaneDataList::const_iterator anIter4 = aPlaneDataList.begin(); + for( ; anIter4 != aPlaneDataList.end(); anIter4++ ) { + const TPlaneData& aPlaneData = *anIter4; + if( aPlaneData.Id == aPlaneId ) { + SMESH::OrientedPlane* aPlane = + SMESHGUI_ClippingDlg::AddPlane( anActorList, + aViewWindow, + (SMESH::Orientation)aPlaneData.Orientation, + aPlaneData.Distance, + aPlaneData.Angle ); + if( aPlane ) { + SMESH::ClippingPlaneInfo aClippingPlaneInfo; + aClippingPlaneInfo.Plane = aPlane; + aClippingPlaneInfo.ActorList = anActorList; + aClippingPlaneInfoList.push_back( aClippingPlaneInfo ); + } + break; + } + } + } + } + // update all VTK views QList lst; getApp()->viewManagers(lst); diff --git a/src/SMESHGUI/SMESHGUI.h b/src/SMESHGUI/SMESHGUI.h index 4a82e5c1a..8f86faf6d 100644 --- a/src/SMESHGUI/SMESHGUI.h +++ b/src/SMESHGUI/SMESHGUI.h @@ -39,6 +39,14 @@ #include #include CORBA_SERVER_HEADER(SMESH_Gen) +// VTK includes +#include +#include + +class vtkActor; +class vtkCallbackCommand; +class vtkObject; + class QDialog; class SUIT_Desktop; @@ -52,10 +60,24 @@ class SalomeApp_Study; class LightApp_Selection; class LightApp_SelectionMgr; +class SMESH_Actor; class SMESHGUI_FilterLibraryDlg; typedef std::map SMESHGUI_StudyId2MarkerMap; +namespace SMESH +{ + class OrientedPlane; + struct ClippingPlaneInfo + { + OrientedPlane* Plane; + std::list ActorList; + }; +} + +typedef std::list SMESHGUI_ClippingPlaneInfoList; +typedef std::map SMESHGUI_ClippingPlaneInfoMap; + //================================================================================= // class : SMESHGUI // purpose : @@ -122,6 +144,10 @@ public : virtual void storeVisualParameters (int savePoint); virtual void restoreVisualParameters(int savePoint); + virtual void addActorAsObserver( SMESH_Actor* theActor ); + + SMESHGUI_ClippingPlaneInfoMap& getClippingPlaneInfoMap() { return myClippingPlaneInfoMap; } + public slots: virtual bool deactivateModule( SUIT_Study* ); virtual bool activateModule( SUIT_Study* ); @@ -130,6 +156,7 @@ public slots: private slots: void OnGUIEvent(); void onViewManagerActivated( SUIT_ViewManager* ); + void onViewManagerRemoved( SUIT_ViewManager* ); void onOperationCommited( SUIT_Operation* ); void onOperationAborted( SUIT_Operation* ); void onHypothesisEdit( int result ); @@ -159,6 +186,11 @@ protected: virtual bool reusableOperation( const int id ); + static void ProcessEvents( vtkObject* theObject, + unsigned long theEvent, + void* theClientData, + void* theCallData ); + private: void OnEditDelete(); int addVtkFontPref( const QString& label, @@ -175,6 +207,10 @@ private : SMESHGUI_FilterLibraryDlg* myFilterLibraryDlg; SMESHGUI_StudyId2MarkerMap myMarkerMap; + SMESHGUI_ClippingPlaneInfoMap myClippingPlaneInfoMap; + + vtkSmartPointer myEventCallbackCommand; + vtkFloatingPointType myPriority; }; #endif // SMESHGUI_H diff --git a/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx b/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx index 13bdc8eb4..ac190be77 100644 --- a/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx @@ -41,11 +41,15 @@ #include #include #include +#include #include +#include + #include -#include + +#include #include @@ -59,139 +63,138 @@ #include #include #include +#include // VTK includes #include -#include #include #include #include #include +#include #define SPACING 6 #define MARGIN 11 -class OrientedPlane: public vtkPlane +//================================================================================= +// class : OrientedPlane +// purpose : +//================================================================================= +SMESH::OrientedPlane* SMESH::OrientedPlane::New() { - QPointer myViewWindow; - - vtkDataSetMapper* myMapper; - -public: - static OrientedPlane *New() - { - return new OrientedPlane(); - } - static OrientedPlane *New(SVTK_ViewWindow* theViewWindow) - { - return new OrientedPlane(theViewWindow); - } - vtkTypeMacro (OrientedPlane, vtkPlane); - - SMESH::Orientation myOrientation; - float myDistance; - double myAngle[2]; + return new OrientedPlane(); +} - vtkPlaneSource* myPlaneSource; - SALOME_Actor *myActor; +SMESH::OrientedPlane* SMESH::OrientedPlane::New(SVTK_ViewWindow* theViewWindow) +{ + return new OrientedPlane(theViewWindow); +} - void SetOrientation (SMESH::Orientation theOrientation) { myOrientation = theOrientation; } - SMESH::Orientation GetOrientation() { return myOrientation; } +void SMESH::OrientedPlane::ShallowCopy(SMESH::OrientedPlane* theOrientedPlane) +{ + SetNormal(theOrientedPlane->GetNormal()); + SetOrigin(theOrientedPlane->GetOrigin()); - void SetDistance (float theDistance) { myDistance = theDistance; } - float GetDistance() { return myDistance; } + myOrientation = theOrientedPlane->GetOrientation(); + myDistance = theOrientedPlane->GetDistance(); - void ShallowCopy (OrientedPlane* theOrientedPlane) - { - SetNormal(theOrientedPlane->GetNormal()); - SetOrigin(theOrientedPlane->GetOrigin()); + myAngle[0] = theOrientedPlane->myAngle[0]; + myAngle[1] = theOrientedPlane->myAngle[1]; - myOrientation = theOrientedPlane->GetOrientation(); - myDistance = theOrientedPlane->GetDistance(); + myPlaneSource->SetNormal(theOrientedPlane->myPlaneSource->GetNormal()); + myPlaneSource->SetOrigin(theOrientedPlane->myPlaneSource->GetOrigin()); + myPlaneSource->SetPoint1(theOrientedPlane->myPlaneSource->GetPoint1()); + myPlaneSource->SetPoint2(theOrientedPlane->myPlaneSource->GetPoint2()); +} - myAngle[0] = theOrientedPlane->myAngle[0]; - myAngle[1] = theOrientedPlane->myAngle[1]; +SMESH::OrientedPlane::OrientedPlane(SVTK_ViewWindow* theViewWindow): + myViewWindow(theViewWindow), + myOrientation(SMESH::XY), + myDistance(0.5) +{ + Init(); + myViewWindow->AddActor(myActor); +} - myPlaneSource->SetNormal(theOrientedPlane->myPlaneSource->GetNormal()); - myPlaneSource->SetOrigin(theOrientedPlane->myPlaneSource->GetOrigin()); - myPlaneSource->SetPoint1(theOrientedPlane->myPlaneSource->GetPoint1()); - myPlaneSource->SetPoint2(theOrientedPlane->myPlaneSource->GetPoint2()); - } +SMESH::OrientedPlane::OrientedPlane(): + myOrientation(SMESH::XY), + myViewWindow(NULL), + myDistance(0.5) +{ + Init(); +} -protected: - OrientedPlane(SVTK_ViewWindow* theViewWindow): - myViewWindow(theViewWindow), - myOrientation(SMESH::XY), - myDistance(0.5) - { - Init(); - myViewWindow->AddActor(myActor); - } +void SMESH::OrientedPlane::Init() +{ + myPlaneSource = vtkPlaneSource::New(); + + myAngle[0] = myAngle[1] = 0.0; + + // Create and display actor + myMapper = vtkDataSetMapper::New(); + myMapper->SetInput(myPlaneSource->GetOutput()); + + myActor = SALOME_Actor::New(); + myActor->VisibilityOff(); + myActor->PickableOff(); + myActor->SetInfinitive(true); + myActor->SetMapper(myMapper); + + vtkFloatingPointType anRGB[3]; + vtkProperty* aProp = vtkProperty::New(); + SMESH::GetColor( "SMESH", "fill_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) ); + aProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + aProp->SetOpacity(0.75); + myActor->SetProperty(aProp); + aProp->Delete(); + + vtkProperty* aBackProp = vtkProperty::New(); + SMESH::GetColor( "SMESH", "backface_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 0, 255 ) ); + aBackProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + aBackProp->SetOpacity(0.75); + myActor->SetBackfaceProperty(aBackProp); + aBackProp->Delete(); +} - OrientedPlane(): - myOrientation(SMESH::XY), - myViewWindow(NULL), - myDistance(0.5) - { - Init(); - } +SMESH::OrientedPlane::~OrientedPlane() +{ + if (myViewWindow) + myViewWindow->RemoveActor(myActor); + myActor->Delete(); + + myMapper->RemoveAllInputs(); + myMapper->Delete(); - void Init() - { - myPlaneSource = vtkPlaneSource::New(); - - myAngle[0] = myAngle[1] = 0.0; - - // Create and display actor - myMapper = vtkDataSetMapper::New(); - myMapper->SetInput(myPlaneSource->GetOutput()); - - myActor = SALOME_Actor::New(); - myActor->VisibilityOff(); - myActor->PickableOff(); - myActor->SetInfinitive(true); - myActor->SetMapper(myMapper); - - vtkFloatingPointType anRGB[3]; - vtkProperty* aProp = vtkProperty::New(); - SMESH::GetColor( "SMESH", "fill_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) ); - aProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - aProp->SetOpacity(0.75); - myActor->SetProperty(aProp); - aProp->Delete(); - - vtkProperty* aBackProp = vtkProperty::New(); - SMESH::GetColor( "SMESH", "backface_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 0, 255 ) ); - aBackProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); - aBackProp->SetOpacity(0.75); - myActor->SetBackfaceProperty(aBackProp); - aBackProp->Delete(); - } + // commented: porting to vtk 5.0 + // myPlaneSource->UnRegisterAllOutputs(); + myPlaneSource->Delete(); +} - ~OrientedPlane(){ - if (myViewWindow) - myViewWindow->RemoveActor(myActor); - myActor->Delete(); - - myMapper->RemoveAllInputs(); - myMapper->Delete(); +//================================================================================= +// class : ActorItem +// purpose : +//================================================================================= +class ActorItem : public QListWidgetItem +{ +public: + ActorItem( SMESH_Actor* theActor, const QString& theName, QListWidget* theListWidget ) : + QListWidgetItem( theName, theListWidget ), + myActor( theActor ) {} - // commented: porting to vtk 5.0 - // myPlaneSource->UnRegisterAllOutputs(); - myPlaneSource->Delete(); - }; + SMESH_Actor* getActor() const { return myActor; } private: - // Not implemented. - OrientedPlane (const OrientedPlane&); - void operator= (const OrientedPlane&); - + SMESH_Actor* myActor; }; -struct TSetVisiblity { - TSetVisiblity(int theIsVisible): myIsVisible(theIsVisible){} - void operator()(SMESH::TVTKPlane& theOrientedPlane){ - theOrientedPlane->myActor->SetVisibility(myIsVisible); +//================================================================================= +// class : TSetVisibility +// purpose : +//================================================================================= +struct TSetVisibility { + TSetVisibility(int theIsVisible): myIsVisible(theIsVisible){} + void operator()(SMESH::TPlaneData& thePlaneData){ + thePlaneData.Plane.GetPointer()->myActor->SetVisibility(myIsVisible); } int myIsVisible; }; @@ -200,13 +203,13 @@ struct TSetVisiblity { // used in SMESHGUI::restoreVisualParameters() to avoid // declaration of OrientedPlane outside of SMESHGUI_ClippingDlg.cxx //================================================================================= -void SMESHGUI_ClippingDlg::AddPlane (SMESH_Actor* theActor, - SVTK_ViewWindow* theViewWindow, - SMESH::Orientation theOrientation, - double theDistance, - vtkFloatingPointType theAngle[2]) +SMESH::OrientedPlane* SMESHGUI_ClippingDlg::AddPlane (SMESH::TActorList theActorList, + SVTK_ViewWindow* theViewWindow, + SMESH::Orientation theOrientation, + double theDistance, + const vtkFloatingPointType theAngle[2]) { - OrientedPlane* aPlane = OrientedPlane::New(theViewWindow); + SMESH::OrientedPlane* aPlane = SMESH::OrientedPlane::New(theViewWindow); aPlane->myAngle[0] = theAngle[0]; aPlane->myAngle[1] = theAngle[1]; @@ -256,14 +259,26 @@ void SMESHGUI_ClippingDlg::AddPlane (SMESH_Actor* theActor, vtkMath::Cross(aNormal,aDir[1],aDir[0]); } - // ??? - theActor->SetPlaneParam(aNormal, theDistance, aPlane); + vtkFloatingPointType aBounds[6]; + vtkFloatingPointType anOrigin[3]; + bool anIsOk = SMESH::ComputeClippingPlaneParameters( theActorList, + aNormal, + theDistance, + aBounds, + anOrigin ); + if( !anIsOk ) + return NULL; - vtkDataSet* aDataSet = theActor->GetInput(); - vtkFloatingPointType *aPnt = aDataSet->GetCenter(); + aPlane->SetNormal( aNormal ); + aPlane->SetOrigin( anOrigin ); - vtkFloatingPointType* anOrigin = aPlane->GetOrigin(); - vtkFloatingPointType aDel = aDataSet->GetLength()/2.0; + vtkFloatingPointType aPnt[3] = { ( aBounds[0] + aBounds[1] ) / 2., + ( aBounds[2] + aBounds[3] ) / 2., + ( aBounds[4] + aBounds[5] ) / 2. }; + + vtkFloatingPointType aDel = pow( pow( aBounds[1] - aBounds[0], 2 ) + + pow( aBounds[3] - aBounds[2], 2 ) + + pow( aBounds[5] - aBounds[4], 2 ), 0.5 ); vtkFloatingPointType aDelta[2][3] = {{aDir[0][0]*aDel, aDir[0][1]*aDel, aDir[0][2]*aDel}, {aDir[1][0]*aDel, aDir[1][1]*aDel, aDir[1][2]*aDel}}; @@ -299,28 +314,13 @@ void SMESHGUI_ClippingDlg::AddPlane (SMESH_Actor* theActor, aPlaneSource->SetPoint1(aPnt1[0],aPnt1[1],aPnt1[2]); aPlaneSource->SetPoint2(aPnt2[0],aPnt2[1],aPnt2[2]); - theActor->AddClippingPlane(aPlane); - aPlane->Delete(); -} + SMESH::TActorList::iterator anIter = theActorList.begin(); + for ( ; anIter != theActorList.end(); anIter++ ) + if( vtkActor* aVTKActor = *anIter ) + if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( aVTKActor ) ) + anActor->AddClippingPlane( aPlane ); -//================================================================================= -// used in SMESHGUI::restoreVisualParameters() to avoid -// declaration of OrientedPlane outside of SMESHGUI_ClippingDlg.cxx -//================================================================================= -void SMESHGUI_ClippingDlg::GetPlaneParam (SMESH_Actor* theActor, - int thePlaneIndex, - SMESH::Orientation& theOrientation, - double& theDistance, - vtkFloatingPointType* theAngle) -{ - if (vtkPlane* aPln = theActor->GetClippingPlane(thePlaneIndex)) { - if (OrientedPlane* aPlane = OrientedPlane::SafeDownCast(aPln)) { - theOrientation = aPlane->GetOrientation(); - theDistance = aPlane->GetDistance(); - theAngle[0] = aPlane->myAngle[0]; - theAngle[1] = aPlane->myAngle[1]; - } - } + return aPlane; } //================================================================================= @@ -328,11 +328,10 @@ void SMESHGUI_ClippingDlg::GetPlaneParam (SMESH_Actor* theActor, // purpose : // //================================================================================= -SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule ): +SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule, SVTK_ViewWindow* theViewWindow ): QDialog( SMESH::GetDesktop(theModule) ), - mySelector(SMESH::GetViewWindow(theModule)->GetSelector()), - mySelectionMgr(SMESH::GetSelectionMgr(theModule)), - mySMESHGUI(theModule) + mySMESHGUI(theModule), + myViewWindow(theViewWindow) { setModal( false ); setAttribute( Qt::WA_DeleteOnClose, true ); @@ -345,7 +344,7 @@ SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule ): // Controls for selecting, creating, deleting planes QGroupBox* GroupPlanes = new QGroupBox(tr("CLIP_PLANES"), this); - QHBoxLayout* GroupPlanesLayout = new QHBoxLayout(GroupPlanes); + QGridLayout* GroupPlanesLayout = new QGridLayout(GroupPlanes); GroupPlanesLayout->setSpacing(SPACING); GroupPlanesLayout->setMargin(MARGIN); @@ -355,10 +354,21 @@ SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule ): buttonDelete = new QPushButton(tr("SMESH_BUT_DELETE"), GroupPlanes); - GroupPlanesLayout->addWidget(ComboBoxPlanes); - GroupPlanesLayout->addStretch(); - GroupPlanesLayout->addWidget(buttonNew); - GroupPlanesLayout->addWidget(buttonDelete); + QLabel* aLabel = new QLabel(tr("MESHES_SUBMESHES_GROUPS"), GroupPlanes); + + ActorList = new QListWidget(GroupPlanes); + ActorList->setSelectionMode(QAbstractItemView::SingleSelection); + + SelectAllCheckBox = new QCheckBox(tr("SELECT_ALL"), GroupPlanes); + + GroupPlanesLayout->addWidget(ComboBoxPlanes, 0, 0); + GroupPlanesLayout->addWidget(new QWidget(), 0, 1); + GroupPlanesLayout->addWidget(buttonNew, 0, 2); + GroupPlanesLayout->addWidget(buttonDelete, 0, 3); + GroupPlanesLayout->addWidget(aLabel, 1, 0, 1, 4); + GroupPlanesLayout->addWidget(ActorList, 2, 0, 1, 4); + GroupPlanesLayout->addWidget(SelectAllCheckBox, 3, 0, 1, 4); + GroupPlanesLayout->setColumnStretch( 1, 1 ); // Controls for defining plane parameters QGroupBox* GroupParameters = new QGroupBox(tr("SMESH_PARAMETERS"), this); @@ -437,9 +447,10 @@ SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule ): SpinBoxDistance->SetValue(0.5); - myActor = 0; myIsSelectPlane = false; - onSelectionChanged(); + + initializePlaneData(); + synchronize(); myHelpFileName = "clipping_page.html"; @@ -447,6 +458,8 @@ SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule ): connect(ComboBoxPlanes, SIGNAL(activated(int)), this, SLOT(onSelectPlane(int))); connect(buttonNew, SIGNAL(clicked()), this, SLOT(ClickOnNew())); connect(buttonDelete, SIGNAL(clicked()), this, SLOT(ClickOnDelete())); + connect(ActorList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(onActorItemChanged(QListWidgetItem*))); + connect(SelectAllCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onSelectAll(int))); connect(ComboBoxOrientation, SIGNAL(activated(int)), this, SLOT(onSelectOrientation(int))); connect(SpinBoxDistance, SIGNAL(valueChanged(double)), this, SLOT(SetCurrentPlaneParam())); connect(SpinBoxRot1, SIGNAL(valueChanged(double)), this, SLOT(SetCurrentPlaneParam())); @@ -458,7 +471,6 @@ SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule ): connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply())); connect(buttonHelp, SIGNAL(clicked()), this, SLOT(ClickOnHelp())); connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); - connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onSelectionChanged())); /* to close dialog if study frame change */ connect(mySMESHGUI, SIGNAL (SignalStudyFrameChanged()), this, SLOT(ClickOnCancel())); @@ -472,10 +484,9 @@ SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule ): SMESHGUI_ClippingDlg::~SMESHGUI_ClippingDlg() { // no need to delete child widgets, Qt does it all for us - std::for_each(myPlanes.begin(),myPlanes.end(),TSetVisiblity(false)); - if (mySMESHGUI) - if (SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow(mySMESHGUI)) - SMESH::RenderViewWindow(aViewWindow); + std::for_each(myPlanes.begin(),myPlanes.end(),TSetVisibility(false)); + if (myViewWindow) + SMESH::RenderViewWindow(myViewWindow); } double SMESHGUI_ClippingDlg::getDistance() const @@ -504,27 +515,56 @@ double SMESHGUI_ClippingDlg::getRotation2() const //======================================================================= void SMESHGUI_ClippingDlg::ClickOnApply() { - if (!myActor) - return; - - if (SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow(mySMESHGUI)) { + if (myViewWindow) { SUIT_OverrideCursor wc; QWidget *aCurrWid = this->focusWidget(); aCurrWid->clearFocus(); aCurrWid->setFocus(); - myActor->RemoveAllClippingPlanes(); - - SMESH::TPlanes::iterator anIter = myPlanes.begin(); - for ( ; anIter != myPlanes.end(); anIter++) { - OrientedPlane* anOrientedPlane = OrientedPlane::New(aViewWindow); - anOrientedPlane->ShallowCopy(anIter->GetPointer()); - myActor->AddClippingPlane(anOrientedPlane); - anOrientedPlane->Delete(); + SMESHGUI_ClippingPlaneInfoMap& aClippingPlaneInfoMap = mySMESHGUI->getClippingPlaneInfoMap(); + SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = aClippingPlaneInfoMap[ myViewWindow->getViewManager() ]; + + // clean memory allocated for planes + SMESHGUI_ClippingPlaneInfoList::iterator anIter1 = aClippingPlaneInfoList.begin(); + for( ; anIter1 != aClippingPlaneInfoList.end(); anIter1++ ) + if( SMESH::OrientedPlane* aPlane = (*anIter1).Plane ) + aPlane->Delete(); + + aClippingPlaneInfoList.clear(); + + VTK::ActorCollectionCopy aCopy( myViewWindow->getRenderer()->GetActors() ); + vtkActorCollection* anAllActors = aCopy.GetActors(); + anAllActors->InitTraversal(); + while( vtkActor* aVTKActor = anAllActors->GetNextActor() ) + if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( aVTKActor ) ) + anActor->RemoveAllClippingPlanes(); + + SMESH::TPlaneDataVector::iterator anIter2 = myPlanes.begin(); + for( ; anIter2 != myPlanes.end(); anIter2++ ) { + SMESH::TPlaneData aPlaneData = *anIter2; + SMESH::TPlane aPlane = aPlaneData.Plane; + SMESH::TActorList anActorList = aPlaneData.ActorList; + if( anActorList.empty() ) + continue; + + SMESH::OrientedPlane* anOrientedPlane = SMESH::OrientedPlane::New(myViewWindow); + anOrientedPlane->ShallowCopy(aPlane.GetPointer()); + + SMESH::TActorList::iterator anIter3 = anActorList.begin(); + for( ; anIter3 != anActorList.end(); anIter3++ ) + if( vtkActor* aVTKActor = *anIter3 ) + if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( aVTKActor ) ) + anActor->AddClippingPlane(anOrientedPlane); + + SMESH::ClippingPlaneInfo aClippingPlaneInfo; + aClippingPlaneInfo.Plane = anOrientedPlane; + aClippingPlaneInfo.ActorList = anActorList; + + aClippingPlaneInfoList.push_back( aClippingPlaneInfo ); } - SMESH::RenderViewWindow(aViewWindow); + SMESH::RenderViewWindow( myViewWindow ); } } @@ -571,53 +611,17 @@ void SMESHGUI_ClippingDlg::ClickOnHelp() } } -//================================================================================= -// function : onSelectionChanged() -// purpose : Called when selection is changed -//================================================================================= -void SMESHGUI_ClippingDlg::onSelectionChanged() -{ - if (SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow(mySMESHGUI)) { - const SALOME_ListIO& aList = mySelector->StoredIObjects(); - if (aList.Extent() > 0) { - Handle(SALOME_InteractiveObject) IOS = aList.First(); - myActor = SMESH::FindActorByEntry(IOS->getEntry()); - if (myActor) { - std::for_each(myPlanes.begin(),myPlanes.end(),TSetVisiblity(false)); - myPlanes.clear(); - - vtkIdType anId = 0, anEnd = myActor->GetNumberOfClippingPlanes(); - for ( ; anId < anEnd; anId++) { - if (vtkImplicitFunction* aFunction = myActor->GetClippingPlane(anId)) { - if(OrientedPlane* aPlane = OrientedPlane::SafeDownCast(aFunction)){ - OrientedPlane* anOrientedPlane = OrientedPlane::New(aViewWindow); - SMESH::TVTKPlane aTVTKPlane(anOrientedPlane); - anOrientedPlane->Delete(); - aTVTKPlane->ShallowCopy(aPlane); - myPlanes.push_back(aTVTKPlane); - } - } - } - - std::for_each(myPlanes.begin(),myPlanes.end(), - TSetVisiblity(PreviewCheckBox->isChecked())); - } - } - SMESH::RenderViewWindow(aViewWindow); - } - Sinchronize(); -} - //======================================================================= // function : onSelectPlane() // purpose : //======================================================================= void SMESHGUI_ClippingDlg::onSelectPlane (int theIndex) { - if (!myActor || myPlanes.empty()) + if (myPlanes.empty()) return; - OrientedPlane* aPlane = myPlanes[theIndex].GetPointer(); + SMESH::TPlaneData aPlaneData = myPlanes[theIndex]; + SMESH::OrientedPlane* aPlane = aPlaneData.Plane.GetPointer(); // Orientation SMESH::Orientation anOrientation = aPlane->GetOrientation(); @@ -644,6 +648,11 @@ void SMESHGUI_ClippingDlg::onSelectPlane (int theIndex) break; } myIsSelectPlane = false; + + // Actors + bool anIsBlocked = ActorList->blockSignals( true ); + updateActorList(); + ActorList->blockSignals( anIsBlocked ); } //======================================================================= @@ -652,19 +661,31 @@ void SMESHGUI_ClippingDlg::onSelectPlane (int theIndex) //======================================================================= void SMESHGUI_ClippingDlg::ClickOnNew() { - if (!myActor) - return; + if(myViewWindow){ + SMESH::OrientedPlane* aPlane = SMESH::OrientedPlane::New(myViewWindow); + SMESH::TPlane aTPlane(aPlane); + + SMESH::TActorList anActorList; + VTK::ActorCollectionCopy aCopy( myViewWindow->getRenderer()->GetActors() ); + vtkActorCollection* anAllActors = aCopy.GetActors(); + anAllActors->InitTraversal(); + while( vtkActor* aVTKActor = anAllActors->GetNextActor() ) + if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( aVTKActor ) ) + anActorList.push_back( anActor ); - if(SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow(mySMESHGUI)){ - OrientedPlane* aPlane = OrientedPlane::New(aViewWindow); - SMESH::TVTKPlane aTVTKPlane(aPlane); - myPlanes.push_back(aTVTKPlane); + SMESH::TPlaneData aPlaneData(aTPlane, anActorList); + + myPlanes.push_back(aPlaneData); if (PreviewCheckBox->isChecked()) - aTVTKPlane->myActor->VisibilityOn(); - - Sinchronize(); + aTPlane->myActor->VisibilityOn(); + + bool anIsBlocked = ActorList->blockSignals( true ); + + synchronize(); SetCurrentPlaneParam(); + + ActorList->blockSignals( anIsBlocked ); } } @@ -674,20 +695,105 @@ void SMESHGUI_ClippingDlg::ClickOnNew() //======================================================================= void SMESHGUI_ClippingDlg::ClickOnDelete() { - if (!myActor || myPlanes.empty()) + if (myPlanes.empty()) return; int aPlaneIndex = ComboBoxPlanes->currentIndex(); - SMESH::TPlanes::iterator anIter = myPlanes.begin() + aPlaneIndex; - anIter->GetPointer()->myActor->SetVisibility(false); + SMESH::TPlaneDataVector::iterator anIter = myPlanes.begin() + aPlaneIndex; + SMESH::TPlaneData aPlaneData = *anIter; + aPlaneData.Plane.GetPointer()->myActor->SetVisibility(false); myPlanes.erase(anIter); if(AutoApplyCheckBox->isChecked()) ClickOnApply(); - Sinchronize(); - SMESH::RenderViewWindow(SMESH::GetCurrentVtkView()); + synchronize(); + SMESH::RenderViewWindow( myViewWindow ); +} + +//======================================================================= +// function : updateActorItem() +// purpose : +//======================================================================= +void SMESHGUI_ClippingDlg::updateActorItem( QListWidgetItem* theItem, + bool theUpdateSelectAll, + bool theUpdateClippingPlaneMap ) +{ + // update Select All check box + if( theUpdateSelectAll ) { + int aNbItems = ActorList->count(), aNbChecked = 0; + for( int i = 0; i < aNbItems; i++ ) + if( QListWidgetItem* anItem = ActorList->item( i ) ) + if( anItem->checkState() == Qt::Checked ) + aNbChecked++; + + Qt::CheckState aCheckState = Qt::Unchecked; + if( aNbChecked == aNbItems ) + aCheckState = Qt::Checked; + else if( aNbChecked > 0 ) + aCheckState = Qt::PartiallyChecked; + + bool anIsBlocked = SelectAllCheckBox->blockSignals( true ); + SelectAllCheckBox->setCheckState( aCheckState ); + SelectAllCheckBox->blockSignals( anIsBlocked ); + } + + // update clipping plane map + if( theUpdateClippingPlaneMap ) { + int aCurPlaneIndex = ComboBoxPlanes->currentIndex(); + if( ActorItem* anItem = dynamic_cast( theItem ) ) { + if( SMESH_Actor* anActor = anItem->getActor() ) { + SMESH::TPlaneData& aPlaneData = myPlanes[ aCurPlaneIndex ]; + SMESH::TActorList& anActorList = aPlaneData.ActorList; + bool anIsPushed = false; + SMESH::TActorList::iterator anIter = anActorList.begin(); + for ( ; anIter != anActorList.end(); anIter++ ) { + if( anActor == *anIter ) { + anIsPushed = true; + break; + } + } + if( theItem->checkState() == Qt::Checked && !anIsPushed ) + anActorList.push_back( anActor ); + else if( theItem->checkState() == Qt::Unchecked && anIsPushed ) + anActorList.remove( anActor ); + } + } + } +} + +//======================================================================= +// function : onActorItemChanged() +// purpose : +//======================================================================= +void SMESHGUI_ClippingDlg::onActorItemChanged( QListWidgetItem* theItem ) +{ + updateActorItem( theItem, true, true ); + SetCurrentPlaneParam(); +} + +//======================================================================= +// function : onSelectAll() +// purpose : +//======================================================================= +void SMESHGUI_ClippingDlg::onSelectAll( int theState ) +{ + if( theState == Qt::PartiallyChecked ) { + SelectAllCheckBox->setCheckState( Qt::Checked ); + return; + } + + bool anIsBlocked = ActorList->blockSignals( true ); + for( int i = 0, n = ActorList->count(); i < n; i++ ) { + if( QListWidgetItem* anItem = ActorList->item( i ) ) { + anItem->setCheckState( theState == Qt::Checked ? Qt::Checked : Qt::Unchecked ); + updateActorItem( anItem, false, true ); + } + } + SelectAllCheckBox->setTristate( false ); + ActorList->blockSignals( anIsBlocked ); + SetCurrentPlaneParam(); } //======================================================================= @@ -717,10 +823,10 @@ void SMESHGUI_ClippingDlg::onSelectOrientation (int theItem) } //======================================================================= -// function : Sinchronize() +// function : synchronize() // purpose : //======================================================================= -void SMESHGUI_ClippingDlg::Sinchronize() +void SMESHGUI_ClippingDlg::synchronize() { int aNbPlanes = myPlanes.size(); ComboBoxPlanes->clear(); @@ -737,17 +843,22 @@ void SMESHGUI_ClippingDlg::Sinchronize() bool anIsControlsEnable = (aPos >= 0); if (anIsControlsEnable) { onSelectPlane(aPos); + updateActorList(); } else { ComboBoxPlanes->addItem(tr("NO_PLANES")); + ActorList->clear(); SpinBoxRot1->SetValue(0.0); SpinBoxRot2->SetValue(0.0); SpinBoxDistance->SetValue(0.5); } + ActorList->setEnabled(anIsControlsEnable); + SelectAllCheckBox->setEnabled(anIsControlsEnable); buttonDelete->setEnabled(anIsControlsEnable); - buttonApply->setEnabled(anIsControlsEnable); - PreviewCheckBox->setEnabled(anIsControlsEnable); - AutoApplyCheckBox->setEnabled(anIsControlsEnable); + // the following 3 controls should be enabled + //buttonApply->setEnabled(anIsControlsEnable); + //PreviewCheckBox->setEnabled(anIsControlsEnable); + //AutoApplyCheckBox->setEnabled(anIsControlsEnable); ComboBoxOrientation->setEnabled(anIsControlsEnable); SpinBoxDistance->setEnabled(anIsControlsEnable); SpinBoxRot1->setEnabled(anIsControlsEnable); @@ -775,7 +886,8 @@ void SMESHGUI_ClippingDlg::SetCurrentPlaneParam() int aCurPlaneIndex = ComboBoxPlanes->currentIndex(); - OrientedPlane* aPlane = myPlanes[aCurPlaneIndex].GetPointer(); + SMESH::TPlaneData aPlaneData = myPlanes[aCurPlaneIndex]; + SMESH::OrientedPlane* aPlane = aPlaneData.Plane.GetPointer(); vtkFloatingPointType aNormal[3]; SMESH::Orientation anOrientation; @@ -833,52 +945,69 @@ void SMESHGUI_ClippingDlg::SetCurrentPlaneParam() aPlane->SetOrientation(anOrientation); aPlane->SetDistance(getDistance()); - myActor->SetPlaneParam(aNormal, getDistance(), aPlane); - - vtkDataSet* aDataSet = myActor->GetInput(); - vtkFloatingPointType *aPnt = aDataSet->GetCenter(); - - vtkFloatingPointType* anOrigin = aPlane->GetOrigin(); - vtkFloatingPointType aDel = aDataSet->GetLength()/2.0; - - vtkFloatingPointType aDelta[2][3] = {{aDir[0][0]*aDel, aDir[0][1]*aDel, aDir[0][2]*aDel}, - {aDir[1][0]*aDel, aDir[1][1]*aDel, aDir[1][2]*aDel}}; - vtkFloatingPointType aParam, aPnt0[3], aPnt1[3], aPnt2[3]; - - vtkFloatingPointType aPnt01[3] = {aPnt[0] - aDelta[0][0] - aDelta[1][0], - aPnt[1] - aDelta[0][1] - aDelta[1][1], - aPnt[2] - aDelta[0][2] - aDelta[1][2]}; - vtkFloatingPointType aPnt02[3] = {aPnt01[0] + aNormal[0], - aPnt01[1] + aNormal[1], - aPnt01[2] + aNormal[2]}; - vtkPlane::IntersectWithLine(aPnt01,aPnt02,aNormal,anOrigin,aParam,aPnt0); - - vtkFloatingPointType aPnt11[3] = {aPnt[0] - aDelta[0][0] + aDelta[1][0], - aPnt[1] - aDelta[0][1] + aDelta[1][1], - aPnt[2] - aDelta[0][2] + aDelta[1][2]}; - vtkFloatingPointType aPnt12[3] = {aPnt11[0] + aNormal[0], - aPnt11[1] + aNormal[1], - aPnt11[2] + aNormal[2]}; - vtkPlane::IntersectWithLine(aPnt11,aPnt12,aNormal,anOrigin,aParam,aPnt1); - - vtkFloatingPointType aPnt21[3] = {aPnt[0] + aDelta[0][0] - aDelta[1][0], - aPnt[1] + aDelta[0][1] - aDelta[1][1], - aPnt[2] + aDelta[0][2] - aDelta[1][2]}; - vtkFloatingPointType aPnt22[3] = {aPnt21[0] + aNormal[0], - aPnt21[1] + aNormal[1], - aPnt21[2] + aNormal[2]}; - vtkPlane::IntersectWithLine(aPnt21,aPnt22,aNormal,anOrigin,aParam,aPnt2); - - vtkPlaneSource* aPlaneSource = aPlane->myPlaneSource; - aPlaneSource->SetNormal(aNormal[0],aNormal[1],aNormal[2]); - aPlaneSource->SetOrigin(aPnt0[0],aPnt0[1],aPnt0[2]); - aPlaneSource->SetPoint1(aPnt1[0],aPnt1[1],aPnt1[2]); - aPlaneSource->SetPoint2(aPnt2[0],aPnt2[1],aPnt2[2]); + SMESH::TActorList anActorList = aPlaneData.ActorList; + + vtkFloatingPointType aBounds[6]; + vtkFloatingPointType anOrigin[3]; + bool anIsOk = SMESH::ComputeClippingPlaneParameters( anActorList, + aNormal, + getDistance(), + aBounds, + anOrigin ); + + aPlane->myActor->SetVisibility( anIsOk && PreviewCheckBox->isChecked() ); + + if( anIsOk ) { + aPlane->SetNormal( aNormal ); + aPlane->SetOrigin( anOrigin ); + + vtkFloatingPointType aPnt[3] = { ( aBounds[0] + aBounds[1] ) / 2., + ( aBounds[2] + aBounds[3] ) / 2., + ( aBounds[4] + aBounds[5] ) / 2. }; + + vtkFloatingPointType aDel = pow( pow( aBounds[1] - aBounds[0], 2 ) + + pow( aBounds[3] - aBounds[2], 2 ) + + pow( aBounds[5] - aBounds[4], 2 ), 0.5 ); + + vtkFloatingPointType aDelta[2][3] = {{aDir[0][0]*aDel, aDir[0][1]*aDel, aDir[0][2]*aDel}, + {aDir[1][0]*aDel, aDir[1][1]*aDel, aDir[1][2]*aDel}}; + vtkFloatingPointType aParam, aPnt0[3], aPnt1[3], aPnt2[3]; + + vtkFloatingPointType aPnt01[3] = {aPnt[0] - aDelta[0][0] - aDelta[1][0], + aPnt[1] - aDelta[0][1] - aDelta[1][1], + aPnt[2] - aDelta[0][2] - aDelta[1][2]}; + vtkFloatingPointType aPnt02[3] = {aPnt01[0] + aNormal[0], + aPnt01[1] + aNormal[1], + aPnt01[2] + aNormal[2]}; + vtkPlane::IntersectWithLine(aPnt01,aPnt02,aNormal,anOrigin,aParam,aPnt0); + + vtkFloatingPointType aPnt11[3] = {aPnt[0] - aDelta[0][0] + aDelta[1][0], + aPnt[1] - aDelta[0][1] + aDelta[1][1], + aPnt[2] - aDelta[0][2] + aDelta[1][2]}; + vtkFloatingPointType aPnt12[3] = {aPnt11[0] + aNormal[0], + aPnt11[1] + aNormal[1], + aPnt11[2] + aNormal[2]}; + vtkPlane::IntersectWithLine(aPnt11,aPnt12,aNormal,anOrigin,aParam,aPnt1); + + vtkFloatingPointType aPnt21[3] = {aPnt[0] + aDelta[0][0] - aDelta[1][0], + aPnt[1] + aDelta[0][1] - aDelta[1][1], + aPnt[2] + aDelta[0][2] - aDelta[1][2]}; + vtkFloatingPointType aPnt22[3] = {aPnt21[0] + aNormal[0], + aPnt21[1] + aNormal[1], + aPnt21[2] + aNormal[2]}; + vtkPlane::IntersectWithLine(aPnt21,aPnt22,aNormal,anOrigin,aParam,aPnt2); + + vtkPlaneSource* aPlaneSource = aPlane->myPlaneSource; + aPlaneSource->SetNormal(aNormal[0],aNormal[1],aNormal[2]); + aPlaneSource->SetOrigin(aPnt0[0],aPnt0[1],aPnt0[2]); + aPlaneSource->SetPoint1(aPnt1[0],aPnt1[1],aPnt1[2]); + aPlaneSource->SetPoint2(aPnt2[0],aPnt2[1],aPnt2[2]); + } if(AutoApplyCheckBox->isChecked()) ClickOnApply(); - SMESH::RenderViewWindow(SMESH::GetCurrentVtkView()); + SMESH::RenderViewWindow( myViewWindow ); } //======================================================================= @@ -887,8 +1016,8 @@ void SMESHGUI_ClippingDlg::SetCurrentPlaneParam() //======================================================================= void SMESHGUI_ClippingDlg::OnPreviewToggle (bool theIsToggled) { - std::for_each(myPlanes.begin(),myPlanes.end(),TSetVisiblity(theIsToggled)); - SMESH::RenderViewWindow(SMESH::GetCurrentVtkView()); + std::for_each(myPlanes.begin(),myPlanes.end(),TSetVisibility(theIsToggled)); + SMESH::RenderViewWindow( myViewWindow ); } //================================================================================= @@ -906,3 +1035,124 @@ void SMESHGUI_ClippingDlg::keyPressEvent( QKeyEvent* e ) ClickOnHelp(); } } + +//================================================================================= +// function : initializePlaneData() +// purpose : +//================================================================================= +void SMESHGUI_ClippingDlg::initializePlaneData() +{ + const SMESHGUI_ClippingPlaneInfoMap& aClippingPlaneInfoMap = mySMESHGUI->getClippingPlaneInfoMap(); + SMESHGUI_ClippingPlaneInfoMap::const_iterator anIter1 = aClippingPlaneInfoMap.find( myViewWindow->getViewManager() ); + if( anIter1 != aClippingPlaneInfoMap.end() ) { + const SMESHGUI_ClippingPlaneInfoList& aClippingPlaneInfoList = anIter1->second; + SMESHGUI_ClippingPlaneInfoList::const_iterator anIter2 = aClippingPlaneInfoList.begin(); + for( ; anIter2 != aClippingPlaneInfoList.end(); anIter2++ ) { + const SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter2; + SMESH::TPlane aTPlane( aClippingPlaneInfo.Plane ); + SMESH::TPlaneData aPlaneData( aTPlane, aClippingPlaneInfo.ActorList ); + myPlanes.push_back( aPlaneData ); + } + } + std::for_each( myPlanes.begin(),myPlanes.end(), TSetVisibility( PreviewCheckBox->isChecked() ) ); +} + +//================================================================================= +// function : updateActorList() +// purpose : +//================================================================================= +void SMESHGUI_ClippingDlg::updateActorList() +{ + ActorList->clear(); + + SalomeApp_Study* anAppStudy = SMESHGUI::activeStudy(); + if( !anAppStudy ) + return; + + _PTR(Study) aStudy = anAppStudy->studyDS(); + if( !aStudy ) + return; + + if( !myViewWindow ) + return; + + int aCurPlaneIndex = ComboBoxPlanes->currentIndex(); + const SMESH::TPlaneData& aPlaneData = myPlanes[ aCurPlaneIndex ]; + const SMESH::TActorList& anActorList = aPlaneData.ActorList; + + VTK::ActorCollectionCopy aCopy( myViewWindow->getRenderer()->GetActors() ); + vtkActorCollection* anAllActors = aCopy.GetActors(); + anAllActors->InitTraversal(); + while( vtkActor* aVTKActor = anAllActors->GetNextActor() ) { + if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( aVTKActor ) ) { + if( anActor->hasIO() ) { + Handle(SALOME_InteractiveObject) anIO = anActor->getIO(); + if( _PTR(SObject) aSObj = aStudy->FindObjectID( anIO->getEntry() ) ) { + bool anIsChecked = false; + SMESH::TActorList::const_iterator anIter = anActorList.begin(); + for ( ; anIter != anActorList.end(); anIter++ ) { + if( vtkActor* aVTKActorRef = *anIter ) { + if( SMESH_Actor* anActorRef = SMESH_Actor::SafeDownCast( aVTKActorRef ) ) { + if( anActorRef == anActor ) { + anIsChecked = true; + break; + } + } + } + } + QString aName = QString( aSObj->GetName().c_str() ); + QListWidgetItem* anItem = new ActorItem( anActor, aName, ActorList ); + anItem->setCheckState( anIsChecked ? Qt::Checked : Qt::Unchecked ); + updateActorItem( anItem, true, false ); + } + } + } + } +} + +//================================================================================= +// function : getCurrentActors() +// purpose : +//================================================================================= +SMESH::TActorList SMESHGUI_ClippingDlg::getCurrentActors() +{ + SMESH::TActorList anActorList; + for( int i = 0, n = ActorList->count(); i < n; i++ ) + if( ActorItem* anItem = dynamic_cast( ActorList->item( i ) ) ) + if( anItem->checkState() == Qt::Checked ) + if( SMESH_Actor* anActor = anItem->getActor() ) + anActorList.push_back( anActor ); + return anActorList; +} + +//================================================================================= +// function : dumpPlaneData() +// purpose : +//================================================================================= +void SMESHGUI_ClippingDlg::dumpPlaneData() const +{ + printf( "----------- Plane Data -----------\n" ); + int anId = 1; + SMESH::TPlaneDataVector::const_iterator anIter1 = myPlanes.begin(); + for ( ; anIter1 != myPlanes.end(); anIter1++, anId++ ) { + SMESH::TPlaneData aPlaneData = *anIter1; + SMESH::TPlane aPlane = aPlaneData.Plane; + vtkFloatingPointType* aNormal = aPlane->GetNormal(); + vtkFloatingPointType* anOrigin = aPlane->GetOrigin(); + printf( "Plane N%d:\n", anId ); + printf( " Normal = ( %f, %f, %f )\n", aNormal[0], aNormal[1], aNormal[2] ); + printf( " Origin = ( %f, %f, %f )\n", anOrigin[0], anOrigin[1], anOrigin[2] ); + + SMESH::TActorList anActorList = aPlaneData.ActorList; + SMESH::TActorList::const_iterator anIter2 = anActorList.begin(); + for ( ; anIter2 != anActorList.end(); anIter2++ ) { + if( vtkActor* aVTKActor = *anIter2 ) { + if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( aVTKActor ) ) + printf( " - Actor: '%s'\n", anActor->getName() ); + } + else + printf( " - Actor: NULL\n"); + } + } + printf( "----------------------------------\n" ); +} diff --git a/src/SMESHGUI/SMESHGUI_ClippingDlg.h b/src/SMESHGUI/SMESHGUI_ClippingDlg.h index 0c70ca9c2..87a4b7b9d 100644 --- a/src/SMESHGUI/SMESHGUI_ClippingDlg.h +++ b/src/SMESHGUI/SMESHGUI_ClippingDlg.h @@ -35,31 +35,91 @@ // Qt includes #include +#include // VTK includes +#include #include // STL includes +#include +#include #include class QLabel; class QPushButton; class QCheckBox; class QComboBox; -class LightApp_SelectionMgr; -class SVTK_Selector; +class QListWidget; +class QListWidgetItem; +class SALOME_Actor; class SMESHGUI; class SMESH_Actor; -class OrientedPlane; class SMESHGUI_SpinBox; +class vtkActor; +class vtkDataSetMapper; +class vtkPlaneSource; namespace SMESH { - typedef vtkSmartPointer TVTKPlane; - typedef std::vector TPlanes; enum Orientation { XY, YZ, ZX }; -}; + class OrientedPlane: public vtkPlane + { + QPointer myViewWindow; + vtkDataSetMapper* myMapper; + + public: + static OrientedPlane *New(); + static OrientedPlane *New(SVTK_ViewWindow* theViewWindow); + vtkTypeMacro (OrientedPlane, vtkPlane); + + SMESH::Orientation myOrientation; + float myDistance; + double myAngle[2]; + + vtkPlaneSource* myPlaneSource; + SALOME_Actor *myActor; + + void SetOrientation (SMESH::Orientation theOrientation) { myOrientation = theOrientation; } + SMESH::Orientation GetOrientation() { return myOrientation; } + + void SetDistance (float theDistance) { myDistance = theDistance; } + float GetDistance() { return myDistance; } + + void ShallowCopy (OrientedPlane* theOrientedPlane); + + protected: + OrientedPlane(SVTK_ViewWindow* theViewWindow); + OrientedPlane(); + + void Init(); + + ~OrientedPlane(); + private: + // Not implemented. + OrientedPlane (const OrientedPlane&); + void operator= (const OrientedPlane&); + }; + + typedef vtkSmartPointer TPlane; + typedef std::list TActorList; + + struct TPlaneData + { + TPlaneData( TPlane thePlane, + TActorList theActorList ) + { + Plane = thePlane; + ActorList = theActorList; + } + TPlane Plane; + TActorList ActorList; + }; + + typedef std::vector TPlaneVector; + typedef std::vector TPlaneDataVector; +}; //================================================================================= // class : SMESHGUI_ClippingDlg @@ -70,7 +130,7 @@ class SMESHGUI_EXPORT SMESHGUI_ClippingDlg : public QDialog Q_OBJECT public: - SMESHGUI_ClippingDlg( SMESHGUI* ); + SMESHGUI_ClippingDlg( SMESHGUI*, SVTK_ViewWindow* ); ~SMESHGUI_ClippingDlg(); double getDistance() const; @@ -78,35 +138,42 @@ public: double getRotation1() const; double getRotation2() const; void setRotation( const double, const double ); - void Sinchronize(); // used in SMESHGUI::restoreVisualParameters() to avoid // declaration of OrientedPlane outside of SMESHGUI_ClippingDlg.cxx - static void AddPlane (SMESH_Actor* theActor, - SVTK_ViewWindow* theViewWindow, - SMESH::Orientation theOrientation, - double theDistance, - vtkFloatingPointType theAngle[2]); - - static void GetPlaneParam (SMESH_Actor* theActor, - int thePlaneIndex, - SMESH::Orientation& theOrientation, - double& theDistance, - vtkFloatingPointType* theAngle); + static SMESH::OrientedPlane* AddPlane (SMESH::TActorList theActorList, + SVTK_ViewWindow* theViewWindow, + SMESH::Orientation theOrientation, + double theDistance, + const vtkFloatingPointType theAngle[2]); protected: void keyPressEvent( QKeyEvent* ); private: - LightApp_SelectionMgr* mySelectionMgr; - SVTK_Selector* mySelector; + void initializePlaneData(); + + void synchronize(); + + void updateActorList(); + SMESH::TActorList getCurrentActors(); + + void updateActorItem( QListWidgetItem* theItem, + bool theUpdateSelectAll, + bool theUpdateClippingPlaneMap ); + + void dumpPlaneData() const; + +private: SMESHGUI* mySMESHGUI; - SMESH_Actor* myActor; - SMESH::TPlanes myPlanes; + SVTK_ViewWindow* myViewWindow; + SMESH::TPlaneDataVector myPlanes; QComboBox* ComboBoxPlanes; QPushButton* buttonNew; QPushButton* buttonDelete; + QListWidget* ActorList; + QCheckBox* SelectAllCheckBox; QLabel* TextLabelOrientation; QComboBox* ComboBoxOrientation; QLabel* TextLabelDistance; @@ -129,9 +196,10 @@ public slots: void onSelectPlane( int ); void ClickOnNew(); void ClickOnDelete(); + void onActorItemChanged( QListWidgetItem* ); + void onSelectAll( int ); void onSelectOrientation( int ); void SetCurrentPlaneParam(); - void onSelectionChanged(); void OnPreviewToggle( bool ); void ClickOnOk(); void ClickOnCancel(); diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx index 72ce1e852..c663c74da 100644 --- a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx @@ -65,6 +65,7 @@ #include CORBA_CLIENT_HEADER(SMESH_Group) // VTK includes +#include #include #include #include @@ -605,6 +606,9 @@ namespace SMESH } } } + if( anActor ) + if( SMESHGUI* aSMESHGUI = SMESHGUI::GetSMESHGUI() ) + aSMESHGUI->addActorAsObserver( anActor ); return anActor; } @@ -1167,4 +1171,108 @@ namespace SMESH } } + + //---------------------------------------------------------------------------- + // internal function + void ComputeBoundsParam( vtkFloatingPointType theBounds[6], + vtkFloatingPointType theDirection[3], + vtkFloatingPointType theMinPnt[3], + vtkFloatingPointType& theMaxBoundPrj, + vtkFloatingPointType& theMinBoundPrj ) + { + //Enlarge bounds in order to avoid conflicts of precision + for(int i = 0; i < 6; i += 2){ + static double EPS = 1.0E-3; + vtkFloatingPointType aDelta = (theBounds[i+1] - theBounds[i])*EPS; + theBounds[i] -= aDelta; + theBounds[i+1] += aDelta; + } + + vtkFloatingPointType 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, aMinId = aMaxId; + theMaxBoundPrj = vtkMath::Dot(theDirection,aBoundPoints[aMaxId]); + theMinBoundPrj = theMaxBoundPrj; + for(int i = 1; i < 8; i++){ + vtkFloatingPointType aTmp = vtkMath::Dot(theDirection,aBoundPoints[i]); + if(theMaxBoundPrj < aTmp){ + theMaxBoundPrj = aTmp; + aMaxId = i; + } + if(theMinBoundPrj > aTmp){ + theMinBoundPrj = aTmp; + aMinId = i; + } + } + vtkFloatingPointType *aMinPnt = aBoundPoints[aMaxId]; + theMinPnt[0] = aMinPnt[0]; + theMinPnt[1] = aMinPnt[1]; + theMinPnt[2] = aMinPnt[2]; + } + + // internal function + void DistanceToPosition( vtkFloatingPointType theBounds[6], + vtkFloatingPointType theDirection[3], + vtkFloatingPointType theDist, + vtkFloatingPointType thePos[3] ) + { + vtkFloatingPointType aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; + ComputeBoundsParam(theBounds,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); + vtkFloatingPointType 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; + } + + // internal function (currently unused, left just in case) + void PositionToDistance( vtkFloatingPointType theBounds[6], + vtkFloatingPointType theDirection[3], + vtkFloatingPointType thePos[3], + vtkFloatingPointType& theDist ) + { + vtkFloatingPointType aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; + ComputeBoundsParam(theBounds,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); + vtkFloatingPointType aPrj = vtkMath::Dot(theDirection,thePos); + theDist = (aPrj-aMinBoundPrj)/(aMaxBoundPrj-aMinBoundPrj); + } + + bool ComputeClippingPlaneParameters( std::list theActorList, + vtkFloatingPointType theNormal[3], + vtkFloatingPointType theDist, + vtkFloatingPointType theBounds[6], + vtkFloatingPointType theOrigin[3] ) + { + bool anIsOk = false; + theBounds[0] = theBounds[2] = theBounds[4] = VTK_DOUBLE_MAX; + theBounds[1] = theBounds[3] = theBounds[5] = -VTK_DOUBLE_MAX; + std::list::iterator anIter = theActorList.begin(); + for( ; anIter != theActorList.end(); anIter++ ) { + if( vtkActor* aVTKActor = *anIter ) { + if( SMESH_Actor* anActor = SMESH_Actor::SafeDownCast( aVTKActor ) ) { + vtkFloatingPointType aBounds[6]; + anActor->GetUnstructuredGrid()->GetBounds( aBounds ); + theBounds[0] = std::min( theBounds[0], aBounds[0] ); + theBounds[1] = std::max( theBounds[1], aBounds[1] ); + theBounds[2] = std::min( theBounds[2], aBounds[2] ); + theBounds[3] = std::max( theBounds[3], aBounds[3] ); + theBounds[4] = std::min( theBounds[4], aBounds[4] ); + theBounds[5] = std::max( theBounds[5], aBounds[5] ); + anIsOk = true; + } + } + } + + if( !anIsOk ) + return false; + + DistanceToPosition( theBounds, theNormal, theDist, theOrigin ); + return true; + } } // end of namespace SMESH diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.h b/src/SMESHGUI/SMESHGUI_VTKUtils.h index 508ce767e..5a9b09c25 100644 --- a/src/SMESHGUI/SMESHGUI_VTKUtils.h +++ b/src/SMESHGUI/SMESHGUI_VTKUtils.h @@ -57,6 +57,8 @@ class SMESHGUI; class SMESH_Actor; class SALOME_Actor; +class vtkActor; + namespace SMESH { //---------------------------------------------------------------------------- @@ -185,6 +187,14 @@ SMESHGUI_EXPORT SMESHGUI_EXPORT void SetControlsPrecision( const long ); + + //---------------------------------------------------------------------------- +SMESHGUI_EXPORT + bool ComputeClippingPlaneParameters( std::list theActorList, + vtkFloatingPointType theNormal[3], + vtkFloatingPointType theDist, + vtkFloatingPointType theBounds[6], + vtkFloatingPointType theOrigin[3] ); }; #endif // SMESHGUI_VTKUTILS_H diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index efa0f7aa4..4a1810b31 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -5264,6 +5264,14 @@ It is impossible to read point coordinates from file CLIP_PLANES Clipping planes + + MESHES_SUBMESHES_GROUPS + Meshes, sub-meshes and groups + + + SELECT_ALL + Select all + ROTATION_AROUND_X_Y2Z Rotation around X (Y to Z): -- 2.39.2