#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>
{
// erase curve from the viewer
if( myDisplayer )
- myDisplayer->erase();
+ myDisplayer->eraseAll( true );
// Delete all allocated data.
mySections[ 0 ]->myPoints.clear();
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;
if ( !aSection->myPoints.empty() )
aC = *(aSection->myPoints.end() - 2);
- if ( aSection->myPoints.empty() || aCoordU > aC )
+ if ( aSection->myPoints.empty() || aCoordU >= aC )
{
aSection->myPoints.push_back( aCoordU );
aSection->myPoints.push_back( aCoordZ );
//! For internal use only! Undo/Redo are not used here.
bool CurveCreator_Profile::setPointInternal( const CurveCreator::SectionsMap &theSectionsMap )
{
- bool res = false;
+ bool aRes = false;
- CurveCreator_Section* aSection = mySections.at( 0 );
+ if ( mySkipSorting ) {
+ return CurveCreator_Curve::setPointInternal( theSectionsMap );
+ }
+
+ int anISection = 0;
+ CurveCreator_Section* aSection = mySections.at( anISection );
if( !aSection )
- return res;
+ return aRes;
CurveCreator::SectionsMap::const_iterator anIt = theSectionsMap.begin();
- for ( ; anIt != theSectionsMap.end(); anIt++ )
- {
- int anISection = anIt->first;
- if( anISection != 0 )
- continue;
+ if ( anIt == theSectionsMap.end() )
+ return aRes;
- const CurveCreator::PosPointsList& aSectionPoints = anIt->second;
+ 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 );
+ std::list<int> aConvPoints;
+ convert( aSectionPoints, aConvPoints );
+ removeSectionPoints( anISection, aConvPoints );
- if ( res )
+ aRes = addPointsInternal( theSectionsMap );
+ if ( aRes )
redisplayCurve();
- return res;
+ return aRes;
+}
+
+void CurveCreator_Profile::convert( const CurveCreator::PosPointsList& thePoints,
+ std::list<int>& theConvPoints )
+{
+ theConvPoints.clear();
+
+ CurveCreator::PosPointsList::const_iterator aPntIt = thePoints.begin(),
+ aPntLast = thePoints.end();
+ for( ; aPntIt != aPntLast; aPntIt++ )
+ {
+ int anIPnt = (*aPntIt)->myID;
+ theConvPoints.push_back( anIPnt );
+ }
+}
+
+bool CurveCreator_Profile::canPointsBeSorted()
+{
+ return true;
}
+
+/**
+ * Add one point to the specified section starting from the given theIPnt index
+ * (or at the end of points if \a theIPnt is -1).
+ */
+bool CurveCreator_Profile::addPoints( const CurveCreator::Coordinates& theCoords,
+ const int theISection,
+ const int theIPnt )
+{
+ int anIPnt = theIPnt;
+
+ if ( anIPnt == - 1 && theCoords.size() > 1 ) {
+ CurveCreator::Coordinates aCoords;
+ for ( int i = 0, aNb = getNbPoints( theISection ); i < aNb; i++ ) {
+ aCoords = getPoint( theISection, i );
+ if ( aCoords.size() < 2 ) {
+ continue;
+ }
+
+ if ( theCoords[0] < aCoords[0] ) {
+ anIPnt = i;
+ break;
+ }
+ }
+ }
+
+ return CurveCreator_Curve::addPoints( theCoords, theISection, anIPnt );
+}
\ No newline at end of file