+#include <boost/shared_ptr.hpp>
+
+static SMESHGUI *smeshGUI = 0;
+static CORBA::ORB_var _orb;
+
+using namespace std;
+
+typedef pair<int,string> TKeyOfVisualObj;
+typedef boost::shared_ptr<SMESH_VisualObj> TVisualObjPtr;
+typedef map<TKeyOfVisualObj,TVisualObjPtr> TVisualObjCont;
+static TVisualObjCont VISUALOBJCONT;
+
+
+TVisualObjPtr GetVisualObj(int theStudyId, const char* theEntry){
+ TVisualObjPtr aVisualObj;
+ try{
+ TVisualObjCont::key_type aKey(theStudyId,theEntry);
+ TVisualObjCont::iterator anIter = VISUALOBJCONT.find(aKey);
+ if(anIter != VISUALOBJCONT.end()){
+ aVisualObj = anIter->second;
+ }else{
+ SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument();
+ SALOMEDS::SObject_var aSObj = aStudy->FindObjectID(theEntry);
+ if(!CORBA::is_nil(aSObj)){
+ SALOMEDS::GenericAttribute_var anAttr;
+ if(aSObj->FindAttribute(anAttr,"AttributeIOR")){
+ SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
+ CORBA::String_var aVal = anIOR->Value();
+ CORBA::Object_var anObj =_orb->string_to_object(aVal.in());
+ if(!CORBA::is_nil(anObj)){
+ //Try narrow to SMESH_Mesh interafce
+ SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(anObj);
+ if(!aMesh->_is_nil()){
+ aVisualObj.reset(new SMESH_MeshObj(aMesh));
+ aVisualObj->Update();
+ TVisualObjCont::value_type aValue(aKey,aVisualObj);
+ VISUALOBJCONT.insert(aValue);
+ return aVisualObj;
+ }
+ //Try narrow to SMESH_Group interafce
+ SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group::_narrow(anObj);
+ if(!aGroup->_is_nil()){
+ SALOMEDS::SObject_var aFatherSObj = aSObj->GetFather();
+ if(aFatherSObj->_is_nil()) return aVisualObj;
+ aFatherSObj = aFatherSObj->GetFather();
+ if(aFatherSObj->_is_nil()) return aVisualObj;
+ CORBA::String_var anEntry = aFatherSObj->GetID();
+ TVisualObjPtr aVisObj = GetVisualObj(theStudyId,anEntry.in());
+ if(SMESH_MeshObj* aMeshObj = dynamic_cast<SMESH_MeshObj*>(aVisObj.get())){
+ aVisualObj.reset(new SMESH_GroupObj(aGroup,aMeshObj));
+ aVisualObj->Update();
+ TVisualObjCont::value_type aValue(aKey,aVisualObj);
+ VISUALOBJCONT.insert(aValue);
+ return aVisualObj;
+ }
+ }
+ //Try narrow to SMESH_subMesh interafce
+ SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(anObj);
+ if(!aSubMesh->_is_nil()){
+ SALOMEDS::SObject_var aFatherSObj = aSObj->GetFather();
+ if(aFatherSObj->_is_nil()) return aVisualObj;
+ aFatherSObj = aFatherSObj->GetFather();
+ if(aFatherSObj->_is_nil()) return aVisualObj;
+ CORBA::String_var anEntry = aFatherSObj->GetID();
+ TVisualObjPtr aVisObj = GetVisualObj(theStudyId,anEntry.in());
+ if(SMESH_MeshObj* aMeshObj = dynamic_cast<SMESH_MeshObj*>(aVisObj.get())){
+ aVisualObj.reset(new SMESH_subMeshObj(aSubMesh,aMeshObj));
+ aVisualObj->Update();
+ TVisualObjCont::value_type aValue(aKey,aVisualObj);
+ VISUALOBJCONT.insert(aValue);
+ return aVisualObj;
+ }
+ }
+ }
+ }
+ }
+ }
+ }catch(...){
+ INFOS("GetMeshObj - There is no SMESH_Mesh object for the SALOMEDS::Strudy and Entry!!!");
+ }
+ return aVisualObj;
+}
+
+
+VTKViewer_ViewFrame* GetVtkViewFrame(QAD_StudyFrame* theStudyFrame){
+ QAD_ViewFrame* aViewFrame = theStudyFrame->getRightFrame()->getViewFrame();
+ return dynamic_cast<VTKViewer_ViewFrame*>(aViewFrame);
+}
+
+void UpdateSelectionProp() {
+ QAD_Study* aStudy = SMESHGUI::GetSMESHGUI()->GetActiveStudy();
+ QList<QAD_StudyFrame> aFrameList = aStudy->getStudyFrames();
+
+ QString SCr, SCg, SCb;
+ SCr = QAD_CONFIG->getSetting("SMESH:SettingsSelectColorRed");
+ SCg = QAD_CONFIG->getSetting("SMESH:SettingsSelectColorGreen");
+ SCb = QAD_CONFIG->getSetting("SMESH:SettingsSelectColorBlue");
+ QColor aHiColor = Qt::white;
+ if (!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty())
+ aHiColor = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt());
+
+ SCr = QAD_CONFIG->getSetting("SMESH:SettingsItemSelectColorRed");
+ SCg = QAD_CONFIG->getSetting("SMESH:SettingsItemSelectColorGreen");
+ SCb = QAD_CONFIG->getSetting("SMESH:SettingsItemSelectColorBlue");
+ QColor aSelColor = Qt::yellow;
+ if (!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty())
+ aSelColor = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt());
+ QString SW = QAD_CONFIG->getSetting("SMESH:SettingsItemSelectWidth");
+ if (SW.isEmpty()) SW = "5";
+
+ SCr = QAD_CONFIG->getSetting("SMESH:SettingsPreSelectColorRed");
+ SCg = QAD_CONFIG->getSetting("SMESH:SettingsPreSelectColorGreen");
+ SCb = QAD_CONFIG->getSetting("SMESH:SettingsPreSelectColorBlue");
+ QColor aPreColor = Qt::cyan;
+ if (!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty())
+ aPreColor = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt());
+ QString PW = QAD_CONFIG->getSetting("SMESH:SettingsPreSelectWidth");
+ if (PW.isEmpty()) PW = "5";
+
+ QString SP1 = QAD_CONFIG->getSetting("SMESH:SettingsNodeSelectTol");
+ if (SP1.isEmpty()) SP1 = "0.025";
+ QString SP2 = QAD_CONFIG->getSetting("SMESH:SettingsElementsSelectTol");
+ if (SP2.isEmpty()) SP2 = "0.001";
+
+ for (QAD_StudyFrame* aStudyFrame = aFrameList.first(); aStudyFrame; aStudyFrame = aFrameList.next()) {
+ if (aStudyFrame->getTypeView() == VIEW_VTK) {
+ VTKViewer_ViewFrame* aVtkViewFrame = GetVtkViewFrame(aStudyFrame);
+ if (!aVtkViewFrame) continue;
+ // update VTK viewer properties
+ VTKViewer_RenderWindowInteractor* anInteractor = aVtkViewFrame->getRWInteractor();
+ if (anInteractor) {
+ // mesh element selection
+ anInteractor->SetSelectionProp(aSelColor.red()/255., aSelColor.green()/255.,
+ aSelColor.blue()/255., SW.toInt());
+
+ // tolerances
+ anInteractor->SetSelectionTolerance(SP1.toDouble(), SP2.toDouble());
+
+ // pre-selection
+ VTKViewer_InteractorStyleSALOME* aStyle = anInteractor->GetInteractorStyleSALOME();
+ if (aStyle) {
+ aStyle->setPreselectionProp(aPreColor.red()/255., aPreColor.green()/255.,
+ aPreColor.blue()/255., PW.toInt());
+ }
+ }
+ // update actors
+ vtkRenderer* aRenderer = aVtkViewFrame->getRenderer();
+ vtkActorCollection *aCollection = aRenderer->GetActors();
+ aCollection->InitTraversal();
+ while(vtkActor *anAct = aCollection->GetNextActor()){
+ if(SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)){
+ anActor->SetHighlightColor(aHiColor.red()/255., aHiColor.green()/255.,
+ aHiColor.blue()/255.);
+ anActor->SetPreHighlightColor(aPreColor.red()/255., aPreColor.green()/255.,
+ aPreColor.blue()/255.);
+ }
+ }
+ }
+ }
+}
+
+VTKViewer_ViewFrame* GetCurrentVtkView(){
+ QAD_Study* aStudy = SMESHGUI::GetSMESHGUI()->GetActiveStudy();
+ QAD_StudyFrame *aStudyFrame = aStudy->getActiveStudyFrame();
+ return GetVtkViewFrame(aStudyFrame);
+}
+
+
+SMESH_Actor* FindActorByEntry(QAD_StudyFrame *theStudyFrame,
+ const char* theEntry)
+{
+ if(VTKViewer_ViewFrame* aViewFrame = GetVtkViewFrame(theStudyFrame)){
+ vtkRenderer *aRenderer = aViewFrame->getRenderer();
+ vtkActorCollection *aCollection = aRenderer->GetActors();
+ aCollection->InitTraversal();
+ while(vtkActor *anAct = aCollection->GetNextActor()){
+ if(SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)){
+ if(anActor->hasIO()){
+ Handle(SALOME_InteractiveObject) anIO = anActor->getIO();
+ if(anIO->hasEntry() && strcmp(anIO->getEntry(),theEntry) == 0){
+ return anActor;
+ }
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+
+SMESH_Actor* FindActorByEntry(const char* theEntry){
+ QAD_Study* aStudy = SMESHGUI::GetSMESHGUI()->GetActiveStudy();
+ QAD_StudyFrame *aStudyFrame = aStudy->getActiveStudyFrame();
+ return FindActorByEntry(aStudyFrame,theEntry);
+}
+
+
+SMESH_Actor* CreateActor(SALOMEDS::Study_ptr theStudy,
+ const char* theEntry,
+ int theIsClear = false)
+{
+ SMESH_Actor *anActor = NULL;
+ CORBA::Long anId = theStudy->StudyId();
+ if(TVisualObjPtr aVisualObj = GetVisualObj(anId,theEntry)){
+ SALOMEDS::SObject_var aSObj = theStudy->FindObjectID(theEntry);
+ if(!aSObj->_is_nil()){
+ SALOMEDS::GenericAttribute_var anAttr;
+ if(aSObj->FindAttribute(anAttr,"AttributeName")){
+ SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
+ CORBA::String_var aVal = aName->Value();
+ string aNameVal = aVal.in();
+ SMESH::FilterManager_ptr aFilterMgr = smeshGUI->GetFilterMgr();
+ anActor = SMESH_Actor::New(aVisualObj,aFilterMgr,theEntry,aNameVal.c_str(),theIsClear);
+ }
+ }
+ }
+ return anActor;
+}
+
+
+void DisplayActor(QAD_StudyFrame *theStudyFrame, SMESH_Actor* theActor){
+ if(VTKViewer_ViewFrame* aViewFrame = GetVtkViewFrame(theStudyFrame)){
+ aViewFrame->AddActor(theActor);
+ aViewFrame->Repaint();
+ }
+}
+
+
+void RemoveActor(QAD_StudyFrame *theStudyFrame, SMESH_Actor* theActor){
+ if(VTKViewer_ViewFrame* aViewFrame = GetVtkViewFrame(theStudyFrame)){
+ aViewFrame->RemoveActor(theActor);
+ aViewFrame->Repaint();
+ }
+}
+
+
+void FitAll(){
+ if(VTKViewer_ViewFrame* aViewFrame = GetCurrentVtkView()){
+ aViewFrame->onViewFitAll();
+ aViewFrame->Repaint();
+ }
+}
+
+vtkRenderer* GetCurrentRenderer(){
+ if(VTKViewer_ViewFrame* aViewFrame = GetCurrentVtkView())
+ return aViewFrame->getRenderer();
+ return NULL;
+}
+
+void RepaintCurrentView(){
+ if(VTKViewer_ViewFrame* aViewFrame = GetCurrentVtkView())
+ aViewFrame->Repaint();
+}
+
+
+enum EDisplaing {eDisplayAll, eDisplay, eDisplayOnly, eErase, eEraseAll};
+void UpdateView(QAD_StudyFrame *theStudyFrame, EDisplaing theAction,
+ const char* theEntry = "")
+{
+ if(VTKViewer_ViewFrame* aViewFrame = GetVtkViewFrame(theStudyFrame)){
+ vtkRenderer *aRenderer = aViewFrame->getRenderer();
+ vtkActorCollection *aCollection = aRenderer->GetActors();
+ aCollection->InitTraversal();
+ switch(theAction){
+ case eDisplayAll: {
+ while(vtkActor *anAct = aCollection->GetNextActor()){
+ if(SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)){
+ anActor->SetVisibility(true);
+ }
+ }
+ break;
+ }
+ case eDisplayOnly:
+ case eEraseAll: {
+ while(vtkActor *anAct = aCollection->GetNextActor()){
+ if(SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)){
+ anActor->SetVisibility(false);
+ }
+ }
+ }
+ default: {
+ if(SMESH_Actor *anActor = FindActorByEntry(theStudyFrame,theEntry)){
+ switch(theAction) {
+ case eDisplay:
+ case eDisplayOnly:
+ anActor->SetVisibility(true);
+ break;
+ case eErase:
+ anActor->SetVisibility(false);
+ break;
+ }
+ } else {
+ switch(theAction){
+ case eDisplay:
+ case eDisplayOnly:{
+ QAD_Study* aStudy = theStudyFrame->getStudy();
+ SALOMEDS::Study_var aDocument = aStudy->getStudyDocument();
+ if(anActor = CreateActor(aDocument,theEntry,true)) {
+ DisplayActor(theStudyFrame,anActor);
+ FitAll();
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+void UpdateView(EDisplaing theAction, const char* theEntry = ""){
+ QAD_Study* aStudy = SMESHGUI::GetSMESHGUI()->GetActiveStudy();
+ QAD_StudyFrame *aStudyFrame = aStudy->getActiveStudyFrame();
+ UpdateView(aStudyFrame,theAction,theEntry);
+}
+
+static bool IsReferencedObject( SALOMEDS::SObject_ptr SO )
+{
+ if ( !SO->_is_nil() ) {
+ SALOMEDS::GenericAttribute_var anAttr;
+ if ( SO->FindAttribute( anAttr, "AttributeTarget" ) ) {
+ SALOMEDS::AttributeTarget_var aTarget = SALOMEDS::AttributeTarget::_narrow( anAttr );
+ SALOMEDS::Study::ListOfSObject_var aList = aTarget->Get();
+ if ( aList->length() > 0 ) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+void SetPointRepresentation(bool theIsVisible){
+ if(VTKViewer_ViewFrame* aViewFrame = GetCurrentVtkView()){
+ vtkRenderer *aRenderer = aViewFrame->getRenderer();
+ vtkActorCollection *aCollection = aRenderer->GetActors();
+ aCollection->InitTraversal();
+ while(vtkActor *anAct = aCollection->GetNextActor()){
+ if(SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct)){
+ if(anActor->GetVisibility()){
+ anActor->SetPointRepresentation(theIsVisible);
+ }
+ }
+ }
+ RepaintCurrentView();
+ }
+}