Integration of OCCT 6.5.0 from SVN
[occt.git] / src / VrmlConverter / VrmlConverter_HLRShape.cxx
CommitLineData
7fd59977 1#include <VrmlConverter_HLRShape.ixx>
2#include <Bnd_Box.hxx>
3#include <StdPrs_HLRToolShape.hxx>
4#include <BRepAdaptor_Curve.hxx>
5#include <BRepBndLib.hxx>
6#include <VrmlConverter_DeflectionCurve.hxx>
7#include <VrmlConverter_LineAspect.hxx>
8#include <Precision.hxx>
9#include <Vrml_Separator.hxx>
10#include <Vrml_Material.hxx>
11
12//=======================================================================
13//function : Add
14//purpose :
15//=======================================================================
16
17void VrmlConverter_HLRShape::Add(Standard_OStream& anOStream,
18 const TopoDS_Shape& aShape,
19 const Handle (VrmlConverter_Drawer)& aDrawer,
20 const Handle (VrmlConverter_Projector)& aProjector)
21{
22 StdPrs_HLRToolShape Tool(aShape,aProjector->Projector());
23
24 Standard_Integer NbEdge = Tool.NbEdges();
25 Standard_Integer i;
26 Standard_Real U1,U2;
27 BRepAdaptor_Curve TheCurve;
28
29 Standard_Real theRequestedDeflection;
30 if(aDrawer->TypeOfDeflection() == Aspect_TOD_RELATIVE) // TOD_RELATIVE, TOD_ABSOLUTE
31 {
32 Bnd_Box box;
33 BRepBndLib::AddClose(aShape, box);
34
35 Standard_Real Xmin, Xmax, Ymin, Ymax, Zmin, Zmax, diagonal;
36 box.Get( Xmin, Ymin, Zmin, Xmax, Ymax, Zmax );
37 if (!(box.IsOpenXmin() || box.IsOpenXmax() ||
38 box.IsOpenYmin() || box.IsOpenYmax() ||
39 box.IsOpenZmin() || box.IsOpenZmax()))
40 {
41
42 diagonal = Sqrt ((Xmax - Xmin)*( Xmax - Xmin) + ( Ymax - Ymin)*( Ymax - Ymin) + ( Zmax - Zmin)*( Zmax - Zmin));
43 diagonal = Max(diagonal, Precision::Confusion());
44 theRequestedDeflection = aDrawer->DeviationCoefficient() * diagonal;
45 }
46 else
47 {
48 diagonal =1000000.;
49 theRequestedDeflection = aDrawer->DeviationCoefficient() * diagonal;
50 }
51
52 }
53 else
54 {
55 theRequestedDeflection = aDrawer->MaximalChordialDeviation();
56 }
57
58
59 Handle(VrmlConverter_LineAspect) latmp = new VrmlConverter_LineAspect;
60 latmp->SetMaterial(aDrawer->LineAspect()->Material());
61 latmp->SetHasMaterial(aDrawer->LineAspect()->HasMaterial());
62
63 Handle(VrmlConverter_LineAspect) laHL = new VrmlConverter_LineAspect;
64 Handle(VrmlConverter_LineAspect) laSL = new VrmlConverter_LineAspect;
65
66 laHL = aDrawer->HiddenLineAspect();
67 laSL = aDrawer->SeenLineAspect();
68
69 Vrml_Separator SE1;
70 Vrml_Separator SE2;
71 Vrml_Separator SE3;
72
73 Standard_Boolean flag = Standard_False; // to check a call of Vrml_Separator.Print(anOStream)
74
75 SE1.Print(anOStream);
76
77// Adds (if they are defined) Camera or/and Light and MatrixTransform.
78 aProjector->Add(anOStream);
79
80 if (laSL->HasMaterial()){
81
82 Handle(Vrml_Material) MSL;
83 MSL = laSL->Material();
84
85 MSL->Print(anOStream);
86 laSL->SetHasMaterial(Standard_False);
87
88 flag = Standard_True;
89 // Separator 2 {
90 SE2.Print(anOStream);
91 }
92 aDrawer->SetLineAspect(laSL);
93
94// aDrawer->SetLineAspect(aDrawer->SeenLineAspect());
95 for (i=1;i<=NbEdge;i++){
96 for(Tool.InitVisible(i);Tool.MoreVisible();Tool.NextVisible()){
97 Tool.Visible(TheCurve,U1,U2);
98 VrmlConverter_DeflectionCurve::Add(anOStream, TheCurve, U1, U2, theRequestedDeflection);
99// VrmlConverter_DeflectionCurve::Add(anOStream, TheCurve, U1, U2, aDrawer);
100 }
101 }
102
103 if (flag){
104 // Separator 2 }
105 SE2.Print(anOStream);
106 flag = Standard_False;
107 }
108
109 if(aDrawer->DrawHiddenLine()){
110
111 if (laHL->HasMaterial()){
112
113 Handle(Vrml_Material) MHL;
114 MHL = laHL->Material();
115
116 MHL->Print(anOStream);
117 laHL->SetHasMaterial(Standard_False);
118
119 flag = Standard_True;
120 // Separator 3 {
121 SE3.Print(anOStream);
122 }
123 aDrawer->SetLineAspect(laHL);
124// aDrawer->SetLineAspect(aDrawer->HiddenLineAspect());
125
126 for (i=1;i<=NbEdge;i++){
127 for(Tool.InitHidden(i);Tool.MoreHidden();Tool.NextHidden()){
128 Tool.Hidden(TheCurve,U1,U2);
129 VrmlConverter_DeflectionCurve::Add(anOStream, TheCurve, U1, U2, theRequestedDeflection);
130// VrmlConverter_DeflectionCurve::Add(anOStream, TheCurve, U1, U2, aDrawer);
131 }
132 }
133 if (flag){
134 // Separator 3 }
135 SE3.Print(anOStream);
136 flag = Standard_False;
137 }
138 }
139
140 // Separator 1 }
141 SE1.Print(anOStream);
142
143 aDrawer->SetLineAspect(latmp);
144}