1 // Created on: 1998-12-16
2 // Created by: Roman LYGIN
3 // Copyright (c) 1998-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <IGESToBRep_IGESBoundary.ixx>
18 #include <TColStd_HSequenceOfTransient.hxx>
19 #include <Geom2d_Curve.hxx>
20 #include <Geom_Curve.hxx>
21 #include <Geom_Plane.hxx>
22 #include <GeomAdaptor_Curve.hxx>
23 #include <Precision.hxx>
24 #include <TopoDS_Edge.hxx>
25 #include <TopoDS_Wire.hxx>
26 #include <BRep_Builder.hxx>
27 #include <BRep_Tool.hxx>
28 #include <ShapeBuild_Edge.hxx>
29 #include <IGESToBRep.hxx>
30 #include <IGESToBRep_TopoCurve.hxx>
31 #include <ShapeFix_Wire.hxx>
32 #include <IGESData_IGESEntity.hxx>
34 //=======================================================================
35 //function : IGESToBRep_IGESBoundary
37 //=======================================================================
39 IGESToBRep_IGESBoundary::IGESToBRep_IGESBoundary()
43 //=======================================================================
44 //function : IGESToBRep_IGESBoundary
46 //=======================================================================
48 IGESToBRep_IGESBoundary::IGESToBRep_IGESBoundary(const IGESToBRep_CurveAndSurface& CS)
53 //=======================================================================
56 //=======================================================================
58 void IGESToBRep_IGESBoundary::Init(const IGESToBRep_CurveAndSurface& CS,
59 const Handle(IGESData_IGESEntity)& entity,
60 const TopoDS_Face& face,
61 const gp_Trsf2d& trans,
62 const Standard_Real uFact,
63 const Standard_Integer filepreference)
70 myfilepreference = filepreference;
73 //=======================================================================
76 //=======================================================================
78 Standard_Boolean IGESToBRep_IGESBoundary::Transfer(Standard_Boolean& okCurve,
79 Standard_Boolean& okCurve3d,
80 Standard_Boolean& okCurve2d,
81 const Handle(IGESData_IGESEntity)& curve3d,
82 const Standard_Boolean toreverse3d,
83 const Handle(IGESData_HArray1OfIGESEntity)& curves2d,
84 const Standard_Integer number)
86 Handle(ShapeExtend_WireData) scurve3d, lsewd; //temporary objects
87 return Transfer (okCurve, okCurve3d, okCurve2d,
88 curve3d, scurve3d, Standard_False, toreverse3d,
89 curves2d, Standard_False,
93 //=======================================================================
96 //=======================================================================
98 Standard_Boolean IGESToBRep_IGESBoundary::Transfer(Standard_Boolean& okCurve,
99 Standard_Boolean& okCurve3d,
100 Standard_Boolean& okCurve2d,
101 const Handle(ShapeExtend_WireData)& curve3d,
102 const Handle(IGESData_HArray1OfIGESEntity)& curves2d,
103 const Standard_Boolean toreverse2d,
104 const Standard_Integer number,
105 Handle(ShapeExtend_WireData)& lsewd)
107 Handle(IGESData_IGESEntity) icurve3d; //temporary object
108 return Transfer (okCurve, okCurve3d, okCurve2d,
109 icurve3d, curve3d, Standard_True, Standard_False,
110 curves2d, toreverse2d,
114 //=======================================================================
117 //=======================================================================
119 void IGESToBRep_IGESBoundary::Check(const Standard_Boolean,const Standard_Boolean,const Standard_Boolean,const Standard_Boolean)
121 // Implemented in Advanced Data Exchange
124 //=======================================================================
125 //function : Transfer
127 //=======================================================================
129 Standard_Boolean IGESToBRep_IGESBoundary::Transfer(Standard_Boolean&,
132 const Handle(IGESData_IGESEntity)& icurve3d,
133 const Handle(ShapeExtend_WireData)& scurve3d,
134 const Standard_Boolean usescurve,
135 const Standard_Boolean toreverse3d,
136 const Handle(IGESData_HArray1OfIGESEntity)& curves2d,
137 const Standard_Boolean toreverse2d,
138 const Standard_Integer number,
139 Handle(ShapeExtend_WireData)& Gsewd)
141 Gsewd = new ShapeExtend_WireData;//local translation (for mysewd)
142 Handle(ShapeExtend_WireData) Gsewd3d = new ShapeExtend_WireData;//local translation (for mysewd3d)
143 Handle(ShapeExtend_WireData) Gsewd2d = new ShapeExtend_WireData;//local translation (for mysewd2d)
145 Standard_Boolean GTranslate3d = Standard_True, GTranslate2d = Standard_True,
146 Preferred3d = Standard_True, Preferred2d = Standard_True;
148 Standard_Integer len3d = 0, len2d = 0;
149 Handle(TColStd_HSequenceOfTransient) seq3d, seq2d;
151 len3d = scurve3d->NbEdges();
153 IGESToBRep::IGESCurveToSequenceOfIGESCurve (icurve3d, seq3d);
154 len3d = seq3d->Length();
156 if (!curves2d.IsNull()) {
157 for (Standard_Integer i = 1; i <= curves2d->Length(); i++)
158 IGESToBRep::IGESCurveToSequenceOfIGESCurve (curves2d->Value (i), seq2d);
159 len2d = seq2d->Length();
163 GTranslate3d = Standard_False;
165 GTranslate2d = Standard_False;
167 if (GTranslate3d && GTranslate2d) {
168 //Setting preference in the case of inconsitency between 3D and 2D
169 if (myfilepreference == 2) Preferred3d = Standard_False;
170 else if (myfilepreference == 3) Preferred2d = Standard_False;
171 else Preferred3d = Standard_False;
173 if (GTranslate3d && GTranslate2d && len3d != len2d) {
174 GTranslate3d = Preferred3d;
175 GTranslate2d = Preferred2d;
178 IGESToBRep_TopoCurve TC (myCS);
180 if (GTranslate3d && !GTranslate2d) {
182 Gsewd->Add (scurve3d->Wire());
184 TopoDS_Shape Sh = TC.TransferTopoCurve (icurve3d);
188 ReverseCurves3d (Gsewd3d);
189 Gsewd->Add (Gsewd3d->Wire());
191 else Gsewd->Add (Sh);//Gsewd = Gsewd3d is impossible to avoid sharing of sewd (UK1.igs entity 7)
195 else if (!GTranslate3d && GTranslate2d) {
196 for (Standard_Integer i = curves2d->Lower(); i <= curves2d->Upper(); i++) {
197 TopoDS_Shape Sh = TC.Transfer2dTopoCurve (Handle(IGESData_IGESEntity)::DownCast (curves2d->Value (i)),
198 myface, mytrsf, myuFact);
199 if (!Sh.IsNull()) Gsewd2d->Add (Sh);
202 ReverseCurves2d (Gsewd2d, myface);
203 Gsewd->Add (Gsewd2d->Wire());
205 else if (GTranslate3d && GTranslate2d) {
206 //Translate both curves 3D and 2D
207 //Suppose that i-th segment in 2D curve corresponds to i-th segment in 3D curve
208 for (Standard_Integer i = 1; i <= len3d; i++) {
209 Standard_Boolean LTranslate3d = Standard_True, LTranslate2d = Standard_True;
211 Handle(ShapeExtend_WireData) Lsewd3d = new ShapeExtend_WireData;
212 TC.SetBadCase (Standard_False); //:27
214 Lsewd3d->Add (scurve3d->Edge (i));
216 TopoDS_Shape shape3d = TC.TransferTopoCurve (Handle(IGESData_IGESEntity)::DownCast (seq3d->Value (i)));
217 if (!shape3d.IsNull()) {
218 Lsewd3d->Add (shape3d);
220 ReverseCurves3d (Lsewd3d);
222 else LTranslate3d = Standard_False;
224 Gsewd3d->Add (Lsewd3d->Wire());
226 Handle(ShapeExtend_WireData) Lsewd2d = new ShapeExtend_WireData;
227 TopoDS_Shape shape2d = TC.Transfer2dTopoCurve (Handle(IGESData_IGESEntity)::DownCast (seq2d->Value (i)),
228 myface, mytrsf, myuFact);
229 if (!shape2d.IsNull()) {
230 Lsewd2d->Add (shape2d);
232 ReverseCurves2d (Lsewd2d, myface);
233 Gsewd2d->Add (Lsewd2d->Wire());
235 else LTranslate2d = Standard_False;
237 if (LTranslate3d && LTranslate2d && Lsewd3d->NbEdges() != Lsewd2d->NbEdges()) {
238 LTranslate3d = Preferred3d;
239 LTranslate2d = Preferred2d;
241 Handle(ShapeExtend_WireData) Lsewd;//Lsewd3d or Lsewd2d or Lsewd3d+pcurve
242 if ( LTranslate3d && !LTranslate2d) Lsewd = Lsewd3d;
243 else if (!LTranslate3d && LTranslate2d) Lsewd = Lsewd2d;
246 //copying pcurve to edge with 3D curve
247 for (Standard_Integer iedge = 1; iedge <= Lsewd3d->NbEdges(); iedge++) {
248 TopoDS_Edge edge3d = Lsewd3d->Edge (iedge), edge2d = Lsewd2d->Edge (iedge);
249 if (!IGESToBRep::TransferPCurve (edge2d, edge3d, myface)) continue;
252 Gsewd->Add (Lsewd->Wire());
257 mysewd ->Add (Gsewd ->Wire());
258 mysewd3d->Add (Gsewd3d->Wire());
259 mysewd2d->Add (Gsewd2d->Wire());
266 return Standard_True;
269 //=======================================================================
270 //function : ReverseCurves3d
271 //purpose : Reverses 3D curves of the edges in the wire and reverses
272 // the order of edges in the wire.
273 // Orientation of each edge is not changed
274 //=======================================================================
276 void IGESToBRep_IGESBoundary::ReverseCurves3d (const Handle(ShapeExtend_WireData)& sewd)
282 for (Standard_Integer i = 1; i <= sewd->NbEdges(); i++) {
283 TopoDS_Edge oldedge = sewd->Edge (i), newedge;
285 Standard_Real p1, p2;
286 Handle(Geom_Curve) curve = BRep_Tool::Curve (oldedge, L, p1, p2);
287 if (curve->IsPeriodic()) //#21
288 ShapeBuild_Edge().MakeEdge (newedge, curve->Reversed(), L,
289 curve->ReversedParameter (p2),
290 curve->ReversedParameter (p1));
291 else ShapeBuild_Edge().MakeEdge (newedge, curve->Reversed(), L,
292 Max (curve->ReversedParameter(curve->LastParameter()), curve->ReversedParameter (p2)),
293 Min (curve->ReversedParameter(curve->FirstParameter()), curve->ReversedParameter (p1)));
294 newedge.Orientation(TopAbs::Reverse (oldedge.Orientation()));
295 //sewd->Set (newedge, i);
298 Handle(ShapeFix_Wire) sfw = new ShapeFix_Wire();
301 sewd->Init(sfw->Wire());
304 //=======================================================================
305 //function : ReverseCurves2d
306 //purpose : Reverses pcurves of the edges in the wire and reverses
307 // the order of edges in the wire.
308 // Orientation of each edge is also changed
309 //=======================================================================
311 void IGESToBRep_IGESBoundary::ReverseCurves2d (const Handle(ShapeExtend_WireData)& sewd, const TopoDS_Face& face)
314 for (Standard_Integer i = 1; i <= sewd->NbEdges(); i++) {
315 TopoDS_Edge oldedge = sewd->Edge (i), newedge;
316 Standard_Real p1, p2;
317 Handle(Geom2d_Curve) curve = BRep_Tool::CurveOnSurface (oldedge, face, p1, p2);
319 // skl 24.04.2002 for OCC314
320 if(curve->IsPeriodic())
321 ShapeBuild_Edge().MakeEdge (newedge, curve->Reversed(), face,
322 curve->ReversedParameter (p2),
323 curve->ReversedParameter (p1));
325 ShapeBuild_Edge().MakeEdge (newedge, curve->Reversed(), face,
326 Max (curve->FirstParameter(), curve->ReversedParameter (p2)),//BUC50001 entity 936 2DForced
327 Min (curve->LastParameter(), curve->ReversedParameter (p1)));
328 newedge.Orientation(oldedge.Orientation());
329 sewd->Set (newedge, i);