From 1c7e2cd6a209334f05f76aaf952881636ba0969c Mon Sep 17 00:00:00 2001 From: nds Date: Tue, 3 Dec 2013 15:09:46 +0000 Subject: [PATCH] OCC functionality moving out from the widget --- src/HYDROCurveCreator/CurveCreator_Curve.cxx | 109 +++-------------- src/HYDROCurveCreator/CurveCreator_Curve.hxx | 5 +- .../CurveCreator_Displayer.h | 1 + src/HYDROCurveCreator/CurveCreator_Utils.cxx | 115 +++++++++++++++++- src/HYDROCurveCreator/CurveCreator_Utils.h | 13 ++ .../CurveCreator_UtilsICurve.cxx | 12 ++ .../CurveCreator_UtilsICurve.hxx | 3 + 7 files changed, 165 insertions(+), 93 deletions(-) diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.cxx b/src/HYDROCurveCreator/CurveCreator_Curve.cxx index 99845e43..cab312d6 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.cxx @@ -26,20 +26,17 @@ #include "CurveCreator_PosPoint.hxx" #include "CurveCreator_Section.hxx" #include "CurveCreator_Displayer.h" +#include "CurveCreator_Utils.h" #include #include #include -#include -#include #include #include #include #include #include #include -#include -#include #include @@ -185,59 +182,33 @@ int CurveCreator_Curve::toICoord(const int theIPnt) const return theIPnt * myDimension; } -#include -#include -#include -#include //#define USE_COMPOUND std::vector CurveCreator_Curve::constructSection( int theISection ) const { std::vector aSectionRepresentation; - CurveCreator::SectionType aSectType = getSectionType( theISection ); + + bool isShapeConstruct = false; +#ifdef USE_COMPOUND + isShapeConstruct = true; +#else + isShapeConstruct = aSectType == CurveCreator::Spline; +#endif + + if ( isShapeConstruct ) { + TopoDS_Shape aShape; + CurveCreator_Utils::constructShape( this, theISection, aShape ); + AIS_Shape* anAISShape = new AIS_Shape( aShape ); + //aShape->SetSelectionMode( AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)TopAbs_VERTEX ) ); + aSectionRepresentation.push_back( anAISShape ); + if ( aSectType != CurveCreator::Spline ) + return aSectionRepresentation; + } + int aPointSize = getNbPoints( theISection ); bool aSectIsClosed = isClosed( theISection ); if( aSectType == CurveCreator::Polyline ) { -#ifdef USE_COMPOUND - BRep_Builder aBuilder; - TopoDS_Compound aComp; - aBuilder.MakeCompound(aComp); - - int iPoint = 0; - gp_Pnt aPrevPoint, aPoint; - if ( aPointSize == 1 ) { - getPoint( theISection, iPoint, aPrevPoint ); - TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex( aPrevPoint ).Vertex(); - aBuilder.Add( aComp, aVertex ); - } - else if ( aPointSize > 1 ) { - TopoDS_Edge aPointEdge; - TopoDS_Vertex aVertex; - getPoint( theISection, iPoint, aPrevPoint ); - aVertex = BRepBuilderAPI_MakeVertex( aPrevPoint ).Vertex(); - aBuilder.Add( aComp, aVertex ); - iPoint++; - for( ; iPoint < aPointSize; iPoint++ ) { - getPoint( theISection, iPoint, aPoint ); - aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex(); - aBuilder.Add( aComp, aVertex ); - aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge(); - aBuilder.Add( aComp, aPointEdge ); - aPrevPoint = aPoint; - } - if( isClosed( theISection ) && ( aPointSize > 2 ) ) { - getPoint( theISection, 0, aPoint ); - aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex(); - aBuilder.Add( aComp, aVertex ); - aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge(); - aBuilder.Add( aComp, aPointEdge ); - } - AIS_Shape* aShape = new AIS_Shape( aComp ); - //aShape->SetSelectionMode( AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)TopAbs_VERTEX ) ); - aSectionRepresentation.push_back( aShape ); - } -#else int iPoint = 0; for( ; iPoint < ( aPointSize - 1 ) ; iPoint++ ){ Handle_AIS_Point anAISPnt = getAISPoint(theISection, iPoint); @@ -253,57 +224,15 @@ std::vector CurveCreator_Curve::constructSection( aSectionRepresentation.push_back( aLine ); } } -#endif } else if( aSectType == CurveCreator::Spline ) { -#ifdef USE_COMPOUND - -#else std::vector aPoints; for( int iPoint = 0; iPoint < aPointSize; iPoint++ ) { Handle_AIS_Point anAISPnt = getAISPoint( theISection, iPoint ); aSectionRepresentation.push_back( anAISPnt ); - - CurveCreator::Coordinates aCoords = getPoint( theISection, iPoint ); - double aX = aCoords[0]; - double aY = aCoords[1]; - double aZ = aCoords[2]; - aPoints.push_back( aX ); - aPoints.push_back( aY ); } - - if( aPointSize > 1 ) - { - Handle(Geom_BSplineCurve) aBSplineCurve; - // fill array for algorithm by the received coordinates - int aLen = aPoints.size() / 2; - Handle(TColgp_HArray1OfPnt) aHCurvePoints = new TColgp_HArray1OfPnt (1, aLen); - std::vector::const_iterator aListIter = aPoints.begin(); - for (int ind = 1; ind <= aLen; ind++) { - gp_Pnt aPnt(gp::Origin()); - aPnt.SetX(*aListIter); - aListIter++; - aPnt.SetY(*aListIter); - aListIter++; - aPnt.SetZ(0); - aHCurvePoints->SetValue(ind, aPnt); - } - // compute BSpline - GeomAPI_Interpolate aGBC(aHCurvePoints, aSectIsClosed, gp::Resolution()); - aGBC.Perform(); - if (aGBC.IsDone()) { - aBSplineCurve = aGBC.Curve(); - } - TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge( aBSplineCurve ).Edge(); - - TopoDS_Wire aWire = BRepBuilderAPI_MakeWire( anEdge ).Wire(); - - Handle(AIS_Shape) aShape = new AIS_Shape( aWire ); - aSectionRepresentation.push_back( aShape ); - } -#endif } return aSectionRepresentation; } diff --git a/src/HYDROCurveCreator/CurveCreator_Curve.hxx b/src/HYDROCurveCreator/CurveCreator_Curve.hxx index 0f8e887f..339a485f 100644 --- a/src/HYDROCurveCreator/CurveCreator_Curve.hxx +++ b/src/HYDROCurveCreator/CurveCreator_Curve.hxx @@ -112,9 +112,9 @@ protected: Handle_AIS_Point getAISPoint( int theISection, int theIPoint ) const; Handle_AIS_Line getAISLine( int theISection, int theIPoint1, int theIPoint2 ) const; -public: // temporary +public: // TODO: remove public void getCoordinates( int theISection, int theIPoint, double& theX, double& theY, double& theZ ) const; -protected: // temporary +protected: // TODO: remove public void redisplayCurve(); void convert( const SectionToPointList &thePoints, @@ -270,6 +270,7 @@ public: /***********************************************/ virtual ListAISObjects constructWire() const; +public: // TODO: remove void getPoint( const int theSectionId, const int thePointId, gp_Pnt& thePoint ) const; public: diff --git a/src/HYDROCurveCreator/CurveCreator_Displayer.h b/src/HYDROCurveCreator/CurveCreator_Displayer.h index fcd28056..fba268bc 100644 --- a/src/HYDROCurveCreator/CurveCreator_Displayer.h +++ b/src/HYDROCurveCreator/CurveCreator_Displayer.h @@ -16,6 +16,7 @@ public: CurveCreator_Displayer(Handle_AIS_InteractiveContext theContext ); ~CurveCreator_Displayer(void); + //TODO: remove Handle_AIS_InteractiveContext getAISContext() { return myContext; } void display( AISObjectsList theCurveObjects, bool isUpdate ); diff --git a/src/HYDROCurveCreator/CurveCreator_Utils.cxx b/src/HYDROCurveCreator/CurveCreator_Utils.cxx index 12d7ee7d..c05b926a 100644 --- a/src/HYDROCurveCreator/CurveCreator_Utils.cxx +++ b/src/HYDROCurveCreator/CurveCreator_Utils.cxx @@ -18,6 +18,8 @@ // #include "CurveCreator_Utils.h" +#include "CurveCreator.hxx" +#include "CurveCreator_UtilsICurve.hxx" #include @@ -27,6 +29,7 @@ #include #include #include +#include #include #include @@ -40,13 +43,23 @@ #include #include -#include #include #include +#include +#include +#include +#include +#include + +#include +#include + #include #include +#include "CurveCreator_ICurve.hxx" + const double LOCAL_SELECTION_TOLERANCE = 0.0001; const int SCENE_PIXEL_TOLERANCE = 10; @@ -71,6 +84,106 @@ gp_Pnt CurveCreator_Utils::ConvertClickToPoint( int x, int y, Handle(V3d_View) a return GEOMUtils::ConvertClickToPoint( x, y, aView ); } + +//#define USE_COMPOUND +void CurveCreator_Utils::constructShape( const CurveCreator_ICurve* theCurve, + const int theISection, TopoDS_Shape& theShape ) +{ + CurveCreator::SectionType aSectType = theCurve->getSectionType( theISection ); + + + int aPointSize = theCurve->getNbPoints( theISection ); + bool aSectIsClosed = theCurve->isClosed( theISection ); + if( aSectType == CurveCreator::Polyline ) + { +//#ifdef USE_COMPOUND + BRep_Builder aBuilder; + TopoDS_Compound aComp; + aBuilder.MakeCompound(aComp); + + int iPoint = 0; + gp_Pnt aPrevPoint, aPoint; + if ( aPointSize == 1 ) { + CurveCreator_UtilsICurve::getPoint( theCurve, theISection, iPoint, aPrevPoint ); + TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex( aPrevPoint ).Vertex(); + aBuilder.Add( aComp, aVertex ); + } + else if ( aPointSize > 1 ) { + TopoDS_Edge aPointEdge; + TopoDS_Vertex aVertex; + CurveCreator_UtilsICurve::getPoint( theCurve, theISection, iPoint, aPrevPoint ); + aVertex = BRepBuilderAPI_MakeVertex( aPrevPoint ).Vertex(); + aBuilder.Add( aComp, aVertex ); + iPoint++; + for( ; iPoint < aPointSize; iPoint++ ) { + CurveCreator_UtilsICurve::getPoint( theCurve, theISection, iPoint, aPoint ); + aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex(); + aBuilder.Add( aComp, aVertex ); + aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge(); + aBuilder.Add( aComp, aPointEdge ); + aPrevPoint = aPoint; + } + if( theCurve->isClosed( theISection ) && ( aPointSize > 2 ) ) { + CurveCreator_UtilsICurve::getPoint( theCurve, theISection, 0, aPoint ); + aVertex = BRepBuilderAPI_MakeVertex( aPoint ).Vertex(); + aBuilder.Add( aComp, aVertex ); + aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge(); + aBuilder.Add( aComp, aPointEdge ); + } + theShape = aComp; + } +//#endif + } + else if( aSectType == CurveCreator::Spline ) + { +#ifdef USE_COMPOUND + +#else + std::vector aPoints; + for( int iPoint = 0; iPoint < aPointSize; iPoint++ ) + { + //Handle_AIS_Point anAISPnt = theCurve->getAISPoint( theISection, iPoint ); + //aSectionRepresentation.push_back( anAISPnt ); + + CurveCreator::Coordinates aCoords = theCurve->getPoint( theISection, iPoint ); + double aX = aCoords[0]; + double aY = aCoords[1]; + double aZ = aCoords[2]; + aPoints.push_back( aX ); + aPoints.push_back( aY ); + } + + if( aPointSize > 1 ) + { + Handle(Geom_BSplineCurve) aBSplineCurve; + // fill array for algorithm by the received coordinates + int aLen = aPoints.size() / 2; + Handle(TColgp_HArray1OfPnt) aHCurvePoints = new TColgp_HArray1OfPnt (1, aLen); + std::vector::const_iterator aListIter = aPoints.begin(); + for (int ind = 1; ind <= aLen; ind++) { + gp_Pnt aPnt(gp::Origin()); + aPnt.SetX(*aListIter); + aListIter++; + aPnt.SetY(*aListIter); + aListIter++; + aPnt.SetZ(0); + aHCurvePoints->SetValue(ind, aPnt); + } + // compute BSpline + GeomAPI_Interpolate aGBC(aHCurvePoints, aSectIsClosed, gp::Resolution()); + aGBC.Perform(); + if (aGBC.IsDone()) { + aBSplineCurve = aGBC.Curve(); + } + TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge( aBSplineCurve ).Edge(); + + TopoDS_Wire aWire = BRepBuilderAPI_MakeWire( anEdge ).Wire(); + theShape = aWire; + } +#endif + } +} + std::list CurveCreator_Utils::getSelectedPoints( Handle(AIS_InteractiveContext) theContext ) { std::list aSelectedPoints; diff --git a/src/HYDROCurveCreator/CurveCreator_Utils.h b/src/HYDROCurveCreator/CurveCreator_Utils.h index 28b6bb50..49694656 100644 --- a/src/HYDROCurveCreator/CurveCreator_Utils.h +++ b/src/HYDROCurveCreator/CurveCreator_Utils.h @@ -26,9 +26,12 @@ #include #include #include +#include #include +class CurveCreator_ICurve; + class CurveCreator_Utils { public: @@ -56,6 +59,16 @@ public: CURVECREATOR_EXPORT static gp_Pnt ConvertClickToPoint( int x, int y, Handle(V3d_View) theView ); + /** + * Generates shape on the curve + * \param theCurve a curve object, that contains data + * \param theISection a curve section index + * \param theShape a generated shape + */ + CURVECREATOR_EXPORT static void constructShape( const CurveCreator_ICurve* theCurve, + const int theISection, + TopoDS_Shape& theShape ); + /** * Find selected points in the context * \param theContext the viewer context diff --git a/src/HYDROCurveCreator/CurveCreator_UtilsICurve.cxx b/src/HYDROCurveCreator/CurveCreator_UtilsICurve.cxx index 29aa672c..979a246d 100644 --- a/src/HYDROCurveCreator/CurveCreator_UtilsICurve.cxx +++ b/src/HYDROCurveCreator/CurveCreator_UtilsICurve.cxx @@ -82,6 +82,18 @@ void CurveCreator_UtilsICurve::convert( const CurveCreator_ICurve::SectionToPoin } } +#include "CurveCreator_Curve.hxx" +void CurveCreator_UtilsICurve::getPoint( const CurveCreator_ICurve* theCurve, const int theISection, + const int theIPoint, gp_Pnt& thePoint ) +{ + double anX, anY, aZ; + // TODO + const CurveCreator_Curve* aCurve = dynamic_cast( theCurve ); + if ( aCurve ) + aCurve->getCoordinates( theISection, theIPoint, anX, anY, aZ ); + thePoint = gp_Pnt( anX, anY, aZ); +} + /** * Returns whethe the container has the value * \param theList a container of values diff --git a/src/HYDROCurveCreator/CurveCreator_UtilsICurve.hxx b/src/HYDROCurveCreator/CurveCreator_UtilsICurve.hxx index b5adcc29..c749e47b 100644 --- a/src/HYDROCurveCreator/CurveCreator_UtilsICurve.hxx +++ b/src/HYDROCurveCreator/CurveCreator_UtilsICurve.hxx @@ -45,6 +45,9 @@ public: CURVECREATOR_EXPORT static void convert( const CurveCreator_ICurve::SectionToPointList& thePoints, QMap >& theConvPoints ); + CURVECREATOR_EXPORT static void getPoint( const CurveCreator_ICurve* theCurve, const int theISection, + const int theIPoint, gp_Pnt& thePoint ); + /** * Returns whethe the container has the value * \param theList a container of values -- 2.39.2