0024355: Compiler Warning level 4 for MFC samples
[occt.git] / samples / mfc / standard / Common / User_Cylinder.cxx
1 #include <stdafx.h>
2
3 #include <User_Cylinder.hxx>
4
5 // Implementation of Handle and type mgt
6 //
7 IMPLEMENT_STANDARD_HANDLE(User_Cylinder,AIS_InteractiveObject)
8 IMPLEMENT_STANDARD_RTTIEXT(User_Cylinder,AIS_InteractiveObject)
9
10 #include "ColoredMeshDlg.h"
11
12 #include <Graphic3d_ArrayOfTriangles.hxx>
13 #include <Graphic3d_StructureManager.hxx>
14 #include <PrsMgr_PresentationManager3d.hxx>
15 #include <BRepMesh.hxx>
16 #include <StdPrs_ToolShadedShape.hxx>
17 #include <Poly_Connect.hxx>
18 #include <TColgp_Array1OfPnt.hxx>
19 #include <Poly_Triangulation.hxx>
20 #include <TColgp_Array1OfDir.hxx>
21 #include <GProp_PGProps.hxx>
22 #include <Graphic3d_Array1OfVertex.hxx>
23 #include <Aspect_Array1OfEdge.hxx>
24 #include <Quantity_Color.hxx>
25
26 #include <AIS_GraphicTool.hxx>
27
28 // Constructors implementation
29 //
30
31 User_Cylinder::User_Cylinder(const Standard_Real R, const Standard_Real H) :
32 AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant)
33 {
34   BRepPrimAPI_MakeCylinder S(R,H);
35   myShape = S.Shape();
36   SetHilightMode(0);
37   SetSelectionMode(0);
38   myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
39   myPlanarFaceColor = Quantity_NOC_FIREBRICK3;
40   myCylindricalFaceColor = Quantity_NOC_GRAY;
41 }
42
43 User_Cylinder::User_Cylinder(const gp_Ax2 CylAx2, const Standard_Real R, const Standard_Real H) :
44 AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant)
45
46 {
47   BRepPrimAPI_MakeCylinder S(CylAx2,R,H);
48   BRepBuilderAPI_NurbsConvert aNurbsConvert(S.Shape());
49   myShape = aNurbsConvert.Shape();
50   SetHilightMode(0);
51   SetSelectionMode(0);
52   myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
53   myPlanarFaceColor = Quantity_NOC_FIREBRICK3;
54   myCylindricalFaceColor = Quantity_NOC_KHAKI4;
55 }
56
57 void User_Cylinder::Compute(const Handle_PrsMgr_PresentationManager3d& /*aPresentationManager*/,
58                             const Handle_Prs3d_Presentation& aPresentation,
59                             const Standard_Integer aMode ) 
60 {
61   switch (aMode) {
62 case 0:
63   StdPrs_WFDeflectionShape::Add(aPresentation,myShape, myDrawer );
64   break;
65 case 1:
66   {
67
68     Standard_Real aTransparency = Transparency();
69     Graphic3d_NameOfMaterial aMaterial = Material();
70     myDrawer->SetShadingAspectGlobal(Standard_False);
71     TopExp_Explorer Ex;
72     Handle(Geom_Surface) Surface;
73
74     for (Ex.Init(myShape,TopAbs_FACE); Ex.More(); Ex.Next())
75     {
76
77       Surface = BRep_Tool::Surface(TopoDS::Face(Ex.Current()));
78       myDrawer->ShadingAspect()->SetMaterial(aMaterial);
79       if (Surface->IsKind(STANDARD_TYPE(Geom_Plane)))
80         myDrawer->ShadingAspect()->SetColor(myPlanarFaceColor);
81       else
82         myDrawer->ShadingAspect()->SetColor(myCylindricalFaceColor);
83
84
85       myDrawer->ShadingAspect()->SetTransparency (aTransparency);
86       StdPrs_ShadedShape::Add(aPresentation,Ex.Current(), myDrawer);
87     }
88     break;
89
90   }
91 case 6: //color
92   {
93     BRepTools::Clean(myShape);
94     BRepTools::Update(myShape);
95
96     Handle(Graphic3d_StructureManager) aStrucMana = GetContext()->MainPrsMgr()->StructureManager();
97
98     Handle(Graphic3d_Group) mygroup = Prs3d_Root::CurrentGroup(aPresentation);
99     myAspect = (new Prs3d_ShadingAspect())->Aspect();
100     Graphic3d_MaterialAspect material = myAspect->FrontMaterial();
101     material.SetReflectionModeOff(Graphic3d_TOR_AMBIENT);
102     material.SetReflectionModeOff(Graphic3d_TOR_DIFFUSE);
103     material.SetReflectionModeOff(Graphic3d_TOR_SPECULAR);
104     material.SetReflectionModeOff(Graphic3d_TOR_EMISSION);
105     myAspect->SetFrontMaterial(material);
106
107     mygroup->SetPrimitivesAspect(myAspect);
108     myAspect->SetEdgeOn();
109
110     myDeflection = AIS_Shape::GetDeflection(myShape,myDrawer);
111     BRepMesh::Mesh(myShape,myDeflection);
112
113     myX1OnOff = Standard_False;
114     myXBlueOnOff = Standard_False;
115     myXGreenOnOff =Standard_False;
116     myXRedOnOff = Standard_False;
117     myY1OnOff = Standard_False;
118     myYBlueOnOff = Standard_False;
119     myYGreenOnOff = Standard_False;
120     myYRedOnOff = Standard_False;
121     myZ1OnOff = Standard_False;
122     myZBlueOnOff =Standard_False;
123     myZGreenOnOff = Standard_False;
124     myZRedOnOff = Standard_False;
125
126     CColoredMeshDlg Dlg(NULL);
127     Dlg.DoModal();
128
129     myX1OnOff = Dlg.X1OnOff;
130
131     myXBlueOnOff = Dlg.m_CheckXBlueOnOff;
132     myXGreenOnOff = Dlg.m_CheckXGreenOnOff;
133     myXRedOnOff = Dlg.m_CheckXRedOnOff;
134
135     myY1OnOff = Dlg.Y1OnOff;
136
137     myYBlueOnOff = Dlg.m_CheckYBlueOnOff;
138     myYGreenOnOff = Dlg.m_CheckYGreenOnOff;
139     myYRedOnOff = Dlg.m_CheckYRedOnOff;
140
141     myZ1OnOff = Dlg.Z1OnOff;
142
143     myZBlueOnOff = Dlg.m_CheckZBlueOnOff;
144     myZGreenOnOff = Dlg.m_CheckZGreenOnOff;
145     myZRedOnOff = Dlg.m_CheckZRedOnOff;
146
147     // Adds a triangulation of the shape myShape to its topological data structure.
148     // This triangulation is computed with the deflection myDeflection.
149
150 #ifdef DEBUG
151     cout <<"Deflection = " << myDeflection << "\n" << endl;
152 #endif
153
154     StdPrs_ToolShadedShape SST;
155
156     Standard_Integer NumFace;
157     TopExp_Explorer ExpFace;
158
159     //khr -->
160
161     gp_Pnt H (0,0,0);
162     gp_Pnt B (0,0,1000000000);
163     for( NumFace=0,ExpFace.Init(myShape,TopAbs_FACE); ExpFace.More(); ExpFace.Next(),NumFace++ )
164     {
165       TopoDS_Face myFace = TopoDS::Face(ExpFace.Current());
166       TopLoc_Location myLocation = myFace.Location();
167
168 #ifdef DEBUG
169       cout << "J\'explore actuellement la face " << NumFace << "\n" << endl;
170 #endif
171       Handle(Poly_Triangulation) myT = BRep_Tool::Triangulation(myFace, myLocation);
172       // Returns the Triangulation of the face. It is a null handle if there is no triangulation.
173
174       if (myT.IsNull())
175       {
176 #ifdef DEBUG
177         // cout << "Triangulation of the face "<< i <<" is null \n"<< endl;
178 #endif
179         return;
180       }
181
182       const TColgp_Array1OfPnt& Nodes= myT->Nodes();
183
184       const Poly_Array1OfTriangle& triangles = myT->Triangles();
185
186       Standard_Integer nnn = myT->NbTriangles(); // nnn : nombre de triangles
187       Standard_Integer nt, n1, n2, n3 = 0;// nt : triangle courant
188       // ni : sommet i du triangle courant
189       //recherche du pt "haut" et du pt "bas
190       for (nt = 1; nt <= nnn; nt++)
191       {
192         // triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
193
194         if (SST.Orientation(myFace) == TopAbs_REVERSED) // si la face est "reversed"
195           triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2
196         else
197           triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
198
199         if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) )
200         { // Associates a vertexNT to each node
201           gp_Pnt p = Nodes(n1).Transformed(myLocation.Transformation());
202           gp_Pnt q = Nodes(n2).Transformed(myLocation.Transformation());
203           gp_Pnt r = Nodes(n3).Transformed(myLocation.Transformation());
204
205           if (p.Z() > H.Z()) H=p;
206           if (q.Z() > H.Z()) H=q;
207           if (r.Z() > H.Z()) H=r;
208           if (p.Z() < B.Z()) B=p;
209           if (q.Z() < B.Z()) B=q;
210           if (r.Z() < B.Z()) B=r;
211         }
212       }
213     }
214
215     //khr <--
216
217
218     for( NumFace=0,ExpFace.Init(myShape,TopAbs_FACE); ExpFace.More(); ExpFace.Next(),NumFace++ )
219     {
220       TopoDS_Face myFace = TopoDS::Face(ExpFace.Current());
221       TopLoc_Location myLocation = myFace.Location();
222
223 #ifdef DEBUG
224       cout << "J\'explore actuellement la face " << NumFace << "\n" << endl;
225 #endif
226       Handle(Poly_Triangulation) myT = BRep_Tool::Triangulation(myFace, myLocation);
227       // Returns the Triangulation of the face. It is a null handle if there is no triangulation.
228
229       if (myT.IsNull())
230       {
231 #ifdef DEBUG
232         //cout << "Triangulation of the face "<< i <<" is null \n"<< endl;
233 #endif
234         return;
235       }
236       Poly_Connect pc(myT);
237       const TColgp_Array1OfPnt& Nodes= myT->Nodes();
238       BAR = GProp_PGProps::Barycentre(Nodes);
239
240
241       //const TColgp_Array1OfPnt2d& UVNodes = myT->UVNodes();
242       const Poly_Array1OfTriangle& triangles = myT->Triangles();
243       TColgp_Array1OfDir myNormal(Nodes.Lower(), Nodes.Upper());
244
245       SST.Normal(myFace, pc, myNormal);
246       BRepTools::UVBounds(myFace,Umin, Umax, Vmin, Vmax);
247       dUmax = (Umax - Umin);
248       dVmax = (Vmax - Vmin);
249
250       Standard_Integer nnn = myT->NbTriangles(); // nnn : nombre de triangles
251       Standard_Integer nt, n1, n2, n3 = 0;// nt : triangle courant
252       // ni : sommet i du triangle courant
253
254       //recherche du pt "haut" et du pt "bas
255       // gp_Pnt H (0,0,0);
256       // gp_Pnt B (0,0,1000000000);
257
258       for (nt = 1; nt <= nnn; nt++)
259       {
260         // triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
261         if (SST.Orientation(myFace) == TopAbs_REVERSED) // si la face est "reversed"
262           triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2
263         else
264           triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
265
266         if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) )
267         { // Associates a vertexNT to each node
268           gp_Pnt p = Nodes(n1).Transformed(myLocation.Transformation());
269           gp_Pnt q = Nodes(n2).Transformed(myLocation.Transformation());
270           gp_Pnt r = Nodes(n3).Transformed(myLocation.Transformation());
271         }
272       }
273
274       Handle(Graphic3d_ArrayOfTriangles) aOP = new Graphic3d_ArrayOfTriangles(3 * nnn, 0, Standard_True, Standard_True);
275
276       for (nt = 1; nt <= nnn; nt++)
277       {
278 #ifdef DEBUG
279         cout << "On traite actuellement le triangle : "<< nt <<"\n";
280 #endif
281         if (SST.Orientation(myFace) == TopAbs_REVERSED) // si la face est "reversed"
282           triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2
283         else
284           triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
285
286         if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) )
287         { // Associates a vertexNT to each node
288
289           TColgp_Array1OfPnt Points(1,3);
290
291           gp_Pnt p = Nodes(n1).Transformed(myLocation.Transformation());
292           gp_Pnt q = Nodes(n2).Transformed(myLocation.Transformation());
293           gp_Pnt r = Nodes(n3).Transformed(myLocation.Transformation());
294
295           Points(1).SetCoord(p.X(), p.Y(), p.Z());
296           Points(2).SetCoord(q.X(), q.Y(), q.Z());
297           Points(3).SetCoord(r.X(), r.Y(), r.Z());
298
299           aOP->AddVertex(Points(1), myNormal(n1), Color(p,B.Z(),H.Z(),Dlg.Colorization));
300           aOP->AddVertex(Points(2), myNormal(n2), Color(q,B.Z(),H.Z(),Dlg.Colorization));
301           aOP->AddVertex(Points(3), myNormal(n3), Color(r,B.Z(),H.Z(),Dlg.Colorization));
302         } // end of "if the triangle is valid
303       } // end of the "parcours" of the triangles
304
305       Prs3d_Root::CurrentGroup (aPresentation)->AddPrimitiveArray (aOP);
306
307       mygroup->SetGroupPrimitivesAspect(myAspect);
308     }// end of the exploration of the shape in faces
309
310     break;
311   }
312   }
313 }
314
315 void User_Cylinder::Compute(const Handle_Prs3d_Projector& aProjector,
316                             const Handle_Prs3d_Presentation& aPresentation)
317 {
318   myDrawer->EnableDrawHiddenLine();
319   StdPrs_HLRPolyShape::Add(aPresentation,myShape,myDrawer,aProjector);
320 }
321
322 void User_Cylinder::ComputeSelection(const Handle_SelectMgr_Selection& aSelection,
323                                     const Standard_Integer aMode)
324 {
325   switch(aMode)
326   {
327   case 0:
328     StdSelect_BRepSelectionTool::Load(aSelection,this,myShape,TopAbs_SHAPE, 0.01, 0.1);
329     break;
330   case 4:
331     StdSelect_BRepSelectionTool::Load(aSelection,this,myShape,TopAbs_FACE, 0.01, 0.1);
332     break;
333   }
334 }
335
336 Standard_Integer User_Cylinder::NbPossibleSelection() const
337 {
338   return 2;
339 }
340
341 Standard_Boolean User_Cylinder::AcceptShapeDecomposition() const
342 {
343   return Standard_True;
344 }
345
346 void User_Cylinder::SetPlanarFaceColor(const Quantity_Color acolor)
347 {
348   myPlanarFaceColor = acolor;
349 }
350
351 void User_Cylinder::SetCylindricalFaceColor(const Quantity_Color acolor)
352 {
353   myCylindricalFaceColor = acolor;
354 }
355
356 Standard_Boolean User_Cylinder::TriangleIsValid(const gp_Pnt& P1, const gp_Pnt& P2, const gp_Pnt& P3) const
357
358   gp_Vec V1(P1,P2);// V1=(P1,P2)
359   gp_Vec V2(P2,P3);// V2=(P2,P3)
360   gp_Vec V3(P3,P1);// V3=(P3,P1)
361
362   if ((V1.SquareMagnitude() > 1.e-10) && (V2.SquareMagnitude() > 1.e-10) && (V3.SquareMagnitude() > 1.e-10))
363   {
364     V1.Cross(V2);// V1 = Normal 
365     if (V1.SquareMagnitude() > 1.e-10)
366       return Standard_True;
367     else
368       return Standard_False;
369   }
370   else
371     return Standard_False;
372 }
373
374 Quantity_Color User_Cylinder::Color(gp_Pnt& thePoint,Standard_Real AltMin,Standard_Real AltMax,
375                                     const Standard_Integer ColorizationMode) 
376 {
377   red =1; //initializing colors parameters
378   green=1;
379   blue =1;
380   switch ( ColorizationMode)
381   {
382   case 0 : //normal, vert/maron
383     {
384       Standard_Real Alt= thePoint.Z();
385
386       Standard_Real AltDelta;
387
388       AltDelta = AltMax-AltMin;
389
390       red = 0.5- ((0.5*(AltMax-Alt))/(AltDelta));
391       //Standard_Real A = 7*Alt-7*AltMin;
392       green = (3*AltMax-AltMin)/(3*AltMax-AltMin+(7*Alt-7*AltMin));
393       blue = 0 ;
394
395       Quantity_Color color;
396       color.SetValues(red,green,blue, Quantity_TOC_RGB);
397       return color;
398       break;
399     }//end case 0
400
401   case 1 : //mer-neige
402     {
403       Standard_Real Alt= thePoint.Z();
404
405       Standard_Real b =AltMax-AltMin;
406       Standard_Real a= AltMax-thePoint.Z();
407
408       red =1;
409       green=1;
410       blue =1;
411       if (0<a && a <= (b/5))
412       {
413         red = 1;
414         green = 1;
415         blue = 1;
416       }
417       else if ((b/5)<a && a <= (2*b/5))
418       {
419         red = .55;
420         green = 0.3;
421         blue = 0;
422       }
423       else if ((2*b/5)<a && a <= (18*b/20))
424       {
425         green =1/(((7/(3*AltMax-AltMin))*Alt)+(1-(7*AltMin/(3*AltMax-AltMin))));
426         red = 1/(((1000/(AltMax-AltMin))*Alt)+1000*(1-(AltMin/(AltMax-AltMin))));
427         blue = 0;
428       }
429       else if ((18*b/20)<a && a <= (18.5*b/20))
430       {
431         red = 0.75;
432         green = 0.66;
433         blue = 0;
434       }
435
436       else if ((18.5*b/20)<a && a <= b)
437       {
438         red = 0.25;
439         green = .66;
440         blue = 1;
441       }
442       Quantity_Color color;
443       color.SetValues(red,green,blue, Quantity_TOC_RGB);
444       return color;
445       break;
446     }//end case 1
447
448   case 2 :
449     {
450       gp_Pnt P (85.,0.,-105.);
451       gp_Vec TheVect ( P, thePoint);
452       Standard_Real CoordX;
453       Standard_Real CoordY;
454       Standard_Real CoordZ;
455
456       CoordX = TheVect.X();
457       CoordY = TheVect.Y();
458       CoordZ = TheVect.Z();
459
460       Standard_Real Distance = BAR.Distance ( P);
461
462       Standard_Real a =fabs(CoordX);
463       Standard_Real b =fabs(CoordY);
464       Standard_Real c =fabs(CoordZ);
465
466       Standard_Real xx = a / Max(Distance,a); //(Max (Distance, Maxi));
467       Standard_Real yy = b / Max(Distance,b); //(Max (Distance, Maxi));
468       Standard_Real zz = c / Max(Distance,c); //(Max (Distance, Maxi));
469
470
471       if (myXRedOnOff)
472         red = xx;
473       else if (myXGreenOnOff)
474         green =xx;
475       else if (myXBlueOnOff)
476         blue=xx;
477
478       if (myYRedOnOff)
479         red = yy;
480       else if (myYGreenOnOff)
481         green = yy;
482       else if (myYBlueOnOff)
483         blue = yy;
484
485       if (myZRedOnOff)
486         red = zz;
487       else if (myZGreenOnOff)
488         green = zz;
489       else if (myZBlueOnOff)
490         blue = zz;
491       Quantity_Color color;
492       color.SetValues(red,green,blue, Quantity_TOC_RGB);
493       return color;
494       break;
495     }//end case 2
496   }//end switch
497
498   Quantity_Color c;
499   return c;
500 }
501
502 void User_Cylinder::SetColor(const Quantity_Color &aColor)
503 {
504   AIS_InteractiveObject::SetColor(aColor);
505   SetPlanarFaceColor(aColor);
506   SetCylindricalFaceColor(aColor);
507 }