Integration of OCCT 6.5.0 from SVN
[occt.git] / src / BRepToIGES / BRepToIGES_BRShell.cxx
CommitLineData
7fd59977 1// Copyright: Matra-Datavision 1995
2// File: BRepToIGES_BRShell.cxx
3// Created: Mon Jan 30 11:46:12 1995
4// Author: Marie Jose MARTZ
5// <mjm>
6//:n3 abv 8 Feb 99: PRO17820: BRepTools::OuterWire() -> ShapeAnalysis::OuterWire
7//szv#4 S4163
8
9#include <BRepToIGES_BRShell.ixx>
10#include <BRepToIGES_BRWire.hxx>
11
12#include <BRep_Tool.hxx>
13#include <BRepTools.hxx>
14
15#include <gp.hxx>
16#include <gp_Trsf.hxx>
17
18#include <Geom_ConicalSurface.hxx>
19#include <Geom_CylindricalSurface.hxx>
20#include <Geom_RectangularTrimmedSurface.hxx>
21#include <Geom_SphericalSurface.hxx>
22#include <Geom_Surface.hxx>
23#include <Geom_SurfaceOfRevolution.hxx>
24#include <Geom_ToroidalSurface.hxx>
25
26#include <GeomToIGES_GeomSurface.hxx>
27
28#include <IGESBasic_Group.hxx>
29#include <IGESData_HArray1OfIGESEntity.hxx>
30#include <IGESData_IGESEntity.hxx>
31
32#include <IGESGeom_CurveOnSurface.hxx>
33#include <IGESGeom_HArray1OfCurveOnSurface.hxx>
34#include <IGESGeom_TrimmedSurface.hxx>
35#include <IGESGeom_SurfaceOfRevolution.hxx>
36
37#include <Interface_Macros.hxx>
38
39#include <TColStd_HSequenceOfTransient.hxx>
40
41#include <TopLoc_Location.hxx>
42
43#include <TopoDS.hxx>
44#include <TopoDS_Vertex.hxx>
45#include <TopoDS_Edge.hxx>
46#include <TopoDS_Face.hxx>
47#include <TopoDS_Shell.hxx>
48#include <TopoDS_Wire.hxx>
49#include <TopoDS_Shape.hxx>
50
51#include <TopAbs_ShapeEnum.hxx>
52#include <TopExp.hxx>
53#include <TopExp_Explorer.hxx>
54
55#include <ShapeAlgo.hxx>
56#include <ShapeAlgo_AlgoContainer.hxx>
57
58#include <Message_ProgressIndicator.hxx>
59#include <Transfer_FinderProcess.hxx>
60
61//=============================================================================
62// BRepToIGES_BRShell
63//=============================================================================
64
65BRepToIGES_BRShell::BRepToIGES_BRShell()
66{
67}
68
69
70//=============================================================================
71// BRepToIGES_BRShell
72//=============================================================================
73
74BRepToIGES_BRShell::BRepToIGES_BRShell
75(const BRepToIGES_BREntity& BR)
76: BRepToIGES_BREntity(BR)
77{
78}
79
80
81//=============================================================================
82// TransferShell
83//=============================================================================
84
85Handle(IGESData_IGESEntity) BRepToIGES_BRShell ::TransferShell(const TopoDS_Shape& start)
86{
87 Handle(IGESData_IGESEntity) res;
88
89 if (start.IsNull()) return res;
90
91 if (start.ShapeType() == TopAbs_FACE) {
92 TopoDS_Face F = TopoDS::Face(start);
93 res = TransferFace(F);
94 }
95 else if (start.ShapeType() == TopAbs_SHELL) {
96 TopoDS_Shell S = TopoDS::Shell(start);
97 res = TransferShell(S);
98 }
99 else {
100 // message d`erreur
101 }
102 return res;
103}
104
105
106//=============================================================================
107// TransferFace
108//
109//=============================================================================
110
111Handle(IGESData_IGESEntity) BRepToIGES_BRShell ::TransferFace(const TopoDS_Face& start)
112{
113 Handle(IGESData_IGESEntity) res;
114
115 Handle(Message_ProgressIndicator) progress = GetTransferProcess()->GetProgress();
116 if ( ! progress.IsNull() ) {
117 if ( progress->UserBreak() ) return res;
118 progress->Increment();
119 }
120
121 if ( start.IsNull()) {
122 return res;
123 }
124 //Standard_Integer Nb = 0; //szv#4:S4163:12Mar99 unused
125 Standard_Real Length = 1.;
126 Handle(IGESData_IGESEntity) ISurf;
127
128 // returns the face surface
129 // ------------------------
130
131 Handle(Geom_Surface) Surf = BRep_Tool::Surface(start);
132 Handle(Geom_Surface) Surf1;
133
134 if (!Surf.IsNull()) {
135 Standard_Real U1, U2, V1, V2;
136 // pour limiter les surfaces de base
137 BRepTools::UVBounds(start, U1, U2, V1, V2);
138 GeomToIGES_GeomSurface GS;
139 GS.SetModel(GetModel());
140 ISurf = GS.TransferSurface(Surf, U1, U2, V1, V2);
141 if (ISurf.IsNull()) {
142 AddWarning (start, "the basic surface is a null entity");
143 return res;
144 }
145 Length = GS.Length();
146
147 // modif mjm du 17/07/97
148 if (Surf->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) {
149 DeclareAndCast(Geom_RectangularTrimmedSurface, rectang, Surf);
150 Surf1 = rectang->BasisSurface();
151 }
152 else
153 Surf1 = Surf;
154 }
155
156
157 // returns the wires of the face
158 // -----------------------------
159
160 BRepToIGES_BRWire BW(*this);
161 Standard_Integer Imode = 0;
162 Standard_Integer Iprefer = 0;
163 Handle(IGESData_IGESEntity) ICurve2d;
164 // pour explorer la face , il faut la mettre fORWARD.
165 TopoDS_Face myface = start;
166 Standard_Boolean IsReversed = Standard_False;
167 if (start.Orientation() == TopAbs_REVERSED) {
168 myface.Reverse();
169 IsReversed = Standard_True;
170 }
171
172 // outer wire
173//:n3 TopoDS_Wire Outer = BRepTools::OuterWire(myface);
174 TopoDS_Wire Outer = ShapeAlgo::AlgoContainer()->OuterWire(myface); //:n3
175 Handle(IGESGeom_CurveOnSurface) IOuter = new IGESGeom_CurveOnSurface;
176 if (!Outer.IsNull()) {
177 Handle(IGESData_IGESEntity) ICurve3d =
178 BW.TransferWire(Outer, myface, ICurve2d, Length);
179 if ((!ICurve3d.IsNull()) && (!ICurve2d.IsNull())) Iprefer = 3;
180 if ((!ICurve3d.IsNull()) && (ICurve2d.IsNull())) Iprefer = 2;
181 if ((ICurve3d.IsNull()) && (!ICurve2d.IsNull())) Iprefer = 1;
182 IOuter -> Init (Imode, ISurf, ICurve2d, ICurve3d, Iprefer);
183 }
184
185 // inners wires
186 TopExp_Explorer Ex;
187 Handle(TColStd_HSequenceOfTransient) Seq = new TColStd_HSequenceOfTransient();
188
189 for (Ex.Init(myface,TopAbs_WIRE); Ex.More(); Ex.Next()) {
190 TopoDS_Wire W = TopoDS::Wire(Ex.Current());
191 Handle(IGESGeom_CurveOnSurface) Curve = new IGESGeom_CurveOnSurface;
192 if (W.IsNull()) {
193 AddWarning(start," an Wire is a null entity");
194 }
195 else if (!W.IsSame(Outer)) {
196 Handle(IGESData_IGESEntity) ICurve3d =
197 BW.TransferWire(W, myface, ICurve2d, Length);
198 if ((!ICurve3d.IsNull()) && (!ICurve2d.IsNull())) Iprefer = 3;
199 if ((!ICurve3d.IsNull()) && (ICurve2d.IsNull())) Iprefer = 2;
200 if ((ICurve3d.IsNull()) && (!ICurve2d.IsNull())) Iprefer = 1;
201 Curve-> Init (Imode, ISurf, ICurve2d, ICurve3d, Iprefer);
202 if (!Curve.IsNull()) Seq->Append(Curve);
203 }
204 }
205
206 // all inners edges not in a wire
207 for (Ex.Init(myface,TopAbs_EDGE,TopAbs_WIRE); Ex.More(); Ex.Next()) {
208 TopoDS_Edge E = TopoDS::Edge(Ex.Current());
209 Handle(IGESGeom_CurveOnSurface) Curve = new IGESGeom_CurveOnSurface;
210 if (E.IsNull()) {
211 AddWarning(start," an Edge is a null entity");
212 }
213 else {
214 Handle(IGESData_IGESEntity) ICurve3d = BW.TransferEdge(E, Standard_False);
215 Handle(IGESData_IGESEntity) newICurve2d = BW.TransferEdge(E, myface, Length, Standard_False);
216 if ((!ICurve3d.IsNull()) && (!newICurve2d.IsNull())) Iprefer = 3;
217 if ((!ICurve3d.IsNull()) && (newICurve2d.IsNull())) Iprefer = 2;
218 if ((ICurve3d.IsNull()) && (!newICurve2d.IsNull())) Iprefer = 1;
219 Curve-> Init (Imode, ISurf, newICurve2d, ICurve3d, Iprefer);
220 if (!Curve.IsNull()) Seq->Append(Curve);
221 }
222 }
223
224
225 Standard_Integer nbent = Seq->Length();
226 Handle(IGESGeom_HArray1OfCurveOnSurface) Tab;
227 if (nbent >=1) {
228 Tab = new IGESGeom_HArray1OfCurveOnSurface(1,nbent);
229 for (Standard_Integer itab = 1; itab <= nbent; itab++) {
230 Handle(IGESGeom_CurveOnSurface) item = GetCasted(IGESGeom_CurveOnSurface, Seq->Value(itab));
231 Tab->SetValue(itab,item);
232 }
233 }
234
235 // returns the TrimmedSurface
236 // --------------------------
237 Standard_Boolean Flag = Standard_True; // pour l`instant
238 Handle(IGESGeom_TrimmedSurface) TrimmedSurf = new IGESGeom_TrimmedSurface;
239 TrimmedSurf-> Init (ISurf, Flag, IOuter, Tab);
240
241 res = TrimmedSurf;
242 if (IsReversed) myface.Reverse();
243
244 SetShapeResult ( start, res );
245
246 return res;
247}
248
249
250//=============================================================================
251// TransferShell
252//=============================================================================
253
254Handle(IGESData_IGESEntity) BRepToIGES_BRShell::TransferShell(const TopoDS_Shell& start)
255{
256 Handle(IGESData_IGESEntity) res;
257 if ( start.IsNull()) return res;
258
259 TopExp_Explorer Ex;
260 Handle(IGESBasic_Group) IGroup = new IGESBasic_Group;
261 Handle(TColStd_HSequenceOfTransient) Seq = new TColStd_HSequenceOfTransient();
262 Handle(IGESData_IGESEntity) IFace;
263
264 for (Ex.Init(start,TopAbs_FACE); Ex.More(); Ex.Next()) {
265 TopoDS_Face F = TopoDS::Face(Ex.Current());
266 if (F.IsNull()) {
267 AddWarning(start," a Face is a null entity");
268 }
269 else {
270 IFace = TransferFace(F);
271 if (!IFace.IsNull()) Seq->Append(IFace);
272 }
273 }
274
275
276 Standard_Integer nbfaces = Seq->Length();
277 Handle(IGESData_HArray1OfIGESEntity) Tab;
278 if ( nbfaces >= 1) {
279 Tab = new IGESData_HArray1OfIGESEntity(1,nbfaces);
280 for (Standard_Integer itab = 1; itab <= nbfaces; itab++) {
281 Handle(IGESData_IGESEntity) item = GetCasted(IGESData_IGESEntity, Seq->Value(itab));
282 Tab->SetValue(itab,item);
283 }
284 }
285
286 if (nbfaces == 1) {
287 res = IFace;
288 }
289 else {
290 IGroup->Init(Tab);
291 res = IGroup;
292 }
293
294 SetShapeResult ( start, res );
295
296 return res;
297}
298
299
300
301