-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-
-#include <qstring.h>
-
+// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+// SMESH SMESHGUI : GUI for SMESH component
+// File : SMESHGUI_Utils.cxx
+// Author : Open CASCADE S.A.S.
+// SMESH includes
+//
#include "SMESHGUI_Utils.h"
+#include "SMESHGUI.h"
-#include "QAD_Desktop.h"
+#include <SMDS_MeshNode.hxx>
+#include <SMDS_MeshFace.hxx>
-#include "SALOMEconfig.h"
-#include CORBA_CLIENT_HEADER(GEOM_Gen)
-#include CORBA_CLIENT_HEADER(SALOMEDS_Attributes)
+// SALOME GUI includes
+#include <SUIT_Desktop.h>
+#include <SUIT_Session.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_ResourceMgr.h>
-#include "utilities.h"
+#include <LightApp_SelectionMgr.h>
+#include <SalomeApp_Application.h>
+#include <SalomeApp_Module.h>
+#include <SalomeApp_Study.h>
-using namespace std;
+#include <SALOME_ListIO.hxx>
-namespace SMESH{
+// OCC includes
+#include <gp_XYZ.hxx>
+#include <TColgp_Array1OfXYZ.hxx>
- QAD_Study* GetActiveStudy(){
- if(QAD_Desktop* aDesktop = QAD_Application::getDesktop())
- return aDesktop->getActiveStudy();
- return NULL;
+namespace SMESH
+{
+ SUIT_Desktop*
+ GetDesktop(const CAM_Module* theModule)
+ {
+ return theModule->application()->desktop();
}
+ LightApp_SelectionMgr*
+ GetSelectionMgr(const SalomeApp_Module* theModule)
+ {
+ return theModule->getApp()->selectionMgr();
+ }
- QAD_StudyFrame* GetActiveStudyFrame(){
- if(QAD_Study* aStudy = GetActiveStudy())
- return aStudy->getActiveStudyFrame();
- return NULL;
+ SUIT_ResourceMgr*
+ GetResourceMgr( const SalomeApp_Module* )
+ {
+ return SUIT_Session::session()->resourceMgr();
}
+ _PTR(Study)
+ GetCStudy(const SalomeApp_Study* theStudy)
+ {
+ return theStudy->studyDS();
+ }
- SALOMEDS::Study_var GetActiveStudyDocument(){
- if(QAD_Study* aStudy = GetActiveStudy())
- return aStudy->getStudyDocument();
- return SALOMEDS::Study::_nil();
+ CORBA::Object_var
+ DataOwnerToObject(const LightApp_DataOwnerPtr& theOwner)
+ {
+ CORBA::Object_var anObj;
+ if(theOwner){
+ const Handle(SALOME_InteractiveObject)& anIO = theOwner->IO();
+ if(!anIO.IsNull()){
+ if(anIO->hasEntry()){
+ _PTR(Study) aStudy = GetActiveStudyDocument();
+ _PTR(SObject) aSObj = aStudy->FindObjectID(anIO->getEntry());
+ anObj = SObjectToObject(aSObj,aStudy);
+ }
+ }
+ }
+ return anObj;
}
+ SUIT_Study* GetActiveStudy()
+ {
+ SUIT_Application* app = SUIT_Session::session()->activeApplication();
+ if (app)
+ return app->activeStudy();
+ else
+ return NULL;
+ }
- SALOMEDS::SObject_var FindSObject(CORBA::Object_ptr theObject){
- if(!CORBA::is_nil(theObject)){
- SALOMEDS::Study_var aStudy = GetActiveStudyDocument();
- CORBA::String_var anIOR = aStudy->ConvertObjectToIOR(theObject);
- if(strcmp(anIOR.in(),"") != 0)
- return aStudy->FindObjectIOR(anIOR);
- }
- return SALOMEDS::SObject::_nil();
+ SUIT_ViewWindow* GetActiveWindow()
+ {
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>
+ (SUIT_Session::session()->activeApplication());
+ if (app && app->desktop() )
+ return app->desktop()->activeWindow();
+ else
+ return NULL;
}
+ _PTR(Study) GetActiveStudyDocument()
+ {
+ SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(GetActiveStudy());
+ if (aStudy)
+ return aStudy->studyDS();
+ else
+ return _PTR(Study)();
+ }
+
+ _PTR(SObject) FindSObject (CORBA::Object_ptr theObject)
+ {
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>
+ (SUIT_Session::session()->activeApplication());
+ if (app && !CORBA::is_nil(theObject)) {
+ if(_PTR(Study) aStudy = GetActiveStudyDocument()){
+ CORBA::String_var anIOR = app->orb()->object_to_string(theObject);
+ if (strcmp(anIOR.in(), "") != 0)
+ return aStudy->FindObjectIOR(anIOR.in());
+ }
+ }
+ return _PTR(SObject)();
+ }
- void SetName(SALOMEDS::SObject_ptr theSObject, const char* theName){
- using namespace SALOMEDS;
- Study_var aStudy = GetActiveStudyDocument();
- if(aStudy->GetProperties()->IsLocked())
+ void SetName (_PTR(SObject) theSObject, const QString& theName)
+ {
+ _PTR(Study) aStudy = GetActiveStudyDocument();
+ if (aStudy->GetProperties()->IsLocked())
return;
- StudyBuilder_var aBuilder = aStudy->NewBuilder();
- GenericAttribute_var anAttr = aBuilder->FindOrCreateAttribute(theSObject,"AttributeName");
- AttributeName_var aName = AttributeName::_narrow(anAttr);
- if(!aName->_is_nil())
- aName->SetValue(theName);
+ SMESHGUI::GetSMESHGen()->SetName(theSObject->GetIOR().c_str(), theName.toLatin1().data());
}
- void SetValue(SALOMEDS::SObject_ptr theSObject, const char* theValue){
- using namespace SALOMEDS;
- Study_var aStudy = GetActiveStudyDocument();
- if(aStudy->GetProperties()->IsLocked())
+ void SetValue (_PTR(SObject) theSObject, const QString& theValue)
+ {
+ _PTR(Study) aStudy = GetActiveStudyDocument();
+ if (aStudy->GetProperties()->IsLocked())
+ return;
+ _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder();
+ _PTR(GenericAttribute) anAttr =
+ aBuilder->FindOrCreateAttribute(theSObject, "AttributeComment");
+ _PTR(AttributeComment) aComment = anAttr;
+ if (aComment)
+ aComment->SetValue(theValue.toLatin1().data());
+ }
+
+ void setFileName (_PTR(SObject) theSObject, const QString& theValue)
+ {
+ _PTR(Study) aStudy = GetActiveStudyDocument();
+ if (aStudy->GetProperties()->IsLocked())
return;
- StudyBuilder_var aBuilder = aStudy->NewBuilder();
- GenericAttribute_var anAttr = aBuilder->FindOrCreateAttribute(theSObject,"AttributeComment");
- AttributeComment_var aComment = AttributeComment::_narrow(anAttr);
- if(!aComment->_is_nil())
- aComment->SetValue(theValue);
+ _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder();
+ _PTR(GenericAttribute) anAttr =
+ aBuilder->FindOrCreateAttribute(theSObject, "AttributeExternalFileDef");
+ _PTR(AttributeExternalFileDef) aFileName = anAttr;
+ if (aFileName)
+ aFileName->SetValue(theValue.toLatin1().data());
}
+ void setFileType (_PTR(SObject) theSObject, const QString& theValue)
+ {
+ _PTR(Study) aStudy = GetActiveStudyDocument();
+ if (aStudy->GetProperties()->IsLocked())
+ return;
+ _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder();
+ _PTR(GenericAttribute) anAttr =
+ aBuilder->FindOrCreateAttribute(theSObject, "AttributeFileType");
+ _PTR(AttributeFileType) aFileType = anAttr;
+ if (aFileType)
+ aFileType->SetValue(theValue.toLatin1().data());
+ }
- CORBA::Object_var SObjectToObject(SALOMEDS::SObject_ptr theSObject,
- SALOMEDS::Study_ptr theStudy)
+ CORBA::Object_var SObjectToObject (_PTR(SObject) theSObject,
+ _PTR(Study) theStudy)
{
- if(!theSObject->_is_nil()){
- SALOMEDS::GenericAttribute_var anAttr;
- if(theSObject->FindAttribute(anAttr, "AttributeIOR")){
- SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
- CORBA::String_var aVal = anIOR->Value();
- return theStudy->ConvertIORToObject(aVal.in());
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>
+ (SUIT_Session::session()->activeApplication());
+ if (theSObject) {
+ _PTR(GenericAttribute) anAttr;
+ if (theSObject->FindAttribute(anAttr, "AttributeIOR")) {
+ _PTR(AttributeIOR) anIOR = anAttr;
+ CORBA::String_var aVal = anIOR->Value().c_str();
+ // string_to_object() DOC: If the input string is not valid ...
+ // a CORBA::SystemException is thrown.
+ if ( aVal && strlen( aVal ) > 0 )
+ return app->orb()->string_to_object(aVal);
}
}
return CORBA::Object::_nil();
}
-
- CORBA::Object_var SObjectToObject(SALOMEDS::SObject_ptr theSObject){
- SALOMEDS::Study_var aStudy = GetActiveStudyDocument();
+ CORBA::Object_var SObjectToObject (_PTR(SObject) theSObject)
+ {
+ _PTR(Study) aStudy = GetActiveStudyDocument();
return SObjectToObject(theSObject,aStudy);
}
-
- CORBA::Object_var IObjectToObject(const Handle(SALOME_InteractiveObject)& theIO){
- if(!theIO.IsNull()){
- if(theIO->hasEntry()){
- SALOMEDS::Study_var aStudy = GetActiveStudyDocument();
- SALOMEDS::SObject_var anObj = aStudy->FindObjectID(theIO->getEntry());
- return SObjectToObject(anObj,aStudy);
+ CORBA::Object_var IObjectToObject (const Handle(SALOME_InteractiveObject)& theIO)
+ {
+ if (!theIO.IsNull()) {
+ if (theIO->hasEntry()) {
+ _PTR(Study) aStudy = GetActiveStudyDocument();
+ _PTR(SObject) anObj = aStudy->FindObjectID(theIO->getEntry());
+ return SObjectToObject(anObj,aStudy);
}
}
return CORBA::Object::_nil();
}
-
- CORBA::Object_var IORToObject(const char* theIOR){
- SALOMEDS::Study_var aStudy = GetActiveStudyDocument();
- return aStudy->ConvertIORToObject(theIOR);
+ CORBA::Object_var IORToObject (const QString& theIOR)
+ {
+ SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>
+ (SUIT_Session::session()->activeApplication());
+ return app->orb()->string_to_object(theIOR.toLatin1().data());
}
-
- int GetNameOfSelectedIObjects(SALOME_Selection* theSel, QString& theName)
+ int GetNameOfSelectedIObjects(LightApp_SelectionMgr* theMgr, QString& theName)
{
- int aNbSel = theSel->IObjectCount();
+ if (!theMgr)
+ return 0;
+
+ SALOME_ListIO selected;
+ theMgr->selectedObjects(selected);
+ int aNbSel = selected.Extent();
if (aNbSel == 1) {
- Handle(SALOME_InteractiveObject) anIObject = theSel->firstIObject();
+ Handle(SALOME_InteractiveObject) anIObject = selected.First();
theName = anIObject->getName();
- }else{
+ } else {
theName = QObject::tr("SMESH_OBJECTS_SELECTED").arg(aNbSel);
}
return aNbSel;
}
-
- SALOMEDS::SObject_var GetMeshOrSubmesh(SALOMEDS::SObject_ptr theSObject){
+ _PTR(SObject) GetMeshOrSubmesh (_PTR(SObject) theSObject)
+ {
GEOM::GEOM_Object_var aShape = SObjectToInterface<GEOM::GEOM_Object>(theSObject);
- if(!aShape->_is_nil()){ //It s a shape
+ if (!aShape->_is_nil()){ //It s a shape
return theSObject->GetFather();
}
- SALOMEDS::SObject_var aSObject;
- if(theSObject->ReferencedObject(aSObject)){
+ _PTR(SObject) aSObject;
+ if (theSObject->ReferencedObject(aSObject)) {
aSObject = theSObject->GetFather();
return aSObject->GetFather();
}
return theSObject->GetFather();
}
-
- void ModifiedMesh(SALOMEDS::SObject_ptr theSObject, bool theIsRight)
+ void ModifiedMesh (_PTR(SObject) theSObject, bool theIsNotModif, bool isEmptyMesh)
{
- SALOMEDS::Study_var aStudy = GetActiveStudyDocument();
- if(aStudy->GetProperties()->IsLocked())
- return ;
+ _PTR(Study) aStudy = GetActiveStudyDocument();
+ if (aStudy->GetProperties()->IsLocked())
+ return;
- SALOMEDS::StudyBuilder_var aBuilder = aStudy->NewBuilder();
- SALOMEDS::GenericAttribute_var anAttr =
+ _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder();
+ _PTR(GenericAttribute) anAttr =
aBuilder->FindOrCreateAttribute(theSObject,"AttributePixMap");
- SALOMEDS::AttributePixMap_var aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
- if(theIsRight){
+ _PTR(AttributePixMap) aPixmap = anAttr;
+ if (theIsNotModif) {
aPixmap->SetPixMap("ICON_SMESH_TREE_MESH");
- }else{
+ } else if ( isEmptyMesh ) {
aPixmap->SetPixMap("ICON_SMESH_TREE_MESH_WARN");
+ } else {
+ aPixmap->SetPixMap("ICON_SMESH_TREE_MESH_PARTIAL");
}
-
- SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(theSObject);
+
+ _PTR(ChildIterator) anIter = aStudy->NewChildIterator(theSObject);
for (int i = 1; anIter->More(); anIter->Next(), i++) {
- SALOMEDS::SObject_var aSObj = anIter->Value();
- if(i >= 4){
- SALOMEDS::ChildIterator_var anIter1 = aStudy->NewChildIterator(aSObj);
- for(; anIter1->More(); anIter1->Next()){
- SALOMEDS::SObject_var aSObj1 = anIter1->Value();
- anAttr = aBuilder->FindOrCreateAttribute(aSObj1,"AttributePixMap");
- aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
- if(theIsRight){
- aPixmap->SetPixMap("ICON_SMESH_TREE_MESH");
- }else{
- aPixmap->SetPixMap("ICON_SMESH_TREE_MESH_WARN");
- }
- }
+ _PTR(SObject) aSObj = anIter->Value();
+ if (i >= 4) {
+ _PTR(ChildIterator) anIter1 = aStudy->NewChildIterator(aSObj);
+ for ( ; anIter1->More(); anIter1->Next()) {
+ _PTR(SObject) aSObj1 = anIter1->Value();
+ anAttr = aBuilder->FindOrCreateAttribute(aSObj1, "AttributePixMap");
+ aPixmap = anAttr;
+ if (theIsNotModif) {
+ aPixmap->SetPixMap("ICON_SMESH_TREE_MESH");
+ } else if ( isEmptyMesh ) {
+ aPixmap->SetPixMap("ICON_SMESH_TREE_MESH_WARN");
+ } else {
+ aPixmap->SetPixMap("ICON_SMESH_TREE_MESH_PARTIAL");
+ }
+ }
}
}
}
+ void ShowHelpFile (const QString& theHelpFileName)
+ {
+ LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
+ if (app) {
+ SMESHGUI* gui = SMESHGUI::GetSMESHGUI();
+ app->onHelpContextModule(gui ? app->moduleName(gui->moduleName()) : QString(""),
+ theHelpFileName);
+ }
+ else {
+ SUIT_MessageBox::warning(0, QObject::tr("WRN_WARNING"),
+ QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
+ arg(app->resourceMgr()->stringValue("ExternalBrowser",
+ "application")).
+ arg(theHelpFileName));
+ }
+ }
-}
+ //=======================================================================
+ /**
+ Return normale to a given face
+ */
+ //=======================================================================
+ gp_XYZ getNormale( const SMDS_MeshFace* theFace )
+ {
+ gp_XYZ n;
+ int aNbNode = theFace->NbNodes();
+ TColgp_Array1OfXYZ anArrOfXYZ(1,4);
+ SMDS_ElemIteratorPtr aNodeItr = theFace->nodesIterator();
+ int i = 1;
+ for ( ; aNodeItr->more() && i <= 4; i++ ) {
+ SMDS_MeshNode* aNode = (SMDS_MeshNode*)aNodeItr->next();
+ anArrOfXYZ.SetValue(i, gp_XYZ( aNode->X(), aNode->Y(), aNode->Z() ) );
+ }
+
+ gp_XYZ q1 = anArrOfXYZ.Value(2) - anArrOfXYZ.Value(1);
+ gp_XYZ q2 = anArrOfXYZ.Value(3) - anArrOfXYZ.Value(1);
+ n = q1 ^ q2;
+ if ( aNbNode > 3 ) {
+ gp_XYZ q3 = anArrOfXYZ.Value(4) - anArrOfXYZ.Value(1);
+ n += q2 ^ q3;
+ }
+ double len = n.Modulus();
+ if ( len > 0 )
+ n /= len;
+ return n;
+ }
+
+} // end of namespace SMESH