0022627: Change OCCT memory management defaults
[occt.git] / src / TestTopOpeDraw / TestTopOpeDraw_DrawableSUR.cxx
1 // File:        TestTopOpeDraw_DrawableSUR.cxx
2 // Created:     Wed Sep 11 10:53:24 1996
3 // Author:      Jean Yves LEBEY
4 //              <jyl@bistrox.paris1.matra-dtv.fr>
5
6 #include <TestTopOpeDraw_DrawableSUR.ixx>
7 #include <Geom_RectangularTrimmedSurface.hxx>
8 #include <BRepAdaptor_Surface.hxx>
9 #include <BRepTools.hxx>
10 #include <gp_Vec.hxx>
11 #include <gp_Vec2d.hxx>
12 #include <gp_Dir2d.hxx>
13 #include <gp.hxx>
14
15 //=======================================================================
16 //function : TestTopOpeDraw_DrawableSUR
17 //purpose  : 
18 //=======================================================================
19
20 TestTopOpeDraw_DrawableSUR::TestTopOpeDraw_DrawableSUR
21 (const Handle(Geom_Surface)& S, const Draw_Color& IsoColor) :
22  DrawTrSurf_Surface(S,0, 0, Draw_cyan, IsoColor,16,  0.01, 1),
23                   //  nu,nv,boundscolor         Disc,Defl, DMode)
24  myNormalColor(Draw_blanc)
25
26 {
27   myText = new Draw_Text3D(Pnt(),"",IsoColor);
28 }
29
30 //=======================================================================
31 //function : TestTopOpeDraw_DrawableSUR
32 //purpose  : 
33 //=======================================================================
34
35 TestTopOpeDraw_DrawableSUR::TestTopOpeDraw_DrawableSUR
36 (const Handle(Geom_Surface)& S, const Draw_Color& IsoColor,
37  const Standard_CString Text,const Draw_Color& TextColor) :
38  DrawTrSurf_Surface(S,0, 0, Draw_cyan, IsoColor,16,  0.01, 1),
39                   //  nu,nv,boundscolor         Disc,Defl, DMode)
40  myNormalColor(Draw_blanc)
41
42 {
43   myText = new Draw_Text3D(Pnt(),Text,TextColor);
44 }
45
46 //=======================================================================
47 //function : TestTopOpeDraw_DrawableSUR
48 //purpose  : 
49 //=======================================================================
50
51 TestTopOpeDraw_DrawableSUR::TestTopOpeDraw_DrawableSUR
52 (const Handle(Geom_Surface)& S,
53  const Draw_Color& IsoColor,
54  const Draw_Color& BoundColor, 
55  const Draw_Color& NormalColor,
56  const Standard_CString Text,const Draw_Color& TextColor,
57  const Standard_Integer Nu, const Standard_Integer Nv,
58  const Standard_Integer Disc, const Standard_Real Defl, const Standard_Integer DMode,
59  const Standard_Boolean DispOrigin) :
60  DrawTrSurf_Surface(S,Nu,Nv,IsoColor,BoundColor,Disc,Defl,DMode)
61 {
62   myText = new Draw_Text3D(Pnt(),Text,TextColor);
63   myNormalColor = NormalColor;
64 }
65
66 //=======================================================================
67 //function : Pnt2d
68 //purpose  : 
69 //=======================================================================
70
71 gp_Pnt2d TestTopOpeDraw_DrawableSUR::Pnt2d() const 
72 {
73   const Handle(Geom_Surface)& GS = GetSurface();
74   Standard_Real u1,u2,v1,v2; GS->Bounds(u1,u2,v1,v2);
75   Standard_Real facpar = 0.20;
76   Standard_Real u = u1 + (u2-u1)*facpar;
77   Standard_Real v = v1 + (v2-v1)*facpar;
78   gp_Pnt2d P(u,v);
79   return P;
80 }
81
82 //=======================================================================
83 //function : Pnt
84 //purpose  : 
85 //=======================================================================
86
87 gp_Pnt TestTopOpeDraw_DrawableSUR::Pnt() const
88 {
89   const Handle(Geom_Surface)& GS = GetSurface();
90   gp_Pnt2d P2d = Pnt2d();
91   gp_Pnt P = GS->Value(P2d.X(),P2d.Y());
92   return P;
93 }
94
95 //=======================================================================
96 //function : DrawOn
97 //purpose  : 
98 //=======================================================================
99
100 void  TestTopOpeDraw_DrawableSUR::DrawOn(Draw_Display& dis) const
101 {
102   DrawTrSurf_Surface::DrawOn(dis);
103   myText->DrawOn(dis);
104   DrawNormale(dis);
105 }
106
107 //=======================================================================
108 //function : NormalColor
109 //purpose  : 
110 //=======================================================================
111
112 void  TestTopOpeDraw_DrawableSUR::NormalColor(const Draw_Color& NormalColor)
113 {
114   myNormalColor =  NormalColor;
115 }
116
117 //=======================================================================
118 //function : DrawNormale
119 //purpose  : 
120 //=======================================================================
121
122 void  TestTopOpeDraw_DrawableSUR::DrawNormale(Draw_Display& dis) const 
123 {
124   dis.SetColor(myNormalColor);
125
126   // la normale
127   gp_Pnt2d P2d = Pnt2d(); Standard_Real u,v; P2d.Coord(u,v);
128   gp_Pnt P1,P2; gp_Vec V,V1,V2; 
129   const Handle(Geom_Surface)& GS = GetSurface();
130   GS->D1(u,v,P1,V1,V2); 
131   Standard_Real mag; V = V1.Crossed(V2); mag = V.Magnitude();
132   Standard_Real lvec = 1.;
133   Handle(Geom_RectangularTrimmedSurface) GRTS;
134   GRTS = Handle(Geom_RectangularTrimmedSurface)::DownCast(GS);
135   if (!GRTS.IsNull()) {
136     Standard_Real u1,u2,v1,v2; GRTS->Bounds(u1,u2,v1,v2);
137     gp_Pnt Pmin,Pmax; GRTS->D0(u1,v1,Pmin); GRTS->D0(u2,v2,Pmax);
138     lvec = Pmin.Distance(Pmax);
139   }
140   if (mag > 1.e-10) V.Multiply(lvec/mag);
141   else { V.SetCoord(lvec/2.,0,0); cout<<"Null normal"<<endl; }
142   P2 = P1; P2.Translate(V);
143   dis.Draw(P1,P2);
144
145   // la fleche de la normale
146   gp_Pnt2d p1,p2;
147   dis.Project(P1,p1);
148   dis.Project(P2,p2);
149   gp_Vec2d v2d(p1,p2);
150   if (v2d.Magnitude() > gp::Resolution()) {
151     Standard_Real L = 20 / dis.Zoom();
152     Standard_Real H = 10 / dis.Zoom();
153     gp_Dir2d d2d(v2d);
154     gp_Pnt2d pp;
155     pp.SetCoord(p2.X() - L*d2d.X() - H*d2d.Y(), p2.Y() - L*d2d.Y() + H*d2d.X());
156     dis.MoveTo(pp);
157     dis.DrawTo(p2);
158     pp.SetCoord(p2.X() - L*d2d.X() + H*d2d.Y(), p2.Y() - L*d2d.Y() - H*d2d.X());
159     dis.DrawTo(pp);
160   }
161
162 }