From cfcfc32d645e5076c462f422ea9e056f8a7cc8ff Mon Sep 17 00:00:00 2001 From: skl Date: Wed, 17 Mar 2010 09:37:10 +0000 Subject: [PATCH] Implementation of Import/Export CSV tables (0020664). --- doc/salome/gui/VISU/images/exporttables1.png | Bin 0 -> 23261 bytes doc/salome/gui/VISU/images/exporttables2.png | Bin 0 -> 21689 bytes doc/salome/gui/VISU/images/importtables.png | Bin 0 -> 25296 bytes .../input/importing_exporting_tables_page.doc | 18 +- idl/VISU_Gen.idl | 5 +- src/CONVERTOR/VISU_TableReader.cxx | 199 +++++++++++++++++- src/CONVERTOR/VISU_TableReader.hxx | 7 +- src/ENGINE/VISU_Engine_i.cc | 6 +- src/ENGINE/VISU_Engine_i.hh | 15 +- src/VISUGUI/VISU_msg_en.ts | 6 +- src/VISUGUI/VisuGUI.cxx | 39 +++- src/VISU_I/VISU_DumpPython.cc | 9 +- src/VISU_I/VISU_Gen_i.cc | 5 +- src/VISU_I/VISU_Gen_i.hh | 2 +- src/VISU_I/VISU_Table_i.cc | 163 ++++++++++---- src/VISU_I/VISU_Table_i.hh | 3 +- 16 files changed, 393 insertions(+), 84 deletions(-) create mode 100644 doc/salome/gui/VISU/images/exporttables1.png create mode 100644 doc/salome/gui/VISU/images/exporttables2.png create mode 100644 doc/salome/gui/VISU/images/importtables.png diff --git a/doc/salome/gui/VISU/images/exporttables1.png b/doc/salome/gui/VISU/images/exporttables1.png new file mode 100644 index 0000000000000000000000000000000000000000..8f13bb00e5724508db959799c25fec59c03a72dd GIT binary patch literal 23261 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/VISU/images/exporttables2.png b/doc/salome/gui/VISU/images/exporttables2.png new file mode 100644 index 0000000000000000000000000000000000000000..07093b17b5ad7da10ae65f30c8048ee7b0770a06 GIT binary patch literal 21689 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/VISU/images/importtables.png b/doc/salome/gui/VISU/images/importtables.png new file mode 100644 index 0000000000000000000000000000000000000000..8b903c2ba8488cc2267f73b44e0e71324bf2ad7a GIT binary patch literal 25296 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 N>1r9=uF!ZG{$CFHufhNT literal 0 HcmV?d00001 diff --git a/doc/salome/gui/VISU/input/importing_exporting_tables_page.doc b/doc/salome/gui/VISU/input/importing_exporting_tables_page.doc index 84de7c94..9b9a4fd1 100644 --- a/doc/salome/gui/VISU/input/importing_exporting_tables_page.doc +++ b/doc/salome/gui/VISU/input/importing_exporting_tables_page.doc @@ -10,10 +10,14 @@ select Table from File item.
  • From the following standard dialog box: -\image html importtablefromfile.png +\image html importtables.png + +choose the necessary *.txt, *.tab or *.csv file containing tables and +click \b Open button. + +Checkbox "Use first string as title" is checked if it is needed to use +information from first string of file as titles of columns of table. -choose the necessary *.txt or *.tab file containing tables and -click \b Open button.
  • In the Object Browser \b Post-Pro will create a new folder having @@ -30,7 +34,13 @@ tables.
  • contain your exported table, and click \b OK button. Your table will be exported. -\image html exporttable.png +You can perform export table to *.txt or *.tab file + +\image html exporttables1.png + +Or you can perform export table to *.csv file + +\image html exporttables2.png diff --git a/idl/VISU_Gen.idl b/idl/VISU_Gen.idl index 8946a982..dded558f 100644 --- a/idl/VISU_Gen.idl +++ b/idl/VISU_Gen.idl @@ -2167,9 +2167,10 @@ module VISU { ViewManager GetViewManager(); /*! - * Imports tables from a file and create TableAttribute in Sudy + * Imports tables from a file and create TableAttribute in Study */ - SALOMEDS::SObject ImportTables(in string theFileName); + SALOMEDS::SObject ImportTables(in string theFileName, + in boolean theFirstStrAsTitle); /*! * Export table to a file diff --git a/src/CONVERTOR/VISU_TableReader.cxx b/src/CONVERTOR/VISU_TableReader.cxx index cb431dab..50d21b1b 100644 --- a/src/CONVERTOR/VISU_TableReader.cxx +++ b/src/CONVERTOR/VISU_TableReader.cxx @@ -135,18 +135,107 @@ namespace return !theStmIn.eof(); } + + //======================================================================= + //function : findNextCell + //purpose : auxilary for ImportCSVTable + //======================================================================= + bool findNextCell(std::ifstream& aStmIn, QString& aStr, + QString& aCell, const char theSeparator) + { + aCell = ""; + int index, tmpind = 0; + if( aStr.at(0) == theSeparator ) { + aStr.remove(0,1); + aStr = aStr.trimmed(); + if(aStr.size()==0) return true; + } + QString aTmp = aStr; + if( aTmp.at(0) == '"' ) { + // find closed " + while( !aStmIn.eof() ) { + tmpind = aTmp.indexOf('"',1); + if( tmpind < 0 ) { + while( !aStmIn.eof() ) { + aCell.push_back(aTmp); + aCell.push_back('\n'); + ::getLine( aStmIn, aTmp ); + tmpind = aTmp.indexOf('"',1); + if( tmpind >= 0 ) { + break; + } + } + } + if(tmpind < 0) + return false; + // read next symbol + if( aTmp.at(tmpind+1) == '"' ) { + // "" is found => need to continue + aCell.push_back(aTmp.left(tmpind+1)); + aTmp = aTmp.mid(tmpind+2); + } + else if( aTmp.at(tmpind+1) == theSeparator ) { + index = tmpind+1; + break; + } + else { + return false; + } + } + } + else { + // find index for separator + index = aTmp.indexOf( theSeparator ); + } + if( index < 0 ) { + aCell += aTmp; + aStr = ""; + } + else { + if(index>0) aCell += aTmp.left(index); + aStr = aTmp.mid(index).trimmed(); + } + if( aCell.size()>0 && aCell.at(0) == '"' ) { + // remove first and last symbols + int last = aCell.size()-1; + aCell.remove(last,1); + aCell.remove(0,1); + } + // replace "" to " in aCell + QChar ctmp = '"'; + QString tmp(ctmp); + tmp += ctmp; + index = aCell.indexOf(tmp); + while(index>=0) { + aCell.remove(index,1); + index = aCell.indexOf(tmp); + } + return true; + } + } //--------------------------------------------------------------- void -VISU::ImportTables( const char* theFileName, TTableContainer& theContainer ) +VISU::ImportTables( const char* theFileName, TTableContainer& theContainer, + bool theFirstStrAsTitle) { std::ifstream aStmIn; QFileInfo aFileInfo( theFileName ); if( !aFileInfo.isFile() || !aFileInfo.isReadable() || !aFileInfo.size() ) return; + QString tmp(theFileName); + tmp = tmp.trimmed(); + tmp = tmp.right(3).trimmed(); + + if( tmp == QString("csv") ) { + const char separator = ','; + ImportCSVTable(theFileName, theContainer, theFirstStrAsTitle, separator); + return; + } + aStmIn.open( theFileName ); QString aTmp; do { @@ -157,6 +246,7 @@ VISU::ImportTables( const char* theFileName, TTableContainer& theContainer ) TTable2D& aTable2D = *aTableIDMapper; if(MYDEBUG) std::cout << "New table is found" << std::endl; + bool IsFirst = true; while( !aStmIn.eof() && aTmp.trimmed() != "" ){ QString data = aTmp.trimmed(); QString cmt = ""; @@ -231,20 +321,31 @@ VISU::ImportTables( const char* theFileName, TTableContainer& theContainer ) else { TTable2D::TRow aRow; if(MYDEBUG) std::cout << "...New row is found: " << std::endl; - if ( !cmt.isEmpty() ) { - aRow.myTitle = cmt.toLatin1().constData(); - if(MYDEBUG) std::cout << "......ROW TITLE is: " << cmt.toLatin1().constData() << std::endl; - } QString datar1 = data.replace(QRegExp("\t"), " "); QStringList aValList = datar1.split( " ", QString::SkipEmptyParts ); - for ( int i = 0; i < aValList.count(); i++ ) { - if ( aValList[i].trimmed() != "" ) { - TTable2D::TValue aVal = aValList[i].trimmed().toLatin1().constData(); - aRow.myValues.push_back( aVal ); + if( aTable2D.myColumnTitles.size()==0 && IsFirst && theFirstStrAsTitle ) { + for ( int i = 0; i < aValList.count(); i++ ) { + QString tmpstr = aValList[ i ].trimmed(); + aTable2D.myColumnTitles.push_back( tmpstr.toLatin1().constData() ); } } - if( aRow.myValues.size() > 0 ) - aTable2D.myRows.push_back( aRow ); + else { + if ( !cmt.isEmpty() ) { + aRow.myTitle = cmt.toLatin1().constData(); + if(MYDEBUG) std::cout << "......ROW TITLE is: " << cmt.toLatin1().constData() << std::endl; + } + //QString datar1 = data.replace(QRegExp("\t"), " "); + //QStringList aValList = datar1.split( " ", QString::SkipEmptyParts ); + for ( int i = 0; i < aValList.count(); i++ ) { + if ( aValList[i].trimmed() != "" ) { + TTable2D::TValue aVal = aValList[i].trimmed().toLatin1().constData(); + aRow.myValues.push_back( aVal ); + } + } + if( aRow.myValues.size() > 0 ) + aTable2D.myRows.push_back( aRow ); + } + IsFirst = false; // ************** OLD CODE ****************** /* TValue aVal; @@ -271,6 +372,81 @@ VISU::ImportTables( const char* theFileName, TTableContainer& theContainer ) } +//======================================================================= +//function : ImportCSVTable +//purpose : +//======================================================================= +void VISU::ImportCSVTable(const char* theFileName, TTableContainer& theContainer, + bool theFirstStrAsTitle, const char theSeparator) +{ + std::ifstream aStmIn; + QFileInfo aFileInfo( theFileName ); + if( !aFileInfo.isFile() || !aFileInfo.isReadable() || !aFileInfo.size() ) + return; + aStmIn.open( theFileName ); + QString aTmp; + do { + // find beginning of table (tables are separated by empty lines) + while( ::getLine( aStmIn, aTmp ) && aTmp.trimmed() == ""); + + PTableIDMapper aTableIDMapper( new TTableIDMapper() ); + TTable2D& aTable2D = *aTableIDMapper; + if(MYDEBUG) std::cout << "New table is found" << std::endl; + + bool IsFirst = true; + QStringList aValList; + + while( !aStmIn.eof() ) { + QString aCell = ""; + if( !(::findNextCell(aStmIn, aTmp, aCell, theSeparator)) ) { + return; + } + if( aTmp.size()==0 ) { + // make table row + aValList.push_back(aCell); + if( IsFirst && theFirstStrAsTitle ) { + for ( int i = 0; i < aValList.count(); i++ ) { + aTable2D.myColumnTitles.push_back( aValList[i].trimmed().toLatin1().constData() ); + } + } + else { + TTable2D::TRow aRow; + for ( int i = 0; i < aValList.count(); i++ ) { + if ( aValList[i].trimmed() != "" ) { + TTable2D::TValue aVal = aValList[i].trimmed().toLatin1().constData(); + aRow.myValues.push_back( aVal ); + } + else { + aRow.myValues.push_back( "Empty" ); + } + } + if( aRow.myValues.size() > 0 ) { + aTable2D.myRows.push_back( aRow ); + } + } + // clear list of values and read next string + aValList.clear(); + ::getLine( aStmIn, aTmp ); + IsFirst = false; + } + else { + // put value to table cell + aValList.push_back(aCell); + } + } + + if( aTable2D.Check() ) { + if(MYDEBUG) std::cout << "aTable2D is checked OK " << aTable2D.myTitle << std::endl; + theContainer.push_back( aTableIDMapper ); + } + + } while ( !aStmIn.eof() ); + aStmIn.close(); + + if(MYDEBUG) std::cout << "After close" << std::endl; +} + + //--------------------------------------------------------------- VISU::TTableIDMapper ::TTableIDMapper(): @@ -404,3 +580,4 @@ VISU::TTableIDMapper myOutput->ShallowCopy( aFilter->GetOutput() ); aFilter->Delete(); } + diff --git a/src/CONVERTOR/VISU_TableReader.hxx b/src/CONVERTOR/VISU_TableReader.hxx index d01d916d..4e6c5114 100644 --- a/src/CONVERTOR/VISU_TableReader.hxx +++ b/src/CONVERTOR/VISU_TableReader.hxx @@ -102,8 +102,13 @@ namespace VISU //--------------------------------------------------------------- typedef std::vector TTableContainer; VISU_CONVERTOR_EXPORT - void ImportTables( const char* theFileName, TTableContainer& theContainer ); + void ImportTables( const char* theFileName, TTableContainer& theContainer, + bool theFirstStrAsTitle = false); + void ImportCSVTable(const char* theFileName, + TTableContainer& theContainer, + bool theFirstStrAsTitle, + const char theSeparator); //--------------------------------------------------------------- } diff --git a/src/ENGINE/VISU_Engine_i.cc b/src/ENGINE/VISU_Engine_i.cc index 2d0f66ad..117e5473 100644 --- a/src/ENGINE/VISU_Engine_i.cc +++ b/src/ENGINE/VISU_Engine_i.cc @@ -165,8 +165,10 @@ namespace VISU{ } - SALOMEDS::SObject_ptr VISU_Gen_i::ImportTables(const char* theFileName){ - return myVisuGen->ImportTables(theFileName); + SALOMEDS::SObject_ptr VISU_Gen_i::ImportTables(const char* theFileName, + bool theFirstStrAsTitle) + { + return myVisuGen->ImportTables(theFileName,theFirstStrAsTitle); } diff --git a/src/ENGINE/VISU_Engine_i.hh b/src/ENGINE/VISU_Engine_i.hh index 950246d3..97cff3cd 100644 --- a/src/ENGINE/VISU_Engine_i.hh +++ b/src/ENGINE/VISU_Engine_i.hh @@ -57,8 +57,10 @@ namespace VISU virtual ViewManager_ptr GetViewManager(); - virtual SALOMEDS::SObject_ptr ImportTables(const char* theFileName); - virtual CORBA::Boolean ExportTableToFile(SALOMEDS::SObject_ptr theTable, const char* theFileName); + virtual SALOMEDS::SObject_ptr ImportTables(const char* theFileName, + bool theFirstStrAsTitle = false); + virtual CORBA::Boolean ExportTableToFile(SALOMEDS::SObject_ptr theTable, + const char* theFileName); //Create Result virtual Result_ptr ImportFile(const char* theFileName); @@ -68,15 +70,18 @@ namespace VISU virtual Result_ptr ImportMedField(SALOME_MED::FIELD_ptr theField); //Create Presentation Of Submeshes - virtual Mesh_ptr MeshOnEntity(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity); + virtual Mesh_ptr MeshOnEntity(Result_ptr theResult, const char* theMeshName, + VISU::Entity theEntity); virtual Mesh_ptr FamilyMeshOnEntity(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, const char* theFamilyName); - virtual Mesh_ptr GroupMesh(Result_ptr theResult, const char* theMeshName, const char* theGroupName); + virtual Mesh_ptr GroupMesh(Result_ptr theResult, const char* theMeshName, + const char* theGroupName); //Rename Presentation Of Submeshes virtual void RenameEntityInStudy(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, const char* theNewName); - virtual void RenameFamilyInStudy(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, + virtual void RenameFamilyInStudy(Result_ptr theResult, const char* theMeshName, + VISU::Entity theEntity, const char* theFamilyName, const char* theNewName); virtual void RenameGroupInStudy (Result_ptr theResult, const char* theMeshName, const char* theGroupName, const char* theNewName); diff --git a/src/VISUGUI/VISU_msg_en.ts b/src/VISUGUI/VISU_msg_en.ts index d6fa0e1c..22d1baf4 100644 --- a/src/VISUGUI/VISU_msg_en.ts +++ b/src/VISUGUI/VISU_msg_en.ts @@ -987,7 +987,7 @@ Please, refer to the documentation. FLT_TABLE_FILES - Tables (*.txt *.tab) + Tables (*.txt *.tab *.csv) IMPORT_FROM_FILE @@ -1388,6 +1388,10 @@ Please, refer to the documentation. USE_BUILD_PROGRESS Use build progress + + FIRST_STR_AS_TITLE + Use first string as title + MEN_LOAD_COMPONENT_DATA Load Component Data diff --git a/src/VISUGUI/VisuGUI.cxx b/src/VISUGUI/VisuGUI.cxx index 792634a7..97ba5489 100644 --- a/src/VISUGUI/VisuGUI.cxx +++ b/src/VISUGUI/VisuGUI.cxx @@ -327,14 +327,32 @@ VisuGUI aFilter.append( tr("FLT_TABLE_FILES") ); aFilter.append( tr("FLT_ALL_FILES") ); - QString anInitialPath = ""; - if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() ) - anInitialPath = QDir::currentPath(); - - QStringList aFiles = SUIT_FileDlg::getOpenFileNames(GetDesktop(this), - anInitialPath, - aFilter, - tr("TLT_IMPORT_TABLE")); + //QString anInitialPath = ""; + //if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() ) + // anInitialPath = QDir::currentPath(); + + //QStringList aFiles = SUIT_FileDlg::getOpenFileNames(GetDesktop(this), + // anInitialPath, + // aFilter, + // tr("TLT_IMPORT_TABLE")); + + SUIT_ResourceMgr* aResourceMgr = GetResourceMgr(); + bool aFirstStrAsTitle = aResourceMgr->booleanValue("VISU", "first_str_as_title", false); + + SalomeApp_CheckFileDlg fd( GetDesktop(this), true, tr("FIRST_STR_AS_TITLE") ); + fd.setWindowTitle( tr( "IMPORT_FROM_FILE" ) ); + fd.setFileMode( SalomeApp_CheckFileDlg::ExistingFiles ); + fd.setFilters( aFilter ); + fd.SetChecked( aFirstStrAsTitle ); + if ( SalomeApp_CheckFileDlg::getLastVisitedPath().isEmpty() ) + fd.setDirectory( QDir::currentPath() ); + + QStringList aFiles; + if ( !fd.exec() ) + return; // cancelled, return + aFiles = fd.selectedFiles(); + aFirstStrAsTitle = fd.IsChecked(); + if ( aFiles.count() == 0 ) return; // nothing selected @@ -351,7 +369,9 @@ VisuGUI QString anInfo( tr("TLT_IMPORT_TABLE") + " " + aFileInfo.filePath() + " ..." ); application()->putInfo( anInfo ); - CORBA::Object_var anObject = GetVisuGen(this)->ImportTables(aFileInfo.filePath().toLatin1().constData()); + CORBA::Object_var anObject = + GetVisuGen(this)->ImportTables(aFileInfo.filePath().toLatin1().constData(), + aFirstStrAsTitle); if (CORBA::is_nil(anObject.in())) { errors.append( QString( "%1 :\n\t%2" ).arg( aFileInfo.filePath() ). @@ -444,6 +464,7 @@ VisuGUI // get name for the file QStringList aFilter; aFilter.append("Table Files (*.txt *.tab)"); + aFilter.append("CSV Table Files (*.csv)"); QFileInfo aFileInfo = SUIT_FileDlg::getFileName(GetDesktop(this), diff --git a/src/VISU_I/VISU_DumpPython.cc b/src/VISU_I/VISU_DumpPython.cc index e07a785f..b8356d85 100644 --- a/src/VISU_I/VISU_DumpPython.cc +++ b/src/VISU_I/VISU_DumpPython.cc @@ -1662,8 +1662,13 @@ namespace VISU if (aTypeName == "ImportTables") { QString aFileName = VISU::Storable::FindValue(aMap,"myFileName",&anIsExist); if(anIsExist){ - std::string aName = GenerateName(theSObject,theName2EntryMap,theEntry2NameMap); - theStr<GetProperties()->IsLocked()) return SALOMEDS::SObject::_nil(); - SALOMEDS::SObject_var aRes = VISU::ImportTables(theFileName,myStudyDocument); + SALOMEDS::SObject_var aRes = VISU::ImportTables(theFileName,myStudyDocument, + theFirstStrAsTitle); SALOMEDS::Study_var aStudy = aRes->GetStudy(); SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(aRes); diff --git a/src/VISU_I/VISU_Gen_i.hh b/src/VISU_I/VISU_Gen_i.hh index 32eec815..951688c9 100644 --- a/src/VISU_I/VISU_Gen_i.hh +++ b/src/VISU_I/VISU_Gen_i.hh @@ -78,7 +78,7 @@ namespace VISU virtual SALOMEDS::SObject_ptr - ImportTables(const char* theFileName); + ImportTables(const char* theFileName, bool theFirstStrAsTitle = false); virtual CORBA::Boolean diff --git a/src/VISU_I/VISU_Table_i.cc b/src/VISU_I/VISU_Table_i.cc index fa9e334a..7b1f7a0e 100644 --- a/src/VISU_I/VISU_Table_i.cc +++ b/src/VISU_I/VISU_Table_i.cc @@ -1196,13 +1196,14 @@ SALOMEDS::SObject_var VISU::Container_i::GetSObject() } SALOMEDS::SObject_var -VISU::ImportTables(const char* theFileName, SALOMEDS::Study_ptr theStudy) +VISU::ImportTables(const char* theFileName, SALOMEDS::Study_ptr theStudy, + bool theFirstStrAsTitle) { // Set "C" numeric locale to import numbers correctly Kernel_Utils::Localizer loc; TTableContainer aContainer; - ImportTables( theFileName, aContainer ); + ImportTables( theFileName, aContainer, theFirstStrAsTitle ); if ( aContainer.empty() ) return SALOMEDS::SObject::_nil(); @@ -1217,10 +1218,10 @@ VISU::ImportTables(const char* theFileName, SALOMEDS::Study_ptr theStudy) anAttr = aStudyBuilder->FindOrCreateAttribute(aFileObject, "AttributeString"); SALOMEDS::AttributeString_var aComment = SALOMEDS::AttributeString::_narrow(anAttr); QString aString; - aString.sprintf("myComment=ImportTables;myFileName=%s", - aFileInfo.absoluteFilePath().toLatin1().data()); + aString.sprintf("myComment=ImportTables;myFileName=%s;myFirstStrAsTitle=%d", + aFileInfo.absoluteFilePath().toLatin1().data(),theFirstStrAsTitle); aComment->SetValue(aString.toLatin1().data()); - for(int i = 0, iEnd = aContainer.size(); i < iEnd; i++){ + for(int i = 0, iEnd = aContainer.size(); i < iEnd; i++) { PTableIDMapper aTableIDMapper = aContainer[i]; const TTable2D& aTable2D = *aTableIDMapper; SALOMEDS::SObject_var aRealObject = aStudyBuilder->NewObject(aFileObject); @@ -1229,7 +1230,8 @@ VISU::ImportTables(const char* theFileName, SALOMEDS::Study_ptr theStudy) if(MYDEBUG) MESSAGE("aTable2D.myTitle = "<SetValue(aTable2D.myTitle.c_str()); - } else { + } + else { QString aNewName; aNewName.sprintf("Table:%d",i); aName->SetValue(aNewName.toLatin1().data()); @@ -1242,10 +1244,10 @@ VISU::ImportTables(const char* theFileName, SALOMEDS::Study_ptr theStudy) aTable2D.getColumns(aNewTable2D); int kEnd = aNewTable2D.myRows[0].myValues.size(); aTableOfReal->SetNbColumns(kEnd); - for(int j = 0, jEnd = aNewTable2D.myRows.size(); j < jEnd; j++){ + for(int j = 0, jEnd = aNewTable2D.myRows.size(); j < jEnd; j++) { if(MYDEBUG) MESSAGE("j = "<=0) { + aStr.insert(index,'"'); + if( index+2 >= aStr.size() ) break; + index = aStr.indexOf('"',index+2); + } + index = aStr.indexOf(aSep); + if(index>=0) { + // current string contains separator => need to use "..." + aStr.insert(0,'"'); + aStr.push_back('"'); + } +} + + +//======================================================================= +//function : ExportTableToFile +//purpose : +//======================================================================= template bool ExportTableToFile(const TTableAttr& aTabAttr, const char* theFileName) { @@ -1284,6 +1312,49 @@ template bool ExportTableToFile(const TTableAttr& aTabAttr, SALOMEDS::StringSeq_var aRowUnits = aTabAttr->GetRowUnits(); SALOMEDS::StringSeq_var aColumnTitles = aTabAttr->GetColumnTitles(); + //-------------------------------------------------- + // write as *.csv file if it is needed + //-------------------------------------------------- + QString tmp(theFileName); + tmp = tmp.trimmed(); + tmp = tmp.right(3).trimmed(); + if( tmp == QString("csv") ) { + const char aSep = ','; + // write column titles + QString aLine(aRowTitles[0]); + updateStrForCSV(aLine,aSep); + for(int i=1; iHasValue(j,1)) { + aLine = aValue.sprintf("%.16g",(double)aTabAttr->GetValue(1,j)); + } + for (int i = 2; i <= aRowsNb; i++) { + if(aTabAttr->HasValue(i,j)) { + aLine += aSep + aValue.sprintf("%.16g",(double)aTabAttr->GetValue(i,j)); + } + else aLine += aSep; + } + aLine += "\n"; + aFile.write(aLine.toLatin1() ); + } + + aFile.close(); + return true; + } + //-------------------------------------------------- + // end of writing as *.csv file + //-------------------------------------------------- + /* The given table is rare (some cells is empty) or not? */ bool isRareTable = false; for (int i = 1; i <= aRowsNb; i++) @@ -1312,7 +1383,13 @@ template bool ExportTableToFile(const TTableAttr& aTabAttr, /* COLUMN_TITLES */ if ( anAbscissTitle.length() || anOrdinate.length() ) { - aLine = "#COLUMN_TITLES: " + anAbscissTitle + " | " + anOrdinate + "\n"; + aLine = "#COLUMN_TITLES: " + anAbscissTitle + " | " + anOrdinate; + int tmpind = aLine.indexOf("\n"); + while(tmpind>=0) { + aLine.remove(tmpind,1); + tmpind = aLine.indexOf("\n"); + } + aLine += "\n"; aFile.write(aLine.toLatin1() ); } @@ -1352,17 +1429,21 @@ template bool ExportTableToFile(const TTableAttr& aTabAttr, QString aUnitsSep = ""; QString aTitlesStr = "#COLUMN_TITLES: "; QString aUnitsStr = "#COLUMN_UNITS: "; - for (int i = 1; i <= aRowsNb; i++) - { - if (!QString(aRowTitles[i-1]).trimmed().isEmpty()) { - aTitlesStr += (aTitlesSep + aRowTitles[i-1]); - if (aTitlesSep.isEmpty()) aTitlesSep = " | "; - } - if (!QString(aRowUnits[i-1]).trimmed().isEmpty()) { - aUnitsStr += (aUnitsSep + aRowUnits[i-1]); - if (aUnitsSep.isEmpty()) aUnitsSep = " "; - } + for (int i = 1; i <= aRowsNb; i++) { + if (!QString(aRowTitles[i-1]).trimmed().isEmpty()) { + aTitlesStr += (aTitlesSep + aRowTitles[i-1]); + if (aTitlesSep.isEmpty()) aTitlesSep = " | "; + } + if (!QString(aRowUnits[i-1]).trimmed().isEmpty()) { + aUnitsStr += (aUnitsSep + aRowUnits[i-1]); + if (aUnitsSep.isEmpty()) aUnitsSep = " "; } + } + int tmpind = aTitlesStr.indexOf("\n"); + while(tmpind>=0) { + aTitlesStr.remove(tmpind,1); + tmpind = aTitlesStr.indexOf("\n"); + } aTitlesStr += "\n"; aUnitsStr += "\n"; aFile.write(aTitlesStr.toLatin1()); @@ -1370,22 +1451,20 @@ template bool ExportTableToFile(const TTableAttr& aTabAttr, /* CURVE COORDINATES */ QString aSep, aValue, aColTitle; - for (int j = 1; j <= aColNb; j++) - { - aLine = ""; aSep = ""; - for (int i = 1; i <= aRowsNb; i++) - { - aLine += (aSep + aValue.sprintf("%.16g", (double)(aTabAttr->GetValue(i,j)))); - if (aSep.isEmpty()) aSep = " "; - } - if (!aLine.trimmed().isEmpty()) { - aColTitle = aColumnTitles[j-1]; - if (!aColTitle.trimmed().isEmpty()) - aLine = aLine + " #TITLE: " + aColTitle; - aLine += "\n"; - aFile.write(aLine.toLatin1()); - } + for (int j = 1; j <= aColNb; j++) { + aLine = ""; aSep = ""; + for (int i = 1; i <= aRowsNb; i++) { + aLine += (aSep + aValue.sprintf("%.16g", (double)(aTabAttr->GetValue(i,j)))); + if (aSep.isEmpty()) aSep = " "; } + if (!aLine.trimmed().isEmpty()) { + aColTitle = aColumnTitles[j-1]; + if (!aColTitle.trimmed().isEmpty()) + aLine = aLine + " #TITLE: " + aColTitle; + aLine += "\n"; + aFile.write(aLine.toLatin1()); + } + } } //end of else aFile.close(); @@ -1396,17 +1475,15 @@ bool VISU::ExportTableToFile(SALOMEDS::SObject_ptr theTable, const char* theFile { //Find table SALOMEDS::GenericAttribute_var anAttr ; - if (theTable->FindAttribute(anAttr, "AttributeTableOfReal")) - { - SALOMEDS::AttributeTableOfReal_var aTabAttr = SALOMEDS::AttributeTableOfReal ::_narrow(anAttr); - return ExportTableToFile ( aTabAttr , theFileName); - - } + if (theTable->FindAttribute(anAttr, "AttributeTableOfReal")) { + SALOMEDS::AttributeTableOfReal_var aTabAttr = + SALOMEDS::AttributeTableOfReal ::_narrow(anAttr); + return ExportTableToFile ( aTabAttr , theFileName); + } else if (theTable->FindAttribute(anAttr, "AttributeTableOfInteger")) { - - SALOMEDS::AttributeTableOfInteger_var aTabAttr = SALOMEDS::AttributeTableOfInteger ::_narrow(anAttr); + SALOMEDS::AttributeTableOfInteger_var aTabAttr = + SALOMEDS::AttributeTableOfInteger ::_narrow(anAttr); return ExportTableToFile ( aTabAttr , theFileName); - } return false; } diff --git a/src/VISU_I/VISU_Table_i.hh b/src/VISU_I/VISU_Table_i.hh index 4303f6b6..78c6776a 100644 --- a/src/VISU_I/VISU_Table_i.hh +++ b/src/VISU_I/VISU_Table_i.hh @@ -84,7 +84,8 @@ namespace VISU{ virtual std::string GetObjectEntry(); }; - SALOMEDS::SObject_var ImportTables(const char* theFileName, SALOMEDS::Study_ptr theStudy); + SALOMEDS::SObject_var ImportTables(const char* theFileName, SALOMEDS::Study_ptr theStudy, + bool theFirstStrAsTitle = false); bool ExportTableToFile(SALOMEDS::SObject_ptr theTable, const char* theFileName); //============================================================================== class VISU_I_EXPORT Curve_i : public virtual POA_VISU::Curve, -- 2.39.2