+HYDROGUI_InputPanel* HYDROGUI_PolylineOp::createInputPanel() const
+{
+ HYDROGUI_PolylineDlg* aDlg = new HYDROGUI_PolylineDlg( module(), getName() );
+ connect( aDlg, SIGNAL( selectionChanged() ), this, SLOT( onEditorSelectionChanged() ) );
+ return aDlg;
+}
+
+bool HYDROGUI_PolylineOp::processApply( int& theUpdateFlags,
+ QString& theErrorMsg )
+{
+ HYDROGUI_PolylineDlg* aPanel = ::qobject_cast<HYDROGUI_PolylineDlg*>( inputPanel() );
+ if ( !aPanel )
+ return false;
+
+ QString aPolylineName = aPanel->getPolylineName().simplified();
+ if ( aPolylineName.isEmpty() )
+ {
+ theErrorMsg = tr( "INCORRECT_OBJECT_NAME" );
+ return false;
+ }
+
+ if( !myIsEdit || ( !myEditedObject.IsNull() && myEditedObject->GetName() != aPolylineName ) )
+ {
+ // check that there are no other objects with the same name in the document
+ Handle(HYDROData_Entity) anObject = HYDROGUI_Tool::FindObjectByName( module(), aPolylineName );
+ if( !anObject.IsNull() )
+ {
+ theErrorMsg = tr( "OBJECT_EXISTS_IN_DOCUMENT" ).arg( aPolylineName );
+ return false;
+ }
+ }
+
+ if ( myCurve->getNbSections() <= 0 )
+ {
+ theErrorMsg = tr( "EMPTY_POLYLINE_DATA" );
+ return false;
+ }
+
+ Handle(HYDROData_PolylineXY) aPolylineObj;
+ if( myIsEdit )
+ {
+ aPolylineObj = myEditedObject;
+ aPolylineObj->RemoveSections();
+ }
+ else
+ {
+ aPolylineObj = Handle(HYDROData_PolylineXY)::DownCast( doc()->CreateObject( KIND_POLYLINEXY ) );
+ }
+
+ if( aPolylineObj.IsNull() )
+ return false;
+
+ aPolylineObj->SetName( aPolylineName );
+
+ for ( int i = 0 ; i < myCurve->getNbSections() ; i++ )
+ {
+ TCollection_AsciiString aSectName = HYDROGUI_Tool::ToAsciiString( myCurve->getSectionName( i ).c_str() );
+ CurveCreator::SectionType aCurveType = myCurve->getSectionType( i );
+ bool aSectClosure = myCurve->isClosed( i );
+
+ HYDROData_PolylineXY::SectionType aSectType = HYDROData_PolylineXY::SECTION_POLYLINE;
+
+ if ( aCurveType == CurveCreator::Spline )
+ aSectType = HYDROData_PolylineXY::SECTION_SPLINE;
+
+ aPolylineObj->AddSection( aSectName, aSectType, aSectClosure );
+
+ // Add the points fro section
+ CurveCreator::Coordinates aCurveCoords = myCurve->getPoints( i );
+
+ if ( aCurveCoords.size() <= 2 )
+ {
+ theErrorMsg = tr( "NUMBER_OF_SECTION_POINTS_INCORRECT" );
+ return false;
+ }
+
+ for ( int k = 0 ; k + 1 < aCurveCoords.size() ; k++ )
+ {
+ HYDROData_PolylineXY::Point aSectPoint;
+
+ aSectPoint.SetX( aCurveCoords.at( k ) );
+ k++;
+ aSectPoint.SetY( aCurveCoords.at( k ) );
+
+ aPolylineObj->AddPoint( i, aSectPoint );
+ }
+ }
+
+ if ( !myIsEdit )
+ {
+ aPolylineObj->SetWireColor( HYDROData_PolylineXY::DefaultWireColor() );
+ }
+
+ // Update the wire of polyline
+ aPolylineObj->Update();
+ module()->setIsToUpdate( aPolylineObj );
+
+ // the viewer should be release from the widget before the module update it
+ // because it has an opened local context and updated presentation should not be displayed in it
+ if ( aPanel )
+ aPanel->setOCCViewer( 0 );
+
+ theUpdateFlags = UF_Model;
+
+ // the polyline should be rebuild in all viewers, where it is displayed
+ theUpdateFlags |= UF_Viewer | UF_GV_Forced;
+ theUpdateFlags |= UF_OCCViewer | UF_OCC_Forced;
+ theUpdateFlags |= UF_VTKViewer;
+
+ size_t anActiveViewId = HYDROGUI_Tool::GetActiveGraphicsViewId( module() );
+ if ( anActiveViewId == 0 )
+ {
+ anActiveViewId = HYDROGUI_Tool::GetActiveOCCViewId( module() );
+ }
+
+ if( !myIsEdit )
+ {
+ module()->setObjectVisible( anActiveViewId, aPolylineObj, true );
+ }
+
+ return true;
+}
+