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 | |
17 | void 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 | } |