1 // Copyright (C) 2014-2015 EDF-R&D
2 // This library is free software; you can redistribute it and/or
3 // modify it under the terms of the GNU Lesser General Public
4 // License as published by the Free Software Foundation; either
5 // version 2.1 of the License, or (at your option) any later version.
7 // This library is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 // Lesser General Public License for more details.
12 // You should have received a copy of the GNU Lesser General Public
13 // License along with this library; if not, write to the Free Software
14 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #include <HYDROGUI_Polyline.h>
20 #include <BRepAdaptor_Curve.hxx>
21 #include <BRepBndLib.hxx>
22 #include <BRep_Tool.hxx>
23 #include <GCPnts_AbscissaPoint.hxx>
24 #include <GCPnts_QuasiUniformDeflection.hxx>
25 #include <Graphic3d_ArrayOfPolylines.hxx>
26 #include <Prs3d_Arrow.hxx>
27 #include <Prs3d_LineAspect.hxx>
28 #include <Prs3d_Point.hxx>
29 #include <Prs3d_Root.hxx>
31 #include <TopExp_Explorer.hxx>
33 #include <TopoDS_Edge.hxx>
34 #include <TopoDS_Vertex.hxx>
36 IMPLEMENT_STANDARD_RTTIEXT(HYDROGUI_Polyline, AIS_Shape)
39 HYDROGUI_Polyline::HYDROGUI_Polyline(const TopoDS_Shape& shape)
44 HYDROGUI_Polyline::~HYDROGUI_Polyline()
48 Handle( Graphic3d_ArrayOfPolylines ) BuildEdgePresentation( const TopoDS_Edge& theEdge, double theDeviation )
50 BRepAdaptor_Curve aCurveAdaptor( theEdge );
51 GCPnts_QuasiUniformDeflection aPnts( aCurveAdaptor, theDeviation );
53 Handle( Graphic3d_ArrayOfPolylines ) anArray;
57 int n = aPnts.NbPoints();
58 anArray = new Graphic3d_ArrayOfPolylines( n );
59 for( int i=1; i<=n; i++ )
60 anArray->AddVertex( aPnts.Value( i ) );
65 bool HYDROGUI_Polyline::GetColorOfSubShape(const TopoDS_Shape& SubShape, Quantity_Color& outColor)
67 for (int i=1; i<=myShapeToColor.Extent();i++)
69 const TopoDS_Shape& aCurShape = myShapeToColor.FindKey(i);
70 TopTools_IndexedMapOfShape aSubShMap;
71 TopExp::MapShapes(aCurShape, aSubShMap);
72 if (aSubShMap.Contains(SubShape))
74 outColor = myShapeToColor(i);
81 void HYDROGUI_Polyline::Compute(const Handle(PrsMgr_PresentationManager3d)& aPresentationManager,
82 const Handle(Prs3d_Presentation)& aPrs,
83 const Standard_Integer aMode)
85 //AIS_Shape::Compute(aPresentationManager, aPrs, aMode);
89 Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup( aPrs );
90 Quantity_Color aColor = Attributes()->LineAspect()->Aspect()->Color();
91 Aspect_TypeOfLine aType = Attributes()->LineAspect()->Aspect()->Type();
92 Standard_Real anWidth = Attributes()->LineAspect()->Aspect()->Width();
94 Handle(Graphic3d_AspectLine3d) anAspect = new Graphic3d_AspectLine3d( aColor, aType, anWidth );
97 BRepBndLib::AddClose(myshape, BB);
98 double xmin, xmax, ymin, ymax, zmin, zmax;
99 double devCoeff = 0.05;
102 BB.Get(xmin, ymin, zmin, xmax, ymax, zmax); //ignore Z coord
103 double minSide = Min(Abs(xmax - xmin), Abs(ymax - ymin));
104 devCoeff = minSide > 50 ? 0.05 : minSide / 3000;
107 TopExp_Explorer Exp ( myshape, TopAbs_WIRE );
108 for ( ; Exp.More(); Exp.Next() )
110 TopoDS_Shape W = Exp.Current();
111 TopExp_Explorer Exp1 (W, TopAbs_EDGE );
112 Quantity_Color aWCol = aColor; //from drawer
113 if (myShapeToColor.Contains(W))
115 Quantity_Color aWCol = myShapeToColor.FindFromKey(W);
116 anAspect = new Graphic3d_AspectLine3d( aWCol, aType, anWidth );
118 for ( ; Exp1.More(); Exp1.Next() )
120 TopoDS_Edge anEdge = TopoDS::Edge( Exp1.Current() );
121 Handle( Graphic3d_ArrayOfPolylines ) anArray = BuildEdgePresentation( anEdge, devCoeff);
122 if( !anArray.IsNull() )
124 aGroup->SetPrimitivesAspect( anAspect );
125 aGroup->AddPrimitiveArray( anArray );
131 QList<Handle(AIS_InteractiveObject)> HYDROGUI_Polyline::createPresentations
132 ( const TopoDS_Shape& theShape, int theType, int theSize )
134 QList<Handle(AIS_InteractiveObject)> shapes;
137 Handle(HYDROGUI_Polyline) aMPoly = new HYDROGUI_Polyline( theShape );
138 shapes.append( aMPoly );
140 // 2. Shapes for direction arrows on edges
141 TopExp_Explorer Exp ( theShape, TopAbs_EDGE );
142 for ( ; Exp.More(); Exp.Next() )
144 TopoDS_Edge anEdge = TopoDS::Edge(Exp.Current());
145 if ( !anEdge.IsNull() )
147 Handle(HYDROGUI_Arrow) arrow = new HYDROGUI_Arrow( anEdge, aMPoly );
149 arrow->SetType( (HYDROGUI_Arrow::Type)theType );
151 arrow->SetSize( theSize );
152 shapes.append( arrow );
159 void HYDROGUI_Polyline::update( const QList<Handle(AIS_InteractiveObject)>& theObjects, int theType, int theSize )
161 foreach( Handle(AIS_InteractiveObject) obj, theObjects )
163 Handle(HYDROGUI_Arrow) arrow = Handle(HYDROGUI_Arrow)::DownCast( obj );
164 if( !arrow.IsNull() )
167 arrow->SetType( (HYDROGUI_Arrow::Type)theType );
169 arrow->SetSize( theSize );
177 IMPLEMENT_STANDARD_RTTIEXT(HYDROGUI_Arrow, AIS_Shape)
180 HYDROGUI_Arrow::HYDROGUI_Arrow( const TopoDS_Edge& edge, const Handle(HYDROGUI_Polyline)& polyline )
181 : AIS_Shape( edge ), myType( Cone ), mySize( 35 ), myParentPoly (polyline)
185 HYDROGUI_Arrow::~HYDROGUI_Arrow()
189 HYDROGUI_Arrow::Type HYDROGUI_Arrow::GetType() const
194 void HYDROGUI_Arrow::SetType( HYDROGUI_Arrow::Type theType )
199 int HYDROGUI_Arrow::GetSize() const
204 void HYDROGUI_Arrow::SetSize( int theSize )
206 mySize = qMax( theSize, 0 );
209 const Handle(HYDROGUI_Polyline)& HYDROGUI_Arrow::getParentPolyline() const
214 void HYDROGUI_Arrow::BoundingBox (Bnd_Box& theBndBox)
216 //Nothing to change, we consider arrow as object with empty bounding box
219 void HYDROGUI_Arrow::Compute( const Handle(PrsMgr_PresentationManager3d)& aPresentationManager,
220 const Handle(Prs3d_Presentation)& aPrs,
221 const Standard_Integer aMode )
227 TopoDS_Edge anEdge = TopoDS::Edge( myshape );
228 if( anEdge.IsNull() )
231 BRepAdaptor_Curve anAdaptor( anEdge );
232 double curveLen = GCPnts_AbscissaPoint::Length( anAdaptor, anAdaptor.FirstParameter(), anAdaptor.LastParameter() );
235 // if size==0, then the arrow length is proportional to curve length
236 arrowLen = curveLen/10;
239 //arrowLen = qMin( curveLen/10, (double)mySize );
240 arrowLen = (double)mySize;
243 double t = ( anAdaptor.FirstParameter() + anAdaptor.LastParameter() ) / 2;
246 anAdaptor.D1( t, P, V );
248 bool isFixed = mySize>0;
253 tr.SetTranslation( -gp_Vec( gp_Pnt(), P ) );
254 aPrs->SetTransformation( new TopLoc_Datum3D( tr ) );
256 Handle(Graphic3d_TransformPers) tp = new Graphic3d_TransformPers( Graphic3d_TMF_ZoomPers, P );
257 SetTransformPersistence( tp );
263 aPrs->SetTransformation( Handle(TopLoc_Datum3D)() );
264 SetTransformPersistence( Handle(Graphic3d_TransformPers)() );
268 Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup( aPrs );
269 Quantity_Color aColor = Attributes()->LineAspect()->Aspect()->Color();
270 Aspect_TypeOfLine aType = Attributes()->LineAspect()->Aspect()->Type();
271 Standard_Real anWidth = Attributes()->LineAspect()->Aspect()->Width();
274 const Handle(HYDROGUI_Polyline)& aParentPoly = getParentPolyline();
275 aParentPoly->GetColorOfSubShape(anEdge, aColor);
279 Handle(Graphic3d_AspectLine3d) anAspect = new Graphic3d_AspectLine3d( aColor, aType, anWidth );
280 aGroup->SetPrimitivesAspect( anAspect );
282 Prs3d_Arrow::Draw( aGroup, P1, V, M_PI/180.*12., arrowLen );
286 Graphic3d_MaterialAspect m( Graphic3d_NOM_PLASTIC );
287 Handle(Graphic3d_AspectFillArea3d) anAspect = new Graphic3d_AspectFillArea3d
288 ( Aspect_IS_SOLID, aColor, aColor, Aspect_TOL_SOLID, 1, m, m );
289 aGroup->SetPrimitivesAspect( anAspect );
291 gp_Vec d = -V.Normalized() * arrowLen;
292 const double k = 5.0;
293 gp_Vec n( -d.Y()/k, d.X()/k, 0 );
295 gp_Pnt Pa = P1.Translated( d );
296 gp_Pnt P2 = Pa.Translated( n );
297 gp_Pnt P3 = Pa.Translated( -n );
299 Handle(Graphic3d_ArrayOfTriangles) prim = new Graphic3d_ArrayOfTriangles(3);
300 prim->AddVertex( P1 );
301 prim->AddVertex( P2 );
302 prim->AddVertex( P3 );
304 aGroup->AddPrimitiveArray( prim );