From: ana Date: Fri, 13 Apr 2012 09:03:01 +0000 (+0000) Subject: Fix for the "0021179: EDF 1654 SMESH GEOM: better look'n'feel" issue: X-Git-Tag: V6_6_0a1~122 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=5b131dda08988a7355d5c7732e71d17c2eb10e89;hp=37f2c3cad90aa6e2a84d168e4ece9d1f25873a86;p=modules%2Fgeom.git Fix for the "0021179: EDF 1654 SMESH GEOM: better look'n'feel" issue: - Material Properties --- diff --git a/src/GEOMGUI/GEOMGUI_Selection.cxx b/src/GEOMGUI/GEOMGUI_Selection.cxx index d7977004b..d1c9eb77e 100644 --- a/src/GEOMGUI/GEOMGUI_Selection.cxx +++ b/src/GEOMGUI/GEOMGUI_Selection.cxx @@ -1,553 +1,616 @@ -// Copyright (C) 2007-2011 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 "LightApp_DataOwner.h" - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include - -#include - -// OCCT Includes -#include -#include -#include - -// VTK Includes -#include - -#define OCC_DISPLAY_MODE_TO_STRING( str, dm ) { \ - if ( dm == AIS_WireFrame ) \ - str = QString( "Wireframe" ); \ - else if ( dm == AIS_Shaded ) \ - str = QString( "Shading" ); \ - else if ( dm == GEOM_AISShape::ShadingWithEdges ) \ - str = QString( "ShadingWithEdges" ); \ - else if ( dm == GEOM_AISShape::TexturedShape ) \ - str = QString( "Texture" ); \ - else \ - str = QString(); } - -#define VTK_DISPLAY_MODE_TO_STRING( str, dm ) { \ - if ( dm == 0 ) \ - str = QString( "Wireframe" ); \ - else if ( dm == 1 ) \ - str = QString( "Shading" ); \ - else if ( dm == 3 ) \ - str = QString( "ShadingWithEdges" ); \ - else \ - str = QString(); } - -#define USE_VISUAL_PROP_MAP - -GEOMGUI_Selection::GEOMGUI_Selection() -: LightApp_Selection() -{ -} - -GEOMGUI_Selection::~GEOMGUI_Selection() -{ -} - -void GEOMGUI_Selection::init( const QString& context, LightApp_SelectionMgr* selMgr ) -{ - LightApp_Selection::init( context, selMgr ); - - myObjects.resize( count() ); - - SalomeApp_Study* appStudy = dynamic_cast( study() ); - if ( appStudy ) { - _PTR(Study) study = appStudy->studyDS(); - for ( int idx = 0; idx < count(); idx++ ) { - QString anEntry = entry( idx ); - if ( study && !anEntry.isEmpty() ) { - _PTR(SObject) aSO( study->FindObjectID( anEntry.toStdString() ) ); - if ( aSO ) { - CORBA::Object_var varObj = GeometryGUI::ClientSObjectToObject( aSO ); - myObjects[idx] = GEOM::GEOM_Object::_narrow( varObj ); - } - } - } - } -} - -//QVariant GEOMGUI_Selection::contextParameter( const QString& p ) const -QVariant GEOMGUI_Selection::parameter( const QString& p ) const -{ - QVariant v; - if ( p == "isOCC" ) - v = activeViewType() == OCCViewer_Viewer::Type(); - else if ( p == "selectionmode" ) - v = selectionMode(); - else if ( p == "hasImported" ) - v = hasImported(); - else if ( p == "allImported" ) - v = allImported(); - else - v = LightApp_Selection::parameter( p ); - return v; -} - -//QVariant GEOMGUI_Selection::objectParameter( const int idx, const QString& p ) const -QVariant GEOMGUI_Selection::parameter( const int idx, const QString& p ) const -{ - QVariant v; - if ( p == "type" ) - v = typeName( idx ); - else if ( p == "typeid" ) - v = typeId( idx ); - else if ( p == "displaymode" ) - v = displayMode( idx ); - else if ( p == "isAutoColor" ) - v = isAutoColor( idx ); - else if ( p == "isVectorsMode" ) - v = isVectorsMode( idx ); - else if ( p == "topLevel" ) - v = topLevel( idx ); - else if ( p == "hasHiddenChildren" ) - v = hasHiddenChildren( idx ); - else if ( p == "hasShownChildren" ) - v = hasShownChildren( idx ); - else if ( p == "compoundOfVertices" ) - v = compoundOfVertices( idx ); - else if ( p == "imported" ) - v = isImported( idx ); - else - v = LightApp_Selection::parameter( idx, p ); - - return v; -} - -// the method to skip temporary objects from selection (called from LightApp) -bool GEOMGUI_Selection::processOwner( const LightApp_DataOwner* theOwner ) -{ - return !theOwner->entry().contains("_"); -} - -QString GEOMGUI_Selection::typeName( const int index ) const -{ - if ( isComponent( index ) ) - return "Component"; - - static QString aGroup( "Group" ); - static QString aShape( "Shape" ); - static QString anUnknown( "Unknown" ); - - GEOM::GEOM_Object_var anObj = getObject( index ); - if ( !CORBA::is_nil( anObj ) ) { - const int aGeomType = anObj->GetType(); - if ( aGeomType == GEOM_GROUP ) - return aGroup; - else - return aShape; - } - return anUnknown; -} - -int GEOMGUI_Selection::typeId( const int index ) const -{ - int aType = -1; - GEOM::GEOM_Object_var anObj = getObject( index ); - if ( !CORBA::is_nil( anObj ) ) - aType = (int)anObj->GetShapeType(); - return aType; -} - -bool GEOMGUI_Selection::isVisible( const int index ) const -{ - bool res = false; - -#ifdef USE_VISUAL_PROP_MAP - bool found = false; - QVariant v = visibleProperty( entry( index ), VISIBILITY_PROP ); - if ( v.canConvert( QVariant::Bool ) ) { - res = v.toBool(); - found = true; - } - - if ( !found ) { -#endif - 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 ).toLatin1().constData(), "GEOM", "TEMP_IO" ); - res = view->isVisible( io ); - } -#ifdef USE_VISUAL_PROP_MAP - } -#endif - - return res; -} - -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; -} - -bool GEOMGUI_Selection::isImported( const int index ) const -{ - GEOM::GEOM_Object_var obj = getObject( index ); - if ( !CORBA::is_nil( obj ) ) - return obj->GetType() == GEOM_IMPORT; - return false; -} - -bool GEOMGUI_Selection::hasImported() const -{ - bool res = false; - for ( int i = 0; i < count() && !res; i++ ) - res = isImported( i ); - return res; -} - -bool GEOMGUI_Selection::allImported() const -{ - bool res = true; - for ( int i = 0; i < count() && res; i++ ) - res = isImported( i ); - return res; -} - -QVariant GEOMGUI_Selection::visibleProperty( const QString& entry, const QString& propName ) const -{ - QVariant v; - LightApp_Study* aStudy = study(); - if ( aStudy ) { - LightApp_Application* anApp = ::qobject_cast( aStudy->application() ); - if ( anApp && anApp->activeViewManager() ) { - int id = anApp->activeViewManager()->getGlobalId(); - v = aStudy->getObjectProperty( id, entry, propName, QVariant() ); - } - } - return v; -} - -QString GEOMGUI_Selection::displayMode( const int index ) const -{ - QString res; - QString viewType = activeViewType(); -#ifdef USE_VISUAL_PROP_MAP - QVariant v = visibleProperty( entry( index ), DISPLAY_MODE_PROP ); - if ( v.canConvert( QVariant::Int ) ) { - int dm = v.toInt(); - if ( viewType == OCCViewer_Viewer::Type() ) { - OCC_DISPLAY_MODE_TO_STRING( res, dm ); - } else if ( viewType == SVTK_Viewer::Type() ) { - VTK_DISPLAY_MODE_TO_STRING( res, dm ); - } - } - - if ( res.isEmpty() ) { -#endif - SALOME_View* view = GEOM_Displayer::GetActiveView(); - if ( view /*fix for 9320==>*/&& ( 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() ) { - int dm = io->DisplayMode(); - OCC_DISPLAY_MODE_TO_STRING( res, dm ); - if ( res.isEmpty() ) { // return default display mode of AIS_InteractiveContext - OCCViewer_Viewer* occViewer = (OCCViewer_Viewer*)SUIT_Session::session()->activeApplication()-> - desktop()->activeWindow()->getViewManager()->getViewModel(); - Handle(AIS_InteractiveContext) ic = occViewer->getAISContext(); - dm = ic->DisplayMode(); - OCC_DISPLAY_MODE_TO_STRING( res, dm ); - } - } - } - } - 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 ) { - SALOME_Actor* salActor = dynamic_cast( actor ); - if ( salActor ) { - int dm = salActor->getDisplayMode(); - VTK_DISPLAY_MODE_TO_STRING( res, dm ); - } // if ( salome actor ) - } // if ( actor ) - } // if ( lst == vtkPrs->GetObjects() ) - } // if VTK - } - } - -#ifdef USE_VISUAL_PROP_MAP - } -#endif - - return res; -} - -bool GEOMGUI_Selection::isVectorsMode( const int index ) const -{ - bool res = false; - -#ifdef USE_VISUAL_PROP_MAP - bool found = false; - QVariant v = visibleProperty( entry( index ), VECTOR_MODE_PROP ); - if ( v.canConvert( QVariant::Bool ) ) { - res = v.toBool(); - found = true; - } - - if ( !found ) { -#endif - 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() ) - res = 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 ) - res = aGeomActor->GetVectorMode(); - } - } - } - } - } -#ifdef USE_VISUAL_PROP_MAP - } -#endif - - return res; -} - -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::isCompoundOfVertices( GEOM::GEOM_Object_ptr obj ) -{ - bool ret = false; - /* - SalomeApp_Study* appStudy = dynamic_cast - (SUIT_Session::session()->activeApplication()->activeStudy());*/ - if ( /*appStudy && */!CORBA::is_nil( obj ) ) - ret = obj->GetShapeType() == GEOM::COMPOUND && obj->GetMaxShapeType() == GEOM::VERTEX; - return ret; -} - -bool GEOMGUI_Selection::hasHiddenChildren( const int index ) const -{ - bool OK = false; - SalomeApp_Study* appStudy = dynamic_cast( study() ); - - if ( appStudy ) { - QString anEntry = entry( index ); - _PTR(Study) study = appStudy->studyDS(); - 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( study() ); - - if ( appStudy ) { - QString anEntry = entry( index ); - _PTR(Study) study = appStudy->studyDS(); - if ( study && !anEntry.isEmpty() ) { - _PTR(SObject) aSO( study->FindObjectID( anEntry.toStdString() ) ); - OK = expandable( aSO ) && hasChildren( aSO ); - } - } - return OK; -} - -bool GEOMGUI_Selection::compoundOfVertices( const int index ) const -{ - GEOM::GEOM_Object_var obj = getObject( index ); - return isCompoundOfVertices( obj ); -} - -bool GEOMGUI_Selection::isComponent( const int index ) const -{ - SalomeApp_Study* appStudy = dynamic_cast( study() ); - - if ( appStudy ) { - QString anEntry = entry( index ); - _PTR(Study) study = appStudy->studyDS(); - if ( study && !anEntry.isNull() ) { - _PTR(SObject) aSO( study->FindObjectID( anEntry.toStdString() ) ); - if ( aSO && aSO->GetFatherComponent() ) - return aSO->GetFatherComponent()->GetIOR() == aSO->GetIOR(); - } - } - return false; -} - -GEOM::GEOM_Object_ptr GEOMGUI_Selection::getObject( const int index ) const -{ - GEOM::GEOM_Object_var o; - if ( 0 <= index && index < myObjects.size() ) - o = GEOM::GEOM_Object::_duplicate( myObjects[index] ); - return o._retn(); -} - -QString GEOMGUI_Selection::selectionMode() const -{ - SalomeApp_Application* app = dynamic_cast( study()->application() ); - 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 ""; -} - -bool GEOMGUI_Selection::topLevel( const int index ) const { - bool res = false; - -#ifdef USE_VISUAL_PROP_MAP - bool found = false; - QVariant v = visibleProperty( entry( index ), TOP_LEVEL_PROP ); - if ( v.canConvert() ) { - res = v.toBool(); - found = true; - } - - if ( !found ) { -#endif - SALOME_View* view = GEOM_Displayer::GetActiveView(); - QString viewType = activeViewType(); - if ( view && viewType == OCCViewer_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() ) - res = (bool)aSh->isTopLevel(); - } - } - } - } - } - } - return res; -} +// Copyright (C) 2007-2011 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 "Material_Model.h" + +#include + +#include +#include + +#include "LightApp_DataOwner.h" + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include + +// OCCT Includes +#include +#include +#include +#include +#include +#include +#include + +// VTK Includes +#include + +#define OCC_DISPLAY_MODE_TO_STRING( str, dm ) { \ + if ( dm == AIS_WireFrame ) \ + str = QString( "Wireframe" ); \ + else if ( dm == AIS_Shaded ) \ + str = QString( "Shading" ); \ + else if ( dm == GEOM_AISShape::ShadingWithEdges ) \ + str = QString( "ShadingWithEdges" ); \ + else if ( dm == GEOM_AISShape::TexturedShape ) \ + str = QString( "Texture" ); \ + else \ + str = QString(); } + +#define VTK_DISPLAY_MODE_TO_STRING( str, dm ) { \ + if ( dm == 0 ) \ + str = QString( "Wireframe" ); \ + else if ( dm == 1 ) \ + str = QString( "Shading" ); \ + else if ( dm == 3 ) \ + str = QString( "ShadingWithEdges" ); \ + else \ + str = QString(); } + +#define USE_VISUAL_PROP_MAP + +GEOMGUI_Selection::GEOMGUI_Selection() +: LightApp_Selection() +{ +} + +GEOMGUI_Selection::~GEOMGUI_Selection() +{ +} + +void GEOMGUI_Selection::init( const QString& context, LightApp_SelectionMgr* selMgr ) +{ + LightApp_Selection::init( context, selMgr ); + + myObjects.resize( count() ); + + SalomeApp_Study* appStudy = dynamic_cast( study() ); + if ( appStudy ) { + _PTR(Study) study = appStudy->studyDS(); + for ( int idx = 0; idx < count(); idx++ ) { + QString anEntry = entry( idx ); + if ( study && !anEntry.isEmpty() ) { + _PTR(SObject) aSO( study->FindObjectID( anEntry.toStdString() ) ); + if ( aSO ) { + CORBA::Object_var varObj = GeometryGUI::ClientSObjectToObject( aSO ); + myObjects[idx] = GEOM::GEOM_Object::_narrow( varObj ); + } + } + } + } +} + +//QVariant GEOMGUI_Selection::contextParameter( const QString& p ) const +QVariant GEOMGUI_Selection::parameter( const QString& p ) const +{ + QVariant v; + if ( p == "isOCC" ) + v = activeViewType() == OCCViewer_Viewer::Type(); + else if ( p == "selectionmode" ) + v = selectionMode(); + else if ( p == "hasImported" ) + v = hasImported(); + else if ( p == "allImported" ) + v = allImported(); + else + v = LightApp_Selection::parameter( p ); + return v; +} + +//QVariant GEOMGUI_Selection::objectParameter( const int idx, const QString& p ) const +QVariant GEOMGUI_Selection::parameter( const int idx, const QString& p ) const +{ + QVariant v; + if ( p == "type" ) + v = typeName( idx ); + else if ( p == "typeid" ) + v = typeId( idx ); + else if ( p == "displaymode" ) + v = displayMode( idx ); + else if ( p == "isAutoColor" ) + v = isAutoColor( idx ); + else if ( p == "isVectorsMode" ) + v = isVectorsMode( idx ); + else if ( p == "topLevel" ) + v = topLevel( idx ); + else if ( p == "hasHiddenChildren" ) + v = hasHiddenChildren( idx ); + else if ( p == "hasShownChildren" ) + v = hasShownChildren( idx ); + else if ( p == "compoundOfVertices" ) + v = compoundOfVertices( idx ); + else if ( p == "imported" ) + v = isImported( idx ); + else if ( p == "isPhysicalMaterial" ) + v = isPhysicalMaterial(idx); + else + v = LightApp_Selection::parameter( idx, p ); + + return v; +} + +// the method to skip temporary objects from selection (called from LightApp) +bool GEOMGUI_Selection::processOwner( const LightApp_DataOwner* theOwner ) +{ + return !theOwner->entry().contains("_"); +} + +QString GEOMGUI_Selection::typeName( const int index ) const +{ + if ( isComponent( index ) ) + return "Component"; + + static QString aGroup( "Group" ); + static QString aShape( "Shape" ); + static QString anUnknown( "Unknown" ); + + GEOM::GEOM_Object_var anObj = getObject( index ); + if ( !CORBA::is_nil( anObj ) ) { + const int aGeomType = anObj->GetType(); + if ( aGeomType == GEOM_GROUP ) + return aGroup; + else + return aShape; + } + return anUnknown; +} + +int GEOMGUI_Selection::typeId( const int index ) const +{ + int aType = -1; + GEOM::GEOM_Object_var anObj = getObject( index ); + if ( !CORBA::is_nil( anObj ) ) + aType = (int)anObj->GetShapeType(); + return aType; +} + +bool GEOMGUI_Selection::isVisible( const int index ) const +{ + bool res = false; + +#ifdef USE_VISUAL_PROP_MAP + bool found = false; + QVariant v = visibleProperty( entry( index ), VISIBILITY_PROP ); + if ( v.canConvert( QVariant::Bool ) ) { + res = v.toBool(); + found = true; + } + + if ( !found ) { +#endif + 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 ).toLatin1().constData(), "GEOM", "TEMP_IO" ); + res = view->isVisible( io ); + } +#ifdef USE_VISUAL_PROP_MAP + } +#endif + + return res; +} + +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; +} + +bool GEOMGUI_Selection::isImported( const int index ) const +{ + GEOM::GEOM_Object_var obj = getObject( index ); + if ( !CORBA::is_nil( obj ) ) + return obj->GetType() == GEOM_IMPORT; + return false; +} + +bool GEOMGUI_Selection::hasImported() const +{ + bool res = false; + for ( int i = 0; i < count() && !res; i++ ) + res = isImported( i ); + return res; +} + +bool GEOMGUI_Selection::allImported() const +{ + bool res = true; + for ( int i = 0; i < count() && res; i++ ) + res = isImported( i ); + return res; +} + +QVariant GEOMGUI_Selection::visibleProperty( const QString& entry, const QString& propName ) const +{ + QVariant v; + LightApp_Study* aStudy = study(); + if ( aStudy ) { + LightApp_Application* anApp = ::qobject_cast( aStudy->application() ); + if ( anApp && anApp->activeViewManager() ) { + int id = anApp->activeViewManager()->getGlobalId(); + v = aStudy->getObjectProperty( id, entry, propName, QVariant() ); + } + } + return v; +} + +QString GEOMGUI_Selection::displayMode( const int index ) const +{ + QString res; + QString viewType = activeViewType(); +#ifdef USE_VISUAL_PROP_MAP + QVariant v = visibleProperty( entry( index ), DISPLAY_MODE_PROP ); + if ( v.canConvert( QVariant::Int ) ) { + int dm = v.toInt(); + if ( viewType == OCCViewer_Viewer::Type() ) { + OCC_DISPLAY_MODE_TO_STRING( res, dm ); + } else if ( viewType == SVTK_Viewer::Type() ) { + VTK_DISPLAY_MODE_TO_STRING( res, dm ); + } + } + + if ( res.isEmpty() ) { +#endif + SALOME_View* view = GEOM_Displayer::GetActiveView(); + if ( view /*fix for 9320==>*/&& ( 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() ) { + int dm = io->DisplayMode(); + OCC_DISPLAY_MODE_TO_STRING( res, dm ); + if ( res.isEmpty() ) { // return default display mode of AIS_InteractiveContext + OCCViewer_Viewer* occViewer = (OCCViewer_Viewer*)SUIT_Session::session()->activeApplication()-> + desktop()->activeWindow()->getViewManager()->getViewModel(); + Handle(AIS_InteractiveContext) ic = occViewer->getAISContext(); + dm = ic->DisplayMode(); + OCC_DISPLAY_MODE_TO_STRING( res, dm ); + } + } + } + } + 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 ) { + SALOME_Actor* salActor = dynamic_cast( actor ); + if ( salActor ) { + int dm = salActor->getDisplayMode(); + VTK_DISPLAY_MODE_TO_STRING( res, dm ); + } // if ( salome actor ) + } // if ( actor ) + } // if ( lst == vtkPrs->GetObjects() ) + } // if VTK + } + } + +#ifdef USE_VISUAL_PROP_MAP + } +#endif + + return res; +} + +bool GEOMGUI_Selection::isVectorsMode( const int index ) const +{ + bool res = false; + +#ifdef USE_VISUAL_PROP_MAP + bool found = false; + QVariant v = visibleProperty( entry( index ), VECTOR_MODE_PROP ); + if ( v.canConvert( QVariant::Bool ) ) { + res = v.toBool(); + found = true; + } + + if ( !found ) { +#endif + 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() ) + res = 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 ) + res = aGeomActor->GetVectorMode(); + } + } + } + } + } +#ifdef USE_VISUAL_PROP_MAP + } +#endif + + return res; +} + +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::isCompoundOfVertices( GEOM::GEOM_Object_ptr obj ) +{ + bool ret = false; + /* + SalomeApp_Study* appStudy = dynamic_cast + (SUIT_Session::session()->activeApplication()->activeStudy());*/ + if ( /*appStudy && */!CORBA::is_nil( obj ) ) + ret = obj->GetShapeType() == GEOM::COMPOUND && obj->GetMaxShapeType() == GEOM::VERTEX; + return ret; +} + +bool GEOMGUI_Selection::hasHiddenChildren( const int index ) const +{ + bool OK = false; + SalomeApp_Study* appStudy = dynamic_cast( study() ); + + if ( appStudy ) { + QString anEntry = entry( index ); + _PTR(Study) study = appStudy->studyDS(); + 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( study() ); + + if ( appStudy ) { + QString anEntry = entry( index ); + _PTR(Study) study = appStudy->studyDS(); + if ( study && !anEntry.isEmpty() ) { + _PTR(SObject) aSO( study->FindObjectID( anEntry.toStdString() ) ); + OK = expandable( aSO ) && hasChildren( aSO ); + } + } + return OK; +} + +bool GEOMGUI_Selection::compoundOfVertices( const int index ) const +{ + GEOM::GEOM_Object_var obj = getObject( index ); + return isCompoundOfVertices( obj ); +} + +bool GEOMGUI_Selection::isComponent( const int index ) const +{ + SalomeApp_Study* appStudy = dynamic_cast( study() ); + + if ( appStudy ) { + QString anEntry = entry( index ); + _PTR(Study) study = appStudy->studyDS(); + if ( study && !anEntry.isNull() ) { + _PTR(SObject) aSO( study->FindObjectID( anEntry.toStdString() ) ); + if ( aSO && aSO->GetFatherComponent() ) + return aSO->GetFatherComponent()->GetIOR() == aSO->GetIOR(); + } + } + return false; +} + +GEOM::GEOM_Object_ptr GEOMGUI_Selection::getObject( const int index ) const +{ + GEOM::GEOM_Object_var o; + if ( 0 <= index && index < myObjects.size() ) + o = GEOM::GEOM_Object::_duplicate( myObjects[index] ); + return o._retn(); +} + +QString GEOMGUI_Selection::selectionMode() const +{ + SalomeApp_Application* app = dynamic_cast( study()->application() ); + 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 ""; +} + +bool GEOMGUI_Selection::topLevel( const int index ) const { + bool res = false; + +#ifdef USE_VISUAL_PROP_MAP + bool found = false; + QVariant v = visibleProperty( entry( index ), TOP_LEVEL_PROP ); + if ( v.canConvert() ) { + res = v.toBool(); + found = true; + } + + if ( !found ) { +#endif + SALOME_View* view = GEOM_Displayer::GetActiveView(); + QString viewType = activeViewType(); + if ( view && viewType == OCCViewer_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() ) + res = (bool)aSh->isTopLevel(); + } + } + } + } + } + } + return res; +} + +bool GEOMGUI_Selection::isPhysicalMaterial( const int idx ) const{ + bool res = false; + +#ifdef USE_VISUAL_PROP_MAP + bool found = false; + QVariant v = visibleProperty( entry( idx ), MATERIAL_PROP ); + if ( v.canConvert() ) { + Material_Model* aModel = Material_Model::getMaterialModel( v.toString().split(DIGIT_SEPARATOR) ); + res = aModel->isPhysical(); + found = true; + } + + if ( !found ) { +#endif + SALOME_View* view = GEOM_Displayer::GetActiveView(); + QString viewType = activeViewType(); + if ( view ) { + SALOME_Prs* prs = view->CreatePrs( entry( idx ).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() ) + res =(bool) aSh->Attributes()->ShadingAspect()-> + Material(Aspect_TypeOfFacingModel::Aspect_TOFM_BOTH_SIDE).MaterialType( Graphic3d_MATERIAL_PHYSIC ); + } + } + } + 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* aGeomGActor = GEOM_Actor::SafeDownCast( actor ); + if ( aGeomGActor ) { + GEOM_VTKPropertyMaterial* mat = GEOM_VTKPropertyMaterial::SafeDownCast(aGeomGActor->GetProperty()); + res = mat->GetPhysical(); + } // if ( salome actor ) + } // if ( actor ) + } // if ( lst == vtkPrs->GetObjects() ) + } + } + } + } + return res; +} \ No newline at end of file diff --git a/src/GEOMGUI/GEOMGUI_Selection.h b/src/GEOMGUI/GEOMGUI_Selection.h index ed9ed7182..79220d649 100644 --- a/src/GEOMGUI/GEOMGUI_Selection.h +++ b/src/GEOMGUI/GEOMGUI_Selection.h @@ -70,6 +70,7 @@ private: bool hasShownChildren( const int ) const; bool compoundOfVertices( const int ) const; bool topLevel( const int ) const; + bool isPhysicalMaterial( const int ) const; bool isComponent( const int ) const; GEOM::GEOM_Object_ptr getObject( const int ) const; diff --git a/src/GEOMGUI/GEOM_Displayer.cxx b/src/GEOMGUI/GEOM_Displayer.cxx index ea0fbcade..281404e97 100644 --- a/src/GEOMGUI/GEOM_Displayer.cxx +++ b/src/GEOMGUI/GEOM_Displayer.cxx @@ -41,6 +41,7 @@ #include #include #include +#include #include @@ -809,7 +810,7 @@ void GEOM_Displayer::Update( SALOME_OCCPrs* prs ) anAspect = AISShape->Attributes()->UnFreeBoundaryAspect(); anAspect->SetColor( aColor ); AISShape->Attributes()->SetUnFreeBoundaryAspect( anAspect ); - AISShape->storeBoundaryColors(); + AISShape->storeBoundaryColors(); // Set free boundaries aspect col = aResMgr->colorValue( "Geometry", "free_bound_color", QColor( 0, 255, 0 ) ); @@ -827,10 +828,10 @@ void GEOM_Displayer::Update( SALOME_OCCPrs* prs ) anAspect->SetColor( aColor ); AISShape->Attributes()->SetWireAspect( anAspect ); - // Set color for edges in shading - col = aResMgr->colorValue( "Geometry", "edges_in_shading_color", QColor( 255, 255, 0 ) ); - aColor = SalomeApp_Tools::color( col ); - AISShape->SetEdgesInShadingColor( aColor ); + // Set color for edges in shading + col = aResMgr->colorValue( "Geometry", "edges_in_shading_color", QColor( 255, 255, 0 ) ); + aColor = SalomeApp_Tools::color( col ); + AISShape->SetEdgesInShadingColor( aColor ); // bug [SALOME platform 0019868] // Set deviation angle. Default one is 12 degrees (Prs3d_Drawer.cxx:18) @@ -840,8 +841,8 @@ void GEOM_Displayer::Update( SALOME_OCCPrs* prs ) double aDC = 0; if(useStudy) { aDC = aPropMap.value(DEFLECTION_COEFF_PROP).toDouble(); - SetWidth(aPropMap.value(EDGE_WIDTH_PROP).toInt()); - SetIsosWidth(aPropMap.value(ISOS_WIDTH_PROP).toInt()); + SetWidth(aPropMap.value(EDGE_WIDTH_PROP).toInt()); + SetIsosWidth(aPropMap.value(ISOS_WIDTH_PROP).toInt()); } else { aDC = aResMgr->doubleValue("Geometry", "deflection_coeff", 0.001); @@ -960,62 +961,30 @@ void GEOM_Displayer::Update( SALOME_OCCPrs* prs ) // get material properties, set material Material_Model* aModelF = 0; - Material_Model* aModelB = 0; if ( useStudy ) { - // Get front material property from study and construct front material model - QString aMaterialF = aPropMap.value(FRONT_MATERIAL_PROP).toString(); + // Get material property from study and construct material model + QString aMaterialF = aPropMap.value(MATERIAL_PROP).toString(); QStringList aProps = aMaterialF.split(DIGIT_SEPARATOR); aModelF = Material_Model::getMaterialModel( aProps ); - - // Get back material property from study and construct back material model - QString aMaterialB = aPropMap.value(BACK_MATERIAL_PROP).toString(); - if ( !aMaterialB.isEmpty() ) { - QStringList aPropsB = aMaterialB.split(DIGIT_SEPARATOR); - aModelB = Material_Model::getMaterialModel( aPropsB ); - } - else - aModelB = aModelF; - } else { - // Get front material property from study and construct front material model + // Get material property from study and construct material model aModelF = new Material_Model(); - aModelF->fromResources( aResMgr, "Geometry", true ); - - // Get back material property from study and construct back material model - aModelB = new Material_Model(); - aModelB->fromResources( aResMgr, "Geometry", false ); + aModelF->fromResources( aResMgr, "Geometry" ); } - // Set front material property + // Set material property QString aMaterialPropF = aModelF->getMaterialProperty(); - aStudy->setObjectProperty( aMgrId, anIO->getEntry(), FRONT_MATERIAL_PROP, aMaterialPropF ); + aStudy->setObjectProperty( aMgrId, anIO->getEntry(), MATERIAL_PROP, aMaterialPropF ); - // Set back material property - QString aMaterialPropB = aModelB->getMaterialProperty(); - aStudy->setObjectProperty( aMgrId, anIO->getEntry(), BACK_MATERIAL_PROP, aMaterialPropB ); - - // Get front material properties from the model + // Get material properties from the model Graphic3d_MaterialAspect aMatF = aModelF->getMaterialOCCAspect(); - // Get back material properties from the model - Graphic3d_MaterialAspect aMatB = aModelB->getMaterialOCCAspect(); - - // Set front material for the selected shape - AISShape->SetCurrentFacingModel(Aspect_TOFM_FRONT_SIDE); - AISShape->SetMaterial(aMatF); - - // Set back material for the selected shape - AISShape->SetCurrentFacingModel(Aspect_TOFM_BACK_SIDE); - AISShape->SetMaterial(aMatB); - - // Return to the default facing mode - AISShape->SetCurrentFacingModel(Aspect_TOFM_BOTH_SIDE); + // Set material for the selected shape + AISShape->SetMaterial(aMatF); // Release memory if ( aModelF ) delete aModelF; - if ( aModelB ) - delete aModelB; if(HasWidth()) aStudy->setObjectProperty( aMgrId, anIO->getEntry(), EDGE_WIDTH_PROP, GetWidth() ); @@ -1204,52 +1173,21 @@ void GEOM_Displayer::Update( SALOME_VTKPrs* prs ) aGeomGActor->setDisplayMode(aDispModeId); aGeomGActor->SetDeflection(aPropMap.value(DEFLECTION_COEFF_PROP).toDouble()); - // Get front material property of the object stored in the study - QString aMaterialF = aPropMap.value(FRONT_MATERIAL_PROP).toString(); + // Get material property of the object stored in the study + QString aMaterialF = aPropMap.value(MATERIAL_PROP).toString(); QStringList aPropsF = aMaterialF.split(DIGIT_SEPARATOR); - // Create front material model + // Create material model Material_Model* aModelF = Material_Model::getMaterialModel( aPropsF ); - // Set front material properties for the object + // Set material properties for the object QString aMaterialPropF = aModelF->getMaterialProperty(); - aStudy->setObjectProperty( aMgrId, anEntry, FRONT_MATERIAL_PROP, aMaterialPropF ); - // Get material properties from the front model - vtkProperty* aMatPropF = aModelF->getMaterialVTKProperty(); + aStudy->setObjectProperty( aMgrId, anEntry, MATERIAL_PROP, aMaterialPropF ); + // Get material properties from the model + GEOM_VTKPropertyMaterial* aMatPropF = aModelF->getMaterialVTKProperty(); + // Set the same front and back materials for the selected shape + std::vector aProps; + aProps.push_back( (vtkProperty*) aMatPropF ); + aGeomGActor->SetMaterial(aProps); - // Get back material property of the object stored in the study - QString aMaterialB = aPropMap.value(BACK_MATERIAL_PROP).toString(); - if ( !aMaterialB.isEmpty() ) { - QStringList aPropsB = aMaterialB.split(DIGIT_SEPARATOR); - // Create back material model - Material_Model* aModelB = Material_Model::getMaterialModel( aPropsB ); - // Set back material properties for the object - QString aMaterialPropB = aModelB->getMaterialProperty(); - aStudy->setObjectProperty( aMgrId, anEntry, BACK_MATERIAL_PROP, aMaterialPropB ); - // Get material properties from the back model - vtkProperty* aMatPropB = aModelB->getMaterialVTKProperty(); - - // Set front and back materials for the selected shape - std::vector aProps; - aProps.push_back(aMatPropF); - aProps.push_back(aMatPropB); - aGeomGActor->SetMaterial(aProps); - - // Release memory - delete aModelB; - - if(HasWidth()) - aStudy->setObjectProperty( aMgrId, anEntry, EDGE_WIDTH_PROP, GetWidth() ); - - if(HasIsosWidth()) - aStudy->setObjectProperty( aMgrId, anEntry, ISOS_WIDTH_PROP, GetIsosWidth() ); - - } - else { - // Set the same front and back materials for the selected shape - std::vector aProps; - aProps.push_back(aMatPropF); - aGeomGActor->SetMaterial(aProps); - } - // Release memory delete aModelF; @@ -1283,37 +1221,26 @@ void GEOM_Displayer::Update( SALOME_VTKPrs* prs ) } } } - aGeomGActor->SetColor(aColor[0],aColor[1],aColor[2]); + if ( !aMatPropF->GetPhysical() ) + aGeomGActor->SetColor(aColor[0],aColor[1],aColor[2]); } else { SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); if ( aResMgr ) { - // Create front material model + // Create material model Material_Model aModelF; - // Get front material name from resources - aModelF.fromResources( aResMgr, "Geometry", true ); - // Set front material properties for the object + // Get material name from resources + aModelF.fromResources( aResMgr, "Geometry" ); + // Set material properties for the object QString aMaterialPropF = aModelF.getMaterialProperty(); - aStudy->setObjectProperty( aMgrId, anEntry, FRONT_MATERIAL_PROP, aMaterialPropF ); - // Get material properties from the front model - vtkProperty* aMatPropF = aModelF.getMaterialVTKProperty(); - - // Create back material model - Material_Model aModelB; - // Get back material name from resources - aModelB.fromResources( aResMgr, "Geometry", false ); - // Set back material properties for the object - QString aMaterialPropB = aModelB.getMaterialProperty(); - aStudy->setObjectProperty( aMgrId, anEntry, BACK_MATERIAL_PROP, aMaterialPropB ); - // Get material properties from the back model - vtkProperty* aMatPropB = aModelB.getMaterialVTKProperty(); + aStudy->setObjectProperty( aMgrId, anEntry, MATERIAL_PROP, aMaterialPropF ); + // Get material properties from the model + GEOM_VTKPropertyMaterial* aMatPropF = aModelF.getMaterialVTKProperty(); // Set material for the selected shape - std::vector aProps; - aProps.push_back(aMatPropF); - aProps.push_back(aMatPropB); - aGeomGActor->SetMaterial(aProps); - } + std::vector aProps; + aProps.push_back( (vtkProperty*) aMatPropF ); + aGeomGActor->SetMaterial(aProps); } } } @@ -2009,23 +1936,16 @@ PropMap GEOM_Displayer::getDefaultPropertyMap(const QString& viewer_type) { aDefaultMap.insert( DEFLECTION_COEFF_PROP , aDC); //8. Material - // Front material Material_Model aModelF; - aModelF.fromResources( aResMgr, "Geometry", true ); + aModelF.fromResources( aResMgr, "Geometry" ); QString aMaterialF = aModelF.getMaterialProperty(); - aDefaultMap.insert( FRONT_MATERIAL_PROP , aMaterialF ); + aDefaultMap.insert( MATERIAL_PROP , aMaterialF ); - //9. Back material - Material_Model aModelB; - aModelB.fromResources( aResMgr, "Geometry", false ); - QString aMaterialB = aModelB.getMaterialProperty(); - aDefaultMap.insert( BACK_MATERIAL_PROP , aMaterialB ); - - //10. Width of the edges + //9. Width of the edges aDefaultMap.insert( EDGE_WIDTH_PROP , aResMgr->integerValue("Geometry", "edge_width", 1)); - //11. Width of iso-lines + //10. Width of iso-lines aDefaultMap.insert( ISOS_WIDTH_PROP , aResMgr->integerValue("Geometry", "isolines_width", 1)); if(viewer_type == SOCC_Viewer::Type()) { @@ -2062,12 +1982,8 @@ bool GEOM_Displayer::MergePropertyMaps(PropMap& theOrigin, PropMap& theDefault) theOrigin.insert(DEFLECTION_COEFF_PROP, theDefault.value(DEFLECTION_COEFF_PROP)); nbInserted++; } - if(!theOrigin.contains(FRONT_MATERIAL_PROP)) { - theOrigin.insert(FRONT_MATERIAL_PROP, theDefault.value(FRONT_MATERIAL_PROP)); - nbInserted++; - } - if(!theOrigin.contains(BACK_MATERIAL_PROP)) { - theOrigin.insert(BACK_MATERIAL_PROP, theDefault.value(BACK_MATERIAL_PROP)); + if(!theOrigin.contains(MATERIAL_PROP)) { + theOrigin.insert(MATERIAL_PROP, theDefault.value(MATERIAL_PROP)); nbInserted++; } @@ -2081,6 +1997,11 @@ bool GEOM_Displayer::MergePropertyMaps(PropMap& theOrigin, PropMap& theDefault) nbInserted++; } + if(!theOrigin.contains(COLOR_PROP)) { + theOrigin.insert(COLOR_PROP, theDefault.value(COLOR_PROP)); + nbInserted++; + } + return (nbInserted > 0); } diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index b43229a40..51660252e 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -3015,12 +3015,8 @@ Please, select face, shell or solid and try again Default wireframe color - PREF_FRONT_MATERIAL - Default front material - - - PREF_BACK_MATERIAL - Default back material + PREF_MATERIAL + Default material PREF_EDGE_WIDTH @@ -5274,6 +5270,10 @@ Would you like to continue? SHININESS Shininess: + + PHYSICAL + Physical: + CUSTOM_MATERIAL Custom material diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index 983f5ab23..54309e6bc 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -5274,6 +5274,10 @@ Voulez-vous continuer? SHININESS Shininess: + + PHYSICAL + Physical: + CUSTOM_MATERIAL Matériau personnalisé diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index b9fa45797..6fc3eeb06 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -591,10 +591,7 @@ void GeometryGUI::OnGUIEvent( int id ) if ( pref ) { Material_ResourceMgr aMatResMgr; QStringList aPerfMatNames = aMatResMgr.getPreferenceMaterialsNames(); - setPreferenceProperty( pref->rootItem()->findItem( tr( "PREF_FRONT_MATERIAL" ), true )->id(), - "strings", - aPerfMatNames ); - setPreferenceProperty( pref->rootItem()->findItem( tr( "PREF_BACK_MATERIAL" ), true )->id(), + setPreferenceProperty( pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true )->id(), "strings", aPerfMatNames ); } @@ -1250,7 +1247,7 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule ); mgr->insert( separator(), -1, -1 ); // ----------- mgr->insert( action( GEOMOp::OpColor ), -1, -1 ); // color - mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule ); + mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule ); mgr->insert( action( GEOMOp::OpTransparency ), -1, -1 ); // transparency mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule ); mgr->insert( action( GEOMOp::OpIsos ), -1, -1 ); // isos @@ -1719,14 +1716,10 @@ void GeometryGUI::createPreferences() int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup, LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" ); - int front_material = addPreference( tr( "PREF_FRONT_MATERIAL" ), genGroup, + int material = addPreference( tr( "PREF_MATERIAL" ), genGroup, LightApp_Preferences::Selector, - "Geometry", "front_material" ); + "Geometry", "material" ); - int back_material = addPreference( tr( "PREF_BACK_MATERIAL" ), genGroup, - LightApp_Preferences::Selector, - "Geometry", "back_material" ); - const int nb = 4; int wd[nb]; int iter=0; @@ -1816,8 +1809,7 @@ void GeometryGUI::createPreferences() // Set property for default material Material_ResourceMgr aMatResMgr; QStringList aPrefMatNames = aMatResMgr.getPreferenceMaterialsNames(); - setPreferenceProperty( front_material, "strings", aPrefMatNames ); - setPreferenceProperty( back_material, "strings", aPrefMatNames ); + setPreferenceProperty( material, "strings", aPrefMatNames ); // Set property vertex marker type QList aMarkerTypeIndicesList; @@ -2014,17 +2006,11 @@ void GeometryGUI::storeVisualParameters (int savePoint) ip->setParameter(entry, param, aProps.value(MARKER_TYPE_PROP).toString().toLatin1().data()); } - if(aProps.contains(FRONT_MATERIAL_PROP)) { - param = occParam + FRONT_MATERIAL_PROP; - ip->setParameter(entry, param, aProps.value(FRONT_MATERIAL_PROP).toString().toLatin1().data()); + if(aProps.contains(MATERIAL_PROP)) { + param = occParam + MATERIAL_PROP; + ip->setParameter(entry, param, aProps.value(MATERIAL_PROP).toString().toLatin1().data()); } - if(aProps.contains(BACK_MATERIAL_PROP)) { - param = occParam + BACK_MATERIAL_PROP; - ip->setParameter(entry, param, aProps.value(BACK_MATERIAL_PROP).toString().toLatin1().data()); - - } - if(aProps.contains( EDGE_WIDTH_PROP )) { param = occParam + EDGE_WIDTH_PROP; ip->setParameter(entry, param, aProps.value(EDGE_WIDTH_PROP).toString().toLatin1().data()); @@ -2144,10 +2130,8 @@ void GeometryGUI::restoreVisualParameters (int savePoint) aListOfMap[viewIndex].insert( DEFLECTION_COEFF_PROP, val.toDouble()); } else if(paramNameStr == MARKER_TYPE_PROP) { aListOfMap[viewIndex].insert( MARKER_TYPE_PROP, val); - } else if(paramNameStr == FRONT_MATERIAL_PROP) { - aListOfMap[viewIndex].insert( FRONT_MATERIAL_PROP, val); - } else if(paramNameStr == BACK_MATERIAL_PROP) { - aListOfMap[viewIndex].insert( BACK_MATERIAL_PROP, val); + } else if(paramNameStr == MATERIAL_PROP) { + aListOfMap[viewIndex].insert( MATERIAL_PROP, val); } else if(paramNameStr == EDGE_WIDTH_PROP) { aListOfMap[viewIndex].insert( EDGE_WIDTH_PROP , val); } else if(paramNameStr == ISOS_WIDTH_PROP) {