]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
The curve creator for Profile object first implementation.
authoradv <adv@opencascade.com>
Wed, 27 Nov 2013 11:07:15 +0000 (11:07 +0000)
committeradv <adv@opencascade.com>
Wed, 27 Nov 2013 11:07:15 +0000 (11:07 +0000)
src/HYDROCurveCreator/CMakeLists.txt
src/HYDROCurveCreator/CurveCreator_Profile.cxx [new file with mode: 0644]
src/HYDROCurveCreator/CurveCreator_Profile.hxx [new file with mode: 0644]

index 6913762d1a6d8b8083f5b475f051121cc12994d1..ee2a4c9e92f823832e8ce13d2f9274a265d3e680 100644 (file)
@@ -78,6 +78,7 @@ SET(_other_HEADERS
   CurveCreator_Section.hxx
   CurveCreator_Utils.h
   CurveCreator_PosPoint.hxx
+  CurveCreator_Profile.hxx
 )
 
 # header files / to install
@@ -97,6 +98,7 @@ SET(_other_SOURCES
   CurveCreator_Diff.cxx
   CurveCreator_Operation.cxx
   CurveCreator_Utils.cxx
+  CurveCreator_Profile.cxx
 )
 IF(SALOME_BUILD_GUI)
   LIST(APPEND _other_SOURCES
diff --git a/src/HYDROCurveCreator/CurveCreator_Profile.cxx b/src/HYDROCurveCreator/CurveCreator_Profile.cxx
new file mode 100644 (file)
index 0000000..bd56d27
--- /dev/null
@@ -0,0 +1,252 @@
+// Copyright (C) 2013  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "CurveCreator_Profile.hxx"
+
+#include "CurveCreator.hxx"
+#include "CurveCreator_PosPoint.hxx"
+#include "CurveCreator_Section.hxx"
+#include "CurveCreator_Displayer.h"
+
+#include <AIS_Point.hxx>
+#include <AIS_Line.hxx>
+#include <AIS_Shape.hxx>
+#include <BRepBuilderAPI_MakeEdge.hxx>
+#include <BRepBuilderAPI_MakeWire.hxx>
+#include <Geom_CartesianPoint.hxx>
+#include <gp_Pnt.hxx>
+#include <gp_Lin.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopoDS_Face.hxx>
+#include <TopoDS_Wire.hxx>
+#include <TColgp_HArray1OfPnt.hxx>
+#include <GeomAPI_Interpolate.hxx>
+
+#include <stdio.h>
+
+CurveCreator_Profile::CurveCreator_Profile()
+: CurveCreator_Curve( CurveCreator::Dim2d )
+{
+  CurveCreator_Section *aSection = new CurveCreator_Section;
+  aSection->myName     = getUniqSectionName();
+  aSection->myType     = CurveCreator::Polyline;
+  aSection->myIsClosed = false;
+
+  mySections.push_back( aSection );
+}
+
+CurveCreator_Profile::~CurveCreator_Profile()
+{
+}
+
+bool CurveCreator_Profile::moveSectionInternal( const int theISection,
+                                                const int theNewIndex )
+{
+  return false;
+}
+
+bool CurveCreator_Profile::moveSection( const int theISection,
+                                        const int theNewIndex )
+{
+  return false;
+}
+
+bool CurveCreator_Profile::clearInternal()
+{
+  // erase curve from the viewer
+  if( myDisplayer )
+    myDisplayer->erase();
+
+  // Delete all allocated data.
+  mySections[ 0 ]->myPoints.clear();
+
+  return true;
+}
+
+bool CurveCreator_Profile::joinInternal( const int theISectionTo, 
+                                         const int theISectionFrom )
+{
+  return false;
+}
+
+bool CurveCreator_Profile::join( const int theISectionTo, 
+                                 const int theISectionFrom )
+{
+  return false;
+}
+
+int CurveCreator_Profile::addSectionInternal( const std::string&               theName, 
+                                              const CurveCreator::SectionType  theType,
+                                              const bool                       theIsClosed, 
+                                              const CurveCreator::Coordinates& thePoints )
+{
+  return -1;
+}
+
+int CurveCreator_Profile::addSection( const std::string&              theName,
+                                      const CurveCreator::SectionType theType,
+                                      const bool                      theIsClosed )
+{
+  return -1;
+}
+
+int CurveCreator_Profile::addSection( const std::string&               theName,
+                                      const CurveCreator::SectionType  theType,
+                                      const bool                       theIsClosed, 
+                                      const CurveCreator::Coordinates& thePoints )
+{
+  return -1;
+}
+
+bool CurveCreator_Profile::removeSectionInternal( const int theISection )
+{
+  return false;
+}
+  
+bool CurveCreator_Profile::removeSection( const int theISection )
+{
+  return false;
+}
+
+bool CurveCreator_Profile::setClosedInternal( const int theISection, 
+                                              const bool theIsClosed )
+{
+  return false;
+}
+
+bool CurveCreator_Profile::setClosed( const int theISection, 
+                                      const bool theIsClosed )
+{
+  return false;
+}
+
+bool CurveCreator_Profile::setSectionTypeInternal( const int theISection, 
+                                                   const CurveCreator::SectionType theType )
+{
+  return false;
+}
+
+bool CurveCreator_Profile::setSectionType( const int theISection, 
+                                           const CurveCreator::SectionType theType )
+{
+  return false;
+}
+
+bool CurveCreator_Profile::addPointsInternal( const CurveCreator::SectionsMap &theSectionsMap )
+{
+  bool res = false;
+
+  CurveCreator_Section* aSection = mySections.at( 0 );
+  if( !aSection )
+    return res;
+
+  CurveCreator::SectionsMap::const_iterator anIt = theSectionsMap.begin();
+  for ( ; anIt != theSectionsMap.end(); anIt++ )
+  {
+    int anISection = anIt->first;
+    if( anISection != 0 )
+      continue;
+
+    const CurveCreator::PosPointsList& aSectionPoints = anIt->second;
+
+    CurveCreator::PosPointsList::const_iterator aPntIt = aSectionPoints.begin();
+    for( ; aPntIt != aSectionPoints.end(); aPntIt++ )
+    {
+      const CurveCreator::Coordinates& aNewCoords = (*aPntIt)->myCoords;
+      CurveCreator::Coordinates::const_iterator aNewPntIt = aNewCoords.begin();
+      for( ; aNewPntIt != aNewCoords.end(); aNewPntIt++ )
+      {
+        const CurveCreator::TypeCoord& aCoordU = *aNewPntIt++;
+        if ( aNewPntIt == aNewCoords.end() )
+          break;
+        
+        const CurveCreator::TypeCoord& aCoordZ = *aNewPntIt;
+
+        CurveCreator::TypeCoord aC = aCoordU - 1;
+        if ( !aSection->myPoints.empty() )
+          aC = *(aSection->myPoints.end() - 2);
+
+        if ( aSection->myPoints.empty() || aCoordU > aC )
+        {
+          aSection->myPoints.push_back( aCoordU );
+          aSection->myPoints.push_back( aCoordZ );
+        }
+        else if ( aCoordU < aSection->myPoints.front() )
+        {
+          aSection->myPoints.push_front( aCoordZ );
+          aSection->myPoints.push_front( aCoordU );
+        }
+        else
+        {
+          CurveCreator::Coordinates::iterator aRefPntIt = aSection->myPoints.begin();
+          for( ; aRefPntIt != aSection->myPoints.end(); aRefPntIt++ )
+          {
+            const CurveCreator::TypeCoord& aRefCoordU = *aRefPntIt++;
+            if ( aCoordU < aRefCoordU )
+              break;
+          }
+
+          aSection->myPoints.insert( aRefPntIt - 1, aNewPntIt - 1, aNewPntIt + 1 );
+        }
+      }
+    }
+
+    res = true;
+  }
+
+  if ( res )
+    redisplayCurve();
+
+  return res;
+}
+
+//! For internal use only! Undo/Redo are not used here.
+bool CurveCreator_Profile::setPointInternal( const CurveCreator::SectionsMap &theSectionsMap )
+{
+  bool res = false;
+
+  CurveCreator_Section* aSection = mySections.at( 0 );
+  if( !aSection )
+    return res;
+
+  CurveCreator::SectionsMap::const_iterator anIt = theSectionsMap.begin();
+  for ( ; anIt != theSectionsMap.end(); anIt++ )
+  {
+    int anISection = anIt->first;
+    if( anISection != 0 )
+      continue;
+
+    const CurveCreator::PosPointsList& aSectionPoints = anIt->second;
+
+    CurveCreator::PosPointsList::const_iterator aPntIt = aSectionPoints.begin();
+    for( ; aPntIt != aSectionPoints.end(); aPntIt++ )
+    {
+      int anIPnt = (*aPntIt)->myID;
+      aSection->myPoints.erase( aSection->myPoints.begin() + toICoord( anIPnt ), 
+                                aSection->myPoints.begin() + toICoord( anIPnt ) + 2 );
+    }
+  }
+
+  res = addPointsInternal( theSectionsMap );
+
+  if ( res )
+    redisplayCurve();
+
+  return res;
+}
diff --git a/src/HYDROCurveCreator/CurveCreator_Profile.hxx b/src/HYDROCurveCreator/CurveCreator_Profile.hxx
new file mode 100644 (file)
index 0000000..288732c
--- /dev/null
@@ -0,0 +1,129 @@
+// Copyright (C) 2013  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef _CurveCreator_Profile_HeaderFile
+#define _CurveCreator_Profile_HeaderFile
+
+#include "CurveCreator_Curve.hxx"
+
+/**
+ *  The CurveCreator_Curve object is represented as one or more sets of
+ *  connected points; thus CurveCreator_Curve object can contain several
+ *  not connected curves (polylines or b-splines), each such curve has two
+ *  only ends start and end points in other words non-manifold curves
+ *  are not supported.
+ */
+class CURVECREATOR_EXPORT CurveCreator_Profile : public CurveCreator_Curve
+{
+
+public:
+
+  //! Constructor of the curve.
+  CurveCreator_Profile();
+
+  //! Destructor.
+  virtual ~CurveCreator_Profile();
+
+public:
+
+  /***********************************************/
+  /***           Section methods               ***/
+  /***********************************************/
+
+  //! For internal use only! Undo/Redo are not used here.
+  virtual bool clearInternal();
+
+  //! For internal use only! Undo/Redo are not used here.
+  virtual bool joinInternal( const int theISectionTo = -1, 
+                             const int theISectionFrom = -1 );
+
+  //! For internal use only! Undo/Redo are not used here.
+  virtual bool moveSectionInternal( const int theISection,
+                                    const int theNewIndex);
+  //! Move section to new position in list
+  virtual bool moveSection( const int theISection,
+                            const int theNewIndex );
+
+  //! Join range of sections to one section (join all sections if -1 is passed in one of arguments)
+  virtual bool join( const int theISectionTo = -1, 
+                     const int theISectionFrom = -1 );
+
+  //! For internal use only! Undo/Redo are not used here.
+  virtual int addSectionInternal( const std::string &theName, 
+                                  const CurveCreator::SectionType theType,
+                                  const bool theIsClosed,
+                                  const CurveCreator::Coordinates &thePoints);
+  //! Add a new section.
+  virtual int addSection( const std::string &theName, 
+                           const CurveCreator::SectionType theType,
+                           const bool theIsClosed );
+  //! Add a new section.
+  virtual int addSection( const std::string &theName, 
+                           const CurveCreator::SectionType theType,
+                           const bool theIsClosed,
+                           const CurveCreator::Coordinates &thePoints);
+  
+  
+  //! For internal use only! Undo/Redo are not used here.
+  virtual bool removeSectionInternal( const int theISection );
+
+  //! Removes the given sections.
+  virtual bool removeSection( const int theISection );
+
+  
+  //! For internal use only! Undo/Redo are not used here.
+  virtual bool setClosedInternal( const int theISection, 
+                                  const bool theIsClosed );
+  /**
+   *  Set "closed" flag of the specified section (all sections if
+   *  \a theISection is -1).
+   */
+  virtual bool setClosed( const int theISection, 
+                          const bool theIsClosed );
+
+  
+  //! For internal use only! Undo/Redo are not used here.
+  virtual bool setSectionTypeInternal( const int theISection, 
+                                       const CurveCreator::SectionType theType );
+  /**
+   *  Set type of the specified section (or all sections
+   *  if \a theISection is -1).
+   */
+  virtual bool setSectionType( const int theISection, 
+                               const CurveCreator::SectionType theType );
+
+
+  /***********************************************/
+  /***           Point methods                 ***/
+  /***********************************************/
+
+  //! For internal use only! Undo/Redo are not used here.
+  virtual bool addPointsInternal( const CurveCreator::SectionsMap &theSectionsMap );
+  /**
+   *  Add one point to the specified section starting from the given theIPnt index
+   *  (or at the end of points if \a theIPnt is -1).
+   */
+  //! For internal use only! Undo/Redo are not used here.
+  virtual bool setPointInternal( const CurveCreator::SectionsMap &theSectionsMap );
+
+private:
+
+};
+
+#endif