X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_ClippingDlg.cxx;h=55a87509d6480b73bd28f60640a6244d00e53c2f;hp=371a0582afdf70bef7c17937c271688c85a4503b;hb=264eeb2edd6977ccf2d2bd88cbb210353f63f7c9;hpb=c98d9fcd7f02c1f1f5c24dd3e709ed75228d66c4 diff --git a/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx b/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx index 371a0582a..55a87509d 100644 --- a/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx @@ -231,34 +231,37 @@ SMESH::OrientedPlane::~OrientedPlane() myPlaneSource->Delete(); } -/*! - Definition of class ActorItem - */ -class ActorItem : public QListWidgetItem +namespace { -public: - ActorItem( SMESH_Actor* theActor, const QString& theName, QListWidget* theListWidget ) : - QListWidgetItem( theName, theListWidget ), - myActor( theActor ) {} + /*! + Definition of class ActorItem + */ + class ActorItem : public QListWidgetItem + { + public: + ActorItem( SMESH_Actor* theActor, const QString& theName, QListWidget* theListWidget ) : + QListWidgetItem( theName, theListWidget ), + myActor( theActor ) {} - SMESH_Actor* getActor() const { return myActor; } + SMESH_Actor* getActor() const { return myActor; } -private: - SMESH_Actor* myActor; -}; + private: + SMESH_Actor* myActor; + }; -/*! - Definition of class TSetVisibility - */ -struct TSetVisibility { - // Set visibility of cutting plane - TSetVisibility(int theIsVisible): myIsVisible(theIsVisible){} - void operator()(SMESH::TPlaneData& thePlaneData){ - bool anIsEmpty = thePlaneData.ActorList.empty(); - thePlaneData.Plane.GetPointer()->myActor->SetVisibility(myIsVisible && !anIsEmpty); - } - int myIsVisible; -}; + /*! + Definition of class TSetVisibility + */ + struct TSetVisibility { + // Set visibility of cutting plane + TSetVisibility(int theIsVisible): myIsVisible(theIsVisible){} + void operator()(SMESH::TPlaneData& thePlaneData){ + bool anIsEmpty = thePlaneData.ActorList.empty(); + thePlaneData.Plane.GetPointer()->myActor->SetVisibility(myIsVisible && !anIsEmpty); + } + int myIsVisible; + }; +} /********************************************************************************* ********************* class SMESHGUI_ClippingDlg ********************* @@ -476,7 +479,7 @@ SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule, SVTK_ViewWindow QFont fnt = SpinSliderDistance->font(); fnt.setBold( true ); SpinSliderDistance->setFont( fnt ); GroupParametersLayout->addWidget( SpinSliderDistance, 1, 1 ); - QString aUnitRot = "\xB0"; + QString aUnitRot = QString(QChar(0xB0)); TextLabelRotation1 = new QLabel( tr("ROTATION_AROUND_X_Y2Z"), GroupParameters ); TextLabelRotation1->setObjectName( "TextLabelRotation1" ); @@ -713,46 +716,66 @@ vtkImplicitPlaneWidget* SMESHGUI_ClippingDlg::createPreviewWidget() return aPlaneWgt; } -/*! - Translate two angles of plane to normal -*/ -void rotationToNormal ( double theRotation[2], - int theOrientation, - double theNormal[3], - double theDir[2][3] ) +namespace { - static double aCoeff = M_PI/180.0; - - double anU[2] = { cos( aCoeff * theRotation[0] ), cos( aCoeff * theRotation[1] ) }; - double aV[2] = { sqrt( 1.0 - anU[0]*anU[0] ), sqrt( 1.0 - anU[1] * anU[1] ) }; - aV[0] = theRotation[0] > 0? aV[0]: -aV[0]; - aV[1] = theRotation[1] > 0? aV[1]: -aV[1]; + /*! + Translate two angles of plane to normal + */ + void rotationToNormal ( double theRotation[2], + int theOrientation, + double theNormal[3], + double theDir[2][3] ) + { + static double aCoeff = M_PI/180.0; + + double anU[2] = { cos( aCoeff * theRotation[0] ), cos( aCoeff * theRotation[1] ) }; + double aV[2] = { sqrt( 1.0 - anU[0]*anU[0] ), sqrt( 1.0 - anU[1] * anU[1] ) }; + aV[0] = theRotation[0] > 0? aV[0]: -aV[0]; + aV[1] = theRotation[1] > 0? aV[1]: -aV[1]; + + switch ( theOrientation ) { + case 0: + case 1: + theDir[0][1] = anU[0]; + theDir[0][2] = aV[0]; + theDir[1][0] = anU[1]; + theDir[1][2] = aV[1]; + break; + case 2: + theDir[0][2] = anU[0]; + theDir[0][0] = aV[0]; + theDir[1][1] = anU[1]; + theDir[1][0] = aV[1]; + break; + case 3: + theDir[0][0] = anU[0]; + theDir[0][1] = aV[0]; + theDir[1][2] = anU[1]; + theDir[1][1] = aV[1]; + break; + } - switch ( theOrientation ) { - case 0: - case 1: - theDir[0][1] = anU[0]; - theDir[0][2] = aV[0]; - theDir[1][0] = anU[1]; - theDir[1][2] = aV[1]; - break; - case 2: - theDir[0][2] = anU[0]; - theDir[0][0] = aV[0]; - theDir[1][1] = anU[1]; - theDir[1][0] = aV[1]; - break; - case 3: - theDir[0][0] = anU[0]; - theDir[0][1] = aV[0]; - theDir[1][2] = anU[1]; - theDir[1][1] = aV[1]; - break; + vtkMath::Cross( theDir[1], theDir[0], theNormal ); + vtkMath::Normalize( theNormal ); + vtkMath::Cross( theNormal, theDir[1], theDir[0] ); } - vtkMath::Cross( theDir[1], theDir[0], theNormal ); - vtkMath::Normalize( theNormal ); - vtkMath::Cross( theNormal, theDir[1], theDir[0] ); + /*! + * \brief Return a name of a father mesh if any + */ + QString getFatherName( _PTR(SObject)& theSObj ) + { + _PTR(SComponent) objComponent = theSObj->GetFatherComponent(); + const int theMeshDepth = 1 + objComponent->Depth(); + if ( theSObj->Depth() <= theMeshDepth ) + return QString(); // theSObj is a mesh + + _PTR(SObject) sobj = theSObj->GetFather(); + while ( sobj && sobj->Depth() > theMeshDepth ) + sobj = sobj->GetFather(); + + return sobj ? sobj->GetName().c_str() : ""; + } } /*! @@ -766,7 +789,7 @@ bool SMESHGUI_ClippingDlg::AddPlane ( SMESH::TActorList theActorList, double aDir[2][3] = {{0, 0, 0}, {0, 0, 0}}; static double aCoeff = vtkMath::Pi()/180.0; - int anOrientation; + int anOrientation = 0; if ( thePlane->PlaneMode == SMESH::Absolute ) anOrientation = thePlane->myAbsoluteOrientation; else if ( thePlane->PlaneMode == SMESH::Relative ) @@ -1045,11 +1068,7 @@ void SMESHGUI_ClippingDlg::updateActorList() { ActorList->clear(); - SalomeApp_Study* anAppStudy = SMESHGUI::activeStudy(); - if( !anAppStudy ) - return; - - _PTR(Study) aStudy = anAppStudy->studyDS(); + _PTR(Study) aStudy = SMESH::getStudy(); if( !aStudy ) return; @@ -1063,6 +1082,8 @@ void SMESHGUI_ClippingDlg::updateActorList() std::for_each( myPlanes.begin(),myPlanes.end(), TSetVisibility( PreviewCheckBox->isChecked() ) ); aPlaneData.Plane.GetPointer()->myActor->SetVisibility( false ); + std::map< std::string, QListWidgetItem* > itemMap; // used to sort items by entry + VTK::ActorCollectionCopy aCopy( myViewWindow->getRenderer()->GetActors() ); vtkActorCollection* anAllActors = aCopy.GetActors(); anAllActors->InitTraversal(); @@ -1084,13 +1105,24 @@ void SMESHGUI_ClippingDlg::updateActorList() } } QString aName = QString( aSObj->GetName().c_str() ); - QListWidgetItem* anItem = new ActorItem( anActor, aName, ActorList ); + QString aFatherName = getFatherName( aSObj ); + if ( !aFatherName.isEmpty() ) + aName = aFatherName + " / " + aName; + aName += QString(" (%1)").arg( aSObj->GetID().c_str() ); + QListWidgetItem* anItem = new ActorItem( anActor, aName, 0 ); anItem->setCheckState( anIsChecked ? Qt::Checked : Qt::Unchecked ); - updateActorItem( anItem, true, false ); + itemMap.insert( std::make_pair( aSObj->GetID(), anItem )); } } } } + std::map< std::string, QListWidgetItem* >::iterator s2i = itemMap.begin(); + for ( ; s2i != itemMap.end(); ++s2i ) + { + QListWidgetItem* anItem = s2i->second; + ActorList->addItem( anItem ); + } + updateActorItem( 0, true, false ); } /*! @@ -1231,16 +1263,19 @@ void SMESHGUI_ClippingDlg::ClickOnNew() SMESH::OrientedPlane* aPlane = SMESH::OrientedPlane::New(myViewWindow); SMESH::TPlane aTPlane(aPlane); aPlane->PlaneMode = CurrentMode; - SMESH::TActorList anActorList; + SMESH::TActorList anActorList, aVisibleActorList; 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 ); - - SMESH::TPlaneData aPlaneData(aTPlane, anActorList); - + if ( anActor->GetVisibility() ) + aVisibleActorList.push_back( anActor ); + } + SMESH::TPlaneData aPlaneData(aTPlane, + aVisibleActorList.empty() ? anActorList : aVisibleActorList); myPlanes.push_back(aPlaneData); @@ -1436,7 +1471,7 @@ void SMESHGUI_ClippingDlg::SetCurrentPlaneParam() static double aCoeff = vtkMath::Pi()/180.0; double aRot[2] = { getRotation1(), getRotation2() }; - int anOrient; + int anOrient = 0; if ( aPlane->PlaneMode == SMESH::Absolute ) anOrient = CBAbsoluteOrientation->currentIndex(); else if ( aPlane->PlaneMode == SMESH::Relative ) @@ -1623,8 +1658,8 @@ void SMESHGUI_ClippingDlg::absolutePlaneToRelative ( double theOrigin[3], double double eps = 0.0001; int anOrientation = CBRelativeOrientation->currentIndex(); - double aDirection[3]; - double aRotation1, aRotation2; + double aDirection[3] = { 0.,0.,0. }; + double aRotation1 = 0, aRotation2 = 0; switch( anOrientation ) { case 0: aDirection[0] = theDir[0] + eps;