Salome HOME
bug #155: create profile of splines
[modules/hydro.git] / src / HYDROCurveCreator / CurveCreator_Profile.cxx
1 // Copyright (C) 2013  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "CurveCreator_Profile.hxx"
21
22 #include "CurveCreator.hxx"
23 #include "CurveCreator_PosPoint.hxx"
24 #include "CurveCreator_Section.hxx"
25 #include "CurveCreator_Displayer.h"
26
27 #include <BRepBuilderAPI_MakeEdge.hxx>
28 #include <BRepBuilderAPI_MakeWire.hxx>
29 #include <Geom_CartesianPoint.hxx>
30 #include <gp_Pnt.hxx>
31 #include <gp_Lin.hxx>
32 #include <TopoDS_Edge.hxx>
33 #include <TopoDS_Face.hxx>
34 #include <TopoDS_Wire.hxx>
35 #include <TColgp_HArray1OfPnt.hxx>
36 #include <GeomAPI_Interpolate.hxx>
37
38 #include <stdio.h>
39
40 CurveCreator_Profile::CurveCreator_Profile()
41 : CurveCreator_Curve( CurveCreator::Dim2d )
42 {
43   CurveCreator_Section *aSection = new CurveCreator_Section;
44   aSection->myName     = getUniqSectionName();
45   aSection->myType     = CurveCreator::Polyline;
46   aSection->myIsClosed = false;
47
48   mySections.push_back( aSection );
49 }
50
51 CurveCreator_Profile::~CurveCreator_Profile()
52 {
53 }
54
55 bool CurveCreator_Profile::moveSectionInternal( const int theISection,
56                                                 const int theNewIndex )
57 {
58   return false;
59 }
60
61 bool CurveCreator_Profile::moveSection( const int theISection,
62                                         const int theNewIndex )
63 {
64   return false;
65 }
66
67 bool CurveCreator_Profile::clearInternal()
68 {
69   // erase curve from the viewer
70   if( myDisplayer )
71     myDisplayer->erase( true );
72
73   // Delete all allocated data.
74   mySections[ 0 ]->myPoints.clear();
75
76   return true;
77 }
78
79 bool CurveCreator_Profile::joinInternal( const int theISectionTo, 
80                                          const int theISectionFrom )
81 {
82   return false;
83 }
84
85 bool CurveCreator_Profile::join( const int theISectionTo, 
86                                  const int theISectionFrom )
87 {
88   return false;
89 }
90
91 int CurveCreator_Profile::addSectionInternal( const std::string&               theName, 
92                                               const CurveCreator::SectionType  theType,
93                                               const bool                       theIsClosed, 
94                                               const CurveCreator::Coordinates& thePoints )
95 {
96   return -1;
97 }
98
99 int CurveCreator_Profile::addSection( const std::string&              theName,
100                                       const CurveCreator::SectionType theType,
101                                       const bool                      theIsClosed )
102 {
103   return -1;
104 }
105
106 int CurveCreator_Profile::addSection( const std::string&               theName,
107                                       const CurveCreator::SectionType  theType,
108                                       const bool                       theIsClosed, 
109                                       const CurveCreator::Coordinates& thePoints )
110 {
111   return -1;
112 }
113
114 bool CurveCreator_Profile::removeSectionInternal( const int theISection )
115 {
116   return false;
117 }
118   
119 bool CurveCreator_Profile::removeSection( const int theISection )
120 {
121   return false;
122 }
123
124 bool CurveCreator_Profile::setClosedInternal( const int theISection, 
125                                               const bool theIsClosed )
126 {
127   return false;
128 }
129
130 bool CurveCreator_Profile::setClosed( const int theISection, 
131                                       const bool theIsClosed )
132 {
133   return false;
134 }
135
136 bool CurveCreator_Profile::setSectionTypeInternal( const int theISection, 
137                                                    const CurveCreator::SectionType theType )
138 {
139   return CurveCreator_Curve::setSectionTypeInternal( theISection, theType );
140 }
141
142 bool CurveCreator_Profile::setSectionType( const int theISection, 
143                                            const CurveCreator::SectionType theType )
144 {
145   return CurveCreator_Curve::setSectionType( theISection, theType );
146 }
147
148 bool CurveCreator_Profile::addPointsInternal( const CurveCreator::SectionsMap &theSectionsMap )
149 {
150   bool res = false;
151
152   CurveCreator_Section* aSection = mySections.at( 0 );
153   if( !aSection )
154     return res;
155
156   CurveCreator::SectionsMap::const_iterator anIt = theSectionsMap.begin();
157   for ( ; anIt != theSectionsMap.end(); anIt++ )
158   {
159     int anISection = anIt->first;
160     if( anISection != 0 )
161       continue;
162
163     const CurveCreator::PosPointsList& aSectionPoints = anIt->second;
164
165     CurveCreator::PosPointsList::const_iterator aPntIt = aSectionPoints.begin();
166     for( ; aPntIt != aSectionPoints.end(); aPntIt++ )
167     {
168       const CurveCreator::Coordinates& aNewCoords = (*aPntIt)->myCoords;
169       CurveCreator::Coordinates::const_iterator aNewPntIt = aNewCoords.begin();
170       for( ; aNewPntIt != aNewCoords.end(); aNewPntIt++ )
171       {
172         const CurveCreator::TypeCoord& aCoordU = *aNewPntIt++;
173         if ( aNewPntIt == aNewCoords.end() )
174           break;
175         
176         const CurveCreator::TypeCoord& aCoordZ = *aNewPntIt;
177
178         CurveCreator::TypeCoord aC = aCoordU - 1;
179         if ( !aSection->myPoints.empty() )
180           aC = *(aSection->myPoints.end() - 2);
181
182         if ( aSection->myPoints.empty() || aCoordU > aC )
183         {
184           aSection->myPoints.push_back( aCoordU );
185           aSection->myPoints.push_back( aCoordZ );
186         }
187         else if ( aCoordU < aSection->myPoints.front() )
188         {
189           aSection->myPoints.push_front( aCoordZ );
190           aSection->myPoints.push_front( aCoordU );
191         }
192         else
193         {
194           CurveCreator::Coordinates::iterator aRefPntIt = aSection->myPoints.begin();
195           for( ; aRefPntIt != aSection->myPoints.end(); aRefPntIt++ )
196           {
197             const CurveCreator::TypeCoord& aRefCoordU = *aRefPntIt++;
198             if ( aCoordU < aRefCoordU )
199               break;
200           }
201
202           aSection->myPoints.insert( aRefPntIt - 1, aNewPntIt - 1, aNewPntIt + 1 );
203         }
204       }
205     }
206
207     res = true;
208   }
209
210   if ( res )
211     redisplayCurve();
212
213   return res;
214 }
215
216 //! For internal use only! Undo/Redo are not used here.
217 bool CurveCreator_Profile::setPointInternal( const CurveCreator::SectionsMap &theSectionsMap )
218 {
219   bool res = false;
220
221   CurveCreator_Section* aSection = mySections.at( 0 );
222   if( !aSection )
223     return res;
224
225   CurveCreator::SectionsMap::const_iterator anIt = theSectionsMap.begin();
226   for ( ; anIt != theSectionsMap.end(); anIt++ )
227   {
228     int anISection = anIt->first;
229     if( anISection != 0 )
230       continue;
231
232     const CurveCreator::PosPointsList& aSectionPoints = anIt->second;
233
234     CurveCreator::PosPointsList::const_iterator aPntIt = aSectionPoints.begin();
235     for( ; aPntIt != aSectionPoints.end(); aPntIt++ )
236     {
237       int anIPnt = (*aPntIt)->myID;
238       aSection->myPoints.erase( aSection->myPoints.begin() + toICoord( anIPnt ), 
239                                 aSection->myPoints.begin() + toICoord( anIPnt ) + 2 );
240     }
241   }
242
243   res = addPointsInternal( theSectionsMap );
244
245   if ( res )
246     redisplayCurve();
247
248   return res;
249 }