//
#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,