Salome HOME
0022616: [CEA 1038] Improve the quality of stl and vtk exports
[modules/geom.git] / src / GEOMToolsGUI / GEOMToolsGUI.cxx
index 0c514cb7864da2afbdf64c4d635cae9cdd7afde0..950b181c5e9fe1d08c0373c1068bb35ce1c4983c 100644 (file)
 typedef QMap<QString, QString> FilterMap;
 static QString lastUsedFilter;
 
-//=======================================================================
-// function : getFileName
-// purpose  : Selection of a file name for Import/Export. Returns also
-//            the selected file type code through <filter> 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 );
-
-  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 );
-  }
-
-  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 <format> 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;
-}
-
 //=======================================================================
 // function : getParentComponent
 // purpose  : Get object's parent component entry
@@ -317,12 +207,6 @@ bool GEOMToolsGUI::OnGUIEvent(int theCommandID, SUIT_Desktop* parent)
   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;
@@ -628,365 +512,6 @@ void GEOMToolsGUI::OnEditDelete()
   app->updateActions(); //SRN: To update a Save button in the toolbar
 }
 
-//=====================================================================================
-// function : Import
-// purpose  : BRep, Iges, Step, ...
-//=====================================================================================
-bool GEOMToolsGUI::Import()
-{
-  SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( getGeometryGUI()->getApp() );
-  if ( !app ) return false;
-
-  SalomeApp_Study* stud = dynamic_cast<SalomeApp_Study*> ( 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;
-        }
-      }
-    }
-    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.toUtf8().constData();
-      CORBA::String_var fileT = aCurrentType.toUtf8().constData();
-
-      // jfa 21.08.2012 for mantis issue 21511 (STEP file units)
-      CORBA::String_var aUnits = aInsOp->ReadValue(fileN, fileT, "LEN_UNITS");
-      QString aUnitsStr (aUnits.in());
-      bool needConvert = true;
-      if (aUnitsStr.isEmpty() || aUnitsStr == "M" || aUnitsStr.toLower() == "metre")
-        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").arg(aUnitsStr),
-                                                 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::ListOfGO_var anObj = aInsOp->ImportFile( fileN, fileT );
-
-      if ( anObj->length() > 0 && aInsOp->IsDone() ) {
-        GEOM::GEOM_Object_ptr aFather = anObj[0]._retn();
-        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(),
-                                                     aFather,
-                                                     aPublishObjName.toLatin1().constData() );
-        if ( ( !aSO->_is_nil() ) )
-          anEntryList.append( aSO->GetID() );
-
-        objsForDisplay.append( aFather );
-
-        if ( aCurrentType == "ACIS" ) {
-          if ( acisAnswer == SUIT_MessageBox::Yes || acisAnswer == SUIT_MessageBox::YesToAll )
-            GeometryGUI::GetGeomGen()->PublishNamedShapesInStudy( aDSStudy, aFather );
-        }
-
-        anOp->commit();
-
-        // Treat group objects.
-        for (int i = 1, n = anObj->length(); i < n; i++) {
-          GEOM::GEOM_Object_ptr anObject = anObj[i]._retn();
-          GeometryGUI::GetGeomGen()->AddInStudy(aDSStudy,
-            anObject, tr(anObject->GetName()).toStdString().c_str(), aFather);
-        }
-      }
-      else {
-        anOp->abort();
-        errors.append( QString( "%1 : %2" ).arg( fileName ).arg( aInsOp->GetErrorCode() ) );
-      }
-    }
-    catch( const SALOME::SALOME_Exception& S_ex ) {
-      anOp->abort();
-      errors.append( QString( "%1 : %2" ).arg( fileName ).arg( tr( "GEOM_UNKNOWN_IMPORT_ERROR" ) ) );
-    }
-  }
-
-  // update object browser
-  getGeometryGUI()->updateObjBrowser( true );
-
-  // 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" ) );
-  }
-
-  app->updateActions(); //SRN: To update a Save button in the toolbar
-
-  return objsForDisplay.count() > 0;
-}
-
-//=====================================================================================
-// function : Export
-// purpose  : BRep, Iges, Step
-//=====================================================================================
-bool GEOMToolsGUI::Export()
-{
-  SalomeApp_Application* app = getGeometryGUI()->getApp();
-  if (!app) return false;
-
-  SalomeApp_Study* stud = dynamic_cast<SalomeApp_Study*> ( 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 );
-
-    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.toUtf8().constData(), fileType.toUtf8().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