]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
Import polyline from shape (Feature #228).
authoradv <adv@opencascade.com>
Fri, 20 Dec 2013 05:46:27 +0000 (05:46 +0000)
committeradv <adv@opencascade.com>
Fri, 20 Dec 2013 05:46:27 +0000 (05:46 +0000)
src/HYDROData/HYDROData_IPolyline.h
src/HYDROData/HYDROData_PolylineXY.cxx
src/HYDROData/HYDROData_PolylineXY.h
src/HYDROData/HYDROData_ProfileUZ.cxx
src/HYDROData/HYDROData_ProfileUZ.h
src/HYDROGUI/HYDROGUI_ImportGeomObjectOp.cxx
src/HYDROGUI/HYDROGUI_Operation.cxx
src/HYDROGUI/HYDROGUI_Operation.h
src/HYDROGUI/HYDROGUI_PolylineOp.cxx
src/HYDROGUI/resources/HYDROGUI_msg_en.ts

index 1a7c63ae5ece8010b1d37757d409e39921eaeb7a..aa68ccb035b33b40b164babb747a5569b8b52035 100644 (file)
@@ -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;
 
 
   /**
index 5129d6e8568574edd4844e7e860d59fcf8014475..4d8179d2763810a622a1d60a43370673737accd0 100755 (executable)
@@ -3,6 +3,7 @@
 
 #include "HYDROData_BSplineOperation.h"
 #include "HYDROData_Document.h"
+#include "HYDROData_ShapesTool.h"
 #include "HYDROData_Tool.h"
 
 #include <BRep_Builder.hxx>
@@ -11,6 +12,8 @@
 
 #include <GeomAPI_ProjectPointOnCurve.hxx>
 #include <GeomAdaptor_Curve.hxx>
+#include <Geom_Line.hxx>
+#include <Geom_BSplineCurve.hxx>
 
 #include <GCPnts_AbscissaPoint.hxx>
 
 #include <TColStd_ListIteratorOfListOfInteger.hxx>
 #include <TColStd_ListIteratorOfListOfReal.hxx>
 
+#include <TColStd_Array1OfReal.hxx>
+
 #include <TDataStd_BooleanList.hxx>
 #include <TDataStd_ExtStringList.hxx>
 #include <TDataStd_IntegerList.hxx>
 #include <TDataStd_ListIteratorOfListOfExtendedString.hxx>
 #include <TDataStd_RealList.hxx>
+#include <TDataStd_UAttribute.hxx>
 
 #include <TopoDS_Iterator.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
 #include <QPainterPath>
 #include <QVariant>
 
+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<TCollection_AsciiString>& theNamesSeq )
+{
+  NCollection_Map<TCollection_AsciiString> 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<TCollection_AsciiString> 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<TCollection_AsciiString>&           theSectNames,
+                           NCollection_Sequence<HYDROData_PolylineXY::SectionType>& theSectTypes,
+                           NCollection_Sequence<bool>&                              theSectClosures,
+                           NCollection_Sequence<HYDROData_PolylineXY::PointsList>&  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<TCollection_AsciiString> aSectNames;
+  NCollection_Sequence<SectionType>             aSectTypes;
+  NCollection_Sequence<bool>                    aSectClosures;
+  NCollection_Sequence<PointsList>              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<gp_XYZ>& 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<TCollection_AsciiString>           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<TCollection_AsciiString>           aSectNames;
-  NCollection_Sequence<HYDROData_PolylineXY::SectionType> aSectTypes;
-  NCollection_Sequence<bool>                              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<TCollection_ExtendedString> 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 )
 {
index d14212e163ab7e52694d798d7752b2236b572510..32732b08c1a61a7b48fbdc75e2552c0b33235edc 100644 (file)
@@ -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;
index f18e98aa900ed304b0d36c2706ca28507927beb9..649c8096a824f2998204787f15d24015218032c8 100755 (executable)
@@ -28,7 +28,7 @@ HYDROData_ProfileUZ::~HYDROData_ProfileUZ()
 {
 }
 
-TopoDS_Shape HYDROData_ProfileUZ::GetShape()
+TopoDS_Shape HYDROData_ProfileUZ::GetShape() const
 {
   // TODO
   return TopoDS_Shape();
index b982a1d8b471dd85dbca96ec7af57ffc43a32709..0e1dcd0d54892d29908675717db31e13894cb624 100644 (file)
@@ -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.
index c3d9488f872559c42382f29a59116dbb60f7d20b..8715e91892218fb6aea602f57c3a7ce6b251bd9a 100644 (file)
@@ -41,6 +41,7 @@
 #include <LightApp_UpdateFlags.h>
 
 #include <SUIT_Desktop.h>
+#include <SUIT_MessageBox.h>
 
 #include <QDialog>
 
@@ -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
index 90a5e308ee3486345c6d5394f0eeb184ae8b0e5e..bdbd6fa05ffd1c86b4ea310a681dbf3f63b3ac1a 100644 (file)
@@ -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()
index 7cf1b464190b9b38450fc47ad59fe2913c8cbb60..69cab654ccde1607d2b479171b5237ec469cb72e 100644 (file)
@@ -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
index 835b9d04d18f341507a19b3c81f089a00abfc57e..83d3d7ef4ab65adab08ad4a580a7a3c49c68cf8c 100755 (executable)
@@ -44,6 +44,9 @@
 
 #include <Precision.hxx>
 
+#include <SUIT_MessageBox.h>
+#include <SUIT_Desktop.h>
+
 //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<OCCViewer_ViewManager*>( 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() )
   {
index e6c3d02e75efe057544eb4bf77bb85f67a5e881b..e06b5c12f7fb65940f0bbca489b11e5ea2dcc95c 100644 (file)
@@ -1188,6 +1188,14 @@ file cannot be correctly imported for a Bathymetry definition.</translation>
       <source>NUMBER_OF_SECTION_POINTS_INCORRECT</source>
       <translation>Number of points in each polyline section should not be less than 2.</translation>
     </message>
+    <message>
+      <source>POLYLINE_IS_UNEDITABLE_TLT</source>
+      <translation>Polyline can not be edited</translation>
+    </message>
+    <message>
+      <source>POLYLINE_IS_UNEDITABLE_MSG</source>
+      <translation>Polyline has an unsupported format and can not be edited.</translation>
+    </message>
   </context>
 
   <context>
@@ -1480,6 +1488,16 @@ file cannot be correctly imported for a Bathymetry definition.</translation>
       <source>NO_GEOM_OBJECT_TO_IMPORT</source>
       <translation>No GEOM object(s) to import.</translation>
     </message>
+    <message>
+      <source>POLYLINE_IS_UNRECOGNIZED_TLT</source>
+      <translation>Imported curve has an unsupported format</translation>
+    </message>
+    <message>
+      <source>POLYLINE_IS_UNRECOGNIZED_MSG</source>
+      <translation>Imported curve has an unsupported by HYDRO format,
+it will be unavailable for future editing.
+Do you still want to continue?</translation>
+    </message>
   </context>
 
   <context>