}
}
-QList<Handle(AIS_InteractiveObject)> HYDROGUI_Polyline::createPresentations( const TopoDS_Shape& shape )
+QList<Handle(AIS_InteractiveObject)> HYDROGUI_Polyline::createPresentations
+ ( const TopoDS_Shape& theShape, int theType, int theSize )
{
QList<Handle(AIS_InteractiveObject)> shapes;
// 1. Main shape
- shapes.append( new HYDROGUI_Polyline( shape ) );
+ shapes.append( new HYDROGUI_Polyline( theShape ) );
// 2. Shapes for direction arrows on edges
- TopExp_Explorer Exp ( shape, TopAbs_EDGE );
+ TopExp_Explorer Exp ( theShape, TopAbs_EDGE );
for ( ; Exp.More(); Exp.Next() )
{
TopoDS_Edge anEdge = TopoDS::Edge(Exp.Current());
if ( !anEdge.IsNull() )
- shapes.append( new HYDROGUI_Arrow( anEdge ) );
+ {
+ Handle(HYDROGUI_Arrow) arrow = new HYDROGUI_Arrow( anEdge );
+ if( theType>=0 )
+ arrow->SetType( (HYDROGUI_Arrow::Type)theType );
+ if( theSize>=0 )
+ arrow->SetSize( theSize );
+ shapes.append( arrow );
+ }
}
return shapes;
}
+void HYDROGUI_Polyline::update( const QList<Handle(AIS_InteractiveObject)>& theObjects, int theType, int theSize )
+{
+ foreach( Handle(AIS_InteractiveObject) obj, theObjects )
+ {
+ Handle(HYDROGUI_Arrow) arrow = Handle(HYDROGUI_Arrow)::DownCast( obj );
+ if( !arrow.IsNull() )
+ {
+ if( theType>=0 )
+ arrow->SetType( (HYDROGUI_Arrow::Type)theType );
+ if( theSize>=0 )
+ arrow->SetSize( theSize );
+ }
+ }
+}
HYDROGUI_Arrow::HYDROGUI_Arrow( const TopoDS_Edge& edge )
- : AIS_Shape( edge )
+ : AIS_Shape( edge ), myType( Cone ), mySize( 35 )
{
}
{
}
+HYDROGUI_Arrow::Type HYDROGUI_Arrow::GetType() const
+{
+ return myType;
+}
+
+void HYDROGUI_Arrow::SetType( HYDROGUI_Arrow::Type theType )
+{
+ myType = theType;
+}
+
+int HYDROGUI_Arrow::GetSize() const
+{
+ return mySize;
+}
+
+void HYDROGUI_Arrow::SetSize( int theSize )
+{
+ mySize = qMax( theSize, 0 );
+}
+
void HYDROGUI_Arrow::Compute( const Handle(PrsMgr_PresentationManager3d)& aPresentationManager,
const Handle(Prs3d_Presentation)& aPrs,
const Standard_Integer aMode )
{
aPrs->Clear();
-
+ if( myType==None )
+ return;
+
TopoDS_Edge anEdge = TopoDS::Edge( myshape );
if( anEdge.IsNull() )
return;
BRepAdaptor_Curve anAdaptor( anEdge );
double curveLen = GCPnts_AbscissaPoint::Length( anAdaptor, anAdaptor.FirstParameter(), anAdaptor.LastParameter() );
- double arrowLen = qMin( curveLen/10, 35.0 );
+ double arrowLen;
+ if( mySize==0 )
+ // if size==0, then the arrow length is proportional to curve length
+ arrowLen = curveLen/10;
+ else
+ arrowLen = qMin( curveLen/10, (double)mySize );
double t = ( anAdaptor.FirstParameter() + anAdaptor.LastParameter() ) / 2;
- gp_Pnt P;
+ gp_Pnt P, P1;
gp_Vec V;
anAdaptor.D1( t, P, V );
- gp_Trsf tr;
- tr.SetTranslation( -gp_Vec( gp_Pnt(), P ) );
- aPrs->SetTransformation( new Geom_Transformation( tr ) );
+ bool isFixed = mySize>0;
+
+ if( isFixed )
+ {
+ gp_Trsf tr;
+ tr.SetTranslation( -gp_Vec( gp_Pnt(), P ) );
+ aPrs->SetTransformation( new Geom_Transformation( tr ) );
- Handle(Graphic3d_TransformPers) tp = new Graphic3d_TransformPers( Graphic3d_TMF_ZoomPers, P );
- SetTransformPersistence( tp );
+ Handle(Graphic3d_TransformPers) tp = new Graphic3d_TransformPers( Graphic3d_TMF_ZoomPers, P );
+ SetTransformPersistence( tp );
+
+ P1 = gp_Pnt();
+ }
+ else
+ P1 = P;
Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup( aPrs );
Quantity_Color aColor;
Standard_Real anWidth;
Attributes()->LineAspect()->Aspect()->Values( aColor, aType, anWidth );
anWidth = 1;
- Handle(Graphic3d_AspectLine3d) anAspect = new Graphic3d_AspectLine3d( aColor, aType, anWidth );
- aGroup->SetPrimitivesAspect( anAspect );
- Prs3d_Arrow::Draw( aGroup, gp_Pnt(), V, M_PI/180.*12., arrowLen );
+
+ if( myType==Cone )
+ {
+ Handle(Graphic3d_AspectLine3d) anAspect = new Graphic3d_AspectLine3d( aColor, aType, anWidth );
+ aGroup->SetPrimitivesAspect( anAspect );
+
+ Prs3d_Arrow::Draw( aGroup, P1, V, M_PI/180.*12., arrowLen );
+ }
+ else
+ {
+ Graphic3d_MaterialAspect m( Graphic3d_NOM_PLASTIC );
+ Handle(Graphic3d_AspectFillArea3d) anAspect = new Graphic3d_AspectFillArea3d
+ ( Aspect_IS_SOLID, aColor, aColor, Aspect_TOL_SOLID, 1, m, m );
+ aGroup->SetPrimitivesAspect( anAspect );
+
+ gp_Vec d = -V.Normalized() * arrowLen;
+ const double k = 5.0;
+ gp_Vec n( -d.Y()/k, d.X()/k, 0 );
+
+ gp_Pnt Pa = P1.Translated( d );
+ gp_Pnt P2 = Pa.Translated( n );
+ gp_Pnt P3 = Pa.Translated( -n );
+
+ Handle(Graphic3d_ArrayOfTriangles) prim = new Graphic3d_ArrayOfTriangles(3);
+ prim->AddVertex( P1 );
+ prim->AddVertex( P2 );
+ prim->AddVertex( P3 );
+
+ aGroup->AddPrimitiveArray( prim );
+ }
}