Salome HOME
Feature #102: Display of Lambert coordinates.
[modules/hydro.git] / src / HYDROCurveCreator / CurveCreator_AISCurve.cxx
index 952364d0689343d63028a0d8d69c3d23d5620b14..923d0384402d7963f59673d7658f8e34a4b7521d 100644 (file)
 //
 
 #include "CurveCreator_AISCurve.hxx"
+#include "CurveCreator_Curve.hxx"
+
+#include <Quantity_Color.hxx>
+#include <Prs3d_Presentation.hxx>
+#include <StdPrs_WFDeflectionShape.hxx>
+#include <Geom_BSplineCurve.hxx>
+#include <TColgp_HArray1OfPnt.hxx>
+#include <GeomAPI_Interpolate.hxx>
+#include <BRepBuilderAPI_MakeEdge.hxx>
+#include <BRepBuilderAPI_MakeWire.hxx>
+#include <BRepBuilderAPI_MakeVertex.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopoDS_Wire.hxx>
+
+#include <Graphic3d_Array1OfVertex.hxx>
+#include <Graphic3d_Group.hxx>
+#include <Graphic3d_ArrayOfSegments.hxx>
+#include <Prs3d_Root.hxx>
 
 IMPLEMENT_STANDARD_HANDLE(CurveCreator_AISCurve, AIS_Shape)
 IMPLEMENT_STANDARD_RTTIEXT(CurveCreator_AISCurve, AIS_Shape)
 
-CurveCreator_AISCurve::CurveCreator_AISCurve()
-: AIS_Shape( TopoDS_Shape() )
+CurveCreator_AISCurve::CurveCreator_AISCurve( CurveCreator_Curve* theCurve )
+: AIS_Shape( TopoDS_Shape() ), myCurve( theCurve )
+{
+}
+
+void CurveCreator_AISCurve::getPoint( const int theISection, const int theIPoint,
+                                      gp_Pnt& thePoint )
 {
+  double anX, anY, aZ;
+  myCurve->getCoordinates( theISection, theIPoint, anX, anY, aZ );
+  thePoint = gp_Pnt( anX, anY, aZ);
 }
 
+#define MAKE_BUILDER_USE
 void CurveCreator_AISCurve::Compute( const Handle(PrsMgr_PresentationManager3d)& thePM,
                                      const Handle(Prs3d_Presentation)& thePrs,
                                      const Standard_Integer theMode )
 {
-  AIS_Shape::Compute( thePM, thePrs, theMode );
+  thePrs->Clear();
+
+  for( int iSection = 0 ; iSection < myCurve->getNbSections() ; iSection++ ) {
+    CurveCreator::SectionType aSectType = myCurve->getSectionType( iSection );
+    int aPointSize = myCurve->getNbPoints( iSection );
+    bool aSectIsClosed = myCurve->isClosed( iSection );
+    if( aSectType == CurveCreator::Polyline )
+    {
+      int iPoint = 0;
+      gp_Pnt aPrevPoint, aPoint;
+      if ( aPointSize == 1 ) {
+        getPoint( iSection, iPoint, aPrevPoint );
+        TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex( aPrevPoint ).Vertex();
+        Set( aVertex );
+      }
+      else if ( aPointSize > 1 ) {
+#ifdef MAKE_BUILDER_USE
+        TopoDS_Edge aPointEdge;
+        BRepBuilderAPI_MakeWire aMakeWire;
+        getPoint( iSection, iPoint, aPrevPoint );
+        iPoint++;
+        for( ; iPoint < aPointSize; iPoint++ ) {
+          getPoint( iSection, iPoint, aPoint );
+          aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge();
+          aMakeWire.Add( BRepBuilderAPI_MakeWire( aPointEdge ) );
+          aPrevPoint = aPoint;
+        }
+        if( myCurve->isClosed( iSection ) && ( aPointSize > 2 ) ) {
+          getPoint( iSection, 0, aPoint );
+          aPointEdge = BRepBuilderAPI_MakeEdge( aPrevPoint, aPoint ).Edge();
+          aMakeWire.Add( BRepBuilderAPI_MakeWire( aPointEdge ) );
+        }
+
+        TopoDS_Wire aLineWire = aMakeWire.Wire();
+        Set( aLineWire );
+        AIS_Shape::Compute( thePM, thePrs, theMode );
+      }
+#else
+      bool isClosed = myCurve->isClosed( iSection ) && ( aPointSize > 2 );
+      Handle(Graphic3d_ArrayOfPolylines) anArray = new Graphic3d_ArrayOfPolylines
+                                             ( !isClosed ? aPointSize : aPointSize+1 );
+      for( ; iPoint < aPointSize; iPoint++ ) {
+        getPoint( iSection, iPoint, aPoint );
+        anArray->AddVertex(aPoint.X(), aPoint.Y(), aPoint.Z());
+      }
+
+      if( myCurve->isClosed( iSection ) && ( aPointSize > 2 ) ) {
+        getPoint( iSection, 0, aPoint );
+        anArray->AddVertex(aPoint.X(), aPoint.Y(), aPoint.Z());
+      }
+      Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup( thePrs );
+      aGroup->AddPrimitiveArray(anArray);
+#endif
+    }
+    else if( aSectType == CurveCreator::Spline )
+    {
+      std::vector<double> aPoints;
+      for( int iPoint = 0; iPoint < aPointSize; iPoint++ )
+      {
+        CurveCreator::Coordinates aCoords = myCurve->getPoint( iSection, 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;
+        Handle(Geom_Curve) aGeomCurve;
+        // fill array for algorithm by the received coordinates
+        int aLen = aPoints.size() / 2;
+        Handle(TColgp_HArray1OfPnt) aHCurvePoints = new TColgp_HArray1OfPnt (1, aLen);
+        std::vector<double>::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();
+
+        Set( aWire );
+        AIS_Shape::Compute( thePM, thePrs, theMode );
+      }
+    }
+  }
 }
 
 void CurveCreator_AISCurve::ComputeSelection( const Handle(SelectMgr_Selection)& theSelection,