From fd7bc8b6aff2f236893c3c549e3338668bd6bec3 Mon Sep 17 00:00:00 2001 From: adv Date: Fri, 20 Dec 2013 05:46:27 +0000 Subject: [PATCH] Import polyline from shape (Feature #228). --- src/HYDROData/HYDROData_IPolyline.h | 2 +- src/HYDROData/HYDROData_PolylineXY.cxx | 334 +++++++++++++++---- src/HYDROData/HYDROData_PolylineXY.h | 36 +- src/HYDROData/HYDROData_ProfileUZ.cxx | 2 +- src/HYDROData/HYDROData_ProfileUZ.h | 2 +- src/HYDROGUI/HYDROGUI_ImportGeomObjectOp.cxx | 24 +- src/HYDROGUI/HYDROGUI_Operation.cxx | 31 +- src/HYDROGUI/HYDROGUI_Operation.h | 67 ++-- src/HYDROGUI/HYDROGUI_PolylineOp.cxx | 21 +- src/HYDROGUI/resources/HYDROGUI_msg_en.ts | 18 + 10 files changed, 426 insertions(+), 111 deletions(-) diff --git a/src/HYDROData/HYDROData_IPolyline.h b/src/HYDROData/HYDROData_IPolyline.h index 1a7c63ae..aa68ccb0 100644 --- a/src/HYDROData/HYDROData_IPolyline.h +++ b/src/HYDROData/HYDROData_IPolyline.h @@ -65,7 +65,7 @@ public: /** * Returns the 3D presentation of all points. */ - HYDRODATA_EXPORT virtual TopoDS_Shape GetShape() = 0; + HYDRODATA_EXPORT virtual TopoDS_Shape GetShape() const = 0; /** diff --git a/src/HYDROData/HYDROData_PolylineXY.cxx b/src/HYDROData/HYDROData_PolylineXY.cxx index 5129d6e8..4d8179d2 100755 --- a/src/HYDROData/HYDROData_PolylineXY.cxx +++ b/src/HYDROData/HYDROData_PolylineXY.cxx @@ -3,6 +3,7 @@ #include "HYDROData_BSplineOperation.h" #include "HYDROData_Document.h" +#include "HYDROData_ShapesTool.h" #include "HYDROData_Tool.h" #include @@ -11,6 +12,8 @@ #include #include +#include +#include #include @@ -27,11 +30,14 @@ #include #include +#include + #include #include #include #include #include +#include #include #include @@ -43,10 +49,46 @@ #include #include +static const Standard_GUID GUID_IS_UNEDITABLE("e5799736-9030-4051-91a4-2e58321fa153"); + #define PYTHON_POLYLINEXY_ID "KIND_POLYLINEXY" const double LOCAL_SELECTION_TOLERANCE = 0.0001; +TCollection_AsciiString getUniqueSectionName( const NCollection_Sequence& theNamesSeq ) +{ + NCollection_Map aNamesMap; + + for ( int i = 1, n = theNamesSeq.Size(); i <= n; ++i ) + { + const TCollection_AsciiString& aSectName = theNamesSeq.Value( i ); + aNamesMap.Add( aSectName ); + } + + TCollection_AsciiString aResName; + + int aPrefIdx = 1; + do + { + aResName = TCollection_AsciiString( "Section_" ) + aPrefIdx; + ++aPrefIdx; + } + while ( aNamesMap.Contains( aResName ) ); + + return aResName; +} + +TCollection_AsciiString getUniqueSectionName( const Handle(TDataStd_ExtStringList)& theNamesList ) +{ + NCollection_Sequence aNamesSeq; + + TDataStd_ListIteratorOfListOfExtendedString aNamesIter( theNamesList->List() ); + for ( ; aNamesIter.More(); aNamesIter.Next() ) + aNamesSeq.Append( aNamesIter.Value() ); + + return getUniqueSectionName( aNamesSeq ); +} + IMPLEMENT_STANDARD_HANDLE(HYDROData_PolylineXY, HYDROData_IPolyline) IMPLEMENT_STANDARD_RTTIEXT(HYDROData_PolylineXY, HYDROData_IPolyline) @@ -117,11 +159,142 @@ QColor HYDROData_PolylineXY::DefaultWireColor() return QColor( Qt::red ); } -TopoDS_Shape HYDROData_PolylineXY::GetShape() +TopoDS_Shape HYDROData_PolylineXY::GetShape() const { return getPolylineShape(); } +bool convertEdgeToSection( const TopoDS_Edge& theEdge, + NCollection_Sequence& theSectNames, + NCollection_Sequence& theSectTypes, + NCollection_Sequence& theSectClosures, + NCollection_Sequence& theSectPoints, + const bool theIsCanBeClosed ) +{ + Standard_Real aFirst = 0.0, aLast = 0.0; + Handle(Geom_Curve) anEdgeGeomCurve = BRep_Tool::Curve( theEdge, aFirst, aLast ); + if ( anEdgeGeomCurve.IsNull() ) + return false; + + TCollection_AsciiString aSectName = getUniqueSectionName( theSectNames ); + bool anIsEdgeClosed = anEdgeGeomCurve->IsClosed(); + + HYDROData_PolylineXY::SectionType aSectionType = HYDROData_PolylineXY::SECTION_POLYLINE; + HYDROData_PolylineXY::PointsList aPointsList; + + if ( anEdgeGeomCurve->IsKind( STANDARD_TYPE(Geom_Line) ) ) + { + Handle(Geom_Line) aGeomLine = Handle(Geom_Line)::DownCast( anEdgeGeomCurve ); + + gp_Pnt aFirstPoint, aLastPoint; + aGeomLine->D0( aFirst, aFirstPoint ); + aGeomLine->D0( aLast, aLastPoint ); + + HYDROData_PolylineXY::Point aSectFirstPoint( aFirstPoint.X(), aFirstPoint.Y() ); + aPointsList.Append( aSectFirstPoint ); + + HYDROData_PolylineXY::Point aSectLastPoint( aLastPoint.X(), aLastPoint.Y() ); + aPointsList.Append( aSectLastPoint ); + } + else if ( anEdgeGeomCurve->IsKind( STANDARD_TYPE(Geom_BSplineCurve) ) ) + { + aSectionType = HYDROData_PolylineXY::SECTION_SPLINE; + + Handle(Geom_BSplineCurve) aGeomSpline = + Handle(Geom_BSplineCurve)::DownCast( anEdgeGeomCurve ); + + int aNbKnots = aGeomSpline->NbKnots(); + + TColStd_Array1OfReal aSplineKnots( 1, aNbKnots ); + aGeomSpline->Knots( aSplineKnots ); + + // Decrease the number of imported knots because of last one + // knot is the closing point which are the start point + if ( anIsEdgeClosed ) aNbKnots--; + + for ( int i = 1; i <= aNbKnots; ++i ) + { + const Standard_Real& aKnot = aSplineKnots.Value( i ); + + gp_Pnt aPoint; + aGeomSpline->D0( aKnot, aPoint ); + + HYDROData_PolylineXY::Point aSectPoint( aPoint.X(), aPoint.Y() ); + aPointsList.Append( aSectPoint ); + } + } + else + { + // Other curve types are not supported + return false; + } + + if ( aPointsList.IsEmpty() ) + return false; + + theSectNames.Append( aSectName ); + theSectTypes.Append( aSectionType ); + theSectClosures.Append( anIsEdgeClosed ); + theSectPoints.Append( aPointsList ); + + return true; +} + +bool HYDROData_PolylineXY::ImportShape( const TopoDS_Shape& theShape ) +{ + if ( theShape.IsNull() ) + return false; + + RemoveSections(); + + bool anIsCanBeImported = false; + + NCollection_Sequence aSectNames; + NCollection_Sequence aSectTypes; + NCollection_Sequence aSectClosures; + NCollection_Sequence aSectPoints; + + if ( theShape.ShapeType() == TopAbs_EDGE ) + { + TopoDS_Edge anEdge = TopoDS::Edge( theShape ); + anIsCanBeImported = convertEdgeToSection( anEdge, aSectNames, aSectTypes, aSectClosures, aSectPoints, true ); + } + else if ( theShape.ShapeType() == TopAbs_WIRE ) + { + TopTools_SequenceOfShape anEdges; + HYDROData_ShapesTool::ExploreShapeToShapes( theShape, TopAbs_EDGE, anEdges ); + + anIsCanBeImported = !anEdges.IsEmpty(); + for ( int i = 1, n = anEdges.Length(); i <= n && anIsCanBeImported; ++i ) + { + TopoDS_Edge aWireEdge = TopoDS::Edge( anEdges.Value( i ) ); + anIsCanBeImported = convertEdgeToSection( aWireEdge, aSectNames, aSectTypes, aSectClosures, aSectPoints, false ); + } + } + + if ( anIsCanBeImported ) + { + for ( int i = 1, n = aSectNames.Length(); i <= n; ++i ) + { + const TCollection_AsciiString& aSectName = aSectNames.Value( i ); + const SectionType& aSectType = aSectTypes.Value( i ); + bool anIsSectionClosed = aSectClosures.Value( i ); + const PointsList& aSectPointsList = aSectPoints( i ); + + AddSection( aSectName, aSectType, anIsSectionClosed ); + SetPoints( i - 1, aSectPointsList ); + } + } + else + { + setPolylineShape( theShape ); + } + + setEditable( anIsCanBeImported ); + + return true; +} + TopoDS_Wire HYDROData_PolylineXY::BuildWire( const SectionType& theType, const bool& theIsClosed, const NCollection_Sequence& thePoints ) @@ -205,6 +378,13 @@ void HYDROData_PolylineXY::BuildPainterPath( QPainterPath& void HYDROData_PolylineXY::Update() { + if ( !IsEditable() ) + { + // If polyline is not editable we no need to update it wire + SetToUpdate( false ); + return; + } + HYDROData_IPolyline::Update(); NCollection_Sequence aSectNames; @@ -247,55 +427,89 @@ void HYDROData_PolylineXY::Update() TopTools_ListIteratorOfListOfShape it(aSectionWiresList); for(;it.More();it.Next()) { - TopExp_Explorer it2(it.Value(), TopAbs_EDGE); - for(;it2.More();it2.Next()) - aSeqEdges->Append(it2.Current()); - } - BRep_Builder aBB; - TopoDS_Compound aCmp; - TopoDS_Shape aResult; - aBB.MakeCompound(aCmp); - if(aSeqEdges->Length() >1) - { - ShapeAnalysis_FreeBounds::ConnectEdgesToWires(aSeqEdges,1E-5,Standard_False,aSeqWires); - - if( aSeqWires->Length()==1 ) - aResult = aSeqWires->Value( 1 ); - else - { - for (Standard_Integer i = 1; i <= aSeqWires->Length();i++) - { - const TopoDS_Shape& aS1 = aSeqWires->Value(i); - aBB.Add(aCmp, aS1); - } - aResult = aCmp; - } - } - else if (aSeqEdges->Length() == 1) - { - BRepBuilderAPI_MakeWire mkWire (TopoDS::Edge(aSeqEdges->Value(1))); - if (mkWire.IsDone()) - aResult = mkWire.Wire(); - } + TopExp_Explorer it2(it.Value(), TopAbs_EDGE); + for(;it2.More();it2.Next()) + aSeqEdges->Append(it2.Current()); + } + + BRep_Builder aBB; + TopoDS_Compound aCmp; + TopoDS_Shape aResult; + aBB.MakeCompound(aCmp); + if(aSeqEdges->Length() >1) + { + ShapeAnalysis_FreeBounds::ConnectEdgesToWires(aSeqEdges,1E-5,Standard_False,aSeqWires); + + if( aSeqWires->Length()==1 ) + aResult = aSeqWires->Value( 1 ); + else + { + for (Standard_Integer i = 1; i <= aSeqWires->Length();i++) + { + const TopoDS_Shape& aS1 = aSeqWires->Value(i); + aBB.Add(aCmp, aS1); + } + aResult = aCmp; + } + } + else if (aSeqEdges->Length() == 1) + { + BRepBuilderAPI_MakeWire mkWire (TopoDS::Edge(aSeqEdges->Value(1))); + if (mkWire.IsDone()) + aResult = mkWire.Wire(); + } setPolylineShape( aResult ); } +bool HYDROData_PolylineXY::IsEditable() const +{ + return !myLab.IsAttribute( GUID_IS_UNEDITABLE ); +} + +void HYDROData_PolylineXY::setEditable( const bool theIsEditable ) +{ + if ( !theIsEditable ) + TDataStd_UAttribute::Set( myLab, GUID_IS_UNEDITABLE ); + else + myLab.ForgetAttribute( GUID_IS_UNEDITABLE ); +} + /** * Returns true if polyline is closed */ -bool HYDROData_PolylineXY::IsClosed() const +bool HYDROData_PolylineXY::IsClosed( const bool theIsSimpleCheck ) const { - NCollection_Sequence aSectNames; - NCollection_Sequence aSectTypes; - NCollection_Sequence aSectClosures; - GetSections( aSectNames, aSectTypes, aSectClosures ); - if( aSectNames.IsEmpty() ) - return false; + bool anIsClosed = false; - bool anIsClosed = true; - for( int i = 1, n = aSectClosures.Size(); i <= n && anIsClosed; ++i ) - anIsClosed = anIsClosed && aSectClosures.Value( i ); + TopoDS_Shape aShape = GetShape(); + if ( aShape.IsNull() ) + return anIsClosed; + + if ( aShape.ShapeType() == TopAbs_EDGE ) + { + //For unrecognized curves from GEOM module + anIsClosed = BRep_Tool::IsClosed( aShape ); + return anIsClosed; + } + + TopTools_SequenceOfShape aWires; + HYDROData_ShapesTool::ExploreShapeToShapes( aShape, TopAbs_WIRE, aWires ); + + int aNbWires = aWires.Length(); + if ( theIsSimpleCheck ) + { + anIsClosed = aNbWires > 0; + for ( int i = 1; i <= aNbWires && anIsClosed; ++i ) + { + const TopoDS_Shape& aWire = aWires.Value( i ); + anIsClosed = BRep_Tool::IsClosed( aWire ); + } + } + else + { + anIsClosed = aNbWires == 1 && BRep_Tool::IsClosed( aWires.First() ); + } return anIsClosed; } @@ -377,27 +591,6 @@ int HYDROData_PolylineXY::NbSections() const return !aClosuresList.IsNull() ? aClosuresList->Extent() : 0; } -TCollection_ExtendedString getUniqueSectionName( const Handle(TDataStd_ExtStringList)& theNamesList ) -{ - NCollection_Map aNamesMap; - - TDataStd_ListIteratorOfListOfExtendedString aNamesIter( theNamesList->List() ); - for ( ; aNamesIter.More(); aNamesIter.Next() ) - aNamesMap.Add( aNamesIter.Value() ); - - TCollection_ExtendedString aResName; - - int aPrefIdx = 1; - do - { - aResName = "Section_" + aPrefIdx; - ++aPrefIdx; - } - while ( aNamesMap.Contains( aResName ) ); - - return aResName; -} - void HYDROData_PolylineXY::AddSection( const TCollection_AsciiString& theSectName, const SectionType theSectionType, const bool theIsClosed ) @@ -725,6 +918,23 @@ void HYDROData_PolylineXY::SetPoint( const int theSectionIndex, SetToUpdate( true ); } +void HYDROData_PolylineXY::SetPoints( const int theSectionIndex, + const PointsList& thePoints ) +{ + Handle(TDataStd_RealList) aListX, aListY; + getPointsLists( theSectionIndex, aListX, aListY ); + + aListX->Clear(); + aListY->Clear(); + + for ( int i = 1, n = thePoints.Length(); i <= n; ++i ) + { + const Point& aPoint = thePoints.Value( i ); + aListX->Append( aPoint.X() ); + aListY->Append( aPoint.Y() ); + } +} + void HYDROData_PolylineXY::RemovePoint( const int theSectionIndex, const int thePointIndex ) { diff --git a/src/HYDROData/HYDROData_PolylineXY.h b/src/HYDROData/HYDROData_PolylineXY.h index d14212e1..32732b08 100644 --- a/src/HYDROData/HYDROData_PolylineXY.h +++ b/src/HYDROData/HYDROData_PolylineXY.h @@ -69,10 +69,15 @@ public: public: + /** + * Returns the 2D presentation of all points. + */ + HYDRODATA_EXPORT virtual TopoDS_Shape GetShape() const; + /** * Returns the 3D presentation of all points. */ - HYDRODATA_EXPORT virtual TopoDS_Shape GetShape(); + HYDRODATA_EXPORT virtual bool ImportShape( const TopoDS_Shape& theShape ); /** * Update the wire contour on the basis of the polyline data. @@ -81,10 +86,20 @@ public: HYDRODATA_EXPORT virtual void Update(); - /** + /** + * Returns flag indicating that polyline can be edited or not. + */ + HYDRODATA_EXPORT virtual bool IsEditable() const; + + + /** * Returns true if polyline is closed + * \param theIsSimpleCheck flag indicating the type of checking + * - if true then all wires checked on closures + * - if false then for positive result polyline should consist of + * only one wire and which must be closed */ - HYDRODATA_EXPORT bool IsClosed() const; + HYDRODATA_EXPORT bool IsClosed( const bool theIsSimpleCheck = true ) const; /** * Returns the distance beetwen first and point with index thePointIndex @@ -193,6 +208,14 @@ public: const Point& thePoint, const int thePointIndex ); + /** + * Replaces point for section with index "theSectionIndex". + * \param theSectionIndex index of section + * \param thePoints new points + */ + HYDRODATA_EXPORT virtual void SetPoints( const int theSectionIndex, + const PointsList& thePoints ); + /** * Removes point from section with index "theSectionIndex". * \param theSectionIndex index of section @@ -219,6 +242,13 @@ public: HYDRODATA_EXPORT virtual QPainterPath GetPainterPath() const; +protected: + + /** + * Sets the flag indicating that polyline can be edited or not. + */ + HYDRODATA_EXPORT virtual void setEditable( const bool theIsEditable ); + protected: friend class HYDROData_Profile; diff --git a/src/HYDROData/HYDROData_ProfileUZ.cxx b/src/HYDROData/HYDROData_ProfileUZ.cxx index f18e98aa..649c8096 100755 --- a/src/HYDROData/HYDROData_ProfileUZ.cxx +++ b/src/HYDROData/HYDROData_ProfileUZ.cxx @@ -28,7 +28,7 @@ HYDROData_ProfileUZ::~HYDROData_ProfileUZ() { } -TopoDS_Shape HYDROData_ProfileUZ::GetShape() +TopoDS_Shape HYDROData_ProfileUZ::GetShape() const { // TODO return TopoDS_Shape(); diff --git a/src/HYDROData/HYDROData_ProfileUZ.h b/src/HYDROData/HYDROData_ProfileUZ.h index b982a1d8..0e1dcd0d 100644 --- a/src/HYDROData/HYDROData_ProfileUZ.h +++ b/src/HYDROData/HYDROData_ProfileUZ.h @@ -35,7 +35,7 @@ public: /** * Returns the 3D presentation of all points. */ - HYDRODATA_EXPORT virtual TopoDS_Shape GetShape(); + HYDRODATA_EXPORT virtual TopoDS_Shape GetShape() const; /** * Returns the depth for given distance. diff --git a/src/HYDROGUI/HYDROGUI_ImportGeomObjectOp.cxx b/src/HYDROGUI/HYDROGUI_ImportGeomObjectOp.cxx index c3d9488f..8715e918 100644 --- a/src/HYDROGUI/HYDROGUI_ImportGeomObjectOp.cxx +++ b/src/HYDROGUI/HYDROGUI_ImportGeomObjectOp.cxx @@ -41,6 +41,7 @@ #include #include +#include #include @@ -210,14 +211,14 @@ bool HYDROGUI_ImportGeomObjectOp::processApply( int& theUpdateFlags, if ( anObjectToEdit.IsNull() ) { if ( myOpType == ImportCreatedAsObstacle || myOpType == ImportSelectedAsObstacle ) { - anObject = - Handle(HYDROData_Obstacle)::DownCast( doc()->CreateObject(KIND_OBSTACLE) ); + anObject = doc()->CreateObject( KIND_OBSTACLE ); Handle(HYDROData_Obstacle) anObstacle = Handle(HYDROData_Obstacle)::DownCast( anObject ); anObstacle->SetFillingColor( HYDROData_Obstacle::DefaultFillingColor() ); anObstacle->SetBorderColor( HYDROData_Obstacle::DefaultBorderColor() ); } else if ( myOpType == ImportSelectedAsPolyline ) { - anObject = - Handle(HYDROData_PolylineXY)::DownCast( doc()->CreateObject(KIND_POLYLINEXY) ); + anObject = doc()->CreateObject( KIND_POLYLINEXY ); + Handle(HYDROData_PolylineXY) aPolylineObj = Handle(HYDROData_PolylineXY)::DownCast( anObject ); + aPolylineObj->SetWireColor( HYDROData_PolylineXY::DefaultWireColor() ); } } else { anObject = anObjectToEdit; @@ -242,8 +243,19 @@ bool HYDROGUI_ImportGeomObjectOp::processApply( int& theUpdateFlags, anIsOk = true; } else if ( myOpType == ImportSelectedAsPolyline ) { Handle(HYDROData_PolylineXY) aPolyline = Handle(HYDROData_PolylineXY)::DownCast( anObject ); - // TODO ISSUE #228: set the shape ("aShape") to the polyline - // anIsOk = aPolyline->setShape( aShape ); + anIsOk = aPolyline->ImportShape( aShape ); + + /* TODO: check it before start operation + if ( anIsOk && !aPolyline->IsEditable() ) + { + anIsOk = SUIT_MessageBox::question( module()->getApp()->desktop(), + tr( "POLYLINE_IS_UNRECOGNIZED_TLT" ), + tr( "POLYLINE_IS_UNRECOGNIZED_MSG" ), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No ) == QMessageBox::Yes; + setPrintErrorMessage( anIsOk ); + } + */ } // Check operation status diff --git a/src/HYDROGUI/HYDROGUI_Operation.cxx b/src/HYDROGUI/HYDROGUI_Operation.cxx index 90a5e308..bdbd6fa0 100644 --- a/src/HYDROGUI/HYDROGUI_Operation.cxx +++ b/src/HYDROGUI/HYDROGUI_Operation.cxx @@ -41,7 +41,8 @@ HYDROGUI_Operation::HYDROGUI_Operation( HYDROGUI_Module* theModule ) : LightApp_Operation(), myModule( theModule ), - myPanel( 0 ) + myPanel( 0 ), + myIsPrintErrorMessage( true ) { connect( this, SIGNAL( helpContextModule( const QString&, const QString&, const QString& ) ), @@ -208,18 +209,34 @@ void HYDROGUI_Operation::onApply() else { abortDocOperation(); + printErrorMessage( anErrorMsg ); + + // If the operation has no input panel - do abort + if ( !inputPanel() ) { + abort(); + } + } +} + +void HYDROGUI_Operation::setPrintErrorMessage( const bool theIsPrint ) +{ + myIsPrintErrorMessage = theIsPrint; +} + +void HYDROGUI_Operation::printErrorMessage( const QString& theErrorMsg ) +{ + if ( myIsPrintErrorMessage ) + { QString aMsg = tr( "INPUT_VALID_DATA" ); - if( !anErrorMsg.isEmpty() ) - aMsg.prepend( anErrorMsg + "\n" ); + if( !theErrorMsg.isEmpty() ) + aMsg.prepend( theErrorMsg + "\n" ); SUIT_MessageBox::critical( module()->getApp()->desktop(), tr( "INSUFFICIENT_INPUT_DATA" ), aMsg ); - // If the operation has no input panel - do abort - if ( !inputPanel() ) { - abort(); - } } + + myIsPrintErrorMessage = true; } void HYDROGUI_Operation::onCancel() diff --git a/src/HYDROGUI/HYDROGUI_Operation.h b/src/HYDROGUI/HYDROGUI_Operation.h index 7cf1b464..69cab654 100644 --- a/src/HYDROGUI/HYDROGUI_Operation.h +++ b/src/HYDROGUI/HYDROGUI_Operation.h @@ -36,50 +36,63 @@ class HYDROGUI_Operation : public LightApp_Operation Q_OBJECT public: + HYDROGUI_Operation( HYDROGUI_Module* theModule ); virtual ~HYDROGUI_Operation(); - void setName( const QString& theName ); - const QString& getName() const; +public: + + void setName( const QString& theName ); + const QString& getName() const; - HYDROGUI_InputPanel* inputPanel() const; - SUIT_SelectionMgr* selectionMgr() const; - HYDROGUI_Module* module() const; + HYDROGUI_InputPanel* inputPanel() const; + SUIT_SelectionMgr* selectionMgr() const; + HYDROGUI_Module* module() const; signals: - void helpContextModule( const QString&, const QString&, const QString& ); + void helpContextModule( const QString&, + const QString&, + const QString& ); + protected: - virtual void startOperation(); - virtual void abortOperation(); - virtual void commitOperation(); - virtual void setDialogActive( const bool ); + virtual void startOperation(); + virtual void abortOperation(); + virtual void commitOperation(); + virtual void setDialogActive( const bool ); - virtual HYDROGUI_InputPanel* createInputPanel() const; - virtual void closeInputPanel(); + virtual HYDROGUI_InputPanel* createInputPanel() const; + virtual void closeInputPanel(); - virtual bool processApply( int& theUpdateFlags, QString& theErrorMsg ); - virtual void processCancel(); + virtual bool processApply( int& theUpdateFlags, QString& theErrorMsg ); + virtual void processCancel(); - void startDocOperation(); - void abortDocOperation(); - void commitDocOperation(); + void startDocOperation(); + void abortDocOperation(); + void commitDocOperation(); - Handle_HYDROData_Document doc() const; + Handle_HYDROData_Document doc() const; + + void printErrorMessage( const QString& theErrorMsg ); + void setPrintErrorMessage( const bool theIsPrint ); protected slots: - virtual void onApply(); - virtual void onCancel(); - virtual void onHelp(); + + virtual void onApply(); + virtual void onCancel(); + virtual void onHelp(); protected: - QString getHelpComponent() const; - QString getHelpFile() const; - QString getHelpContext() const; + + QString getHelpComponent() const; + QString getHelpFile() const; + QString getHelpContext() const; private: - HYDROGUI_Module* myModule; - HYDROGUI_InputPanel* myPanel; - QString myName; + + HYDROGUI_Module* myModule; + HYDROGUI_InputPanel* myPanel; + QString myName; + bool myIsPrintErrorMessage; }; #endif diff --git a/src/HYDROGUI/HYDROGUI_PolylineOp.cxx b/src/HYDROGUI/HYDROGUI_PolylineOp.cxx index 835b9d04..83d3d7ef 100755 --- a/src/HYDROGUI/HYDROGUI_PolylineOp.cxx +++ b/src/HYDROGUI/HYDROGUI_PolylineOp.cxx @@ -44,6 +44,9 @@ #include +#include +#include + //static int ZValueIncrement = 0; HYDROGUI_PolylineOp::HYDROGUI_PolylineOp( HYDROGUI_Module* theModule, bool theIsEdit ) @@ -80,6 +83,21 @@ bool HYDROGUI_PolylineOp::deleteEnabled() void HYDROGUI_PolylineOp::startOperation() { + if( myIsEdit ) + { + myEditedObject = Handle(HYDROData_PolylineXY)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) ); + if ( !myEditedObject.IsNull() && !myEditedObject->IsEditable() ) + { + // Polyline is imported from GEOM module an is not recognized as + // polyline or spline and exist only as shape presentation + SUIT_MessageBox::critical( module()->getApp()->desktop(), + tr( "POLYLINE_IS_UNEDITABLE_TLT" ), + tr( "POLYLINE_IS_UNEDITABLE_MSG" ) ); + abort(); + return; + } + } + if( myCurve ) delete myCurve; @@ -95,9 +113,6 @@ void HYDROGUI_PolylineOp::startOperation() dynamic_cast( anApp->getViewManager( OCCViewer_Viewer::Type(), true ) ); aPanel->setOCCViewer( myViewManager ? myViewManager->getOCCViewer() : 0 ); - if( myIsEdit ) - myEditedObject = Handle(HYDROData_PolylineXY)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) ); - QString aPolylineName; if( !myEditedObject.IsNull() ) { diff --git a/src/HYDROGUI/resources/HYDROGUI_msg_en.ts b/src/HYDROGUI/resources/HYDROGUI_msg_en.ts index e6c3d02e..e06b5c12 100644 --- a/src/HYDROGUI/resources/HYDROGUI_msg_en.ts +++ b/src/HYDROGUI/resources/HYDROGUI_msg_en.ts @@ -1188,6 +1188,14 @@ file cannot be correctly imported for a Bathymetry definition. NUMBER_OF_SECTION_POINTS_INCORRECT Number of points in each polyline section should not be less than 2. + + POLYLINE_IS_UNEDITABLE_TLT + Polyline can not be edited + + + POLYLINE_IS_UNEDITABLE_MSG + Polyline has an unsupported format and can not be edited. + @@ -1480,6 +1488,16 @@ file cannot be correctly imported for a Bathymetry definition. NO_GEOM_OBJECT_TO_IMPORT No GEOM object(s) to import. + + POLYLINE_IS_UNRECOGNIZED_TLT + Imported curve has an unsupported format + + + POLYLINE_IS_UNRECOGNIZED_MSG + Imported curve has an unsupported by HYDRO format, +it will be unavailable for future editing. +Do you still want to continue? + -- 2.39.2