X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_PolylineOp.cxx;h=33986c67d9be5c6bb94f16e4e363aa412c456f33;hb=de7cf9bb0a7a41d6487013c87f4a54d0664cd303;hp=774f3c3646b0bb14566fdee388b2d2cf38da3914;hpb=5f1c089db35b75a592625b708921df2320563363;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_PolylineOp.cxx b/src/HYDROGUI/HYDROGUI_PolylineOp.cxx index 774f3c36..33986c67 100755 --- a/src/HYDROGUI/HYDROGUI_PolylineOp.cxx +++ b/src/HYDROGUI/HYDROGUI_PolylineOp.cxx @@ -23,30 +23,121 @@ #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 #include +#include +#include #include +#include #include +#include +#include +#include + +#include + +#include + +//static int ZValueIncrement = 0; HYDROGUI_PolylineOp::HYDROGUI_PolylineOp( HYDROGUI_Module* theModule, bool theIsEdit ) -: HYDROGUI_Operation( theModule ), myIsEdit(theIsEdit) +: HYDROGUI_Operation( theModule ), myIsEdit(theIsEdit), myCurve(NULL), + myViewManager(NULL), myAISCurve(NULL) { 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(); @@ -62,31 +153,93 @@ bool HYDROGUI_PolylineOp::processApply( int& theUpdateFlags ) } 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; - if( !myIsEdit ){ - static int PolylineId = 0; - aPolylineObj->SetName( QString( "Polyline_%1" ).arg( QString::number( ++PolylineId ) ) ); + 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); - aPolylineObj->SetVisibility( true ); - - theUpdateFlags = UF_Model | UF_Viewer; + theUpdateFlags = UF_Model; + module()->setObjectVisible( HYDROGUI_Tool::GetActiveGraphicsViewId( module() ), aPolylineObj, true ); return true; } -void HYDROGUI_PolylineOp::startOperation() +void HYDROGUI_PolylineOp::onEditorSelectionChanged() { - HYDROGUI_Operation::startOperation(); - HYDROGUI_PolylineDlg* aPanel = (HYDROGUI_PolylineDlg*)inputPanel(); - aPanel->reset(); + 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); + } + } +} - myEditedObject = Handle(HYDROData_Polyline)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) ); - if( !myEditedObject.IsNull() ) +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(); + } + } } -} \ No newline at end of file +} + +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; + } + } + } +}