Salome HOME
Merge remote-tracking branch 'origin/BR_1321_ECW' into BR_DEMO
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Polyline.cxx
index e640f9a7e49baac19907c02404e7120c8128f0fa..035e0ca3df1edf80d984c1fc17808bb54fa18186 100644 (file)
@@ -101,25 +101,47 @@ void HYDROGUI_Polyline::Compute(const Handle(PrsMgr_PresentationManager3d)& aPre
   }
 }
 
-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 );
+    }
+  }
+}
 
 
 
@@ -128,7 +150,7 @@ IMPLEMENT_STANDARD_RTTIEXT(HYDROGUI_Arrow, AIS_Shape)
 
 
 HYDROGUI_Arrow::HYDROGUI_Arrow( const TopoDS_Edge& edge )
-  : AIS_Shape( edge )
+  : AIS_Shape( edge ), myType( Cone ), mySize( 35 )
 {
 }
 
@@ -136,31 +158,74 @@ HYDROGUI_Arrow::~HYDROGUI_Arrow()
 {
 }
 
+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 );
+    arrowLen = (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
+  {
+    aPrs->SetTransformation( Handle(Geom_Transformation)() );
+    SetTransformPersistence( Handle(Graphic3d_TransformPers)() );
+    P1 = P;
+  }
 
   Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup( aPrs );
   Quantity_Color aColor;
@@ -168,7 +233,34 @@ void HYDROGUI_Arrow::Compute( const Handle(PrsMgr_PresentationManager3d)& aPrese
   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 );
+  }
 }