diff --git a/configure.ac b/configure.ac index 729d02fa1..8e0abd9f0 100644 --- a/configure.ac +++ b/configure.ac @@ -448,6 +448,7 @@ AC_OUTPUT([ \ src/GEOMBase/Makefile \ src/GEOMClient/Makefile \ src/GEOMFiltersSelection/Makefile \ + src/Material/Makefile \ src/GEOMGUI/Makefile \ src/GEOMImpl/Makefile \ src/GEOMToolsGUI/Makefile \ diff --git a/doc/salome/gui/GEOM/images/material_OCC.png b/doc/salome/gui/GEOM/images/material_OCC.png new file mode 100644 index 000000000..6f23268a5 Binary files /dev/null and b/doc/salome/gui/GEOM/images/material_OCC.png differ diff --git a/doc/salome/gui/GEOM/images/material_VTK.png b/doc/salome/gui/GEOM/images/material_VTK.png new file mode 100644 index 000000000..b409c73d1 Binary files /dev/null and b/doc/salome/gui/GEOM/images/material_VTK.png differ diff --git a/doc/salome/gui/GEOM/images/material_back.png b/doc/salome/gui/GEOM/images/material_back.png new file mode 100644 index 000000000..713e89b6d Binary files /dev/null and b/doc/salome/gui/GEOM/images/material_back.png differ diff --git a/doc/salome/gui/GEOM/images/material_front.png b/doc/salome/gui/GEOM/images/material_front.png new file mode 100644 index 000000000..2b426de1b Binary files /dev/null and b/doc/salome/gui/GEOM/images/material_front.png differ diff --git a/doc/salome/gui/GEOM/input/material.doc b/doc/salome/gui/GEOM/input/material.doc new file mode 100644 index 000000000..fb89d013a --- /dev/null +++ b/doc/salome/gui/GEOM/input/material.doc @@ -0,0 +1,56 @@ +/*! + +\page material_page Material + +\n You can change the material properties of the selected shape(s) by +- choosing one of predefined global materials, +- choosing one of predefined user materials, +- creating a new user material and applying it to the selected shape(s) + +in the following dialog box. + +\image html material_front.png +
Set Material Properties dialog: Front material tab
+ +\image html material_back.png +
Set Material Properties dialog: Back material tab
+ +This functionality is available in both OCC and VTK viewers. + +User can changed the following material properties + +- ambient color and coefficient +- diffuse color and coefficient +- specular color and coefficient +- emission color and coefficient (available only in OCC viewer) +- shininess + +With help of Front material and Back material tabs of +Set Material Properties dialog it is possible to set front and +back materials of the selected shape(s). To make Back material +tab visible it is needed to check Enable back material check +box. If back material is not defined, front material specified for the +selected shape(s) is used as both front and back materials. + +All currently available materials are shown in the left-side list box +of the Set Material Properties dialog. + +- [Current] item in the list corresponds to + the front/back (depending on what tab is currently active) material + currently used for the selected shape(s) +- [Default] item in the list corresponds to the front/back material + specified in Geometry module preferences +- Global materials are shown in blue color in the list +- User materials are shown in black color in the list + + +Examples: + +\image html material_OCC.png +
Different materials in OCC viewer
+ +\image html material_VTK.png +
Different materials in VTK viewer
+ +*/ + diff --git a/doc/salome/gui/GEOM/input/viewing_geom_obj.doc b/doc/salome/gui/GEOM/input/viewing_geom_obj.doc index 4a43a25df..9ff681259 100644 --- a/doc/salome/gui/GEOM/input/viewing_geom_obj.doc +++ b/doc/salome/gui/GEOM/input/viewing_geom_obj.doc @@ -29,6 +29,8 @@ transparency of geometrical objects. isolines displayed within a shape.
  • \subpage deflection_page "Deflection" - allows to change the deflection coefficient of a shape.
  • +
  • \subpage material_page "Material" - allows to change the +material properties of a shape.
  • \subpage point_marker_page "Point Marker" - allows to change the representation of geometrical vertices.
  • Auto color / Disable auto color - activates the auto color diff --git a/resources/SalomeApp.xml.in b/resources/SalomeApp.xml.in index dc59f51f5..8ea7476e7 100644 --- a/resources/SalomeApp.xml.in +++ b/resources/SalomeApp.xml.in @@ -43,6 +43,7 @@ + @@ -54,6 +55,8 @@ + + diff --git a/src/DisplayGUI/DisplayGUI.cxx b/src/DisplayGUI/DisplayGUI.cxx index a0d6812ce..c7f5df89c 100644 --- a/src/DisplayGUI/DisplayGUI.cxx +++ b/src/DisplayGUI/DisplayGUI.cxx @@ -27,6 +27,7 @@ #include "DisplayGUI.h" #include #include "GeometryGUI_Operations.h" +#include #include #include #include @@ -91,11 +92,28 @@ bool DisplayGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) SALOME_ListIO selected; Sel->selectedObjects( selected ); + QString aDispModeName; + int aDispMode; + if ( theCommandID == GEOMOp::OpDisplayMode ) + aDispMode = GetDisplayMode(); + switch ( theCommandID ) { - case GEOMOp::OpDisplayMode: // MENU VIEW - DISPLAY MODE - WIREFRAME/SHADING - InvertDisplayMode(); - getGeometryGUI()->action( GEOMOp::OpDisplayMode )->setText - ( GetDisplayMode() == 1 ? tr( "GEOM_MEN_WIREFRAME" ) : tr("GEOM_MEN_SHADING") ); + case GEOMOp::OpDisplayMode: // MENU VIEW - DISPLAY MODE - WIREFRAME/SHADING/SHADING WITH EDGES + //InvertDisplayMode(); + switch ( aDispMode) { + case 0: + aDispModeName = tr( "GEOM_MEN_WIREFRAME" ); + break; + case 1: + aDispModeName = tr("GEOM_MEN_SHADING"); + break; + case 2: + aDispModeName = tr("GEOM_MEN_SHADING_WITH_EDGES"); + break; + default: + break; + } + getGeometryGUI()->action( GEOMOp::OpDisplayMode )->setText( aDispModeName ); getGeometryGUI()->menuMgr()->update(); break; case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL @@ -128,11 +146,14 @@ bool DisplayGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) case GEOMOp::OpShading: // POPUP MENU - DISPLAY MODE - SHADING ChangeDisplayMode( 1 ); break; + case GEOMOp::OpShadingWithEdges: // POPUP MENU - DISPLAY MODE - SHADING WITH EDGES + ChangeDisplayMode( 2 ); + break; case GEOMOp::OpTexture: // POPUP MENU - DISPLAY MODE - TEXTURE ChangeDisplayMode( 3 ); break; - case GEOMOp::OpVectors: // POPUP MENU - DISPLAY MODE - SHOW EDGE DIRECTION - ChangeDisplayMode( 2 ); + case GEOMOp::OpVectors: // POPUP MENU - DISPLAY MODE - SHOW EDGE DIRECTION + ChangeDisplayMode( 4 ); break; default: app->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); @@ -350,23 +371,42 @@ void DisplayGUI::SetDisplayMode( const int mode, SUIT_ViewWindow* viewWindow ) else if ( viewWindow->getViewManager()->getType() == OCCViewer_Viewer::Type() ) { OCCViewer_Viewer* v3d = ((OCCViewer_ViewManager*)(viewWindow->getViewManager()))->getOCCViewer(); Handle(AIS_InteractiveContext) ic = v3d->getAISContext(); - AIS_DisplayMode newmode = (mode == 1 ? AIS_Shaded : AIS_WireFrame); + + AIS_DisplayMode newmode; + switch (mode) { + case 0: + newmode = AIS_WireFrame; + break; + case 1: + newmode = AIS_Shaded; + break; + case 2: + newmode = AIS_DisplayMode( GEOM_AISShape::ShadingWithEdges ); + break; + case 3: + newmode = AIS_DisplayMode( GEOM_AISShape::TexturedShape ); + break; + default: + break; + } + AIS_ListOfInteractive List; ic->DisplayedObjects( List ); AIS_ListOfInteractive List1; ic->ObjectsInCollector( List1 ); List.Append( List1 ); - + AIS_ListIteratorOfListOfInteractive ite( List ); while( ite.More() ) { if( ite.Value()->IsInstance( STANDARD_TYPE(GEOM_AISShape) ) ) { - Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast( ite.Value() ); - ic->SetDisplayMode( aSh, Standard_Integer( newmode ),true ); + Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast( ite.Value() ); + ic->SetDisplayMode( aSh, Standard_Integer( newmode ),true ); } ite.Next(); } - + ic->SetDisplayMode( newmode, Standard_False ); + GeometryGUI::Modified(); } } @@ -386,9 +426,8 @@ int DisplayGUI::GetDisplayMode( SUIT_ViewWindow* viewWindow ) } else if ( viewWindow->getViewManager()->getType() == OCCViewer_Viewer::Type() ) { OCCViewer_Viewer* v3d = ((OCCViewer_ViewManager*)(viewWindow->getViewManager()))->getOCCViewer(); - Handle(AIS_InteractiveContext) ic = v3d->getAISContext(); - AIS_DisplayMode mode = (AIS_DisplayMode)ic->DisplayMode(); - dispMode = (mode == AIS_WireFrame ? 0 : 1 ); + Handle(AIS_InteractiveContext) ic = v3d->getAISContext(); + dispMode = ic->DisplayMode(); } return dispMode; } @@ -456,7 +495,7 @@ int DisplayGUI::GetVectorMode( SUIT_ViewWindow* viewWindow ) //===================================================================================== // function : DisplayGUI::InvertDisplayMode() -// purpose : Invert display mode ( shadin <-> wireframe ) for the viewer +// purpose : Invert display mode ( shading <-> wireframe ) for the viewer // (current viewer if = 0 ) //===================================================================================== void DisplayGUI::InvertDisplayMode( SUIT_ViewWindow* viewWindow ) @@ -503,11 +542,13 @@ void DisplayGUI::ChangeDisplayMode( const int mode, SUIT_ViewWindow* viewWindow SVTK_Prs* vtkPrs = stvkViewer ? dynamic_cast( stvkViewer->CreatePrs( It.Value()->getEntry() ) ) : 0; if ( vtkPrs && !vtkPrs->IsNull() ) { - if ( mode == 0 ) + if (mode == 0 ) aView->ChangeRepresentationToWireframe( vtkPrs->GetObjects() ); - else if ( mode == 1 ) + else if ( mode == 1 ) aView->ChangeRepresentationToSurface( vtkPrs->GetObjects() ); - else if ( mode == 2 ) { + else if ( mode == 2 ) + aView->ChangeRepresentationToSurfaceWithEdges( vtkPrs->GetObjects() ); + else if ( mode == 4 ) { vtkActorCollection* anActors = vtkPrs->GetObjects(); anActors->InitTraversal(); while (vtkActor* anAct = anActors->GetNextActor()) { @@ -516,12 +557,12 @@ void DisplayGUI::ChangeDisplayMode( const int mode, SUIT_ViewWindow* viewWindow aGeomActor->SetVectorMode(vectorMode); } } - if(mode == 0 || mode == 1) { - aStudy->setObjectProperty(mgrId,It.Value()->getEntry(),DISPLAY_MODE_PROP, mode); - } - else if (mode == 3) { - aStudy->setObjectProperty(mgrId, It.Value()->getEntry(),VECTOR_MODE_PROP , vectorMode); - } + if(mode == 0 || mode == 1 || mode == 2) { + aStudy->setObjectProperty(mgrId,It.Value()->getEntry(),DISPLAY_MODE_PROP, mode); + } + else if (mode == 4) { + aStudy->setObjectProperty(mgrId, It.Value()->getEntry(),VECTOR_MODE_PROP, vectorMode); + } } } aView->Repaint(); @@ -543,14 +584,16 @@ void DisplayGUI::ChangeDisplayMode( const int mode, SUIT_ViewWindow* viewWindow AIS_ListOfInteractive shapes; occPrs->GetObjects( shapes ); AIS_ListIteratorOfListOfInteractive interIter( shapes ); for ( ; interIter.More(); interIter.Next() ) { - if ( mode == 0 ) + if ( mode == 0 ) ic->SetDisplayMode( interIter.Value(), AIS_WireFrame, false ); - else if ( mode == 1 ) + else if ( mode == 1 ) ic->SetDisplayMode( interIter.Value(), AIS_Shaded, false ); - else if ( mode == 3 ) + else if ( mode == 2 ) + ic->SetDisplayMode( interIter.Value(), GEOM_AISShape::ShadingWithEdges, false ); + else if ( mode == 3 ) ic->SetDisplayMode( interIter.Value(), AIS_ExactHLR, false ); - else if (mode == 2 ) { - Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast( interIter.Value() ); + else if (mode == 4 ) { + Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast( interIter.Value() ); if ( !aSh.IsNull() ) { vectorMode = !aSh->isShowVectors(); aSh->SetDisplayVectors(vectorMode); @@ -558,11 +601,12 @@ void DisplayGUI::ChangeDisplayMode( const int mode, SUIT_ViewWindow* viewWindow } } } - if(mode == 0 || mode == 1) { - aStudy->setObjectProperty(mgrId, It.Value()->getEntry(),DISPLAY_MODE_PROP, mode); - } else if (mode == 2) { - aStudy->setObjectProperty(mgrId, It.Value()->getEntry(),VECTOR_MODE_PROP, vectorMode); - } + if(mode == 0 || mode == 1 || mode == 2 || mode == 3) { + aStudy->setObjectProperty(mgrId, It.Value()->getEntry(),DISPLAY_MODE_PROP, mode); + } + else if (mode == 4) { + aStudy->setObjectProperty(mgrId, It.Value()->getEntry(),VECTOR_MODE_PROP, vectorMode); + } } } ic->UpdateCurrentViewer(); diff --git a/src/GEOMGUI/GEOMGUI_Selection.cxx b/src/GEOMGUI/GEOMGUI_Selection.cxx index ef94bfc52..ca089eb23 100644 --- a/src/GEOMGUI/GEOMGUI_Selection.cxx +++ b/src/GEOMGUI/GEOMGUI_Selection.cxx @@ -28,6 +28,8 @@ #include "GeometryGUI.h" #include "GEOM_Displayer.h" +#include + #include #include @@ -66,6 +68,10 @@ 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(); } @@ -74,6 +80,8 @@ str = QString( "Wireframe" ); \ else if ( dm == 1 ) \ str = QString( "Shading" ); \ + else if ( dm == 3 ) \ + str = QString( "ShadingWithEdges" ); \ else \ str = QString(); } diff --git a/src/GEOMGUI/GEOM_Displayer.cxx b/src/GEOMGUI/GEOM_Displayer.cxx index ca2b6c92f..40b98f034 100644 --- a/src/GEOMGUI/GEOM_Displayer.cxx +++ b/src/GEOMGUI/GEOM_Displayer.cxx @@ -27,6 +27,7 @@ #include "GeometryGUI.h" +#include #include #include #include @@ -41,6 +42,8 @@ #include #include +#include + #include #include #include @@ -78,6 +81,7 @@ #include #include #include +#include #include #include #include @@ -810,6 +814,11 @@ 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 ); + // bug [SALOME platform 0019868] // Set deviation angle. Default one is 12 degrees (Prs3d_Drawer.cxx:18) //AISShape->SetOwnDeviationAngle( 10*PI/180 ); @@ -934,6 +943,68 @@ 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(); + 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 + 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 ); + } + + // Set front material property + QString aMaterialPropF = aModelF->getMaterialProperty(); + aStudy->setObjectProperty( aMgrId, anIO->getEntry(), FRONT_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 + Graphic3d_MaterialAspect aMatF = aModelF->getMaterialOCCAspect(); + + // Get back material properties from the model + Graphic3d_MaterialAspect aMatB = aModelB->getMaterialOCCAspect(); + + printf(">> GEOM_Displayer::Update() : SetMaterial\n"); + // 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); + + // Release memory + if ( aModelF ) + delete aModelF; + if ( aModelB ) + delete aModelB; + + // AISShape->SetName(???); ??? necessary to set name ??? occPrs->AddObject( AISShape ); @@ -993,6 +1064,11 @@ void GEOM_Displayer::Update( SALOME_VTKPrs* prs ) vtkActorCollection* theActors = 0; + QString anEntry; + if(!myIO.IsNull()) { + anEntry = myIO->getEntry(); + } + if ( myType == GEOM_MARKER && myShape.ShapeType() == TopAbs_FACE ) { //myToActivate = false; // ouv: commented to make the trihedron pickable (see IPAL18657) GEOM_VTKTrihedron* aTrh = GEOM_VTKTrihedron::New(); @@ -1021,10 +1097,8 @@ void GEOM_Displayer::Update( SALOME_VTKPrs* prs ) else { PropMap aDefPropMap = getDefaultPropertyMap(SVTK_Viewer::Type()); - QString anEntry; if(!myIO.IsNull()) { aMgrId = getViewManagerId(myViewFrame); - anEntry = myIO->getEntry(); } useStudy = !anEntry.isEmpty() && aMgrId != -1; @@ -1083,6 +1157,14 @@ void GEOM_Displayer::Update( SALOME_VTKPrs* prs ) aGeomGActor->SetShadingProperty( aProp ); aGeomGActor->SetWireframeProperty( aProp ); } + + // Set color for edges in shading + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + if(aResMgr) { + QColor c = aResMgr->colorValue( "Geometry", "edges_in_shading_color", QColor( 255, 255, 0 ) ); + aGeomGActor->SetEdgesInShadingColor( c.red()/255., c.green()/255., c.blue()/255. ); + } + int aIsos[2]= { 1, 1 }; if(useStudy) { QString anIsos = aPropMap.value(ISOS_PROP).toString(); @@ -1091,9 +1173,61 @@ void GEOM_Displayer::Update( SALOME_VTKPrs* prs ) aGeomGActor->SetNbIsos(aIsos); aGeomGActor->SetOpacity(1.0 - aPropMap.value(TRANSPARENCY_PROP).toDouble()); aGeomGActor->SetVectorMode(aPropMap.value(VECTOR_MODE_PROP).toInt()); - aGeomGActor->setDisplayMode(aPropMap.value(DISPLAY_MODE_PROP).toInt()); + int aDispModeId = aPropMap.value(DISPLAY_MODE_PROP).toInt(); + // Specially processing of 'Shading with edges' mode from preferences, + // because there is the following enum in VTK viewer: + // Points - 0, Wireframe - 1, Surface - 2, Insideframe - 3, SurfaceWithEdges - 4 + // (see VTKViewer::Representation enum) and the following enum in GEOM_Actor: + // eWireframe - 0, eShading - 1, eShadingWithEdges - 3 + if ( aDispModeId == 2 ) + // this is 'Shading with edges' mode => do the correct mapping to EDisplayMode + // enum in GEOM_Actor (and further to VTKViewer::Representation enum) + aDispModeId++; + 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(); + QStringList aPropsF = aMaterialF.split(DIGIT_SEPARATOR); + // Create front material model + Material_Model* aModelF = Material_Model::getMaterialModel( aPropsF ); + // Set front 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(); + + // 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; + } + 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; + vtkFloatingPointType aColor[3] = {1.,0.,0.}; if(aPropMap.contains(COLOR_PROP)) { QColor c = aPropMap.value(COLOR_PROP).value(); @@ -1126,6 +1260,36 @@ void GEOM_Displayer::Update( SALOME_VTKPrs* prs ) } aGeomGActor->SetColor(aColor[0],aColor[1],aColor[2]); } + else { + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + if ( aResMgr ) { + // Create front material model + Material_Model aModelF; + // Get front material name from resources + aModelF.fromResources( aResMgr, "Geometry", true ); + // Set front 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(); + + // Set material for the selected shape + std::vector aProps; + aProps.push_back(aMatPropF); + aProps.push_back(aMatPropB); + aGeomGActor->SetMaterial(aProps); + } + } } if ( myToActivate ) @@ -1791,6 +1955,19 @@ 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 ); + QString aMaterialF = aModelF.getMaterialProperty(); + aDefaultMap.insert( FRONT_MATERIAL_PROP , aMaterialF ); + + // Back material + Material_Model aModelB; + aModelB.fromResources( aResMgr, "Geometry", false ); + QString aMaterialB = aModelB.getMaterialProperty(); + aDefaultMap.insert( BACK_MATERIAL_PROP , aMaterialB ); + return aDefaultMap; } @@ -1820,6 +1997,14 @@ 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)); + nbInserted++; + } return (nbInserted > 0); } diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 09fa417d3..da7b2e0f8 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -945,6 +945,10 @@ Please, select face, shell or solid and try again GEOM_MEN_SHADING Shading + + GEOM_MEN_SHADING_WITH_EDGES + Shading With Edges + GEOM_MEN_SKETCHER_X Enter a Length to Set X @@ -2561,6 +2565,10 @@ Please, select face, shell or solid and try again MEN_POP_SHADING Shading + + MEN_POP_SHADING_WITH_EDGES + Shading With Edges + MEN_POP_TEXTURE Texture @@ -2637,6 +2645,10 @@ Please, select face, shell or solid and try again MEN_SHADING Shading + + MEN_SHADING_WITH_EDGES + Shading With Edges + MEN_SHADING_COLOR Shading Color @@ -2753,6 +2765,10 @@ Please, select face, shell or solid and try again MEN_POP_POINT_MARKER Point Marker + + MEN_POP_MATERIAL_PROPERTIES + Material Properties + NAME_LBL Name: @@ -2857,6 +2873,10 @@ Please, select face, shell or solid and try again PREF_SHADING_COLOR Default shading color + + PREF_EDGES_IN_SHADING + Edges in shading + PREF_STEP_VALUE Step value for spin boxes @@ -2877,6 +2897,14 @@ Please, select face, shell or solid and try again PREF_WIREFRAME_COLOR Default wireframe color + + PREF_FRONT_MATERIAL + Default front material + + + PREF_BACK_MATERIAL + Default back material + PROCESS_SHAPE_NEW_OBJ_NAME ProcessShape @@ -3229,6 +3257,10 @@ Please, select face, shell or solid and try again STB_POP_SHADING Shading + + STB_POP_SHADING_WITH_EDGES + Shading With Edges + STB_POP_SETTEXTURE Add a texture @@ -3369,6 +3401,10 @@ Please, select face, shell or solid and try again STB_POP_POINT_MARKER Set Point Marker + + STB_POP_MATERIAL_PROPERTIES + Set Material Properties + SUPPRESS_RESULT Suppress Result @@ -3781,6 +3817,10 @@ Please, select face, shell or solid and try again TOP_POP_SHADING Shading + + TOP_POP_SHADING_WITH_EDGES + Shading With Edges + TOP_POP_SETTEXTURE Texture @@ -3901,6 +3941,10 @@ Please, select face, shell or solid and try again TOP_POP_POINT_MARKER Point Marker + + TOP_POP_MATERIAL_PROPERTIES + Material Properties + WRN_NOT_IMPLEMENTED Sorry, this functionality is not yet implemented @@ -5005,6 +5049,61 @@ Would you like to continue? Load Texture + + GEOMToolsGUI_MaterialPropertiesDlg + + MATERIAL_PROPERTIES_TLT + Set Material Properties + + + MATERIAL_BACK_CHK + Enable back material + + + AMBIENT_GRP + Ambient + + + DIFFUSE_GRP + Diffuse + + + SPECULAR_GRP + Specular + + + EMISSION_GRP + Emission + + + COLOR + Color: + + + COEFFICIENT + Coefficient: + + + SHININESS + Shininess: + + + CUSTOM_MATERIAL + Custom material + + + OK_BTN + &OK + + + CANCEL_BTN + &Cancel + + + HELP_BTN + &Help + + OperationGUI_GetSharedShapesDlg diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index b5ee36ed4..e037eb54e 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -945,6 +945,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau GEOM_MEN_SHADING Ombrage + + GEOM_MEN_SHADING_WITH_EDGES + Ombrage Avec Arêtes + GEOM_MEN_SKETCHER_X Indiquez la distance selon l'axe X @@ -2561,6 +2565,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau MEN_POP_SHADING Ombrage + + MEN_POP_SHADING_WITH_EDGES + Ombrage Avec Arêtes + MEN_POP_TEXTURE Texture @@ -2637,6 +2645,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau MEN_SHADING Ombrage + + MEN_SHADING_WITH_EDGES + Ombrage Avec Arêtes + MEN_SHADING_COLOR Couleur d'ombrage @@ -2753,6 +2765,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau MEN_POP_POINT_MARKER Marqueur de point + + MEN_POP_MATERIAL_PROPERTIES + Propriétés des matériaux + NAME_LBL Nom : @@ -2857,6 +2873,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau PREF_SHADING_COLOR Couleur d'ombrage par défaut + + PREF_EDGES_IN_SHADING + Bords de l'ombrage + PREF_STEP_VALUE Valeur du pas pour les boîtes d'incrément @@ -2877,6 +2897,14 @@ Choisissez une face, une coque ou un solide et essayez de nouveau PREF_WIREFRAME_COLOR Couleur des contours par défaut + + PREF_FRONT_MATERIAL + Devant du matériel par défaut + + + PREF_BACK_MATERIAL + Retour du matériel par défaut + PROCESS_SHAPE_NEW_OBJ_NAME FormeRetraitée @@ -3229,6 +3257,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau STB_POP_SHADING Ombrage + + STB_POP_SHADING_WITH_EDGES + Ombrage Avec Arêtes + STB_POP_SETTEXTURE Ajoute une texture @@ -3369,6 +3401,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau STB_POP_POINT_MARKER Définir un marqueur de point + + STB_POP_MATERIAL_PROPERTIES + Définir un propriétés des matériaux + SUPPRESS_RESULT Supprimer le résultat @@ -3781,6 +3817,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau TOP_POP_SHADING Ombrage + + TOP_POP_SHADING_WITH_EDGES + Ombrage Avec Arêtes + TOP_POP_SETTEXTURE Texture @@ -3901,6 +3941,10 @@ Choisissez une face, une coque ou un solide et essayez de nouveau TOP_POP_POINT_MARKER Marqueur de point + + TOP_POP_MATERIAL_PROPERTIES + Propriétés des matériaux + WRN_NOT_IMPLEMENTED Désolé, cette fonctionnalité n'est pas encore implémentée @@ -5005,6 +5049,61 @@ Voulez-vous continuer? Ouvrir une Texture + + GEOMToolsGUI_MaterialPropertiesDlg + + MATERIAL_PROPERTIES_TLT + Définir un Propriétés des Matériaux + + + MATERIAL_BACK_CHK + Activer retour du matériel + + + AMBIENT_GRP + Ambiante + + + DIFFUSE_GRP + Diffuse + + + SPECULAR_GRP + Spéculaire + + + EMISSION_GRP + Démission + + + COLOR + Couleurs: + + + COEFFICIENT + Coefficient: + + + SHININESS + Shininess: + + + CUSTOM_MATERIAL + Matériau personnalisé + + + OK_BTN + &OK + + + CANCEL_BTN + A&nnuler + + + HELP_BTN + &Aide + + OperationGUI_GetSharedShapesDlg diff --git a/src/GEOMGUI/GeometryGUI.cxx b/src/GEOMGUI/GeometryGUI.cxx index 60d773472..cfa64c465 100644 --- a/src/GEOMGUI/GeometryGUI.cxx +++ b/src/GEOMGUI/GeometryGUI.cxx @@ -31,11 +31,14 @@ #include "GeometryGUI_Operations.h" #include "GEOMGUI_OCCSelector.h" #include "GEOMGUI_Selection.h" +#include "GEOM_Constants.h" #include "GEOM_Displayer.h" #include "GEOM_AISShape.hxx" #include "GEOM_Actor.h" +#include + #include #include #include @@ -389,169 +392,171 @@ void GeometryGUI::OnGUIEvent( int id ) QString libName; // find corresponding GUI library switch ( id ) { - case GEOMOp::OpOriginAndVectors: // MENU BASIC - ORIGIN AND BASE VECTORS + case GEOMOp::OpOriginAndVectors: // MENU BASIC - ORIGIN AND BASE VECTORS createOriginAndBaseVectors(); // internal operation return; - case GEOMOp::OpImport: // MENU FILE - IMPORT - case GEOMOp::OpExport: // MENU FILE - EXPORT - case GEOMOp::OpSelectVertex: // POPUP MENU - SELECT ONLY - VERTEX - case GEOMOp::OpSelectEdge: // POPUP MENU - SELECT ONLY - EDGE - case GEOMOp::OpSelectWire: // POPUP MENU - SELECT ONLY - WIRE - case GEOMOp::OpSelectFace: // POPUP MENU - SELECT ONLY - FACE - case GEOMOp::OpSelectShell: // POPUP MENU - SELECT ONLY - SHELL - case GEOMOp::OpSelectSolid: // POPUP MENU - SELECT ONLY - SOLID - case GEOMOp::OpSelectCompound: // POPUP MENU - SELECT ONLY - COMPOUND - case GEOMOp::OpSelectAll: // POPUP MENU - SELECT ONLY - SELECT ALL - case GEOMOp::OpDelete: // MENU EDIT - DELETE - case GEOMOp::OpCheckGeom: // MENU TOOLS - CHECK GEOMETRY - case GEOMOp::OpDeflection: // POPUP MENU - DEFLECTION COEFFICIENT - case GEOMOp::OpColor: // POPUP MENU - COLOR - case GEOMOp::OpSetTexture: // POPUP MENU - SETTEXTURE - case GEOMOp::OpTransparency: // POPUP MENU - TRANSPARENCY - case GEOMOp::OpIncrTransparency: // SHORTCUT - INCREASE TRANSPARENCY - case GEOMOp::OpDecrTransparency: // SHORTCUT - DECREASE TRANSPARENCY - case GEOMOp::OpIsos: // POPUP MENU - ISOS - case GEOMOp::OpIncrNbIsos: // SHORTCUT - INCREASE NB ISOS - case GEOMOp::OpDecrNbIsos: // SHORTCUT - DECREASE NB ISOS - case GEOMOp::OpAutoColor: // POPUP MENU - AUTO COLOR - case GEOMOp::OpNoAutoColor: // POPUP MENU - DISABLE AUTO COLOR - case GEOMOp::OpShowChildren: // POPUP MENU - SHOW CHILDREN - case GEOMOp::OpHideChildren: // POPUP MENU - HIDE CHILDREN - case GEOMOp::OpUnpublishObject: // POPUP MENU - UNPUBLISH - case GEOMOp::OpPublishObject: // ROOT GEOM OBJECT - POPUP MENU - PUBLISH - case GEOMOp::OpPointMarker: // POPUP MENU - POINT MARKER + case GEOMOp::OpImport: // MENU FILE - IMPORT + case GEOMOp::OpExport: // MENU FILE - EXPORT + case GEOMOp::OpSelectVertex: // POPUP MENU - SELECT ONLY - VERTEX + case GEOMOp::OpSelectEdge: // POPUP MENU - SELECT ONLY - EDGE + case GEOMOp::OpSelectWire: // POPUP MENU - SELECT ONLY - WIRE + case GEOMOp::OpSelectFace: // POPUP MENU - SELECT ONLY - FACE + case GEOMOp::OpSelectShell: // POPUP MENU - SELECT ONLY - SHELL + case GEOMOp::OpSelectSolid: // POPUP MENU - SELECT ONLY - SOLID + case GEOMOp::OpSelectCompound: // POPUP MENU - SELECT ONLY - COMPOUND + case GEOMOp::OpSelectAll: // POPUP MENU - SELECT ONLY - SELECT ALL + case GEOMOp::OpDelete: // MENU EDIT - DELETE + case GEOMOp::OpCheckGeom: // MENU TOOLS - CHECK GEOMETRY + case GEOMOp::OpDeflection: // POPUP MENU - DEFLECTION COEFFICIENT + case GEOMOp::OpColor: // POPUP MENU - COLOR + case GEOMOp::OpSetTexture: // POPUP MENU - SETTEXTURE + case GEOMOp::OpTransparency: // POPUP MENU - TRANSPARENCY + case GEOMOp::OpIncrTransparency: // SHORTCUT - INCREASE TRANSPARENCY + case GEOMOp::OpDecrTransparency: // SHORTCUT - DECREASE TRANSPARENCY + case GEOMOp::OpIsos: // POPUP MENU - ISOS + case GEOMOp::OpIncrNbIsos: // SHORTCUT - INCREASE NB ISOS + case GEOMOp::OpDecrNbIsos: // SHORTCUT - DECREASE NB ISOS + case GEOMOp::OpAutoColor: // POPUP MENU - AUTO COLOR + case GEOMOp::OpNoAutoColor: // POPUP MENU - DISABLE AUTO COLOR + case GEOMOp::OpShowChildren: // POPUP MENU - SHOW CHILDREN + case GEOMOp::OpHideChildren: // POPUP MENU - HIDE CHILDREN + case GEOMOp::OpUnpublishObject: // POPUP MENU - UNPUBLISH + case GEOMOp::OpPublishObject: // ROOT GEOM OBJECT - POPUP MENU - PUBLISH + case GEOMOp::OpPointMarker: // POPUP MENU - POINT MARKER + case GEOMOp::OpMaterialProperties: // POPUP MENU - MATERIAL PROPERTIES libName = "GEOMToolsGUI"; break; - case GEOMOp::OpDisplayMode: // MENU VIEW - WIREFRAME/SHADING - case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL - case GEOMOp::OpShowOnly: // MENU VIEW - DISPLAY ONLY - case GEOMOp::OpHideAll: // MENU VIEW - ERASE ALL - case GEOMOp::OpHide: // MENU VIEW - ERASE - case GEOMOp::OpShow: // MENU VIEW - DISPLAY - case GEOMOp::OpSwitchVectors: // MENU VIEW - VECTOR MODE - case GEOMOp::OpWireframe: // POPUP MENU - WIREFRAME - case GEOMOp::OpShading: // POPUP MENU - SHADING - case GEOMOp::OpTexture: // POPUP MENU - TEXTURE - case GEOMOp::OpVectors: // POPUP MENU - VECTORS + case GEOMOp::OpDisplayMode: // MENU VIEW - WIREFRAME/SHADING + case GEOMOp::OpShowAll: // MENU VIEW - SHOW ALL + case GEOMOp::OpShowOnly: // MENU VIEW - DISPLAY ONLY + case GEOMOp::OpHideAll: // MENU VIEW - ERASE ALL + case GEOMOp::OpHide: // MENU VIEW - ERASE + case GEOMOp::OpShow: // MENU VIEW - DISPLAY + case GEOMOp::OpSwitchVectors: // MENU VIEW - VECTOR MODE + case GEOMOp::OpWireframe: // POPUP MENU - WIREFRAME + case GEOMOp::OpShading: // POPUP MENU - SHADING + case GEOMOp::OpShadingWithEdges: // POPUP MENU - SHADING WITH EDGES + case GEOMOp::OpTexture: // POPUP MENU - TEXTURE + case GEOMOp::OpVectors: // POPUP MENU - VECTORS libName = "DisplayGUI"; break; - case GEOMOp::OpPoint: // MENU BASIC - POINT - case GEOMOp::OpLine: // MENU BASIC - LINE - case GEOMOp::OpCircle: // MENU BASIC - CIRCLE - case GEOMOp::OpEllipse: // MENU BASIC - ELLIPSE - case GEOMOp::OpArc: // MENU BASIC - ARC - case GEOMOp::OpVector: // MENU BASIC - VECTOR - case GEOMOp::OpPlane: // MENU BASIC - PLANE - case GEOMOp::OpCurve: // MENU BASIC - CURVE - case GEOMOp::OpLCS: // MENU BASIC - LOCAL COORDINATE SYSTEM + case GEOMOp::OpPoint: // MENU BASIC - POINT + case GEOMOp::OpLine: // MENU BASIC - LINE + case GEOMOp::OpCircle: // MENU BASIC - CIRCLE + case GEOMOp::OpEllipse: // MENU BASIC - ELLIPSE + case GEOMOp::OpArc: // MENU BASIC - ARC + case GEOMOp::OpVector: // MENU BASIC - VECTOR + case GEOMOp::OpPlane: // MENU BASIC - PLANE + case GEOMOp::OpCurve: // MENU BASIC - CURVE + case GEOMOp::OpLCS: // MENU BASIC - LOCAL COORDINATE SYSTEM libName = "BasicGUI"; break; - case GEOMOp::OpBox: // MENU PRIMITIVE - BOX - case GEOMOp::OpCylinder: // MENU PRIMITIVE - CYLINDER - case GEOMOp::OpSphere: // MENU PRIMITIVE - SPHERE - case GEOMOp::OpTorus: // MENU PRIMITIVE - TORUS - case GEOMOp::OpCone: // MENU PRIMITIVE - CONE - case GEOMOp::OpRectangle: // MENU PRIMITIVE - FACE - case GEOMOp::OpDisk: // MENU PRIMITIVE - DISK + case GEOMOp::OpBox: // MENU PRIMITIVE - BOX + case GEOMOp::OpCylinder: // MENU PRIMITIVE - CYLINDER + case GEOMOp::OpSphere: // MENU PRIMITIVE - SPHERE + case GEOMOp::OpTorus: // MENU PRIMITIVE - TORUS + case GEOMOp::OpCone: // MENU PRIMITIVE - CONE + case GEOMOp::OpRectangle: // MENU PRIMITIVE - FACE + case GEOMOp::OpDisk: // MENU PRIMITIVE - DISK libName = "PrimitiveGUI"; break; - case GEOMOp::OpPrism: // MENU GENERATION - PRISM - case GEOMOp::OpRevolution: // MENU GENERATION - REVOLUTION - case GEOMOp::OpFilling: // MENU GENERATION - FILLING - case GEOMOp::OpPipe: // MENU GENERATION - PIPE + case GEOMOp::OpPrism: // MENU GENERATION - PRISM + case GEOMOp::OpRevolution: // MENU GENERATION - REVOLUTION + case GEOMOp::OpFilling: // MENU GENERATION - FILLING + case GEOMOp::OpPipe: // MENU GENERATION - PIPE libName = "GenerationGUI"; break; - case GEOMOp::Op2dSketcher: // MENU ENTITY - SKETCHER - case GEOMOp::Op3dSketcher: // MENU ENTITY - 3D SKETCHER - case GEOMOp::OpExplode: // MENU ENTITY - EXPLODE + case GEOMOp::Op2dSketcher: // MENU ENTITY - SKETCHER + case GEOMOp::Op3dSketcher: // MENU ENTITY - 3D SKETCHER + case GEOMOp::OpExplode: // MENU ENTITY - EXPLODE #ifdef WITH_OPENCV - case GEOMOp::OpFeatureDetect: // MENU ENTITY - FEATURE DETECTION + case GEOMOp::OpFeatureDetect: // MENU ENTITY - FEATURE DETECTION #endif - case GEOMOp::OpPictureImport: // MENU ENTITY - IMPORT PICTURE IN VIEWER + case GEOMOp::OpPictureImport: // MENU ENTITY - IMPORT PICTURE IN VIEWER libName = "EntityGUI"; break; - case GEOMOp::OpEdge: // MENU BUILD - EDGE - case GEOMOp::OpWire: // MENU BUILD - WIRE - case GEOMOp::OpFace: // MENU BUILD - FACE - case GEOMOp::OpShell: // MENU BUILD - SHELL - case GEOMOp::OpSolid: // MENU BUILD - SOLID - case GEOMOp::OpCompound: // MENU BUILD - COMPUND + case GEOMOp::OpEdge: // MENU BUILD - EDGE + case GEOMOp::OpWire: // MENU BUILD - WIRE + case GEOMOp::OpFace: // MENU BUILD - FACE + case GEOMOp::OpShell: // MENU BUILD - SHELL + case GEOMOp::OpSolid: // MENU BUILD - SOLID + case GEOMOp::OpCompound: // MENU BUILD - COMPUND libName = "BuildGUI"; break; - case GEOMOp::OpFuse: // MENU BOOLEAN - FUSE - case GEOMOp::OpCommon: // MENU BOOLEAN - COMMON - case GEOMOp::OpCut: // MENU BOOLEAN - CUT - case GEOMOp::OpSection: // MENU BOOLEAN - SECTION + case GEOMOp::OpFuse: // MENU BOOLEAN - FUSE + case GEOMOp::OpCommon: // MENU BOOLEAN - COMMON + case GEOMOp::OpCut: // MENU BOOLEAN - CUT + case GEOMOp::OpSection: // MENU BOOLEAN - SECTION libName = "BooleanGUI"; break; - case GEOMOp::OpTranslate: // MENU TRANSFORMATION - TRANSLATION - case GEOMOp::OpRotate: // MENU TRANSFORMATION - ROTATION - case GEOMOp::OpChangeLoc: // MENU TRANSFORMATION - LOCATION - case GEOMOp::OpMirror: // MENU TRANSFORMATION - MIRROR - case GEOMOp::OpScale: // MENU TRANSFORMATION - SCALE - case GEOMOp::OpOffset: // MENU TRANSFORMATION - OFFSET - case GEOMOp::OpProjection: // MENU TRANSFORMATION - PROJECTION - case GEOMOp::OpMultiTranslate: // MENU TRANSFORMATION - MULTI-TRANSLATION - case GEOMOp::OpMultiRotate: // MENU TRANSFORMATION - MULTI-ROTATION - case GEOMOp::OpReimport: // CONTEXT(POPUP) MENU - RELOAD_IMPORTED + case GEOMOp::OpTranslate: // MENU TRANSFORMATION - TRANSLATION + case GEOMOp::OpRotate: // MENU TRANSFORMATION - ROTATION + case GEOMOp::OpChangeLoc: // MENU TRANSFORMATION - LOCATION + case GEOMOp::OpMirror: // MENU TRANSFORMATION - MIRROR + case GEOMOp::OpScale: // MENU TRANSFORMATION - SCALE + case GEOMOp::OpOffset: // MENU TRANSFORMATION - OFFSET + case GEOMOp::OpProjection: // MENU TRANSFORMATION - PROJECTION + case GEOMOp::OpMultiTranslate: // MENU TRANSFORMATION - MULTI-TRANSLATION + case GEOMOp::OpMultiRotate: // MENU TRANSFORMATION - MULTI-ROTATION + case GEOMOp::OpReimport: // CONTEXT(POPUP) MENU - RELOAD_IMPORTED libName = "TransformationGUI"; break; - case GEOMOp::OpPartition: // MENU OPERATION - PARTITION - case GEOMOp::OpArchimede: // MENU OPERATION - ARCHIMEDE - case GEOMOp::OpFillet3d: // MENU OPERATION - FILLET - case GEOMOp::OpChamfer: // MENU OPERATION - CHAMFER - case GEOMOp::OpClipping: // MENU OPERATION - CLIPPING RANGE - case GEOMOp::OpShapesOnShape: // MENU OPERATION - GET SHAPES ON SHAPE - case GEOMOp::OpFillet2d: // MENU OPERATION - FILLET 2D - case GEOMOp::OpFillet1d: // MENU OPERATION - FILLET 1D - case GEOMOp::OpSharedShapes: // MENU OPERATION - GET SHARED SHAPES + case GEOMOp::OpPartition: // MENU OPERATION - PARTITION + case GEOMOp::OpArchimede: // MENU OPERATION - ARCHIMEDE + case GEOMOp::OpFillet3d: // MENU OPERATION - FILLET + case GEOMOp::OpChamfer: // MENU OPERATION - CHAMFER + case GEOMOp::OpClipping: // MENU OPERATION - CLIPPING RANGE + case GEOMOp::OpShapesOnShape: // MENU OPERATION - GET SHAPES ON SHAPE + case GEOMOp::OpFillet2d: // MENU OPERATION - FILLET 2D + case GEOMOp::OpFillet1d: // MENU OPERATION - FILLET 1D + case GEOMOp::OpSharedShapes: // MENU OPERATION - GET SHARED SHAPES libName = "OperationGUI"; break; - case GEOMOp::OpSewing: // MENU REPAIR - SEWING - case GEOMOp::OpSuppressFaces: // MENU REPAIR - SUPPRESS FACES - case GEOMOp::OpSuppressHoles: // MENU REPAIR - SUPPRESS HOLE - case GEOMOp::OpShapeProcess: // MENU REPAIR - SHAPE PROCESSING - case GEOMOp::OpCloseContour: // MENU REPAIR - CLOSE CONTOUR - case GEOMOp::OpRemoveIntWires: // MENU REPAIR - REMOVE INTERNAL WIRES - case GEOMOp::OpAddPointOnEdge: // MENU REPAIR - ADD POINT ON EDGE - case GEOMOp::OpFreeBoundaries: // MENU MEASURE - FREE BOUNDARIES - case GEOMOp::OpFreeFaces: // MENU MEASURE - FREE FACES - case GEOMOp::OpOrientation: // MENU REPAIR - CHANGE ORIENTATION - case GEOMOp::OpGlueFaces: // MENU REPAIR - GLUE FACES - case GEOMOp::OpGlueEdges: // MENU REPAIR - GLUE EDGES - case GEOMOp::OpLimitTolerance: // MENU REPAIR - LIMIT TOLERANCE - case GEOMOp::OpRemoveExtraEdges: // MENU REPAIR - REMOVE EXTRA EDGES + case GEOMOp::OpSewing: // MENU REPAIR - SEWING + case GEOMOp::OpSuppressFaces: // MENU REPAIR - SUPPRESS FACES + case GEOMOp::OpSuppressHoles: // MENU REPAIR - SUPPRESS HOLE + case GEOMOp::OpShapeProcess: // MENU REPAIR - SHAPE PROCESSING + case GEOMOp::OpCloseContour: // MENU REPAIR - CLOSE CONTOUR + case GEOMOp::OpRemoveIntWires: // MENU REPAIR - REMOVE INTERNAL WIRES + case GEOMOp::OpAddPointOnEdge: // MENU REPAIR - ADD POINT ON EDGE + case GEOMOp::OpFreeBoundaries: // MENU MEASURE - FREE BOUNDARIES + case GEOMOp::OpFreeFaces: // MENU MEASURE - FREE FACES + case GEOMOp::OpOrientation: // MENU REPAIR - CHANGE ORIENTATION + case GEOMOp::OpGlueFaces: // MENU REPAIR - GLUE FACES + case GEOMOp::OpGlueEdges: // MENU REPAIR - GLUE EDGES + case GEOMOp::OpLimitTolerance: // MENU REPAIR - LIMIT TOLERANCE + case GEOMOp::OpRemoveExtraEdges: // MENU REPAIR - REMOVE EXTRA EDGES libName = "RepairGUI"; break; - case GEOMOp::OpProperties: // MENU MEASURE - PROPERTIES - case GEOMOp::OpCenterMass: // MENU MEASURE - CDG - case GEOMOp::OpInertia: // MENU MEASURE - INERTIA - case GEOMOp::OpNormale: // MENU MEASURE - NORMALE - case GEOMOp::OpBoundingBox: // MENU MEASURE - BOUNDING BOX - case GEOMOp::OpMinDistance: // MENU MEASURE - MIN DISTANCE - case GEOMOp::OpAngle: // MENU MEASURE - ANGLE - case GEOMOp::OpTolerance: // MENU MEASURE - TOLERANCE - case GEOMOp::OpWhatIs: // MENU MEASURE - WHATIS - case GEOMOp::OpCheckShape: // MENU MEASURE - CHECK - case GEOMOp::OpCheckCompound: // MENU MEASURE - CHECK COMPOUND OF BLOCKS - case GEOMOp::OpPointCoordinates: // MENU MEASURE - POINT COORDINATES - case GEOMOp::OpCheckSelfInters: // MENU MEASURE - CHECK SELF INTERSECTIONS + case GEOMOp::OpProperties: // MENU MEASURE - PROPERTIES + case GEOMOp::OpCenterMass: // MENU MEASURE - CDG + case GEOMOp::OpInertia: // MENU MEASURE - INERTIA + case GEOMOp::OpNormale: // MENU MEASURE - NORMALE + case GEOMOp::OpBoundingBox: // MENU MEASURE - BOUNDING BOX + case GEOMOp::OpMinDistance: // MENU MEASURE - MIN DISTANCE + case GEOMOp::OpAngle: // MENU MEASURE - ANGLE + case GEOMOp::OpTolerance: // MENU MEASURE - TOLERANCE + case GEOMOp::OpWhatIs: // MENU MEASURE - WHATIS + case GEOMOp::OpCheckShape: // MENU MEASURE - CHECK + case GEOMOp::OpCheckCompound: // MENU MEASURE - CHECK COMPOUND OF BLOCKS + case GEOMOp::OpPointCoordinates: // MENU MEASURE - POINT COORDINATES + case GEOMOp::OpCheckSelfInters: // MENU MEASURE - CHECK SELF INTERSECTIONS libName = "MeasureGUI"; break; - case GEOMOp::OpGroupCreate: // MENU GROUP - CREATE - case GEOMOp::OpGroupCreatePopup: // POPUP MENU - CREATE GROUP - case GEOMOp::OpGroupEdit: // MENU GROUP - EDIT + case GEOMOp::OpGroupCreate: // MENU GROUP - CREATE + case GEOMOp::OpGroupCreatePopup: // POPUP MENU - CREATE GROUP + case GEOMOp::OpGroupEdit: // MENU GROUP - EDIT libName = "GroupGUI"; break; - case GEOMOp::OpHexaSolid: // MENU BLOCKS - HEXAHEDRAL SOLID - case GEOMOp::OpMultiTransform: // MENU BLOCKS - MULTI-TRANSFORMATION - case GEOMOp::OpQuadFace: // MENU BLOCKS - QUADRANGLE FACE - case GEOMOp::OpPropagate: // MENU BLOCKS - PROPAGATE - case GEOMOp::OpExplodeBlock: // MENU BLOCKS - EXPLODE ON BLOCKS + case GEOMOp::OpHexaSolid: // MENU BLOCKS - HEXAHEDRAL SOLID + case GEOMOp::OpMultiTransform: // MENU BLOCKS - MULTI-TRANSFORMATION + case GEOMOp::OpQuadFace: // MENU BLOCKS - QUADRANGLE FACE + case GEOMOp::OpPropagate: // MENU BLOCKS - PROPAGATE + case GEOMOp::OpExplodeBlock: // MENU BLOCKS - EXPLODE ON BLOCKS libName = "BlocksGUI"; break; - case GEOMOp::OpAdvancedNoOp: // NO OPERATION (advanced operations base) - case GEOMOp::OpPipeTShape: // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE + case GEOMOp::OpAdvancedNoOp: // NO OPERATION (advanced operations base) + case GEOMOp::OpPipeTShape: // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE // case GEOMOp::OpPipeTShapeGroups: // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@// libName = "AdvancedGUI"; @@ -571,8 +576,24 @@ void GeometryGUI::OnGUIEvent( int id ) } // call method of corresponding GUI library - if ( library ) + if ( library ) { library->OnGUIEvent( id, desk ); + + // Update a list of materials for "Preferences" dialog + if ( id == GEOMOp::OpMaterialProperties ) { + LightApp_Preferences* pref = preferences(); + 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(), + "strings", + aPerfMatNames ); + } + } + } else SUIT_MessageBox::critical( desk, tr( "GEOM_ERROR" ), tr( "GEOM_ERR_LIB_NOT_FOUND" ), tr( "GEOM_BUT_OK" ) ); } @@ -821,6 +842,7 @@ void GeometryGUI::initialize( CAM_Application* app ) createGeomAction( GEOMOp::OpWireframe, "POP_WIREFRAME", "", 0, true ); createGeomAction( GEOMOp::OpShading, "POP_SHADING", "", 0, true ); + createGeomAction( GEOMOp::OpShadingWithEdges, "POP_SHADING_WITH_EDGES", "", 0, true ); createGeomAction( GEOMOp::OpTexture, "POP_TEXTURE", "", 0, true ); createGeomAction( GEOMOp::OpVectors, "POP_VECTORS", "", 0, true ); createGeomAction( GEOMOp::OpDeflection, "POP_DEFLECTION" ); @@ -836,6 +858,7 @@ 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::OpPipeTShape, "PIPETSHAPE" ); @@ -1185,6 +1208,9 @@ void GeometryGUI::initialize( CAM_Application* app ) mgr->insert( action( GEOMOp::OpShading ), dispmodeId, -1 ); // shading mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule ); mgr->setRule( action( GEOMOp::OpShading ), clientOCCorVTK + " and displaymode='Shading'", QtxPopupMgr::ToggleRule ); + mgr->insert( action( GEOMOp::OpShadingWithEdges ), dispmodeId, -1 ); // shading with edges + mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule ); + mgr->setRule( action( GEOMOp::OpShadingWithEdges ), clientOCCorVTK + " and displaymode='ShadingWithEdges'", QtxPopupMgr::ToggleRule ); mgr->insert( action( GEOMOp::OpTexture ), dispmodeId, -1 ); // wireframe mgr->setRule( action( GEOMOp::OpTexture ), clientOCC_AndSomeVisible, QtxPopupMgr::VisibleRule ); mgr->setRule( action( GEOMOp::OpTexture), clientOCC + " and displaymode='Texture'", QtxPopupMgr::ToggleRule ); @@ -1204,6 +1230,8 @@ 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 mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule ); mgr->insert( separator(), -1, -1 ); // ----------- @@ -1624,6 +1652,9 @@ void GeometryGUI::createPreferences() addPreference( tr( "PREF_SHADING_COLOR" ), genGroup, LightApp_Preferences::Color, "Geometry", "shading_color" ); + addPreference( tr( "PREF_EDGES_IN_SHADING" ), genGroup, + LightApp_Preferences::Color, "Geometry", "edges_in_shading_color" ); + addPreference( tr( "PREF_WIREFRAME_COLOR" ), genGroup, LightApp_Preferences::Color, "Geometry", "wireframe_color" ); @@ -1645,6 +1676,14 @@ 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, + LightApp_Preferences::Selector, + "Geometry", "front_material" ); + + int back_material = addPreference( tr( "PREF_BACK_MATERIAL" ), genGroup, + LightApp_Preferences::Selector, + "Geometry", "back_material" ); + // Quantities with individual precision settings int precGroup = addPreference( tr( "GEOM_PREF_GROUP_PRECISION" ), tabId ); setPreferenceProperty( precGroup, "columns", 2 ); @@ -1688,10 +1727,12 @@ void GeometryGUI::createPreferences() QStringList aModesList; aModesList.append( tr("MEN_WIREFRAME") ); aModesList.append( tr("MEN_SHADING") ); + aModesList.append( tr("MEN_SHADING_WITH_EDGES") ); QList anIndexesList; anIndexesList.append(0); anIndexesList.append(1); + anIndexesList.append(2); setPreferenceProperty( dispmode, "strings", aModesList ); setPreferenceProperty( dispmode, "indexes", anIndexesList ); @@ -1707,6 +1748,12 @@ void GeometryGUI::createPreferences() setPreferenceProperty( defl, "step", 1.0e-04 ); setPreferenceProperty( defl, "precision", 6 ); + // Set property for default material + Material_ResourceMgr aMatResMgr; + QStringList aPrefMatNames = aMatResMgr.getPreferenceMaterialsNames(); + setPreferenceProperty( front_material, "strings", aPrefMatNames ); + setPreferenceProperty( back_material, "strings", aPrefMatNames ); + // Set property vertex marker type QList aMarkerTypeIndicesList; QList aMarkerTypeIconsList; @@ -1787,7 +1834,7 @@ const char gDigitsSep = ':'; // character used to separate numeric parameter val * \brief Store visual parameters * * This method is called just before the study document is saved. - * Store visual parameters in AttributeParameter attribue(s) + * Store visual parameters in AttributeParameter attribute(s) */ void GeometryGUI::storeVisualParameters (int savePoint) { @@ -1894,6 +1941,16 @@ void GeometryGUI::storeVisualParameters (int savePoint) param = occParam + MARKER_TYPE_PROP; 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(BACK_MATERIAL_PROP)) { + param = occParam + BACK_MATERIAL_PROP; + ip->setParameter(entry, param, aProps.value(BACK_MATERIAL_PROP).toString().toLatin1().data()); + } } // object iterator } // for (views) } // for (viewManagers) @@ -1903,7 +1960,7 @@ void GeometryGUI::storeVisualParameters (int savePoint) * \brief Restore visual parameters * * This method is called after the study document is opened. - * Restore visual parameters from AttributeParameter attribue(s) + * Restore visual parameters from AttributeParameter attribute(s) */ void GeometryGUI::restoreVisualParameters (int savePoint) { @@ -2001,6 +2058,10 @@ 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); } } // for names/parameters iterator diff --git a/src/GEOMGUI/GeometryGUI.h b/src/GEOMGUI/GeometryGUI.h index e523da284..406120e93 100644 --- a/src/GEOMGUI/GeometryGUI.h +++ b/src/GEOMGUI/GeometryGUI.h @@ -54,24 +54,6 @@ #include "SALOMEconfig.h" #include CORBA_CLIENT_HEADER(SALOMEDS) -// minimum allowed value for deflection coefficient -#define DEFLECTION_MIN 1e-06 - -//Define separators -#define NAME_SEPARATOR '_' // character used to separate parameter names -#define DIGIT_SEPARATOR ':' // character used to separate numeric parameter values (color = r:g:b) - -#define VISIBILITY_PROP "Visibility" //Object visibility property -#define OPACITY_PROP "Opacity" //Object opacity property -#define TRANSPARENCY_PROP "Transparency" //Object transparency property -#define DISPLAY_MODE_PROP "DisplayMode" //Object display mode property -#define ISOS_PROP "Isos" //Number of the Isos property of the object -#define COLOR_PROP "Color" //Color of the object -#define VECTOR_MODE_PROP "VectorMode" //Vector mode property -#define DEFLECTION_COEFF_PROP "DeflectionCoeff" //Deflection coeff property -#define MARKER_TYPE_PROP "MarkerType" // Marker type property - - class QDialog; class QMenu; class GEOMGUI_OCCSelector; diff --git a/src/GEOMGUI/GeometryGUI_Operations.h b/src/GEOMGUI/GeometryGUI_Operations.h index 1731c1772..5ff8d5921 100644 --- a/src/GEOMGUI/GeometryGUI_Operations.h +++ b/src/GEOMGUI/GeometryGUI_Operations.h @@ -25,155 +25,157 @@ namespace GEOMOp { enum { // ToolsGUI ------------------//-------------------------------- - OpImport = 1000, // MENU FILE - IMPORT - OpExport = 1001, // MENU FILE - EXPORT - OpDelete = 1020, // MENU EDIT - DELETE - OpCheckGeom = 1030, // MENU TOOLS - CHECK GEOMETRY - OpSelectVertex = 1100, // POPUP MENU - SELECT ONLY - VERTEX - OpSelectEdge = 1101, // POPUP MENU - SELECT ONLY - EDGE - OpSelectWire = 1102, // POPUP MENU - SELECT ONLY - WIRE - OpSelectFace = 1103, // POPUP MENU - SELECT ONLY - FACE - OpSelectShell = 1104, // POPUP MENU - SELECT ONLY - SHELL - OpSelectSolid = 1105, // POPUP MENU - SELECT ONLY - SOLID - OpSelectCompound = 1106, // POPUP MENU - SELECT ONLY - COMPOUND - OpSelectAll = 1107, // POPUP MENU - SELECT ONLY - SELECT ALL - OpDeflection = 1200, // POPUP MENU - DEFLECTION COEFFICIENT - OpColor = 1201, // POPUP MENU - COLOR - OpTransparency = 1202, // POPUP MENU - TRANSPARENCY - OpIncrTransparency = 1203, // SHORTCUT - INCREASE TRANSPARENCY - OpDecrTransparency = 1204, // SHORTCUT - DECREASE TRANSPARENCY - OpIsos = 1205, // POPUP MENU - ISOS - OpIncrNbIsos = 1206, // SHORTCUT - INCREASE NB ISOS - OpDecrNbIsos = 1207, // SHORTCUT - DECREASE NB ISOS - OpAutoColor = 1208, // POPUP MENU - AUTO COLOR - OpNoAutoColor = 1209, // POPUP MENU - DISABLE AUTO COLOR - OpPointMarker = 1210, // POPUP MENU - POINT MARKER - OpSetTexture = 1211, // POPUP MENU - SETTEXTURE - OpShowChildren = 1250, // POPUP MENU - SHOW CHILDREN - OpHideChildren = 1251, // POPUP MENU - HIDE CHILDREN - OpUnpublishObject = 1253, // POPUP MENU - UNPUBLISH - OpPublishObject = 1254, // GEOM ROOT OBJECT - POPUP MENU - PUBLISH + OpImport = 1000, // MENU FILE - IMPORT + OpExport = 1001, // MENU FILE - EXPORT + OpDelete = 1020, // MENU EDIT - DELETE + OpCheckGeom = 1030, // MENU TOOLS - CHECK GEOMETRY + OpSelectVertex = 1100, // POPUP MENU - SELECT ONLY - VERTEX + OpSelectEdge = 1101, // POPUP MENU - SELECT ONLY - EDGE + OpSelectWire = 1102, // POPUP MENU - SELECT ONLY - WIRE + OpSelectFace = 1103, // POPUP MENU - SELECT ONLY - FACE + OpSelectShell = 1104, // POPUP MENU - SELECT ONLY - SHELL + OpSelectSolid = 1105, // POPUP MENU - SELECT ONLY - SOLID + OpSelectCompound = 1106, // POPUP MENU - SELECT ONLY - COMPOUND + OpSelectAll = 1107, // POPUP MENU - SELECT ONLY - SELECT ALL + OpDeflection = 1200, // POPUP MENU - DEFLECTION COEFFICIENT + OpColor = 1201, // POPUP MENU - COLOR + OpTransparency = 1202, // POPUP MENU - TRANSPARENCY + OpIncrTransparency = 1203, // SHORTCUT - INCREASE TRANSPARENCY + OpDecrTransparency = 1204, // SHORTCUT - DECREASE TRANSPARENCY + OpIsos = 1205, // POPUP MENU - ISOS + OpIncrNbIsos = 1206, // SHORTCUT - INCREASE NB ISOS + OpDecrNbIsos = 1207, // SHORTCUT - DECREASE NB ISOS + OpAutoColor = 1208, // POPUP MENU - AUTO COLOR + OpNoAutoColor = 1209, // POPUP MENU - DISABLE AUTO COLOR + OpPointMarker = 1210, // POPUP MENU - POINT MARKER + OpSetTexture = 1211, // POPUP MENU - SETTEXTURE + OpMaterialProperties = 1212, // POPUP MENU - MATERIAL PROPERTIES + OpShowChildren = 1250, // POPUP MENU - SHOW CHILDREN + OpHideChildren = 1251, // POPUP MENU - HIDE CHILDREN + OpUnpublishObject = 1253, // POPUP MENU - UNPUBLISH + OpPublishObject = 1254, // GEOM ROOT OBJECT - POPUP MENU - PUBLISH // DisplayGUI ----------------//-------------------------------- - OpDisplayMode = 2000, // MENU VIEW - DISPLAY MODE - WIREFRAME/SHADING - OpSwitchVectors = 2001, // MENU VIEW - DISPLAY MODE - SHOW/HIDE EDGE DIRECTION - OpShowAll = 2002, // MENU VIEW - SHOW ALL - OpHideAll = 2003, // MENU VIEW - HIDE ALL - OpShow = 2100, // POPUP MENU - SHOW - OpShowOnly = 2101, // POPUP MENU - SHOW ONLY - OpHide = 2102, // POPUP MENU - HIDE - OpWireframe = 2200, // POPUP MENU - DISPLAY MODE - WIREFRAME - OpShading = 2201, // POPUP MENU - DISPLAY MODE - SHADING - OpVectors = 2202, // POPUP MENU - DISPLAY MODE - SHOW EDGE DIRECTION - OpTexture = 2203, // POPUP MENU - DISPLAY MODE - TEXTURE + OpDisplayMode = 2000, // MENU VIEW - DISPLAY MODE - WIREFRAME/SHADING/SHADING WITH EDGES + OpSwitchVectors = 2001, // MENU VIEW - DISPLAY MODE - SHOW/HIDE EDGE DIRECTION + OpShowAll = 2002, // MENU VIEW - SHOW ALL + OpHideAll = 2003, // MENU VIEW - HIDE ALL + OpShow = 2100, // POPUP MENU - SHOW + OpShowOnly = 2101, // POPUP MENU - SHOW ONLY + OpHide = 2102, // POPUP MENU - HIDE + OpWireframe = 2200, // POPUP MENU - DISPLAY MODE - WIREFRAME + OpShading = 2201, // POPUP MENU - DISPLAY MODE - SHADING + OpShadingWithEdges = 2202, // POPUP MENU - DISPLAY MODE - SHADING WITH EDGES + OpVectors = 2203, // POPUP MENU - DISPLAY MODE - SHOW EDGE DIRECTION + OpTexture = 2204, // POPUP MENU - DISPLAY MODE - TEXTURE // BasicGUI ------------------//-------------------------------- - OpPoint = 3000, // MENU NEW ENTITY - BASIC - POINT - OpLine = 3001, // MENU NEW ENTITY - BASIC - LINE - OpCircle = 3002, // MENU NEW ENTITY - BASIC - CIRCLE - OpEllipse = 3003, // MENU NEW ENTITY - BASIC - ELLIPSE - OpArc = 3004, // MENU NEW ENTITY - BASIC - ARC - OpVector = 3005, // MENU NEW ENTITY - BASIC - VECTOR - OpPlane = 3006, // MENU NEW ENTITY - BASIC - PLANE - OpCurve = 3007, // MENU NEW ENTITY - BASIC - CURVE - OpLCS = 3008, // MENU NEW ENTITY - BASIC - LOCAL COORDINATE SYSTEM - OpOriginAndVectors = 3009, // MENU NEW ENTITY - BASIC - ORIGIN AND BASE VECTORS + OpPoint = 3000, // MENU NEW ENTITY - BASIC - POINT + OpLine = 3001, // MENU NEW ENTITY - BASIC - LINE + OpCircle = 3002, // MENU NEW ENTITY - BASIC - CIRCLE + OpEllipse = 3003, // MENU NEW ENTITY - BASIC - ELLIPSE + OpArc = 3004, // MENU NEW ENTITY - BASIC - ARC + OpVector = 3005, // MENU NEW ENTITY - BASIC - VECTOR + OpPlane = 3006, // MENU NEW ENTITY - BASIC - PLANE + OpCurve = 3007, // MENU NEW ENTITY - BASIC - CURVE + OpLCS = 3008, // MENU NEW ENTITY - BASIC - LOCAL COORDINATE SYSTEM + OpOriginAndVectors = 3009, // MENU NEW ENTITY - BASIC - ORIGIN AND BASE VECTORS // PrimitiveGUI --------------//-------------------------------- - OpBox = 3100, // MENU NEW ENTITY - PRIMITIVES - BOX - OpCylinder = 3101, // MENU NEW ENTITY - PRIMITIVES - CYLINDER - OpSphere = 3102, // MENU NEW ENTITY - PRIMITIVES - SPHERE - OpTorus = 3103, // MENU NEW ENTITY - PRIMITIVES - TORUS - OpCone = 3104, // MENU NEW ENTITY - PRIMITIVES - CONE - OpRectangle = 3105, // MENU NEW ENTITY - PRIMITIVES - FACE - OpDisk = 3106, // MENU NEW ENTITY - PRIMITIVES - DISK + OpBox = 3100, // MENU NEW ENTITY - PRIMITIVES - BOX + OpCylinder = 3101, // MENU NEW ENTITY - PRIMITIVES - CYLINDER + OpSphere = 3102, // MENU NEW ENTITY - PRIMITIVES - SPHERE + OpTorus = 3103, // MENU NEW ENTITY - PRIMITIVES - TORUS + OpCone = 3104, // MENU NEW ENTITY - PRIMITIVES - CONE + OpRectangle = 3105, // MENU NEW ENTITY - PRIMITIVES - FACE + OpDisk = 3106, // MENU NEW ENTITY - PRIMITIVES - DISK // GenerationGUI -------------//-------------------------------- - OpPrism = 3200, // MENU NEW ENTITY - GENERATION - EXTRUSION - OpRevolution = 3201, // MENU NEW ENTITY - GENERATION - REVOLUTION - OpFilling = 3202, // MENU NEW ENTITY - GENERATION - FILLING - OpPipe = 3203, // MENU NEW ENTITY - GENERATION - EXTRUSION ALONG PATH + OpPrism = 3200, // MENU NEW ENTITY - GENERATION - EXTRUSION + OpRevolution = 3201, // MENU NEW ENTITY - GENERATION - REVOLUTION + OpFilling = 3202, // MENU NEW ENTITY - GENERATION - FILLING + OpPipe = 3203, // MENU NEW ENTITY - GENERATION - EXTRUSION ALONG PATH // EntityGUI -----------------//-------------------------------- - Op2dSketcher = 3300, // MENU NEW ENTITY - SKETCHER - Op3dSketcher = 3301, // MENU NEW ENTITY - 3D SKETCHER - OpExplode = 3302, // MENU NEW ENTITY - EXPLODE + Op2dSketcher = 3300, // MENU NEW ENTITY - SKETCHER + Op3dSketcher = 3301, // MENU NEW ENTITY - 3D SKETCHER + OpExplode = 3302, // MENU NEW ENTITY - EXPLODE #ifdef WITH_OPENCV - OpFeatureDetect = 3303, // MENU NEW ENTITY - FEATURE DETECTION + OpFeatureDetect = 3303, // MENU NEW ENTITY - FEATURE DETECTION #endif - OpPictureImport = 3304, // MENU NEW ENTITY - IMPORT PICTURE IN VIEWER + OpPictureImport = 3304, // MENU NEW ENTITY - IMPORT PICTURE IN VIEWER // BuildGUI ------------------//-------------------------------- - OpEdge = 3400, // MENU NEW ENTITY - BUILD - EDGE - OpWire = 3401, // MENU NEW ENTITY - BUILD - WIRE - OpFace = 3402, // MENU NEW ENTITY - BUILD - FACE - OpShell = 3403, // MENU NEW ENTITY - BUILD - SHELL - OpSolid = 3404, // MENU NEW ENTITY - BUILD - SOLID - OpCompound = 3405, // MENU NEW ENTITY - BUILD - COMPOUND + OpEdge = 3400, // MENU NEW ENTITY - BUILD - EDGE + OpWire = 3401, // MENU NEW ENTITY - BUILD - WIRE + OpFace = 3402, // MENU NEW ENTITY - BUILD - FACE + OpShell = 3403, // MENU NEW ENTITY - BUILD - SHELL + OpSolid = 3404, // MENU NEW ENTITY - BUILD - SOLID + OpCompound = 3405, // MENU NEW ENTITY - BUILD - COMPOUND // BooleanGUI ----------------//-------------------------------- - OpFuse = 3500, // MENU OPERATIONS - BOOLEAN - FUSE - OpCommon = 3501, // MENU OPERATIONS - BOOLEAN - COMMON - OpCut = 3502, // MENU OPERATIONS - BOOLEAN - CUT - OpSection = 3503, // MENU OPERATIONS - BOOLEAN - SECTION + OpFuse = 3500, // MENU OPERATIONS - BOOLEAN - FUSE + OpCommon = 3501, // MENU OPERATIONS - BOOLEAN - COMMON + OpCut = 3502, // MENU OPERATIONS - BOOLEAN - CUT + OpSection = 3503, // MENU OPERATIONS - BOOLEAN - SECTION // TransformationGUI ---------//-------------------------------- - OpTranslate = 3600, // MENU OPERATIONS - TRANSFORMATION - TRANSLATION - OpRotate = 3601, // MENU OPERATIONS - TRANSFORMATION - ROTATION - OpChangeLoc = 3602, // MENU OPERATIONS - TRANSFORMATION - LOCATION - OpMirror = 3603, // MENU OPERATIONS - TRANSFORMATION - MIRROR - OpScale = 3604, // MENU OPERATIONS - TRANSFORMATION - SCALE - OpOffset = 3605, // MENU OPERATIONS - TRANSFORMATION - OFFSET - OpMultiTranslate = 3606, // MENU OPERATIONS - TRANSFORMATION - MULTI-TRANSLATION - OpMultiRotate = 3607, // MENU OPERATIONS - TRANSFORMATION - MULTI-ROTATION - OpReimport = 3608, // POPUP MENU - RELOAD IMPORTED - OpProjection = 3609, // MENU OPERATIONS - TRANSFORMATION - PROJECTION + OpTranslate = 3600, // MENU OPERATIONS - TRANSFORMATION - TRANSLATION + OpRotate = 3601, // MENU OPERATIONS - TRANSFORMATION - ROTATION + OpChangeLoc = 3602, // MENU OPERATIONS - TRANSFORMATION - LOCATION + OpMirror = 3603, // MENU OPERATIONS - TRANSFORMATION - MIRROR + OpScale = 3604, // MENU OPERATIONS - TRANSFORMATION - SCALE + OpOffset = 3605, // MENU OPERATIONS - TRANSFORMATION - OFFSET + OpMultiTranslate = 3606, // MENU OPERATIONS - TRANSFORMATION - MULTI-TRANSLATION + OpMultiRotate = 3607, // MENU OPERATIONS - TRANSFORMATION - MULTI-ROTATION + OpReimport = 3608, // POPUP MENU - RELOAD IMPORTED + OpProjection = 3609, // MENU OPERATIONS - TRANSFORMATION - PROJECTION // OperationGUI - OpPartition = 3700, // MENU OPERATION - PARTITION - OpArchimede = 3701, // MENU OPERATION - ARCHIMEDE - OpFillet3d = 3702, // MENU OPERATION - FILLET - OpChamfer = 3703, // MENU OPERATION - CHAMFER - OpShapesOnShape = 3704, // MENU OPERATION - GET SHAPES ON SHAPE - OpFillet2d = 3705, // MENU OPERATION - FILLET 2D - OpFillet1d = 3706, // MENU OPERATION - FILLET 1D - OpClipping = 3707, // MENU OPERATION - CLIPPING RANGE - OpSharedShapes = 3708, // MENU OPERATION - GET SHARED SHAPES + OpPartition = 3700, // MENU OPERATION - PARTITION + OpArchimede = 3701, // MENU OPERATION - ARCHIMEDE + OpFillet3d = 3702, // MENU OPERATION - FILLET + OpChamfer = 3703, // MENU OPERATION - CHAMFER + OpShapesOnShape = 3704, // MENU OPERATION - GET SHAPES ON SHAPE + OpFillet2d = 3705, // MENU OPERATION - FILLET 2D + OpFillet1d = 3706, // MENU OPERATION - FILLET 1D + OpClipping = 3707, // MENU OPERATION - CLIPPING RANGE + OpSharedShapes = 3708, // MENU OPERATION - GET SHARED SHAPES // RepairGUI -----------------//-------------------------------- - OpSewing = 4000, // MENU REPAIR - SEWING - OpSuppressFaces = 4001, // MENU REPAIR - SUPPRESS FACES - OpSuppressHoles = 4002, // MENU REPAIR - SUPPRESS HOLES - OpShapeProcess = 4003, // MENU REPAIR - SHAPE PROCESSING - OpCloseContour = 4004, // MENU REPAIR - CLOSE CONTOUR - OpRemoveIntWires = 4005, // MENU REPAIR - REMOVE INTERNAL WIRES - OpAddPointOnEdge = 4006, // MENU REPAIR - ADD POINT ON EDGE - OpFreeBoundaries = 4007, // MENU MEASURES - FREE BOUNDARIES - OpFreeFaces = 4008, // MENU MEASURES - FREE FACES - OpOrientation = 4009, // MENU REPAIR - CHANGE ORIENTATION - OpGlueFaces = 4010, // MENU REPAIR - GLUE FACES - OpRemoveExtraEdges = 4011, // MENU REPAIR - REMOVE EXTRA EDGES - OpLimitTolerance = 4012, // MENU REPAIR - LIMIT TOLERANCE - OpGlueEdges = 4013, // MENU REPAIR - GLUE EDGES + OpSewing = 4000, // MENU REPAIR - SEWING + OpSuppressFaces = 4001, // MENU REPAIR - SUPPRESS FACES + OpSuppressHoles = 4002, // MENU REPAIR - SUPPRESS HOLES + OpShapeProcess = 4003, // MENU REPAIR - SHAPE PROCESSING + OpCloseContour = 4004, // MENU REPAIR - CLOSE CONTOUR + OpRemoveIntWires = 4005, // MENU REPAIR - REMOVE INTERNAL WIRES + OpAddPointOnEdge = 4006, // MENU REPAIR - ADD POINT ON EDGE + OpFreeBoundaries = 4007, // MENU MEASURES - FREE BOUNDARIES + OpFreeFaces = 4008, // MENU MEASURES - FREE FACES + OpOrientation = 4009, // MENU REPAIR - CHANGE ORIENTATION + OpGlueFaces = 4010, // MENU REPAIR - GLUE FACES + OpRemoveExtraEdges = 4011, // MENU REPAIR - REMOVE EXTRA EDGES + OpLimitTolerance = 4012, // MENU REPAIR - LIMIT TOLERANCE + OpGlueEdges = 4013, // MENU REPAIR - GLUE EDGES // MeasureGUI ----------------//-------------------------------- - OpProperties = 5000, // MENU MEASURES - PROPERTIES - OpCenterMass = 5001, // MENU MEASURES - CENTRE OF MASS - OpInertia = 5002, // MENU MEASURES - INERTIA - OpNormale = 5003, // MENU MEASURES - NORMALE - OpBoundingBox = 5004, // MENU MEASURES - BOUNDING BOX - OpMinDistance = 5005, // MENU MEASURES - MIN DISTANCE - OpAngle = 5006, // MENU MEASURES - ANGLE - OpTolerance = 5007, // MENU MEASURES - TOLERANCE - OpWhatIs = 5008, // MENU MEASURES - WHAT IS - OpCheckShape = 5009, // MENU MEASURES - CHECK - OpCheckCompound = 5010, // MENU MEASURES - CHECK COMPOUND OF BLOCKS - OpPointCoordinates = 5011, // MENU MEASURES - POINT COORDINATES - OpCheckSelfInters = 5012, // MENU MEASURES - CHECK SELF INTERSECTIONS + OpProperties = 5000, // MENU MEASURES - PROPERTIES + OpCenterMass = 5001, // MENU MEASURES - CENTRE OF MASS + OpInertia = 5002, // MENU MEASURES - INERTIA + OpNormale = 5003, // MENU MEASURES - NORMALE + OpBoundingBox = 5004, // MENU MEASURES - BOUNDING BOX + OpMinDistance = 5005, // MENU MEASURES - MIN DISTANCE + OpAngle = 5006, // MENU MEASURES - ANGLE + OpTolerance = 5007, // MENU MEASURES - TOLERANCE + OpWhatIs = 5008, // MENU MEASURES - WHAT IS + OpCheckShape = 5009, // MENU MEASURES - CHECK + OpCheckCompound = 5010, // MENU MEASURES - CHECK COMPOUND OF BLOCKS + OpPointCoordinates = 5011, // MENU MEASURES - POINT COORDINATES + OpCheckSelfInters = 5012, // MENU MEASURES - CHECK SELF INTERSECTIONS // GroupGUI ------------------//-------------------------------- - OpGroupCreate = 6000, // MENU GROUP - CREATE - OpGroupEdit = 6001, // MENU GROUP - EDIT - OpGroupCreatePopup = 6002, // POPUP MENU - CREATE GROUP + OpGroupCreate = 6000, // MENU GROUP - CREATE + OpGroupEdit = 6001, // MENU GROUP - EDIT + OpGroupCreatePopup = 6002, // POPUP MENU - CREATE GROUP // BlocksGUI -----------------//-------------------------------- - OpHexaSolid = 6100, // MENU BLOCKS - HEXAHEDRAL SOLID - OpMultiTransform = 6101, // MENU BLOCKS - MULTI-TRANSFORMATION - OpQuadFace = 6102, // MENU BLOCKS - QUADRANGLE FACE - OpPropagate = 6103, // MENU BLOCKS - PROPAGATE - OpExplodeBlock = 6104, // MENU BLOCKS - EXPLODE ON BLOCKS + OpHexaSolid = 6100, // MENU BLOCKS - HEXAHEDRAL SOLID + OpMultiTransform = 6101, // MENU BLOCKS - MULTI-TRANSFORMATION + OpQuadFace = 6102, // MENU BLOCKS - QUADRANGLE FACE + OpPropagate = 6103, // MENU BLOCKS - PROPAGATE + OpExplodeBlock = 6104, // MENU BLOCKS - EXPLODE ON BLOCKS // AdvancedGUI ---------------//-------------------------------- - OpAdvancedNoOp = 10000, // NO OPERATION (advanced operations base) - OpPipeTShape = 10001, // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE + OpAdvancedNoOp = 10000, // NO OPERATION (advanced operations base) + OpPipeTShape = 10001, // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE // OpPipeTShapeGroups = 10002, // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS //@@ insert new functions before this line @@ do not remove this line @@// }; diff --git a/src/GEOMGUI/Makefile.am b/src/GEOMGUI/Makefile.am index bfd12147f..056df6e05 100644 --- a/src/GEOMGUI/Makefile.am +++ b/src/GEOMGUI/Makefile.am @@ -74,6 +74,7 @@ libGEOM_la_CPPFLAGS = \ $(OPENCV_INCLUDES) \ -I$(srcdir)/../OBJECT \ -I$(srcdir)/../GEOMFiltersSelection \ + -I$(srcdir)/../Material \ -I$(srcdir)/../GEOMClient \ -I$(srcdir)/../GEOMImpl \ -I$(top_builddir)/idl \ @@ -82,6 +83,7 @@ libGEOM_la_CPPFLAGS = \ libGEOM_la_LDFLAGS = \ $(PYTHON_LIBS) \ ../GEOMFiltersSelection/libGEOMFiltersSelection.la \ + ../Material/libMaterial.la \ ../GEOMClient/libGEOMClient.la \ ../OBJECT/libGEOMObject.la \ $(KERNEL_LDFLAGS) -lSalomeLifeCycleCORBA -lSalomeNS -lSalomeDSClient \ diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx index cc95e6831..f1abd61d0 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -349,6 +349,9 @@ bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) case GEOMOp::OpDecrNbIsos: // SHORTCUT - DECREASE NB ISOLINES OnNbIsos( DECR ); break; + case GEOMOp::OpMaterialProperties: // POPUP - MATERIAL PROPERTIES + OnMaterialProperties(); + break; case GEOMOp::OpAutoColor: // POPUP - AUTO COLOR OnAutoColor(); break; diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.h b/src/GEOMToolsGUI/GEOMToolsGUI.h index 12cead468..5706765f0 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.h +++ b/src/GEOMToolsGUI/GEOMToolsGUI.h @@ -75,6 +75,7 @@ private: void OnUnpublishObject(); void OnPublishObject() ; void OnPointMarker(); + void OnMaterialProperties(); // Shortcut commands void OnChangeTransparency( bool ); diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx index 103a4bcfa..5d2005cc0 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI_1.cxx @@ -31,9 +31,11 @@ #include "GEOMToolsGUI_DeflectionDlg.h" #include "GEOMToolsGUI_MarkerDlg.h" #include "GEOMToolsGUI_PublishDlg.h" +#include "GEOMToolsGUI_MaterialPropertiesDlg.h" #include #include +#include #include #include @@ -518,6 +520,7 @@ void GEOMToolsGUI::OnNbIsos( ActionType actionType ) ic->InitCurrent(); if ( ic->MoreCurrent() ) { Handle(GEOM_AISShape) CurObject = Handle(GEOM_AISShape)::DownCast(ic->Current()); + CurObject->restoreIsoNumbers(); Handle(AIS_Drawer) CurDrawer = CurObject->Attributes(); int UIso = CurDrawer->UIsoAspect()->Number(); @@ -557,16 +560,18 @@ void GEOMToolsGUI::OnNbIsos( ActionType actionType ) CurObject = Handle(GEOM_AISShape)::DownCast(ic->Current()); Handle(AIS_Drawer) CurDrawer = CurObject->Attributes(); - + CurDrawer->SetUIsoAspect( new Prs3d_IsoAspect(Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 0.5 , newNbUIso) ); CurDrawer->SetVIsoAspect( new Prs3d_IsoAspect(Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 0.5 , newNbVIso) ); + + CurObject->storeIsoNumbers(); ic->SetLocalAttributes(CurObject, CurDrawer); ic->Redisplay(CurObject); QString anIsos("%1%2%3");anIsos = anIsos.arg(newNbUIso);anIsos = anIsos.arg(DIGIT_SEPARATOR);anIsos = anIsos.arg(newNbVIso); int aMgrId = window->getViewManager()->getGlobalId(); - aStudy->setObjectProperty(aMgrId ,CurObject->getIO()->getEntry(), "Isos", anIsos); + aStudy->setObjectProperty(aMgrId ,CurObject->getIO()->getEntry(), ISOS_PROP, anIsos); } } GeometryGUI::Modified(); @@ -616,8 +621,10 @@ void GEOMToolsGUI::OnNbIsos( ActionType actionType ) int VIso = 0; vtkActor* anAct = aCollection->GetNextActor(); - if (GEOM_Actor* anActor = GEOM_Actor::SafeDownCast(anAct)) + if (GEOM_Actor* anActor = GEOM_Actor::SafeDownCast(anAct)) { + anActor->RestoreIsoNumbers(); anActor->GetNbIsos(UIso,VIso); + } else return; @@ -656,6 +663,7 @@ void GEOMToolsGUI::OnNbIsos( ActionType actionType ) // There are no casting to needed actor. int aIsos[2]={newNbUIso,newNbVIso}; anActor->SetNbIsos(aIsos); + anActor->StoreIsoNumbers(); QString anIsos("%1%2%3");anIsos = anIsos.arg(newNbUIso);anIsos = anIsos.arg(DIGIT_SEPARATOR);anIsos = anIsos.arg(newNbVIso); int aMgrId = window->getViewManager()->getGlobalId(); @@ -847,6 +855,11 @@ void GEOMToolsGUI::OnPointMarker() dlg.exec(); } +void GEOMToolsGUI::OnMaterialProperties() +{ + GEOMToolsGUI_MaterialPropertiesDlg dlg( SUIT_Session::session()->activeApplication()->desktop() ); + dlg.exec(); +} void GEOMToolsGUI::OnUnpublishObject() { SALOME_ListIO selected; diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_DeflectionDlg.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_DeflectionDlg.cxx index 1e4240103..bc9e9ea63 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_DeflectionDlg.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI_DeflectionDlg.cxx @@ -23,6 +23,7 @@ // #include "GEOMToolsGUI_DeflectionDlg.h" #include +#include #include #include diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_MarkerDlg.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_MarkerDlg.cxx index bf70a697f..54131a27f 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_MarkerDlg.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI_MarkerDlg.cxx @@ -22,6 +22,7 @@ #include "GEOMToolsGUI_MarkerDlg.h" #include +#include #include #include diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.cxx new file mode 100644 index 000000000..9a826cce7 --- /dev/null +++ b/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.cxx @@ -0,0 +1,1254 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// 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 : GEOMToolsGUI_MaterialPropertiesDlg.cxx +// Author : Margarita KARPUNINA, Open CASCADE S.A.S. (margarita.karpunina@opencascade.com) + +#include "GEOMToolsGUI_MaterialPropertiesDlg.h" + +#include "Material_Model.h" +#include "Material_ResourceMgr.h" + +#include +#include +#include +#include + +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include + +// OCCT Includes +#include + +// VTK includes +#include +#include + +// QT Includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MARGIN 9 +#define SPACING 6 + +/*! + \class GEOMToolsGUI_MaterialPropertiesDlg + \brief GEOM material properties dialog box class. + + The dialog box lists all GEOM materials available via the application and allows + user to create own materials. +*/ + +/*! + \brief Constructor + \param parent parent widget +*/ +GEOMToolsGUI_MaterialPropertiesDlg::GEOMToolsGUI_MaterialPropertiesDlg( QWidget* parent ) + : QtxDialog( parent, true, true, OK | Close | Apply | Help), + myResMgr( 0 ) +{ + // Set title + setWindowTitle( tr( "MATERIAL_PROPERTIES_TLT" ) ); + + // Set viewer type + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( app ) { + SUIT_ViewWindow* window = app->desktop()->activeWindow(); + if ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() ) + myViewerType = OCC; + else if ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() ) + myViewerType = VTK; + } + + // Create main layout + QVBoxLayout* main = new QVBoxLayout( mainFrame() ); + main->setMargin( 0 ); main->setSpacing( SPACING ); + + // Create main widgets + myBackMaterialCheck = new QCheckBox( tr( "MATERIAL_BACK_CHK" ), this ); + QFrame* fr = new QFrame( this ); + fr->setFrameStyle( QFrame::Box | QFrame::Sunken ); + + main->addWidget( myBackMaterialCheck ); + main->addWidget( fr ); + + // Create editor widgets + myMaterialList = new QListWidget( fr ); + myMaterialTab = new QTabWidget( fr ); + + QHBoxLayout* frLayout = new QHBoxLayout( fr ); + frLayout->setMargin( MARGIN ); frLayout->setSpacing( SPACING ); + frLayout->addWidget( myMaterialList ); + frLayout->addWidget( myMaterialTab ); + frLayout->setStretchFactor( myMaterialList, 1 ); + frLayout->setStretchFactor( myMaterialTab, 2 ); + + // ======================= Create a tab for front material ======================= + QWidget* w1 = new QWidget( myMaterialTab ); + QVBoxLayout* vLayout1 = new QVBoxLayout( w1 ); + + QGridLayout* gLayout1 = new QGridLayout( w1 ); + gLayout1->setMargin( MARGIN ); gLayout1->setSpacing( SPACING ); + + // ----------------- "Ambient" reflection type group box ----------------- + myAmbientGroupF = new QGroupBox( tr( "AMBIENT_GRP" ), w1 ); + myAmbientGroupF->setCheckable(true); + connect( myAmbientGroupF, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) ); + + // Ambient color + QLabel* ambColorLab1 = new QLabel( tr( "COLOR" ), myAmbientGroupF ); + myAmbientColorF = new QtxColorButton( myAmbientGroupF ); + myAmbientColorF->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + connect( myAmbientColorF, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) ); + + // Ambient coefficient + QLabel* ambCoefficientLab1 = new QLabel( tr( "COEFFICIENT" ), myAmbientGroupF ); + myAmbientCoefntF = new QtxDoubleSpinBox( myAmbientGroupF ); + myAmbientCoefntF->setMaximum(1); + myAmbientCoefntF->setSingleStep(0.05); + connect( myAmbientCoefntF, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) ); + + // Ambient group box layout + QGridLayout* ambientLayout1 = new QGridLayout( myAmbientGroupF ); + ambientLayout1->setMargin( MARGIN ); ambientLayout1->setSpacing( SPACING ); + ambientLayout1->addWidget( ambColorLab1, 0, 0 ); + ambientLayout1->addWidget( myAmbientColorF, 0, 1 ); + ambientLayout1->addWidget( ambCoefficientLab1, 1, 0 ); + ambientLayout1->addWidget( myAmbientCoefntF, 1, 1 ); + + // ----------------- "Diffuse" reflection type group box ----------------- + myDiffuseGroupF = new QGroupBox( tr( "DIFFUSE_GRP" ), w1 ); + myDiffuseGroupF->setCheckable(true); + connect( myDiffuseGroupF, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) ); + + // Diffuse color + QLabel* difColorLab1 = new QLabel( tr( "COLOR" ), myDiffuseGroupF ); + myDiffuseColorF = new QtxColorButton( myDiffuseGroupF ); + myDiffuseColorF->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + connect( myDiffuseColorF, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) ); + + // Diffuse coefficient + QLabel* difCoefficientLab1 = new QLabel( tr( "COEFFICIENT" ), myDiffuseGroupF ); + myDiffuseCoefntF = new QtxDoubleSpinBox( myDiffuseGroupF ); + myDiffuseCoefntF->setMaximum(1); + myDiffuseCoefntF->setSingleStep(0.05); + connect( myDiffuseCoefntF, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) ); + + // Diffuse group box layout + QGridLayout* diffuseLayout1 = new QGridLayout( myDiffuseGroupF ); + diffuseLayout1->setMargin( MARGIN ); diffuseLayout1->setSpacing( SPACING ); + diffuseLayout1->addWidget( difColorLab1, 0, 0 ); + diffuseLayout1->addWidget( myDiffuseColorF, 0, 1 ); + diffuseLayout1->addWidget( difCoefficientLab1, 1, 0 ); + diffuseLayout1->addWidget( myDiffuseCoefntF, 1, 1 ); + + // ----------------- "Specular" reflection type group box ----------------- + mySpecularGroupF = new QGroupBox( tr( "SPECULAR_GRP" ), w1 ); + mySpecularGroupF->setCheckable(true); + connect( mySpecularGroupF, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) ); + + // Specular color + QLabel* specColorLab1 = new QLabel( tr( "COLOR" ), mySpecularGroupF ); + mySpecularColorF = new QtxColorButton( mySpecularGroupF ); + mySpecularColorF->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + connect( mySpecularColorF, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) ); + + // Specular coefficient + QLabel* specCoefficientLab1 = new QLabel( tr( "COEFFICIENT" ), mySpecularGroupF ); + mySpecularCoefntF = new QtxDoubleSpinBox( mySpecularGroupF ); + mySpecularCoefntF->setMaximum(1); + mySpecularCoefntF->setSingleStep(0.05); + connect( mySpecularCoefntF, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) ); + + // Specular group box layout + QGridLayout* specularLayout1 = new QGridLayout( mySpecularGroupF ); + specularLayout1->setMargin( MARGIN ); specularLayout1->setSpacing( SPACING ); + specularLayout1->addWidget( specColorLab1, 0, 0 ); + specularLayout1->addWidget( mySpecularColorF, 0, 1 ); + specularLayout1->addWidget( specCoefficientLab1, 1, 0 ); + specularLayout1->addWidget( mySpecularCoefntF, 1, 1 ); + + // ----------------- "Emission" reflection type group box ----------------- + myEmissionGroupF = new QGroupBox( tr( "EMISSION_GRP" ), w1 ); + myEmissionGroupF->setCheckable(true); + connect( myEmissionGroupF, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) ); + + // Emission color + QLabel* emisColorLab1 = new QLabel( tr( "COLOR" ), myEmissionGroupF ); + myEmissionColorF = new QtxColorButton( myEmissionGroupF ); + myEmissionColorF->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + connect( myEmissionColorF, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) ); + + // Emission coefficient + QLabel* emisCoefficientLab1 = new QLabel( tr( "COEFFICIENT" ), myEmissionGroupF ); + myEmissionCoefntF = new QtxDoubleSpinBox( myEmissionGroupF ); + myEmissionCoefntF->setMaximum(1); + myEmissionCoefntF->setSingleStep(0.05); + connect( myEmissionCoefntF, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) ); + + // Emission group box layout + QGridLayout* emissionLayout1 = new QGridLayout( myEmissionGroupF ); + emissionLayout1->setMargin( MARGIN ); emissionLayout1->setSpacing( SPACING ); + emissionLayout1->addWidget( emisColorLab1, 0, 0 ); + emissionLayout1->addWidget( myEmissionColorF, 0, 1 ); + emissionLayout1->addWidget( emisCoefficientLab1, 1, 0 ); + emissionLayout1->addWidget( myEmissionCoefntF, 1, 1 ); + + // Erase emission group in case of VTK viewer + if ( myViewerType == VTK ) + myEmissionGroupF->hide(); + + // Add group boxes to the main grid layout of the frame with material properties + gLayout1->addWidget( myAmbientGroupF, 0, 0 ); + gLayout1->addWidget( myDiffuseGroupF, 0, 1 ); + gLayout1->addWidget( mySpecularGroupF, 1, 0 ); + gLayout1->addWidget( myEmissionGroupF, 1, 1 ); + + // Shininess + QLabel* shininessLab1 = new QLabel( tr( "SHININESS" ), w1 ); + myShininessF = new QtxDoubleSpinBox( w1 ); + myShininessF->setMaximum(1); + myShininessF->setSingleStep(0.05); + connect( myShininessF, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) ); + + // Shininess layout + QHBoxLayout* shLayout1 = new QHBoxLayout( w1 ); + shLayout1->setMargin( MARGIN ); frLayout->setSpacing( SPACING ); + shLayout1->addWidget( shininessLab1 ); + shLayout1->addWidget( myShininessF ); + + // Fill initial vertical layout of the reflection type group box + vLayout1->addLayout( gLayout1 ); + vLayout1->addLayout( shLayout1 ); + vLayout1->addStretch(); + + // ======================= Create a tab for back material ======================= + myMaterialBWidget = new QWidget( myMaterialTab ); + QVBoxLayout* vLayout2 = new QVBoxLayout( myMaterialBWidget ); + + QGridLayout* gLayout2 = new QGridLayout( myMaterialBWidget ); + gLayout2->setMargin( MARGIN ); gLayout2->setSpacing( SPACING ); + + // ----------------- "Ambient" reflection type group box ----------------- + myAmbientGroupB = new QGroupBox( tr( "AMBIENT_GRP" ), myMaterialBWidget ); + myAmbientGroupB->setCheckable(true); + connect( myAmbientGroupB, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) ); + + // Ambient color + QLabel* ambColorLab2 = new QLabel( tr( "COLOR" ), myAmbientGroupB ); + myAmbientColorB = new QtxColorButton( myAmbientGroupB ); + myAmbientColorB->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + connect( myAmbientColorB, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) ); + + // Ambient coefficient + QLabel* ambCoefficientLab2 = new QLabel( tr( "COEFFICIENT" ), myAmbientGroupB ); + myAmbientCoefntB = new QtxDoubleSpinBox( myAmbientGroupB ); + myAmbientCoefntB->setMaximum(1); + myAmbientCoefntB->setSingleStep(0.05); + connect( myAmbientCoefntB, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) ); + + // Ambient group box layout + QGridLayout* ambientLayout2 = new QGridLayout( myAmbientGroupB ); + ambientLayout2->setMargin( MARGIN ); ambientLayout2->setSpacing( SPACING ); + ambientLayout2->addWidget( ambColorLab2, 0, 0 ); + ambientLayout2->addWidget( myAmbientColorB, 0, 1 ); + ambientLayout2->addWidget( ambCoefficientLab2, 1, 0 ); + ambientLayout2->addWidget( myAmbientCoefntB, 1, 1 ); + + // ----------------- "Diffuse" reflection type group box ----------------- + myDiffuseGroupB = new QGroupBox( tr( "DIFFUSE_GRP" ), myMaterialBWidget ); + myDiffuseGroupB->setCheckable(true); + connect( myDiffuseGroupB, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) ); + + // Diffuse color + QLabel* difColorLab2 = new QLabel( tr( "COLOR" ), myDiffuseGroupB ); + myDiffuseColorB = new QtxColorButton( myDiffuseGroupB ); + myDiffuseColorB->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + connect( myDiffuseColorB, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) ); + + // Diffuse coefficient + QLabel* difCoefficientLab2 = new QLabel( tr( "COEFFICIENT" ), myDiffuseGroupB ); + myDiffuseCoefntB = new QtxDoubleSpinBox( myDiffuseGroupB ); + myDiffuseCoefntB->setMaximum(1); + myDiffuseCoefntB->setSingleStep(0.05); + connect( myDiffuseCoefntB, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) ); + + // Diffuse group box layout + QGridLayout* diffuseLayout2 = new QGridLayout( myDiffuseGroupB ); + diffuseLayout2->setMargin( MARGIN ); diffuseLayout2->setSpacing( SPACING ); + diffuseLayout2->addWidget( difColorLab2, 0, 0 ); + diffuseLayout2->addWidget( myDiffuseColorB, 0, 1 ); + diffuseLayout2->addWidget( difCoefficientLab2, 1, 0 ); + diffuseLayout2->addWidget( myDiffuseCoefntB, 1, 1 ); + + // ----------------- "Specular" reflection type group box ----------------- + mySpecularGroupB = new QGroupBox( tr( "SPECULAR_GRP" ), myMaterialBWidget ); + mySpecularGroupB->setCheckable(true); + connect( mySpecularGroupB, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) ); + + // Specular color + QLabel* specColorLab2 = new QLabel( tr( "COLOR" ), mySpecularGroupB ); + mySpecularColorB = new QtxColorButton( mySpecularGroupB ); + mySpecularColorB->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + connect( mySpecularColorB, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) ); + + // Specular coefficient + QLabel* specCoefficientLab2 = new QLabel( tr( "COEFFICIENT" ), mySpecularGroupB ); + mySpecularCoefntB = new QtxDoubleSpinBox( mySpecularGroupB ); + mySpecularCoefntB->setMaximum(1); + mySpecularCoefntB->setSingleStep(0.05); + connect( mySpecularCoefntB, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) ); + + // Specular group box layout + QGridLayout* specularLayout2 = new QGridLayout( mySpecularGroupB ); + specularLayout2->setMargin( MARGIN ); specularLayout2->setSpacing( SPACING ); + specularLayout2->addWidget( specColorLab2, 0, 0 ); + specularLayout2->addWidget( mySpecularColorB, 0, 1 ); + specularLayout2->addWidget( specCoefficientLab2, 1, 0 ); + specularLayout2->addWidget( mySpecularCoefntB, 1, 1 ); + + // ----------------- "Emission" reflection type group box ----------------- + myEmissionGroupB = new QGroupBox( tr( "EMISSION_GRP" ), myMaterialBWidget ); + myEmissionGroupB->setCheckable(true); + connect( myEmissionGroupB, SIGNAL( toggled( bool ) ), this, SLOT( onReflectionTypeToggled( bool ) ) ); + + // Emission color + QLabel* emisColorLab2 = new QLabel( tr( "COLOR" ), myEmissionGroupB ); + myEmissionColorB = new QtxColorButton( myEmissionGroupB ); + myEmissionColorB->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + connect( myEmissionColorB, SIGNAL( changed( QColor ) ), this, SIGNAL( changed() ) ); + + // Emission coefficient + QLabel* emisCoefficientLab2 = new QLabel( tr( "COEFFICIENT" ), myEmissionGroupB ); + myEmissionCoefntB = new QtxDoubleSpinBox( myEmissionGroupB ); + myEmissionCoefntB->setMaximum(1); + myEmissionCoefntB->setSingleStep(0.05); + connect( myEmissionCoefntB, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) ); + + // Emission group box layout + QGridLayout* emissionLayout2 = new QGridLayout( myEmissionGroupB ); + emissionLayout2->setMargin( MARGIN ); emissionLayout2->setSpacing( SPACING ); + emissionLayout2->addWidget( emisColorLab2, 0, 0 ); + emissionLayout2->addWidget( myEmissionColorB, 0, 1 ); + emissionLayout2->addWidget( emisCoefficientLab2, 1, 0 ); + emissionLayout2->addWidget( myEmissionCoefntB, 1, 1 ); + + // Erase emission group in case of VTK viewer + if ( myViewerType == VTK ) + myEmissionGroupB->hide(); + + // Add group boxes to the main grid layout of the frame with material properties + gLayout2->addWidget( myAmbientGroupB, 0, 0 ); + gLayout2->addWidget( myDiffuseGroupB, 0, 1 ); + gLayout2->addWidget( mySpecularGroupB, 1, 0 ); + gLayout2->addWidget( myEmissionGroupB, 1, 1 ); + + // Shininess + QLabel* shininessLab2 = new QLabel( tr( "SHININESS" ), myMaterialBWidget ); + myShininessB = new QtxDoubleSpinBox( myMaterialBWidget ); + myShininessB->setMaximum(1); + myShininessB->setSingleStep(0.05); + connect( myShininessB, SIGNAL( valueChanged( double ) ), this, SIGNAL( materialChanged() ) ); + + // Shininess layout + QHBoxLayout* shLayout2 = new QHBoxLayout( myMaterialBWidget ); + shLayout2->setMargin( MARGIN ); frLayout->setSpacing( SPACING ); + shLayout2->addWidget( shininessLab2 ); + shLayout2->addWidget( myShininessB ); + + // Fill initial vertical layout of the reflection type group box + vLayout2->addLayout( gLayout2 ); + vLayout2->addLayout( shLayout2 ); + vLayout2->addStretch(); + + // Add tabs to material tab widget + myMaterialTab->addTab( w1, tr( "Front material" ) ); + myMaterialTab->addTab( myMaterialBWidget, tr( "Back material" ) ); + + // Initialize dialog box + setFocusProxy( fr ); + setButtonPosition( Right, Close ); + setDialogFlags( AlignOnce ); + myMaterialList->setEditTriggers( QAbstractItemView::EditKeyPressed ); + + // ! RESOURCES + QStringList globalMaterials = resourceMgr()->materials( Material_ResourceMgr::Global ); + QStringList userMaterials = resourceMgr()->materials( Material_ResourceMgr::User ); + + QListWidgetItem* item; + + // Current material + item = new QListWidgetItem( tr( "[ Current ]" ) ); + item->setForeground( QColor( Qt::red ) ); + item->setData( TypeRole, QVariant( Current ) ); + myMaterialList->addItem( item ); + // Default material + item = new QListWidgetItem( tr( "[ Default ]" ) ); + item->setForeground( QColor( Qt::green ) ); + item->setData( TypeRole, QVariant( Default ) ); + myMaterialList->addItem( item ); + // ! RESOURCES + // Global materials + foreach ( QString sname, globalMaterials ) { + item = new QListWidgetItem( sname ); + item->setForeground( QColor( Qt::blue ) ); + item->setData( TypeRole, QVariant( Global ) ); + item->setData( NameRole, QVariant( sname ) ); + myMaterialList->addItem( item ); + } + // ! RESOURCES + // User materials + foreach ( QString sname, userMaterials ) { + item = new QListWidgetItem( sname ); + item->setData( TypeRole, QVariant( User ) ); + item->setData( NameRole, QVariant( sname ) ); + item->setFlags( item->flags() | Qt::ItemIsEditable ); + myMaterialList->addItem( item ); + } + + // Connect signals + connect( myMaterialTab, SIGNAL( currentChanged( int ) ), + this, SLOT( onCurrentTabChanged( int ) ) ); + connect( myBackMaterialCheck, SIGNAL( toggled( bool ) ), + this, SLOT( onBackMaterialChecked( bool ) ) ); + + connect( myMaterialList, SIGNAL( itemSelectionChanged() ), + this, SLOT( onMaterialChanged() ) ); + connect( myMaterialList, SIGNAL( itemChanged( QListWidgetItem* ) ), + this, SLOT( onItemChanged( QListWidgetItem* ) ) ); + connect( myMaterialList, SIGNAL( itemDoubleClicked( QListWidgetItem* ) ), + this, SLOT( onApply() ) ); + + connect( this, SIGNAL( changed() ), this, SIGNAL( materialChanged() ) ); + connect( this, SIGNAL( materialChanged() ), this, SLOT( onChanged() ) ); + + connect( this, SIGNAL( dlgApply() ), this, SLOT( onApply() ) ); + connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) ); + + // Initialize current fornt and back material models of the selected shape + if ( app ) { + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + if ( aSelMgr ) { + SalomeApp_Study* aStudy = dynamic_cast(app->activeStudy()); + if( aStudy ) { + SALOME_ListIO selected; + aSelMgr->selectedObjects( selected ); + + Handle(SALOME_InteractiveObject) FirstIOS = selected.First(); + if ( !FirstIOS.IsNull() ) { + SUIT_ViewWindow* window = app->desktop()->activeWindow(); + int aMgrId = window->getViewManager()->getGlobalId(); + + QString aMaterialF; + QString aMaterialB; + + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + + PropMap aPropMap = aStudy->getObjectPropMap( aMgrId, It.Value()->getEntry() ); + aMaterialF = aPropMap.value(FRONT_MATERIAL_PROP).toString(); + aMaterialB = aPropMap.value(BACK_MATERIAL_PROP).toString(); + + if ( !aMaterialF.isEmpty() ) { + + QStringList aPropsF = aMaterialF.split(DIGIT_SEPARATOR); + + myCurrentModelF = Material_Model::getMaterialModel( aPropsF ); + + if ( !aMaterialB.isEmpty() ) { + QStringList aPropsB = aMaterialB.split(DIGIT_SEPARATOR); + myCurrentModelB = Material_Model::getMaterialModel( aPropsB ); + + myBackMaterialCheck->setChecked( true ); + } + else { + myCurrentModelB = Material_Model::getMaterialModel( aPropsF ); + + myBackMaterialCheck->setChecked( false ); + myMaterialTab->removeTab( 1 ); + } + + break; + } + } + + if ( aMaterialF.isEmpty() ) { + myCurrentModelF = new Material_Model(); + myCurrentModelF->fromResources( SUIT_Session::session()->resourceMgr(), "Geometry" ); + + myCurrentModelB = new Material_Model(); + myCurrentModelB->fromResources( SUIT_Session::session()->resourceMgr(), "Geometry", false ); + } + } + } + } + } + + myMaterialList->setCurrentRow( 0 ); + myMaterialListFId = 0; + myMaterialListBId = 0; + + myIsBTabWasActivated = false; + + myHelpFileName = "material_page.html"; +} + +/*! + \brief Destructor +*/ +GEOMToolsGUI_MaterialPropertiesDlg::~GEOMToolsGUI_MaterialPropertiesDlg() +{ + if ( myCurrentModelF ) + delete myCurrentModelF; + + if ( myCurrentModelB ) + delete myCurrentModelB; +} + +/*! + \brief Called when "OK" button is clicked +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::accept() +{ + onApply(); + QtxDialog::accept(); +} + +/*! + \brief Process key press event + \param e key event +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::keyPressEvent( QKeyEvent* e ) +{ + if ( e->key() == Qt::Key_Delete ) { + QListWidgetItem* item = myMaterialList->currentItem(); + if ( item && item->data( TypeRole ).toInt() == User ) { + if ( QMessageBox::question( this, + tr( "Delete user material" ), + tr( "Remove material %1?" ).arg( item->text() ), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::Yes ) == QMessageBox::Yes ) { + resourceMgr()->remove( item->data( NameRole ).toString() ); + resourceMgr()->save(); + delete item; + } + } + } + QtxDialog::keyPressEvent( e ); +} + +/*! + \brief Get GEOM materials resource manager + \return materials resource manager +*/ +Material_ResourceMgr* GEOMToolsGUI_MaterialPropertiesDlg::resourceMgr() +{ + if ( !myResMgr ) + myResMgr = new Material_ResourceMgr(); + return myResMgr; +} + +/*! + \brief Initialize dialog box fields from material model + \param model material model +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::fromModel( Material_Model* model) +{ + if ( !model ) return; + + bool isReflectionTypeActive; + + if ( isFrontTabActive() ) { // Fill in front material tab + + // Ambient reflection type + isReflectionTypeActive = model->hasAmbientReflection(); + myAmbientGroupF->setChecked( isReflectionTypeActive ); + if ( isReflectionTypeActive ) { + // Load ambient color + myAmbientColorF->setColor( model->color(Material_Model::Ambient) ); + // Load ambient coefficient + myAmbientCoefntF->setValue( model->coefficient(Material_Model::Ambient) ); + } + + // Diffuse reflection type + isReflectionTypeActive = model->hasDiffuseReflection(); + myDiffuseGroupF->setChecked( isReflectionTypeActive ); + if ( isReflectionTypeActive ) { + // Load diffuse color + myDiffuseColorF->setColor( model->color(Material_Model::Diffuse) ); + // Load diffuse coefficient + myDiffuseCoefntF->setValue( model->coefficient(Material_Model::Diffuse) ); + } + + // Specular reflection type + isReflectionTypeActive = model->hasSpecularReflection(); + mySpecularGroupF->setChecked( isReflectionTypeActive ); + if ( isReflectionTypeActive ) { + // Load specular color + mySpecularColorF->setColor( model->color(Material_Model::Specular) ); + // Load specular coefficient + mySpecularCoefntF->setValue( model->coefficient(Material_Model::Specular) ); + } + + // Emission reflection type + isReflectionTypeActive = model->hasEmissionReflection(); + myEmissionGroupF->setChecked( isReflectionTypeActive ); + if ( isReflectionTypeActive ) { + // Load emission color + myEmissionColorF->setColor( model->color(Material_Model::Emission) ); + // Load emission coefficient + myEmissionCoefntF->setValue( model->coefficient(Material_Model::Emission) ); + } + + // Shininess + myShininessF->setValue( model->shininess() ); + + } + else { // Fill in back material tab + + // Ambient reflection type + isReflectionTypeActive = model->hasAmbientReflection(); + myAmbientGroupB->setChecked( isReflectionTypeActive ); + if ( isReflectionTypeActive ) { + // Load ambient color + myAmbientColorB->setColor( model->color(Material_Model::Ambient) ); + // Load ambient coefficient + myAmbientCoefntB->setValue( model->coefficient(Material_Model::Ambient) ); + } + + // Diffuse reflection type + isReflectionTypeActive = model->hasDiffuseReflection(); + myDiffuseGroupB->setChecked( isReflectionTypeActive ); + if ( isReflectionTypeActive ) { + // Load diffuse color + myDiffuseColorB->setColor( model->color(Material_Model::Diffuse) ); + // Load diffuse coefficient + myDiffuseCoefntB->setValue( model->coefficient(Material_Model::Diffuse) ); + } + + // Specular reflection type + isReflectionTypeActive = model->hasSpecularReflection(); + mySpecularGroupB->setChecked( isReflectionTypeActive ); + if ( isReflectionTypeActive ) { + // Load specular color + mySpecularColorB->setColor( model->color(Material_Model::Specular) ); + // Load specular coefficient + mySpecularCoefntB->setValue( model->coefficient(Material_Model::Specular) ); + } + + // Emission reflection type + isReflectionTypeActive = model->hasEmissionReflection(); + myEmissionGroupB->setChecked( isReflectionTypeActive ); + if ( isReflectionTypeActive ) { + // Load emission color + myEmissionColorB->setColor( model->color(Material_Model::Emission) ); + // Load emission coefficient + myEmissionCoefntB->setValue( model->coefficient(Material_Model::Emission) ); + } + + // Shininess + myShininessB->setValue( model->shininess() ); + + } +} + +/*! + \brief Save values from dialog box fields to material model + \param model material model +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::toModel( Material_Model* model ) const +{ + if ( !model ) return; + + if ( isFrontTabActive() ) + toFrontModel( model ); + else + toBackModel( model ); +} + +/*! + \brief Save values from dialog box fields to front material model + \param model front material model to be filled +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::toFrontModel( Material_Model* model ) const +{ + if ( !model ) return; + + // "Ambient" reflection type + if ( myAmbientGroupF->isChecked() ) { + model->setColor( Material_Model::Ambient, myAmbientColorF->color() ); + model->setCoefficient( Material_Model::Ambient, myAmbientCoefntF->value() ); + } + else { + model->removeColor( Material_Model::Ambient ); + model->removeCoefficient( Material_Model::Ambient ); + } + + // "Diffuse" reflection type + if ( myDiffuseGroupF->isChecked() ) { + model->setColor( Material_Model::Diffuse, myDiffuseColorF->color() ); + model->setCoefficient( Material_Model::Diffuse, myDiffuseCoefntF->value() ); + } + else { + model->removeColor( Material_Model::Diffuse ); + model->removeCoefficient( Material_Model::Diffuse ); + } + + // "Specular" reflection type + if ( mySpecularGroupF->isChecked() ) { + model->setColor( Material_Model::Specular, mySpecularColorF->color() ); + model->setCoefficient( Material_Model::Specular, mySpecularCoefntF->value() ); + } + else { + model->removeColor( Material_Model::Specular ); + model->removeCoefficient( Material_Model::Specular ); + } + + // "Emission" reflection type + if ( myEmissionGroupF->isChecked() ) { + model->setColor( Material_Model::Emission, myEmissionColorF->color() ); + model->setCoefficient( Material_Model::Emission, myEmissionCoefntF->value() ); + } + else { + model->removeColor( Material_Model::Emission ); + model->removeCoefficient( Material_Model::Emission ); + } + + // Shininess + model->setShininess( myShininessF->value() ); +} + +/*! + \brief Save values from dialog box fields to back material model + \param model back material model to be filled +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::toBackModel( Material_Model* model ) const +{ + if ( !model ) + return; + + // "Ambient" reflection type + if ( myAmbientGroupB->isChecked() ) { + model->setColor( Material_Model::Ambient, myAmbientColorB->color() ); + model->setCoefficient( Material_Model::Ambient, myAmbientCoefntB->value() ); + } + else { + model->removeColor( Material_Model::Ambient ); + model->removeCoefficient( Material_Model::Ambient ); + } + + // "Diffuse" reflection type + if ( myDiffuseGroupB->isChecked() ) { + model->setColor( Material_Model::Diffuse, myDiffuseColorB->color() ); + model->setCoefficient( Material_Model::Diffuse, myDiffuseCoefntB->value() ); + } + else { + model->removeColor( Material_Model::Diffuse ); + model->removeCoefficient( Material_Model::Diffuse ); + } + + // "Specular" reflection type + if ( mySpecularGroupB->isChecked() ) { + model->setColor( Material_Model::Specular, mySpecularColorB->color() ); + model->setCoefficient( Material_Model::Specular, mySpecularCoefntB->value() ); + } + else { + model->removeColor( Material_Model::Specular ); + model->removeCoefficient( Material_Model::Specular ); + } + + // "Emission" reflection type + if ( myEmissionGroupB->isChecked() ) { + model->setColor( Material_Model::Emission, myEmissionColorB->color() ); + model->setCoefficient( Material_Model::Emission, myEmissionCoefntB->value() ); + } + else { + model->removeColor( Material_Model::Emission ); + model->removeCoefficient( Material_Model::Emission ); + } + + // Shininess + model->setShininess( myShininessB->value() ); +} + +/*! + \brief Find unique name for the material name + \param name material name template + \param item if not 0, used to be ignored when browsing through items list + \param addSuffix if \c true, the integrer suffix is always added to the material name (otherwise + suffix is added only if item name is not unique) + \return new unique material name +*/ +QString GEOMToolsGUI_MaterialPropertiesDlg::findUniqueName( const QString& name, QListWidgetItem* item, bool addSuffix ) +{ + bool found = false; + int idx = 0; + for( int i = 2; i < myMaterialList->count(); i++ ) { + if ( item == myMaterialList->item( i ) ) continue; + QString iname = myMaterialList->item( i )->text(); + if ( iname == name ) { + found = true; + } + else { + iname = iname.mid( name.length() ).trimmed(); + bool ok = false; + int nx = iname.toInt( &ok ); + if ( ok ) idx = qMax( idx, nx ); + } + } + return found || addSuffix ? QString( "%1 %2" ).arg( name ).arg( idx+1 ) : name; +} + +/*! + \brief Check if tab with front material properties is currently active + \return true if front material tab is active +*/ +bool GEOMToolsGUI_MaterialPropertiesDlg::isFrontTabActive() const +{ + return ( myMaterialTab->currentIndex() == 0 ? true : false ); +} + +/*! + \brief Called when "Apply" button is pressed +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::onApply() +{ + // save user materials + resourceMgr()->save(); + + toFrontModel( myCurrentModelF ); + if ( myBackMaterialCheck->isChecked() && myIsBTabWasActivated ) + toBackModel( myCurrentModelB ); + + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) + return; + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + if ( !aSelMgr ) + return; + + SalomeApp_Study* aStudy = dynamic_cast(app->activeStudy()); + + if(!aStudy) + return; + + SALOME_ListIO selected; + aSelMgr->selectedObjects( selected ); + if ( selected.IsEmpty() ) + return; + + Handle(SALOME_InteractiveObject) FirstIOS = selected.First(); + if ( FirstIOS.IsNull() ) + return; + + SUIT_ViewWindow* window = app->desktop()->activeWindow(); + int aMgrId = window->getViewManager()->getGlobalId(); + + // Parse material properties and form a string for persistent purpose + QString aMaterialF = myCurrentModelF->getMaterialProperty(); + QString aMaterialB; + if ( myBackMaterialCheck->isChecked() ) + aMaterialB = myCurrentModelB->getMaterialProperty(); + + if ( myViewerType == VTK ) { + // Get material properties from the current model + /* + vtkProperty* aPropertyF; + if ( !unsetMaterial ) + aPropertyF = myCurrentModelF->getMaterialVTKProperty(); + */ + vtkProperty* aPropertyF = myCurrentModelF->getMaterialVTKProperty(); + vtkProperty* aPropertyB = aPropertyF; + if ( myBackMaterialCheck->isChecked() ) + aPropertyB = myCurrentModelB->getMaterialVTKProperty(); + + SVTK_ViewWindow* vtkVW = dynamic_cast( window ); + if ( !vtkVW ) + return; + SVTK_View* aView = vtkVW->getView(); + + SUIT_OverrideCursor(); + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + + /* + if ( unsetMaterial || aMaterialF.isEmpty() ) + // Unset material for the selected shape + aisShape->UnsetMaterial(); + else + // Set material for the selected shape + */ + aView->SetMaterial( It.Value(), aPropertyF, aPropertyB ); + + // Persistent + aStudy->setObjectProperty( aMgrId, It.Value()->getEntry(), FRONT_MATERIAL_PROP, aMaterialF ); + aStudy->setObjectProperty( aMgrId, It.Value()->getEntry(), BACK_MATERIAL_PROP, aMaterialB ); + } // for... + aView->Repaint(); + GeometryGUI::Modified(); + } // if ( VTK ) + + else if ( myViewerType == OCC ) { + // Get material properties from the current model + /* + Graphic3d_MaterialAspect aMatF; + if ( !unsetMaterial ) + aMatF = myCurrentModelF->getMaterialOCCAspect(); + */ + Graphic3d_MaterialAspect aMatF = myCurrentModelF->getMaterialOCCAspect(); + Graphic3d_MaterialAspect aMatB = aMatF; + if ( myBackMaterialCheck->isChecked() ) + aMatB = myCurrentModelB->getMaterialOCCAspect(); + + Handle(GEOM_AISShape) aisShape; + + SUIT_OverrideCursor(); + OCCViewer_Viewer* vm = dynamic_cast( window->getViewManager()->getViewModel() ); + if ( !vm ) + return; + + GEOMBase* gb = new GEOMBase(); + + Handle(AIS_InteractiveContext) ic = vm->getAISContext(); + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + aisShape = gb->ConvertIOinGEOMAISShape( It.Value(), true ); + if ( !aisShape.IsNull() ) { + + if(!aisShape->HasInteractiveContext()) + aisShape->SetContext(ic); + + /* + if ( unsetMaterial || aMaterialF.isEmpty() ) + // Unset material for the selected shape + aisShape->UnsetMaterial(); + else + */ + if ( myBackMaterialCheck->isChecked() ) { + // 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); + } + else { + // Set the same front and back (is equal to front) materials for the selected shape + aisShape->SetMaterial(aMatF); + } + + if (aisShape->DisplayMode() != AIS_Shaded/*aisShape->DisplayMode() == GEOM_AISShape::ShadingWithEdges*/) + ic->RecomputePrsOnly( aisShape, Standard_False ); + + // Persistent + aStudy->setObjectProperty( aMgrId, It.Value()->getEntry(), FRONT_MATERIAL_PROP, aMaterialF ); + aStudy->setObjectProperty( aMgrId, It.Value()->getEntry(), BACK_MATERIAL_PROP, aMaterialB ); + } + } // for... + ic->UpdateCurrentViewer(); + GeometryGUI::Modified(); + } // if ( OCC ) +} + +/*! + \brief Called when "Help" button is pressed +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::onHelp() +{ + LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication()); + if (app) { + GeometryGUI* aGeomGUI = dynamic_cast( app->module( "Geometry" ) ); + app->onHelpContextModule(aGeomGUI ? app->moduleName(aGeomGUI->moduleName()) : QString(""), myHelpFileName); + } + else { + QString platform; +#ifdef WIN32 + platform = "winapplication"; +#else + platform = "application"; +#endif + SUIT_MessageBox::warning(0, QObject::tr("WRN_WARNING"), + QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(myHelpFileName), + QObject::tr("BUT_OK")); + } +} + +/*! + \brief Called when user check/uncheck "Enable back material" check box + \param theIsChecked the check state of the check box +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::onBackMaterialChecked( bool theIsChecked ) +{ + if ( theIsChecked ) { + // Tab with back material properties is displayed + myMaterialTab->addTab( myMaterialBWidget, tr( "Back material" ) ); + + // Create a current model of back material + if ( !myCurrentModelB ) { + myCurrentModelB = new Material_Model(); + myCurrentModelB->fromResources( SUIT_Session::session()->resourceMgr(), "Geometry", false ); + } + + myMaterialListBId = 0; + } + else { + // Tab with back material properties is hidden + myMaterialTab->removeTab( 1 ); + + // Remove the current model for back material + if ( myCurrentModelB ) { + delete myCurrentModelB; + myCurrentModelB = 0; + } + } +} + +/*! + \brief Called when user activates material tab + \param theIndex the index of the tab which was activated by the user +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::onCurrentTabChanged(int theIndex) +{ + blockSignals( true ); + + // Change selection in the list of materials + if ( isFrontTabActive() ) + myMaterialList->setCurrentRow( myMaterialListFId ); + else if ( myBackMaterialCheck->isChecked() ) + myMaterialList->setCurrentRow( myMaterialListBId ); + + if ( theIndex == 1 ) + myIsBTabWasActivated = true; + + blockSignals( false ); + + onMaterialChanged(); +} + +/*! + \brief Called when user selects any material item in the materials list +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::onMaterialChanged() +{ + blockSignals( true ); + + QListWidgetItem* item = myMaterialList->currentItem(); + int type = item->data( TypeRole ).toInt(); + + Material_Model* model = 0; + + bool isFrontTab = isFrontTabActive(); + + if ( isFrontTab ) + myMaterialListFId = myMaterialList->currentRow(); + else + myMaterialListBId = myMaterialList->currentRow(); + + switch ( type ) { + case Current: + // current material + model = ( isFrontTab ? myCurrentModelF : myCurrentModelB ); + break; + case Default: + // default material + model = new Material_Model(); + model->fromResources( SUIT_Session::session()->resourceMgr(), "Geometry", ( isFrontTab ? true : false ) ); + break; + case Global: + case User: + // global material, user material + model = new Material_Model(); + model->fromResources( resourceMgr(), item->data( NameRole ).toString() ); + break; + default: + break; + } + + fromModel( model ); + if ( type != Current ) + delete model; + + blockSignals( false ); +} + +/*! + \brief Called when any material parameter is changed by the user +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::onChanged() +{ + QListWidgetItem* item = myMaterialList->currentItem(); + int type = item->data( TypeRole ).toInt(); + + bool isFrontTab = isFrontTabActive(); + + // for the current and user schemas do not perform any actions + if ( type == Current ) { + Material_Model model = ( isFrontTab ? *( myCurrentModelF ) : *( myCurrentModelB ) ); + toModel( &model ); + model.save( 0, QString(), isFrontTab ); + blockSignals( true ); + fromModel( &model ); + blockSignals( false ); + } + else if ( type == User ) { + Material_Model model; + toModel( &model ); + QString oldName = item->data( NameRole ).toString(), newName = item->text(); + if ( oldName == newName ) { + model.save( resourceMgr(), oldName, isFrontTab ); + } + else { + resourceMgr()->remove( oldName ); + model.save( resourceMgr(), newName, isFrontTab ); + item->setData( NameRole, newName ); + } + blockSignals( true ); + fromModel( &model ); + blockSignals( false ); + } + else { + // if user tries to change global (or default, or no material) material, + // we create a new user material basing on selected one + QString newName = findUniqueName( tr( "CUSTOM_MATERIAL" ), 0, true ); + item = new QListWidgetItem( newName ); + item->setData( TypeRole, QVariant( User ) ); + item->setData( NameRole, QVariant( newName ) ); + item->setFlags( item->flags() | Qt::ItemIsEditable ); + myMaterialList->addItem( item ); + + Material_Model model; + toModel( &model ); + model.save( resourceMgr(), newName, isFrontTab ); + + myMaterialList->setCurrentItem( item ); + + if ( isFrontTab ) + myMaterialListFId = myMaterialList->currentRow(); + else + myMaterialListBId = myMaterialList->currentRow(); + + } +} + +/*! + \brief Called when user material is renamed by the user +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::onItemChanged( QListWidgetItem* item ) +{ + QString newName = item->text(); + QString uniqueName = findUniqueName( newName, item ); + if ( uniqueName != newName ) { + myMaterialList->blockSignals( true ); + item->setText( uniqueName ); + myMaterialList->blockSignals( false ); + } + onChanged(); +} + +/*! + \brief Called when widget effect is changed +*/ +void GEOMToolsGUI_MaterialPropertiesDlg::onReflectionTypeToggled( bool theIsOn ) +{ + QGroupBox* anObj = (QGroupBox*)sender(); + + // Set an empty values for color and coefficient + // of the checked/unchecked reflection type + QColor c; + + + // Make changes on front material tab + if ( anObj == myAmbientGroupF ) { + myAmbientColorF->setColor( c ); + myAmbientCoefntF->setValue( 0.0 ); + } + else if ( anObj == myDiffuseGroupF ) { + myDiffuseColorF->setColor( c ); + myDiffuseCoefntF->setValue( 0.0 ); + } + else if ( anObj == mySpecularGroupF ) { + mySpecularColorF->setColor( c ); + mySpecularCoefntF->setValue( 0.0 ); + } + else if ( anObj == myEmissionGroupF ) { + myEmissionColorF->setColor( c ); + myEmissionCoefntF->setValue( 0.0 ); + } + + // Make changes on back material tab + if ( anObj == myAmbientGroupB ) { + myAmbientColorB->setColor( c ); + myAmbientCoefntB->setValue( 0.0 ); + } + else if ( anObj == myDiffuseGroupB ) { + myDiffuseColorB->setColor( c ); + myDiffuseCoefntB->setValue( 0.0 ); + } + else if ( anObj == mySpecularGroupB ) { + mySpecularColorB->setColor( c ); + mySpecularCoefntB->setValue( 0.0 ); + } + else if ( anObj == myEmissionGroupB ) { + myEmissionColorB->setColor( c ); + myEmissionCoefntB->setValue( 0.0 ); + } + + emit( changed() ); +} diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.h b/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.h new file mode 100644 index 000000000..77c4b263c --- /dev/null +++ b/src/GEOMToolsGUI/GEOMToolsGUI_MaterialPropertiesDlg.h @@ -0,0 +1,163 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// 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 : GEOMToolsGUI_MaterialPropertiesDlg.h +// Author : Margarita KARPUNINA, Open CASCADE S.A.S. (margarita.karpunina@opencascade.com) +// +#ifndef GEOMTOOLSGUI_MATERIALPROPERTIESDLG_H +#define GEOMTOOLSGUI_MATERIALPROPERTIESDLG_H + +#include "GEOM_ToolsGUI.hxx" + +#include +#include +#include + +class QCheckBox; +class QGroupBox; +class QLabel; +class QListWidget; +class QListWidgetItem; +class QPushButton; +class QSpinBox; +class QTabWidget; + +class QtxColorButton; +class QtxDoubleSpinBox; + +class Material_Model; +class Material_ResourceMgr; + +class GEOMTOOLSGUI_EXPORT GEOMToolsGUI_MaterialPropertiesDlg : public QtxDialog +{ + Q_OBJECT + + enum { Current, Default, Global, User }; + enum { TypeRole = Qt::UserRole + 123, NameRole }; + + //! Enumeration of viewer types + typedef enum { + OCC, //!< OCC viewer + VTK //!< VTK viewer + } ViewerType; + +public: + GEOMToolsGUI_MaterialPropertiesDlg( QWidget* = 0 ); + ~GEOMToolsGUI_MaterialPropertiesDlg(); + + void accept(); + +protected: + void keyPressEvent( QKeyEvent* ); + +private: + Material_ResourceMgr* resourceMgr(); + + void fromModel( Material_Model* ); + void toModel( Material_Model* ) const; + void toFrontModel( Material_Model* ) const; + void toBackModel( Material_Model* ) const; + + QString findUniqueName( const QString&, + QListWidgetItem* = 0, + bool = false ); + + bool isFrontTabActive() const; + +signals: + void materialChanged(); + void changed(); + +private slots: + + void onApply(); + void onHelp(); + + void onBackMaterialChecked( bool ); + void onCurrentTabChanged( int ); + void onMaterialChanged(); + void onChanged(); + void onItemChanged( QListWidgetItem* ); + void onReflectionTypeToggled( bool ); + +private: + + Material_ResourceMgr* myResMgr; + + QCheckBox* myBackMaterialCheck; + + //! Current material model for front material + Material_Model* myCurrentModelF; + + //! Current material model for back material + Material_Model* myCurrentModelB; + + QListWidget* myMaterialList; + int myMaterialListFId; + int myMaterialListBId; + + QTabWidget* myMaterialTab; + QWidget* myMaterialBWidget; + bool myIsBTabWasActivated; + + //! Controls defining front material properties + QGroupBox* myAmbientGroupF; + QtxColorButton* myAmbientColorF; + QtxDoubleSpinBox* myAmbientCoefntF; + + QGroupBox* myDiffuseGroupF; + QtxColorButton* myDiffuseColorF; + QtxDoubleSpinBox* myDiffuseCoefntF; + + QGroupBox* mySpecularGroupF; + QtxColorButton* mySpecularColorF; + QtxDoubleSpinBox* mySpecularCoefntF; + + QGroupBox* myEmissionGroupF; + QtxColorButton* myEmissionColorF; + QtxDoubleSpinBox* myEmissionCoefntF; + + QtxDoubleSpinBox* myShininessF; + + //! Controls defining back material properties + QGroupBox* myAmbientGroupB; + QtxColorButton* myAmbientColorB; + QtxDoubleSpinBox* myAmbientCoefntB; + + QGroupBox* myDiffuseGroupB; + QtxColorButton* myDiffuseColorB; + QtxDoubleSpinBox* myDiffuseCoefntB; + + QGroupBox* mySpecularGroupB; + QtxColorButton* mySpecularColorB; + QtxDoubleSpinBox* mySpecularCoefntB; + + QGroupBox* myEmissionGroupB; + QtxColorButton* myEmissionColorB; + QtxDoubleSpinBox* myEmissionCoefntB; + + QtxDoubleSpinBox* myShininessB; + + QString myHelpFileName; + + ViewerType myViewerType; + +}; + +#endif // GEOMTOOLSGUI_MATERIALPROPERTIESDLG_H diff --git a/src/GEOMToolsGUI/GEOMToolsGUI_TransparencyDlg.cxx b/src/GEOMToolsGUI/GEOMToolsGUI_TransparencyDlg.cxx index 3447f1f97..2de71038a 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI_TransparencyDlg.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI_TransparencyDlg.cxx @@ -28,6 +28,7 @@ #include #include #include +#include #include #include diff --git a/src/GEOMToolsGUI/Makefile.am b/src/GEOMToolsGUI/Makefile.am index 0404e787c..63afb84f2 100644 --- a/src/GEOMToolsGUI/Makefile.am +++ b/src/GEOMToolsGUI/Makefile.am @@ -35,7 +35,8 @@ salomeinclude_HEADERS = \ GEOMToolsGUI_TransparencyDlg.h \ GEOMToolsGUI_DeleteDlg.h \ GEOMToolsGUI_MarkerDlg.h \ - GEOMToolsGUI_PublishDlg.h + GEOMToolsGUI_PublishDlg.h \ + GEOMToolsGUI_MaterialPropertiesDlg.h dist_libGEOMToolsGUI_la_SOURCES = \ GEOMToolsGUI.cxx \ @@ -45,7 +46,8 @@ dist_libGEOMToolsGUI_la_SOURCES = \ GEOMToolsGUI_DeflectionDlg.cxx \ GEOMToolsGUI_DeleteDlg.cxx \ GEOMToolsGUI_MarkerDlg.cxx \ - GEOMToolsGUI_PublishDlg.cxx + GEOMToolsGUI_PublishDlg.cxx \ + GEOMToolsGUI_MaterialPropertiesDlg.cxx MOC_FILES = \ GEOMToolsGUI_TransparencyDlg_moc.cxx \ @@ -53,7 +55,8 @@ MOC_FILES = \ GEOMToolsGUI_DeflectionDlg_moc.cxx \ GEOMToolsGUI_DeleteDlg_moc.cxx \ GEOMToolsGUI_MarkerDlg_moc.cxx \ - GEOMToolsGUI_PublishDlg_moc.cxx + GEOMToolsGUI_PublishDlg_moc.cxx \ + GEOMToolsGUI_MaterialPropertiesDlg_moc.cxx nodist_libGEOMToolsGUI_la_SOURCES = \ $(MOC_FILES) @@ -72,6 +75,7 @@ libGEOMToolsGUI_la_CPPFLAGS = \ $(CORBA_INCLUDES) \ -I$(srcdir)/../OBJECT \ -I$(srcdir)/../GEOMBase \ + -I$(srcdir)/../Material \ -I$(srcdir)/../GEOMGUI \ -I$(srcdir)/../GEOMClient \ -I$(srcdir)/../GEOMImpl \ @@ -79,5 +83,6 @@ libGEOMToolsGUI_la_CPPFLAGS = \ libGEOMToolsGUI_la_LDFLAGS = \ ../GEOMBase/libGEOMBase.la \ + ../Material/libMaterial.la \ ../GEOMGUI/libGEOM.la \ $(GUI_LDFLAGS) -lVTKViewer -lOCCViewer -lsuit -lSalomeApp -lPyConsole diff --git a/src/Makefile.am b/src/Makefile.am index 243974ffa..ad025e3cc 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -32,7 +32,7 @@ if WITH_OPENCV endif if GEOM_ENABLE_GUI - SUBDIRS += OBJECT DlgRef GEOMFiltersSelection GEOMGUI GEOMBase GEOMToolsGUI \ + SUBDIRS += OBJECT DlgRef GEOMFiltersSelection Material GEOMGUI GEOMBase GEOMToolsGUI \ DisplayGUI BasicGUI PrimitiveGUI GenerationGUI EntityGUI BuildGUI \ BooleanGUI TransformationGUI OperationGUI RepairGUI MeasureGUI \ GroupGUI BlocksGUI AdvancedGUI GEOM_SWIG_WITHIHM diff --git a/src/Material/Makefile.am b/src/Material/Makefile.am new file mode 100644 index 000000000..5c1931345 --- /dev/null +++ b/src/Material/Makefile.am @@ -0,0 +1,51 @@ +# Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +# +# 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 : Makefile.am +# Author : Margarita KARPUNINA, Open CASCADE S.A.S. (margarita.karpunina@opencascade.com) +# Package : Material +# +include $(top_srcdir)/adm_local/unix/make_common_starter.am + +# Libraries targets +lib_LTLIBRARIES = libMaterial.la + +# header files +salomeinclude_HEADERS = \ + Material.h \ + Material_Model.h \ + Material_ResourceMgr.h + +dist_libMaterial_la_SOURCES = \ + Material_Model.cxx \ + Material_ResourceMgr.cxx + +# additional information to compile and link file +libMaterial_la_CPPFLAGS = \ + $(QT_INCLUDES) \ + $(VTK_INCLUDES) \ + $(CAS_CPPFLAGS) \ + $(KERNEL_CXXFLAGS) \ + $(GUI_CXXFLAGS) \ + -I$(srcdir)/../OBJECT + +libMaterial_la_LDFLAGS = \ + $(GUI_LDFLAGS) -lVTKViewer -lOCCViewer -lsuit -lSalomeApp + +dist_salomeres_DATA = resources/SalomeMaterial.xml diff --git a/src/Material/Material.h b/src/Material/Material.h new file mode 100644 index 000000000..3f7a39b3a --- /dev/null +++ b/src/Material/Material.h @@ -0,0 +1,36 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// 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 : Material.h +// Author : Margarita KARPUNINA, Open CASCADE S.A.S. +// +#ifndef MATERIAL_H +#define MATERIAL_H + +#if defined WIN32 +# if defined MATERIAL_SALOME_EXPORTS || defined MATERIAL_EXPORTS || defined SalomeMaterial_EXPORTS +# define MATERIAL_SALOME_EXPORT _declspec( dllexport ) +# else +# define MATERIAL_SALOME_EXPORT _declspec( dllimport ) +# endif +#else +# define MATERIAL_SALOME_EXPORT +#endif + +#endif // MATERIAL_H diff --git a/src/Material/Material_Model.cxx b/src/Material/Material_Model.cxx new file mode 100644 index 000000000..e41c1df68 --- /dev/null +++ b/src/Material/Material_Model.cxx @@ -0,0 +1,682 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// 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 : Material_Model.cxx +// Author : Margarita KARPUNINA, Open CASCADE S.A.S. (margarita.karpunina@opencascade.com) +// + +#include "Material_Model.h" +#include "Material_ResourceMgr.h" + +#include + +#include +#include +#include + +// OCCT Includes +#include + +// VTK includes +#include + +/*! + \brief Constructor + + Create new SALOME material model with default properties. +*/ +Material_Model::Material_Model() + : myResourceMgr( 0 ) +{ + myShininess = 0.0; +} + +/*! + \brief Destructor +*/ +Material_Model::~Material_Model() +{ +} + +/*! + \brief Construct material model according to the given list of + material properties + + \param theProps the list of material properties + \return material model object with correspondent properties + \sa getMaterialProperty() +*/ +Material_Model* Material_Model::getMaterialModel( QStringList theProps ) +{ + Material_Model* aModel = new Material_Model(); + + foreach ( QString aProp, theProps ) { + if ( aProp.isNull() ) continue; + + // Set current ambient color + aModel->setColor( aProp, "AmbientColor=", Material_Model::Ambient ); + // Set current ambient coefficient + aModel->setCoefficient( aProp, "AmbientCoefficient=", Material_Model::Ambient ); + + // Set current diffuse color + aModel->setColor( aProp, "DiffuseColor=", Material_Model::Diffuse ); + // Set current diffuse coefficient + aModel->setCoefficient( aProp, "DiffuseCoefficient=", Material_Model::Diffuse ); + + // Set current specular color + aModel->setColor( aProp, "SpecularColor=", Material_Model::Specular ); + // Set current specular coefficient + aModel->setCoefficient( aProp, "SpecularCoefficient=", Material_Model::Specular ); + + // Set current emission color + aModel->setColor( aProp, "EmissionColor=", Material_Model::Emission ); + // Set current emission coefficient + aModel->setCoefficient( aProp, "EmissionCoefficient=", Material_Model::Emission ); + + // Set current shininess + QString aPropName = "Shininess="; + int anId = aProp.indexOf(aPropName); + if ( anId != -1 ) { + bool ok; + double aCoef = aProp.right( aProp.length() - (anId+aPropName.length()) ).toDouble(&ok); + if ( ok ) + aModel->setShininess( aCoef ); + } + } + + return aModel; +} + +/*! + \brief Construct string of material properties for this model object + + \return a string representing a set of material properties + \sa getMaterialModel() +*/ +QString Material_Model::getMaterialProperty() +{ + // Parse material properties of the current model and form a string for persistent purpose + QString aMaterial; + + bool isReflectionTypeActive; + QColor c; + double coef; + + // Ambient reflection + isReflectionTypeActive = hasAmbientReflection(); + if ( isReflectionTypeActive ) { + c = color( Material_Model::Ambient ); + coef = coefficient(Material_Model::Ambient); + // Insert properties into persistent string + aMaterial = "AmbientColor=%1%2AmbientCoefficient=%3"; + aMaterial = aMaterial.arg( Qtx::colorToString(c) ); + aMaterial = aMaterial.arg( DIGIT_SEPARATOR ); + aMaterial = aMaterial.arg( coef ); + } + // Diffuse reflection + isReflectionTypeActive = hasDiffuseReflection(); + if ( isReflectionTypeActive ) { + c = color( Material_Model::Diffuse ); + coef = coefficient(Material_Model::Diffuse); + // Insert properties into persistent string + aMaterial += "%1DiffuseColor=%2%3DiffuseCoefficient=%4"; + aMaterial = aMaterial.arg( DIGIT_SEPARATOR ); + aMaterial = aMaterial.arg( Qtx::colorToString(c) ); + aMaterial = aMaterial.arg( DIGIT_SEPARATOR ); + aMaterial = aMaterial.arg( coef ); + } + // Specular reflection + isReflectionTypeActive = hasSpecularReflection(); + if ( isReflectionTypeActive ) { + c = color( Material_Model::Specular ); + coef = coefficient(Material_Model::Specular); + // Insert properties into persistent string + aMaterial += "%1SpecularColor=%2%3SpecularCoefficient=%4"; + aMaterial = aMaterial.arg( DIGIT_SEPARATOR ); + aMaterial = aMaterial.arg( Qtx::colorToString(c) ); + aMaterial = aMaterial.arg( DIGIT_SEPARATOR ); + aMaterial = aMaterial.arg( coef ); + } + // Emission reflection + isReflectionTypeActive = hasEmissionReflection(); + if ( isReflectionTypeActive ) { + c = color( Material_Model::Emission ); + coef = coefficient(Material_Model::Emission); + // Insert properties into persistent string + aMaterial += "%1EmissionColor=%2%3EmissionCoefficient=%4"; + aMaterial = aMaterial.arg( DIGIT_SEPARATOR ); + aMaterial = aMaterial.arg( Qtx::colorToString(c) ); + aMaterial = aMaterial.arg( DIGIT_SEPARATOR ); + aMaterial = aMaterial.arg( coef ); + } + if ( !aMaterial.isEmpty() ) { + // Shininess + // Insert properties into persistent string + aMaterial += "%1Shininess=%2"; + aMaterial = aMaterial.arg( DIGIT_SEPARATOR ); + aMaterial = aMaterial.arg( shininess() ); + } + + return aMaterial; +} + +/*! + \brief Construct OCCT material aspect object based on the current model + + \return material aspect object with correspondent properties +*/ +Graphic3d_MaterialAspect Material_Model::getMaterialOCCAspect() +{ + // Get material aspect from the current model + Graphic3d_MaterialAspect aMat; + + bool isReflectionTypeActive; + QColor c; + double coef; + + // Ambient reflection + isReflectionTypeActive = hasAmbientReflection(); + if ( isReflectionTypeActive ) { + aMat.SetReflectionModeOn( Graphic3d_TOR_AMBIENT ); + c = color( Material_Model::Ambient ); + aMat.SetAmbientColor( Quantity_Color( c.redF(), c.greenF(), c.blueF(), Quantity_TOC_RGB ) ); + coef = coefficient( Material_Model::Ambient ); + aMat.SetAmbient( coef ); + } + // Diffuse reflection + isReflectionTypeActive = hasDiffuseReflection(); + if ( isReflectionTypeActive ) { + aMat.SetReflectionModeOn( Graphic3d_TOR_DIFFUSE ); + c = color( Material_Model::Diffuse ); + aMat.SetDiffuseColor( Quantity_Color( c.redF(), c.greenF(), c.blueF(), Quantity_TOC_RGB ) ); + coef = coefficient( Material_Model::Diffuse ); + aMat.SetDiffuse( coef ); + } + // Specular reflection + isReflectionTypeActive = hasSpecularReflection(); + if ( isReflectionTypeActive ) { + aMat.SetReflectionModeOn( Graphic3d_TOR_SPECULAR ); + c = color( Material_Model::Specular ); + aMat.SetSpecularColor( Quantity_Color( c.redF(), c.greenF(), c.blueF(), Quantity_TOC_RGB ) ); + coef = coefficient( Material_Model::Specular ); + aMat.SetSpecular( coef ); + } + // Emission reflection + isReflectionTypeActive = hasEmissionReflection(); + if ( isReflectionTypeActive ) { + aMat.SetReflectionModeOn( Graphic3d_TOR_EMISSION ); + c = color( Material_Model::Emission ); + aMat.SetEmissiveColor( Quantity_Color( c.redF(), c.greenF(), c.blueF(), Quantity_TOC_RGB ) ); + coef = coefficient( Material_Model::Emission ); + aMat.SetEmissive( coef ); + } + // Shininess + aMat.SetShininess( shininess() ); + + return aMat; +} + +/*! + \brief Construct VTK property with properties of material based on the current model + + \return VTK property with correspondent material properties +*/ +vtkProperty* Material_Model::getMaterialVTKProperty() +{ + // Get material properties from the current model + vtkProperty* aProperty = vtkProperty::New(); + + bool isReflectionTypeActive; + QColor c; + double coef; + + // Ambient reflection + isReflectionTypeActive = hasAmbientReflection(); + if ( isReflectionTypeActive ) { + c = color( Material_Model::Ambient ); + aProperty->SetAmbientColor( c.redF(), c.greenF(), c.blueF() ); //SalomeApp_Tools::color( c ) + coef = coefficient( Material_Model::Ambient ); + aProperty->SetAmbient( coef ); + } + // Diffuse reflection + isReflectionTypeActive = hasDiffuseReflection(); + if ( isReflectionTypeActive ) { + c = color( Material_Model::Diffuse ); + aProperty->SetDiffuseColor( c.redF(), c.greenF(), c.blueF() ); + coef = coefficient( Material_Model::Diffuse ); + aProperty->SetDiffuse( coef ); + } + // Specular reflection + isReflectionTypeActive = hasSpecularReflection(); + if ( isReflectionTypeActive ) { + c = color( Material_Model::Specular ); + aProperty->SetSpecularColor( c.redF(), c.greenF(), c.blueF() ); + coef = coefficient( Material_Model::Specular ); + aProperty->SetSpecular( coef ); + } + // Shininess + aProperty->SetSpecularPower( shininess()*100.0 ); + + return aProperty; +} + +/*! + \brief Initialize material model with default values +*/ +void Material_Model::initDefaults() +{ + // Set default ambient color + setColor( Ambient, "#333333" ); + // Set default ambient coefficient + setCoefficient( Ambient, 0.3 ); + + // Set default diffuse color + setColor( Diffuse, "#000000" ); + // Set default diffuse coefficient + setCoefficient( Diffuse, 0.65 ); + + // Set default specular color + setColor( Specular, "#ffffff" ); + // Set default specular coefficient + setCoefficient( Specular, 0.0 ); + + // Set default shininess + setShininess( 0.039 ); +} + +/*! + \brief Clear current content of this material model +*/ +void Material_Model::clearModel() +{ + myColors.clear(); + myCoefficients.clear(); + myShininess = 0.0; +} + +/*! + \brief Initialize material model from the resources + + This function can be used to retrieve material properties from the resource file(s). + Note, that paremeters \a theResMgr and \a theResSection are stored by the model to be used + later with save() method. + + \param theResMgr resources manager + \param theResSection resources section name + \sa save() +*/ +void Material_Model::fromResources( QtxResourceMgr* theResMgr, + const QString& theResSection, + bool theIsFront ) +{ + // Clear current content of the model + // before setting properties from resources + clearModel(); + + myResourceMgr = theResMgr; + myResourceSection = theResSection; + + // init from resource manager + if ( !resourceMgr() ) + return; + + if ( theResSection.compare( "Geometry" ) == 0 ) { + if ( theIsFront ) { + myResourceSection = theResMgr->stringValue("Geometry", "front_material", "Gold"); + } + else { + myResourceSection = theResMgr->stringValue("Geometry", "back_material", ""); + if ( myResourceSection.isEmpty() ) + myResourceSection = theResMgr->stringValue("Geometry", "front_material", "Gold"); + } + + myResourceMgr = new Material_ResourceMgr(); + } + + QString section = resourceSection( theIsFront ); + + // If there is no material preference in XML files, + // use the default material hardcoded in material model + if ( section.isEmpty() ) { + initDefaults(); + return; + } + + // Set ambient color + if ( resourceMgr()->hasValue( section, "ambient-color" ) ) { + setColor( Ambient, resourceMgr()->colorValue( section, "ambient-color" ) ); + } + // Set ambient coefficient + if ( resourceMgr()->hasValue( section, "ambient-coefficient" ) ) { + setCoefficient( Ambient, resourceMgr()->doubleValue( section, "ambient-coefficient" ) ); + } + + // Set diffuse color + if ( resourceMgr()->hasValue( section, "diffuse-color" ) ) { + setColor( Diffuse, resourceMgr()->colorValue( section, "diffuse-color" ) ); + } + // Set diffuse coefficient + if ( resourceMgr()->hasValue( section, "diffuse-coefficient" ) ) { + setCoefficient( Diffuse, resourceMgr()->doubleValue( section, "diffuse-coefficient" ) ); + } + + // Set specular color + if ( resourceMgr()->hasValue( section, "specular-color" ) ) { + setColor( Specular, resourceMgr()->colorValue( section, "specular-color" ) ); + } + // Set specular coefficient + if ( resourceMgr()->hasValue( section, "specular-coefficient" ) ) { + setCoefficient( Specular, resourceMgr()->doubleValue( section, "specular-coefficient" ) ); + } + + // Set emission color + if ( resourceMgr()->hasValue( section, "emission-color" ) ) { + setColor( Emission, resourceMgr()->colorValue( section, "emission-color" ) ); + } + // Set emission coefficient + if ( resourceMgr()->hasValue( section, "emission-coefficient" ) ) { + setCoefficient( Emission, resourceMgr()->doubleValue( section, "emission-coefficient" ) ); + } + + // Set shininess + if ( resourceMgr()->hasValue( section, "shininess" ) ) { + setShininess( resourceMgr()->doubleValue( section, "shininess" ) ); + } +} + +/*! + \brief Save material properties to the resource file. + + If paremeters \a theResMgr and \a theResSection are not specified, default ones + (those passed to the fromResources() function) are used instead. + + \param theResMgr resources manager + \param theResSection resources section name + \sa fromResources() +*/ +void Material_Model::save( QtxResourceMgr* theResMgr, + const QString& theResSection, + bool theIsFront ) +{ + if ( !theResMgr ) + theResMgr = resourceMgr(); + if ( !theResMgr ) + return; + + QString section = theResSection.isEmpty() ? resourceSection( theIsFront ) : theResSection; + myResourceSection = section; + + if ( hasAmbientReflection() ) { + // Save ambient color + theResMgr->setValue( section, "ambient-color", color( Ambient ) ); + // Save ambient coefficient + theResMgr->setValue( section, "ambient-coefficient", coefficient( Ambient ) ); + } + else { + // Remove ambient color + theResMgr->remove( section, "ambient-color" ); + // Remove ambient coefficient + theResMgr->remove( section, "ambient-coefficient" ); + } + + if ( hasDiffuseReflection() ) { + // Save diffuse color + theResMgr->setValue( section, "diffuse-color", color( Diffuse ) ); + // Save diffuse coefficient + theResMgr->setValue( section, "diffuse-coefficient", coefficient( Diffuse ) ); + } + else { + // Remove diffuse color + theResMgr->remove( section, "diffuse-color" ); + // Remove diffuse coefficient + theResMgr->remove( section, "diffuse-coefficient" ); + } + + if ( hasSpecularReflection() ) { + // Save specular color + theResMgr->setValue( section, "specular-color", color( Specular ) ); + // Save specular coefficient + theResMgr->setValue( section, "specular-coefficient", coefficient( Specular ) ); + } + else { + // Remove specular color + theResMgr->remove( section, "specular-color" ); + // Remove specular coefficient + theResMgr->remove( section, "specular-coefficient" ); + } + + if ( hasEmissionReflection() ) { + // Save emission color + theResMgr->setValue( section, "emission-color", color( Emission ) ); + // Save emission coefficient + theResMgr->setValue( section, "emission-coefficient", coefficient( Emission ) ); + } + else { + // Remove emission color + theResMgr->remove( section, "emission-color" ); + // Remove emission coefficient + theResMgr->remove( section, "emission-coefficient" ); + } + + // Save shininess + theResMgr->setValue( section, "shininess", shininess() ); +} + +/*! + \brief Get resource manager used by this material model. + + \return pointer to the resource manager passed previously to the fromResources() method + \sa fromResources(), resourceSection() +*/ +QtxResourceMgr* Material_Model::resourceMgr() const +{ + return myResourceMgr; +} + +/*! + \brief Get resources section name + + If section name is empty, default material name from "Geometry" section + is returned ("front_material" or "back_material" is used depending on + the parameter value) + + \param theIsFront the flag indicating that section of front or back material + is required + \return resource section name passed previously to the fromResources() method + \sa fromResources(), resourceMgr() +*/ +QString Material_Model::resourceSection( bool theIsFront ) const +{ + return !myResourceSection.isEmpty() ? myResourceSection : + SUIT_Session::session()->resourceMgr()->stringValue("Geometry", + ( theIsFront ? "front_material" : "back_material" ), + "Gold"); +} + +/*! + \brief Check if ambient reflection type is defined for this material + + \return true if ambient reflection type is defined for this material, + false - otherwise +*/ +bool Material_Model::hasAmbientReflection() +{ + return ( !myColors.isEmpty() && myColors.contains(Ambient) || !myCoefficients.isEmpty() && myCoefficients.contains(Ambient) ); +} + +/*! + \brief Check if diffuse reflection type is defined for this material + + \return true if diffuse reflection type is defined for this material, + false - otherwise +*/ +bool Material_Model::hasDiffuseReflection() +{ + return ( !myColors.isEmpty() && myColors.contains(Diffuse) || !myCoefficients.isEmpty() && myCoefficients.contains(Diffuse) ); +} + +/*! + \brief Check if specular reflection type is defined for this material + + \return true if specular reflection type is defined for this material, + false - otherwise +*/ +bool Material_Model::hasSpecularReflection() +{ + return ( !myColors.isEmpty() && myColors.contains(Specular) || !myCoefficients.isEmpty() && myCoefficients.contains(Specular) ); +} + +/*! + \brief Check if emission reflection type is defined for this material + + \return true if emission reflection type is defined for this material, + false - otherwise +*/ +bool Material_Model::hasEmissionReflection() +{ + return ( !myColors.isEmpty() && myColors.contains(Emission) || !myCoefficients.isEmpty() && myCoefficients.contains(Emission) ); +} + +/*! + \brief Get color value for the given reflection type + \param theReflectionType reflection type + \return a color which should be used by the given reflection type + \sa setColor() +*/ +QColor Material_Model::color( ReflectionType theReflectionType ) const +{ + return myColors[ theReflectionType ]; +} + +/*! + \brief Set color value for the given reflection type + + \param theReflectionType reflection type + \param theColor a color to be used by the given reflection type + \sa color() +*/ +void Material_Model::setColor( ReflectionType theReflectionType, + const QColor& theColor ) +{ + myColors[ theReflectionType ] = theColor; +} + +/*! + \brief Set color of the current material from the given string + \param theProp the considered property + \param theColorName the name of the color property + \param theReflectionType the type of reflection +*/ +void Material_Model::setColor( QString theProp, + QString theColorName, + ReflectionType theReflectionType ) +{ + int anId = theProp.indexOf( theColorName ); + if ( anId != -1 ) { + QColor c; + if ( Qtx::stringToColor( theProp.right( theProp.length() - ( anId + theColorName.length() ) ), c ) ) + setColor( theReflectionType, c ); + } +} + +/*! + \brief Remove color value for the given reflection type + + \param theReflectionType reflection type + \sa color(), setColor() +*/ +void Material_Model::removeColor( ReflectionType theReflectionType ) +{ + myColors.remove( theReflectionType ); +} + +/*! + \brief Get coefficient value for the given reflection type + \param theReflectionType reflection type + \return a coefficient which should be used by the given reflection type + \sa setCoefficient() +*/ +double Material_Model::coefficient( ReflectionType theReflectionType ) const +{ + return myCoefficients[ theReflectionType ]; +} + +/*! + \brief Set coefficient value for the given reflection type + + \param theReflectionType reflection type + \param theCoefficient a coefficient to be used by the given reflection type + \sa coefficient() +*/ +void Material_Model::setCoefficient( ReflectionType theReflectionType, + double theCoefficient ) +{ + myCoefficients[ theReflectionType ] = theCoefficient; +} + +/*! + \brief Set coefficient of the current material from the given string + \param theProp the considered property + \param theCoefName the name of the color property + \param theReflectionType the type of reflection +*/ +void Material_Model::setCoefficient( QString theProp, + QString theCoefName, + ReflectionType theReflectionType ) +{ + int anId = theProp.indexOf( theCoefName ); + if ( anId != -1 ) { + bool ok; + double aCoef = theProp.right( theProp.length() - ( anId + theCoefName.length() ) ).toDouble( &ok ); + if ( ok ) + setCoefficient( theReflectionType, aCoef ); + } +} + +/*! + \brief Remove coefficient value for the given reflection type + + \param theReflectionType reflection type + \sa coefficient(), setCoefficient() +*/ +void Material_Model::removeCoefficient( ReflectionType theReflectionType ) +{ + myCoefficients.remove( theReflectionType ); +} + +/*! + \brief Get shininess value + \return a shininess value of this material + \sa setShininess() +*/ +double Material_Model::shininess() const +{ + return myShininess; +} + +/*! + \brief Set shininess value + + \param theShininess a shininess value of this material + \sa shininess() +*/ +void Material_Model::setShininess( double theShininess) +{ + myShininess = theShininess; +} diff --git a/src/Material/Material_Model.h b/src/Material/Material_Model.h new file mode 100644 index 000000000..8543e7a5c --- /dev/null +++ b/src/Material/Material_Model.h @@ -0,0 +1,108 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// 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 : Material_Model.h +// Author : Margarita KARPUNINA, Open CASCADE S.A.S. (margarita.karpunina@opencascade.com) +// +#ifndef MATERIAL_MODEL_H +#define MATERIAL_MODEL_H + +#include "Material.h" + +#include +#include +#include + +class Graphic3d_MaterialAspect; + +class vtkProperty; + +class QtxResourceMgr; + +class MATERIAL_SALOME_EXPORT Material_Model +{ + +public: + + //! Enumeration of reflection types of material + typedef enum { + Ambient, //!< Ambient + Diffuse, //!< Diffuse + Specular, //!< Specular + Emission //!< Emission + } ReflectionType; + + + Material_Model(); + virtual ~Material_Model(); + + static Material_Model* getMaterialModel( QStringList ); + + QString getMaterialProperty(); + + Graphic3d_MaterialAspect getMaterialOCCAspect(); + vtkProperty* getMaterialVTKProperty(); + + void initDefaults(); + void fromResources( QtxResourceMgr*, const QString& = QString(), bool theIsFront = true ); + void save( QtxResourceMgr* = 0, const QString& = QString(), bool theIsFront = true ); + + QtxResourceMgr* resourceMgr() const; + QString resourceSection( bool theIsFront ) const; + + bool hasAmbientReflection(); + bool hasDiffuseReflection(); + bool hasSpecularReflection(); + bool hasEmissionReflection(); + + QColor color( ReflectionType ) const; + void setColor( ReflectionType, const QColor& ); + void setColor( QString, + QString, + ReflectionType ); + void removeColor( ReflectionType ); + + double coefficient( ReflectionType ) const; + void setCoefficient( ReflectionType, double ); + void setCoefficient( QString, + QString, + ReflectionType ); + void removeCoefficient( ReflectionType ); + + double shininess() const; + void setShininess( double ); + +private: + void clearModel(); + +private: + typedef QMap ColorMap; + typedef QMap CoefficientMap; + + QtxResourceMgr* myResourceMgr; + QString myResourceSection; + + ColorMap myColors; + CoefficientMap myCoefficients; + + double myShininess; + +}; + +#endif // MATERIAL_MODEL_H diff --git a/src/Material/Material_ResourceMgr.cxx b/src/Material/Material_ResourceMgr.cxx new file mode 100644 index 000000000..ccb2cd427 --- /dev/null +++ b/src/Material/Material_ResourceMgr.cxx @@ -0,0 +1,407 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// 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 : Material_ResourceMgr.cxx +// Author : Margarita KARPUNINA, Open CASCADE S.A.S. (margarita.karpunina@opencascade.com) +// +#include "Material_ResourceMgr.h" + +//#include "Qtx.h" // used to print colors of global materials +//#include // used to print colors of global materials + +/*! + \class Material_ResourceMgr + \brief Material properties resources manager. + + This class is used to manage the material properties throughout the application + in the similar way as QtxResourceMgr does it with application preferences. + + Standard material types are stored in the global application settings files + (named as SalomeMaterial.xml). User-defined materials are stored in user's home + directory - in the file .SalomeMaterialrc. + + The Material_ResourceMgr class is used by material properties dialog box + (GEOMToolsGUI_MaterialPropertiesDlg class). +*/ + +/*! + \brief Constructor +*/ +Material_ResourceMgr::Material_ResourceMgr() + : QtxResourceMgr( "SalomeMaterial", "%1Config" ) +{ + if ( dirList().isEmpty() && ::getenv( "GEOM_ROOT_DIR" ) ) + setDirList( QStringList() << Qtx::addSlash( ::getenv( "GEOM_ROOT_DIR" ) ) + "share/salome/resources/geom" ); + setCurrentFormat( "xml" ); + + /* + // Get string equivalent for colors of global materials ----> + QColor c; + QString s; + + // 1. ============= Plastic + std::cout << "---- Plastic:" << std::endl; + // ambient + c.setRgbF(0.2, 0.2, 0.2); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.0, 0.0, 0.0); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(1.0, 1.0, 1.0); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 2. ============= Shiny plastic + std::cout << "---- Shiny plastic:" << std::endl; + // ambient + c.setRgbF(0.2, 0.2, 0.2); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.0, 0.0, 0.0); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(1.0, 1.0, 1.0); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 3. ============= Satin + std::cout << "---- Satin:" << std::endl; + // ambient + c.setRgbF(0.2, 0.2, 0.2); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.0, 0.0, 0.0); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(1.0, 1.0, 1.0); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 4. ============= Metal + std::cout << "---- Metal:" << std::endl; + // diffuse + c.setRgbF(0.0, 0.0, 0.0); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(1.0, 1.0, 1.0); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 5. ============= Brass + std::cout << "---- Brass:" << std::endl; + // ambient + c.setRgbF(0.329412, 0.223529, 0.027451); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.780392, 0.568627, 0.113725); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(0.992157, 0.941176, 0.807843); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 6. ============= Bronze + std::cout << "---- Bronze:" << std::endl; + // ambient + c.setRgbF(0.2125, 0.1275, 0.054); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.714, 0.4284, 0.18144); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(0.393548, 0.271906, 0.166721); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 7. ============= Copper + std::cout << "---- Copper:" << std::endl; + // ambient + c.setRgbF(0.33, 0.26, 0.23); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.50, 0.11, 0.0); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(0.95, 0.73, 0.0); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 8. ============= Gold + std::cout << "---- Gold:" << std::endl; + // ambient + c.setRgbF(1.0, 0.76862745, 0.31764706); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(1.0, 0.69, 0.0); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(1.0, 0.98, 0.78); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 9. ============= Pewter + std::cout << "---- Pewter:" << std::endl; + // ambient + c.setRgbF(0.105882, 0.058824, 0.113725); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.427451, 0.470588, 0.541176); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(0.333333, 0.333333, 0.521569); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 10. ============= Plaster + std::cout << "---- Plaster:" << std::endl; + // ambient + c.setRgbF(0.19225, 0.19225, 0.19225); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.50754, 0.50754, 0.50754); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(0.508273, 0.508273, 0.508273); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 11. ============= Silver + std::cout << "---- Silver:" << std::endl; + // ambient + c.setRgbF(0.19225, 0.19225, 0.19225); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.50754, 0.50754, 0.50754); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(0.508273, 0.508273, 0.508273); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 12. ============= Steel + std::cout << "---- Steel:" << std::endl; + // ambient + c.setRgbF(0.2, 0.2, 0.2); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.0, 0.0, 0.0); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(1.0, 1.0, 1.0); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 13. ============= Stone + std::cout << "---- Stone:" << std::endl; + // ambient + c.setRgbF(1.0, 0.8, 0.62); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(1.0, 0.8, 0.62); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(0.98, 1.0, 0.60); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 14. ============= Chrome + std::cout << "---- Chrome:" << std::endl; + // ambient + c.setRgbF(0.35, 0.35, 0.35); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.4, 0.4, 0.4); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(0.974597, 0.974597, 0.974597); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 15. ============= Neon + std::cout << "---- Neon:" << std::endl; + // ambient + c.setRgbF(1.0, 1.0, 1.0); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(1.0, 1.0, 1.0); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(1.0, 1.0, 1.0); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + // emissive + c.setRgbF(0.0, 1.0, 0.46); + s = Qtx::colorToString( c ); + std::cout << " emissive color: " << s.toStdString().c_str() << std::endl; + + // 16. ============= Aluminium + std::cout << "---- Aluminium:" << std::endl; + // ambient + c.setRgbF(0.30, 0.30, 0.30); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.30, 0.30, 0.30); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(0.70, 0.70, 0.80); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 17. ============= Obsidian + std::cout << "---- Obsidian:" << std::endl; + // ambient + c.setRgbF(0.05375, 0.05, 0.06625); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.18275, 0.17, 0.22525); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(0.332741, 0.328634, 0.346435); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 18. ============= Jade + std::cout << "---- Jade:" << std::endl; + // ambient + c.setRgbF(0.135, 0.2225, 0.1575); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.54, 0.89, 0.63); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(0.316228, 0.316228, 0.316228); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // 19. ============= Default material + std::cout << "---- Default material:" << std::endl; + // ambient + c.setRgbF(0.2, 0.2, 0.2); + s = Qtx::colorToString( c ); + std::cout << " ambient color: " << s.toStdString().c_str() << std::endl; + // diffuse + c.setRgbF(0.0, 0.0, 0.0); + s = Qtx::colorToString( c ); + std::cout << " diffuse color: " << s.toStdString().c_str() << std::endl; + // specular + c.setRgbF(1.0, 1.0, 1.0); + s = Qtx::colorToString( c ); + std::cout << " specular color: " << s.toStdString().c_str() << std::endl; + + // Get string equivalent for colors of global materials <---- + */ +} + +/*! + \brief Destructor +*/ +Material_ResourceMgr::~Material_ResourceMgr() +{ +} + +/*! + \brief Get list of avaiable materials + \param theType material type + \param theSort if \c true (default), returns a list of materials sorted by name + \return list of avaiable materials names +*/ +QStringList Material_ResourceMgr::materials( MaterialType theType, bool theSort ) +{ + QStringList sl; + + WorkingMode m = workingMode(); + + switch ( theType ) { + case Global: + setWorkingMode( IgnoreUserValues ); + sl = sections(); + break; + case User: + { + setWorkingMode( AllowUserValues ); + sl = sections(); + setWorkingMode( IgnoreUserValues ); + QMutableListIterator it( sl ); + while ( it.hasNext() ) { + QString s = it.next(); + if ( hasSection( s ) ) it.remove(); + } + } + break; + case All: + setWorkingMode( AllowUserValues ); + sl = sections(); + break; + default: + break; + } + + setWorkingMode( m ); + + if ( theSort ) + qSort( sl ); + + return sl; +} + +/*! + \brief Get list of materials names for preferences dialog + \return list of materials names +*/ +QStringList Material_ResourceMgr::getPreferenceMaterialsNames() +{ + QStringList aMaterialsList = materials( Material_ResourceMgr::All ); + return aMaterialsList; +} diff --git a/src/Material/Material_ResourceMgr.h b/src/Material/Material_ResourceMgr.h new file mode 100644 index 000000000..a78203320 --- /dev/null +++ b/src/Material/Material_ResourceMgr.h @@ -0,0 +1,49 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// 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 : Material_ResourceMgr.h +// Author : Margarita KARPUNINA, Open CASCADE S.A.S. (margarita.karpunina@opencascade.com) +// +#ifndef MATERIAL_RESOURCEMGR_H +#define MATERIAL_RESOURCEMGR_H + +#include "Material.h" + +#include + +class MATERIAL_SALOME_EXPORT Material_ResourceMgr : public QtxResourceMgr +{ +public: + //! Material type + typedef enum { + Global, //!< Global materials + User, //!< User materials + All //!< All materials + } MaterialType; + + Material_ResourceMgr(); + ~Material_ResourceMgr(); + + QStringList materials( MaterialType = All, bool = true ); + + QStringList getPreferenceMaterialsNames(); + +}; + +#endif // MATERIAL_RESOURCEMGR_H diff --git a/src/Material/resources/SalomeMaterial.xml b/src/Material/resources/SalomeMaterial.xml new file mode 100644 index 000000000..9741ce641 --- /dev/null +++ b/src/Material/resources/SalomeMaterial.xml @@ -0,0 +1,187 @@ + + +
    + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + +
    +
    + + + + + + + +
    +
    diff --git a/src/OBJECT/GEOM_AISShape.cxx b/src/OBJECT/GEOM_AISShape.cxx index 7a945dc23..dfd5bdb24 100644 --- a/src/OBJECT/GEOM_AISShape.cxx +++ b/src/OBJECT/GEOM_AISShape.cxx @@ -45,9 +45,11 @@ #include #include #include +#include #include #include +#include #include #include @@ -130,6 +132,13 @@ GEOM_AISShape::GEOM_AISShape(const TopoDS_Shape& shape, : SALOME_AISShape(shape), myName(aName), myDisplayVectors(false) { myShadingColor = Quantity_Color( Quantity_NOC_GOLDENROD ); + + storeBoundaryColors(); + + myEdgesInShadingColor = Quantity_Color( Quantity_NOC_GOLDENROD ); + + myUIsoNumber = -1; + myVIsoNumber = -1; } void GEOM_AISShape::setIO(const Handle(SALOME_InteractiveObject)& io){ @@ -170,38 +179,19 @@ void GEOM_AISShape::Compute(const Handle(PrsMgr_PresentationManager3d)& aPresent switch (aMode) { case 0://StdSelect_DM_Wireframe: { + restoreIsoNumbers(); + + // Restore wireframe edges colors + restoreBoundaryColors(); + StdPrs_WFDeflectionShape::Add(aPrs,myshape,myDrawer); break; } case 1://StdSelect_DM_Shading: { - myDrawer->ShadingAspect()->Aspect()->SetDistinguishOn(); - - Graphic3d_MaterialAspect aMatAspect; - aMatAspect.SetAmbient( 0.5 ); - aMatAspect.SetDiffuse( 0.5 ); - aMatAspect.SetEmissive( 0.5 ); - aMatAspect.SetShininess(0.5 ); - aMatAspect.SetSpecular( 0.5 ); - - myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(aMatAspect); - myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(Graphic3d_NOM_JADE); - - Graphic3d_MaterialAspect FMat = myDrawer->ShadingAspect()->Aspect()->FrontMaterial(); - Graphic3d_MaterialAspect BMat = myDrawer->ShadingAspect()->Aspect()->BackMaterial(); - FMat.SetTransparency(myTransparency); BMat.SetTransparency(myTransparency); - myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(FMat); - myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(BMat); + restoreIsoNumbers(); - //Handle(Graphic3d_AspectFillArea3d) a4bis = myDrawer->ShadingAspect()->Aspect(); - // P->SetPrimitivesAspect(a4bis); - // G->SetGroupPrimitivesAspect(a4bis); - //a4bis->SetInteriorColor(myShadingColor); - myDrawer->ShadingAspect()->SetColor(myShadingColor); - - // PAL12113: AIS_Shape::Compute() works correctly with shapes containing no faces - //StdPrs_ShadedShape::Add(aPrs,myshape,myDrawer); - AIS_Shape::Compute(aPresentationManager, aPrs, aMode); + shadingMode(aPresentationManager, aPrs, aMode); break; } case 3: //StdSelect_DM_HLR: @@ -211,6 +201,34 @@ void GEOM_AISShape::Compute(const Handle(PrsMgr_PresentationManager3d)& aPresent } } + if ( aMode == ShadingWithEdges ) { + // Temporary store number of iso lines in order to recover its later + // when display mode is achnged to 'Wirefame' or 'Shading'. + // Iso lines are not displayed in 'Shading with edges' mode. + storeIsoNumbers(); + + // Reset number of iso lines to 0 + resetIsoNumbers(); + + //Shaded faces + shadingMode(aPresentationManager, aPrs, AIS_Shaded); + + // Store wireframe edges colors + storeBoundaryColors(); + + // Coloring edges + Handle(Prs3d_LineAspect) anAspect = myDrawer->UnFreeBoundaryAspect(); + anAspect->SetColor( myEdgesInShadingColor ); + myDrawer->SetUnFreeBoundaryAspect( anAspect ); + + anAspect = myDrawer->FreeBoundaryAspect(); + anAspect->SetColor( myEdgesInShadingColor ); + myDrawer->SetFreeBoundaryAspect( anAspect ); + + // Add edges to presentation + StdPrs_WFDeflectionShape::Add(aPrs,myshape,myDrawer); + } + if (isShowVectors()) { const bool isVector = IsKind(STANDARD_TYPE(GEOM_AISVector)); @@ -282,6 +300,11 @@ void GEOM_AISShape::SetShadingColor(const Quantity_Color &aCol) myShadingColor = aCol; } +void GEOM_AISShape::SetEdgesInShadingColor(const Quantity_Color &aCol) +{ + myEdgesInShadingColor = aCol; +} + void GEOM_AISShape::highlightSubShapes(const TColStd_IndexedMapOfInteger& aIndexMap, const Standard_Boolean aHighlight ) { @@ -317,3 +340,92 @@ void GEOM_AISShape::SetDisplayVectors(bool isDisplayed) { myDisplayVectors = isDisplayed; } + +void GEOM_AISShape::shadingMode(const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, + const Handle(Prs3d_Presentation)& aPrs, + const Standard_Integer aMode) +{ + myDrawer->ShadingAspect()->Aspect()->SetDistinguishOn(); + + Graphic3d_MaterialAspect aMatAspect; + if ( !HasMaterial() ) { + aMatAspect.SetAmbient( 0.5 ); + aMatAspect.SetDiffuse( 0.5 ); + aMatAspect.SetEmissive( 0.5 ); + aMatAspect.SetShininess(0.5 ); + aMatAspect.SetSpecular( 0.5 ); + + myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(aMatAspect); + myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(Graphic3d_NOM_JADE); + } + + Graphic3d_MaterialAspect FMat = myDrawer->ShadingAspect()->Aspect()->FrontMaterial(); + Graphic3d_MaterialAspect BMat = myDrawer->ShadingAspect()->Aspect()->BackMaterial(); + FMat.SetTransparency(myTransparency); BMat.SetTransparency(myTransparency); + myDrawer->ShadingAspect()->Aspect()->SetFrontMaterial(FMat); + myDrawer->ShadingAspect()->Aspect()->SetBackMaterial(BMat); + + //Handle(Graphic3d_AspectFillArea3d) a4bis = myDrawer->ShadingAspect()->Aspect(); + // P->SetPrimitivesAspect(a4bis); + // G->SetGroupPrimitivesAspect(a4bis); + //a4bis->SetInteriorColor(myShadingColor); + myDrawer->ShadingAspect()->SetColor(myShadingColor); + + // PAL12113: AIS_Shape::Compute() works correctly with shapes containing no faces + //StdPrs_ShadedShape::Add(aPrs,myshape,myDrawer); + AIS_Shape::Compute(aPresentationManager, aPrs, aMode); +} + +void GEOM_AISShape::storeIsoNumbers() +{ + myUIsoNumber = myDrawer->UIsoAspect()->Number(); + myVIsoNumber = myDrawer->VIsoAspect()->Number(); +} + +void GEOM_AISShape::restoreIsoNumbers() +{ + if ( myUIsoNumber > 0 ) { + // Restore number of U iso lines + Handle(Prs3d_IsoAspect) anAspect = myDrawer->UIsoAspect(); + anAspect->SetNumber( myUIsoNumber ); + myDrawer->SetUIsoAspect( anAspect ); + } + + if ( myVIsoNumber > 0 ) { + // Restore number of V iso lines + Handle(Prs3d_IsoAspect) anAspect = myDrawer->VIsoAspect(); + anAspect->SetNumber( myVIsoNumber ); + myDrawer->SetVIsoAspect( anAspect ); + } +} + +void GEOM_AISShape::resetIsoNumbers() +{ + Handle(Prs3d_IsoAspect) anAspect = myDrawer->UIsoAspect(); + anAspect->SetNumber( 0 ); + myDrawer->SetUIsoAspect( anAspect ); + + anAspect = myDrawer->VIsoAspect(); + anAspect->SetNumber( 0 ); + myDrawer->SetVIsoAspect( anAspect ); +} + +void GEOM_AISShape::storeBoundaryColors() +{ + Aspect_TypeOfLine aLT; + Standard_Real aW; + + myDrawer->FreeBoundaryAspect()->Aspect()->Values( myFreeBoundaryColor, aLT, aW); + myDrawer->UnFreeBoundaryAspect()->Aspect()->Values( myUnFreeBoundaryColor, aLT, aW); +} + +void GEOM_AISShape::restoreBoundaryColors() +{ + Handle(Prs3d_LineAspect) anAspect = myDrawer->FreeBoundaryAspect(); + anAspect->SetColor( myFreeBoundaryColor ); + myDrawer->SetFreeBoundaryAspect( anAspect ); + + anAspect = myDrawer->UnFreeBoundaryAspect(); + anAspect->SetColor( myUnFreeBoundaryColor ); + myDrawer->SetUnFreeBoundaryAspect( anAspect ); +} diff --git a/src/OBJECT/GEOM_AISShape.hxx b/src/OBJECT/GEOM_AISShape.hxx index fb8edfbfa..1626936fb 100644 --- a/src/OBJECT/GEOM_AISShape.hxx +++ b/src/OBJECT/GEOM_AISShape.hxx @@ -57,6 +57,8 @@ #include +#include + class PrsMgr_PresentationManager3d; class Prs3d_Presentation; class SALOME_InteractiveObject; @@ -66,6 +68,14 @@ class GEOM_OBJECT_EXPORT GEOM_AISShape : public SALOME_AISShape { public: + //! Enumeration of display modes + typedef enum { + //WireFrame, //!< the same as AIS_WireFrame + //Shading, //!< the same as AIS_Shaded + ShadingWithEdges = AIS_Shaded+1, //!< shading with edges + TexturedShape = ShadingWithEdges+1 //!< the same as AIS_ExactHLR + } DispMode; + inline void* operator new(size_t,void* anAddress) { return anAddress; @@ -95,6 +105,7 @@ public: void SetTransparency(const Standard_Real aValue); void SetShadingColor(const Quantity_Color &aCol); + void SetEdgesInShadingColor(const Quantity_Color &aCol); void SetDisplayVectors(bool isShow); virtual void Compute(const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, @@ -109,9 +120,28 @@ public: const Handle(Standard_Type)& DynamicType() const; Standard_Boolean IsKind(const Handle(Standard_Type)&) const; + void storeIsoNumbers(); + void restoreIsoNumbers(); + void resetIsoNumbers(); + protected: + void shadingMode(const Handle(PrsMgr_PresentationManager3d)& aPresentationManager, + const Handle(Prs3d_Presentation)& aPrs, + const Standard_Integer aMode); + + void storeBoundaryColors(); + void restoreBoundaryColors(); + Quantity_Color myShadingColor; + Quantity_Color myFreeBoundaryColor; + Quantity_Color myUnFreeBoundaryColor; + + Quantity_Color myEdgesInShadingColor; + + int myUIsoNumber; + int myVIsoNumber; + private: TCollection_AsciiString myName; bool myDisplayVectors; diff --git a/src/OBJECT/GEOM_Actor.cxx b/src/OBJECT/GEOM_Actor.cxx index eeb5f0dc3..3e2d7a1b1 100644 --- a/src/OBJECT/GEOM_Actor.cxx +++ b/src/OBJECT/GEOM_Actor.cxx @@ -37,6 +37,7 @@ #include "GEOM_EdgeSource.h" #include "GEOM_WireframeFace.h" #include "GEOM_ShadingFace.h" +#include "GEOM_PainterPolyDataMapper.h" #include "SVTK_Actor.h" #include @@ -103,11 +104,17 @@ GEOM_Actor::GEOM_Actor(): myHighlightActor(GEOM_DeviceActor::New(),true), myAppendFilter(vtkAppendPolyData::New(),true), - myPolyDataMapper(vtkPolyDataMapper::New(),true), + // Use mapper as an instance of GEOM_PainterPolyDataMapper class + // to prevent drawing of mappers' content (due to an empty definition + // of GEOM_PainterPolyDataMapper::RenderPiece(...)). + // !!! Presentation of GEOM_Actor is drawing only with help of actors + // defined in this class !!! + myPolyDataMapper(GEOM_PainterPolyDataMapper::New(),true), myHighlightProp(vtkProperty::New()), myPreHighlightProp(vtkProperty::New()), - myShadingFaceProp(vtkProperty::New()) + myShadingFaceProp(vtkProperty::New()), + myShadingBackFaceProp(vtkProperty::New()) { #ifdef MYDEBUG MESSAGE (this<< " GEOM_Actor::GEOM_Actor"); @@ -140,13 +147,13 @@ GEOM_Actor::GEOM_Actor(): aProperty->SetPointSize(3); aProperty->SetColor(1, 1, 0); - myAppendFilter->AddInput(myIsolatedEdgeSource->GetOutput()); + myAppendFilter->AddInput(myIsolatedEdgeSource->GetOutput()); myIsolatedEdgeActor->SetInput(myIsolatedEdgeSource->GetOutput(),false); aProperty = myIsolatedEdgeActor->GetProperty(); aProperty->SetRepresentation(VTK_WIREFRAME); aProperty->SetColor(1, 0, 0); - myAppendFilter->AddInput(myOneFaceEdgeSource->GetOutput()); + myAppendFilter->AddInput(myOneFaceEdgeSource->GetOutput()); myOneFaceEdgeActor->SetInput(myOneFaceEdgeSource->GetOutput(),false); aProperty = myOneFaceEdgeActor->GetProperty(); aProperty->SetRepresentation(VTK_WIREFRAME); @@ -166,7 +173,7 @@ GEOM_Actor::GEOM_Actor(): myShadingFaceActor->SetInput(myShadingFaceSource->GetOutput(),true); - myShadingFaceProp->SetRepresentation(VTK_SURFACE); + myShadingFaceProp->SetRepresentation(VTKViewer::Representation::Surface); myShadingFaceProp->SetInterpolationToGouraud(); myShadingFaceProp->SetAmbient(1.0); myShadingFaceProp->SetDiffuse(1.0); @@ -177,10 +184,14 @@ GEOM_Actor::GEOM_Actor(): myShadingFaceActor->SetProperty(myShadingFaceProp.GetPointer()); + StoreBoundaryColors(); + + myNbIsos[0] = -1; + myNbIsos[1] = -1; + // Toggle display mode setDisplayMode(0); // WIRE FRAME SetVectorMode(0); // - } @@ -192,6 +203,7 @@ GEOM_Actor::~GEOM_Actor() myHighlightProp->Delete(); myPreHighlightProp->Delete(); myShadingFaceProp->Delete(); + myShadingBackFaceProp->Delete(); } GEOM_Actor* @@ -282,8 +294,45 @@ GEOM_Actor:: setDisplayMode(int theMode) { #ifdef MYDEBUG - MESSAGE ( "GEOM_Actor::SetDisplayMode = "<GetProperty(); } + +void +GEOM_DeviceActor:: +SetBackfaceProperty(vtkProperty* theProperty) +{ + myActor->SetBackfaceProperty(theProperty); +} + +vtkProperty* +GEOM_DeviceActor:: +GetBackfaceProperty() +{ + return myActor->GetBackfaceProperty(); +} void GEOM_DeviceActor:: diff --git a/src/OBJECT/GEOM_DeviceActor.h b/src/OBJECT/GEOM_DeviceActor.h index 7aad24d7e..721ee1b6f 100755 --- a/src/OBJECT/GEOM_DeviceActor.h +++ b/src/OBJECT/GEOM_DeviceActor.h @@ -52,6 +52,9 @@ public: void SetProperty(vtkProperty* theProperty); vtkProperty* GetProperty(); + + void SetBackfaceProperty(vtkProperty* theProperty); + vtkProperty* GetBackfaceProperty(); void SetVisibility(int theVisibility); int GetVisibility(); diff --git a/src/OBJECT/GEOM_PainterPolyDataMapper.cxx b/src/OBJECT/GEOM_PainterPolyDataMapper.cxx new file mode 100644 index 000000000..c86d93792 --- /dev/null +++ b/src/OBJECT/GEOM_PainterPolyDataMapper.cxx @@ -0,0 +1,24 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// 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 +// + +#include "GEOM_PainterPolyDataMapper.h" + +#include + +vtkStandardNewMacro(GEOM_PainterPolyDataMapper); diff --git a/src/OBJECT/GEOM_PainterPolyDataMapper.h b/src/OBJECT/GEOM_PainterPolyDataMapper.h new file mode 100644 index 000000000..0c738f775 --- /dev/null +++ b/src/OBJECT/GEOM_PainterPolyDataMapper.h @@ -0,0 +1,44 @@ +// Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE +// +// 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 +// + +#ifndef GEOM_PAINTERPOLYDATAMAPPER_H +#define GEOM_PAINTERPOLYDATAMAPPER_H + +#include + +/* + * This class can be used to prevent drawing of mappers' content (due to an + * empty definition of GEOM_PainterPolyDataMapper::RenderPiece(...) method). + * It is used as poly data mapper in GEOM_Actor class. + */ +class GEOM_PainterPolyDataMapper: public vtkPainterPolyDataMapper +{ + public: + vtkTypeMacro(GEOM_PainterPolyDataMapper,vtkPainterPolyDataMapper); + static GEOM_PainterPolyDataMapper* New(); + + virtual void RenderPiece(vtkRenderer *ren, vtkActor *act) {} + + protected: + GEOM_PainterPolyDataMapper() {} + ~GEOM_PainterPolyDataMapper() {} + +}; + +#endif //GEOM_PAINTERPOLYDATAMAPPER_H diff --git a/src/OBJECT/GEOM_SmartPtr.h b/src/OBJECT/GEOM_SmartPtr.h index dae9f45e9..12f981bc7 100755 --- a/src/OBJECT/GEOM_SmartPtr.h +++ b/src/OBJECT/GEOM_SmartPtr.h @@ -41,12 +41,14 @@ public: T* Get() const { return this->GetPointer();} }; - class GEOM_DeviceActor; typedef GEOM_SmartPtr PDeviceActor; class vtkPolyDataMapper; -typedef GEOM_SmartPtr PPolyDataMapper; +typedef GEOM_SmartPtr PPolyDataMapper; + +class GEOM_PainterPolyDataMapper; +typedef GEOM_SmartPtr PPolyGeomPainterDataMapper; #endif //GEOM_SMARTPTR_H diff --git a/src/OBJECT/Makefile.am b/src/OBJECT/Makefile.am index 52c23f398..c83d0ea40 100644 --- a/src/OBJECT/Makefile.am +++ b/src/OBJECT/Makefile.am @@ -42,6 +42,7 @@ salomeinclude_HEADERS = \ GEOM_OBJECT_defs.hxx \ GEOM_OCCReader.h \ GEOM_SmartPtr.h \ + GEOM_PainterPolyDataMapper.h \ GEOM_DeviceActor.h # Libraries targets @@ -55,6 +56,7 @@ dist_libGEOMObject_la_SOURCES = \ GEOM_AISTrihedron.cxx \ GEOM_VTKTrihedron.cxx \ GEOM_AISVector.cxx \ + GEOM_PainterPolyDataMapper.cxx \ GEOM_DeviceActor.cxx