08f896e9416ae0c521df4e68006b7df08b77aa20
[occt.git] / src / DsgPrs / DsgPrs_ConcentricPresentation.cxx
1 // Created on: 1996-03-18
2 // Created by: Flore Lantheaume
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21
22
23 #include <DsgPrs_ConcentricPresentation.ixx>
24
25 #include <Graphic3d_Group.hxx>
26 #include <Graphic3d_Array1OfVertex.hxx>
27 #include <Prs3d_LengthAspect.hxx>
28 #include <Prs3d_Root.hxx>
29 #include <Prs3d_LineAspect.hxx>
30
31 #include <gp_Circ.hxx>
32 #include <gp_Pnt.hxx>
33 #include <gp_Dir.hxx>
34 #include <gp_Vec.hxx>
35
36 #include <ElCLib.hxx>
37
38 void DsgPrs_ConcentricPresentation::Add(
39                            const Handle(Prs3d_Presentation)& aPresentation,
40                            const Handle(Prs3d_Drawer)& aDrawer,
41                            const gp_Pnt& aCenter,
42                            const Standard_Real aRadius,
43                            const gp_Dir& aNorm,
44                            const gp_Pnt& aPoint)
45 {
46   Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
47
48   //Creation et discretisation du plus gros cercle
49   gp_Circ Circ(gp_Ax2(aCenter,aNorm), aRadius);
50   Standard_Integer nbp = 50;
51   Standard_Real dteta = (2 * M_PI)/nbp;
52   Graphic3d_Array1OfVertex V(1,nbp+1);
53   gp_Pnt ptcur;
54   Standard_Real ucur = 0;
55   Standard_Integer i ;
56   for ( i = 1; i<=nbp; i++) {
57     ptcur = ElCLib::Value(ucur, Circ);
58     V(i).SetCoord(ptcur.X(), ptcur.Y(),ptcur.Z());
59     ucur = ucur + dteta;
60   }
61   V(nbp+1).SetCoord( V(1).X(), V(1).Y(), V(1).Z());
62   Prs3d_Root::CurrentGroup(aPresentation)
63     ->SetPrimitivesAspect(LA->LineAspect()->Aspect());
64   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
65
66   //Creation et discretisation du plus petit cercle
67   Circ.SetRadius(aRadius/2);
68   ucur = 0;
69   for ( i = 1; i<=nbp; i++) {
70     ptcur = ElCLib::Value(ucur, Circ);
71     V(i).SetCoord(ptcur.X(), ptcur.Y(),ptcur.Z());
72     ucur = ucur + dteta;
73   }
74   V(nbp+1).SetCoord( V(1).X(), V(1).Y(), V(1).Z());
75   Prs3d_Root::NewGroup(aPresentation);
76   Prs3d_Root::CurrentGroup(aPresentation)
77     ->SetPrimitivesAspect(LA->LineAspect()->Aspect());
78   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
79
80   //Creation de la croix
81      //1er segment
82   gp_Dir vecnorm(aPoint.XYZ() - aCenter.XYZ() );
83   gp_Vec vec(vecnorm);
84   vec.Multiply(aRadius);
85   gp_Pnt p1 = aCenter.Translated(vec);
86   gp_Pnt p2 = aCenter.Translated(-vec);
87   
88   Prs3d_Root::NewGroup(aPresentation);
89   Prs3d_Root::CurrentGroup(aPresentation)->
90     SetPrimitivesAspect(LA->LineAspect()->Aspect());
91   Graphic3d_Array1OfVertex VExt(1,2);
92   VExt(1).SetCoord(p1.X(), p1.Y(), p1.Z());
93   VExt(2).SetCoord(p2.X(), p2.Y(), p2.Z());
94   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VExt);
95
96      //2ieme segment
97   vec.Cross(aNorm);
98   vecnorm.SetCoord(vec.X(), vec.Y(), vec.Z() );
99   vec.SetXYZ(vecnorm.XYZ());
100   vec.Multiply(aRadius);
101   p1 = aCenter.Translated(vec);
102   p2 = aCenter.Translated(-vec);
103   VExt(1).SetCoord(p1.X(), p1.Y(), p1.Z());
104   VExt(2).SetCoord(p2.X(), p2.Y(), p2.Z());
105
106   Prs3d_Root::NewGroup(aPresentation);
107   Prs3d_Root::CurrentGroup(aPresentation)->
108     SetPrimitivesAspect(LA->LineAspect()->Aspect());
109   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(VExt);
110
111 }