0024624: Lost word in license statement in source files
[occt.git] / src / DsgPrs / DsgPrs_IdenticPresentation.cxx
CommitLineData
b311480e 1// Created on: 1997-01-03
2// Created by: Flore Lantheaume
3// Copyright (c) 1997-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 8// This library is free software; you can redistribute it and/or modify it under
9// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 10// by the Free Software Foundation, with special exception defined in the file
11// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12// distribution for complete text of the license and disclaimer of any warranty.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
17#include <DsgPrs_IdenticPresentation.ixx>
18
19#include <Graphic3d_Group.hxx>
b8ddfc2f 20#include <Graphic3d_ArrayOfSegments.hxx>
21#include <Graphic3d_ArrayOfPolylines.hxx>
7fd59977 22#include <Graphic3d_AspectMarker3d.hxx>
23#include <Graphic3d_AspectLine3d.hxx>
a577aaab 24#include <Graphic3d_ArrayOfPoints.hxx>
7fd59977 25
26#include <Prs3d_LineAspect.hxx>
a6eb515f 27#include <Prs3d_DimensionAspect.hxx>
7fd59977 28#include <Prs3d_Text.hxx>
29
30#include <TCollection_AsciiString.hxx>
31
32#include <gp_Vec.hxx>
33#include <gp_Dir.hxx>
34
35#include <ElCLib.hxx>
36
37#include <Precision.hxx>
38#include <gp_Elips.hxx>
39
40void DsgPrs_IdenticPresentation::Add( const Handle(Prs3d_Presentation)& aPresentation,
41 const Handle(Prs3d_Drawer)& aDrawer,
42 const TCollection_ExtendedString& aText,
43 const gp_Pnt& aPntAttach,
44 const gp_Pnt& aPntOffset)
45{
a6eb515f 46 Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect();
7fd59977 47 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
48
b8ddfc2f 49 Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2);
50 aPrims->AddVertex(aPntAttach);
51 aPrims->AddVertex(aPntOffset);
52 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims);
7fd59977 53
54 // On ajoute un rond au point d'attache
55 Prs3d_Root::NewGroup(aPresentation);
56 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
a577aaab 57 Quantity_Color aColor;
58 Aspect_TypeOfLine aType;
59 Standard_Real aWidth;
60 LA->LineAspect()->Aspect()->Values (aColor, aType, aWidth);
61 Handle(Graphic3d_AspectMarker3d) aMarkerAsp = new Graphic3d_AspectMarker3d (Aspect_TOM_O, aColor, 1.0);
62 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect (aMarkerAsp);
63 Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
64 anArrayOfPoints->AddVertex (aPntAttach.X(), aPntAttach.Y(), aPntAttach.Z());
65 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints);
7fd59977 66
67 // texte
68 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,aPntOffset);
69}
70
71
7fd59977 72void DsgPrs_IdenticPresentation::Add( const Handle(Prs3d_Presentation)& aPresentation,
73 const Handle(Prs3d_Drawer)& aDrawer,
74 const TCollection_ExtendedString& aText,
75 const gp_Pnt& aFAttach,
76 const gp_Pnt& aSAttach,
77 const gp_Pnt& aPntOffset)
78{
a6eb515f 79 Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect();
7fd59977 80 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
81
b8ddfc2f 82 Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(4);
7fd59977 83
b8ddfc2f 84 aPrims->AddVertex(aFAttach);
85 aPrims->AddVertex(aSAttach);
7fd59977 86
87 // trait joignant aPntOffset
7fd59977 88 gp_Vec v1(aFAttach, aSAttach);
89 gp_Vec v2(aSAttach, aPntOffset);
b8ddfc2f 90
91 aPrims->AddVertex(aPntOffset);
92 if ( !v1.IsParallel(v2, Precision::Angular()))
93 {
7fd59977 94 // on joint aPntOffset a son projete
95 gp_Lin ll(aFAttach, gp_Dir(v1));
b8ddfc2f 96 aPrims->AddVertex(ElCLib::Value(ElCLib::Parameter(ll,aPntOffset ), ll));
7fd59977 97 }
b8ddfc2f 98 else
99 aPrims->AddVertex(aSAttach);
100
101 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims);
7fd59977 102
103 // texte
104 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,aPntOffset);
105}
106
107
7fd59977 108void DsgPrs_IdenticPresentation::Add(const Handle(Prs3d_Presentation)& aPresentation,
109 const Handle(Prs3d_Drawer)& aDrawer,
110 const TCollection_ExtendedString& aText,
111 const gp_Ax2& theAxe,
112 const gp_Pnt& aCenter,
113 const gp_Pnt& aFAttach,
114 const gp_Pnt& aSAttach,
115 const gp_Pnt& aPntOffset)
116{
a6eb515f 117 Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect();
7fd59977 118 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
119
120 gp_Ax2 ax = theAxe;
121 ax.SetLocation(aCenter);
122 Standard_Real rad = aCenter.Distance(aFAttach);
123 gp_Circ CC(ax,rad );
124 Standard_Real pFAttach = ElCLib::Parameter(CC, aFAttach);
125 Standard_Real pSAttach = ElCLib::Parameter(CC, aSAttach);
126 Standard_Real alpha = pSAttach - pFAttach;
b8ddfc2f 127 if ( alpha < 0 ) alpha += 2. * M_PI;
128 const Standard_Integer nb = (Standard_Integer )( 50. * alpha / M_PI);
129 const Standard_Integer nbp = Max (4, nb);
130 const Standard_Real dteta = alpha/(nbp-1);
7fd59977 131
b8ddfc2f 132 Handle(Graphic3d_ArrayOfPolylines) aPrims;
7fd59977 133
134 // trait joignant aPntOffset
b8ddfc2f 135 if ( Abs((aPntOffset.Distance(aCenter) - rad )) >= Precision::Confusion() )
136 {
137 aPrims = new Graphic3d_ArrayOfPolylines(nbp+2,2);
138 aPrims->AddBound(2);
139 aPrims->AddVertex(aPntOffset);
140 aPrims->AddVertex(ElCLib::Value(ElCLib::Parameter(CC,aPntOffset ), CC));
141 aPrims->AddBound(nbp);
7fd59977 142 }
b8ddfc2f 143 else
144 aPrims = new Graphic3d_ArrayOfPolylines(nbp);
145
146 for (Standard_Integer i = 1; i<=nbp; i++)
147 aPrims->AddVertex(ElCLib::Value(pFAttach + dteta*(i-1),CC));
148
149 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims);
7fd59977 150
151 // texte
152 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,aPntOffset);
153}
154
155// jfa 16/10/2000
156void DsgPrs_IdenticPresentation::Add(const Handle(Prs3d_Presentation)& aPresentation,
157 const Handle(Prs3d_Drawer)& aDrawer,
158 const TCollection_ExtendedString& aText,
159 const gp_Ax2& theAxe,
160 const gp_Pnt& aCenter,
161 const gp_Pnt& aFAttach,
162 const gp_Pnt& aSAttach,
163 const gp_Pnt& aPntOffset,
164 const gp_Pnt& aPntOnCirc)
165{
a6eb515f 166 Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect();
7fd59977 167 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
168
169 gp_Ax2 ax = theAxe;
170 ax.SetLocation(aCenter);
171 Standard_Real rad = aCenter.Distance(aFAttach);
172 gp_Circ CC(ax,rad );
b8ddfc2f 173 Standard_Real pFAttach = ElCLib::Parameter(CC, aFAttach);
174 Standard_Real pSAttach = ElCLib::Parameter(CC, aSAttach);
7fd59977 175 Standard_Real alpha = pSAttach - pFAttach;
b8ddfc2f 176 if ( alpha < 0 ) alpha += 2. * M_PI;
177 const Standard_Integer nb = (Standard_Integer)( 50. * alpha / M_PI);
178 const Standard_Integer nbp = Max (4, nb);
179 const Standard_Real dteta = alpha/(nbp-1);
180
181 Handle(Graphic3d_ArrayOfPolylines) aPrims;
7fd59977 182
7fd59977 183 // trait joignant aPntOffset
7fd59977 184 if ( aPntOffset.Distance(aPntOnCirc) >= Precision::Confusion() )
b8ddfc2f 185 {
186 aPrims = new Graphic3d_ArrayOfPolylines(nbp+2,2);
187 aPrims->AddBound(2);
188 aPrims->AddVertex(aPntOffset);
189 aPrims->AddVertex(aPntOnCirc);
190 aPrims->AddBound(nbp);
191 }
192 else
193 aPrims = new Graphic3d_ArrayOfPolylines(nbp);
194
195 for (Standard_Integer i = 1; i<=nbp; i++)
196 aPrims->AddVertex(ElCLib::Value(pFAttach + dteta*(i-1),CC));
197
198 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims);
7fd59977 199
200 // texte
201 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,aPntOffset);
202}
203// jfa 16/10/2000 end
204
205// jfa 10/10/2000
206void DsgPrs_IdenticPresentation::Add(const Handle(Prs3d_Presentation)& aPresentation,
207 const Handle(Prs3d_Drawer)& aDrawer,
208 const TCollection_ExtendedString& aText,
209 const gp_Elips& anEllipse,
210 const gp_Pnt& aFAttach,
211 const gp_Pnt& aSAttach,
212 const gp_Pnt& aPntOffset,
213 const gp_Pnt& aPntOnElli)
214{
a6eb515f 215 Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect();
7fd59977 216 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
217
218 Standard_Real pFAttach = ElCLib::Parameter(anEllipse, aFAttach);
219 Standard_Real pSAttach = ElCLib::Parameter(anEllipse, aSAttach);
220 Standard_Real alpha = pSAttach - pFAttach;
b8ddfc2f 221 if ( alpha < 0 ) alpha += 2. * M_PI;
222 const Standard_Integer nb = (Standard_Integer)(50.0*alpha/M_PI);
223 const Standard_Integer nbp = Max (4, nb);
224 const Standard_Real dteta = alpha/(nbp-1);
7fd59977 225
b8ddfc2f 226 Handle(Graphic3d_ArrayOfPolylines) aPrims;
7fd59977 227
228 // trait joignant aPntOffset
7fd59977 229 if ( ! aPntOnElli.IsEqual(aPntOffset, Precision::Confusion()) )
b8ddfc2f 230 {
231 aPrims = new Graphic3d_ArrayOfPolylines(nbp+2,2);
232 aPrims->AddBound(2);
233 aPrims->AddVertex(aPntOffset);
234 aPrims->AddVertex(aPntOnElli);
235 aPrims->AddBound(nbp);
236 }
237 else
238 aPrims = new Graphic3d_ArrayOfPolylines(nbp);
239
240 for (Standard_Integer i = 1; i<=nbp; i++)
241 aPrims->AddVertex(ElCLib::Value(pFAttach + dteta*(i-1),anEllipse));
242
243 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims);
7fd59977 244
245 // texte
246 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,aPntOffset);
247}
248// jfa 10/10/2000 end