0027684: Coding rules - drop unused declarations from Graphic3d
[occt.git] / src / V3d / V3d_CircularGrid.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #include <V3d_CircularGrid.hxx>
15
16 #include <Graphic3d_ArrayOfPoints.hxx>
17 #include <Graphic3d_ArrayOfPolylines.hxx>
18 #include <Graphic3d_ArrayOfSegments.hxx>
19 #include <Graphic3d_AspectLine3d.hxx>
20 #include <Graphic3d_AspectMarker3d.hxx>
21 #include <Graphic3d_Group.hxx>
22 #include <Graphic3d_Structure.hxx>
23 #include <Graphic3d_Vertex.hxx>
24 #include <Quantity_Color.hxx>
25 #include <Standard_Type.hxx>
26 #include <TColgp_SequenceOfPnt.hxx>
27 #include <TColStd_Array2OfReal.hxx>
28 #include <V3d_Viewer.hxx>
29
30 IMPLEMENT_STANDARD_RTTIEXT(V3d_CircularGrid,Aspect_CircularGrid)
31
32 /*----------------------------------------------------------------------*/
33 /*
34  * Constant
35  */
36 #define DIVISION 8
37 #define MYMINMAX 25.
38 #define MYFACTOR 50.
39
40 /*----------------------------------------------------------------------*/
41
42 V3d_CircularGrid::V3d_CircularGrid (const V3d_ViewerPointer& aViewer, const Quantity_Color& aColor, const Quantity_Color& aTenthColor)
43 : Aspect_CircularGrid (1.,8),
44   myStructure (new Graphic3d_Structure (aViewer->StructureManager())),
45   myGroup (myStructure->NewGroup()),
46   myViewer (aViewer),
47   myCurAreDefined (Standard_False)
48 {
49   myColor = aColor;
50   myTenthColor = aTenthColor;
51
52   myStructure->SetInfiniteState (Standard_True);
53
54   const Standard_Real step = 10.;
55   const Standard_Real size = 0.5*myViewer->DefaultViewSize();
56   SetGraphicValues (size, step/MYFACTOR);
57   SetRadiusStep (step);
58 }
59
60 void V3d_CircularGrid::SetColors (const Quantity_Color& aColor, const Quantity_Color& aTenthColor)
61 {
62   if( myColor != aColor || myTenthColor != aTenthColor ) {
63     myColor = aColor;
64     myTenthColor = aTenthColor;
65     myCurAreDefined = Standard_False;
66     UpdateDisplay();
67   }
68 }
69
70 void V3d_CircularGrid::Display ()
71 {
72   myStructure->SetDisplayPriority (1);
73   myStructure->Display();
74 }
75
76 void V3d_CircularGrid::Erase () const
77 {
78   myStructure->Erase ();
79 }
80
81 Standard_Boolean V3d_CircularGrid::IsDisplayed () const
82 {
83   return myStructure->IsDisplayed ();
84 }
85
86 void V3d_CircularGrid::UpdateDisplay ()
87 {
88   gp_Ax3 ThePlane = myViewer->PrivilegedPlane();
89
90   Standard_Real xl, yl, zl;
91   Standard_Real xdx, xdy, xdz;
92   Standard_Real ydx, ydy, ydz;
93   Standard_Real dx, dy, dz;
94   ThePlane.Location ().Coord (xl, yl, zl);
95   ThePlane.XDirection ().Coord (xdx, xdy, xdz);
96   ThePlane.YDirection ().Coord (ydx, ydy, ydz);
97   ThePlane.Direction ().Coord (dx, dy, dz);
98
99   Standard_Boolean MakeTransform = !myCurAreDefined;
100   if (!MakeTransform)
101   {
102     MakeTransform = (RotationAngle() != myCurAngle || XOrigin() != myCurXo || YOrigin() != myCurYo);
103     if (!MakeTransform)
104     {
105       Standard_Real curxl, curyl, curzl;
106       Standard_Real curxdx, curxdy, curxdz;
107       Standard_Real curydx, curydy, curydz;
108       Standard_Real curdx, curdy, curdz;
109       myCurViewPlane.Location ().Coord (curxl, curyl, curzl);
110       myCurViewPlane.XDirection ().Coord (curxdx, curxdy, curxdz);
111       myCurViewPlane.YDirection ().Coord (curydx, curydy, curydz);
112       myCurViewPlane.Direction ().Coord (curdx, curdy, curdz);
113       if (xl != curxl || yl != curyl || zl != curzl ||
114           xdx != curxdx || xdy != curxdy || xdz != curxdz ||
115           ydx != curydx || ydy != curydy || ydz != curydz ||
116           dx != curdx || dy != curdy || dz != curdz)
117         MakeTransform = Standard_True;
118     }
119   }
120
121   if (MakeTransform)
122   {
123     const Standard_Real CosAlpha = Cos (RotationAngle ());
124     const Standard_Real SinAlpha = Sin (RotationAngle ());
125     TColStd_Array2OfReal Trsf (1, 4, 1, 4);
126     Trsf (4, 4) = 1.0;
127     Trsf (4, 1) = Trsf (4, 2) = Trsf (4, 3) = 0.0;
128     // Translation
129     Trsf (1, 4) = xl,
130     Trsf (2, 4) = yl,
131     Trsf (3, 4) = zl;
132     // Transformation  change of marker
133     Trsf (1, 1) = xdx,
134     Trsf (2, 1) = xdy,
135     Trsf (3, 1) = xdz,
136     Trsf (1, 2) = ydx,
137     Trsf (2, 2) = ydy,
138     Trsf (3, 2) = ydz,
139     Trsf (1, 3) = dx,
140     Trsf (2, 3) = dy,
141     Trsf (3, 3) = dz;
142     myStructure->SetTransform (Trsf, Graphic3d_TOC_REPLACE);
143
144     // Translation of the origin
145     Trsf (1, 4) = -XOrigin (),
146     Trsf (2, 4) = -YOrigin (),
147     Trsf (3, 4) = 0.0;
148     // Rotation Alpha around axis -Z
149     Trsf (1, 1) = CosAlpha,
150     Trsf (2, 1) = -SinAlpha,
151     Trsf (3, 1) = 0.0,
152     Trsf (1, 2) = SinAlpha,
153     Trsf (2, 2) = CosAlpha,
154     Trsf (3, 2) = 0.0,
155     Trsf (1, 3) = 0.0,
156     Trsf (2, 3) = 0.0,
157     Trsf (3, 3) = 1.0;
158     myStructure->SetTransform (Trsf,Graphic3d_TOC_POSTCONCATENATE);
159
160     myCurAngle = RotationAngle ();
161     myCurXo = XOrigin (), myCurYo = YOrigin ();
162     myCurViewPlane = ThePlane;
163   }
164
165   switch (DrawMode())
166   {
167     default:
168     //case Aspect_GDM_Points:
169       DefinePoints ();
170       myCurDrawMode = Aspect_GDM_Points;
171       break;
172     case Aspect_GDM_Lines:
173       DefineLines ();
174       myCurDrawMode = Aspect_GDM_Lines;
175       break;
176 #ifdef IMP210100
177     case Aspect_GDM_None:
178       myCurDrawMode = Aspect_GDM_None;
179       break;
180 #endif
181   }
182   myCurAreDefined = Standard_True;
183 }
184
185 void V3d_CircularGrid::DefineLines ()
186 {
187   const Standard_Real    aStep     = RadiusStep ();
188   const Standard_Real    aDivision = DivisionNumber ();
189   const Standard_Boolean toUpdate  = !myCurAreDefined
190                                   || myCurDrawMode != Aspect_GDM_Lines
191                                   || aDivision != myCurDivi
192                                   || aStep     != myCurStep;
193   if (!toUpdate)
194   {
195     return;
196   }
197
198   myGroup->Clear ();
199
200   const Standard_Integer Division = (Standard_Integer )( (aDivision >= DIVISION ? aDivision : DIVISION));
201
202   Standard_Integer nbpnts = 2 * Division;
203   // diametres
204   Standard_Real alpha = M_PI / aDivision;
205
206   myGroup->SetGroupPrimitivesAspect (new Graphic3d_AspectLine3d (myTenthColor, Aspect_TOL_SOLID, 1.0));
207   Handle(Graphic3d_ArrayOfSegments) aPrims1 = new Graphic3d_ArrayOfSegments(2*nbpnts);
208   const gp_Pnt p0(0., 0., -myOffSet);
209   for (Standard_Integer i=1; i<=nbpnts; i++) {
210     aPrims1->AddVertex(p0);
211     aPrims1->AddVertex(Cos(alpha*i)*myRadius, Sin(alpha*i)*myRadius, -myOffSet);
212   }
213   myGroup->AddPrimitiveArray(aPrims1, Standard_False);
214
215   // circles
216   nbpnts = 2 * Division + 1;
217   alpha = M_PI / Division;
218   Standard_Integer nblines = 0;
219   TColgp_SequenceOfPnt aSeqLines, aSeqTenth;
220   for (Standard_Real r=aStep; r<=myRadius; r+=aStep, nblines++) {
221     const Standard_Boolean isTenth = (Modulus(nblines, 10) == 0);
222     for (Standard_Integer i=0; i<nbpnts; i++) {
223       const gp_Pnt pt(Cos(alpha*i)*r,Sin(alpha*i)*r,-myOffSet);
224       (isTenth? aSeqTenth : aSeqLines).Append(pt);
225     }
226   }
227   if (aSeqTenth.Length())
228   {
229     myGroup->SetGroupPrimitivesAspect (new Graphic3d_AspectLine3d (myTenthColor, Aspect_TOL_SOLID, 1.0));
230     Standard_Integer n, np;
231     const Standard_Integer nbl = aSeqTenth.Length() / nbpnts;
232     Handle(Graphic3d_ArrayOfPolylines) aPrims2 = new Graphic3d_ArrayOfPolylines(aSeqTenth.Length(),nbl);
233     for (np = 1, n=0; n<nbl; n++) {
234       aPrims2->AddBound(nbpnts);
235       for (Standard_Integer i=0; i<nbpnts; i++, np++)
236         aPrims2->AddVertex(aSeqTenth(np));
237   }
238     myGroup->AddPrimitiveArray(aPrims2, Standard_False);
239   }
240   if (aSeqLines.Length())
241   {
242     myGroup->SetPrimitivesAspect (new Graphic3d_AspectLine3d (myColor, Aspect_TOL_SOLID, 1.0));
243     Standard_Integer n, np;
244     const Standard_Integer nbl = aSeqLines.Length() / nbpnts;
245     Handle(Graphic3d_ArrayOfPolylines) aPrims3 = new Graphic3d_ArrayOfPolylines(aSeqLines.Length(),nbl);
246     for (np = 1, n=0; n<nbl; n++) {
247       aPrims3->AddBound(nbpnts);
248       for (Standard_Integer i=0; i<nbpnts; i++, np++)
249         aPrims3->AddVertex(aSeqLines(np));
250   }
251     myGroup->AddPrimitiveArray(aPrims3, Standard_False);
252   }
253
254   myGroup->SetMinMaxValues(-myRadius, -myRadius, 0.0, myRadius, myRadius, 0.0);
255   myCurStep = aStep, myCurDivi = (Standard_Integer ) aDivision;
256 }
257
258 void V3d_CircularGrid::DefinePoints ()
259 {
260   const Standard_Real    aStep     = RadiusStep();
261   const Standard_Real    aDivision = DivisionNumber();
262   const Standard_Boolean toUpdate  = !myCurAreDefined
263                                   || myCurDrawMode != Aspect_GDM_Points
264                                   || aDivision != myCurDivi
265                                   || aStep     != myCurStep;
266   if (!toUpdate)
267   {
268     return;
269   }
270
271   myGroup->Clear ();
272
273   Handle(Graphic3d_AspectMarker3d) MarkerAttrib = new Graphic3d_AspectMarker3d ();
274   MarkerAttrib->SetColor (myColor);
275   MarkerAttrib->SetType (Aspect_TOM_POINT);
276   MarkerAttrib->SetScale (3.);
277
278   const Standard_Integer nbpnts = Standard_Integer (2*aDivision);
279   Standard_Real r, alpha = M_PI / aDivision;
280
281   // diameters
282   TColgp_SequenceOfPnt aSeqPnts;
283   aSeqPnts.Append(gp_Pnt(0.0, 0.0, -myOffSet));
284   for (r=aStep; r<=myRadius; r+=aStep) {
285     for (Standard_Integer i=0; i<nbpnts; i++)
286       aSeqPnts.Append(gp_Pnt(Cos(alpha*i)*r, Sin(alpha*i)*r, -myOffSet));
287   }
288   myGroup->SetGroupPrimitivesAspect (MarkerAttrib);
289   if (aSeqPnts.Length())
290   {
291     Standard_Real X,Y,Z;
292     const Standard_Integer nbv = aSeqPnts.Length();
293     Handle(Graphic3d_ArrayOfPoints) Cercle = new Graphic3d_ArrayOfPoints (nbv);
294     for (Standard_Integer i=1; i<=nbv; i++)
295     {
296       aSeqPnts(i).Coord(X,Y,Z);
297       Cercle->AddVertex (X,Y,Z);
298     }
299     myGroup->AddPrimitiveArray (Cercle, Standard_False);
300   }
301   myGroup->SetMinMaxValues(-myRadius, -myRadius, 0.0, myRadius, myRadius, 0.0);
302
303   myCurStep = aStep, myCurDivi = (Standard_Integer ) aDivision;
304 }
305
306 void V3d_CircularGrid::GraphicValues (Standard_Real& theRadius, Standard_Real& theOffSet) const
307 {
308   theRadius = myRadius;
309   theOffSet = myOffSet;
310 }
311
312 void V3d_CircularGrid::SetGraphicValues (const Standard_Real theRadius, const Standard_Real theOffSet)
313 {
314   if (! myCurAreDefined) {
315     myRadius = theRadius;
316     myOffSet = theOffSet;
317   }
318   if (myRadius != theRadius) {
319     myRadius = theRadius;
320     myCurAreDefined = Standard_False;
321   }
322   if (myOffSet != theOffSet) {
323     myOffSet = theOffSet;
324     myCurAreDefined = Standard_False;
325   }
326   if( !myCurAreDefined ) UpdateDisplay();
327 }