X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMGUI%2FGEOMGUI_Selection.cxx;h=a3e9d133b849598d95f10c653bb678c06271221c;hb=d2046800b5f3ab6a56c3b9a72766f5d317a235e7;hp=be0e2dd840fd53e3ea740f99aa43c5554dfd06bc;hpb=6fa64130e586f57e807bfb298c52f10bfb2c0b2d;p=modules%2Fgeom.git diff --git a/src/GEOMGUI/GEOMGUI_Selection.cxx b/src/GEOMGUI/GEOMGUI_Selection.cxx index be0e2dd84..a3e9d133b 100644 --- a/src/GEOMGUI/GEOMGUI_Selection.cxx +++ b/src/GEOMGUI/GEOMGUI_Selection.cxx @@ -1,20 +1,39 @@ +// Copyright (C) 2007-2008 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : GEOMGUI_Selection.cxx +// Author : Alexander SOLOVYOV, Open CASCADE S.A.S. (alexander.solovyov@opencascade.com) +// #include "GEOMGUI_Selection.h" #include "GeometryGUI.h" #include "GEOM_Displayer.h" -#include +#include #include -#include - +#include #include #include #include -#include - -#include -#include #include #include @@ -22,11 +41,14 @@ #include #include #include +#include #include #include -#include "GEOMImpl_Types.hxx" +#include + +#include // OCCT Includes #include @@ -37,6 +59,7 @@ #include GEOMGUI_Selection::GEOMGUI_Selection() +: LightApp_Selection() { } @@ -44,24 +67,36 @@ GEOMGUI_Selection::~GEOMGUI_Selection() { } -QtxValue GEOMGUI_Selection::globalParam( const QString& p ) const +QVariant GEOMGUI_Selection::parameter( const QString& p ) const { - if ( p == "isOCC" ) return QtxValue( activeViewType() == OCCViewer_Viewer::Type() ); - - return LightApp_Selection::globalParam( p ); + if ( p == "isOCC" ) return QVariant( activeViewType() == OCCViewer_Viewer::Type() ); + if ( p == "selectionmode" ){ + return QVariant(selectionMode()); + } + return LightApp_Selection::parameter( p ); } -QtxValue GEOMGUI_Selection::param( const int ind, const QString& p ) const +QVariant GEOMGUI_Selection::parameter( const int ind, const QString& p ) const { -// if ( p == "isVisible" ) return QtxValue( isVisible( ind ) ); +// if ( p == "isVisible" ) return QVariant( isVisible( ind ) ); // parameter isVisible is calculated in base SalomeApp_Selection // else if( p == "type" ) - return QtxValue( typeName( ind ) ); + return QVariant( typeName( ind ) ); + if( p == "typeid" ) + return QVariant( typeId( ind ) ); else if ( p == "displaymode" ) - return QtxValue( displayMode( ind ) ); + return QVariant( displayMode( ind ) ); + else if ( p == "isAutoColor" ) + return QVariant( isAutoColor( ind ) ); + else if ( p == "isVectorsMode" ) + return QVariant( isVectorsMode( ind ) ); + else if ( p == "hasHiddenChildren" ) + return QVariant( hasHiddenChildren( ind ) ); + else if ( p == "hasShownChildren" ) + return QVariant( hasShownChildren( ind ) ); else - return LightApp_Selection::param( ind, p ); + return LightApp_Selection::parameter( ind, p ); } QString GEOMGUI_Selection::typeName( const int index ) const @@ -79,23 +114,40 @@ QString GEOMGUI_Selection::typeName( const int index ) const return "Unknown"; } +int GEOMGUI_Selection::typeId( const int index ) const +{ + int aType = -1; + GEOM::GEOM_Object_var anObj = getObject( index ); + if ( !CORBA::is_nil( anObj ) ) + aType = anObj->GetType(); + return aType; +} + bool GEOMGUI_Selection::isVisible( const int index ) const { GEOM::GEOM_Object_var obj = getObject( index ); SALOME_View* view = GEOM_Displayer::GetActiveView(); if ( !CORBA::is_nil( obj ) && view ) { - Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject( entry( index ).latin1(), "GEOM", "TEMP_IO" ); + Handle(SALOME_InteractiveObject) io = new SALOME_InteractiveObject( entry( index ).toLatin1().constData(), "GEOM", "TEMP_IO" ); return view->isVisible( io ); } return false; } +bool GEOMGUI_Selection::isAutoColor( const int index ) const +{ + GEOM::GEOM_Object_var obj = getObject( index ); + if ( !CORBA::is_nil( obj ) ) + return obj->GetAutoColor(); + return false; +} + QString GEOMGUI_Selection::displayMode( const int index ) const { SALOME_View* view = GEOM_Displayer::GetActiveView(); QString viewType = activeViewType(); if ( view /*fix for 9320==>*/&& ( viewType == OCCViewer_Viewer::Type() || viewType == SVTK_Viewer::Type() ) ) { - SALOME_Prs* prs = view->CreatePrs( entry( index ) ); + SALOME_Prs* prs = view->CreatePrs( entry( index ).toLatin1().constData() ); if ( prs ) { if ( viewType == OCCViewer_Viewer::Type() ) { // assuming OCC SOCC_Prs* occPrs = (SOCC_Prs*) prs; @@ -145,6 +197,108 @@ QString GEOMGUI_Selection::displayMode( const int index ) const return ""; } +bool GEOMGUI_Selection::isVectorsMode( const int index ) const +{ + bool ret = false; + SALOME_View* view = GEOM_Displayer::GetActiveView(); + QString viewType = activeViewType(); + if ( view && ( viewType == OCCViewer_Viewer::Type() || viewType == SVTK_Viewer::Type() ) ) { + SALOME_Prs* prs = view->CreatePrs( entry( index ).toLatin1().constData() ); + if ( prs ) { + if ( viewType == OCCViewer_Viewer::Type() ) { // assuming OCC + SOCC_Prs* occPrs = (SOCC_Prs*) prs; + AIS_ListOfInteractive lst; + occPrs->GetObjects( lst ); + if ( lst.Extent() ) { + Handle(AIS_InteractiveObject) io = lst.First(); + if ( !io.IsNull() ) { + Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast(io); + if ( !aSh.IsNull() ) + ret = aSh->isShowVectors(); + } + } + } else if ( viewType == SVTK_Viewer::Type() ) { // assuming VTK + SVTK_Prs* vtkPrs = dynamic_cast( prs ); + vtkActorCollection* lst = vtkPrs ? vtkPrs->GetObjects() : 0; + if ( lst ) { + lst->InitTraversal(); + vtkActor* actor = lst->GetNextActor(); + if ( actor ) { + GEOM_Actor* aGeomActor = GEOM_Actor::SafeDownCast(actor); + if ( aGeomActor ) + ret = aGeomActor->GetVectorMode(); + } + } + } + } + } + return ret; +} + +bool GEOMGUI_Selection::hasChildren( const _PTR(SObject)& obj ) +{ + bool ok = false; + if ( obj ) { + _PTR(ChildIterator) it ( obj->GetStudy()->NewChildIterator( obj ) ); + for ( ; it->More() && !ok; it->Next() ) { + _PTR(SObject) child = it->Value(); + if ( child ) { + _PTR(SObject) refObj; + if ( child->ReferencedObject( refObj ) ) continue; // omit references + if ( child->GetName() != "" ) ok = true; + } + } + } + return ok; +} + +bool GEOMGUI_Selection::expandable( const _PTR(SObject)& obj ) +{ + bool exp = true; + _PTR(GenericAttribute) anAttr; + if ( obj && obj->FindAttribute( anAttr, "AttributeExpandable" ) ) { + _PTR(AttributeExpandable) aAttrExp = anAttr; + exp = aAttrExp->IsExpandable(); + } + return exp; +} + +bool GEOMGUI_Selection::hasHiddenChildren( const int index ) const +{ + bool OK = false; + SalomeApp_Study* appStudy = dynamic_cast + (SUIT_Session::session()->activeApplication()->activeStudy()); + + if ( appStudy && index >= 0 && index < count() ) { + _PTR(Study) study = appStudy->studyDS(); + QString anEntry = entry( index ); + + if ( study && !anEntry.isEmpty() ) { + _PTR(SObject) aSO( study->FindObjectID( anEntry.toStdString() ) ); + OK = !expandable( aSO ) && hasChildren( aSO ); + } + } + return OK; +} + +bool GEOMGUI_Selection::hasShownChildren( const int index ) const +{ + bool OK = false; + SalomeApp_Study* appStudy = dynamic_cast + (SUIT_Session::session()->activeApplication()->activeStudy()); + + if ( appStudy && index >= 0 && index < count() ) { + _PTR(Study) study = appStudy->studyDS(); + QString anEntry = entry( index ); + + if ( study && !anEntry.isEmpty() ) { + _PTR(SObject) aSO( study->FindObjectID( anEntry.toStdString() ) ); + OK = expandable( aSO ) && hasChildren( aSO ); + } + } + return OK; +} + bool GEOMGUI_Selection::isComponent( const int index ) const { SalomeApp_Study* appStudy = dynamic_cast @@ -155,7 +309,7 @@ bool GEOMGUI_Selection::isComponent( const int index ) const QString anEntry = entry( index ); if ( study && !anEntry.isNull() ) { - _PTR(SObject) aSO( study->FindObjectID( anEntry.latin1() ) ); + _PTR(SObject) aSO( study->FindObjectID( anEntry.toStdString() ) ); if ( aSO && aSO->GetFatherComponent() ) return aSO->GetFatherComponent()->GetIOR() == aSO->GetIOR(); } @@ -173,7 +327,7 @@ GEOM::GEOM_Object_ptr GEOMGUI_Selection::getObject( const int index ) const QString anEntry = entry(index); if (study && !anEntry.isNull()) { - _PTR(SObject) aSO (study->FindObjectID(anEntry.latin1())); + _PTR(SObject) aSO (study->FindObjectID(anEntry.toStdString())); if (aSO) { CORBA::Object_var anObj = GeometryGUI::ClientSObjectToObject(aSO); return GEOM::GEOM_Object::_narrow(anObj); @@ -182,3 +336,26 @@ GEOM::GEOM_Object_ptr GEOMGUI_Selection::getObject( const int index ) const } return GEOM::GEOM_Object::_nil(); } + +QString GEOMGUI_Selection::selectionMode() const +{ + SalomeApp_Application* app = (SalomeApp_Application*)(SUIT_Session::session()->activeApplication()); + if (app) { + GeometryGUI* aGeomGUI = dynamic_cast( app->module( "Geometry" ) ); + if (aGeomGUI) { + switch (aGeomGUI->getLocalSelectionMode()) + { + case GEOM_POINT : return "VERTEX"; + case GEOM_EDGE : return "EDGE"; + case GEOM_WIRE : return "WIRE"; + case GEOM_FACE : return "FACE"; + case GEOM_SHELL : return "SHELL"; + case GEOM_SOLID : return "SOLID"; + case GEOM_COMPOUND : return "COMPOUND"; + case GEOM_ALLOBJECTS : return "ALL"; + default: return ""; + } + } + } + return ""; +}