1 // Created on: 1997-01-03
2 // Created by: Flore Lantheaume
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
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
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
18 #include <DsgPrs_IdenticPresentation.hxx>
22 #include <gp_Elips.hxx>
25 #include <Graphic3d_ArrayOfPoints.hxx>
26 #include <Graphic3d_ArrayOfPolylines.hxx>
27 #include <Graphic3d_ArrayOfSegments.hxx>
28 #include <Graphic3d_AspectLine3d.hxx>
29 #include <Graphic3d_AspectMarker3d.hxx>
30 #include <Graphic3d_Group.hxx>
31 #include <Precision.hxx>
32 #include <Prs3d_DimensionAspect.hxx>
33 #include <Prs3d_LineAspect.hxx>
34 #include <Prs3d_Presentation.hxx>
35 #include <Prs3d_Text.hxx>
36 #include <TCollection_AsciiString.hxx>
37 #include <TCollection_ExtendedString.hxx>
39 void DsgPrs_IdenticPresentation::Add( const Handle(Prs3d_Presentation)& aPresentation,
40 const Handle(Prs3d_Drawer)& aDrawer,
41 const TCollection_ExtendedString& aText,
42 const gp_Pnt& aPntAttach,
43 const gp_Pnt& aPntOffset)
45 Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect();
46 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
48 Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(2);
49 aPrims->AddVertex(aPntAttach);
50 aPrims->AddVertex(aPntOffset);
51 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims);
53 // On ajoute un rond au point d'attache
54 Prs3d_Root::NewGroup(aPresentation);
55 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
56 Quantity_Color aColor;
57 Aspect_TypeOfLine aType;
59 LA->LineAspect()->Aspect()->Values (aColor, aType, aWidth);
60 Handle(Graphic3d_AspectMarker3d) aMarkerAsp = new Graphic3d_AspectMarker3d (Aspect_TOM_O, aColor, 1.0);
61 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect (aMarkerAsp);
62 Handle(Graphic3d_ArrayOfPoints) anArrayOfPoints = new Graphic3d_ArrayOfPoints (1);
63 anArrayOfPoints->AddVertex (aPntAttach.X(), aPntAttach.Y(), aPntAttach.Z());
64 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray (anArrayOfPoints);
67 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,aPntOffset);
71 void DsgPrs_IdenticPresentation::Add( const Handle(Prs3d_Presentation)& aPresentation,
72 const Handle(Prs3d_Drawer)& aDrawer,
73 const TCollection_ExtendedString& aText,
74 const gp_Pnt& aFAttach,
75 const gp_Pnt& aSAttach,
76 const gp_Pnt& aPntOffset)
78 Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect();
79 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
81 Handle(Graphic3d_ArrayOfSegments) aPrims = new Graphic3d_ArrayOfSegments(4);
83 aPrims->AddVertex(aFAttach);
84 aPrims->AddVertex(aSAttach);
86 // trait joignant aPntOffset
87 gp_Vec v1(aFAttach, aSAttach);
88 gp_Vec v2(aSAttach, aPntOffset);
90 aPrims->AddVertex(aPntOffset);
91 if ( !v1.IsParallel(v2, Precision::Angular()))
93 // on joint aPntOffset a son projete
94 gp_Lin ll(aFAttach, gp_Dir(v1));
95 aPrims->AddVertex(ElCLib::Value(ElCLib::Parameter(ll,aPntOffset ), ll));
98 aPrims->AddVertex(aSAttach);
100 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims);
103 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,aPntOffset);
107 void DsgPrs_IdenticPresentation::Add(const Handle(Prs3d_Presentation)& aPresentation,
108 const Handle(Prs3d_Drawer)& aDrawer,
109 const TCollection_ExtendedString& aText,
110 const gp_Ax2& theAxe,
111 const gp_Pnt& aCenter,
112 const gp_Pnt& aFAttach,
113 const gp_Pnt& aSAttach,
114 const gp_Pnt& aPntOffset)
116 Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect();
117 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
120 ax.SetLocation(aCenter);
121 Standard_Real rad = aCenter.Distance(aFAttach);
123 Standard_Real pFAttach = ElCLib::Parameter(CC, aFAttach);
124 Standard_Real pSAttach = ElCLib::Parameter(CC, aSAttach);
125 Standard_Real alpha = pSAttach - pFAttach;
126 if ( alpha < 0 ) alpha += 2. * M_PI;
127 const Standard_Integer nb = (Standard_Integer )( 50. * alpha / M_PI);
128 const Standard_Integer nbp = Max (4, nb);
129 const Standard_Real dteta = alpha/(nbp-1);
131 Handle(Graphic3d_ArrayOfPolylines) aPrims;
133 // trait joignant aPntOffset
134 if ( Abs((aPntOffset.Distance(aCenter) - rad )) >= Precision::Confusion() )
136 aPrims = new Graphic3d_ArrayOfPolylines(nbp+2,2);
138 aPrims->AddVertex(aPntOffset);
139 aPrims->AddVertex(ElCLib::Value(ElCLib::Parameter(CC,aPntOffset ), CC));
140 aPrims->AddBound(nbp);
143 aPrims = new Graphic3d_ArrayOfPolylines(nbp);
145 for (Standard_Integer i = 1; i<=nbp; i++)
146 aPrims->AddVertex(ElCLib::Value(pFAttach + dteta*(i-1),CC));
148 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims);
151 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,aPntOffset);
155 void DsgPrs_IdenticPresentation::Add(const Handle(Prs3d_Presentation)& aPresentation,
156 const Handle(Prs3d_Drawer)& aDrawer,
157 const TCollection_ExtendedString& aText,
158 const gp_Ax2& theAxe,
159 const gp_Pnt& aCenter,
160 const gp_Pnt& aFAttach,
161 const gp_Pnt& aSAttach,
162 const gp_Pnt& aPntOffset,
163 const gp_Pnt& aPntOnCirc)
165 Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect();
166 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
169 ax.SetLocation(aCenter);
170 Standard_Real rad = aCenter.Distance(aFAttach);
172 Standard_Real pFAttach = ElCLib::Parameter(CC, aFAttach);
173 Standard_Real pSAttach = ElCLib::Parameter(CC, aSAttach);
174 Standard_Real alpha = pSAttach - pFAttach;
175 if ( alpha < 0 ) alpha += 2. * M_PI;
176 const Standard_Integer nb = (Standard_Integer)( 50. * alpha / M_PI);
177 const Standard_Integer nbp = Max (4, nb);
178 const Standard_Real dteta = alpha/(nbp-1);
180 Handle(Graphic3d_ArrayOfPolylines) aPrims;
182 // trait joignant aPntOffset
183 if ( aPntOffset.Distance(aPntOnCirc) >= Precision::Confusion() )
185 aPrims = new Graphic3d_ArrayOfPolylines(nbp+2,2);
187 aPrims->AddVertex(aPntOffset);
188 aPrims->AddVertex(aPntOnCirc);
189 aPrims->AddBound(nbp);
192 aPrims = new Graphic3d_ArrayOfPolylines(nbp);
194 for (Standard_Integer i = 1; i<=nbp; i++)
195 aPrims->AddVertex(ElCLib::Value(pFAttach + dteta*(i-1),CC));
197 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims);
200 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,aPntOffset);
202 // jfa 16/10/2000 end
205 void DsgPrs_IdenticPresentation::Add(const Handle(Prs3d_Presentation)& aPresentation,
206 const Handle(Prs3d_Drawer)& aDrawer,
207 const TCollection_ExtendedString& aText,
208 const gp_Elips& anEllipse,
209 const gp_Pnt& aFAttach,
210 const gp_Pnt& aSAttach,
211 const gp_Pnt& aPntOffset,
212 const gp_Pnt& aPntOnElli)
214 Handle(Prs3d_DimensionAspect) LA = aDrawer->DimensionAspect();
215 Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
217 Standard_Real pFAttach = ElCLib::Parameter(anEllipse, aFAttach);
218 Standard_Real pSAttach = ElCLib::Parameter(anEllipse, aSAttach);
219 Standard_Real alpha = pSAttach - pFAttach;
220 if ( alpha < 0 ) alpha += 2. * M_PI;
221 const Standard_Integer nb = (Standard_Integer)(50.0*alpha/M_PI);
222 const Standard_Integer nbp = Max (4, nb);
223 const Standard_Real dteta = alpha/(nbp-1);
225 Handle(Graphic3d_ArrayOfPolylines) aPrims;
227 // trait joignant aPntOffset
228 if ( ! aPntOnElli.IsEqual(aPntOffset, Precision::Confusion()) )
230 aPrims = new Graphic3d_ArrayOfPolylines(nbp+2,2);
232 aPrims->AddVertex(aPntOffset);
233 aPrims->AddVertex(aPntOnElli);
234 aPrims->AddBound(nbp);
237 aPrims = new Graphic3d_ArrayOfPolylines(nbp);
239 for (Standard_Integer i = 1; i<=nbp; i++)
240 aPrims->AddVertex(ElCLib::Value(pFAttach + dteta*(i-1),anEllipse));
242 Prs3d_Root::CurrentGroup(aPresentation)->AddPrimitiveArray(aPrims);
245 Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,aPntOffset);
247 // jfa 10/10/2000 end