941ee900853b1b4eeef387a75c4f9690d87f5d93
[occt.git] / src / HLRBRep / HLRBRep_HLRToShape.cxx
1 // Created on: 1993-10-11
2 // Created by: Christophe MARION
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21
22 #include <HLRBRep_HLRToShape.ixx>
23 #include <TopoDS.hxx>
24 #include <TopExp_Explorer.hxx>
25 #include <TopTools_IndexedMapOfShape.hxx>
26 #include <BRep_Builder.hxx>
27 #include <HLRBRep.hxx>
28 #include <HLRBRep_Data.hxx>
29 #include <HLRBRep_ShapeBounds.hxx>
30 #include <HLRAlgo_EdgeIterator.hxx>
31
32 //=======================================================================
33 //function : HLRBRep_HLRToShape
34 //purpose  : 
35 //=======================================================================
36
37 HLRBRep_HLRToShape::HLRBRep_HLRToShape (const Handle(HLRBRep_Algo)& A) :
38 myAlgo(A)
39 {}
40
41 //=======================================================================
42 //function : InternalCompound
43 //purpose  : 
44 //=======================================================================
45
46 TopoDS_Shape 
47 HLRBRep_HLRToShape::InternalCompound (const Standard_Integer typ,
48                                       const Standard_Boolean visible,
49                                       const TopoDS_Shape& S)
50 {
51   Standard_Boolean added = Standard_False;
52   TopoDS_Shape Result;
53   Handle(HLRBRep_Data) DS = myAlgo->DataStructure();
54
55   if (!DS.IsNull()) {
56     DS->Projector().Scaled(Standard_True);
57     Standard_Integer e1 = 1;
58     Standard_Integer e2 = DS->NbEdges();
59     Standard_Integer f1 = 1;
60     Standard_Integer f2 = DS->NbFaces();
61     Standard_Boolean explor = Standard_False;
62 //    Standard_Boolean todraw;
63     if (!S.IsNull()) {
64       Standard_Integer v1,v2;
65       Standard_Integer index = myAlgo->Index(S);
66       if (index == 0) explor = Standard_True;
67       else            myAlgo->ShapeBounds(index).Bounds(v1,v2,e1,e2,f1,f2);
68     }
69     BRep_Builder B;
70     B.MakeCompound(TopoDS::Compound(Result));
71     HLRBRep_EdgeData* ed = &(DS->EDataArray().ChangeValue(e1 - 1));
72     
73     for (Standard_Integer ie = e1; ie <= e2; ie++) {
74       ed++;
75       if (ed->Selected() && !ed->Vertical()) {
76         ed->Used(Standard_False);
77         ed->HideCount(0);
78       }
79       else ed->Used(Standard_True);
80     }
81     if (explor) {
82       TopTools_IndexedMapOfShape& Edges = DS->EdgeMap();
83       TopTools_IndexedMapOfShape& Faces = DS->FaceMap();
84       TopExp_Explorer Exp;
85       
86       for (Exp.Init (S, TopAbs_FACE);
87            Exp.More();
88            Exp.Next()) {
89         Standard_Integer iface = Faces.FindIndex(Exp.Current());
90         if (iface != 0) DrawFace(visible,typ,iface,DS,Result,added);
91       }
92       if (typ >= 3) {
93
94         for (Exp.Init (S, TopAbs_EDGE, TopAbs_FACE);
95              Exp.More();
96              Exp.Next()) {
97           Standard_Integer ie = Edges.FindIndex(Exp.Current());
98           if (ie != 0) {
99             HLRBRep_EdgeData& ed = DS->EDataArray().ChangeValue(ie);
100             if (!ed.Used()) {
101               DrawEdge(visible,Standard_False,typ,ed,Result,added);
102               ed.Used(Standard_True);
103             }
104           }
105         }
106       }
107     }
108     else {
109
110       for (Standard_Integer iface = f1; iface <= f2; iface++)
111         DrawFace(visible,typ,iface,DS,Result,added);
112
113       if (typ >= 3) {
114         HLRBRep_EdgeData* ed = &(DS->EDataArray().ChangeValue(e1 - 1));
115         
116         for (Standard_Integer ie = e1; ie <= e2; ie++) {
117           ed++;
118           if (!ed->Used()) {
119             DrawEdge(visible,Standard_False,typ,*ed,Result,added);
120             ed->Used(Standard_True);
121           }
122         }
123       }
124     }
125     DS->Projector().Scaled(Standard_False);
126   }
127   if (!added) Result = TopoDS_Shape();
128   return Result;
129 }
130
131 //=======================================================================
132 //function : DrawFace
133 //purpose  : 
134 //=======================================================================
135
136 void 
137 HLRBRep_HLRToShape::DrawFace (const Standard_Boolean visible,
138                               const Standard_Integer typ,
139                               const Standard_Integer iface,
140                               Handle(HLRBRep_Data)& DS,
141                               TopoDS_Shape& Result,
142                               Standard_Boolean& added) const
143 {
144   HLRBRep_FaceIterator Itf;
145
146   for (Itf.InitEdge(DS->FDataArray().ChangeValue(iface));
147        Itf.MoreEdge();
148        Itf.NextEdge()) {               
149     Standard_Integer ie = Itf.Edge();
150     HLRBRep_EdgeData& edf = DS->EDataArray().ChangeValue(ie);
151     if (!edf.Used()) {
152       Standard_Boolean todraw;
153       if      (typ == 1) todraw =  Itf.IsoLine();
154       else if (typ == 2) todraw =  Itf.Internal();
155       else if (typ == 3) todraw =  edf.Rg1Line() &&
156         !edf.RgNLine() && !Itf.OutLine();
157       else if (typ == 4) todraw =  edf.RgNLine() && !Itf.OutLine();
158       else               todraw =
159         !(Itf.IsoLine()  ||
160           Itf.Internal() ||
161           (edf.Rg1Line() && !Itf.OutLine()));
162
163        if (todraw) {
164         DrawEdge(visible,Standard_True,typ,edf,Result,added);
165         edf.Used(Standard_True);
166       }
167       else {
168         if(typ > 4 && (edf.Rg1Line() && !Itf.OutLine())) {
169           Standard_Integer hc = edf.HideCount();
170           if(hc > 0) {
171             edf.Used(Standard_True);
172           }
173           else {
174             ++hc;
175             edf.HideCount(hc); //to try with another face
176           }
177         }
178         else {
179           edf.Used(Standard_True);
180         }
181       }
182     }
183   }
184 }
185
186 //=======================================================================
187 //function : DrawEdge
188 //purpose  : 
189 //=======================================================================
190
191 void 
192 HLRBRep_HLRToShape::DrawEdge (const Standard_Boolean visible,
193                               const Standard_Boolean inFace,
194                               const Standard_Integer typ,
195                               HLRBRep_EdgeData& ed,
196                               TopoDS_Shape& Result,
197                               Standard_Boolean& added) const
198 {
199   Standard_Boolean todraw = Standard_False;
200   if      (inFace)   todraw = Standard_True;
201   else if (typ == 3) todraw = ed.Rg1Line() && !ed.RgNLine();
202   else if (typ == 4) todraw = ed.RgNLine();
203   else               todraw =!ed.Rg1Line();
204
205   if (todraw) {
206     Standard_Real sta,end;
207     Standard_ShortReal tolsta,tolend;
208     BRep_Builder B;
209     TopoDS_Edge E;
210     HLRAlgo_EdgeIterator It;
211     if (visible)
212     {
213       for (It.InitVisible(ed.Status()); It.MoreVisible(); It.NextVisible()) {
214         It.Visible(sta,tolsta,end,tolend);
215         E = HLRBRep::MakeEdge(ed.Geometry(),sta,end);
216         if (!E.IsNull())
217         {
218           B.Add(Result,E);
219           added = Standard_True;
220         }
221       }
222     }
223     else
224     {
225       for (It.InitHidden(ed.Status()); It.MoreHidden(); It.NextHidden()) {
226         It.Hidden(sta,tolsta,end,tolend);
227         E = HLRBRep::MakeEdge(ed.Geometry(),sta,end);
228         if (!E.IsNull())
229         {
230           B.Add(Result,E);
231           added = Standard_True;
232         }
233       }
234     }
235   }
236 }