X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_ImportPolylineOp.cxx;h=e7faee118be82bfaa64f382d43cdcefd0092be0a;hb=58bb6b7459bebeeb089c9ed486c4683a8bae7288;hp=210ccf587af15d6c3465bcce95a49bd843a1a8cb;hpb=e0ed73f9fe23d646ae3b99ee4446098f10f3cb55;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_ImportPolylineOp.cxx b/src/HYDROGUI/HYDROGUI_ImportPolylineOp.cxx index 210ccf58..e7faee11 100644 --- a/src/HYDROGUI/HYDROGUI_ImportPolylineOp.cxx +++ b/src/HYDROGUI/HYDROGUI_ImportPolylineOp.cxx @@ -1,8 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// +// Copyright (C) 2014-2015 EDF-R&D // 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 @@ -25,12 +21,13 @@ #include "HYDROGUI_DataModel.h" #include "HYDROGUI_Module.h" #include "HYDROGUI_UpdateFlags.h" -#include "HYDROGUI_Tool.h" +#include "HYDROGUI_Tool2.h" #include #include #include #include #include +#include #include @@ -41,7 +38,7 @@ #include #include #include -#include +#include HYDROGUI_ImportPolylineOp::HYDROGUI_ImportPolylineOp( HYDROGUI_Module* theModule ) @@ -61,7 +58,7 @@ void HYDROGUI_ImportPolylineOp::startOperation() myFileDlg = new SUIT_FileDlg( module()->getApp()->desktop(), true ); myFileDlg->setWindowTitle( getName() ); myFileDlg->setFileMode( SUIT_FileDlg::ExistingFiles ); - myFileDlg->setFilter( tr("POLYLINE_FILTER") ); + myFileDlg->setNameFilter( tr("POLYLINE_FILTER") ); connect( myFileDlg, SIGNAL( accepted() ), this, SLOT( onApply() ) ); connect( myFileDlg, SIGNAL( rejected() ), this, SLOT( onCancel() ) ); @@ -77,411 +74,67 @@ void HYDROGUI_ImportPolylineOp::onApply() return; } - QString aFileName = myFileDlg->selectedFile(); - if ( aFileName.isEmpty() ) - { - abort(); - return; - } - - QString anExt = aFileName.split('.', QString::SplitBehavior::SkipEmptyParts).back(); + QStringList aFileNames = myFileDlg->selectedFiles(); + + QApplication::setOverrideCursor( Qt::WaitCursor ); + startDocOperation(); - if (anExt == "shp") + foreach (QString aFileName, aFileNames) { - SHPHandle aHSHP; - aHSHP = SHPOpen( aFileName.toAscii().data(), "rb" ); - Parse(aHSHP); - - QApplication::setOverrideCursor( Qt::WaitCursor ); - - startDocOperation(); + if ( aFileName.isEmpty() ) + continue; - HYDROData_Iterator anIter( doc() ); - int anInd = 0; - QStringList anExistingNames; - std::vector anAllowedIndexes; - for( ; anIter.More(); anIter.Next() ) - anExistingNames.push_back(anIter.Current()->GetName()); + QString anExt = aFileName.split('.', QString::SkipEmptyParts).back(); - QFileInfo aFileInfo(aFileName); - QString aBaseFileName = aFileInfo.baseName(); - - if (aHSHP->nShapeType == 3 || aHSHP->nShapeType == 23) + if (anExt == "shp") { - anInd = 0; - for (;anAllowedIndexes.size() < mySHPObjects.size();) + HYDROData_ShapeFile anImporter; + NCollection_Sequence theEntities; + int aShapeTypeOfFile = -1; + int aStat = anImporter.ImportPolylines(doc(), aFileName, theEntities, aShapeTypeOfFile ); + if (aStat == 1) + UpdateView(theEntities); + else if (aStat == 2) { - if (!anExistingNames.contains(aBaseFileName + "_PolyXY_" + QString::number(anInd))) - { - anAllowedIndexes.push_back(anInd); - anInd++; - } - else - anInd++; + UpdateView(theEntities); + SUIT_MessageBox::information(module()->getApp()->desktop(), + tr( "IMPORT_POLYLINE" ), "Contour of the polygon(s) have been imported as polyline(s)"); } - - for (size_t i = 0; i < mySHPObjects.size(); i++ ) + else { - ProcessSHPPolyXY(mySHPObjects[i], aBaseFileName, anAllowedIndexes[i]); - } - } - else if (aHSHP->nShapeType == 13) - { - anInd = 0; - for (;anAllowedIndexes.size() < mySHPObjects.size();) - { - if (!anExistingNames.contains(aBaseFileName + "_PolyXY_" + QString::number(anInd)) && - !anExistingNames.contains(aBaseFileName + "_Poly3D_" + QString::number(anInd)) && - !anExistingNames.contains(aBaseFileName + "_Bath_" + QString::number(anInd))) - { - anAllowedIndexes.push_back(anInd); - anInd++; - } - else - anInd++; + QString aMess = "Cannot import content of this file as polyline;\n"; + if (aStat == -1) + aMess += "Cannot open SHP file"; + else if (aStat == -2) + aMess += "Cannot open SHX file"; + else + aMess += "The shape type of file is " + anImporter.GetShapeTypeName(aShapeTypeOfFile); + SUIT_MessageBox::warning( module()->getApp()->desktop(), tr( "IMPORT_POLYLINE" ), aMess); } - for (size_t i = 0; i < mySHPObjects.size(); i++ ) - ProcessSHPPoly3D(mySHPObjects[i], aBaseFileName, anAllowedIndexes[i]); } - commitDocOperation(); - commit(); - - for (size_t i = 0; i < mySHPObjects.size(); i++ ) - free (mySHPObjects[i]); - - mySHPObjects.clear(); - SHPClose(aHSHP); } - else if (anExt == "sx") + if (!aFileNames.empty()) { - QFile aFile (aFileName); - aFile.open(QIODevice::ReadOnly); - - Parse(aFile); - - QApplication::setOverrideCursor( Qt::WaitCursor ); - - startDocOperation(); - - ProcessSX(); - commitDocOperation(); commit(); - aFile.close(); + module()->update( UF_Model | UF_VTKViewer | UF_VTK_Forced | UF_VTK_Init | UF_OCCViewer ); } - - module()->update( UF_Model | UF_VTKViewer | UF_VTK_Forced | UF_VTK_Init ); + else + abort(); QApplication::restoreOverrideCursor(); } -void HYDROGUI_ImportPolylineOp::ProcessSX() -{ - Handle(HYDROData_PolylineXY) aPolylineXY = Handle(HYDROData_PolylineXY)::DownCast( doc()->CreateObject( KIND_POLYLINEXY ) ); - - Handle(HYDROData_Polyline3D) aPolylineObj = Handle(HYDROData_Polyline3D)::DownCast( doc()->CreateObject( KIND_POLYLINE ) ); - - Handle(HYDROData_Bathymetry) aBath = Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) ); - HYDROData_Bathymetry::AltitudePoints aAPoints; - - int aNSect = myCurveBlocks.size(); - for ( int i = 0 ; i < aNSect ; i++ ) - { - bool aSectClosure = true; - HYDROData_PolylineXY::SectionType aSectType = HYDROData_PolylineXY::SECTION_POLYLINE; - aPolylineXY->AddSection( TCollection_AsciiString(myCurveBlocks[i].myName.toStdString().c_str()), aSectType, myCurveBlocks[i].myIsConnected ); - - for ( int k = 0 ; k < myCurveBlocks[i].myXYZPoints.size() ; k+=3 ) - { - HYDROData_PolylineXY::Point aSectPoint; - aSectPoint.SetX( myCurveBlocks[i].myXYZPoints[k].X() ); - aSectPoint.SetY( myCurveBlocks[i].myXYZPoints[k].Y() ); - aPolylineXY->AddPoint( i, aSectPoint ); - - aAPoints.Append(myCurveBlocks[i].myXYZPoints[k]); - } - } - QString aFileName = myFileDlg->selectedFile(); - QFileInfo aFileInfo(aFileName); - QString aBaseFileName = aFileInfo.baseName(); - QString aBathName = aBaseFileName + "_bath_1"; - QString aPolyXYName = aBaseFileName + "_polyXY_1"; - QString aPoly3DName = aBaseFileName + "_poly3D_1"; - - int anInd = 2; - for (;HYDROGUI_Tool::FindObjectByName( module(), aBathName, KIND_BATHYMETRY) || - HYDROGUI_Tool::FindObjectByName( module(), aPolyXYName, KIND_POLYLINEXY) || - HYDROGUI_Tool::FindObjectByName( module(), aPoly3DName, KIND_POLYLINE);) - { - aBathName = aBaseFileName + "_bath_" + QString::number(anInd); - aPolyXYName = aBaseFileName + "_polyXY_" + QString::number(anInd); - aPoly3DName = aBaseFileName + "_poly3D_" + QString::number(anInd); - anInd++; - } - - aPolylineXY->SetName( aPolyXYName ); - aPolylineXY->SetWireColor(HYDROData_PolylineXY::DefaultWireColor()); - aPolylineXY->Update(); - - aBath->SetAltitudePoints(aAPoints); - aBath->SetName( aBathName ); - - aPolylineObj->SetPolylineXY (aPolylineXY, false); - aPolylineObj->SetAltitudeObject(aBath); - - aPolylineObj->SetBorderColor( HYDROData_Polyline3D::DefaultBorderColor() ); - aPolylineObj->SetName( aPoly3DName ); - - aPolylineObj->Update(); - - size_t anActiveViewId = HYDROGUI_Tool::GetActiveGraphicsViewId( module() ); - if ( anActiveViewId == 0 ) - anActiveViewId = HYDROGUI_Tool::GetActiveOCCViewId( module() ); - - module()->setObjectVisible( anActiveViewId, aPolylineXY, true ); - module()->setObjectVisible( anActiveViewId, aPolylineObj, true ); - - module()->setIsToUpdate( aPolylineObj ); -} - -void HYDROGUI_ImportPolylineOp::ProcessSHPPolyXY(SHPObject* anObj, QString theFileName, int theInd) -{ - //if (anObj->nSHPType != SHPT_ARC && anObj->nSHPType != SHPT_ARCM) - // return false; - Handle(HYDROData_PolylineXY) aPolylineXY = Handle(HYDROData_PolylineXY)::DownCast( doc()->CreateObject( KIND_POLYLINEXY ) ); - - int nParts = anObj->nParts; - for ( int i = 0 ; i < nParts ; i++ ) - { - int StartIndex = anObj->panPartStart[i]; - int EndIndex; - if (i != nParts - 1) - EndIndex = anObj->panPartStart[i + 1]; - else - EndIndex = anObj->nVertices; - - bool IsClosed = false; - HYDROData_PolylineXY::SectionType aSectType = HYDROData_PolylineXY::SECTION_POLYLINE; - if (anObj->padfX[StartIndex] == anObj->padfX[EndIndex - 1] && - anObj->padfY[StartIndex] == anObj->padfY[EndIndex - 1] ) - { - IsClosed = true; - aPolylineXY->AddSection( TCollection_AsciiString( ("poly_section_" + QString::number(i)).data()->toAscii()), aSectType, true); - } - else - aPolylineXY->AddSection( TCollection_AsciiString( ("poly_section_" + QString::number(i)).data()->toAscii()), aSectType, false); - - if (IsClosed) - EndIndex--; - for ( int k = StartIndex; k < EndIndex ; k++ ) - { - HYDROData_PolylineXY::Point aSectPoint; - aSectPoint.SetX( anObj->padfX[k] ); - aSectPoint.SetY( anObj->padfY[k] ); - aPolylineXY->AddPoint( i, aSectPoint ); - } - - } - - aPolylineXY->SetWireColor( HYDROData_PolylineXY::DefaultWireColor() ); - aPolylineXY->SetName( theFileName + "_PolyXY_" + QString::number(theInd) ); - - aPolylineXY->Update(); - - size_t anActiveViewId = HYDROGUI_Tool::GetActiveGraphicsViewId( module() ); - if ( anActiveViewId == 0 ) - anActiveViewId = HYDROGUI_Tool::GetActiveOCCViewId( module() ); - - module()->setObjectVisible( anActiveViewId, aPolylineXY, true ); - - module()->setIsToUpdate( aPolylineXY ); -} - -void HYDROGUI_ImportPolylineOp::ProcessSHPPoly3D(SHPObject* anObj, QString theFileName, int theInd) +void HYDROGUI_ImportPolylineOp::UpdateView( NCollection_Sequence& anEntities) { - Handle(HYDROData_PolylineXY) aPolylineXY = Handle(HYDROData_PolylineXY)::DownCast( doc()->CreateObject( KIND_POLYLINEXY ) ); - - Handle(HYDROData_Polyline3D) aPolylineObj = Handle(HYDROData_Polyline3D)::DownCast( doc()->CreateObject( KIND_POLYLINE ) ); - - Handle(HYDROData_Bathymetry) aBath = Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) ); - HYDROData_Bathymetry::AltitudePoints aAPoints; - - int nParts = anObj->nParts; - for ( int i = 0 ; i < nParts ; i++ ) - { - //bool aSectClosure = true; - int StartIndex = anObj->panPartStart[i]; - int EndIndex; - if (i != nParts - 1) - EndIndex = anObj->panPartStart[i + 1]; - else - EndIndex = anObj->nVertices; - - bool IsClosed = false; - HYDROData_PolylineXY::SectionType aSectType = HYDROData_PolylineXY::SECTION_POLYLINE; - if (anObj->padfX[StartIndex] == anObj->padfX[EndIndex - 1] && - anObj->padfY[StartIndex] == anObj->padfY[EndIndex - 1] && - anObj->padfZ[StartIndex] == anObj->padfZ[EndIndex - 1]) - { - IsClosed = true; - aPolylineXY->AddSection( TCollection_AsciiString( ("poly_section_" + QString::number(i)).data()->toAscii()), aSectType, true ); - } - else - aPolylineXY->AddSection( TCollection_AsciiString( ("poly_section_" + QString::number(i)).data()->toAscii()), aSectType, false ); - - if (IsClosed) - EndIndex--; - for ( int k = StartIndex ; k < EndIndex ; k++ ) - { - HYDROData_PolylineXY::Point aSectPoint; - aSectPoint.SetX( anObj->padfX[k] ); - aSectPoint.SetY( anObj->padfY[k] ); - aPolylineXY->AddPoint( i, aSectPoint ); - aAPoints.Append(gp_XYZ (anObj->padfX[k], anObj->padfY[k], anObj->padfZ[k])); - } - } - - - QString aBathName = theFileName + "_bath_" + QString::number(theInd); - QString aPolyXYName = theFileName + "_polyXY_" + QString::number(theInd); - QString aPoly3DName = theFileName + "_poly3D_" + QString::number(theInd); - - aPolylineXY->SetName( aPolyXYName ); - aPolylineXY->SetWireColor(HYDROData_PolylineXY::DefaultWireColor()); - aPolylineXY->Update(); - - aBath->SetAltitudePoints(aAPoints); - aBath->SetName( aBathName ); - - aPolylineObj->SetPolylineXY (aPolylineXY, false); - aPolylineObj->SetAltitudeObject(aBath); - - aPolylineObj->SetBorderColor( HYDROData_Polyline3D::DefaultBorderColor() ); - aPolylineObj->SetName( aPoly3DName ); - - aPolylineObj->Update(); - size_t anActiveViewId = HYDROGUI_Tool::GetActiveGraphicsViewId( module() ); if ( anActiveViewId == 0 ) anActiveViewId = HYDROGUI_Tool::GetActiveOCCViewId( module() ); - module()->setObjectVisible( anActiveViewId, aPolylineXY, true ); - module()->setObjectVisible( anActiveViewId, aPolylineObj, true ); - - module()->setIsToUpdate( aPolylineObj ); -} - - -bool HYDROGUI_ImportPolylineOp::Parse( QFile& theFile) -{ - if ( !theFile.isOpen() ) - return false; - - QString aLine; - QString aBLine; - QStringList aList; - QStringList aBList; - myCurveBlocks.clear(); - bool aTotStat = true; - - aLine = theFile.readLine().simplified(); - aList = aLine.split( ' ', QString::SkipEmptyParts ); - - for (;!theFile.atEnd();) + for (int i = 1; i <= anEntities.Size() ; i++) { - if (aList[0] == "B" && (aList[1] == "C" || aList[1] == "P" || aList[1] == "N")) - { - HYDROGUI_CurveBlock aCurveBlockInfo; - if (aList[1] == "C") - aCurveBlockInfo.myType = 1; - else if (aList[1] == "P") - aCurveBlockInfo.myType = 2; - else if (aList[1] == "N") - aCurveBlockInfo.myType = 2; - - if (aList.size() == 9) - { - for (int j = 2; j < 8; j++) - aCurveBlockInfo.myRefCoords.push_back(aList[j].toDouble()); - aCurveBlockInfo.myRefRatio = aList[8].toDouble(); - } - - QString Name; - do - { - aBLine = theFile.readLine().simplified(); - aBList = aBLine.split( ' ', QString::SkipEmptyParts ); - - if (aBList[0] == "CP") - { - if (aBList.size() == 2 && (aBList[1] == "0" || aBList[1] == "1" || aBList[1] == "2")) - aCurveBlockInfo.myCurvePlane = aBList[1].toInt(); - else if (aBList.size() == 3 && (aBList[1] == "0" || aBList[1] == "1") && (aBList[2] == "0" || aBList[2] == "1")) - { - aCurveBlockInfo.myIsClosed = aBList[1].toInt(); - aCurveBlockInfo.myIsClosed = aBList[2].toInt(); - } - else - { - for (int j = 1; j < aBList.size(); j++) - aCurveBlockInfo.myAdditionalCurveInfo.push_back(aBList[j].toDouble()); - } - } - if (aBList[0] == "CN") - { - for (int i = 1; i < aBList.size(); i++) - Name += aBList[i] + "_"; - Name.remove(Name.size() - 1, 1); - aCurveBlockInfo.myName = Name; - } - } while (!theFile.atEnd() && aBLine[0] == 'C' ); - - bool aStat; - aTotStat = true; - do - { - if (aBList.size() >= 3 && aBLine[0] != 'B' && aBLine[0] != 'C') { - gp_XYZ anXYZ; - anXYZ.SetX (aBList[0].toDouble(&aStat)); - aTotStat = aTotStat && aStat; - anXYZ.SetY (aBList[1].toDouble(&aStat)); - aTotStat = aTotStat && aStat; - anXYZ.SetZ (aBList[2].toDouble(&aStat)); - aTotStat = aTotStat && aStat; - - aCurveBlockInfo.myXYZPoints.push_back(anXYZ); - - aBLine = theFile.readLine().simplified(); - aBList = aBLine.split( ' ', QString::SkipEmptyParts ); - } - else - break; - - } while (!theFile.atEnd()/* && aBLine[0] == 'B'*/ ); - if (aTotStat) - myCurveBlocks.push_back(aCurveBlockInfo); - - } - else - { - aLine = theFile.readLine().simplified(); - aList = aLine.split( ' ', QString::SkipEmptyParts ); - } - + anEntities(i)->Update(); + module()->setObjectVisible( anActiveViewId, anEntities(i), true ); + module()->setIsToUpdate( anEntities(i) ); } - - return true; - } - -void HYDROGUI_ImportPolylineOp::Parse(SHPHandle theHandle) -{ - int aShapeType; - mySHPObjects.clear(); - SHPGetInfo( theHandle, NULL, &aShapeType, NULL, NULL ); - if (aShapeType == 3 || aShapeType == 13 || aShapeType == 23) - { - for (int i = 0; i < theHandle->nRecords; i++) - mySHPObjects.push_back(SHPReadObject(theHandle, i)); - } -} \ No newline at end of file