#include "GeometryGUI.h"
#include "GEOM_Displayer.h"
-#include "Material_Model.h"
-
#include <GEOM_Constants.h>
#include <SalomeApp_Application.h>
#include <GEOMImpl_Types.hxx>
#include <GEOM_AISShape.hxx>
-#include <GEOM_VTKPropertyMaterial.hxx>
// OCCT Includes
#include <AIS.hxx>
#include <AIS_InteractiveObject.hxx>
#include <AIS_ListOfInteractive.hxx>
-#include <AIS_GraphicTool.hxx>
-#include <AIS_Drawer.hxx>
-#include <Prs3d_ShadingAspect.hxx>
-#include<Graphic3d_MaterialAspect.hxx>
// VTK Includes
#include <vtkActorCollection.h>
v = compoundOfVertices( idx );
else if ( p == "imported" )
v = isImported( idx );
- else if ( p == "isPhysicalMaterial" )
- v = isPhysicalMaterial(idx);
else
v = LightApp_Selection::parameter( idx, p );
}
}
}
- else if ( viewType == SVTK_Viewer::Type() ) { // assuming VTK
+ else if ( viewType == SVTK_Viewer::Type() ) { // assuming VTK
SVTK_Prs* vtkPrs = dynamic_cast<SVTK_Prs*>( prs );
vtkActorCollection* lst = vtkPrs ? vtkPrs->GetObjects() : 0;
if ( lst ) {
}
return res;
}
-
-bool GEOMGUI_Selection::isPhysicalMaterial( const int idx ) const{
- bool res = false;
-
-#ifdef USE_VISUAL_PROP_MAP
- bool found = false;
- QVariant v = visibleProperty( entry( idx ), MATERIAL_PROP );
- if ( v.canConvert<QString>() ) {
- Material_Model* aModel = Material_Model::getMaterialModel( v.toString().split(DIGIT_SEPARATOR) );
- res = aModel->isPhysical();
- found = true;
- }
-
- if ( !found ) {
-#endif
- SALOME_View* view = GEOM_Displayer::GetActiveView();
- QString viewType = activeViewType();
- if ( view ) {
- SALOME_Prs* prs = view->CreatePrs( entry( idx ).toLatin1().constData() );
- if ( prs ) {
- if ( viewType == OCCViewer_Viewer::Type() ) { // assuming OCC
- SOCC_Prs* occPrs = (SOCC_Prs*) prs;
- AIS_ListOfInteractive lst;
- occPrs->GetObjects( lst );
- if ( lst.Extent() ) {
- Handle(AIS_InteractiveObject) io = lst.First();
- if ( !io.IsNull() ) {
- Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast(io);
- if ( !aSh.IsNull() )
- res =(bool) aSh->Attributes()->ShadingAspect()->
- Material(Aspect_TypeOfFacingModel::Aspect_TOFM_BOTH_SIDE).MaterialType( Graphic3d_MATERIAL_PHYSIC );
- }
- }
- }
- else if ( viewType == SVTK_Viewer::Type() ) { // assuming VTK
- SVTK_Prs* vtkPrs = dynamic_cast<SVTK_Prs*>( prs );
- vtkActorCollection* lst = vtkPrs ? vtkPrs->GetObjects() : 0;
- if ( lst ) {
- lst->InitTraversal();
- vtkActor* actor = lst->GetNextActor();
- if ( actor ) {
- GEOM_Actor* aGeomGActor = GEOM_Actor::SafeDownCast( actor );
- if ( aGeomGActor ) {
- GEOM_VTKPropertyMaterial* mat = GEOM_VTKPropertyMaterial::SafeDownCast(aGeomGActor->GetProperty());
- res = mat->GetPhysical();
- } // if ( salome actor )
- } // if ( actor )
- } // if ( lst == vtkPrs->GetObjects() )
- }
- }
- }
- }
- return res;
-}
#include <GEOM_AISVector.hxx>
#include <GEOM_AISTrihedron.hxx>
#include <GEOM_VTKTrihedron.hxx>
-#include <GEOM_VTKPropertyMaterial.hxx>
#include <Material_Model.h>
anAspect = AISShape->Attributes()->UnFreeBoundaryAspect();
anAspect->SetColor( aColor );
AISShape->Attributes()->SetUnFreeBoundaryAspect( anAspect );
- AISShape->storeBoundaryColors();
+ AISShape->storeBoundaryColors();
// Set free boundaries aspect
col = aResMgr->colorValue( "Geometry", "free_bound_color", QColor( 0, 255, 0 ) );
anAspect->SetColor( aColor );
AISShape->Attributes()->SetWireAspect( anAspect );
- // Set color for edges in shading
- col = aResMgr->colorValue( "Geometry", "edges_in_shading_color", QColor( 255, 255, 0 ) );
- aColor = SalomeApp_Tools::color( col );
- AISShape->SetEdgesInShadingColor( aColor );
+ // Set color for edges in shading
+ col = aResMgr->colorValue( "Geometry", "edges_in_shading_color", QColor( 255, 255, 0 ) );
+ aColor = SalomeApp_Tools::color( col );
+ AISShape->SetEdgesInShadingColor( aColor );
// bug [SALOME platform 0019868]
// Set deviation angle. Default one is 12 degrees (Prs3d_Drawer.cxx:18)
double aDC = 0;
if(useStudy) {
aDC = aPropMap.value(DEFLECTION_COEFF_PROP).toDouble();
- SetWidth(aPropMap.value(EDGE_WIDTH_PROP).toInt());
- SetIsosWidth(aPropMap.value(ISOS_WIDTH_PROP).toInt());
+ SetWidth(aPropMap.value(EDGE_WIDTH_PROP).toInt());
+ SetIsosWidth(aPropMap.value(ISOS_WIDTH_PROP).toInt());
}
else {
aDC = aResMgr->doubleValue("Geometry", "deflection_coeff", 0.001);
// get material properties, set material
Material_Model* aModelF = 0;
+ Material_Model* aModelB = 0;
if ( useStudy ) {
- // Get material property from study and construct material model
- QString aMaterialF = aPropMap.value(MATERIAL_PROP).toString();
+ // 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 material property from study and construct material model
+ // Get front material property from study and construct front material model
aModelF = new Material_Model();
- aModelF->fromResources( aResMgr, "Geometry" );
+ 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 material property
+ // Set front material property
QString aMaterialPropF = aModelF->getMaterialProperty();
- aStudy->setObjectProperty( aMgrId, anIO->getEntry(), MATERIAL_PROP, aMaterialPropF );
+ aStudy->setObjectProperty( aMgrId, anIO->getEntry(), FRONT_MATERIAL_PROP, aMaterialPropF );
- // Get material properties from the model
+ // 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();
- // Set material for the selected shape
- AISShape->SetMaterial(aMatF);
+ // Get back material properties from the model
+ Graphic3d_MaterialAspect aMatB = aModelB->getMaterialOCCAspect();
+
+ // Set front material for the selected shape
+ AISShape->SetCurrentFacingModel(Aspect_TOFM_FRONT_SIDE);
+ AISShape->SetMaterial(aMatF);
+
+ // Set back material for the selected shape
+ AISShape->SetCurrentFacingModel(Aspect_TOFM_BACK_SIDE);
+ AISShape->SetMaterial(aMatB);
+
+ // Return to the default facing mode
+ AISShape->SetCurrentFacingModel(Aspect_TOFM_BOTH_SIDE);
// Release memory
if ( aModelF )
delete aModelF;
+ if ( aModelB )
+ delete aModelB;
if(HasWidth())
aStudy->setObjectProperty( aMgrId, anIO->getEntry(), EDGE_WIDTH_PROP, GetWidth() );
aGeomGActor->setDisplayMode(aDispModeId);
aGeomGActor->SetDeflection(aPropMap.value(DEFLECTION_COEFF_PROP).toDouble());
- // Get material property of the object stored in the study
- QString aMaterialF = aPropMap.value(MATERIAL_PROP).toString();
+ // 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 material model
+ // Create front material model
Material_Model* aModelF = Material_Model::getMaterialModel( aPropsF );
- // Set material properties for the object
+ // Set front material properties for the object
QString aMaterialPropF = aModelF->getMaterialProperty();
- aStudy->setObjectProperty( aMgrId, anEntry, MATERIAL_PROP, aMaterialPropF );
- // Get material properties from the model
- GEOM_VTKPropertyMaterial* aMatPropF = aModelF->getMaterialVTKProperty();
- // Set the same front and back materials for the selected shape
- std::vector<vtkProperty*> aProps;
- aProps.push_back( (vtkProperty*) aMatPropF );
- aGeomGActor->SetMaterial(aProps);
+ 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<vtkProperty*> aProps;
+ aProps.push_back(aMatPropF);
+ aProps.push_back(aMatPropB);
+ aGeomGActor->SetMaterial(aProps);
+
+ // Release memory
+ delete aModelB;
+
+ if(HasWidth())
+ aStudy->setObjectProperty( aMgrId, anEntry, EDGE_WIDTH_PROP, GetWidth() );
+
+ if(HasIsosWidth())
+ aStudy->setObjectProperty( aMgrId, anEntry, ISOS_WIDTH_PROP, GetIsosWidth() );
+
+ }
+ else {
+ // Set the same front and back materials for the selected shape
+ std::vector<vtkProperty*> aProps;
+ aProps.push_back(aMatPropF);
+ aGeomGActor->SetMaterial(aProps);
+ }
+
// Release memory
delete aModelF;
}
}
}
- if ( !aMatPropF->GetPhysical() )
- aGeomGActor->SetColor(aColor[0],aColor[1],aColor[2]);
+ aGeomGActor->SetColor(aColor[0],aColor[1],aColor[2]);
}
else {
SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
if ( aResMgr ) {
- // Create material model
+ // Create front material model
Material_Model aModelF;
- // Get material name from resources
- aModelF.fromResources( aResMgr, "Geometry" );
- // Set material properties for the object
+ // 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, MATERIAL_PROP, aMaterialPropF );
- // Get material properties from the model
- GEOM_VTKPropertyMaterial* aMatPropF = aModelF.getMaterialVTKProperty();
+ 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<vtkProperty*> aProps;
- aProps.push_back( (vtkProperty*) aMatPropF );
- aGeomGActor->SetMaterial(aProps); }
+ std::vector<vtkProperty*> aProps;
+ aProps.push_back(aMatPropF);
+ aProps.push_back(aMatPropB);
+ aGeomGActor->SetMaterial(aProps);
+ }
}
}
aDefaultMap.insert( DEFLECTION_COEFF_PROP , aDC);
//8. Material
+ // Front material
Material_Model aModelF;
- aModelF.fromResources( aResMgr, "Geometry" );
+ aModelF.fromResources( aResMgr, "Geometry", true );
QString aMaterialF = aModelF.getMaterialProperty();
- aDefaultMap.insert( MATERIAL_PROP , aMaterialF );
+ aDefaultMap.insert( FRONT_MATERIAL_PROP , aMaterialF );
- //9. Width of the edges
+ //9. Back material
+ Material_Model aModelB;
+ aModelB.fromResources( aResMgr, "Geometry", false );
+ QString aMaterialB = aModelB.getMaterialProperty();
+ aDefaultMap.insert( BACK_MATERIAL_PROP , aMaterialB );
+
+ //10. Width of the edges
aDefaultMap.insert( EDGE_WIDTH_PROP , aResMgr->integerValue("Geometry", "edge_width", 1));
- //10. Width of iso-lines
+ //11. Width of iso-lines
aDefaultMap.insert( ISOS_WIDTH_PROP , aResMgr->integerValue("Geometry", "isolines_width", 1));
if(viewer_type == SOCC_Viewer::Type()) {
theOrigin.insert(DEFLECTION_COEFF_PROP, theDefault.value(DEFLECTION_COEFF_PROP));
nbInserted++;
}
- if(!theOrigin.contains(MATERIAL_PROP)) {
- theOrigin.insert(MATERIAL_PROP, theDefault.value(MATERIAL_PROP));
+ 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++;
}
nbInserted++;
}
- if(!theOrigin.contains(COLOR_PROP)) {
- theOrigin.insert(COLOR_PROP, theDefault.value(COLOR_PROP));
- nbInserted++;
- }
-
return (nbInserted > 0);
}
if ( pref ) {
Material_ResourceMgr aMatResMgr;
QStringList aPerfMatNames = aMatResMgr.getPreferenceMaterialsNames();
- setPreferenceProperty( pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true )->id(),
+ setPreferenceProperty( pref->rootItem()->findItem( tr( "PREF_FRONT_MATERIAL" ), true )->id(),
+ "strings",
+ aPerfMatNames );
+ setPreferenceProperty( pref->rootItem()->findItem( tr( "PREF_BACK_MATERIAL" ), true )->id(),
"strings",
aPerfMatNames );
}
mgr->setRule( action( GEOMOp::OpVectors ), clientOCCorVTK + " and isVectorsMode", QtxPopupMgr::ToggleRule );
mgr->insert( separator(), -1, -1 ); // -----------
mgr->insert( action( GEOMOp::OpColor ), -1, -1 ); // color
- mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})" + "and isPhysicalMaterial=false", QtxPopupMgr::VisibleRule );
+ mgr->setRule( action( GEOMOp::OpColor ), clientOCCorVTKorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
mgr->insert( action( GEOMOp::OpTransparency ), -1, -1 ); // transparency
mgr->setRule( action( GEOMOp::OpTransparency ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
mgr->insert( action( GEOMOp::OpIsos ), -1, -1 ); // isos
int defl = addPreference( tr( "PREF_DEFLECTION" ), genGroup,
LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" );
- int material = addPreference( tr( "PREF_MATERIAL" ), genGroup,
+ int front_material = addPreference( tr( "PREF_FRONT_MATERIAL" ), genGroup,
LightApp_Preferences::Selector,
- "Geometry", "material" );
+ "Geometry", "front_material" );
+ int back_material = addPreference( tr( "PREF_BACK_MATERIAL" ), genGroup,
+ LightApp_Preferences::Selector,
+ "Geometry", "back_material" );
+
const int nb = 4;
int wd[nb];
int iter=0;
// Set property for default material
Material_ResourceMgr aMatResMgr;
QStringList aPrefMatNames = aMatResMgr.getPreferenceMaterialsNames();
- setPreferenceProperty( material, "strings", aPrefMatNames );
+ setPreferenceProperty( front_material, "strings", aPrefMatNames );
+ setPreferenceProperty( back_material, "strings", aPrefMatNames );
// Set property vertex marker type
QList<QVariant> aMarkerTypeIndicesList;
ip->setParameter(entry, param, aProps.value(MARKER_TYPE_PROP).toString().toLatin1().data());
}
- if(aProps.contains(MATERIAL_PROP)) {
- param = occParam + MATERIAL_PROP;
- ip->setParameter(entry, param, aProps.value(MATERIAL_PROP).toString().toLatin1().data());
+ if(aProps.contains(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());
+
+ }
+
if(aProps.contains( EDGE_WIDTH_PROP )) {
param = occParam + EDGE_WIDTH_PROP;
ip->setParameter(entry, param, aProps.value(EDGE_WIDTH_PROP).toString().toLatin1().data());
aListOfMap[viewIndex].insert( DEFLECTION_COEFF_PROP, val.toDouble());
} else if(paramNameStr == MARKER_TYPE_PROP) {
aListOfMap[viewIndex].insert( MARKER_TYPE_PROP, val);
- } else if(paramNameStr == MATERIAL_PROP) {
- aListOfMap[viewIndex].insert( MATERIAL_PROP, val);
+ } else if(paramNameStr == FRONT_MATERIAL_PROP) {
+ aListOfMap[viewIndex].insert( FRONT_MATERIAL_PROP, val);
+ } else if(paramNameStr == BACK_MATERIAL_PROP) {
+ aListOfMap[viewIndex].insert( BACK_MATERIAL_PROP, val);
} else if(paramNameStr == EDGE_WIDTH_PROP) {
aListOfMap[viewIndex].insert( EDGE_WIDTH_PROP , val);
} else if(paramNameStr == ISOS_WIDTH_PROP) {