X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_PolylineOp.cxx;h=33986c67d9be5c6bb94f16e4e363aa412c456f33;hb=de7cf9bb0a7a41d6487013c87f4a54d0664cd303;hp=cfe2c92257ec5f314a975a827e2a30b20367e34a;hpb=e31b7d2c433d4e27a4023d9a43b34cfc6f147aaf;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_PolylineOp.cxx b/src/HYDROGUI/HYDROGUI_PolylineOp.cxx index cfe2c922..33986c67 100755 --- a/src/HYDROGUI/HYDROGUI_PolylineOp.cxx +++ b/src/HYDROGUI/HYDROGUI_PolylineOp.cxx @@ -19,29 +19,227 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // - +#include "HYDROGUI_Module.h" #include "HYDROGUI_PolylineOp.h" #include "HYDROGUI_PolylineDlg.h" +#include "HYDROGUI_Tool.h" +#include "CurveCreator.hxx" +#include "CurveCreator_Curve.hxx" +#include "CurveCreator_CurveEditor.hxx" +#include "HYDROGUI_AISCurve.h" -#include "HYDROGUI_Module.h" +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include -HYDROGUI_PolylineOp::HYDROGUI_PolylineOp( HYDROGUI_Module* theModule ) -: HYDROGUI_Operation( theModule ) +//static int ZValueIncrement = 0; + +HYDROGUI_PolylineOp::HYDROGUI_PolylineOp( HYDROGUI_Module* theModule, bool theIsEdit ) +: HYDROGUI_Operation( theModule ), myIsEdit(theIsEdit), myCurve(NULL), + myViewManager(NULL), myAISCurve(NULL) { - setName( tr("POLYLINE") ); + setName( theIsEdit ? tr( "EDIT_POLYLINE" ) : tr( "CREATE_POLYLINE" ) ); } HYDROGUI_PolylineOp::~HYDROGUI_PolylineOp() { + erasePreview(); +} + +void HYDROGUI_PolylineOp::startOperation() +{ + if( myCurve ) + { + delete myCurve; + myCurve = 0; + } + + HYDROGUI_Operation::startOperation(); + + HYDROGUI_PolylineDlg* aPanel = (HYDROGUI_PolylineDlg*)inputPanel(); + aPanel->reset(); + + if( myIsEdit ) + myEditedObject = Handle(HYDROData_Polyline)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) ); + if( !myEditedObject.IsNull() ) + { + int anIntDim = myEditedObject->GetDimension(); + CurveCreator::Dimension aDim = CurveCreator::Dim3d; + if( anIntDim == 2 ) + aDim = CurveCreator::Dim2d; + myCurve = new CurveCreator_Curve(aDim); + QList aPolylineData = myEditedObject->GetPolylineData(); + + CurveCreator_CurveEditor* anEdit = new CurveCreator_CurveEditor(myCurve); + for( int i = 0 ; i < aPolylineData.size() ; i++ ){ + std::string aName = HYDROGUI_Tool::ToQString(aPolylineData[i].mySectionName).toStdString(); + bool isClosed = aPolylineData[i].myIsClosed; + CurveCreator::Type aType = CurveCreator::Polyline; + if( aPolylineData[i].myType == PolylineSection::SECTION_SPLINE ){ + aType = CurveCreator::BSpline; + } + CurveCreator::Coordinates aCoords; + for( int j = 0 ; j < aPolylineData[i].myCoords.size() ; j++ ){ + aCoords.push_back(aPolylineData[i].myCoords[j]); + } + anEdit->addSection( aName, aType, isClosed, aCoords ); + } + delete anEdit; + aPanel->setPolylineName( myEditedObject->GetName() ); + + } + else{ + myCurve = new CurveCreator_Curve(CurveCreator::Dim2d); + aPanel->setCurve(myCurve); + QString aNewName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_POLYLINE_NAME" ) ); + aPanel->setPolylineName(aNewName); + } + aPanel->setCurve(myCurve); + + if( myAISCurve ) + myAISCurve->setCurve(myCurve); + + displayPreview(); +} + +void HYDROGUI_PolylineOp::abortOperation() +{ + erasePreview(); + + HYDROGUI_Operation::abortOperation(); +} + +void HYDROGUI_PolylineOp::commitOperation() +{ + erasePreview(); + + HYDROGUI_Operation::commitOperation(); } HYDROGUI_InputPanel* HYDROGUI_PolylineOp::createInputPanel() const { - return new HYDROGUI_PolylineDlg( module(), getName() ); + HYDROGUI_PolylineDlg* aDlg = new HYDROGUI_PolylineDlg( module(), getName() ); + connect( aDlg, SIGNAL( selectionChanged() ), this, SLOT( onEditorSelectionChanged() ) ); + return aDlg; } -bool HYDROGUI_PolylineOp::processApply( int& theUpdateFlags ) +bool HYDROGUI_PolylineOp::processApply( int& theUpdateFlags, + QString& theErrorMsg ) { + HYDROGUI_PolylineDlg* aPanel = (HYDROGUI_PolylineDlg*)inputPanel(); + + int aStudyId = module()->getStudyId(); + bool aHasDoc = HYDROData_Document::HasDocument(aStudyId); + Handle(HYDROData_Document) aDocument = HYDROData_Document::Document( aStudyId ); + if( aDocument.IsNull() ) + return false; + + Handle(HYDROData_Polyline) aPolylineObj; + if( myIsEdit ){ + aPolylineObj = myEditedObject; + } + else{ + aPolylineObj = Handle(HYDROData_Polyline)::DownCast( aDocument->CreateObject( KIND_POLYLINE ) ); + + //double aZValue = double( ++ZValueIncrement ) * 1e-2; // empiric value, to be revised + //aPolylineObj->SetZValue( aZValue ); + } + + if( aPolylineObj.IsNull() ) + return false; + + QString aPolylineName = aPanel->getPolylineName(); + aPolylineObj->SetName(aPolylineName); + int aDimInt = 3; + if( myCurve->getDimension() == CurveCreator::Dim2d ) + aDimInt = 2; + aPolylineObj->SetDimension(aDimInt); + QList aPolylineData; + for( int i=0 ; i < myCurve->getNbSections() ; i++ ){ + PolylineSection aSect; + aSect.mySectionName = HYDROGUI_Tool::ToExtString( QString::fromLocal8Bit(myCurve->getSectionName(i).c_str())); + aSect.myIsClosed = myCurve->isClosed(i); + aSect.myType = PolylineSection::SECTION_POLYLINE; + if( myCurve->getType(i) == CurveCreator::BSpline ){ + aSect.myType = PolylineSection::SECTION_SPLINE; + } + CurveCreator::Coordinates aCoords = myCurve->getPoints(i); + for( int j = 0 ; j < aCoords.size() ; j++ ){ + aSect.myCoords << aCoords.at(j); + } + aPolylineData << aSect; + } + aPolylineObj->SetPolylineData(aPolylineData); + + theUpdateFlags = UF_Model; + module()->setObjectVisible( HYDROGUI_Tool::GetActiveGraphicsViewId( module() ), aPolylineObj, true ); return true; } + +void HYDROGUI_PolylineOp::onEditorSelectionChanged() +{ + HYDROGUI_PolylineDlg* aPanel = (HYDROGUI_PolylineDlg*)inputPanel(); + if( !aPanel ) + return; + if( !myCurve ) + return; + if( !myAISCurve ) + return; + QList aSelSections = aPanel->getSelectedSections(); + for( int i = 0 ; i < myCurve->getNbSections() ; i++ ){ + bool aIsHl = false; + if( aSelSections.contains(i) ){ + myAISCurve->highlightSection(i, aIsHl); + } + } +} + +void HYDROGUI_PolylineOp::displayPreview() +{ + LightApp_Application* anApp = module()->getApp(); + + myViewManager = + dynamic_cast( anApp->getViewManager( OCCViewer_Viewer::Type(), true ) ); + if( myViewManager ) + { + if( OCCViewer_Viewer* aViewer = myViewManager->getOCCViewer() ) + { + Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext(); + if( !aCtx.IsNull() ) + { + myAISCurve = new HYDROGUI_AISCurve( myCurve, aCtx ); + myAISCurve->Display(); + } + } + } +} + +void HYDROGUI_PolylineOp::erasePreview() +{ + if( myViewManager ) + { + if( OCCViewer_Viewer* aViewer = myViewManager->getOCCViewer() ) + { + Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext(); + if( !aCtx.IsNull() && myAISCurve ) + { + myAISCurve->Erase(); + delete myAISCurve; + myAISCurve = 0; + } + } + } +}