From: ana Date: Fri, 28 Dec 2012 15:55:12 +0000 (+0000) Subject: 0021719: EDF 1654 : Materials X-Git-Tag: V6_main_FINAL~70 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=a0d61b1163321ae079f69e0c69333851fe1a4e47;p=modules%2Fgeom.git 0021719: EDF 1654 : Materials --- diff --git a/resources/SalomeApp.xml.in b/resources/SalomeApp.xml.in index 83ef31de5..2d32d28fe 100644 --- a/resources/SalomeApp.xml.in +++ b/resources/SalomeApp.xml.in @@ -58,6 +58,7 @@ + diff --git a/src/GEOMGUI/GEOMGUI.cxx b/src/GEOMGUI/GEOMGUI.cxx index b87f89833..2e1021de3 100644 --- a/src/GEOMGUI/GEOMGUI.cxx +++ b/src/GEOMGUI/GEOMGUI.cxx @@ -48,6 +48,15 @@ GEOMGUI::~GEOMGUI() { } +//================================================================================= +// class : GEOMGUI::OnGUIEvent +// purpose : Main/popup menu events processing +//================================================================================= +bool GEOMGUI::OnGUIEvent( int /*theCommandID*/, SUIT_Desktop* /*parent*/, const QVariant& /*theParam*/ ) +{ + return TRUE; +} + //================================================================================= // class : GEOMGUI::OnGUIEvent // purpose : Main/popup menu events processing diff --git a/src/GEOMGUI/GEOMGUI.h b/src/GEOMGUI/GEOMGUI.h index 87b76ed24..eac15283a 100644 --- a/src/GEOMGUI/GEOMGUI.h +++ b/src/GEOMGUI/GEOMGUI.h @@ -51,6 +51,7 @@ public : // Each of this methods can be redifined by descendants virtual bool OnGUIEvent( int theCommandID, SUIT_Desktop* parent ); + virtual bool OnGUIEvent( int theCommandID, SUIT_Desktop* parent, const QVariant& theParam ); virtual bool OnMousePress( QMouseEvent* pe, SUIT_Desktop* parent, SUIT_ViewWindow* ); virtual bool OnMouseMove( QMouseEvent* pe, SUIT_Desktop* parent, SUIT_ViewWindow* ); diff --git a/src/GEOMGUI/GEOM_Displayer.cxx b/src/GEOMGUI/GEOM_Displayer.cxx index 50dac6d68..133ec0932 100644 --- a/src/GEOMGUI/GEOM_Displayer.cxx +++ b/src/GEOMGUI/GEOM_Displayer.cxx @@ -984,7 +984,15 @@ void GEOM_Displayer::Update( SALOME_OCCPrs* prs ) aStudy->setObjectProperty( aMgrId, anIO->getEntry(), MATERIAL_PROP, material.toProperties() ); // Set material for the selected shape - AISShape->SetMaterial( material.getMaterialOCCAspect() ); + // Set front material for the selected shape + AISShape->SetCurrentFacingModel(Aspect_TOFM_FRONT_SIDE); + AISShape->SetMaterial( material.getMaterialOCCAspect( true ) ); + // Set back material for the selected shape + AISShape->SetCurrentFacingModel(Aspect_TOFM_BACK_SIDE); + AISShape->SetMaterial( material.getMaterialOCCAspect( false ) ); + // Return to the default facing mode + AISShape->SetCurrentFacingModel(Aspect_TOFM_BOTH_SIDE); + if(HasWidth()) aStudy->setObjectProperty( aMgrId, anIO->getEntry(), EDGE_WIDTH_PROP, GetWidth() ); if(HasIsosWidth()) @@ -1191,7 +1199,8 @@ void GEOM_Displayer::Update( SALOME_VTKPrs* prs ) aStudy->setObjectProperty( aMgrId, anEntry, MATERIAL_PROP, material.toProperties() ); // Set the same front and back materials for the selected shape std::vector aProps; - aProps.push_back( material.getMaterialVTKProperty() ); + aProps.push_back( material.getMaterialVTKProperty( true ) ); + aProps.push_back( material.getMaterialVTKProperty( false) ); aGeomGActor->SetMaterial(aProps); vtkFloatingPointType aColor[3] = {1.,0.,0.}; @@ -1240,7 +1249,8 @@ void GEOM_Displayer::Update( SALOME_VTKPrs* prs ) aStudy->setObjectProperty( aMgrId, anEntry, MATERIAL_PROP, material.toProperties() ); // Set material for the selected shape std::vector aProps; - aProps.push_back( material.getMaterialVTKProperty() ); + aProps.push_back( material.getMaterialVTKProperty( true ) ); + aProps.push_back( material.getMaterialVTKProperty( false ) ); aGeomGActor->SetMaterial(aProps); } } diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 064abaa7f..1eeee7c48 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -2966,6 +2966,10 @@ Please, select face, shell or solid and try again MEN_TOOLS Tools + + MEN_MATERIALS_LIBRARY + Materials library + MEN_TORUS Torus @@ -3026,6 +3030,10 @@ Please, select face, shell or solid and try again MEN_POP_MATERIAL_PROPERTIES Material Properties + + MEN_POP_PREDEF_MATER_CUSTOM + Custom... + NAME_LBL Name: @@ -3170,6 +3178,10 @@ Please, select face, shell or solid and try again PREF_MATERIAL Default material + + PREF_PREDEF_MATERIALS + Show predefined materials in popup menu + PREF_EDGE_WIDTH Edges width @@ -3202,6 +3214,10 @@ Please, select face, shell or solid and try again PROCESS_SHAPE_NEW_OBJ_NAME ProcessShape + + MATERIAL_LIBRARY_TLT + Materials Library + REMOVE_HOLES_NEW_OBJ_NAME SupressHoles @@ -3614,6 +3630,14 @@ Please, select face, shell or solid and try again STB_POP_WIREFRAME Wireframe + + STB_MATERIALS_LIBRARY + Displays content of Materials library + + + STB_POP_PREDEF_MATER_CUSTOM + Custom... + STB_PROPAGATE Propagate @@ -5566,6 +5590,14 @@ Would you like to continue? MATERIAL_PROPERTIES_TLT Color and Material Properties + + FRONT_FACE + Front face + + + BACK_FACE + Back face + REFLECTION_0 Ambient @@ -5582,10 +5614,6 @@ Would you like to continue? REFLECTION_3 Emissive - - ENABLED - Enabled - SHININESS Shininess: diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index b423af062..adab9838d 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -5557,10 +5557,6 @@ Voulez-vous continuer? REFLECTION_3 Emissive - - ENABLED - Activée - SHININESS Brillance: diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index 262efef7f..6fa068346 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -38,6 +38,7 @@ #include "GEOM_Actor.h" #include +#include #include #include @@ -84,6 +85,7 @@ #include #include #include +#include #include #include @@ -358,7 +360,7 @@ void GeometryGUI::OnGUIEvent() // function : GeometryGUI::OnGUIEvent() // purpose : manage all events on GUI [static] //======================================================================= -void GeometryGUI::OnGUIEvent( int id ) +void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam ) { SUIT_Application* anApp = application(); if (!anApp) return; @@ -407,6 +409,7 @@ void GeometryGUI::OnGUIEvent( int id ) case GEOMOp::OpSelectAll: // POPUP MENU - SELECT ONLY - SELECT ALL case GEOMOp::OpDelete: // MENU EDIT - DELETE case GEOMOp::OpCheckGeom: // MENU TOOLS - CHECK GEOMETRY + case GEOMOp::OpMaterialsLibrary: // MENU TOOLS - MATERIALS LIBRARY case GEOMOp::OpDeflection: // POPUP MENU - DEFLECTION COEFFICIENT case GEOMOp::OpColor: // POPUP MENU - COLOR case GEOMOp::OpSetTexture: // POPUP MENU - SETTEXTURE @@ -424,6 +427,8 @@ void GeometryGUI::OnGUIEvent( int id ) case GEOMOp::OpPublishObject: // ROOT GEOM OBJECT - POPUP MENU - PUBLISH case GEOMOp::OpPointMarker: // POPUP MENU - POINT MARKER case GEOMOp::OpMaterialProperties: // POPUP MENU - MATERIAL PROPERTIES + case GEOMOp::OpPredefMaterial: // POPUP MENU - + case GEOMOp::OpPredefMaterCustom: // POPUP MENU - MATERIAL PROPERTIES - CUSTOM... case GEOMOp::OpEdgeWidth: // POPUP MENU - LINE WIDTH - EDGE WIDTH case GEOMOp::OpIsosWidth: // POPUP MENU - LINE WIDTH - ISOS WIDTH case GEOMOp::OpBringToFront: // POPUP MENU - BRING TO FRONT @@ -594,8 +599,10 @@ void GeometryGUI::OnGUIEvent( int id ) // call method of corresponding GUI library if ( library ) { - library->OnGUIEvent( id, desk ); - + if( !theParam.isValid() ) + library->OnGUIEvent( id, desk ); + else + library->OnGUIEvent( id, desk, theParam); // Update a list of materials for "Preferences" dialog if ( id == GEOMOp::OpMaterialProperties ) { LightApp_Preferences* pref = preferences(); @@ -845,6 +852,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpCheckGeom, "CHECK_GEOMETRY" ); #endif + createGeomAction( GEOMOp::OpMaterialsLibrary, "MATERIALS_LIBRARY" ); createGeomAction( GEOMOp::OpDMWireframe, "WIREFRAME" ); createGeomAction( GEOMOp::OpDMShading, "SHADING" ); createGeomAction( GEOMOp::OpDMShadingWithEdges, "SHADING_WITH_EDGES" ); @@ -886,7 +894,8 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpUnpublishObject, "POP_UNPUBLISH_OBJ" ); createGeomAction( GEOMOp::OpPublishObject, "POP_PUBLISH_OBJ" ); createGeomAction( GEOMOp::OpPointMarker, "POP_POINT_MARKER" ); - createGeomAction( GEOMOp::OpMaterialProperties, "POP_MATERIAL_PROPERTIES" ); + createGeomAction( GEOMOp::OpMaterialProperties, "POP_MATERIAL_PROPERTIES" ); + createGeomAction( GEOMOp::OpPredefMaterCustom, "POP_PREDEF_MATER_CUSTOM" ); createGeomAction( GEOMOp::OpPipeTShape, "PIPETSHAPE" ); @@ -1084,6 +1093,11 @@ void GeometryGUI::initialize( CAM_Application* app ) createMenu( separator(), toolsId, -1 ); createMenu( GEOMOp::OpCheckGeom, toolsId, -1 ); #endif + + int toolsId = createMenu( tr( "MEN_TOOLS" ), -1, -1 ); + createMenu( separator(), toolsId, -1 ); + createMenu( GEOMOp::OpMaterialsLibrary, toolsId, -1 ); + createMenu( separator(), toolsId, -1 ); int viewId = createMenu( tr( "MEN_VIEW" ), -1, -1 ); createMenu( separator(), viewId, -1 ); @@ -1288,6 +1302,7 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule ); 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'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule ); mgr->insert( action( GEOMOp::OpTransparency ), -1, -1 ); // transparency @@ -1299,9 +1314,13 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->insert( action( GEOMOp::OpPointMarker ), -1, -1 ); // point marker //mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and $typeid in {%1}" ).arg(GEOM_POINT ), QtxPopupMgr::VisibleRule ); mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and ( $typeid in {%1} or compoundOfVertices=true ) " ).arg(GEOM::VERTEX).arg(GEOM::COMPOUND), QtxPopupMgr::VisibleRule ); - mgr->insert( action( GEOMOp::OpMaterialProperties ), -1, -1 ); // material properties - mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'}) and selcount>0 and isVisible", QtxPopupMgr::VisibleRule ); - mgr->insert( action( GEOMOp::OpSetTexture ), -1, -1 ); // texture + + // material properties + int MaterId = mgr->insert( action( GEOMOp::OpMaterialProperties ), -1, -1 ); + mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule ); + + // texture + mgr->insert( action( GEOMOp::OpSetTexture ), -1, -1 ); mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule ); int lineW = mgr->insert( tr( "MEN_LINE_WIDTH" ), -1, -1 ); // line width menu @@ -1688,6 +1707,55 @@ void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& SalomeApp_Module::contextMenuPopup( client, menu, title ); SALOME_ListIO lst; getApp()->selectionMgr()->selectedObjects( lst ); + + //Add submenu for predefined materials + bool isPredefMat = SUIT_Session::session()->resourceMgr()->booleanValue( "Geometry", "predef_materials" ); + if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() > 0 ) { + QtxPopupMgr* mgr = popupMgr(); + //get parrent for submenu + QAction* act = mgr->action( mgr->actionId( action( GEOMOp::OpMaterialProperties ) ) ); + //Clear old menu + QMenu* oldMenu = act->menu() ; + if( oldMenu ) { + delete oldMenu; + } + if( isPredefMat ){ + QMenu* matMenu = new QMenu(); + QSignalMapper* signalMapper = new QSignalMapper( matMenu ); + + //Get current material model for the object + QVariant v; + LightApp_Application* anApp = dynamic_cast( getApp() ); + if ( anApp && anApp->activeViewManager() ) { + LightApp_Study* aStudy = dynamic_cast( anApp->activeStudy() ); + if( aStudy ) { + v = aStudy->getObjectProperty( anApp->activeViewManager()->getGlobalId(), lst.Last()->getEntry(), MATERIAL_PROP, QVariant() ); + } + } + QString curModel = ""; + if ( v.canConvert() ) curModel = v.toString(); + // get list of all predefined materials + Material_ResourceMgr aMatResMgr; + QStringList matNameList = aMatResMgr.materials(); + foreach ( QString name, matNameList ) + { + QAction* menAct = matMenu->addAction( name ); + connect(menAct, SIGNAL( toggled( bool ) ), signalMapper, SLOT( map() ) ); + signalMapper->setMapping( menAct, name ); + menAct->setCheckable( true ); + // Set checked if this material is current + Material_Model aModel; + aModel.fromResources( name ); + menAct->setChecked( aModel.toProperties() == curModel ); + } + matMenu->insertAction( matMenu->addSeparator(), action( GEOMOp::OpPredefMaterCustom ) ); + matMenu->insertSeparator( action( GEOMOp::OpPredefMaterCustom ) ); + connect( signalMapper, SIGNAL( mapped( const QString & ) ), + this, SLOT( OnSetMaterial( const QString & ) ) ); + act->setMenu( matMenu ); + } + } + //Set name if ( ( client == "OCCViewer" || client == "VTKViewer" ) && lst.Extent() == 1 ) { Handle(SALOME_InteractiveObject) io = lst.First(); SalomeApp_Study* appStudy = dynamic_cast( application()->activeStudy() ); @@ -1701,6 +1769,12 @@ void GeometryGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& } } +void GeometryGUI::OnSetMaterial(const QString& theName) +{ + OnGUIEvent( GEOMOp::OpPredefMaterial, QVariant( theName ) ); +} + + void GeometryGUI::createPreferences() { int tabId = addPreference( tr( "PREF_TAB_SETTINGS" ) ); @@ -1745,6 +1819,9 @@ void GeometryGUI::createPreferences() int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup, LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" ); + int predef_materials = addPreference( tr( "PREF_PREDEF_MATERIALS" ), genGroup, + LightApp_Preferences::Bool, "Geometry", "predef_materials" ); + int material = addPreference( tr( "PREF_MATERIAL" ), genGroup, LightApp_Preferences::Selector, "Geometry", "material" ); @@ -1863,6 +1940,8 @@ void GeometryGUI::createPreferences() setPreferenceProperty( defl, "step", 1.0e-04 ); setPreferenceProperty( defl, "precision", 6 ); + // Set property for 'Show predefined materials' + setPreferenceProperty( predef_materials, "eval", true); // Set property for default material Material_ResourceMgr aMatResMgr; setPreferenceProperty( material, "strings", aMatResMgr.materials() ); diff --git a/src/GEOMGUI/GeometryGUI.h b/src/GEOMGUI/GeometryGUI.h index bde9446a7..b9553c157 100644 --- a/src/GEOMGUI/GeometryGUI.h +++ b/src/GEOMGUI/GeometryGUI.h @@ -111,7 +111,7 @@ public: void EmitSignalDefaultStepValueChanged( double newVal ); // Process action - void OnGUIEvent( int id ); + void OnGUIEvent( int id, const QVariant& theParam = QVariant( QVariant::Invalid ) ); // The Working Plane management void SetWorkingPlane( gp_Ax3 wp ) { myWorkingPlane = wp; } @@ -151,6 +151,7 @@ private slots: void OnGUIEvent(); void onWindowActivated( SUIT_ViewWindow* ); void onViewAboutToShow(); + void OnSetMaterial( const QString& ); signals : void SignalDeactivateActiveDialog(); diff --git a/src/GEOMGUI/GeometryGUI_Operations.h b/src/GEOMGUI/GeometryGUI_Operations.h index e17172e49..cea4c9048 100644 --- a/src/GEOMGUI/GeometryGUI_Operations.h +++ b/src/GEOMGUI/GeometryGUI_Operations.h @@ -29,6 +29,7 @@ namespace GEOMOp { OpExport = 1001, // MENU FILE - EXPORT OpDelete = 1020, // MENU EDIT - DELETE OpCheckGeom = 1030, // MENU TOOLS - CHECK GEOMETRY + OpMaterialsLibrary = 1040, // MENU TOOLS - MATERIALS LIBRARY OpSelectVertex = 1100, // POPUP MENU - SELECT ONLY - VERTEX OpSelectEdge = 1101, // POPUP MENU - SELECT ONLY - EDGE OpSelectWire = 1102, // POPUP MENU - SELECT ONLY - WIRE @@ -50,6 +51,8 @@ namespace GEOMOp { OpPointMarker = 1210, // POPUP MENU - POINT MARKER OpSetTexture = 1211, // POPUP MENU - SETTEXTURE OpMaterialProperties = 1212, // POPUP MENU - MATERIAL PROPERTIES + OpPredefMaterial = 1213, // POPUP MENU - MATERIAL PROPERTIES - + OpPredefMaterCustom = 1214, // POPUP MENU - MATERIAL PROPERTIES - CUSTOM... OpDiscloseChildren = 1250, // POPUP MENU - DISCLOSE CHILD ITEMS OpConcealChildren = 1251, // POPUP MENU - CONCEAL CHILD ITEMS OpUnpublishObject = 1253, // POPUP MENU - UNPUBLISH diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx index 01f2c182f..95b4507e8 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -325,7 +325,7 @@ bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) case GEOMOp::OpColor: // POPUP - COLOR OnColor(); break; - case GEOMOp::OpSetTexture: // POPUP - TEXTURE + case GEOMOp::OpSetTexture: // POPUP - TEXTURE OnTexture(); break; case GEOMOp::OpTransparency: // POPUP - TRANSPARENCY @@ -349,6 +349,12 @@ bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) case GEOMOp::OpMaterialProperties: // POPUP - MATERIAL PROPERTIES OnMaterialProperties(); break; + case GEOMOp::OpPredefMaterCustom: // POPUP - MATERIAL PROPERTIES - CUSTOM... + OnMaterialProperties(); + break; + case GEOMOp::OpMaterialsLibrary: // POPUP MENU - MATERIAL PROPERTIES + OnMaterialsLibrary(); + break; case GEOMOp::OpAutoColor: // POPUP - AUTO COLOR OnAutoColor(); break; @@ -387,6 +393,25 @@ bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) return true; } +//======================================================================= +// function : OnGUIEvent() +// purpose : +//======================================================================= +bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent, const QVariant& theParam ) +{ + getGeometryGUI()->EmitSignalDeactivateDialog(); + + switch ( theCommandID ) { + case GEOMOp::OpPredefMaterial: // POPUP MENU - MATERIAL PROPERTIES - + OnSetMaterial( theParam ); + break; + default: + SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); + break; + } + return true; +} + //=============================================================================== // function : OnEditDelete() // purpose : diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.h b/src/GEOMToolsGUI/GEOMToolsGUI.h index 8b6c32c78..6c04a9be5 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.h +++ b/src/GEOMToolsGUI/GEOMToolsGUI.h @@ -54,6 +54,8 @@ public: ~GEOMToolsGUI(); bool OnGUIEvent( int, SUIT_Desktop* ); + bool OnGUIEvent( int theCommandID, SUIT_Desktop*, const QVariant& ); + virtual void deactivate(); enum ActionType { SHOWDLG, INCR, DECR }; @@ -82,6 +84,8 @@ private: void OnPublishObject() ; void OnPointMarker(); void OnMaterialProperties(); + void OnMaterialsLibrary(); + void OnSetMaterial(const QVariant& ); void OnEdgeWidth(); void OnIsosWidth(); void OnBringToFront(); diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx index 526a9b1e4..ac3e8f5b4 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx @@ -34,7 +34,9 @@ #include "GEOMToolsGUI_PublishDlg.h" #include "GEOMToolsGUI_MaterialPropertiesDlg.h" #include "GEOMToolsGUI_LineWidthDlg.h" -#include "Material_Model.h" +#include + +#include #include #include @@ -109,6 +111,7 @@ // VTK includes #include +class QtxDialog; // If the next macro is defined, autocolor feature works for all sub-shapes; // if it is undefined, autocolor feature works for groups only #define GENERAL_AUTOCOLOR @@ -1006,7 +1009,14 @@ void GEOMToolsGUI::OnPointMarker() void GEOMToolsGUI::OnMaterialProperties() { - GEOMToolsGUI_MaterialPropertiesDlg dlg( SUIT_Session::session()->activeApplication()->desktop() ); + GEOMToolsGUI_MaterialPropertiesDlg* dlg = new GEOMToolsGUI_MaterialPropertiesDlg( SUIT_Session::session()->activeApplication()->desktop(), true, false, QtxDialog::OK | QtxDialog::Close | QtxDialog::Apply | QtxDialog::Help ); + dlg->show(); +} + +void GEOMToolsGUI::OnMaterialsLibrary() +{ + GEOMToolsGUI_MaterialPropertiesDlg dlg( SUIT_Session::session()->activeApplication()->desktop(), false, true, QtxDialog::Standard ); + dlg.setWindowTitle( tr( "MATERIAL_LIBRARY_TLT" ) ); dlg.exec(); } @@ -1444,3 +1454,90 @@ void GEOMToolsGUI::OnClsBringToFront() { } } +void GEOMToolsGUI::OnSetMaterial( const QVariant& theParam ) +{ + QString theName; + if ( theParam.canConvert() ) theName = theParam.toString(); + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) + return; + SalomeApp_Module* mod = dynamic_cast(app->activeModule()); + if(!mod) + return; + GEOM_Displayer* disp = dynamic_cast(mod->displayer()); + if(!disp) + return; + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + SalomeApp_Study* study = dynamic_cast( app->activeStudy() ); + if ( !aSelMgr || !study ) + return; + SALOME_ListIO selected; + aSelMgr->selectedObjects( selected ); + if ( selected.IsEmpty() ) + return; + SUIT_ViewWindow* window = app->desktop()->activeWindow(); + int mgrId = window->getViewManager()->getGlobalId(); + + // convert needed material properties to the string representation + Material_Model aModel; + aModel.fromResources( theName ); + QString prop = aModel.toProperties(); + + if ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() ) { + // for VTK viewer + SVTK_ViewWindow* vtkVW = dynamic_cast( window ); + if ( !vtkVW ) + return; + + SVTK_View* aView = vtkVW->getView(); + + // get VTK material properties from the current model + GEOM_VTKPropertyMaterial* vtkPropF = aModel.getMaterialVTKProperty(); + GEOM_VTKPropertyMaterial* vtkPropB = aModel.getMaterialVTKProperty( false ); + + SUIT_OverrideCursor wc(); + + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + // set material property to the presentation + aView->SetMaterial( It.Value(), vtkPropF, vtkPropB ); + // store chosen material in the property map + study->setObjectProperty( mgrId, It.Value()->getEntry(), MATERIAL_PROP, prop ); + // set correct color for the non-physical material + } + aView->Repaint(); + GeometryGUI::Modified(); + } + else if ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() ) { + // for OCC viewer + OCCViewer_Viewer* vm = dynamic_cast( window->getViewManager()->getViewModel() ); + if ( !vm ) + return; + + Handle(AIS_InteractiveContext) ic = vm->getAISContext(); + + // get OCC material aspect from the current model + Graphic3d_MaterialAspect front_occAspect = aModel.getMaterialOCCAspect( true ); + Graphic3d_MaterialAspect back_occAspect = aModel.getMaterialOCCAspect( false ); + + SUIT_OverrideCursor wc(); + + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + Handle(GEOM_AISShape) aisShape = GEOMBase::ConvertIOinGEOMAISShape( It.Value(), true ); + if ( !aisShape.IsNull() ) { + // Set front material for the selected shape + aisShape->SetCurrentFacingModel(Aspect_TOFM_FRONT_SIDE); + aisShape->SetMaterial(front_occAspect); + // Set back material for the selected shape + aisShape->SetCurrentFacingModel(Aspect_TOFM_BACK_SIDE); + aisShape->SetMaterial(back_occAspect); + // Return to the default facing mode + aisShape->SetCurrentFacingModel(Aspect_TOFM_BOTH_SIDE); + // store chosen material in the property map + study->setObjectProperty( mgrId, It.Value()->getEntry(), MATERIAL_PROP, prop ); + //if ( aisShape->DisplayMode() != AIS_Shaded) + ic->Redisplay( aisShape, Standard_False ); + } + } + ic->UpdateCurrentViewer(); + } +} diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.cxx index ca92d6f08..dc00889c8 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.cxx @@ -26,6 +26,7 @@ #include "GEOM_Constants.h" #include "GEOM_VTKPropertyMaterial.hxx" #include "GEOMBase.h" +#include "GEOM_Displayer.h" #include #include @@ -50,6 +51,7 @@ #include #include #include +#include #include #include #include @@ -89,13 +91,17 @@ void GEOMToolsGUI_MaterialList::contextMenuEvent( QContextMenuEvent* e ) /*! \brief Constructor \param parent parent widget + \param showSelWidget if \c true then objects can be selected by user + \param modal if \c true dialog box is modal + \param f specified control buttons for dialog box (QtxDialog::ButtonFlags) */ -GEOMToolsGUI_MaterialPropertiesDlg::GEOMToolsGUI_MaterialPropertiesDlg( QWidget* parent ) - : QtxDialog( parent, true, true, OK | Close | Apply | Help ) +GEOMToolsGUI_MaterialPropertiesDlg::GEOMToolsGUI_MaterialPropertiesDlg( QWidget* parent,bool showSelWidget, bool modal,const int f ) + : QtxDialog( parent, modal, true, f ) { + myShowSelWidget = showSelWidget; // Set title setWindowTitle( tr( "MATERIAL_PROPERTIES_TLT" ) ); - + // main layout QVBoxLayout* main = new QVBoxLayout( mainFrame() ); main->setMargin( 0 ); @@ -105,6 +111,11 @@ GEOMToolsGUI_MaterialPropertiesDlg::GEOMToolsGUI_MaterialPropertiesDlg( QWidget* QFrame* fr = new QFrame( mainFrame() ); fr->setFrameStyle( QFrame::Box | QFrame::Sunken ); main->addWidget( fr ); + // selection widget + myLineEditCurArg = new QLineEdit(fr); + myLineEditCurArg->setReadOnly(true); + myPushBtn = new QPushButton(fr); + QLabel* PushBtnLab = new QLabel( tr( "GEOM_OBJECTS" ), fr ); // materials list widget myMaterials = new GEOMToolsGUI_MaterialList( fr ); @@ -130,41 +141,64 @@ GEOMToolsGUI_MaterialPropertiesDlg::GEOMToolsGUI_MaterialPropertiesDlg( QWidget* // "physical" material type widgets myPhysical = new QCheckBox( tr( "PHYSICAL" ), propWidget ); + // Labels for front and back reflection components + QLabel* aFrontLabel = new QLabel( tr( "FRONT_FACE" ), propWidget ); + QLabel* aBackLabel = new QLabel( tr( "BACK_FACE" ), propWidget ); + // reflection components widgets for ( int i = Material_Model::Ambient; i <= Material_Model::Emissive; i++ ) { Reflection refl; + + refl.enabled = new QCheckBox( propWidget ); refl.label = new QLabel( tr( QString( "REFLECTION_%1" ).arg( i ).toLatin1().data() ), propWidget ); refl.color = new QtxColorButton( propWidget ); //refl.color->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - refl.coef = new QtxDoubleSpinBox( propWidget ); - refl.coef->setPrecision( 4 ); - refl.coef->setDecimals( 4 ); - refl.coef->setRange( 0., 1. ); - refl.coef->setSingleStep( 0.05 ); - refl.coef->setMinimumWidth( 80 ); - - refl.enabled = new QCheckBox( tr( "ENABLED" ), propWidget ); + refl.front_coef = new QtxDoubleSpinBox( propWidget ); + refl.front_coef->setPrecision( 4 ); + refl.front_coef->setDecimals( 4 ); + refl.front_coef->setRange( 0., 1. ); + refl.front_coef->setSingleStep( 0.05 ); + refl.front_coef->setMinimumWidth( 80 ); + + refl.back_coef = new QtxDoubleSpinBox( propWidget ); + refl.back_coef->setPrecision( 4 ); + refl.back_coef->setDecimals( 4 ); + refl.back_coef->setRange( 0., 1. ); + refl.back_coef->setSingleStep( 0.05 ); + refl.back_coef->setMinimumWidth( 80 ); myReflection << refl; } // shininess widgets QLabel* shininessLab = new QLabel( tr( "SHININESS" ), propWidget ); - myShininess = new QtxDoubleSpinBox( propWidget ); - myShininess->setPrecision( 4 ); - myShininess->setDecimals( 4 ); - myShininess->setRange( 0., 1. ); - myShininess->setSingleStep( 0.05 ); + myFrontShininess = new QtxDoubleSpinBox( propWidget ); + myFrontShininess->setPrecision( 4 ); + myFrontShininess->setDecimals( 4 ); + myFrontShininess->setRange( 0., 1. ); + myFrontShininess->setSingleStep( 0.05 ); + + myBackShininess = new QtxDoubleSpinBox( propWidget ); + myBackShininess->setPrecision( 4 ); + myBackShininess->setDecimals( 4 ); + myBackShininess->setRange( 0., 1. ); + myBackShininess->setSingleStep( 0.05 ); // separator widgets QFrame* line1 = new QFrame( propWidget ); line1->setFrameStyle( QFrame::HLine | QFrame::Sunken ); QFrame* line2 = new QFrame( propWidget ); line2->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + QFrame* line3 = new QFrame( propWidget ); + line3->setFrameStyle( QFrame::VLine | QFrame::Sunken ); + QFrame* line4 = new QFrame( propWidget ); + line4->setFrameStyle( QFrame::VLine | QFrame::Sunken ); + QFrame* line5 = new QFrame( propWidget ); + line5->setFrameStyle( QFrame::HLine | QFrame::Sunken ); // add / remove material buttons myAddButton = new QPushButton( tr( "ADD_MATERIAL" ), propWidget ); @@ -178,21 +212,42 @@ GEOMToolsGUI_MaterialPropertiesDlg::GEOMToolsGUI_MaterialPropertiesDlg( QWidget* btnLayout->addWidget( myDelButton ); // layout all properties widgets together - propLayout->addWidget( myColorLab, 0, 0 ); - propLayout->addWidget( myColor, 0, 1 ); - propLayout->addWidget( line1, 1, 0, 1, 4 ); - propLayout->addWidget( myPhysical, 2, 0, 1, 2 ); + propLayout->addWidget( PushBtnLab,0,0); + propLayout->addWidget( myPushBtn,0,1); + propLayout->addWidget( myLineEditCurArg, 0, 2, 1, 5 ); + propLayout->addWidget( line1, 1, 0, 1, 7 ); + propLayout->addWidget( myColorLab, 2, 1 ); + propLayout->addWidget( myColor, 2, 2 ); + propLayout->addWidget( myPhysical, 2, 0 ); + propLayout->addWidget( line2, 3, 0, 1, 7 ); + propLayout->addWidget( aFrontLabel, 4, 4); + propLayout->addWidget( aBackLabel, 4, 6); + + propLayout->addWidget( line3, 4, 3, 6, 1 ); + propLayout->addWidget( line4, 4, 5, 6, 1 ); + + if( !myShowSelWidget ) { + myColorLab->hide(); + myColor->hide(); + line1->hide(); + myLineEditCurArg->hide(); + myPushBtn->hide(); + PushBtnLab->hide(); + } for ( int i = Material_Model::Ambient; i <= Material_Model::Emissive; i++ ) { - propLayout->addWidget( myReflection[i].label, i+3, 0 ); - propLayout->addWidget( myReflection[i].color, i+3, 1 ); - propLayout->addWidget( myReflection[i].coef, i+3, 2 ); - propLayout->addWidget( myReflection[i].enabled, i+3, 3 ); + propLayout->addWidget( myReflection[i].enabled, i+5, 0 ); + propLayout->addWidget( myReflection[i].label, i+5, 1 ); + propLayout->addWidget( myReflection[i].color, i+5, 2 ); + propLayout->addWidget( myReflection[i].front_coef, i+5, 4 ); + propLayout->addWidget( myReflection[i].back_coef, i+5, 6 ); } - propLayout->addWidget( shininessLab, 7, 0 ); - propLayout->addWidget( myShininess, 7, 2 ); - propLayout->addWidget( line2, 8, 0, 1, 4 ); - propLayout->setRowStretch( 9, 5 ); - propLayout->addLayout( btnLayout, 10, 0, 1, 4 ); + + propLayout->addWidget( shininessLab, 9, 0 ); + propLayout->addWidget( myFrontShininess, 9, 4 ); + propLayout->addWidget( myBackShininess, 9, 6 ); + propLayout->addWidget( line5, 10, 0, 1, 7 ); + propLayout->setRowStretch( 11, 5 ); + propLayout->addLayout( btnLayout, 12, 0, 1, 7 ); // initialize dialog box setButtonPosition( Right, Close ); @@ -227,6 +282,9 @@ GEOMToolsGUI_MaterialPropertiesDlg::GEOMToolsGUI_MaterialPropertiesDlg( QWidget* // install event filter to the materials list to process key press events myMaterials->installEventFilter( this ); + //Set image + myPushBtn->setIcon(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); + // connect signals // note: all widgets, that change material properties, are connected to the common signal // changed(), instead of connecting directly to the slot - this allows easy temporary blocking @@ -234,10 +292,12 @@ GEOMToolsGUI_MaterialPropertiesDlg::GEOMToolsGUI_MaterialPropertiesDlg( QWidget* connect( myPhysical, SIGNAL( toggled( bool ) ), this, SIGNAL( changed() ) ); for ( int i = Material_Model::Ambient; i <= Material_Model::Emissive; i++ ) { connect( myReflection[i].color, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) ); - connect( myReflection[i].coef, SIGNAL( valueChanged( double ) ), this, SIGNAL( changed() ) ); + connect( myReflection[i].front_coef, SIGNAL( valueChanged( double ) ), this, SIGNAL( changed() ) ); + connect( myReflection[i].back_coef, SIGNAL( valueChanged( double ) ), this, SIGNAL( changed() ) ); connect( myReflection[i].enabled, SIGNAL( toggled( bool ) ), this, SIGNAL( changed() ) ); } - connect( myShininess, SIGNAL( valueChanged( double ) ), this, SIGNAL( changed() ) ); + connect( myFrontShininess, SIGNAL( valueChanged( double ) ), this, SIGNAL( changed() ) ); + connect( myBackShininess, SIGNAL( valueChanged( double ) ), this, SIGNAL( changed() ) ); connect( myMaterials, SIGNAL( itemSelectionChanged() ), this, SLOT( onMaterialChanged() ) ); connect( myMaterials, SIGNAL( itemChanged( QListWidgetItem* ) ), @@ -249,6 +309,9 @@ GEOMToolsGUI_MaterialPropertiesDlg::GEOMToolsGUI_MaterialPropertiesDlg( QWidget* connect( this, SIGNAL( dlgApply() ), this, SLOT( onApply() ) ); connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) ); connect( this, SIGNAL( changed() ), this, SLOT( onChanged() ) ); + connect(myPushBtn, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); // initialize current material model according to the selection myColor->setColor( SUIT_Session::session()->resourceMgr()->colorValue( "Geometry", "shading_color", QColor( 255, 0, 0 ) ) ); @@ -276,7 +339,10 @@ GEOMToolsGUI_MaterialPropertiesDlg::GEOMToolsGUI_MaterialPropertiesDlg( QWidget* } } } - + myLineEditCurArg->setText(""); + myPushBtn->click(); + SelectionIntoArgument(); + // finally activate current material properties myMaterials->setCurrentRow( 0 ); } @@ -324,12 +390,14 @@ void GEOMToolsGUI_MaterialPropertiesDlg::fromModel( const Material_Model& model for ( int i = Material_Model::Ambient; i <= Material_Model::Emissive; i++ ) { myReflection[i].color->setColor( model.color( (Material_Model::ReflectionType)i ) ); - myReflection[i].coef->setValue( model.reflection( (Material_Model::ReflectionType)i ) ); + myReflection[i].front_coef->setValue( model.reflection( (Material_Model::ReflectionType)i, true ) ); + myReflection[i].back_coef->setValue( model.reflection( (Material_Model::ReflectionType)i, false ) ); myReflection[i].enabled->setChecked( model.hasReflection( (Material_Model::ReflectionType)i ) ); } // shininess - myShininess->setValue( model.shininess() ); + myFrontShininess->setValue( model.shininess( true ) ); + myBackShininess->setValue( model.shininess( false ) ); // type (physical or no) myPhysical->setChecked( model.isPhysical() ); @@ -345,13 +413,15 @@ void GEOMToolsGUI_MaterialPropertiesDlg::toModel( Material_Model& model ) const model.setPhysical( myPhysical->isChecked() ); // shininess - model.setShininess( myShininess->value() ); + model.setShininess( myFrontShininess->value(), true ); + model.setShininess( myBackShininess->value(), false ); // reflection components for ( int i = Material_Model::Ambient; i <= Material_Model::Emissive; i++ ) { model.setColor ( (Material_Model::ReflectionType)i, myReflection[i].color->color() ); - model.setReflection( (Material_Model::ReflectionType)i, myReflection[i].coef->value() ); + model.setReflection( (Material_Model::ReflectionType)i, myReflection[i].front_coef->value(), true ); + model.setReflection( (Material_Model::ReflectionType)i, myReflection[i].back_coef->value(), false ); model.setReflection( (Material_Model::ReflectionType)i, myReflection[i].enabled->isChecked() ); } } @@ -391,7 +461,7 @@ void GEOMToolsGUI_MaterialPropertiesDlg::onApply() { // save user materials myResourceMgr.save(); - + if( !myShowSelWidget ) return; // store selected material properties in the current model toModel( myCurrentModel ); @@ -421,19 +491,20 @@ void GEOMToolsGUI_MaterialPropertiesDlg::onApply() SVTK_View* aView = vtkVW->getView(); // get VTK material properties from the current model - GEOM_VTKPropertyMaterial* vtkProp = myCurrentModel.getMaterialVTKProperty(); + GEOM_VTKPropertyMaterial* vtkPropF = myCurrentModel.getMaterialVTKProperty(); + GEOM_VTKPropertyMaterial* vtkPropB = myCurrentModel.getMaterialVTKProperty( false ); SUIT_OverrideCursor wc(); for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { // set material property to the presentation - aView->SetMaterial( It.Value(), vtkProp ); + aView->SetMaterial( It.Value(), vtkPropF, vtkPropB ); // store chosen material in the property map study->setObjectProperty( mgrId, It.Value()->getEntry(), MATERIAL_PROP, prop ); // set correct color for the non-physical material if ( !myCurrentModel.isPhysical() ) { aView->SetColor( It.Value(), myColor->color() ); - study->setObjectProperty( mgrId, It.Value()->getEntry(), COLOR_PROP, myColor->color() ); + study->setObjectProperty( mgrId, It.Value()->getEntry(), COLOR_PROP, myColor->color() ); } } aView->Repaint(); @@ -448,25 +519,32 @@ void GEOMToolsGUI_MaterialPropertiesDlg::onApply() Handle(AIS_InteractiveContext) ic = vm->getAISContext(); // get OCC material aspect from the current model - Graphic3d_MaterialAspect occAspect = myCurrentModel.getMaterialOCCAspect(); + Graphic3d_MaterialAspect front_occAspect = myCurrentModel.getMaterialOCCAspect( true ); + Graphic3d_MaterialAspect back_occAspect = myCurrentModel.getMaterialOCCAspect( false ); SUIT_OverrideCursor wc(); for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { Handle(GEOM_AISShape) aisShape = GEOMBase::ConvertIOinGEOMAISShape( It.Value(), true ); if ( !aisShape.IsNull() ) { - // set material property to the presentation - aisShape->SetMaterial( occAspect ); - // store chosen material in the property map - study->setObjectProperty( mgrId, It.Value()->getEntry(), MATERIAL_PROP, prop ); - // set correct color for the non-physical material - if ( !myCurrentModel.isPhysical() ) { - aisShape->SetShadingColor( SalomeApp_Tools::color( myColor->color() ) ); - study->setObjectProperty( mgrId, It.Value()->getEntry(), COLOR_PROP, myColor->color() ); - ic->RecomputePrsOnly( aisShape, Standard_False ); - } - //if ( aisShape->DisplayMode() != AIS_Shaded/*aisShape->DisplayMode() == GEOM_AISShape::ShadingWithEdges*/) - ic->Redisplay( aisShape, Standard_False ); + // Set front material for the selected shape + aisShape->SetCurrentFacingModel(Aspect_TOFM_FRONT_SIDE); + aisShape->SetMaterial(front_occAspect); + // Set back material for the selected shape + aisShape->SetCurrentFacingModel(Aspect_TOFM_BACK_SIDE); + aisShape->SetMaterial(back_occAspect); + // Return to the default facing mode + aisShape->SetCurrentFacingModel(Aspect_TOFM_BOTH_SIDE); + // store chosen material in the property map + study->setObjectProperty( mgrId, It.Value()->getEntry(), MATERIAL_PROP, prop ); + // set correct color for the non-physical material + if ( !myCurrentModel.isPhysical() ) { + aisShape->SetShadingColor( SalomeApp_Tools::color( myColor->color() ) ); + study->setObjectProperty( mgrId, It.Value()->getEntry(), COLOR_PROP, myColor->color() ); + ic->RecomputePrsOnly( aisShape, Standard_False ); + } + //if ( aisShape->DisplayMode() != AIS_Shaded/*aisShape->DisplayMode() == GEOM_AISShape::ShadingWithEdges*/) + ic->Redisplay( aisShape, Standard_False ); } } ic->UpdateCurrentViewer(); @@ -670,3 +748,37 @@ void GEOMToolsGUI_MaterialPropertiesDlg::updateState() myColor->setEnabled( !myPhysical->isChecked() ); myReflection[0].color->setEnabled( myPhysical->isChecked() ); } + + +void GEOMToolsGUI_MaterialPropertiesDlg::SetEditCurrentArgument() +{ + QPushButton* send = (QPushButton*)sender(); + + if (send == myPushBtn) { + // enable line edit + myLineEditCurArg->setEnabled(true); + myLineEditCurArg->setFocus(); + SelectionIntoArgument(); + // after setFocus(), because it will be setDown(false) when loses focus + send->setDown(true); + } +} + +/*! + \brief Called when selection as changed or other case +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::SelectionIntoArgument() +{ + myLineEditCurArg->setText( "" ); + QString aString = ""; + + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + SalomeApp_Study* study = dynamic_cast( app->activeStudy() ); + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + if ( study ) { + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + int nbSel = GEOMBase::GetNameOfSelectedIObjects(aSelList, aString, true); + } + myLineEditCurArg->setText( aString ); +} diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.h b/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.h index 1e2a7c6f7..c9f20598e 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.h +++ b/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.h @@ -45,7 +45,7 @@ class GEOMTOOLSGUI_EXPORT GEOMToolsGUI_MaterialPropertiesDlg : public QtxDialog enum { TypeRole = Qt::UserRole + 123, NameRole }; public: - GEOMToolsGUI_MaterialPropertiesDlg( QWidget* = 0 ); + GEOMToolsGUI_MaterialPropertiesDlg( QWidget* = 0 , bool = true, bool = false,const int = Standard ); ~GEOMToolsGUI_MaterialPropertiesDlg(); void accept(); @@ -72,26 +72,33 @@ private slots: void onAddMaterial(); void onApply(); void onHelp(); + void SetEditCurrentArgument(); + void SelectionIntoArgument(); private: typedef struct { + QCheckBox* enabled; QLabel* label; QtxColorButton* color; - QtxDoubleSpinBox* coef; - QCheckBox* enabled; + QtxDoubleSpinBox* front_coef; + QtxDoubleSpinBox* back_coef; } Reflection; GEOMToolsGUI_MaterialList* myMaterials; QCheckBox* myPhysical; QList myReflection; - QtxDoubleSpinBox* myShininess; + QtxDoubleSpinBox* myFrontShininess; + QtxDoubleSpinBox* myBackShininess; QLabel* myColorLab; QtxColorButton* myColor; QPushButton* myAddButton; QPushButton* myDelButton; Material_ResourceMgr myResourceMgr; Material_Model myCurrentModel; + bool myShowSelWidget; + QLineEdit* myLineEditCurArg; + QPushButton* myPushBtn; }; class GEOMToolsGUI_MaterialList : public QListWidget diff --git a/src/Material/Material_Model.cxx b/src/Material/Material_Model.cxx index 9744571c5..f90d849bb 100644 --- a/src/Material/Material_Model.cxx +++ b/src/Material/Material_Model.cxx @@ -78,21 +78,36 @@ void Material_Model::fromProperties( const QString& props ) else if ( key == "emissivecolor" && Qtx::stringToColor( data, colorValue ) ) { setColor( Emissive, colorValue ); } - else if ( key == "ambientcoefficient" && dblOk ) { + else if ( key == "frontambientcoefficient" && dblOk ) { setReflection( Ambient, dblValue ); } - else if ( key == "diffusecoefficient" && dblOk ) { + else if ( key == "backambientcoefficient" && dblOk ) { + setReflection( Ambient, dblValue, false ); + } + else if ( key == "frontdiffusecoefficient" && dblOk ) { setReflection( Diffuse, dblValue ); } - else if ( key == "specularcoefficient" && dblOk ) { + else if ( key == "backdiffusecoefficient" && dblOk ) { + setReflection( Diffuse, dblValue, false ); + } + else if ( key == "frontspecularcoefficient" && dblOk ) { setReflection( Specular, dblValue ); } - else if ( key == "emissivecoefficient" && dblOk ) { + else if ( key == "backspecularcoefficient" && dblOk ) { + setReflection( Specular, dblValue, false ); + } + else if ( key == "frontemissivecoefficient" && dblOk ) { setReflection( Emissive, dblValue ); } - else if ( key == "shininess" && dblOk ) { + else if ( key == "backemissivecoefficient" && dblOk ) { + setReflection( Emissive, dblValue, false ); + } + else if ( key == "frontshininess" && dblOk ) { setShininess( dblValue ); } + else if ( key == "backshininess" && dblOk ) { + setShininess( dblValue, false ); + } else if ( key == "transparency" && dblOk ) { setTransparency( dblValue ); } @@ -128,7 +143,7 @@ QString Material_Model::toProperties() props << fmt.arg( "Physical" ).arg( isPhysical() ); // shininess - props << fmt.arg( "Shininess" ).arg( shininess() ); + props << fmt.arg( "FrontShininess" ).arg( QString::number ( shininess( true ), 'g', 4 ) ) << fmt.arg( "BackShininess" ).arg( QString::number ( shininess( false ), 'g', 4 ) ); //transparency props << fmt.arg( "Transparency" ).arg( transparency() ); @@ -137,25 +152,25 @@ QString Material_Model::toProperties() props << fmt.arg( "Ambient" ).arg( hasReflection( Ambient ) ); if ( color( Ambient ).isValid() ) props << fmt.arg( "AmbientColor" ).arg( Qtx::colorToString( color( Ambient ) ) ); - props << fmt.arg( "AmbientCoefficient" ).arg( reflection( Ambient ) ); + props << fmt.arg( "FrontAmbientCoefficient" ).arg( QString::number ( reflection( Ambient, true ), 'g', 4 ) ) << fmt.arg( "BackAmbientCoefficient" ).arg( QString::number ( reflection( Ambient, false ), 'g', 4 ) ); // diffuse reflection props << fmt.arg( "Diffuse" ).arg( hasReflection( Diffuse ) ); if ( color( Diffuse ).isValid() ) props << fmt.arg( "DiffuseColor" ).arg( Qtx::colorToString( color( Diffuse ) ) ); - props << fmt.arg( "DiffuseCoefficient" ).arg( reflection( Diffuse ) ); + props << fmt.arg( "FrontDiffuseCoefficient" ).arg( QString::number ( reflection( Diffuse, true ), 'g', 4 ) ) << fmt.arg( "BackDiffuseCoefficient" ).arg( QString::number ( reflection( Diffuse, false ), 'g', 4 ) ); // specular reflection props << fmt.arg( "Specular" ).arg( hasReflection( Specular ) ); if ( color( Specular ).isValid() ) props << fmt.arg( "SpecularColor" ).arg( Qtx::colorToString( color( Specular ) ) ); - props << fmt.arg( "SpecularCoefficient" ).arg( reflection( Specular ) ); + props << fmt.arg( "FrontSpecularCoefficient" ).arg( QString::number ( reflection( Specular, true ), 'g', 4 ) ) << fmt.arg( "BackSpecularCoefficient" ).arg( QString::number ( reflection( Specular, false ), 'g', 4 ) ); // emissive reflection props << fmt.arg( "Emissive" ).arg( hasReflection( Emissive ) ); if ( color( Emissive ).isValid() ) props << fmt.arg( "EmissiveColor" ).arg( Qtx::colorToString( color( Emissive ) ) ); - props << fmt.arg( "EmissiveCoefficient" ).arg( reflection( Emissive ) ); + props << fmt.arg( "FrontEmissiveCoefficient" ).arg( QString::number ( reflection( Emissive, true ), 'g', 4 ) ) << fmt.arg( "BackEmissiveCoefficient" ).arg( QString::number ( reflection( Emissive, false ), 'g', 4 ) ); return props.join( ":" ); } @@ -194,8 +209,11 @@ void Material_Model::fromResources( const QString& material, QtxResourceMgr* res } // shininess - if ( resMgr->hasValue( material, "shininess" ) ) { - setShininess( resMgr->doubleValue( material, "shininess" ) ); + if ( resMgr->hasValue( material, "front_shininess" ) ) { + setShininess( resMgr->doubleValue( material, "front_shininess" ) ); + } + if ( resMgr->hasValue( material, "back_shininess" ) ) { + setShininess( resMgr->doubleValue( material, "back_shininess" ), false ); } // transparency @@ -207,8 +225,11 @@ void Material_Model::fromResources( const QString& material, QtxResourceMgr* res if ( resMgr->hasValue( material, "ambient-color" ) ) { setColor( Ambient, resMgr->colorValue( material, "ambient-color" ) ); } - if ( resMgr->hasValue( material, "ambient-coefficient" ) ) { - setReflection( Ambient, resMgr->doubleValue( material, "ambient-coefficient" ) ); + if ( resMgr->hasValue( material, "front_ambient-coefficient" ) ) { + setReflection( Ambient, resMgr->doubleValue( material, "front_ambient-coefficient" ) ); + } + if ( resMgr->hasValue( material, "back_ambient-coefficient" ) ) { + setReflection( Ambient, resMgr->doubleValue( material, "back_ambient-coefficient" ), false ); } if ( resMgr->hasValue( material, "ambient" ) ) { setReflection( Ambient, resMgr->booleanValue( material, "ambient" ) ); @@ -218,8 +239,11 @@ void Material_Model::fromResources( const QString& material, QtxResourceMgr* res if ( resMgr->hasValue( material, "diffuse-color" ) ) { setColor( Diffuse, resMgr->colorValue( material, "diffuse-color" ) ); } - if ( resMgr->hasValue( material, "diffuse-coefficient" ) ) { - setReflection( Diffuse, resMgr->doubleValue( material, "diffuse-coefficient" ) ); + if ( resMgr->hasValue( material, "front_diffuse-coefficient" ) ) { + setReflection( Diffuse, resMgr->doubleValue( material, "front_diffuse-coefficient" ) ); + } + if ( resMgr->hasValue( material, "back_diffuse-coefficient" ) ) { + setReflection( Diffuse, resMgr->doubleValue( material, "back_diffuse-coefficient" ), false ); } if ( resMgr->hasValue( material, "diffuse" ) ) { setReflection( Diffuse, resMgr->booleanValue( material, "diffuse" ) ); @@ -229,8 +253,11 @@ void Material_Model::fromResources( const QString& material, QtxResourceMgr* res if ( resMgr->hasValue( material, "specular-color" ) ) { setColor( Specular, resMgr->colorValue( material, "specular-color" ) ); } - if ( resMgr->hasValue( material, "specular-coefficient" ) ) { - setReflection( Specular, resMgr->doubleValue( material, "specular-coefficient" ) ); + if ( resMgr->hasValue( material, "front_specular-coefficient" ) ) { + setReflection( Specular, resMgr->doubleValue( material, "front_specular-coefficient" ) ); + } + if ( resMgr->hasValue( material, "back_specular-coefficient" ) ) { + setReflection( Specular, resMgr->doubleValue( material, "back_specular-coefficient" ), false ); } if ( resMgr->hasValue( material, "specular" ) ) { setReflection( Specular, resMgr->booleanValue( material, "specular" ) ); @@ -240,8 +267,11 @@ void Material_Model::fromResources( const QString& material, QtxResourceMgr* res if ( resMgr->hasValue( material, "emissive-color" ) ) { setColor( Emissive, resMgr->colorValue( material, "emissive-color" ) ); } - if ( resMgr->hasValue( material, "emissive-coefficient" ) ) { - setReflection( Emissive, resMgr->doubleValue( material, "emissive-coefficient" ) ); + if ( resMgr->hasValue( material, "front_emissive-coefficient" ) ) { + setReflection( Emissive, resMgr->doubleValue( material, "front_emissive-coefficient" ) ); + } + if ( resMgr->hasValue( material, "back_emissive-coefficient" ) ) { + setReflection( Emissive, resMgr->doubleValue( material, "back_emissive-coefficient" ), false ); } if ( resMgr->hasValue( material, "emissive" ) ) { setReflection( Emissive, resMgr->booleanValue( material, "emissive" ) ); @@ -267,7 +297,8 @@ void Material_Model::toResources( const QString& material, QtxResourceMgr* resMg resMgr->setValue( material, "physical", isPhysical() ); // shininess - resMgr->setValue( material, "shininess", shininess() ); + resMgr->setValue( material, "front_shininess", shininess( true) ); + resMgr->setValue( material, "back_shininess", shininess( false ) ); // transparency resMgr->setValue( material, "transparency", transparency() ); @@ -275,46 +306,33 @@ void Material_Model::toResources( const QString& material, QtxResourceMgr* resMg // ambient reflection if ( color( Ambient ).isValid() ) resMgr->setValue( material, "ambient-color", color( Ambient ) ); - resMgr->setValue( material, "ambient-coefficient", reflection( Ambient ) ); + resMgr->setValue( material, "front_ambient-coefficient", reflection( Ambient ) ); + resMgr->setValue( material, "back_ambient-coefficient", reflection( Ambient, false ) ); resMgr->setValue( material, "ambient", hasReflection( Ambient ) ); // diffuse reflection if ( color( Diffuse ).isValid() ) resMgr->setValue( material, "diffuse-color", color( Diffuse ) ); - resMgr->setValue( material, "diffuse-coefficient", reflection( Diffuse ) ); + resMgr->setValue( material, "front_diffuse-coefficient", reflection( Diffuse ) ); + resMgr->setValue( material, "back_diffuse-coefficient", reflection( Diffuse, false ) ); resMgr->setValue( material, "diffuse", hasReflection( Diffuse ) ); // Specular reflection if ( color( Specular ).isValid() ) resMgr->setValue( material, "specular-color", color( Specular ) ); - resMgr->setValue( material, "specular-coefficient", reflection( Specular ) ); + resMgr->setValue( material, "front_specular-coefficient", reflection( Specular ) ); + resMgr->setValue( material, "back_specular-coefficient", reflection( Specular, false ) ); resMgr->setValue( material, "specular", hasReflection( Specular ) ); // Emissive reflection if ( color( Emissive ).isValid() ) resMgr->setValue( material, "emissive-color", color( Emissive ) ); - resMgr->setValue( material, "emissive-coefficient", reflection( Emissive ) ); + resMgr->setValue( material, "front_emissive-coefficient", reflection( Emissive ) ); + resMgr->setValue( material, "back_emissive-coefficient", reflection( Emissive, false ) ); resMgr->setValue( material, "emissive", hasReflection( Emissive ) ); } } -/*! - \brief Initialize material model from the preferences - - The material name is retrieved from the "material" parameter of the "Geometry" section - of the specified resources manager. - - \param resMgr resources manager - \sa fromResources(), toResources() -*/ -// void Material_Model::fromPreferences( QtxResourceMgr* resMgr ) -// { -// if ( resMgr ) { -// // default material is Plastic -// fromResources( resMgr->stringValue( "Geometry", "material", "Plastic" ) ); -// } -// } - /*! \brief Get material type \return \c true if material is physical or \c false otherwise @@ -390,14 +408,18 @@ void Material_Model::setColor( ReflectionType type, const QColor& value ) /*! \brief Get coefficient value for the given reflection type \param type reflection type + \param theIsFront boolean flag for choosing side \return coefficient value for the specified reflection type - \sa setReflection(ReflectionType, double) + \sa setReflection(ReflectionType, double, bool = true) */ -double Material_Model::reflection( ReflectionType type ) const +double Material_Model::reflection( ReflectionType type, bool theIsFront ) const { double value = 0.0; if ( type >= 0 && type < 4 ) - value = myReflection[ type ].coef; + if ( theIsFront ) + value = myReflection[ type ].front_coef; + else + value = myReflection[ type ].back_coef; return value; } @@ -405,32 +427,44 @@ double Material_Model::reflection( ReflectionType type ) const \brief Set coefficient value for the given reflection type \param type reflection type \param value coefficient to be used by the given reflection type - \sa reflection() + \param theIsFront boolean flag for choosing side + \sa reflection( bool = true) */ -void Material_Model::setReflection( ReflectionType type, double value ) +void Material_Model::setReflection( ReflectionType type, double value, bool theIsFront ) { if ( type >= 0 && type < 4 ) - myReflection[ type ].coef = value; + if ( theIsFront ) + myReflection[ type ].front_coef = value; + else + myReflection[ type ].back_coef = value; } /*! \brief Get shininess value + \param theIsFront boolean flag for choosing side \return shininess value of the material - \sa setShininess() + \sa setShininess( double, bool = true ) */ -double Material_Model::shininess() const +double Material_Model::shininess( bool theIsFront ) const { - return myShininess; + if ( theIsFront ) + return myFrontShininess; + else + return myBackShininess; } /*! \brief Set shininess value \param value new shininess value - \sa shininess() + \param theIsFront boolean flag for choosing side + \sa shininess( bool = true ) */ -void Material_Model::setShininess( double value ) +void Material_Model::setShininess( double value, bool theIsFront ) { - myShininess = value; + if ( theIsFront ) + myFrontShininess = value; + else + myBackShininess = value; } /*! @@ -464,39 +498,45 @@ void Material_Model::init() setPhysical( false ); // shininess setShininess( 0.039 ); + setShininess( 0.039, false ); // transparency setTransparency( 0.0 ); // ambient reflection (enabled by default) Qtx::stringToColor( "#333333", c ); setColor( Ambient, c ); - setReflection( Ambient, 0.3 ); + setReflection( Ambient, 0.3, true ); + setReflection( Ambient, 0.3, false ); setReflection( Ambient, true ); // diffuse reflection (enabled by default) Qtx::stringToColor( "#000000", c ); setColor( Diffuse, c ); setReflection( Diffuse, 0.65 ); + setReflection( Diffuse, 0.65, false ); setReflection( Diffuse, true ); // specular reflection (enabled by default) Qtx::stringToColor( "#ffffff", c ); setColor( Specular, c ); - setReflection( Specular, 0.0 ); + setReflection( Specular, 0.0 ); + setReflection( Specular, 0.0, false ); setReflection( Specular, true ); // emissive reflection (disabled by default) Qtx::stringToColor( "#000000", c ); setColor( Emissive, c ); - setReflection( Emissive, 0.0 ); + setReflection( Emissive, 0.0 ); + setReflection( Emissive, 0.0, false ); setReflection( Emissive, false ); } /*! \brief Construct OCCT material aspect from material model + \param theIsFront boolean flag for choosing side \return material aspect object with corresponding properties */ -Graphic3d_MaterialAspect Material_Model::getMaterialOCCAspect() +Graphic3d_MaterialAspect Material_Model::getMaterialOCCAspect( bool theIsFront ) { // Get material aspect from the current model Graphic3d_MaterialAspect aspect; @@ -508,7 +548,7 @@ Graphic3d_MaterialAspect Material_Model::getMaterialOCCAspect() c = color( Ambient ); aspect.SetAmbientColor( Quantity_Color( c.redF(), c.greenF(), c.blueF(), Quantity_TOC_RGB ) ); } - aspect.SetAmbient( reflection( Ambient )); + aspect.SetAmbient( reflection( Ambient, theIsFront )); if ( hasReflection( Ambient ) ) aspect.SetReflectionModeOn( Graphic3d_TOR_AMBIENT ); else @@ -519,7 +559,7 @@ Graphic3d_MaterialAspect Material_Model::getMaterialOCCAspect() c = color( Diffuse ); aspect.SetDiffuseColor( Quantity_Color( c.redF(), c.greenF(), c.blueF(), Quantity_TOC_RGB ) ); } - aspect.SetDiffuse( reflection( Diffuse )); + aspect.SetDiffuse( reflection( Diffuse, theIsFront )); if ( hasReflection( Diffuse ) ) aspect.SetReflectionModeOn( Graphic3d_TOR_DIFFUSE ); else @@ -530,7 +570,7 @@ Graphic3d_MaterialAspect Material_Model::getMaterialOCCAspect() c = color( Specular ); aspect.SetSpecularColor( Quantity_Color( c.redF(), c.greenF(), c.blueF(), Quantity_TOC_RGB ) ); } - aspect.SetSpecular( reflection( Specular )); + aspect.SetSpecular( reflection( Specular, theIsFront )); if ( hasReflection( Specular ) ) aspect.SetReflectionModeOn( Graphic3d_TOR_SPECULAR ); else @@ -541,14 +581,14 @@ Graphic3d_MaterialAspect Material_Model::getMaterialOCCAspect() c = color( Emissive ); aspect.SetEmissiveColor( Quantity_Color( c.redF(), c.greenF(), c.blueF(), Quantity_TOC_RGB ) ); } - aspect.SetEmissive( reflection( Emissive )); + aspect.SetEmissive( reflection( Emissive, theIsFront )); if ( hasReflection( Emissive ) ) aspect.SetReflectionModeOn( Graphic3d_TOR_EMISSION ); else aspect.SetReflectionModeOff( Graphic3d_TOR_EMISSION ); // shininess - aspect.SetShininess( shininess() ); + aspect.SetShininess( shininess( theIsFront ) ); // transparency aspect.SetTransparency( transparency() ); @@ -561,9 +601,10 @@ Graphic3d_MaterialAspect Material_Model::getMaterialOCCAspect() /*! \brief Construct VTK property from material model + \param theIsFront boolean flag for choosing side \return VTK property with correspondent material properties */ -GEOM_VTKPropertyMaterial* Material_Model::getMaterialVTKProperty() +GEOM_VTKPropertyMaterial* Material_Model::getMaterialVTKProperty( bool theIsFront ) { // NOTE: In VTK it's impossible to switch on/off specific reflection type // NOTE: In VTK emissive reflection type is not supported @@ -579,25 +620,25 @@ GEOM_VTKPropertyMaterial* Material_Model::getMaterialVTKProperty() if ( color( Ambient ).isValid() && hasReflection( Ambient ) ) { c = color( Ambient ); prop->SetAmbientColor( c.redF(), c.greenF(), c.blueF() ); - prop->SetAmbient( reflection( Ambient ) ); + prop->SetAmbient( reflection( Ambient, theIsFront ) ); } // diffuse reflection if ( color( Diffuse ).isValid() && hasReflection( Diffuse ) ) { c = color( Diffuse ); prop->SetDiffuseColor( c.redF(), c.greenF(), c.blueF() ); - prop->SetDiffuse( reflection( Diffuse ) ); + prop->SetDiffuse( reflection( Diffuse, theIsFront ) ); } // specular reflection if ( color( Specular ).isValid() && hasReflection( Specular ) ) { c = color( Specular ); prop->SetSpecularColor( c.redF(), c.greenF(), c.blueF() ); - prop->SetSpecular( reflection( Specular ) ); + prop->SetSpecular( reflection( Specular, theIsFront ) ); } // shininess - prop->SetSpecularPower( shininess()*100.0 ); + prop->SetSpecularPower( shininess( theIsFront )*100.0 ); // transparency prop->SetOpacity( 1 - transparency() ); diff --git a/src/Material/Material_Model.h b/src/Material/Material_Model.h index 3f3c8ff24..96ef16fae 100644 --- a/src/Material/Material_Model.h +++ b/src/Material/Material_Model.h @@ -63,17 +63,17 @@ public: QColor color( ReflectionType ) const; void setColor( ReflectionType, const QColor& ); - double reflection( ReflectionType ) const; - void setReflection( ReflectionType, double ); + double reflection( ReflectionType, bool = true ) const; + void setReflection( ReflectionType, double, bool = true ); - double shininess() const; - void setShininess( double ); + double shininess( bool = true) const; + void setShininess( double, bool = true ); double transparency() const; void setTransparency( double ); - Graphic3d_MaterialAspect getMaterialOCCAspect(); - GEOM_VTKPropertyMaterial* getMaterialVTKProperty(); + Graphic3d_MaterialAspect getMaterialOCCAspect( bool = true ); + GEOM_VTKPropertyMaterial* getMaterialVTKProperty( bool = true ); private: void init(); @@ -81,14 +81,16 @@ private: private: typedef struct { QColor color; - double coef; + double front_coef; + double back_coef; bool enabled; } ReflectionData; typedef QVector ReflectionList; bool myIsPhysical; - double myShininess; + double myFrontShininess; + double myBackShininess; double myTransparency; ReflectionList myReflection; }; diff --git a/src/Material/resources/SalomeMaterial.xml b/src/Material/resources/SalomeMaterial.xml index d1e26882c..8c9349db2 100644 --- a/src/Material/resources/SalomeMaterial.xml +++ b/src/Material/resources/SalomeMaterial.xml @@ -23,196 +23,279 @@ -->
- - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
- - - - + + + + + + + +
- - - - + + + + + + + +
- - - - + + + + + + + +
- - - - - - - + + + + + + + + + + + +
- - - - - + + + + + + + + +
- - - - - - - - + + + + + + + + + + + +
- - - - - - - - + + + + + + + + + + + +
- - - - - - - - + + + + + + + + + + + +
- - - - - - - - + + + + + + + + + + + +
- - - - - - - - + + + + + + + + + + + +
- - - - - - - + + + + + + + + + + +
- - - - - - - - + + + + + + + + + + + +
- - - - - - + + + + + + + + + +
- - - - - - - - + + + + + + + + + + + +
- - - - - - - - + + + + + + + + + + + +
- - - - - - - - - - - - - + + + + + + + + + + + + + + + + + +
- - - - - - - - + + + + + + + + + + + +
- - - - - - - - + + + + + + + + + + + +
- - - - - - - - + + + + + + + + + + + +
diff --git a/src/OBJECT/GEOM_AISShape.cxx b/src/OBJECT/GEOM_AISShape.cxx index 4b5b686e4..6e731d256 100644 --- a/src/OBJECT/GEOM_AISShape.cxx +++ b/src/OBJECT/GEOM_AISShape.cxx @@ -166,7 +166,8 @@ GEOM_AISShape::GEOM_AISShape(const TopoDS_Shape& shape, myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(aMatAspect); myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(aMatAspect); } - myCurrentMaterial = myDrawer->ShadingAspect()->Aspect()->FrontMaterial(); + myCurrentFrontMaterial = myDrawer->ShadingAspect()->Aspect()->FrontMaterial(); + myCurrentBackMaterial = myDrawer->ShadingAspect()->Aspect()->BackMaterial(); } void GEOM_AISShape::setIO(const Handle(SALOME_InteractiveObject)& io){ @@ -327,10 +328,12 @@ void GEOM_AISShape::SetTransparency(const Standard_Real aValue) } Graphic3d_MaterialAspect FMat = myDrawer->ShadingAspect()->Aspect()->FrontMaterial(); + Graphic3d_MaterialAspect BMat = myDrawer->ShadingAspect()->Aspect()->BackMaterial(); FMat.SetTransparency(aValue); myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(FMat); - myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(FMat); - myCurrentMaterial = FMat; + myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(BMat); + myCurrentFrontMaterial = FMat; + myCurrentBackMaterial = BMat; myTransparency = aValue; } @@ -388,9 +391,10 @@ void GEOM_AISShape::shadingMode(const Handle(PrsMgr_PresentationManager3d)& aPre Graphic3d_MaterialAspect aMatAspect(Graphic3d_NOM_PLASTIC); aMatAspect.SetTransparency(myTransparency); - myCurrentMaterial = myDrawer->ShadingAspect()->Aspect()->FrontMaterial(); - myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial( isTopLevel() ? aMatAspect : myCurrentMaterial ); - myDrawer->ShadingAspect()->Aspect()->SetBackMaterial( isTopLevel() ? aMatAspect : myCurrentMaterial ); + myCurrentFrontMaterial = myDrawer->ShadingAspect()->Aspect()->FrontMaterial(); + myCurrentBackMaterial = myDrawer->ShadingAspect()->Aspect()->BackMaterial(); + myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial( isTopLevel() ? aMatAspect : myCurrentFrontMaterial ); + myDrawer->ShadingAspect()->Aspect()->SetBackMaterial( isTopLevel() ? aMatAspect : myCurrentBackMaterial ); //Handle(Graphic3d_AspectFillArea3d) a4bis = myDrawer->ShadingAspect()->Aspect(); // P->SetPrimitivesAspect(a4bis); diff --git a/src/OBJECT/GEOM_AISShape.hxx b/src/OBJECT/GEOM_AISShape.hxx index eec1ef7bf..437193822 100644 --- a/src/OBJECT/GEOM_AISShape.hxx +++ b/src/OBJECT/GEOM_AISShape.hxx @@ -172,7 +172,8 @@ private: TCollection_AsciiString myName; bool myDisplayVectors; Standard_Boolean myTopLevel; - Graphic3d_MaterialAspect myCurrentMaterial; + Graphic3d_MaterialAspect myCurrentFrontMaterial; + Graphic3d_MaterialAspect myCurrentBackMaterial; Standard_Integer myPrevDisplayMode; static TopLevelDispMode myTopLevelDm; diff --git a/src/OBJECT/GEOM_Actor.cxx b/src/OBJECT/GEOM_Actor.cxx index 353992d56..5865ba5d2 100644 --- a/src/OBJECT/GEOM_Actor.cxx +++ b/src/OBJECT/GEOM_Actor.cxx @@ -112,7 +112,8 @@ GEOM_Actor::GEOM_Actor(): myHighlightProp(vtkProperty::New()), myPreHighlightProp(vtkProperty::New()), - myShadingFaceProp(vtkProperty::New()) + myShadingFaceProp(vtkProperty::New()), + myShadingBackFaceProp(vtkProperty::New()) { #ifdef MYDEBUG MESSAGE (this<< " GEOM_Actor::GEOM_Actor"); @@ -201,6 +202,7 @@ GEOM_Actor::~GEOM_Actor() myHighlightProp->Delete(); myPreHighlightProp->Delete(); myShadingFaceProp->Delete(); + myShadingBackFaceProp->Delete(); } GEOM_Actor* @@ -546,6 +548,7 @@ void GEOM_Actor::Render(vtkRenderer *ren, vtkMapper *theMapper) myPreHighlightProp->SetRepresentationToSurface(); myHighlightProp->SetRepresentationToSurface(); myShadingFaceProp->SetRepresentationToSurface(); + myShadingBackFaceProp->SetRepresentationToSurface(); break; } @@ -553,14 +556,17 @@ void GEOM_Actor::Render(vtkRenderer *ren, vtkMapper *theMapper) if(myIsPreselected){ this->myHighlightActor->SetProperty(myPreHighlightProp.GetPointer()); myShadingFaceActor->SetProperty(myPreHighlightProp.GetPointer()); + myShadingFaceActor->SetBackfaceProperty(myPreHighlightProp.GetPointer()); } else { this->myHighlightActor->SetProperty(myShadingFaceProp.GetPointer()); myShadingFaceActor->SetProperty(myShadingFaceProp.GetPointer()); + myShadingFaceActor->SetBackfaceProperty(myShadingBackFaceProp.GetPointer()); } } else{ this->myHighlightActor->SetProperty(myHighlightProp.GetPointer()); myShadingFaceActor->SetProperty(myHighlightProp.GetPointer()); + myShadingFaceActor->SetBackfaceProperty(myHighlightProp.GetPointer()); } this->Property->Render(this, ren); @@ -671,6 +677,7 @@ void GEOM_Actor::SetOpacity(vtkFloatingPointType opa) { // enk:tested OK myShadingFaceProp->SetOpacity(opa); + myShadingBackFaceProp->SetOpacity(opa); myHighlightProp->SetOpacity(opa); myPreHighlightProp->SetOpacity(opa); myVertexActor->GetProperty()->SetOpacity(opa); @@ -686,6 +693,7 @@ void GEOM_Actor::SetColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloat { // enk:tested OK myShadingFaceProp->SetColor(r,g,b); // shading color (Shading) + myShadingBackFaceProp->SetColor(r,g,b); // back face shading color (Shading) myVertexActor->GetProperty()->SetColor(r,g,b); // vertex actor (Shading/Wireframe) if ( myDisplayMode != (int)eShadingWithEdges ) { myIsolatedEdgeActor->GetProperty()->SetColor(r,g,b); // standalone edge color (Wireframe) @@ -709,22 +717,40 @@ void GEOM_Actor::GetColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFlo void GEOM_Actor::SetMaterial(std::vector theProps) { // we set material properties as back and front material + int aSize = theProps.size(); + + if ( aSize < 1 || aSize > 2) + return; + + // theProps[0] -- front material properties + // theProps[1] -- back material properties (if exist) + double aCoefnt; // Set reflection coefficients aCoefnt = theProps[0]->GetAmbient(); myShadingFaceProp->SetAmbient(aCoefnt); myVertexActor->GetProperty()->SetAmbient(aCoefnt); + if ( aSize == 2 ) + aCoefnt = theProps[1]->GetAmbient(); + myShadingBackFaceProp->SetAmbient(aCoefnt); // Set diffuse coefficients aCoefnt = theProps[0]->GetDiffuse(); myShadingFaceProp->SetDiffuse(aCoefnt); myVertexActor->GetProperty()->SetDiffuse(aCoefnt); + if ( aSize == 2 ) + aCoefnt = theProps[1]->GetDiffuse(); + myShadingBackFaceProp->SetDiffuse(aCoefnt); // Set specular coefficients aCoefnt = theProps[0]->GetSpecular(); myShadingFaceProp->SetSpecular(aCoefnt); myVertexActor->GetProperty()->SetSpecular(aCoefnt); + if ( aSize == 2 ) + aCoefnt = theProps[1]->GetSpecular(); + myShadingBackFaceProp->SetSpecular(aCoefnt); + double* aColor; @@ -732,28 +758,48 @@ void GEOM_Actor::SetMaterial(std::vector theProps) aColor = theProps[0]->GetAmbientColor(); myShadingFaceProp->SetAmbientColor(aColor[0], aColor[1], aColor[2]); myVertexActor->GetProperty()->SetAmbientColor(aColor[0], aColor[1], aColor[2]); + if ( aSize == 2 ) + aColor = theProps[1]->GetAmbientColor(); + myShadingBackFaceProp->SetAmbientColor(aColor[0], aColor[1], aColor[2]); // Set diffuse colors aColor = theProps[0]->GetDiffuseColor(); myShadingFaceProp->SetDiffuseColor(aColor[0], aColor[1], aColor[2]); myVertexActor->GetProperty()->SetDiffuseColor(aColor[0], aColor[1], aColor[2]); + if ( aSize == 2 ) + aColor = theProps[1]->GetDiffuseColor(); + myShadingBackFaceProp->SetDiffuseColor(aColor[0], aColor[1], aColor[2]); // Set specular colors aColor = theProps[0]->GetSpecularColor(); myShadingFaceProp->SetSpecularColor(aColor[0], aColor[1], aColor[2]); myVertexActor->GetProperty()->SetSpecularColor(aColor[0], aColor[1], aColor[2]); + if ( aSize == 2 ) + aColor = theProps[1]->GetSpecularColor(); + myShadingBackFaceProp->SetSpecularColor(aColor[0], aColor[1], aColor[2]); // Set shininess aCoefnt = theProps[0]->GetSpecularPower(); myShadingFaceProp->SetSpecularPower(aCoefnt); myVertexActor->GetProperty()->SetSpecularPower(aCoefnt); + if ( aSize == 2 ) + aCoefnt = theProps[1]->GetSpecularPower(); + myShadingBackFaceProp->SetSpecularPower(aCoefnt); + + // Set back face material property + myShadingFaceActor->SetBackfaceProperty(myShadingBackFaceProp.GetPointer()); } -vtkProperty* GEOM_Actor::GetMaterial() +vtkProperty* GEOM_Actor::GetFrontMaterial() { return myShadingFaceProp; } +vtkProperty* GEOM_Actor::GetBackMaterial() +{ + return myShadingBackFaceProp; +} + bool GEOM_Actor::IsInfinitive() { return ((bool)myShape.Infinite() || isOnlyVertex); diff --git a/src/OBJECT/GEOM_Actor.h b/src/OBJECT/GEOM_Actor.h index 99bc8efb5..f3acde303 100644 --- a/src/OBJECT/GEOM_Actor.h +++ b/src/OBJECT/GEOM_Actor.h @@ -126,8 +126,8 @@ public: // Material void SetMaterial(std::vector theProps); - vtkProperty* GetMaterial(); - + vtkProperty* GetFrontMaterial(); + vtkProperty* GetBackMaterial(); virtual bool IsInfinitive(); // overloaded functions @@ -242,6 +242,7 @@ private: vtkSmartPointer myHighlightProp; vtkSmartPointer myPreHighlightProp; vtkSmartPointer myShadingFaceProp; + vtkSmartPointer myShadingBackFaceProp; PAppendFilter myAppendFilter; PPolyGeomPainterDataMapper myPolyDataMapper; diff --git a/src/OBJECT/GEOM_DeviceActor.cxx b/src/OBJECT/GEOM_DeviceActor.cxx index 266814569..9a25e86e5 100755 --- a/src/OBJECT/GEOM_DeviceActor.cxx +++ b/src/OBJECT/GEOM_DeviceActor.cxx @@ -73,6 +73,20 @@ GetProperty() return myActor->GetProperty(); } +void +GEOM_DeviceActor:: +SetBackfaceProperty(vtkProperty* theProperty) +{ + myActor->SetBackfaceProperty(theProperty); +} + +vtkProperty* +GEOM_DeviceActor:: +GetBackfaceProperty() +{ + return myActor->GetBackfaceProperty(); +} + void GEOM_DeviceActor:: SetVisibility(int theVisibility) diff --git a/src/OBJECT/GEOM_DeviceActor.h b/src/OBJECT/GEOM_DeviceActor.h index 8b36ab7ae..67edada94 100755 --- a/src/OBJECT/GEOM_DeviceActor.h +++ b/src/OBJECT/GEOM_DeviceActor.h @@ -52,7 +52,10 @@ public: void SetProperty(vtkProperty* theProperty); vtkProperty* GetProperty(); - + + void SetBackfaceProperty(vtkProperty* theProperty); + vtkProperty* GetBackfaceProperty(); + void SetVisibility(int theVisibility); int GetVisibility();