1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
15 #include <Adaptor3d_IsoCurve.hxx>
16 #include <Bnd_Box2d.hxx>
17 #include <BndLib_Add2dCurve.hxx>
18 #include <BRepAdaptor_HSurface.hxx>
20 #include <Hatch_Hatcher.hxx>
21 #include <Precision.hxx>
22 #include <StdPrs_ToolRFace.hxx>
23 #include <Vrml_Material.hxx>
24 #include <Vrml_Separator.hxx>
25 #include <VrmlConverter_Curve.hxx>
26 #include <VrmlConverter_Drawer.hxx>
27 #include <VrmlConverter_IsoAspect.hxx>
28 #include <VrmlConverter_WFRestrictedFace.hxx>
30 //=========================================================================
33 //=========================================================================
34 void VrmlConverter_WFRestrictedFace::Add
35 (Standard_OStream& anOStream,
36 const Handle(BRepAdaptor_HSurface)& aFace,
37 const Standard_Boolean DrawUIso,
38 const Standard_Boolean DrawVIso,
39 const Standard_Integer NBUiso,
40 const Standard_Integer NBViso,
41 const Handle(VrmlConverter_Drawer)& aDrawer)
43 Standard_Real aLimit = aDrawer->MaximalParameterValue();
44 Standard_Integer nbPoints = aDrawer->Discretisation();
46 StdPrs_ToolRFace ToolRst (aFace);
48 // compute bounds of the restriction
49 Standard_Real UMin,UMax,VMin,VMax;
54 for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
55 const Adaptor2d_Curve2d& TheRCurve = ToolRst.Value();
56 BndLib_Add2dCurve::Add(TheRCurve, Precision::PConfusion(), B);
59 B.Get(UMin, VMin, UMax, VMax);
61 // load the infinite isos
62 Hatch_Hatcher isobuild(1.e-5,ToolRst.IsOriented());
63 Standard_Boolean UClosed = aFace->IsUClosed();
64 Standard_Boolean VClosed = aFace->IsVClosed();
67 UMin = UMin + ( UMax - UMin) /1000.;
68 UMax = UMax - ( UMax - UMin) /1000.;
72 VMin = VMin + ( VMax - VMin) /1000.;
73 VMax = VMax - ( VMax - VMin) /1000.;
78 UClosed = Standard_False;
79 Standard_Real du= UClosed ? (UMax-UMin)/NBUiso : (UMax-UMin)/(1+NBUiso);
80 for (i=1; i<=NBUiso;i++){
81 isobuild.AddXLine(UMin+du*i);
87 VClosed = Standard_False;
88 Standard_Real dv= VClosed ?(VMax-VMin)/NBViso : (VMax-VMin)/(1+NBViso);
89 for (i=1; i<=NBViso;i++){
90 isobuild.AddYLine(VMin+dv*i);
96 Standard_Real U1, U2, U, DU;
98 for (ToolRst.Init(); ToolRst.More(); ToolRst.Next()) {
99 TopAbs_Orientation Orient = ToolRst.Orientation();
100 const Adaptor2d_Curve2d* TheRCurve = &ToolRst.Value();
101 U1 = TheRCurve->FirstParameter();
102 U2 = TheRCurve->LastParameter();
103 if (TheRCurve->GetType() != GeomAbs_Line) {
104 DU = (U2-U1)/(nbPoints-1);
105 P2 = TheRCurve->Value(U1);
106 for (i = 2; i <= nbPoints; i++) {
109 P2 = TheRCurve->Value(U);
110 if(Orient == TopAbs_FORWARD )
111 isobuild.Trim(P1,P2);
113 isobuild.Trim(P2,P1);
117 P1 = TheRCurve->Value(U1);
118 P2 = TheRCurve->Value(U2);
119 if(Orient == TopAbs_FORWARD )
120 isobuild.Trim(P1,P2);
122 isobuild.Trim(P2,P1);
130 Adaptor3d_IsoCurve anIso;
132 Standard_Integer NumberOfLines = isobuild.NbLines();
134 Handle(VrmlConverter_LineAspect) latmp = new VrmlConverter_LineAspect;
135 latmp->SetMaterial(aDrawer->LineAspect()->Material());
136 latmp->SetHasMaterial(aDrawer->LineAspect()->HasMaterial());
138 Handle(VrmlConverter_IsoAspect) iautmp = new VrmlConverter_IsoAspect;
139 iautmp->SetMaterial(aDrawer->UIsoAspect()->Material());
140 iautmp->SetHasMaterial(aDrawer->UIsoAspect()->HasMaterial());
141 iautmp->SetNumber(aDrawer->UIsoAspect()->Number());
143 Handle(VrmlConverter_IsoAspect) iavtmp = new VrmlConverter_IsoAspect;
144 iavtmp->SetMaterial(aDrawer->VIsoAspect()->Material());
145 iavtmp->SetHasMaterial(aDrawer->VIsoAspect()->HasMaterial());
146 iavtmp->SetNumber(aDrawer->VIsoAspect()->Number());
148 Handle(VrmlConverter_LineAspect) laU = new VrmlConverter_LineAspect;
149 Handle(VrmlConverter_LineAspect) laV = new VrmlConverter_LineAspect;
151 laU = aDrawer->UIsoAspect();
152 laV = aDrawer->VIsoAspect();
156 // cout << "Face:aDrawer>UMaterial1 = " << aDrawer->UIsoAspect()->HasMaterial() << endl;
157 // cout << "Face:aDrawer>VMaterial1 = " << aDrawer->VIsoAspect()->HasMaterial() << endl;
158 // cout << "Face:aDrawer>LineAspect1 = " << aDrawer->LineAspect()->HasMaterial() << endl;
159 // cout << "Face:la1 = " << latmp->HasMaterial() << endl;
160 // cout << "Face:laU1 = " << laU->HasMaterial() << endl;
161 // cout << "Face:laV1 = " << laV->HasMaterial() << endl;
162 // cout << "Face:iau1 = " << iautmp->HasMaterial() << endl;
163 // cout << "Face:iav1 = " << iavtmp->HasMaterial() << endl;
166 // creation of Vrml objects
173 Standard_Boolean flag = Standard_False; // to check a call of Vrml_Separator.Print(anOStream)
175 SE1.Print(anOStream);
180 if (laU->HasMaterial()){
182 Handle(Vrml_Material) MU;
183 MU = laU->Material();
185 MU->Print(anOStream);
186 laU->SetHasMaterial(Standard_False);
188 flag = Standard_True;
190 SE2.Print(anOStream);
192 aDrawer->SetLineAspect(laU);
195 for (i = 1; i <= NumberOfLines; i++) {
196 if (isobuild.IsXLine(i))
198 Standard_Integer NumberOfIntervals = isobuild.NbIntervals(i);
199 Standard_Real Coord = isobuild.Coordinate(i);
200 for (Standard_Integer j = 1; j <= NumberOfIntervals; j++) {
201 Standard_Real b1=isobuild.Start(i,j),b2=isobuild.End(i,j);
203 b1 = b1 == RealFirst() ? - aLimit : b1;
204 b2 = b2 == RealLast() ? aLimit : b2;
206 anIso.Load(GeomAbs_IsoU,Coord,b1,b2);
208 VrmlConverter_Curve::Add(anIso, aDrawer, anOStream);
215 SE2.Print(anOStream);
216 flag = Standard_False;
223 if (laV->HasMaterial()){
225 Handle(Vrml_Material) MV;
226 MV = laV->Material();
228 MV->Print(anOStream);
229 laV->SetHasMaterial(Standard_False);
230 flag = Standard_True;
233 SE3.Print(anOStream);
236 aDrawer->SetLineAspect(laV);
238 for (i = 1; i <= NumberOfLines; i++) {
239 if (isobuild.IsYLine(i))
241 Standard_Integer NumberOfIntervals = isobuild.NbIntervals(i);
242 Standard_Real Coord = isobuild.Coordinate(i);
243 for (Standard_Integer j = 1; j <= NumberOfIntervals; j++) {
244 Standard_Real b1=isobuild.Start(i,j),b2=isobuild.End(i,j);
246 b1 = b1 == RealFirst() ? - aLimit : b1;
247 b2 = b2 == RealLast() ? aLimit : b2;
249 anIso.Load(GeomAbs_IsoV,Coord,b1,b2);
251 VrmlConverter_Curve::Add(anIso, aDrawer, anOStream);
258 SE3.Print(anOStream);
259 flag = Standard_False;
265 SE1.Print(anOStream);
267 aDrawer->SetLineAspect(latmp);
268 aDrawer->SetUIsoAspect(iautmp);
269 aDrawer->SetVIsoAspect(iavtmp);
273 // cout << "Face:aDrawer>UMaterial4 = " << aDrawer->UIsoAspect()->HasMaterial() << endl;
274 // cout << "Face:aDrawer>VMaterial4 = " << aDrawer->VIsoAspect()->HasMaterial() << endl;
275 // cout << "Face:aDrawer>LineAspect4 = " << aDrawer->LineAspect()->HasMaterial() << endl;
276 // cout << "Face:la4 = " << latmp->HasMaterial() << endl;
277 // cout << "Face:laU4 = " << laU->HasMaterial() << endl;
278 // cout << "Face:laV4 = " << laV->HasMaterial() << endl;
279 // cout << "Face:iau4 = " << iautmp->HasMaterial() << endl;
280 // cout << "Face:iav4 = " << iavtmp->HasMaterial() << endl;
285 //=========================================================================
288 //=========================================================================
289 void VrmlConverter_WFRestrictedFace::Add
290 (Standard_OStream& anOStream,
291 const Handle(BRepAdaptor_HSurface)& aFace,
292 const Handle (VrmlConverter_Drawer)& aDrawer){
294 Standard_Integer finu = aDrawer->UIsoAspect()->Number();
295 Standard_Integer finv = aDrawer->VIsoAspect()->Number();
297 VrmlConverter_WFRestrictedFace::Add (
309 //=========================================================================
312 //=========================================================================
313 void VrmlConverter_WFRestrictedFace::AddUIso
314 (Standard_OStream& anOStream,
315 const Handle(BRepAdaptor_HSurface)& aFace,
316 const Handle (VrmlConverter_Drawer)& aDrawer) {
318 Standard_Integer finu = aDrawer->UIsoAspect()->Number();
319 Standard_Integer finv = aDrawer->VIsoAspect()->Number();
321 VrmlConverter_WFRestrictedFace::Add (
332 //=========================================================================
335 //=========================================================================
336 void VrmlConverter_WFRestrictedFace::AddVIso
337 (Standard_OStream& anOStream,
338 const Handle(BRepAdaptor_HSurface)& aFace,
339 const Handle (VrmlConverter_Drawer)& aDrawer) {
341 Standard_Integer finu = aDrawer->UIsoAspect()->Number();
342 Standard_Integer finv = aDrawer->VIsoAspect()->Number();
344 VrmlConverter_WFRestrictedFace::Add (