#include "CurveCreator_PosPoint.hxx"
#include "CurveCreator_Section.hxx"
#include "CurveCreator_Displayer.h"
+#include "CurveCreator_Utils.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>
#include <gp_Pnt.hxx>
#include <gp_Lin.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Wire.hxx>
-#include <TColgp_HArray1OfPnt.hxx>
-#include <GeomAPI_Interpolate.hxx>
#include <stdio.h>
return theIPnt * myDimension;
}
-#include <TopoDS_Compound.hxx>
-#include <BRep_Builder.hxx>
-#include <BRepBuilderAPI_MakeVertex.hxx>
-#include <BRepBuilderAPI_MakeEdge.hxx>
//#define USE_COMPOUND
std::vector<Handle_AIS_InteractiveObject> CurveCreator_Curve::constructSection( int theISection ) const
{
std::vector<Handle_AIS_InteractiveObject> 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);
aSectionRepresentation.push_back( aLine );
}
}
-#endif
}
else if( aSectType == CurveCreator::Spline )
{
-#ifdef USE_COMPOUND
-
-#else
std::vector<double> 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<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();
-
- Handle(AIS_Shape) aShape = new AIS_Shape( aWire );
- aSectionRepresentation.push_back( aShape );
- }
-#endif
}
return aSectionRepresentation;
}
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,
/***********************************************/
virtual ListAISObjects constructWire() const;
+public: // TODO: remove
void getPoint( const int theSectionId, const int thePointId, gp_Pnt& thePoint ) const;
public:
CurveCreator_Displayer(Handle_AIS_InteractiveContext theContext );
~CurveCreator_Displayer(void);
+ //TODO: remove
Handle_AIS_InteractiveContext getAISContext() { return myContext; }
void display( AISObjectsList theCurveObjects, bool isUpdate );
//
#include "CurveCreator_Utils.h"
+#include "CurveCreator.hxx"
+#include "CurveCreator_UtilsICurve.hxx"
#include <GEOMUtils.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Wire.hxx>
#include <TopoDS_Edge.hxx>
+#include <TopoDS_Compound.hxx>
#include <AIS_ListOfInteractive.hxx>
#include <AIS_ListIteratorOfListOfInteractive.hxx>
#include <Geom_Line.hxx>
#include <TopExp_Explorer.hxx>
-#include <BRep_Tool.hxx>
#include <GeomAPI_ProjectPointOnCurve.hxx>
#include <SelectMgr_EntityOwner.hxx>
+#include <BRep_Tool.hxx>
+#include <BRep_Builder.hxx>
+#include <BRepBuilderAPI_MakeVertex.hxx>
+#include <BRepBuilderAPI_MakeEdge.hxx>
+#include <BRepBuilderAPI_MakeWire.hxx>
+
+#include <TColgp_HArray1OfPnt.hxx>
+#include <GeomAPI_Interpolate.hxx>
+
#include <ProjLib.hxx>
#include <ElSLib.hxx>
+#include "CurveCreator_ICurve.hxx"
+
const double LOCAL_SELECTION_TOLERANCE = 0.0001;
const int SCENE_PIXEL_TOLERANCE = 10;
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<double> 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<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();
+ theShape = aWire;
+ }
+#endif
+ }
+}
+
std::list<float> CurveCreator_Utils::getSelectedPoints( Handle(AIS_InteractiveContext) theContext )
{
std::list<float> aSelectedPoints;
#include <V3d_View.hxx>
#include <gp_Pnt.hxx>
#include <Geom_Curve.hxx>
+#include <TopoDS_Shape.hxx>
#include <list>
+class CurveCreator_ICurve;
+
class CurveCreator_Utils
{
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
}
}
+#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<const CurveCreator_Curve*>( 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
CURVECREATOR_EXPORT static void convert( const CurveCreator_ICurve::SectionToPointList& thePoints,
QMap<int, QList<int> >& 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