0023634: Eliminate Polyline and Polygon usage in drawers
[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 #include <DsgPrs_ParalPresentation.ixx>
22 #include <gp_Lin.hxx>
23 #include <gp_Dir.hxx>
24 #include <ElCLib.hxx>
25 #include <gce_MakeLin.hxx>
26 #include <Graphic3d_Group.hxx>
27 #include <Graphic3d_ArrayOfSegments.hxx>
28 #include <Prs3d_Arrow.hxx>
29 #include <Prs3d_ArrowAspect.hxx>
30 #include <Prs3d_LineAspect.hxx>
31 #include <Prs3d_LengthAspect.hxx>
32 #include <TCollection_AsciiString.hxx>
33 #include <Graphic3d_AspectLine3d.hxx>
34 #include <Prs3d_Text.hxx>
35 #include <DsgPrs.hxx>
36
37 void DsgPrs_ParalPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
38                                     const Handle(Prs3d_Drawer)& aDrawer,
39                                     const TCollection_ExtendedString& aText,
40                                     const gp_Pnt& AttachmentPoint1,
41                                     const gp_Pnt& AttachmentPoint2,
42                                     const gp_Dir& aDirection,
43                                     const gp_Pnt& OffsetPoint)
44 {
45   Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
46   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
47   gp_Lin L1 (AttachmentPoint1,aDirection);
48   gp_Lin L2 (AttachmentPoint2,aDirection);
49   gp_Pnt Proj1 = ElCLib::Value(ElCLib::Parameter(L1,OffsetPoint),L1);
50   gp_Pnt Proj2 = ElCLib::Value(ElCLib::Parameter(L2,OffsetPoint),L2);
51   gp_Lin L3 = gce_MakeLin(Proj1,Proj2);
52   Standard_Real parmin,parmax,parcur;
53   parmin = ElCLib::Parameter(L3,Proj1);
54   parmax = parmin;
55   parcur = ElCLib::Parameter(L3,Proj2);
56   Standard_Real dist = Abs(parmin-parcur);
57   if (parcur < parmin) parmin = parcur;
58   if (parcur > parmax) parmax = parcur;
59   parcur = ElCLib::Parameter(L3,OffsetPoint);
60   gp_Pnt offp = ElCLib::Value(parcur,L3);
61
62   Standard_Boolean outside = Standard_False;
63   if (parcur < parmin) {
64     parmin = parcur;
65     outside = Standard_True;
66   }
67   if (parcur > parmax) {
68     parmax = parcur;
69     outside = Standard_True;
70   }
71
72   gp_Pnt PointMin = ElCLib::Value(parmin,L3);
73   gp_Pnt PointMax = ElCLib::Value(parmax,L3);
74
75   // processing of side : 1st group
76   Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(6);
77   aPrims->AddVertex(PointMin);
78   aPrims->AddVertex(PointMax);
79
80   Prs3d_Root::NewGroup(aPresentation);
81   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
82   
83   if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length()))
84     outside = Standard_True;
85   gp_Dir arrdir = L3.Direction().Reversed();
86   if (outside)
87     arrdir.Reverse();
88
89   // arrow 1 : 2nd group
90   Prs3d_Arrow::Draw(aPresentation,Proj1,arrdir,LA->Arrow1Aspect()->Angle(),LA->Arrow1Aspect()->Length());
91
92   Prs3d_Root::NewGroup(aPresentation);
93   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
94   
95   // arrow 2 : 3rd group
96   Prs3d_Arrow::Draw(aPresentation,Proj2,arrdir.Reversed(),LA->Arrow2Aspect()->Angle(),LA->Arrow2Aspect()->Length());
97
98   Prs3d_Root::NewGroup(aPresentation);
99   
100   // text : 4th group
101   Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp);
102
103   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
104
105   // processing of call 1 : 5th group
106   aPrims->AddVertex(AttachmentPoint1);
107   aPrims->AddVertex(Proj1);
108   
109   // processing of call 2 : 6th group
110   aPrims->AddVertex(AttachmentPoint2);
111   aPrims->AddVertex(Proj2);
112
113   Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims);
114 }
115
116
117 //==========================================================================
118 // function : DsgPrs_ParalPresentation::Add
119 // purpose  : it is possible to choose the symbol of extremities of the face (arrow, point...)
120 //==========================================================================
121 void DsgPrs_ParalPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
122                                     const Handle(Prs3d_Drawer)& aDrawer,
123                                     const TCollection_ExtendedString& aText,
124                                     const gp_Pnt& AttachmentPoint1,
125                                     const gp_Pnt& AttachmentPoint2,
126                                     const gp_Dir& aDirection,
127                                     const gp_Pnt& OffsetPoint,
128                                     const DsgPrs_ArrowSide ArrowPrs)
129 {
130   Handle(Prs3d_LengthAspect) LA = aDrawer->LengthAspect();
131   Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
132
133   gp_Lin L1 (AttachmentPoint1,aDirection);
134   gp_Lin L2 (AttachmentPoint2,aDirection);
135   gp_Pnt Proj1 = ElCLib::Value(ElCLib::Parameter(L1,OffsetPoint),L1);
136   gp_Pnt Proj2 = ElCLib::Value(ElCLib::Parameter(L2,OffsetPoint),L2);
137   gp_Lin L3 = gce_MakeLin(Proj1,Proj2);
138   Standard_Real parmin,parmax,parcur;
139   parmin = ElCLib::Parameter(L3,Proj1);
140   parmax = parmin;
141   parcur = ElCLib::Parameter(L3,Proj2);
142   Standard_Real dist = Abs(parmin-parcur);
143   if (parcur < parmin) parmin = parcur;
144   if (parcur > parmax) parmax = parcur;
145   parcur = ElCLib::Parameter(L3,OffsetPoint);
146   gp_Pnt offp = ElCLib::Value(parcur,L3);
147
148   Standard_Boolean outside = Standard_False;
149   if (parcur < parmin) {
150     parmin = parcur;
151     outside = Standard_True;
152   }
153   if (parcur > parmax) {
154     parmax = parcur;
155     outside = Standard_True;
156   }
157
158   gp_Pnt PointMin = ElCLib::Value(parmin,L3);
159   gp_Pnt PointMax = ElCLib::Value(parmax,L3);
160
161   // processing of face 
162   Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(6);
163   aPrims->AddVertex(PointMin);
164   aPrims->AddVertex(PointMax);
165   
166   if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length()))
167     outside = Standard_True;
168   gp_Dir arrdir = L3.Direction().Reversed();
169   if (outside)
170     arrdir.Reverse();
171
172   // processing of call 1 
173   aPrims->AddVertex(AttachmentPoint1);
174   aPrims->AddVertex(Proj1);
175   
176   // processing of call 2 
177   aPrims->AddVertex(AttachmentPoint2);
178   aPrims->AddVertex(Proj2);
179
180   Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims);
181
182   // text 
183   Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp);
184   
185   //arrows
186   DsgPrs::ComputeSymbol(aPresentation,LA,Proj1,Proj2,arrdir,arrdir.Reversed(),ArrowPrs);
187 }