X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGEOMToolsGUI%2FGEOMToolsGUI.cxx;h=68d4cefd7c956cbb882b0ece4313a8c9e7ad7f86;hb=15e78623e92030e26c218fab844b77f2c4d09d89;hp=5eddb4047d8af460211c6d5ca6c0c8fad3fd99e6;hpb=8bc9b430c5f9f3cf77539fee550f1b56769d3893;p=modules%2Fgeom.git diff --git a/src/GEOMToolsGUI/GEOMToolsGUI.cxx b/src/GEOMToolsGUI/GEOMToolsGUI.cxx index 5eddb4047..68d4cefd7 100644 --- a/src/GEOMToolsGUI/GEOMToolsGUI.cxx +++ b/src/GEOMToolsGUI/GEOMToolsGUI.cxx @@ -1,78 +1,271 @@ -// GEOM GEOMGUI : GUI for Geometry component +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // -// 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 +// 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. // -// File : GEOMBase_Tools.cxx -// Author : Damien COQUERET -// Module : GEOM -// $Header: +// 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 +// + +// GEOM GEOMGUI : GUI for Geometry component +// File : GEOMBase_Tools.cxx +// Author : Damien COQUERET, Open CASCADE S.A.S. -using namespace std; #include "GEOMToolsGUI.h" +#include "GEOMToolsGUI_DeleteDlg.h" + +#include +#include "GeometryGUI_Operations.h" +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +// QT Includes +#include +#include +#include + +// OCCT Includes +#include + +typedef QMap FilterMap; +static QString lastUsedFilter; -#include "QAD_Config.h" -#include "QAD_FileDlg.h" -#include "QAD_Tools.h" -#include "QAD_MessageBox.h" -#include "QAD_RightFrame.h" +//======================================================================= +// function : getFileName +// purpose : Selection of a file name for Import/Export. Returns also +// the selected file type code through argument. +//======================================================================= +static QString getFileName( QWidget* parent, + const QString& initial, + const FilterMap& filterMap, + const QStringList& filters, + const QString& caption, + bool open, + QString& format, + bool showCurrentDirInitially = false ) +{ + //QStringList filters; + QString aBrepFilter; + for (FilterMap::const_iterator it = filterMap.begin(); it != filterMap.end(); ++it) { + //filters.push_back( it.key() ); + if (it.key().contains( "BREP", Qt::CaseInsensitive )) + aBrepFilter = it.key(); + } + + SUIT_FileDlg* fd = new SUIT_FileDlg( parent, open, true, true ); + if ( !caption.isEmpty() ) + fd->setWindowTitle( caption ); + + if ( !initial.isEmpty() ) + fd->selectFile( initial ); -#include "OCCViewer_Viewer3d.h" -#include "VTKViewer_ViewFrame.h" + if ( showCurrentDirInitially && SUIT_FileDlg::getLastVisitedPath().isEmpty() ) + fd->setDirectory( QDir::currentPath() ); -#include "SALOME_ListIteratorOfListIO.hxx" -#include "SALOMEGUI_NameDlg.h" -#include "SALOMEGUI_ImportOperation.h" -#include "SALOMEGUI_QtCatchCorbaException.hxx" + fd->setFilters( filters ); + + if ( !lastUsedFilter.isEmpty() && filterMap.contains( lastUsedFilter ) ) { + fd->selectFilter( lastUsedFilter ); + } + else if ( !aBrepFilter.isEmpty() ) { + fd->selectFilter( aBrepFilter ); + } + + QString filename; + if ( fd->exec() == QDialog::Accepted ) { + filename = fd->selectedFile(); + format = filterMap[fd->selectedFilter()]; + lastUsedFilter = fd->selectedFilter(); + } + + delete fd; + qApp->processEvents(); + return filename; +} + +//======================================================================= +// function : getFileNames +// purpose : Select list of files for Import operation. Returns also +// the selected file type code through argument. +//======================================================================= +static QStringList getFileNames( QWidget* parent, + const QString& initial, + const FilterMap& filterMap, + const QString& caption, + QString& format, + bool showCurrentDirInitially = false) +{ + QString aBrepFilter; + QStringList allFilters; + QStringList filters; + QRegExp re( "\\((.*)\\)" ); + re.setMinimal( true ); + for ( FilterMap::const_iterator it = filterMap.begin(); it != filterMap.end(); ++it ) { + if ( it.value().contains( "BREP", Qt::CaseInsensitive ) && aBrepFilter.isEmpty() ) + aBrepFilter = it.key(); + filters.append( it.key() ); + int pos = 0; + while ( re.indexIn( it.key(), pos ) >= 0 ) { + QString f = re.cap(1); + pos = re.pos() + f.length() + 2; + allFilters.append( f.simplified() ); + } + } + filters.append( QObject::tr( "GEOM_ALL_IMPORT_FILES" ).arg( allFilters.join( " " ) ) ); + + SUIT_FileDlg fd( parent, true, true, true ); + fd.setFileMode( SUIT_FileDlg::ExistingFiles ); + if ( !caption.isEmpty() ) + fd.setWindowTitle( caption ); + if ( !initial.isEmpty() ) + fd.selectFile( initial ); + + if ( showCurrentDirInitially && SUIT_FileDlg::getLastVisitedPath().isEmpty() ) + fd.setDirectory( QDir::currentPath() ); + + fd.setFilters( filters ); + + if ( !lastUsedFilter.isEmpty() && filterMap.contains( lastUsedFilter ) ) + fd.selectFilter( lastUsedFilter ); + else if ( !aBrepFilter.isEmpty() ) + fd.selectFilter( aBrepFilter ); + + QStringList filenames; + if ( fd.exec() ) { + filenames = fd.selectedFiles(); + format = filterMap.contains( fd.selectedFilter() ) ? filterMap[ fd.selectedFilter() ] : QString(); + lastUsedFilter = fd.selectedFilter(); + } + qApp->processEvents(); + return filenames; +} -#include -#include -#include +//======================================================================= +// function : getParentComponent +// purpose : Get object's parent component entry +//======================================================================= +static QString getParentComponent( _PTR( SObject ) obj ) +{ + if ( obj ) { + _PTR(SComponent) comp = obj->GetFatherComponent(); + if ( comp ) + return QString( comp->GetID().c_str() ); + } + return QString(); +} -#include -#include -#include -#include -#include +//===================================================================================== +// function : inUse +// purpose : check if the object(s) passed as the the second arguments are used +// by the other objects in the study +//===================================================================================== +static bool inUse( _PTR(Study) study, const QString& component, const QMap& objects ) +{ + _PTR(SObject) comp = study->FindObjectID( component.toLatin1().data() ); + if ( !comp ) + return false; + + // collect all GEOM objects being deleted + QMap gobjects; + QMap::ConstIterator oit; + std::list<_PTR(SObject)> aSelectedSO; + for ( oit = objects.begin(); oit != objects.end(); ++oit ) { + _PTR(SObject) so = study->FindObjectID( oit.key().toLatin1().data() ); + if ( !so ) + continue; + aSelectedSO.push_back(so); + CORBA::Object_var corbaObj_rem = GeometryGUI::ClientSObjectToObject( so ); + GEOM::GEOM_Object_var geomObj_rem = GEOM::GEOM_Object::_narrow( corbaObj_rem ); + if( CORBA::is_nil( geomObj_rem ) ) + continue; + gobjects.insert( oit.key(), geomObj_rem ); + } -#include -#include -#include + // Search References with other Modules + std::list< _PTR(SObject) >::iterator itSO = aSelectedSO.begin(); + for ( ; itSO != aSelectedSO.end(); ++itSO ) { + std::vector<_PTR(SObject)> aReferences = study->FindDependances( *itSO ); + int aRefLength = aReferences.size(); + if (aRefLength) { + for (int i = 0; i < aRefLength; i++) { + _PTR(SObject) firstSO( aReferences[i] ); + _PTR(SComponent) aComponent = firstSO->GetFatherComponent(); + QString type = aComponent->ComponentDataType().c_str(); + if ( type == "SMESH" ) + return true; + } + } + } -#include "GEOMToolsGUI_NbIsosDlg.h" // Method ISOS adjustement -#include "GEOMToolsGUI_TransparencyDlg.h" // Method TRANSPARENCY adjustement + // browse through all GEOM data tree + _PTR(ChildIterator) it ( study->NewChildIterator( comp ) ); + for ( it->InitEx( true ); it->More(); it->Next() ) { + _PTR(SObject) child( it->Value() ); + CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject( child ); + GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); + if( CORBA::is_nil( geomObj ) ) + continue; + + GEOM::ListOfGO_var list = geomObj->GetDependency(); + if( list->length() == 0 ) + continue; + + for( int i = 0; i < list->length(); i++ ) { + bool depends = false; + bool deleted = false; + QMap::Iterator git; + for ( git = gobjects.begin(); git != gobjects.end() && ( !depends || !deleted ); ++git ) { + depends = depends || list[i]->_is_equivalent( *git ); + deleted = deleted || git.key() == child->GetID().c_str() ;//geomObj->_is_equivalent( *git ); + } + if ( depends && !deleted ) + return true; + } + } + return false; +} //======================================================================= // function : GEOMToolsGUI() // purpose : Constructor //======================================================================= -GEOMToolsGUI::GEOMToolsGUI() : - QObject() +GEOMToolsGUI::GEOMToolsGUI( GeometryGUI* parent ) +: GEOMGUI( parent ) { - myGeomBase = new GEOMBase(); - myGeomGUI = GEOMContext::GetGeomGUI(); - myGeom = myGeomGUI->myComponentGeom; } - //======================================================================= // function : ~GEOMToolsGUI() // purpose : Destructor @@ -81,835 +274,697 @@ GEOMToolsGUI::~GEOMToolsGUI() { } - //======================================================================= // function : OnGUIEvent() -// purpose : +// purpose : //======================================================================= -bool GEOMToolsGUI::OnGUIEvent(int theCommandID, QAD_Desktop* parent) +bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent) { - GEOMToolsGUI* myGEOMToolsGUI = new GEOMToolsGUI(); - myGEOMToolsGUI->myGeomGUI->EmitSignalDeactivateDialog(); - SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection()); - - SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); - switch (theCommandID) - { - case 31: // COPY - { - myGEOMToolsGUI->OnEditCopy(); - break; - } - case 33: // DELETE - { - myGEOMToolsGUI->OnEditDelete(); - break; - } - case 111: // IMPORT BREP - { - myGEOMToolsGUI->Import(theCommandID); - break; - } - case 112: // IMPORT IGES - { - myGEOMToolsGUI->Import(theCommandID); - break; - } - case 113: // IMPORT STEP - { - myGEOMToolsGUI->Import(theCommandID); - break; - } - case 121: // EXPORT BREP - { - myGEOMToolsGUI->Export(theCommandID); - break; - } - case 122: // EXPORT IGES - { - myGEOMToolsGUI->Export(theCommandID); - break; - } - case 123: // EXPORT STEP - { - myGEOMToolsGUI->Export(theCommandID); - break; - } - case 411: // SETTINGS - ADD IN STUDY - { - QMenuBar* Mb = QAD_Application::getDesktop()->getMainMenuBar(); - QMenuData* pp; - QMenuItem* item = parent->menuBar()->findItem(411, &pp); - bool check = !pp->isItemChecked(411); - pp->setItemChecked(411,check); - //myGEOMToolsGUI->myGeomGUI->GetSettings_AddInStudy() = check; - QAD_CONFIG->addSetting("Geometry:SettingsAddInStudy", check); - break; - } - case 412: // SETTINGS - SHADING COLOR - { - if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() > VIEW_OCC) - break; - - OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer(); - Handle (AIS_InteractiveContext) ic = v3d->getAISContext(); - - QString SCr = QAD_CONFIG->getSetting("Geometry:SettingsShadingColorRed"); - QString SCg = QAD_CONFIG->getSetting("Geometry:SettingsShadingColorGreen"); - QString SCb = QAD_CONFIG->getSetting("Geometry:SettingsShadingColorBlue"); - QColor color; - if(!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty()) { - color = QColor (SCr.toInt(), SCg.toInt(), SCb.toInt()); - } - else { - Quantity_Color Default = Quantity_Color(); - color = QColor ((int)Default.Red() * 255.0, (int)Default.Green()* 255.0, (int)Default.Blue() * 255.0); - } - - QColor c = QColorDialog::getColor(color, QAD_Application::getDesktop()); - if(c.isValid()) { - //myGEOMToolsGUI->myGeomGUI->GetShadingColor() = Quantity_Color(c.red() / 255.0, c.green() / 255.0, c.blue() / 255.0, Quantity_TOC_RGB); - - 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()); - aSh->SetShadingColor(Quantity_Color(c.red() / 255.0, c.green() / 255.0, c.blue() / 255.0, Quantity_TOC_RGB)); - ic->Redisplay(aSh, Standard_True, Standard_True); - } - ite.Next(); - } - - ic->UpdateCurrentViewer(); - - QAD_CONFIG->addSetting("Geometry:SettingsShadingColorRed", c.red()); - QAD_CONFIG->addSetting("Geometry:SettingsShadingColorGreen", c.green()); - QAD_CONFIG->addSetting("Geometry:SettingsShadingColorBlue", c.blue()); - } - break; - } - case 413: // SETTINGS - ISOS - { - if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() > VIEW_OCC) - break; - - OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer(); - Handle (AIS_InteractiveContext) ic = v3d->getAISContext(); - - QString IsoU = QAD_CONFIG->getSetting("Geometry:SettingsIsoU"); - QString IsoV = QAD_CONFIG->getSetting("Geometry:SettingsIsoV"); - if(!IsoU.isEmpty()) - ic->DefaultDrawer()->UIsoAspect()->SetNumber(IsoU.toInt()); - else - IsoU = "1"; - if (!IsoV.isEmpty()) - ic->DefaultDrawer()->VIsoAspect()->SetNumber(IsoV.toInt()); - else - IsoV = "1"; - - GEOMBase_NbIsosDlg* NbIsosDlg = new GEOMBase_NbIsosDlg(QAD_Application::getDesktop(), tr("GEOM_MEN_ISOS"), TRUE); - int UIso = IsoU.toInt(); - int VIso = IsoV.toInt(); - - NbIsosDlg->SpinBoxU->setValue(UIso); - NbIsosDlg->SpinBoxV->setValue(VIso); - - if(NbIsosDlg->exec()) { - UIso = NbIsosDlg->SpinBoxU->text().toInt(); - VIso = NbIsosDlg->SpinBoxV->text().toInt(); - - ic->DefaultDrawer()->UIsoAspect()->SetNumber(UIso); - ic->DefaultDrawer()->VIsoAspect()->SetNumber(VIso); - QAD_CONFIG->addSetting("Geometry:SettingsIsoU", NbIsosDlg->SpinBoxU->text()); /* text format */ - QAD_CONFIG->addSetting("Geometry:SettingsIsoV", NbIsosDlg->SpinBoxV->text()); /* text format */ - } - - AIS_ListOfInteractive List; - ic->DisplayedObjects(List); - AIS_ListOfInteractive List1; - ic->ObjectsInCollector(List1); - List.Append(List1); - - AIS_ListIteratorOfListOfInteractive ite(List); - ic->InitCurrent(); - if(ic->NbCurrents()) - while(ite.More()) { - if(ite.Value()->IsInstance(STANDARD_TYPE(GEOM_AISShape))) { - Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast(ite.Value()); - Handle (AIS_Drawer) CurDrawer; - CurDrawer = aSh->Attributes(); - CurDrawer->UIsoAspect()->SetNumber(UIso); - CurDrawer->VIsoAspect()->SetNumber(VIso); - ic->SetLocalAttributes(aSh, CurDrawer); - ic->Redisplay(aSh); - } - ite.Next(); - } - ic->UpdateCurrentViewer(); - break; - } - case 414: // SETTINGS : STEP VALUE FOR SPIN BOXES - { - QString step = QAD_CONFIG->getSetting("Geometry:SettingsGeomStep"); - if(step.isEmpty()) - step = "100.0"; - - Standard_Boolean res = false; - double dd = myGEOMToolsGUI->myGeomBase->Parameter(res, QString("%1").arg(step), tr("GEOM_MEN_STEP_LABEL"), tr("GEOM_STEP_TITLE"), 0.001, 10000.0, 3); - if(res) { - QAD_CONFIG->addSetting("Geometry:SettingsGeomStep", QString("%1").arg(dd)); - - /* Emit signal to GeometryGUI_SpinBoxes */ - myGEOMToolsGUI->myGeomGUI->EmitSignalDefaultStepValueChanged(dd); - } - else - parent->putInfo(tr("GEOM_PRP_ABORT")); - break; - } - case 804: // ADD IN STUDY - POPUP VIEWER - { - const SALOME_ListIO& ListSelected = Sel->StoredIObjects(); - SALOME_ListIteratorOfListIO It(ListSelected); - for(; It.More(); It.Next()) { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - myGEOMToolsGUI->myGeomBase->AddInStudy(true, IObject); - } - /* Is set on the dialog box */ - QApplication::restoreOverrideCursor(); - break; - } - case 901: // RENAME - { - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - for(; It.More(); It.Next()) { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - - SALOMEDS::SObject_var obj = aStudy->FindObjectID(IObject->getEntry()); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - if(!obj->_is_nil()) { - if(obj->FindAttribute(anAttr, "AttributeName")) { - aName = SALOMEDS::AttributeName::_narrow(anAttr); - - QString nm = QString(aName->Value()); - nm = SALOMEGUI_NameDlg::getName(QAD_Application::getDesktop(), nm); - if(!nm.isEmpty()) { - QApplication::setOverrideCursor(Qt::waitCursor); - QAD_Application::getDesktop()->getActiveStudy()->renameIObject(IObject, nm); - QApplication::restoreOverrideCursor(); - } - } - } - } - break; - } - case 5103: // CHECK GEOMETRY - { - QAD_PyEditor* PyEditor = QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getPyEditor(); - PyEditor->setText("from GEOM_usinggeom import *\n"); - //PyEditor->setText(">>> "); - PyEditor->handleReturn(); - break; - } - case 5104: // LOAD SCRIPT - { - QStringList filtersList; - filtersList.append(tr("GEOM_MEN_LOAD_SCRIPT")); - filtersList.append(tr("GEOM_MEN_ALL_FILES")); - - QString aFile = QAD_FileDlg::getFileName(QAD_Application::getDesktop(), "", filtersList, tr("GEOM_MEN_IMPORT"), true); - if(!aFile.isEmpty()) { - QFileInfo file = aFile; - QApplication::setOverrideCursor(Qt::waitCursor); - QAD_PyEditor* PyEditor = QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getPyEditor(); - - PyEditor->setText("import geompy\n"); - PyEditor->handleReturn(); - - QStringList aTextList = QStringList::split(".", file.fileName()); - PyEditor->setText("geompy.Path('" + file.dirPath() + "')\n"); - PyEditor->handleReturn(); - - PyEditor->setText("from " + aTextList.first() + " import *\n"); - PyEditor->handleReturn(); - } - QApplication::restoreOverrideCursor(); - break; - } - case 8032: // COLOR - POPUP VIEWER - { - if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { - // VTK - VTKViewer_RenderWindowInteractor* myRenderInter = ((VTKViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRWInteractor(); - - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - Handle(SALOME_InteractiveObject) FirstIOS = Sel->firstIObject(); - if(!FirstIOS.IsNull()) { - QColor initcolor = myRenderInter->GetColor(FirstIOS); - QColor c = QColorDialog::getColor( initcolor, QAD_Application::getDesktop()); - - if(c.isValid()) { - QApplication::setOverrideCursor(Qt::waitCursor); - for(;It.More();It.Next()) { - Handle(SALOME_InteractiveObject) IOS = It.Value(); - myRenderInter->SetColor(IOS,c); - } - } - QApplication::restoreOverrideCursor(); - } - } - else if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_OCC) { - Handle(SALOME_InteractiveObject) IO = Sel->firstIObject(); - Standard_Boolean found; - Handle(GEOM_AISShape) Shape = myGEOMToolsGUI->myGeomBase->ConvertIOinGEOMAISShape(IO, found, true); - if(found) { - Quantity_Color CSFColor; - Shape->Color(CSFColor); - - QColor c = QColorDialog::getColor(QColor(CSFColor.Red() * 255.0, CSFColor.Green()* 255.0, CSFColor.Blue() * 255.0), QAD_Application::getDesktop()); - - if(c.isValid()) { - CSFColor = Quantity_Color (c.red()/255., c.green()/255., c.blue()/255., Quantity_TOC_RGB); - QApplication::setOverrideCursor( Qt::waitCursor ); - - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - for(;It.More();It.Next()) { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - Standard_Boolean found; - Handle(GEOM_AISShape) Shape = myGEOMToolsGUI->myGeomBase->ConvertIOinGEOMAISShape(IObject, found, true); - if(found) { - Shape->SetColor(CSFColor); - Shape->SetShadingColor(CSFColor); - } - } - } - } - } - QApplication::restoreOverrideCursor(); - break; - } - case 8033: // TRANSPARENCY - POPUP VIEWER - { - OCCViewer_Viewer3d* v3d; - Handle(AIS_InteractiveContext) ic; - if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() > VIEW_OCC) { - OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer(); - Handle (AIS_InteractiveContext) ic = v3d->getAISContext(); - } - GEOMBase_TransparencyDlg *aDlg = new GEOMBase_TransparencyDlg(parent, "", Sel, ic); - break; - } - case 8034: // ISOS - POPUP VIEWER - { - if(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getTypeView() > VIEW_OCC) - break; - - OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer(); - Handle (AIS_InteractiveContext) ic = v3d->getAISContext(); - - ic->InitCurrent(); - if(ic->MoreCurrent()) { - Handle(GEOM_AISShape) CurObject = Handle(GEOM_AISShape)::DownCast(ic->Current()); - QString IsoU = QAD_CONFIG->getSetting("Geometry:SettingsIsoU"); - QString IsoV = QAD_CONFIG->getSetting("Geometry:SettingsIsoV"); - - if(!IsoU.isEmpty()) - ic->DefaultDrawer()->UIsoAspect()->SetNumber(IsoU.toInt()); - else - IsoU = "1"; - if (!IsoV.isEmpty()) - ic->DefaultDrawer()->VIsoAspect()->SetNumber(IsoV.toInt()); - else - IsoV = "1"; - - GEOMBase_NbIsosDlg * NbIsosDlg = - new GEOMBase_NbIsosDlg(QAD_Application::getDesktop(), tr("GEOM_MEN_ISOS"), TRUE); - - NbIsosDlg->SpinBoxU->setValue(IsoU.toInt()); - NbIsosDlg->SpinBoxV->setValue(IsoV.toInt()); - - if(NbIsosDlg->exec()) { - QApplication::setOverrideCursor(Qt::waitCursor); - for(; ic->MoreCurrent(); ic->NextCurrent()) { - Handle(AIS_Drawer) CurDrawer; - - CurDrawer = ic->Current()->Attributes(); - CurDrawer->UIsoAspect()->SetNumber(NbIsosDlg->SpinBoxU->text().toInt()); - CurDrawer->VIsoAspect()->SetNumber(NbIsosDlg->SpinBoxV->text().toInt()); - - ic->SetLocalAttributes(CurObject, CurDrawer); - ic->Redisplay(CurObject); - } - } - } - QApplication::restoreOverrideCursor(); - break; - } - case 9024 : // OPEN - OBJBROSER POPUP - { - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - Handle(SALOME_InteractiveObject) anIObject; - for(;It.More();It.Next()) { - anIObject = It.Value(); - SALOMEDS::SObject_var obj = aStudy->FindObjectID(anIObject->getEntry()); - SALOMEDS::AttributePersistentRef_var aPersist; - SALOMEDS::AttributeIOR_var anIOR; - if(!obj->_is_nil()) { - // this SObject may be GEOM module root SObject - SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(obj); - SALOMEDS::GenericAttribute_var anAttr; - bool useSubItems = false; - while (anIter->More() && !useSubItems) { - SALOMEDS::SObject_var subobj = anIter->Value(); - if (subobj->FindAttribute(anAttr, "AttributePersistentRef")) { - useSubItems = true; - obj = subobj; - } - else - anIter->Next(); - } - obj->FindAttribute(anAttr, "AttributePersistentRef"); - - while(useSubItems?anIter->More():!anAttr->_is_nil()) { - if(!obj->FindAttribute(anAttr, "AttributeIOR") && - obj->FindAttribute(anAttr, "AttributePersistentRef")) { - // load - Engines::Component_var comp = QAD_Application::getDesktop()->getEngine("FactoryServer","GEOM"); - if (!CORBA::is_nil(comp)) { - SALOMEDS::Driver_var driver = SALOMEDS::Driver::_narrow(comp); - SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); - aStudyBuilder->LoadWith(aStudy->FindComponent("GEOM"),driver); - } - else { - MESSAGE("Component is null"); - } - } - if(useSubItems) { - anIter->Next(); - obj = anIter->Value(); - } - else - anAttr = SALOMEDS::GenericAttribute::_nil(); - } - } - } - break; - } - default: - { - parent->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); - break; - } - } + getGeometryGUI()->EmitSignalDeactivateDialog(); + + switch ( theCommandID ) { + case GEOMOp::OpDelete: // EDIT - DELETE + OnEditDelete(); + break; + case GEOMOp::OpImport: // FILE - IMPORT + Import(); + break; + case GEOMOp::OpExport: // FILE - EXPORT + Export(); + break; + case GEOMOp::OpCheckGeom: // TOOLS - CHECK GEOMETRY + OnCheckGeometry(); + break; + case GEOMOp::OpSelectVertex: // POPUP - SELECT ONLY - VERTEX + OnSelectOnly( GEOM_POINT ); + break; + case GEOMOp::OpSelectEdge: // POPUP - SELECT ONLY - EDGE + OnSelectOnly( GEOM_EDGE ); + break; + case GEOMOp::OpSelectWire: // POPUP - SELECT ONLY - WIRE + OnSelectOnly( GEOM_WIRE ); + break; + case GEOMOp::OpSelectFace: // POPUP - SELECT ONLY - FACE + OnSelectOnly( GEOM_FACE ); + break; + case GEOMOp::OpSelectShell: // POPUP - SELECT ONLY - SHELL + OnSelectOnly( GEOM_SHELL ); + break; + case GEOMOp::OpSelectSolid: // POPUP - SELECT ONLY - SOLID + OnSelectOnly( GEOM_SOLID ); + break; + case GEOMOp::OpSelectCompound: // POPUP - SELECT ONLY - COMPOUND + OnSelectOnly( GEOM_COMPOUND ); + break; + case GEOMOp::OpSelectAll: // POPUP - SELECT ONLY - SELECT ALL + OnSelectOnly( GEOM_ALLOBJECTS ); + break; + case GEOMOp::OpDeflection: // POPUP - DEFLECTION ANGLE + OnDeflection(); + break; + case GEOMOp::OpColor: // POPUP - COLOR + OnColor(); + break; + case GEOMOp::OpSetTexture: // POPUP - TEXTURE + OnTexture(); + break; + case GEOMOp::OpTransparency: // POPUP - TRANSPARENCY + OnTransparency(); + break; + case GEOMOp::OpIncrTransparency: // SHORTCUT - INCREASE TRANSPARENCY + OnChangeTransparency( true ); + break; + case GEOMOp::OpDecrTransparency: // SHORTCUT - DECREASE TRANSPARENCY + OnChangeTransparency( false ); + break; + case GEOMOp::OpIsos: // POPUP - ISOS + OnNbIsos(); + break; + case GEOMOp::OpIncrNbIsos: // SHORTCUT - INCREASE NB ISOLINES + OnNbIsos( INCR ); + break; + 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; + case GEOMOp::OpNoAutoColor: // POPUP - DISABLE AUTO COLOR + OnDisableAutoColor(); + break; + case GEOMOp::OpShowChildren: // POPUP - SHOW CHILDREN + case GEOMOp::OpHideChildren: // POPUP - HIDE CHILDREN + OnShowHideChildren( theCommandID == GEOMOp::OpShowChildren ); + break; + case GEOMOp::OpPointMarker: // POPUP - POINT MARKER + OnPointMarker(); + break; + case GEOMOp::OpUnpublishObject:// POPUP - UNPUBLISH + OnUnpublishObject(); + break; + case GEOMOp::OpPublishObject:// GEOM ROOT OBJECT - POPUP - PUBLISH + OnPublishObject(); + break; + case GEOMOp::OpEdgeWidth: + OnEdgeWidth(); + break; + case GEOMOp::OpIsosWidth: + OnIsosWidth(); + break; + case GEOMOp::OpBringToFront: + OnBringToFront(); + break; + case GEOMOp::OpClsBringToFront: + OnClsBringToFront(); + break; + default: + SUIT_Session::session()->activeApplication()->putInfo(tr("GEOM_PRP_COMMAND").arg(theCommandID)); + break; + } return true; } - //=============================================================================== // function : OnEditDelete() // purpose : //=============================================================================== void GEOMToolsGUI::OnEditDelete() { - SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection()); - if(Sel->IObjectCount() == 0) + SALOME_ListIO selected; + SalomeApp_Application* app = + dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( !app ) return; - if(QAD_MessageBox::warn2(QAD_Application::getDesktop(), tr("GEOM_WRN_WARNING"), tr("GEOM_REALLY_DELETE"), tr("GEOM_BUT_YES"), tr("GEOM_BUT_NO"), 1, 0, 0) != 1) + LightApp_SelectionMgr* aSelMgr = app->selectionMgr(); + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + if ( !aSelMgr || !appStudy ) return; - - int nbSf = QAD_Application::getDesktop()->getActiveStudy()->getStudyFramesCount(); - - Standard_Boolean found; - SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); - SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - QAD_Operation* op = new SALOMEGUI_ImportOperation( QAD_Application::getDesktop()->getActiveStudy() ); - op->start(); - Standard_Boolean deleted = false; - for(;It.More();It.Next()) { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - if(IObject->hasEntry()) { - SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); - SALOMEDS::SObject_var SO = aStudy->FindObjectID(IObject->getEntry()); - - /* Erase child graphical objects */ - SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(SO); - for(; it->More();it->Next()) { - SALOMEDS::SObject_var CSO= it->Value(); - if(CSO->FindAttribute(anAttr, "AttributeIOR") ) { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - /* Delete child(s) shape in Client : */ - const TCollection_AsciiString ASCior(anIOR->Value()) ; - myGeomGUI->GetShapeReader().RemoveShapeFromBuffer(ASCior); - - for(int i = 0; i < nbSf; i++) { - QAD_StudyFrame* sf = QAD_Application::getDesktop()->getActiveStudy()->getStudyFrame(i); - if(sf->getTypeView() == VIEW_OCC) { - OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)sf->getRightFrame()->getViewFrame())->getViewer(); - Handle (AIS_InteractiveContext) myContext = v3d->getAISContext(); - Handle(GEOM_AISShape) Result = myGeomBase->ConvertIORinGEOMAISShape(anIOR->Value(), found); - if(found) - myContext->Erase(Result, true, false); - } - else if(sf->getTypeView() == VIEW_VTK) { - //vtkRenderer* Renderer = ((VTKViewer_ViewFrame*)sf->getRightFrame()->getViewFrame())->getRenderer(); - VTKViewer_RenderWindowInteractor* myRenderInter = ((VTKViewer_ViewFrame*)sf->getRightFrame()->getViewFrame())->getRWInteractor(); - GEOM_Actor* ac = myGeomBase->ConvertIORinGEOMActor(anIOR->Value(), found); - if(found) { - //Renderer->RemoveActor(ac); - if(ac->hasIO()) - myRenderInter->Remove(ac->getIO()); - } - } - } - } - } - - /* Erase main graphical object */ - for(int i = 0; i < nbSf; i++) { - QAD_StudyFrame* sf = QAD_Application::getDesktop()->getActiveStudy()->getStudyFrame(i); - if(sf->getTypeView() == VIEW_OCC) { - OCCViewer_Viewer3d* v3d = ((OCCViewer_ViewFrame*)sf->getRightFrame()->getViewFrame())->getViewer(); - Handle(AIS_InteractiveContext) myContext = v3d->getAISContext(); - Handle(GEOM_AISShape) Result = myGeomBase->ConvertIOinGEOMAISShape(IObject, found ); - if(found) - myContext->Erase(Result, true, false); - } - else if(sf->getTypeView() == VIEW_VTK) { - VTKViewer_RenderWindowInteractor* myRenderInter= ((VTKViewer_ViewFrame*)sf->getRightFrame()->getViewFrame())->getRWInteractor(); - myRenderInter->Remove( IObject ); - } - } - - /* Delete main shape in Client : */ - if(SO->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - const TCollection_AsciiString ASCIor(anIOR->Value()) ; - myGeomGUI->GetShapeReader().RemoveShapeFromBuffer(ASCIor); - } - - /* Erase objects in Study */ - SALOMEDS::SObject_var obj = aStudy->FindObjectID(IObject->getEntry()); - if(!obj->_is_nil()) { - aStudyBuilder->RemoveObject(obj); - deleted = true; - } - } /* IObject->hasEntry() */ - } /* more/next */ - - if (deleted) op->finish(); - else op->abort(); - - /* Clear any previous selection */ - Sel->ClearIObjects(); - QAD_Application::getDesktop()->getActiveStudy()->updateObjBrowser(); -} + // get selection + aSelMgr->selectedObjects( selected, "ObjectBrowser", false ); + if ( selected.IsEmpty() ) + return; + _PTR(Study) aStudy = appStudy->studyDS(); -//============================================================================== -// function : OnEditCopy() -// purpose : -//============================================================================== -void GEOMToolsGUI::OnEditCopy() -{ - SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection() ); - GEOM::GEOM_Gen::ListOfIOR_var listIOR = new GEOM::GEOM_Gen::ListOfIOR; + // check if study is locked + if ( _PTR(AttributeStudyProperties)( aStudy->GetProperties() )->IsLocked() ) { + SUIT_MessageBox::warning( app->desktop(), + tr("WRN_WARNING"), + tr("WRN_STUDY_LOCKED") ); + return; // study is locked + } - const SALOME_ListIO& List = Sel->StoredIObjects(); + // get GEOM component + CORBA::String_var geomIOR = app->orb()->object_to_string( GeometryGUI::GetGeomGen() ); + QString geomComp = getParentComponent( aStudy->FindObjectIOR( geomIOR.in() ) ); + + // check each selected object: if belongs to GEOM, if not reference... + QMap toBeDeleted; + QMap allDeleted; + bool isComponentSelected = false; + + for ( SALOME_ListIteratorOfListIO It( selected ); It.More(); It.Next() ) { + Handle(SALOME_InteractiveObject) anIObject = It.Value(); + if ( !anIObject->hasEntry() ) + continue; // invalid object + // ... + QString entry = anIObject->getEntry(); + _PTR(SObject) obj = aStudy->FindObjectID( entry.toLatin1().data() ); + // check parent component + QString parentComp = getParentComponent( obj ); + if ( parentComp != geomComp ) { + SUIT_MessageBox::warning( app->desktop(), + QObject::tr("ERR_ERROR"), + QObject::tr("NON_GEOM_OBJECTS_SELECTED").arg( getGeometryGUI()->moduleName() ) ); + return; // not GEOM object selected + } - myGeomBase->ConvertListOfIOInListOfIOR(List, listIOR); + /////////////////////////////////////////////////////// + // if GEOM component is selected, so skip other checks + if ( isComponentSelected ) continue; + /////////////////////////////////////////////////////// + + // check if object is reference + _PTR(SObject) refobj; + if ( obj && obj->ReferencedObject( refobj ) ) { + // get the main object by reference IPAL 21354 + obj = refobj; + entry = obj->GetID().c_str(); + } + // ... + QString aName = obj->GetName().c_str(); + if ( entry == geomComp ) { + // GEOM component is selected, skip other checks + isComponentSelected = true; + continue; + } + toBeDeleted.insert( entry, aName ); + allDeleted.insert( entry, aName ); // skip GEOM component + // browse through all children recursively + _PTR(ChildIterator) it ( aStudy->NewChildIterator( obj ) ); + for ( it->InitEx( true ); it->More(); it->Next() ) { + _PTR(SObject) child( it->Value() ); + if ( child && child->ReferencedObject( refobj ) ) + continue; // skip references + aName = child->GetName().c_str(); + if ( !aName.isEmpty() ) + allDeleted.insert( child->GetID().c_str(), aName ); + } + } - Sel->ClearIObjects(); + // is there is anything to delete? + if ( !isComponentSelected && allDeleted.count() <= 0 ) + return; // nothing to delete + + // show confirmation dialog box + GEOMToolsGUI_DeleteDlg dlg( app->desktop(), allDeleted, isComponentSelected ); + if ( !dlg.exec() ) + return; // operation is cancelled by user + + // get currently opened views + QList views; + SALOME_View* view; + ViewManagerList vmans = app->viewManagers(); + SUIT_ViewManager* vman; + foreach ( vman, vmans ) { + SUIT_ViewModel* vmod = vman->getViewModel(); + view = dynamic_cast ( vmod ); // must work for OCC and VTK views + if ( view ) + views.append( view ); + } - for (unsigned int ind = 0; ind < listIOR->length();ind++) { - GEOM::GEOM_Shape_var aShapeInit = myGeom->GetIORFromString(listIOR[ind]); - try { - GEOM::GEOM_Shape_var result = myGeom->MakeCopy(aShapeInit) ; - result->NameType( aShapeInit->NameType() ); - myGeomBase->Display(result); + _PTR(StudyBuilder) aStudyBuilder (aStudy->NewBuilder()); + GEOM_Displayer* disp = new GEOM_Displayer( appStudy ); + + if ( isComponentSelected ) { + // GEOM component is selected: delete all objects recursively + _PTR(SObject) comp = aStudy->FindObjectID( geomComp.toLatin1().data() ); + if ( !comp ) + return; + _PTR(ChildIterator) it ( aStudy->NewChildIterator( comp ) ); + // remove top-level objects only + for ( it->InitEx( false ); it->More(); it->Next() ) { + _PTR(SObject) child( it->Value() ); + // remove object from GEOM engine + removeObjectWithChildren( child, aStudy, views, disp ); + // remove object from study + aStudyBuilder->RemoveObjectWithChildren( child ); + } + } + else { + // GEOM component is not selected: check if selected objects are in use + if ( inUse( aStudy, geomComp, allDeleted ) ) { + SUIT_MessageBox::warning( app->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr("DEP_OBJECT") ); + return; // object(s) in use } - catch (const SALOME::SALOME_Exception& S_ex) { - QtCatchCorbaException(S_ex); + // ... and then delete all objects + QMap::Iterator it; + for ( it = toBeDeleted.begin(); it != toBeDeleted.end(); ++it ) { + _PTR(SObject) obj ( aStudy->FindObjectID( it.key().toLatin1().data() ) ); + // remove object from GEOM engine + removeObjectWithChildren( obj, aStudy, views, disp ); + // remove objects from study + aStudyBuilder->RemoveObjectWithChildren( obj ); } } - - QAD_Application::getDesktop()->putInfo(tr("GEOM_PRP_READY")); -} + selected.Clear(); + aSelMgr->setSelectedObjects( selected ); + getGeometryGUI()->updateObjBrowser(); + app->updateActions(); //SRN: To update a Save button in the toolbar +} //===================================================================================== // function : Import -// purpose : BRep, Iges, Step +// purpose : BRep, Iges, Step, ... //===================================================================================== -bool GEOMToolsGUI::Import(int aState) +bool GEOMToolsGUI::Import() { - SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); - SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); - - GEOM::GEOM_Shape_var aShape; - QString file; - QStringList filtersList; - - switch(aState) - { - case 111 : // Import BREP - { - filtersList.append(tr("GEOM_MEN_IMPORT_BREP")); - filtersList.append(tr("GEOM_MEN_ALL_FILES")); - - file = QAD_FileDlg::getFileName(QAD_Application::getDesktop(), "", filtersList, tr("GEOM_MEN_IMPORT"), true); - if(!file.isEmpty()) { - QApplication::setOverrideCursor(Qt::waitCursor); - try { - aShape = myGeom->ImportBREP(file.latin1()); - } - catch(const SALOME::SALOME_Exception& S_ex) { - QtCatchCorbaException(S_ex); - } - } - break; + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( getGeometryGUI()->getApp() ); + if ( !app ) return false; + + SalomeApp_Study* stud = dynamic_cast ( app->activeStudy() ); + if ( !stud ) { + MESSAGE ( "FAILED to cast active study to SalomeApp_Study" ); + return false; + } + _PTR(Study) aStudy = stud->studyDS(); + + // check if study is locked + bool aLocked = (_PTR(AttributeStudyProperties)(aStudy->GetProperties()))->IsLocked(); + if ( aLocked ) { + SUIT_MessageBox::warning( app->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr("WRN_STUDY_LOCKED") ); + return false; + } + + // check if GEOM engine is available + GEOM::GEOM_Gen_var eng = GeometryGUI::GetGeomGen(); + if ( CORBA::is_nil( eng ) ) { + SUIT_MessageBox::critical( app->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr( "GEOM Engine is not started" ) ); + return false; + } + + GEOM::GEOM_IInsertOperations_var aInsOp = eng->GetIInsertOperations( aStudy->StudyId() ); + if ( aInsOp->_is_nil() ) + return false; + + // obtain a list of available import formats + FilterMap aMap; + GEOM::string_array_var aFormats, aPatterns; + aInsOp->ImportTranslators( aFormats, aPatterns ); + + for ( int i = 0, n = aFormats->length(); i < n; i++ ) + aMap.insert( (char*)aPatterns[i], (char*)aFormats[i] ); + + // select files to be imported + QString fileType; + QStringList fileNames = getFileNames( app->desktop(), "", aMap, + tr( "GEOM_MEN_IMPORT" ), fileType, true ); + + // set Wait cursor + SUIT_OverrideCursor wc; + + if ( fileNames.count() == 0 ) + return false; // nothing selected, return + + QStringList errors; + + QList< GEOM::GEOM_Object_var > objsForDisplay; + + QStringList anEntryList; + + // iterate through all selected files + + SUIT_MessageBox::StandardButton igesAnswer = SUIT_MessageBox::NoButton; + SUIT_MessageBox::StandardButton acisAnswer = SUIT_MessageBox::NoButton; + + for ( int i = 0; i < fileNames.count(); i++ ) { + QString fileName = fileNames[i]; + + if ( fileName.isEmpty() ) + continue; + + QString aCurrentType; + if ( fileType.isEmpty() ) { + // file type is not defined, try to detect + QString ext = QFileInfo( fileName ).suffix().toUpper(); + QRegExp re( "\\*\\.(\\w+)" ); + for ( FilterMap::const_iterator it = aMap.begin(); + it != aMap.end() && aCurrentType.isEmpty(); ++it ) { + int pos = 0; + while ( re.indexIn( it.key(), pos ) >= 0 ) { + QString f = re.cap(1).trimmed().toUpper(); + if ( ext == f ) { aCurrentType = it.value(); break; } + pos = re.pos() + re.cap(1).length() + 2; + } } - case 112 : // Import IGES - { - filtersList.append( tr("GEOM_MEN_IMPORT_IGES") ) ; - filtersList.append( tr("GEOM_MEN_ALL_FILES") ) ; - - file = QAD_FileDlg::getFileName(QAD_Application::getDesktop(), - "", - filtersList, - tr("GEOM_MEN_IMPORT"), - true); - if ( !file.isEmpty() ) { - QApplication::setOverrideCursor( Qt::waitCursor ); - try { - aShape = myGeom->ImportIGES( file.latin1() ); - } - catch (const SALOME::SALOME_Exception& S_ex) { - QtCatchCorbaException(S_ex); - } - } - break; + } + else { + aCurrentType = fileType; + } + + if ( aCurrentType.isEmpty() ) { + errors.append( QString( "%1 : %2" ).arg( fileName ).arg( tr( "GEOM_UNSUPPORTED_TYPE" ) ) ); + continue; + } + + GEOM_Operation* anOp = new GEOM_Operation( app, aInsOp.in() ); + try { + app->putInfo( tr( "GEOM_PRP_LOADING" ).arg( SUIT_Tools::file( fileName, /*withExten=*/true ) ) ); + anOp->start(); + + CORBA::String_var fileN = fileName.toLatin1().constData(); + CORBA::String_var fileT = aCurrentType.toLatin1().constData(); + + // jfa 21.08.2012 for mantis issue 21511 (STEP file units) + CORBA::String_var aUnits = aInsOp->ReadValue(fileN, fileT, "LEN_UNITS"); + TCollection_AsciiString aUnitsStr (aUnits.in()); + bool needConvert = true; + if (aUnitsStr.IsEmpty() || aUnitsStr == "UNIT_M") + needConvert = false; + + if (needConvert) { + if (igesAnswer == SUIT_MessageBox::NoToAll) { + // converting for all files is already approved + fileT = (aCurrentType + "_SCALE").toLatin1().constData(); + } + else if (igesAnswer != SUIT_MessageBox::YesToAll) { + SUIT_MessageBox::StandardButtons btns = SUIT_MessageBox::Yes | SUIT_MessageBox::No; + if (i < fileNames.count() - 1) btns = btns | SUIT_MessageBox::YesToAll | SUIT_MessageBox::NoToAll; + igesAnswer = SUIT_MessageBox::question(app->desktop(), + "Question",//tr("WRN_WARNING"), + tr("GEOM_SCALE_DIMENSIONS"), + btns | SUIT_MessageBox::Cancel, + SUIT_MessageBox::No); + switch (igesAnswer) { + case SUIT_MessageBox::Cancel: + return false; // cancel (break) import operation + case SUIT_MessageBox::Yes: + case SUIT_MessageBox::YesToAll: + break; // scaling is confirmed + case SUIT_MessageBox::No: + case SUIT_MessageBox::NoAll: + fileT = (aCurrentType + "_SCALE").toLatin1().constData(); + default: + break; // scaling is rejected + } // switch ( igesAnswer ) + } // if ( igeAnswer != NoToAll ) + } // if ( needConvert ) + + /* + // skl 29.05.2009 + if ( aCurrentType == "IGES" ) { + GEOM::GEOM_Object_var anObj = aInsOp->ImportFile( fileN, "IGES_UNIT" ); + bool needConvert = false; + TCollection_AsciiString aUnitName = aInsOp->GetErrorCode(); + if ( aUnitName.SubString( 1, 4 ) == "UNIT" ) + needConvert = aUnitName.SubString( 6, aUnitName.Length() ) != "M"; + + if ( needConvert ) { + if ( igesAnswer == SUIT_MessageBox::NoToAll ) { + // converting for all files is already approved + fileT = "IGES_SCALE"; + } + else if ( igesAnswer != SUIT_MessageBox::YesToAll ) { + SUIT_MessageBox::StandardButtons btns = SUIT_MessageBox::Yes | SUIT_MessageBox::No; + if ( i < fileNames.count()-1 ) btns = btns | SUIT_MessageBox::YesToAll | SUIT_MessageBox::NoToAll; + igesAnswer = SUIT_MessageBox::question( app->desktop(), + "Question",//tr("WRN_WARNING"), + tr("GEOM_SCALE_DIMENSIONS"), + btns | SUIT_MessageBox::Cancel, + SUIT_MessageBox::No ); + switch ( igesAnswer ) { + case SUIT_MessageBox::Cancel: + return false; // cancel (break) import operation + case SUIT_MessageBox::Yes: + case SUIT_MessageBox::YesToAll: + break; // scaling is confirmed + case SUIT_MessageBox::No: + case SUIT_MessageBox::NoAll: + fileT = "IGES_SCALE"; + default: + break; // scaling is rejected + } // switch ( igesAnswer ) + } // if ( igeAnswer != NoToAll ) + } // if ( needConvert ) + } // if ( aCurrentType == "IGES" ) + else if ( aCurrentType == "ACIS" ) { + */ + + if ( aCurrentType == "ACIS" ) { + if ( acisAnswer != SUIT_MessageBox::YesToAll && acisAnswer != SUIT_MessageBox::NoToAll ) { + SUIT_MessageBox::StandardButtons btns = SUIT_MessageBox::Yes | SUIT_MessageBox::No; + if ( i < fileNames.count()-1 ) btns = btns | SUIT_MessageBox::YesToAll | SUIT_MessageBox::NoToAll; + acisAnswer = SUIT_MessageBox::question( app->desktop(), + "Question",//tr("WRN_WARNING"), + tr("GEOM_PUBLISH_NAMED_SHAPES"), + btns | SUIT_MessageBox::Cancel, + SUIT_MessageBox::No ); + if ( acisAnswer == SUIT_MessageBox::Cancel ) + return false; // cancel (break) import operation + } // if ( acisAnswer != YesToAll && acisAnswer != NoToAll ) + } // else if ( aCurrentType == "ACIS" ) + + // IMPORT + GEOM::GEOM_Object_var anObj = aInsOp->ImportFile( fileN, fileT ); + + if ( !anObj->_is_nil() && aInsOp->IsDone() ) { + QString aPublishObjName = + GEOMBase::GetDefaultName( SUIT_Tools::file( fileName, /*withExten=*/true ) ); + + SALOMEDS::Study_var aDSStudy = GeometryGUI::ClientStudyToStudy( aStudy ); + SALOMEDS::SObject_var aSO = + GeometryGUI::GetGeomGen()->PublishInStudy( aDSStudy, + SALOMEDS::SObject::_nil(), + anObj, + aPublishObjName.toLatin1().constData() ); + if ( ( !aSO->_is_nil() ) ) + anEntryList.append( aSO->GetID() ); + + objsForDisplay.append( anObj ); + + if ( aCurrentType == "ACIS" ) { + if ( acisAnswer == SUIT_MessageBox::Yes || acisAnswer == SUIT_MessageBox::YesToAll ) + GeometryGUI::GetGeomGen()->PublishNamedShapesInStudy( aDSStudy, anObj ); + } + + anOp->commit(); } - case 113 : // Import STEP - { - filtersList.append( tr("GEOM_MEN_IMPORT_STEP") ) ; - filtersList.append( tr("GEOM_MEN_ALL_FILES") ) ; - - file = QAD_FileDlg::getFileName(QAD_Application::getDesktop(), - "", - filtersList, - tr("GEOM_MEN_IMPORT"), - true); - if ( !file.isEmpty() ) { - QApplication::setOverrideCursor( Qt::waitCursor ); - try { - aShape = myGeom->ImportSTEP( file.latin1() ); - } - catch (const SALOME::SALOME_Exception& S_ex) { - QtCatchCorbaException(S_ex); - } - } - break; + else { + anOp->abort(); + errors.append( QString( "%1 : %2" ).arg( fileName ).arg( aInsOp->GetErrorCode() ) ); } } - - if ( !file.isEmpty() ) { - QAD_Application::getDesktop()->putInfo( tr("GEOM_PRP_LOADING").arg(QAD_Tools::getFileNameFromPath( file )) ); - - SALOMEDS::SComponent_var father = aStudy->FindComponent("GEOM"); - SALOMEDS::SObject_var fatherSF = aStudy->FindObjectID(QAD_Application::getDesktop()->getActiveStudy()->getActiveStudyFrame()->entry()); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributePixMap_var aPixmap; - int aLocked = false; - if (father->_is_nil()) { - QAD_Operation* op = new SALOMEGUI_ImportOperation(QAD_Application::getDesktop()->getActiveStudy() ); - op->start(); - aLocked = aStudy->GetProperties()->IsLocked(); - if (aLocked) aStudy->GetProperties()->SetLocked(false); - father = aStudyBuilder->NewComponent("GEOM"); - anAttr = aStudyBuilder->FindOrCreateAttribute(father, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - // aName->SetValue( tr("GEOM_MEN_COMPONENT") ); - aName->SetValue(QAD_Application::getDesktop()->getComponentUserName( "GEOM" ) ); - anAttr = aStudyBuilder->FindOrCreateAttribute(father, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_OBJBROWSER_Geometry" ); - aStudyBuilder->DefineComponentInstance( father, myGeom ); - if (aLocked) aStudy->GetProperties()->SetLocked(true); - op->finish(); + catch( const SALOME::SALOME_Exception& S_ex ) { + anOp->abort(); + errors.append( QString( "%1 : %2" ).arg( fileName ).arg( tr( "GEOM_UNKNOWN_IMPORT_ERROR" ) ) ); } -// if (aLocked) return false; - father->ComponentIOR(myGeomGUI->GetFatherior()); + } - QString nameShape = QAD_Tools::getFileNameFromPath(file,false) + QString("_%1").arg(myGeomGUI->GetNbGeom()++); + // update object browser + getGeometryGUI()->updateObjBrowser( true ); - if(myGeomBase->Display(aShape, strdup(nameShape.latin1()))) { - QAD_Application::getDesktop()->getActiveStudy()->setMessage( tr("GEOM_INF_LOADED").arg(QAD_Tools::getFileNameFromPath( file )) ); - QAD_Application::getDesktop()->putInfo( tr("GEOM_PRP_READY")); - } + // browse published objects + app->browseObjects( anEntryList ); + + // display imported model (if only one file is selected) + if ( objsForDisplay.count() == 1 ) + GEOM_Displayer( stud ).Display( objsForDisplay[0].in() ); + + if ( errors.count() > 0 ) { + SUIT_MessageBox::critical( app->desktop(), + QObject::tr( "GEOM_ERROR" ), + QObject::tr( "GEOM_IMPORT_ERRORS" ) + "\n" + errors.join( "\n" ) ); } - QApplication::restoreOverrideCursor(); - return true; -} + app->updateActions(); //SRN: To update a Save button in the toolbar + + return objsForDisplay.count() > 0; +} //===================================================================================== // function : Export // purpose : BRep, Iges, Step //===================================================================================== -bool GEOMToolsGUI::Export(int aState) +bool GEOMToolsGUI::Export() { - SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); - SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); - - GEOM::GEOM_Shape_var aShape; - - static QString filters[] = { tr("GEOM_MEN_IMPORT_BREP"), - tr("GEOM_MEN_IMPORT_IGES"), - tr("GEOM_MEN_IMPORT_STEP") }; - - SALOME_Selection* Sel = SALOME_Selection::Selection(QAD_Application::getDesktop()->getActiveStudy()->getSelection()); - SALOME_ListIteratorOfListIO It( Sel->StoredIObjects() ); - - switch (aState) - { - case 121 : - { - for(;It.More();It.Next()) { - QApplication::restoreOverrideCursor(); - Handle(SALOME_InteractiveObject) IObject = It.Value(); - Standard_Boolean found; - GEOM::GEOM_Shape_var aShape = myGeomBase->ConvertIOinGEOMShape(IObject, found); - // Handle(GEOM_AISShape) Shape = myGeomGUI->ConvertIOinGEOMAISShape(IObject, found, true); - if ( found ) { - QString file = QAD_FileDlg::getFileName(QAD_Application::getDesktop(), - QString( IObject->getName() ) + ".brep", - tr("GEOM_MEN_IMPORT_BREP"), - tr("GEOM_MEN_EXPORT"), - false); - if ( !file.isEmpty() && !aShape->_is_nil() ) { - QApplication::setOverrideCursor( Qt::waitCursor ); - // Standard_Boolean result = BRepTools::Write(Shape->Shape(), strdup(file.latin1()) ); - try { - myGeom->ExportBREP(strdup( file.latin1()), aShape); - } - catch (const SALOME::SALOME_Exception& S_ex) { - QtCatchCorbaException(S_ex); - } - } - } - } - break; - } - case 122 : - { - for(;It.More();It.Next()) { - QApplication::restoreOverrideCursor(); - Handle(SALOME_InteractiveObject) IObject = It.Value(); - Standard_Boolean found; - GEOM::GEOM_Shape_var aShape = myGeomBase->ConvertIOinGEOMShape(IObject, found); - // Handle(GEOM_AISShape) Shape = myGeomGUI->ConvertIOinGEOMAISShape(IObject, found, true); - if ( found ) { - QString file = QAD_FileDlg::getFileName(QAD_Application::getDesktop(), - QString( IObject->getName() ) + ".igs", - tr("GEOM_MEN_IMPORT_IGES"), - tr("GEOM_MEN_EXPORT"), - false); - if ( !file.isEmpty() && !aShape->_is_nil() ) { - QApplication::setOverrideCursor( Qt::waitCursor ); - try { - myGeom->ExportIGES(strdup( file.latin1()), aShape); - } - catch (const SALOME::SALOME_Exception& S_ex) { - QtCatchCorbaException(S_ex); - } -// //VRV: OCC 4.0 migration -// IGESControl_Controller::Init(); -// IGESControl_Writer ICW (Interface_Static::CVal("XSTEP.iges.unit"), -// Interface_Static::IVal("XSTEP.iges.writebrep.mode")); -// //VRV: OCC 4.0 migration - -// ICW.AddShape (Shape->Shape()); -// ICW.ComputeModel(); -// Standard_Boolean result = ICW.Write( strdup(file.latin1()) ); - } - } - } - break; - } + SalomeApp_Application* app = getGeometryGUI()->getApp(); + if (!app) return false; + + SalomeApp_Study* stud = dynamic_cast ( app->activeStudy() ); + if ( !stud ) { + MESSAGE ( "FAILED to cast active study to SalomeApp_Study" ); + return false; + } + _PTR(Study) aStudy = stud->studyDS(); + + GEOM::GEOM_Gen_var eng = GeometryGUI::GetGeomGen(); + if ( CORBA::is_nil( eng ) ) { + SUIT_MessageBox::critical( app->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr( "GEOM Engine is not started" ) ); + return false; + } + + GEOM::GEOM_IInsertOperations_var aInsOp = eng->GetIInsertOperations( aStudy->StudyId() ); + if ( aInsOp->_is_nil() ) + return false; + + // Obtain a list of available export formats + FilterMap aMap; + QStringList filters; + GEOM::string_array_var aFormats, aPatterns; + aInsOp->ExportTranslators( aFormats, aPatterns ); + for ( int i = 0, n = aFormats->length(); i < n; i++ ) { + aMap.insert( (char*)aPatterns[i], (char*)aFormats[i] ); + filters.push_back( (char*)aPatterns[i] ); + } + + // Get selected objects + LightApp_SelectionMgr* sm = app->selectionMgr(); + if ( !sm ) + return false; + + SALOME_ListIO selectedObjects; + sm->selectedObjects( selectedObjects ); + bool appropriateObj = false; + + SALOME_ListIteratorOfListIO It( selectedObjects ); + for (; It.More(); It.Next()) { + Handle(SALOME_InteractiveObject) IObject = It.Value(); + GEOM::GEOM_Object_var anObj = GEOMBase::ConvertIOinGEOMObject( IObject ); - case 123 : - { -// bool test = false ; -// IFSelect_ReturnStatus status ; -// //VRV: OCC 4.0 migration -// STEPControl_Writer aWriter; -// //VRV: OCC 4.0 migration - QString file; - - for( ; It.More(); It.Next() ) { -// GEOM::GEOM_Shape_var aShape = myGeomBase->ConvertIOinGEOMShape(IObject, found); - QApplication::restoreOverrideCursor(); - Handle(SALOME_InteractiveObject) IObject = It.Value(); - Standard_Boolean found; - GEOM::GEOM_Shape_var aShape = myGeomBase->ConvertIOinGEOMShape(IObject, found); - // Handle(GEOM_AISShape) Shape = myGeomBase->ConvertIOinGEOMAISShape(IObject, found, true); - if ( found ) { - file = QAD_FileDlg::getFileName(QAD_Application::getDesktop(), - QString( IObject->getName() ) + ".stp", - tr("GEOM_MEN_IMPORT_STEP"), - tr("GEOM_MEN_EXPORT"), - false); - if ( !file.isEmpty() && !aShape->_is_nil() ) { - - QApplication::setOverrideCursor( Qt::waitCursor ) ; - try { - myGeom->ExportSTEP(strdup( file.latin1()), aShape); - } - catch (const SALOME::SALOME_Exception& S_ex) { - QtCatchCorbaException(S_ex); - } -// //VRV: OCC 4.0 migration -// status = aWriter.Transfer( Shape->Shape(), STEPControl_ManifoldSolidBrep ) ; -// //VRV: OCC 4.0 migration -// test = true ; -// if ( status != IFSelect_RetDone ) { -// QApplication::restoreOverrideCursor() ; -// return false ; -// } - } - } - } -// if(test) { -// status = aWriter.Write( strdup(file.latin1()) ) ; -// QApplication::restoreOverrideCursor() ; -// return status ; -// } - break; + if ( anObj->_is_nil() ) + continue; + + QString fileType; + QString file = getFileName(app->desktop(), QString( IObject->getName() ), aMap, filters, + tr("GEOM_MEN_EXPORT"), false, fileType, true); + + // User has pressed "Cancel" --> stop the operation + if ( file.isEmpty() || fileType.isEmpty() ) + return false; + + GEOM_Operation* anOp = new GEOM_Operation( app, aInsOp.in() ); + try { + SUIT_OverrideCursor wc; + + app->putInfo( tr("GEOM_PRP_EXPORT").arg(SUIT_Tools::file( file, /*withExten=*/true )) ); + + anOp->start(); + + aInsOp->Export( anObj, file.toStdString().c_str(), fileType.toLatin1().constData() ); + + if (aInsOp->IsDone()) + anOp->commit(); + else { + anOp->abort(); + wc.suspend(); + SUIT_MessageBox::critical(app->desktop(), + QObject::tr("GEOM_ERROR"), + QObject::tr("GEOM_PRP_ABORT") + "\n" + QObject::tr(aInsOp->GetErrorCode())); + return false; } + } + catch (const SALOME::SALOME_Exception& S_ex) { + //QtCatchCorbaException(S_ex); + anOp->abort(); + return false; + } + appropriateObj = true; + } + + if ( !appropriateObj ) + SUIT_MessageBox::warning( app->desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr("GEOM_WRN_NO_APPROPRIATE_SELECTION") ); + return true; +} + +//===================================================================================== +// function : RemoveObjectWithChildren +// purpose : used by OnEditDelete() method +//===================================================================================== +void GEOMToolsGUI::removeObjectWithChildren(_PTR(SObject) obj, + _PTR(Study) aStudy, + QList views, + GEOM_Displayer* disp) +{ + // iterate through all children of obj + for (_PTR(ChildIterator) it (aStudy->NewChildIterator(obj)); it->More(); it->Next()) { + _PTR(SObject) child (it->Value()); + removeObjectWithChildren(child, aStudy, views, disp); + } + + // erase object and remove it from engine + _PTR(GenericAttribute) anAttr; + if (obj->FindAttribute(anAttr, "AttributeIOR")) { + _PTR(AttributeIOR) anIOR (anAttr); + SalomeApp_Study* appStudy = dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); + + // Delete shape in Client + const TCollection_AsciiString ASCIor ((char*)anIOR->Value().c_str()); + getGeometryGUI()->GetShapeReader().RemoveShapeFromBuffer(ASCIor); + + CORBA::Object_var corbaObj = GeometryGUI::ClientSObjectToObject(obj); + GEOM::GEOM_Object_var geomObj = GEOM::GEOM_Object::_narrow( corbaObj ); + if (!CORBA::is_nil(geomObj)) { + + //Remove visual properties of the object + appStudy->removeObjectFromAll(obj->GetID().c_str()); + + // Erase graphical object + QListIterator it( views ); + while ( it.hasNext() ) + if ( SALOME_View* view = it.next() ) + disp->Erase(geomObj, true, view); + + // Remove object from Engine + // We can't directly remove object from engine. All we can do is to unpublish the object + // from the study. Another client could be using the object. + // Unpublishing is done just after in aStudyBuilder->RemoveObjectWithChildren( child ); + //GeometryGUI::GetGeomGen()->RemoveObject( geomObj ); } - QApplication::restoreOverrideCursor() ; + } } +//================================================================================= +// function : deactivate() +// purpose : Called when GEOM component is deactivated +//================================================================================= +void GEOMToolsGUI::deactivate() +{ + SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() ); + if ( app ) { + SalomeApp_Study* appStudy = dynamic_cast( app->activeStudy() ); + GEOM_Displayer aDisp (appStudy); + aDisp.GlobalSelection(); + getGeometryGUI()->setLocalSelectionMode(GEOM_ALLOBJECTS); + } +} //===================================================================================== // EXPORTED METHODS //===================================================================================== extern "C" { - bool OnGUIEvent(int theCommandID, QAD_Desktop* parent) - {return GEOMToolsGUI::OnGUIEvent(theCommandID, parent);} +#ifdef WIN32 + __declspec( dllexport ) +#endif + GEOMGUI* GetLibGUI( GeometryGUI* parent ) + { + return new GEOMToolsGUI( parent ); + } }