X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_ImportLandCoverMapOp.cxx;h=5cb9d9478c73085f4c5aa6accd6cdfabae58dbde;hb=58bb6b7459bebeeb089c9ed486c4683a8bae7288;hp=5490f57fd530b1866b24c009303ce17fa0064d15;hpb=0f2cb979c8d6ea008efeb10454f30da10b0daa8a;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_ImportLandCoverMapOp.cxx b/src/HYDROGUI/HYDROGUI_ImportLandCoverMapOp.cxx index 5490f57f..5cb9d947 100644 --- a/src/HYDROGUI/HYDROGUI_ImportLandCoverMapOp.cxx +++ b/src/HYDROGUI/HYDROGUI_ImportLandCoverMapOp.cxx @@ -25,75 +25,68 @@ #include "HYDROGUI_DataModel.h" #include "HYDROGUI_Module.h" #include "HYDROGUI_UpdateFlags.h" -#include "HYDROGUI_Tool.h" +#include "HYDROGUI_Tool2.h" #include "HYDROGUI_ImportLandCoverMapDlg.h" #include "HYDROGUI_Shape.h" -#include #include - #include #include #include #include +#include +#include #include #include -#include - -#include -#include -#include #include +#include +#include #include #include #include - #include #include #include #include -#include - -#include -#include #include #include #include #include -#include + +#include +#include +#include + +#include + +#define MAX_LCM_NAME_INDEX 1000 HYDROGUI_ImportLandCoverMapOp::HYDROGUI_ImportLandCoverMapOp( HYDROGUI_Module* theModule ) : HYDROGUI_Operation( theModule ) { - setName( tr( "IMPORT_LANDCOVERMAP" ) ); + setName( tr( "IMPORT_LANDCOVER_MAP" ) ); } HYDROGUI_ImportLandCoverMapOp::~HYDROGUI_ImportLandCoverMapOp() { erasePreview(); + myImporter.Free(); + myAttrValue.clear(); } void HYDROGUI_ImportLandCoverMapOp::startOperation() { HYDROGUI_Operation::startOperation(); - if ( !getPreviewManager() ) { - setPreviewManager( ::qobject_cast( - module()->getApp()->getViewManager( OCCViewer_Viewer::Type(), true ) ) ); - } + if ( !getPreviewManager() ) + setPreviewManager( ::qobject_cast( module()->getApp()->getViewManager( OCCViewer_Viewer::Type(), true ) ) ); - if ( !isApplyAndClose() ) { + HYDROGUI_ImportLandCoverMapDlg* aPanel = ::qobject_cast( inputPanel() ); + if ( !aPanel ) return; - } - - HYDROGUI_ImportLandCoverMapDlg* aPanel = - ::qobject_cast( inputPanel() ); - if ( !aPanel ) { - return; - } aPanel->reset(); } @@ -120,93 +113,102 @@ void HYDROGUI_ImportLandCoverMapOp::onFileSelected() return; } - QString anExt = myFileName.split('.', QString::SkipEmptyParts).back(); - - if (anExt == "shp") - { - startDocOperation(); - QApplication::setOverrideCursor(Qt::WaitCursor); - - QStringList aPolygonsList; - myPolygonFaces.Clear(); - myImporter.Free(); + startDocOperation(); + QApplication::setOverrideCursor(Qt::WaitCursor); + + QStringList aPolygonsList; + myPolygonFaces.Clear(); + myImporter.Free(); - SalomeApp_Study* aStudy = dynamic_cast( module()->getApp()->activeStudy() ); - if ( !aStudy ) - return; + SalomeApp_Study* aStudy = dynamic_cast( module()->getApp()->activeStudy() ); + if ( !aStudy ) + return; - erasePreview(); + erasePreview(); - Handle(AIS_InteractiveContext) aCtx = NULL; - int aShapeTypeOfFile = -1; + Handle(AIS_InteractiveContext) aCtx = NULL; + int aShapeTypeOfFile = -1; - //Import polygons from SHP file as faces - //This faces should be added to the new LCM object + //Import polygons from SHP file as faces + //This faces should be added to the new LCM object - int aStat = myImporter.ImportPolygons(myFileName, aPolygonsList, myPolygonFaces, aShapeTypeOfFile); - if (aStat == 1) - { - aPanel->setPolygonNames(aPolygonsList); + int aStat = myImporter.ImportPolygons(doc(), myFileName, aPolygonsList, myPolygonFaces, aShapeTypeOfFile); + if (aStat == 1) + { + aPanel->setPolygonNames(aPolygonsList); - LightApp_Application* anApp = module()->getApp(); - if ( !getPreviewManager() ) - setPreviewManager( ::qobject_cast( anApp->getViewManager( OCCViewer_Viewer::Type(), true ) ) ); - OCCViewer_ViewManager* aViewManager = getPreviewManager(); + LightApp_Application* anApp = module()->getApp(); + if ( !getPreviewManager() ) + setPreviewManager( ::qobject_cast( anApp->getViewManager( OCCViewer_Viewer::Type(), true ) ) ); + OCCViewer_ViewManager* aViewManager = getPreviewManager(); - if ( aViewManager ) + if ( aViewManager ) + { + if ( OCCViewer_Viewer* aViewer = aViewManager->getOCCViewer() ) { - if ( OCCViewer_Viewer* aViewer = aViewManager->getOCCViewer() ) - { - aCtx = aViewer->getAISContext(); - connect( aViewer, SIGNAL( selectionChanged() ), this, SLOT( onViewerSelectionChanged() ) ); - } + aCtx = aViewer->getAISContext(); + connect( aViewer, SIGNAL( selectionChanged() ), this, SLOT( onViewerSelectionChanged() ) ); } + } - for ( int i = 1; i <= myPolygonFaces.Length(); i++ ) - { - TopoDS_Face aFace = TopoDS::Face(myPolygonFaces.Value( i )); - if ( aViewManager && !aCtx.IsNull() ) - { - HYDROGUI_Shape* aShape = new HYDROGUI_Shape( aCtx, NULL, getPreviewZLayer() ); - //Green color for now.. - aShape->setFillingColor(QColor(0,255,0), false, false); - aShape->setBorderColor(QColor(0,255,0), false, false); - if( !aFace.IsNull() ) - aShape->setShape( aFace); - - myPolygonName2PrsShape.insert( "polygon_" + QString::number(i), aShape); - } - } - if ( !aCtx.IsNull() ) + for ( int i = 1; i <= myPolygonFaces.Length(); i++ ) + { + TopoDS_Face aFace = TopoDS::Face(myPolygonFaces.Value( i )); + if ( aViewManager && !aCtx.IsNull() ) { - UpdateZLayersOfHilightPresentationsOfDisplayedObjects( aCtx, Graphic3d_ZLayerId_TopOSD ); - aCtx->UpdateCurrentViewer(); + HYDROGUI_Shape* aShape = new HYDROGUI_Shape( aCtx, NULL, getPreviewZLayer() ); + //Preview color is grey + aShape->setFillingColor(QColor(50,50,50), false, false); + aShape->setBorderColor(QColor(50,50,50), false, false); + if( !aFace.IsNull() ) + aShape->setShape( aFace); + + myPolygonName2PrsShape.insert( tr( "DEF_POLYGON_NAME" ) + "_" + QString::number(i), aShape); } - // - QApplication::restoreOverrideCursor(); - commitDocOperation(); } - else + + if ( !aCtx.IsNull() ) { - erasePreview(); - aPanel->setPolygonNames(QStringList()); - aPanel->setObjectName(""); - QApplication::restoreOverrideCursor(); - QString aMess = "Cannot import land cover;\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 " + myImporter.GetShapeTypeName(aShapeTypeOfFile); - SUIT_MessageBox::warning( module()->getApp()->desktop(), tr( "IMPORT_LANDCOVER" ), aMess); - commitDocOperation(); - myImporter.Free(); - //abort(); + UpdateZLayersOfHilightPresentationsOfDisplayedObjects( aCtx, Graphic3d_ZLayerId_TopOSD ); + aCtx->UpdateCurrentViewer(); } - + // + QApplication::restoreOverrideCursor(); + aPanel->setFirstPageState(true); + // + //Try to load DBF-database... + QString aDBFFileName; + aDBFFileName = myFileName.simplified().replace( myFileName.simplified().size() - 4, 4, ".dbf"); + bool DBF_Stat = myImporter.DBF_OpenDBF(aDBFFileName); + // TODO: + // add MSG BOX if stat is bad + if (DBF_Stat) + { + myFieldList = myImporter.DBF_GetFieldList(); + aPanel->setAttributeNames(myFieldList); + } + aPanel->setDbfState(DBF_Stat); } - + else + { + erasePreview(); + aPanel->setPolygonNames(QStringList()); + aPanel->setObjectName(""); + QApplication::restoreOverrideCursor(); + QString aMess = tr( "CANNT_IMPORT_LCM" ) + "\n"; + if (aStat == -1) + aMess += tr( "CANNT_OPEN_SHP" ); + else if (aStat == -2) + aMess += tr( "CANNT_OPEN_SHX" ); + else + aMess += tr ("SHP_TYPEFORMAT_MESS") + myImporter.GetShapeTypeName(aShapeTypeOfFile); + SUIT_MessageBox::warning( module()->getApp()->desktop(), tr( "IMPORT_LANDCOVER_MAP" ), aMess); + commitDocOperation(); + myImporter.Free(); + //abort(); + aPanel->setFirstPageState(false); + } + } HYDROGUI_InputPanel* HYDROGUI_ImportLandCoverMapOp::createInputPanel() const @@ -214,86 +216,80 @@ HYDROGUI_InputPanel* HYDROGUI_ImportLandCoverMapOp::createInputPanel() const HYDROGUI_InputPanel* aPanel = new HYDROGUI_ImportLandCoverMapDlg( module(), getName() ); connect( aPanel, SIGNAL( FileSelected( const QString& ) ), SLOT( onFileSelected() ) ); - connect( aPanel, SIGNAL( selectionChanged( const QStringList& ) ), this, SLOT( onSelectionChanged( const QStringList& ) ) ); - connect( aPanel, SIGNAL( Next( const int ) ), SLOT( onNext( const int ) ) ); - connect( aPanel, SIGNAL( Back( const int ) ), SLOT( onBack( const int ) ) ); - connect( aPanel, SIGNAL( Finish( const int ) ), SLOT( onFinish( const int ) ) ); return aPanel; } bool HYDROGUI_ImportLandCoverMapOp::processApply( int& theUpdateFlags, - QString& theErrorMsg, - QStringList& theBrowseObjectsEntries ) + QString& theErrorMsg, + QStringList& theBrowseObjectsEntries ) { HYDROGUI_ImportLandCoverMapDlg* aPanel = ::qobject_cast( inputPanel() ); - if ( !aPanel ) { + if ( !aPanel ) return false; - } - - QStringList aSelectedtPolygons = aPanel->getSelectedPolygonNames(); - aPanel->removePolygonNames( aSelectedtPolygons ); - - if (!aSelectedtPolygons.empty()) + + myLCM = Handle(HYDROData_LandCoverMap)::DownCast( doc()->CreateObject( KIND_LAND_COVER_MAP ) ); + HYDROData_MapOfFaceToStricklerType aMapFace2ST; + + QStringList aAttrV_T; + QStringList aSTL; + aPanel->getValAttr2StricklerTypeCorr(aAttrV_T, aSTL); + + QVector aSelIndices = aPanel->getSelectedPolygonIndices(); + foreach ( int Ind, aSelIndices ) { - Handle(HYDROData_LandCoverMap) aLCM = Handle(HYDROData_LandCoverMap)::DownCast( doc()->CreateObject( KIND_LAND_COVER_MAP ) ); - TopoDS_Shape aResShape; - if (aSelectedtPolygons.size() > 1) + TopoDS_Shape aShape = myPolygonFaces(Ind + 1); + if ( aShape.IsNull() ) + continue; + QString aST = ""; + if (aPanel->getAttrCheckBoxState()) { - TopoDS_Compound cmp; - BRep_Builder BB; - BB.MakeCompound(cmp); - - foreach ( QString aName, aSelectedtPolygons ) { - TopoDS_Shape aShape = myPolygonName2PrsShape.value( aName )->getTopoShape(); - if ( aShape.IsNull() ) - continue; - BB.Add(cmp, aShape); - HYDROGUI_Shape* aShapeToDelete = myPolygonName2PrsShape.take( aName ); - delete aShapeToDelete; - } - aResShape = cmp; - } - else - { - TopoDS_Shape aShape = myPolygonName2PrsShape.value( aSelectedtPolygons.first() )->getTopoShape(); - if ( !aShape.IsNull() ) - { - HYDROGUI_Shape* aShapeToDelete = myPolygonName2PrsShape.take( aSelectedtPolygons.first() ); - delete aShapeToDelete; - aResShape = aShape; - } - } - if( !aLCM.IsNull() ) - { - QString aLCName = aPanel->getObjectName() + "_polygon"; - int i = 0; - for( ;HYDROGUI_Tool::FindObjectByName(module(), aLCName); i++) - aLCName = aPanel->getObjectName() + "_polygon_" + QString::number(i); - aLCM->SetName( aLCName ); - //TODO add color - //aLCM->SetFillingColor( aLCM->DefaultFillingColor() ); - //aLCM->SetBorderColor( aLCM->DefaultBorderColor() ); - - //aLCM->SetShape(aResShape); - aLCM->Show(); - - //erasePreview(); - - module()->setIsToUpdate( aLCM ); - + HYDROData_ShapeFile::DBF_AttrValue aDataVal = myAttrValue[Ind]; + int aStricklerTypesInd = aAttrV_T.indexOf(QString(aDataVal.myStrVal)); + aST = aSTL.at(aStricklerTypesInd); } + // else => ST is empty + aMapFace2ST.Add( TopoDS::Face( aShape ), aST ); } - - module()->update( UF_Model | UF_VTKViewer | UF_VTK_Forced | UF_VTK_Init ); - if ( isApplyAndClose() ) - erasePreview(); + // + myLCM->StoreLandCovers(aMapFace2ST); + + QString anObjName; + if ( !aPanel->getFileName().isEmpty() ) + anObjName = aPanel->getObjectName(); + + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( application()->activeStudy()->id() ); + //check if name of LCM is already exists + QSet aNameList; + if (aDoc) + { + HYDROData_Iterator anIt( aDoc, KIND_LAND_COVER_MAP ); + for( ; anIt.More(); anIt.Next() ) + aNameList << anIt.Current()->GetName(); + } + + QString aNewName = anObjName; + for ( int i = 1; i < MAX_LCM_NAME_INDEX && aNameList.contains(aNewName); i++) + aNewName = anObjName + "_" + QString::number(i); + + if( !myLCM.IsNull() ) + { + myLCM->SetName( aNewName ); + myLCM->SetColor( Qt::gray ); + myLCM->Show(); + module()->setIsToUpdate( myLCM ); + } + + module()->update( UF_Model | UF_VTKViewer | UF_VTK_Forced | UF_VTK_Init ); + + erasePreview(); myImporter.Free(); + myAttrValue.clear(); return true; } @@ -310,61 +306,67 @@ void HYDROGUI_ImportLandCoverMapOp::onSelectionChanged( const QStringList& theSe } if ( !aCtx.IsNull() ) { - foreach ( QString aName, myPolygonName2PrsShape.keys() ) { + bool bSelChanged = false; + foreach ( QString aName, myPolygonName2PrsShape.keys() ) + { Handle(AIS_InteractiveObject) anObject = myPolygonName2PrsShape.value(aName)->getAISObject(); bool isSelected = theSelectedNames.contains( aName ); - if ( ( isSelected && !aCtx->IsSelected( anObject) ) || - ( !isSelected && aCtx->IsSelected( anObject) ) ) { + if ( ( isSelected && !aCtx->IsSelected( anObject) ) || ( !isSelected && aCtx->IsSelected( anObject) ) ) + { aCtx->AddOrRemoveSelected( anObject, Standard_False ); + bSelChanged = true; } - /*if (isSelected) - { - HYDROGUI_Shape* aHydroSh = myPolygonName2PrsShape.value( aName ); - aHydroSh->setFillingColor(QColor(0,255,255), true, true); - }*/ } - aCtx->UpdateCurrentViewer(); + + HYDROGUI_ImportLandCoverMapDlg* aPanel = ::qobject_cast( inputPanel() ); + if ( !aPanel ) + return; + + if (bSelChanged && aPanel->getViewerState()) + aCtx->UpdateCurrentViewer(); } } void HYDROGUI_ImportLandCoverMapOp::onViewerSelectionChanged() { - // Get panel HYDROGUI_ImportLandCoverMapDlg* aPanel = ::qobject_cast( inputPanel() ); - if ( !aPanel ) { + if ( !aPanel ) + return; + + int aCurIndex = -1; + aCurIndex = aPanel->getCurrentWizardIndex(); + + if (aCurIndex != 0) return; - } OCCViewer_ViewManager* aViewManager = getPreviewManager(); Handle(AIS_InteractiveContext) aCtx = NULL; - if ( aViewManager ) { - if ( OCCViewer_Viewer* aViewer = aViewManager->getOCCViewer() ) { + if ( aViewManager ) + if ( OCCViewer_Viewer* aViewer = aViewManager->getOCCViewer() ) aCtx = aViewer->getAISContext(); - } - } if ( !aCtx.IsNull() ) { QStringList aSelectedNames; foreach ( QString aName, myPolygonName2PrsShape.keys() ) { bool isSelected = aCtx->IsSelected( myPolygonName2PrsShape.value(aName)->getAISObject() ); - if ( isSelected ) { + if ( isSelected ) aSelectedNames << aName; - } } + aPanel->setViewerState(false); aPanel->setSelectedPolygonNames( aSelectedNames ); + aPanel->setViewerState(true); } } void HYDROGUI_ImportLandCoverMapOp::erasePreview() { - foreach ( HYDROGUI_Shape* aShape, myPolygonName2PrsShape ) { + foreach ( HYDROGUI_Shape* aShape, myPolygonName2PrsShape ) delete aShape; - } myPolygonName2PrsShape.clear(); } @@ -373,59 +375,49 @@ void HYDROGUI_ImportLandCoverMapOp::erasePreview() void HYDROGUI_ImportLandCoverMapOp::abortOperation() { LightApp_Application* anApp = module()->getApp(); - if ( anApp ) { + if ( anApp ) anApp->disconnect( this ); - } erasePreview(); - + myImporter.Free(); HYDROGUI_Operation::abortOperation(); } - void HYDROGUI_ImportLandCoverMapOp::onNext( const int theIndex ) { - //TODO add acceptor HYDROGUI_ImportLandCoverMapDlg* aPanel = ::qobject_cast( inputPanel() ); if ( !aPanel ) return; - if (theIndex == 1) - { - //Try to load DBF-database... - QString theDBFFileName; - theDBFFileName = myFileName.simplified().replace( ".shp", ".dbf", Qt::CaseInsensitive); - bool DBF_Stat = myImporter.DBF_OpenDBF(theDBFFileName); - // TODO: - // add MSG BOX if stat is bad - myFieldList = myImporter.DBF_GetFieldList(); - aPanel->setAttributeNames(myFieldList); - } - if (theIndex == 2) { - std::vector theAttrV; - int Ind = myFieldList.indexOf(aPanel->getSelectedFieldName()); - if (Ind == -1) - return; //TODO add acceptor here!! - myImporter.DBF_GetAttributeList(Ind, theAttrV ); + //std::vector myAttrValue; + int anIndOfSelField = myFieldList.indexOf(aPanel->getSelectedFieldName()); + if (anIndOfSelField == -1) + return; + //aPanel->setSecondPageState(true); + myAttrValue.clear(); + myImporter.DBF_GetAttributeList(anIndOfSelField, myAttrValue ); mySetOfAttrValues.clear(); - for (size_t i = 0; i < theAttrV.size(); i++) + for (size_t i = 0; i < myAttrValue.size(); i++) { - HYDROData_ShapeFile::DBF_AttrValue aV = theAttrV[i]; - mySetOfAttrValues << QString(aV.myStrVal); //take myStrVal by now.. + HYDROData_ShapeFile::DBF_AttrValue aV = myAttrValue[i]; + mySetOfAttrValues << QString(aV.myStrVal); //take myStrVal for now.. } //Collect all strickler_types QSet aSTSet; - Handle_HYDROData_Document aDoc = HYDROData_Document::Document( application()->activeStudy()->id() ); + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( application()->activeStudy()->id() ); + Handle(HYDROData_StricklerTable) DefStricklerTableObj; if ( aDoc ) { HYDROData_Iterator It( aDoc, KIND_STRICKLER_TABLE ); for( ; It.More(); It.Next() ) { - Handle(HYDROData_StricklerTable) aStricklerTableObj = Handle(HYDROData_StricklerTable)::DownCast( It.Current() ); + Handle(HYDROData_StricklerTable) aStricklerTableObj = Handle(HYDROData_StricklerTable)::DownCast( It.Current() ); + if (DefStricklerTableObj.IsNull()) + DefStricklerTableObj = aStricklerTableObj; if ( !aStricklerTableObj.IsNull()) { const QStringList& aStricklerList = aStricklerTableObj->GetTypes(); @@ -434,12 +426,78 @@ void HYDROGUI_ImportLandCoverMapOp::onNext( const int theIndex ) } } } - aPanel->FillCorrTable(mySetOfAttrValues.toList(), aSTSet.toList()); + + QList aSetOfAttrValuesList = mySetOfAttrValues.toList(); + QList aSTSetList = aSTSet.toList(); + QVector aSTColors; + aSTColors.reserve(aSTSetList.size()); + foreach (QString str, aSTSetList) + { + QColor col = aDoc->GetAssociatedColor(str, NULL); + aSTColors.append (col); + } + + //add an empty Strickler type + aSTSetList.prepend(""); + aSTColors.prepend(QColor(Qt::gray)); + + QVector aCurCBIndices(aSetOfAttrValuesList.size()); + if (DefStricklerTableObj->GetAttrName().trimmed() == aPanel->getSelectedFieldName().trimmed()) + for (int i = 0; i < aSetOfAttrValuesList.size(); i++) + { + QString aST = DefStricklerTableObj->GetType(aSetOfAttrValuesList[i]); + int anIndOfSt = aSTSetList.indexOf(aST); + aCurCBIndices[i] = anIndOfSt; + } + else + //TODO add warning ??? + for (int i = 0; i < aSetOfAttrValuesList.size(); i++) + aCurCBIndices[i] = 0; + + aPanel->FillCorrespondenceTable(aSetOfAttrValuesList, aSTSetList, aCurCBIndices, aSTColors); } } -void HYDROGUI_ImportLandCoverMapOp::onBack( const int theIndex ) + +void HYDROGUI_ImportLandCoverMapOp::onApply() { + HYDROGUI_ImportLandCoverMapDlg* aPanel = ::qobject_cast( inputPanel() ); + if ( !aPanel ) + return; + + if (!aPanel->CheckFirstPageFilling()) + return; + + QApplication::setOverrideCursor( Qt::WaitCursor ); + int anUpdateFlags = 0; + QString anErrorMsg; + QStringList aBrowseObjectsEntries; + + bool aResult = false; + try + { + aResult = processApply( anUpdateFlags, anErrorMsg, aBrowseObjectsEntries ); + } + catch (...) + { + SUIT_MessageBox::critical( module()->getApp()->desktop(), tr( "LCM_IMPORT_ERROR" ), tr ("CANNT_IMPORT_POLYGONS_FROM_SHP")); + aResult = false; + } + + QApplication::restoreOverrideCursor(); + if ( aResult ) + { + module()->update( anUpdateFlags ); + commit(); + browseObjects( aBrowseObjectsEntries ); + } + else + { + myLCM->Remove(); + module()->setObjectRemoved( myLCM ); + abort(); + } } +