7f0c7429360f40945ee000dc4528be8bd1710476
[occt.git] / src / DsgPrs / DsgPrs_ParalPresentation.cxx
1 // Created on: 1995-11-28
2 // Created by: Jean-Pierre COMBE
3 // Copyright (c) 1995-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_ParalPresentation.ixx>
24 #include <gp_Lin.hxx>
25 #include <gp_Dir.hxx>
26 #include <ElCLib.hxx>
27 #include <gce_MakeLin.hxx>
28 #include <Graphic3d_Group.hxx>
29 #include <Graphic3d_Array1OfVertex.hxx>
30 #include <Prs3d_Arrow.hxx>
31 #include <Prs3d_ArrowAspect.hxx>
32 #include <Prs3d_LineAspect.hxx>
33 #include <Prs3d_LengthAspect.hxx>
34 #include <TCollection_AsciiString.hxx>
35 #include <Graphic3d_AspectLine3d.hxx>
36 #include <Prs3d_Text.hxx>
37 #include <DsgPrs.hxx>
38
39 void DsgPrs_ParalPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
40                                     const Handle(Prs3d_Drawer)& aDrawer,
41                                     const TCollection_ExtendedString& aText,
42                                     const gp_Pnt& AttachmentPoint1,
43                                     const gp_Pnt& AttachmentPoint2,
44                                     const gp_Dir& aDirection,
45                                     const gp_Pnt& OffsetPoint) {
46
47
48   Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
49   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
50   gp_Lin L1 (AttachmentPoint1,aDirection);
51   gp_Lin L2 (AttachmentPoint2,aDirection);
52   gp_Pnt Proj1 = ElCLib::Value(ElCLib::Parameter(L1,OffsetPoint),L1);
53   gp_Pnt Proj2 = ElCLib::Value(ElCLib::Parameter(L2,OffsetPoint),L2);
54   gp_Lin L3 = gce_MakeLin(Proj1,Proj2);
55   Standard_Real parmin,parmax,parcur;
56   parmin = ElCLib::Parameter(L3,Proj1);
57   parmax = parmin;
58   parcur = ElCLib::Parameter(L3,Proj2);
59   Standard_Real dist = Abs(parmin-parcur);
60   if (parcur < parmin) parmin = parcur;
61   if (parcur > parmax) parmax = parcur;
62   parcur = ElCLib::Parameter(L3,OffsetPoint);
63   gp_Pnt offp = ElCLib::Value(parcur,L3);
64
65   Standard_Boolean outside = Standard_False;
66   if (parcur < parmin) {
67     parmin = parcur;
68     outside = Standard_True;
69   }
70   if (parcur > parmax) {
71     parmax = parcur;
72     outside = Standard_True;
73   }
74
75   gp_Pnt PointMin = ElCLib::Value(parmin,L3);
76   gp_Pnt PointMax = ElCLib::Value(parmax,L3);
77
78   Graphic3d_Array1OfVertex V(1,2);
79
80   Quantity_Length X,Y,Z;
81
82   PointMin.Coord(X,Y,Z);
83   V(1).SetCoord(X,Y,Z);
84
85   PointMax.Coord(X,Y,Z);
86   V(2).SetCoord(X,Y,Z);
87   // processing of side : 1st group
88   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
89
90   Prs3d_Root::NewGroup(aPresentation);
91   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
92   
93   if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length())) {
94     outside = Standard_True;
95   }
96   gp_Dir arrdir = L3.Direction().Reversed();
97
98   if (outside) {
99     arrdir.Reverse();
100   }
101   // arrow 1 : 2nd group
102   Prs3d_Arrow::Draw(aPresentation,Proj1,arrdir,
103                     LA->Arrow1Aspect()->Angle(),
104                     LA->Arrow1Aspect()->Length());
105
106   Prs3d_Root::NewGroup(aPresentation);
107   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
108   
109   // arrow 2 : 3rd group
110   Prs3d_Arrow::Draw(aPresentation,Proj2,arrdir.Reversed(),
111                     LA->Arrow2Aspect()->Angle(),
112                     LA->Arrow2Aspect()->Length());
113
114   Prs3d_Root::NewGroup(aPresentation);
115   
116   // text : 4th group
117   Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp);
118   
119   AttachmentPoint1.Coord(X,Y,Z);
120   V(1).SetCoord(X,Y,Z);
121   Proj1.Coord(X,Y,Z);
122   V(2).SetCoord(X,Y,Z);
123
124   Prs3d_Root::NewGroup(aPresentation);
125   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
126   // processing of call 1 : 5th group
127   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
128   
129   AttachmentPoint2.Coord(X,Y,Z);
130   V(1).SetCoord(X,Y,Z);
131   Proj2.Coord(X,Y,Z);
132   V(2).SetCoord(X,Y,Z);
133
134   Prs3d_Root::NewGroup(aPresentation);
135   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
136   // processing of call 2 : 6th group
137   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
138   
139 }
140
141
142 //==========================================================================
143 // function : DsgPrs_ParalPresentation::Add
144 // purpose  : it is possible to choose the symbol of extremities of the face (arrow, point...)
145 //==========================================================================
146 void DsgPrs_ParalPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
147                                     const Handle(Prs3d_Drawer)& aDrawer,
148                                     const TCollection_ExtendedString& aText,
149                                     const gp_Pnt& AttachmentPoint1,
150                                     const gp_Pnt& AttachmentPoint2,
151                                     const gp_Dir& aDirection,
152                                     const gp_Pnt& OffsetPoint,
153                                     const DsgPrs_ArrowSide ArrowPrs){
154
155
156   Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
157   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
158
159   gp_Lin L1 (AttachmentPoint1,aDirection);
160   gp_Lin L2 (AttachmentPoint2,aDirection);
161   gp_Pnt Proj1 = ElCLib::Value(ElCLib::Parameter(L1,OffsetPoint),L1);
162   gp_Pnt Proj2 = ElCLib::Value(ElCLib::Parameter(L2,OffsetPoint),L2);
163   gp_Lin L3 = gce_MakeLin(Proj1,Proj2);
164   Standard_Real parmin,parmax,parcur;
165   parmin = ElCLib::Parameter(L3,Proj1);
166   parmax = parmin;
167   parcur = ElCLib::Parameter(L3,Proj2);
168   Standard_Real dist = Abs(parmin-parcur);
169   if (parcur < parmin) parmin = parcur;
170   if (parcur > parmax) parmax = parcur;
171   parcur = ElCLib::Parameter(L3,OffsetPoint);
172   gp_Pnt offp = ElCLib::Value(parcur,L3);
173
174   Standard_Boolean outside = Standard_False;
175   if (parcur < parmin) {
176     parmin = parcur;
177     outside = Standard_True;
178   }
179   if (parcur > parmax) {
180     parmax = parcur;
181     outside = Standard_True;
182   }
183
184   gp_Pnt PointMin = ElCLib::Value(parmin,L3);
185   gp_Pnt PointMax = ElCLib::Value(parmax,L3);
186
187   Graphic3d_Array1OfVertex V(1,2);
188
189   Quantity_Length X,Y,Z;
190
191   PointMin.Coord(X,Y,Z);
192   V(1).SetCoord(X,Y,Z);
193
194   PointMax.Coord(X,Y,Z);
195   V(2).SetCoord(X,Y,Z);
196
197   // processing of face 
198   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
199   
200   if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length())) {
201     outside = Standard_True;
202   }
203   gp_Dir arrdir = L3.Direction().Reversed();
204
205   if (outside) {
206     arrdir.Reverse();
207   }
208
209
210   AttachmentPoint1.Coord(X,Y,Z);
211   V(1).SetCoord(X,Y,Z);
212   Proj1.Coord(X,Y,Z);
213   V(2).SetCoord(X,Y,Z);
214
215   // processing of call 1 
216   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
217   
218   AttachmentPoint2.Coord(X,Y,Z);
219   V(1).SetCoord(X,Y,Z);
220   Proj2.Coord(X,Y,Z);
221   V(2).SetCoord(X,Y,Z);
222
223    // processing of call 2 
224   Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
225   
226   
227   // text 
228   Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp);
229   
230   //arrows
231   DsgPrs::ComputeSymbol(aPresentation,LA,Proj1,Proj2,arrdir,arrdir.Reversed(),ArrowPrs);
232
233
234 }
235
236