0030675: Visualization - remove redundant proxy classes in hierarchy of PrsMgr_Presen...
[occt.git] / src / TopOpeBRepBuild / TopOpeBRepBuild_makefaces.cxx
CommitLineData
b311480e 1// Created on: 1996-03-07
2// Created by: Jean Yves LEBEY
3// Copyright (c) 1996-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
7fd59977 17
18#include <BRep_Builder.hxx>
7fd59977 19#include <BRep_Tool.hxx>
20#include <BRepTools.hxx>
7fd59977 21#include <Geom2d_Curve.hxx>
42cf5bc1 22#include <Geom_RectangularTrimmedSurface.hxx>
23#include <Geom_Surface.hxx>
24#include <GeomAbs_SurfaceType.hxx>
25#include <GeomAdaptor_Surface.hxx>
26#include <gp_Pnt.hxx>
27#include <Standard_NoSuchObject.hxx>
7fd59977 28#include <Standard_ProgramError.hxx>
42cf5bc1 29#include <TCollection_AsciiString.hxx>
30#include <TopExp.hxx>
31#include <TopoDS.hxx>
32#include <TopoDS_Compound.hxx>
33#include <TopoDS_Edge.hxx>
34#include <TopoDS_Face.hxx>
35#include <TopoDS_Shape.hxx>
36#include <TopoDS_Vertex.hxx>
37#include <TopoDS_Wire.hxx>
38#include <TopOpeBRepBuild_Builder.hxx>
39#include <TopOpeBRepBuild_define.hxx>
40#include <TopOpeBRepBuild_EdgeBuilder.hxx>
41#include <TopOpeBRepBuild_FaceBuilder.hxx>
42#include <TopOpeBRepBuild_GTopo.hxx>
43#include <TopOpeBRepBuild_HBuilder.hxx>
44#include <TopOpeBRepBuild_PaveSet.hxx>
45#include <TopOpeBRepBuild_ShapeSet.hxx>
46#include <TopOpeBRepBuild_ShellFaceSet.hxx>
47#include <TopOpeBRepBuild_SolidBuilder.hxx>
48#include <TopOpeBRepBuild_WireEdgeSet.hxx>
7fd59977 49#include <TopOpeBRepDS.hxx>
42cf5bc1 50#include <TopOpeBRepDS_BuildTool.hxx>
51#include <TopOpeBRepDS_CurveIterator.hxx>
7fd59977 52#include <TopOpeBRepDS_EXPORT.hxx>
42cf5bc1 53#include <TopOpeBRepDS_HDataStructure.hxx>
54#include <TopOpeBRepDS_PointIterator.hxx>
55#include <TopOpeBRepDS_SurfaceIterator.hxx>
7fd59977 56#include <TopOpeBRepTool.hxx>
7fd59977 57#include <TopOpeBRepTool_2d.hxx>
42cf5bc1 58#include <TopOpeBRepTool_EXPORT.hxx>
59#include <TopOpeBRepTool_ShapeExplorer.hxx>
60#include <TopTools_IndexedDataMapOfShapeShape.hxx>
61#include <TopTools_IndexedMapOfOrientedShape.hxx>
7fd59977 62
0797d9d3 63#ifdef OCCT_DEBUG
1d0a9d4d 64extern Standard_Boolean TopOpeBRepBuild_GetcontextNOPURGE();
65extern Standard_Boolean TopOpeBRepBuild_GetcontextNOCORRISO();
66extern Standard_Boolean TopOpeBRepBuild_GettraceCHK();
7fd59977 67#define DEBSHASET(sarg,meth,shaset,str) \
68TCollection_AsciiString sarg((meth));(sarg)=(sarg)+(shaset).DEBNumber()+(str);
69Standard_EXPORT void debgfabu(const Standard_Integer i) {cout<<"++ debgfabu "<<i<<endl;}
70Standard_EXPORT void debwesmf(const Standard_Integer i) {cout<<"++ debwesmf "<<i<<endl;}
71Standard_EXPORT Standard_Boolean DEBpurclo = Standard_False;
72void debpurclo() {}
73void debpurclomess(Standard_Integer i){cout<<"++ debpurclo "<<i<<endl;debpurclo();}
74Standard_EXPORT void debcorriso(const Standard_Integer i) {cout<<"++ debcorriso "<<i<<endl;}
1d0a9d4d 75extern void* GFABUMAKEFACEPWES_DEB;
7fd59977 76#endif
77
78#ifdef DRAW
79#include <DBRep.hxx>
80#include <TopOpeBRepTool_DRAW.hxx>
81#endif
82
83Standard_EXPORT Standard_Boolean FUN_tool_ClosedW(const TopoDS_Wire& W);
84// Unused :
0797d9d3 85/*#ifdef OCCT_DEBUG
7fd59977 86static void FUN_Raise(){cout<<"--------- ERROR in GWESMakeFaces ---------"<<endl;}
87#endif*/
88
89//=======================================================================
90//function : GWESMakeFaces
91//purpose :
92//=======================================================================
93void TopOpeBRepBuild_Builder::GWESMakeFaces
94(const TopoDS_Shape& FF,TopOpeBRepBuild_WireEdgeSet& WES,TopTools_ListOfShape& LOF)
95{
0797d9d3 96#ifdef OCCT_DEBUG
7fd59977 97 Standard_Integer iF; Standard_Boolean tSPS = GtraceSPS(FF,iF);
98 DEBSHASET(s,"#--- GWESMakeFaces ",WES," ");
99 if(tSPS){ GdumpSHA(FF,(Standard_Address)s.ToCString());cout<<endl; WES.DumpSS();}
100 if(tSPS){debwesmf(iF);}
101 GFABUMAKEFACEPWES_DEB = (void*)&WES;
102#endif
103
104 const Standard_Boolean ForceClass = Standard_True;
105 TopOpeBRepBuild_FaceBuilder FABU;
106 FABU.InitFaceBuilder(WES,FF,ForceClass);
107
108 // Wire checking,the aim is to rebuild faces having
109 // edges unconnected to the others (in the face UV representation)
110 // This can occur when the face has a closing edge. To avoid this,
111 // we delete the lonesome closing edge from the wire.
112 Standard_Boolean topurge = Standard_True;
0797d9d3 113#ifdef OCCT_DEBUG
7fd59977 114 if (TopOpeBRepBuild_GetcontextNOPURGE()) topurge = Standard_False;
115#endif
116
117#ifdef DRAW
118 Standard_Boolean traceF = Standard_False;
119 if (traceF) {
120 TopTools_IndexedMapOfShape mapW;
121 for (FABU.InitFace(); FABU.MoreFace(); FABU.NextFace()) {
122 for (FABU.InitWire(); FABU.MoreWire(); FABU.NextWire()) {
123 TopoDS_Shape W;
124 Standard_Boolean isold = FABU.IsOldWire();
125 if (isold) W = FABU.OldWire();
126 else {
127 BRep_Builder BB;
128 TopoDS_Compound cmp; BB.MakeCompound(cmp);
129 FABU.InitEdge();
130 for (; FABU.MoreEdge(); FABU.NextEdge()) FABU.AddEdgeWire(FABU.Edge(),cmp);
131 W = cmp;
132 }
133 if (W.IsNull()) continue;
134 Standard_Integer iiwi = mapW.Add(W); TCollection_AsciiString aa("wii_");FUN_tool_draw(aa,W,iiwi);
135 }
136 }
137 }
138#endif
139
140 if (topurge) {
141 TopOpeBRepDS_DataStructure& BDS = myDataStructure->ChangeDS();
142
143 TopTools_IndexedMapOfShape mapPIE; // pseudo internal edges
144 FABU.DetectPseudoInternalEdge(mapPIE);
145
146 TopTools_IndexedDataMapOfShapeShape mapVVsameG,mapVon1Edge,mapVVref;
147 FABU.DetectUnclosedWire(mapVVsameG,mapVon1Edge);
148
149 Standard_Integer nVV = mapVVsameG.Extent();
150 if (nVV > 0) {
151 // Updating the DS with same domain vertices,
152 // filling up map <mapVVref>
153 for (Standard_Integer i = 1; i <= nVV; i++) {
154 const TopoDS_Shape& V = mapVVsameG.FindKey(i);
155 Standard_Boolean hsdm = myDataStructure->HasSameDomain(V);
156 if (!hsdm) {
157 Standard_Integer rankV = BDS.AncestorRank(V);
158
159 const TopoDS_Shape& VsameG = mapVVsameG.FindFromIndex(i);
160
161 // MSV Oct 4, 2001: prefer old vertex as SameDomainReference
162 Standard_Integer rankVsameG = BDS.AncestorRank(VsameG);
163 Standard_Boolean otherRef = (rankVsameG != 0 && rankV != 1);
164
165 if (otherRef)
166 BDS.FillShapesSameDomain(VsameG,V);
167 else
168 BDS.FillShapesSameDomain(V,VsameG);
169
170 hsdm = myDataStructure->HasSameDomain(V);
171 }
172 if (hsdm) {
173 Standard_Integer Iref = myDataStructure->SameDomainReference(V);
174 const TopoDS_Shape& Vref = myDataStructure->Shape(Iref);
175 mapVVref.Add(V,Vref);
176 }
177 }
178 FABU.CorrectGclosedWire(mapVVref,mapVon1Edge);
179 FABU.DetectUnclosedWire(mapVVsameG,mapVon1Edge);
180 }
181 }
182
183 TopTools_DataMapOfShapeInteger MWisOld;
184 TopTools_IndexedMapOfOrientedShape MshNOK;
185 GFABUMakeFaces(FF,FABU,LOF,MWisOld);
186
187 // 2. on periodic face F :
188 // finds up faulty shapes MshNOK to avoid when building up shapes
189 // (edge no longer closing that appears twice in the new face)
190
191 if (topurge) {
192
193#ifdef DRAW
194 if (tSPS) {
195 cout<<endl<<"#<< AVANT PurgeClosingEdges "<<endl;
196 GdumpFABU(FABU);
197 TopTools_ListOfShape dLOF;TopTools_DataMapOfShapeInteger dMWisOld;
198 GFABUMakeFaces(FF,FABU,dLOF,dMWisOld);
199 TopTools_ListIteratorOfListOfShape X(dLOF); for (Standard_Integer i=1;X.More();X.Next(),i++) {
200 TCollection_AsciiString ss("purclo");ss=ss+i;DBRep::Set(ss.ToCString(),X.Value());
201 cout<<"... face "<<ss<<endl;
202 }
203 debpurclomess(iF);
204 DEBpurclo = Standard_True;
205 }
206#endif
207
208 const TopoDS_Face& FA = TopoDS::Face(FF);
209 Standard_Boolean puok = TopOpeBRepTool::PurgeClosingEdges(FA,LOF,MWisOld,MshNOK);
9775fa61 210 if (!puok) throw Standard_Failure("TopOpeBRepBuild::GWESMakeFaces");
7fd59977 211 topurge = !MshNOK.IsEmpty();
212
0797d9d3 213#ifdef OCCT_DEBUG
7fd59977 214 if (tSPS) DEBpurclo = Standard_False;
215#endif
216 } // topurge
217
218 if (topurge) {
219 TopTools_ListOfShape LOFF;
220 Standard_Boolean puok = TopOpeBRepTool::MakeFaces(TopoDS::Face(FF),LOF,MshNOK,LOFF);
9775fa61 221 if (!puok) throw Standard_Failure("TopOpeBRepBuild::GWESMakeFaces");
7fd59977 222 LOF.Clear(); LOF.Assign(LOFF);
223 }
224
225 //1. on periodic face F :
226 // translates edge's pcurve to have it in F's UVbounds
227 // translates edge's pcurve to have it connexed to others in UV space
228 Standard_Boolean corronISO = Standard_True;
0797d9d3 229#ifdef OCCT_DEBUG
7fd59977 230 if (TopOpeBRepBuild_GetcontextNOCORRISO()) corronISO = Standard_False;
231 if (tSPS) debcorriso(iF);
232#endif
233 Standard_Boolean ffcloseds = FUN_tool_closedS(FF);
234 corronISO = corronISO && ffcloseds;
235 if (corronISO) {
236 TopTools_ListIteratorOfListOfShape itFF(LOF);
237 TopTools_ListOfShape newLOF;
238 const TopoDS_Face& FFa = TopoDS::Face(FF);
239 for (; itFF.More(); itFF.Next()){
240 TopoDS_Face Fa = TopoDS::Face(itFF.Value());
241 TopOpeBRepTool::CorrectONUVISO(FFa,Fa);
242 newLOF.Append(Fa);
243 }
244 LOF.Clear(); LOF.Assign(newLOF);
245 }
246
247 // xpu280898 : regularisation after GFABUMakeFaces,purge processings
248 TopTools_ListOfShape newLOF; RegularizeFaces(FF,LOF,newLOF);
249 LOF.Clear(); LOF.Assign(newLOF);
250
251} // GWESMakeFaces
252
253//------------------------------------------------------
254// retourne vrai si newFace contient une seule arete non orientee
255//------------------------------------------------------
256static Standard_Boolean FUN_purgeFon1nonoriE(const TopoDS_Shape& newFace)
257{
258 TopExp_Explorer ex(newFace,TopAbs_EDGE);
259 Standard_Integer nE = 0;
260 for (; ex.More(); ex.Next()) nE++;
261 if (nE == 1) {
262 ex.Init(newFace,TopAbs_EDGE);
263 const TopoDS_Shape& ed = ex.Current();
264 TopAbs_Orientation ori = ed.Orientation();
265 Standard_Boolean hasori = (ori == TopAbs_FORWARD) || (ori == TopAbs_REVERSED);
266 if (!hasori) return Standard_True;
267 //// modified by jgv, 6.06.02 for OCC424 ////
268 TopoDS_Edge theEdge = TopoDS::Edge( ed );
269 if (BRep_Tool::Degenerated( theEdge ))
270 return Standard_True;
271 /////////////////////////////////////////////
272 }
273 return Standard_False;
274}
275
276//-- ofv --------------------------------------------------------------------
277// function : FUN_ReOrientIntExtEdge
278// purpose : change orientation of INTERNAL (EXTERNAL) edge, if necessary
279// FRE - tool (edge with FORWARD or REVERSED orientation),
280// OFRE - orientation of tool (FORWARD or REVERSED),
281// INE - object (edge with INTERNAL (EXTERNAL) orientation)
282//---------------------------------------------------------------------------
283static TopAbs_Orientation FUN_ReOrientIntExtEdge(const TopoDS_Edge& FRE,
284 TopAbs_Orientation OFRE,
285 const TopoDS_Edge& INE)
286{
287 TopAbs_Orientation result = INE.Orientation();
288 TopoDS_Vertex Vf1,Vl1,Vf2,Vl2;
289
290 TopExp::Vertices(FRE, Vf1, Vl1, Standard_False);
291 TopExp::Vertices(INE, Vf2, Vl2, Standard_False);
292
293 if(OFRE == TopAbs_FORWARD)
294 {
295 if(Vl1.IsSame(Vf2)) result = TopAbs_FORWARD;
296 if(Vl1.IsSame(Vl2)) result = TopAbs_REVERSED;
297 if(Vf1.IsSame(Vf2)) result = TopAbs_REVERSED;
298 if(Vf1.IsSame(Vl2)) result = TopAbs_FORWARD;
299 }
300 if(OFRE == TopAbs_REVERSED)
301 {
302 if(Vl1.IsSame(Vf2)) result = TopAbs_REVERSED;
303 if(Vl1.IsSame(Vl2)) result = TopAbs_FORWARD;
304 if(Vf1.IsSame(Vf2)) result = TopAbs_FORWARD;
305 if(Vf1.IsSame(Vl2)) result = TopAbs_REVERSED;
306 }
307 return result;
308}
309//----------------------------------------------------------------------------
310
311//-- ofv --------------------------------------------------------------------
312// function : FUN_CheckORI
313// purpose :
314//----------------------------------------------------------------------------
315static Standard_Integer FUN_CheckORI(TopAbs_Orientation O1,
316 TopAbs_Orientation O2)
317{
318 Standard_Integer result;
319 if((O1 == TopAbs_INTERNAL || O1 == TopAbs_EXTERNAL) && (O2 == TopAbs_INTERNAL || O2 == TopAbs_EXTERNAL)) result = 0;
320 else if((O1 == TopAbs_INTERNAL || O1 == TopAbs_EXTERNAL) && (O2 == TopAbs_FORWARD || O2 == TopAbs_REVERSED)) result = 1;
321 else if((O1 == TopAbs_FORWARD || O1 == TopAbs_REVERSED) && (O2 == TopAbs_INTERNAL || O2 == TopAbs_EXTERNAL)) result = 2;
322 else result = 4;
323 return result;
324}
325//----------------------------------------------------------------------------
326//=======================================================================
327//function : GFABUMakeFaces
328//purpose :
329//=======================================================================
330
331void TopOpeBRepBuild_Builder::GFABUMakeFaces(const TopoDS_Shape& FF,TopOpeBRepBuild_FaceBuilder& FABU,
332 TopTools_ListOfShape& LOF,TopTools_DataMapOfShapeInteger& MWisOld)
333{
0797d9d3 334#ifdef OCCT_DEBUG
7fd59977 335 Standard_Integer iF;Standard_Boolean tSPS=GtraceSPS(FF,iF);
336 if(tSPS) {
337 cout<<endl;GdumpSHA(FF,(char *) "#--- GFABUMakeFaces ");cout<<endl;
338 GdumpFABU(FABU);debgfabu(iF);
339 }
7fd59977 340#endif
341
342 TopTools_ListOfShape lnewFace;
343 TopoDS_Face newFace;
344 TopoDS_Wire newWire;
345
346 TopLoc_Location Loc;
347 Handle(Geom_Surface) Surf = BRep_Tool::Surface(TopoDS::Face(FF),Loc);
348// JYL : mise en // des 5 lignes suivantes pour reprendre la correction de DPF
349// du 29/07/1998
350// GeomAdaptor_Surface GAS1(Surf);
351// GeomAbs_SurfaceType tt1 = GAS1.GetType();
352// Handle(Standard_Type) T = Surf->DynamicType();
353// Standard_Boolean istrim = ( T == STANDARD_TYPE(Geom_RectangularTrimmedSurface) );
354// if ( istrim && tt1 == GeomAbs_Plane) Surf = Handle(Geom_RectangularTrimmedSurface)::DownCast(Surf)->BasisSurface();
355 Standard_Real tolFF = BRep_Tool::Tolerance(TopoDS::Face(FF));
356 BRep_Builder BB;
357
358
359 //--ofv:
360 // Unfortunately, the function GFillONPartsWES2() from file TopOpeBRepBuild_BuilderON.cxx sets orientation of
361 // some section edges as INTERNAL or EXTERNAL, but they should be FORWARD or REVERSED. It probably makes faces
362 // without closed boundary, for example. So, we must check carefuly edges with orientation INTERNAL(EXTERNAL).
363 // Bugs: 60936, 60937, 60938 (cut, fuse, common shapes)
364 TopoDS_Compound CmpOfEdges;
365 BRep_Builder BldCmpOfEdges;
366 TopTools_IndexedDataMapOfShapeListOfShape mapVOE;
367 TopoDS_Face tdF = TopoDS::Face(FF);
368 //--ofv.
369
370 FABU.InitFace();
371 for (; FABU.MoreFace(); FABU.NextFace())
372 {
373 Standard_Integer nbnewWwithe = 0;
374 Standard_Integer nboldW = 0;
375
376 BB.MakeFace(newFace,Surf,Loc,tolFF);
377// myBuildTool.CopyFace(FF,newFace);
378
379 Standard_Integer nbw = FABU.InitWire();
380 for (; FABU.MoreWire(); FABU.NextWire())
381 {
382 Standard_Integer ne = 0;
383 Standard_Integer neFORWARD = 0;
384 Standard_Integer neREVERSED = 0;
385 Standard_Integer neINTERNAL = 0;
386 Standard_Integer neEXTERNAL = 0;
387
388 Standard_Boolean isold = FABU.IsOldWire();
389 if(isold)
390 {
391 nboldW++;
392 newWire = TopoDS::Wire(FABU.OldWire());
393 }
394 else
395 {
396 BldCmpOfEdges.MakeCompound(CmpOfEdges);//new compound
397 myBuildTool.MakeWire(newWire);
398 FABU.InitEdge();
399 for(; FABU.MoreEdge(); FABU.NextEdge())
400 {
401 TopoDS_Edge newEdge = TopoDS::Edge(FABU.Edge());
402// if (mEtouched.Contains(newEdge)) continue;// xpu290498
403// mEtouched.Add(newEdge);// xpu290498
404
405 //--ofv:
406 Standard_Integer nadde = FABU.AddEdgeWire(newEdge,CmpOfEdges);
407 ne += nadde;
408 //Standard_Integer nadde = FABU.AddEdgeWire(newEdge,newWire);
409 //ne += nadde;
410 //--ofv.
411
412 TopAbs_Orientation oE = newEdge.Orientation();
413 if (oE == TopAbs_INTERNAL) neINTERNAL++;
414 else if (oE == TopAbs_EXTERNAL) neEXTERNAL++;
415 else if (oE == TopAbs_FORWARD) neFORWARD++;
416 else if (oE == TopAbs_REVERSED) neREVERSED++;
417
418 Standard_Boolean hasPC = FC2D_HasCurveOnSurface(newEdge,newFace); // jyl980402+
419 if (!hasPC) // jyl980402+
420 { // jyl980402+
421 Standard_Real tolE = BRep_Tool::Tolerance(newEdge); // jyl980402+
422 Standard_Real f2,l2,tolpc; Handle(Geom2d_Curve) C2D; // jyl980402+
423 //C2D = FC2D_CurveOnSurface(newEdge,newFace,f2,l2,tolpc); // jyl980402+
424 C2D = FC2D_CurveOnSurface(newEdge,newFace,f2,l2,tolpc, Standard_True); // xpu051198 (CTS21701)
9775fa61 425 if(C2D.IsNull()) throw Standard_ProgramError("TopOpeBRepBuild_Builder::GFABUMakeFaces null PC"); // jyl980402+
7fd59977 426 Standard_Real tol = Max(tolE,tolpc); // jyl980402+
427 BRep_Builder BB_PC; BB_PC.UpdateEdge(newEdge,C2D,newFace,tol); // jyl980402+
428 } // jyl980402+
429 } // FABU.MoreEdge()
430
431 //--ofv:
432 if((neINTERNAL == 0 && neEXTERNAL == 0) || (ne == neINTERNAL || ne == neEXTERNAL))
433 {
434 TopExp_Explorer EdgeEx;
435 if(nbw == 1 && ne == 2)
436 {
437 EdgeEx.Init(CmpOfEdges,TopAbs_EDGE);
438 TopoDS_Edge nEdge1 = TopoDS::Edge(EdgeEx.Current());
439 EdgeEx.Next();
440 TopoDS_Edge nEdge2 = TopoDS::Edge(EdgeEx.Current());
441 if( nEdge1.IsSame(nEdge2) )
442 return;
443 }
444 for(EdgeEx.Init(CmpOfEdges,TopAbs_EDGE); EdgeEx.More(); EdgeEx.Next())
445 {
446 TopoDS_Edge newEdge = TopoDS::Edge(EdgeEx.Current());
447 FABU.AddEdgeWire(newEdge,newWire);
448 }
449 }
450 else
451 {
452 //TopTools_IndexedDataMapOfShapeListOfShape mapVOE;
453 mapVOE.Clear();
454 TopExp::MapShapesAndAncestors(CmpOfEdges,TopAbs_VERTEX,TopAbs_EDGE,mapVOE);
455 // checking: wire is closed and regular. If wire is not close or not regular: vertex has only the one edge
456 // or vetrex has more then two shared edges, we don't modify it.
457 Standard_Boolean WisClsd = Standard_True;
458 for(Standard_Integer MapStep = 1; MapStep <= mapVOE.Extent(); MapStep++)
459 {
460 const TopTools_ListOfShape& LofE = mapVOE.FindFromIndex(MapStep);
461 if(LofE.Extent() != 2) { WisClsd = Standard_False; break; }
462 }
463 if(!WisClsd)
464 {
465 //wire is not regular:
466 TopExp_Explorer EdgeEx;
467 for(EdgeEx.Init(CmpOfEdges,TopAbs_EDGE); EdgeEx.More(); EdgeEx.Next())
468 {
469 TopoDS_Edge newEdge = TopoDS::Edge(EdgeEx.Current());
470 FABU.AddEdgeWire(newEdge,newWire);
471 }
472 }
473 else
474 {
475 //wire seems to be regular:
476 TopTools_ListOfShape LofAddE; // list of edges has already been added in wire
477 Standard_Integer naddsame = 0;
478 while( ne > (LofAddE.Extent() + naddsame) )
479 {
480 for(Standard_Integer StepMap = 1; StepMap <= mapVOE.Extent(); StepMap++)
481 {
482 const TopTools_ListOfShape& LofE = mapVOE.FindFromIndex(StepMap);
483 TopTools_ListIteratorOfListOfShape itLofE(LofE);
484 TopoDS_Edge E1 = TopoDS::Edge(itLofE.Value());
485 itLofE.Next();
486 TopoDS_Edge E2 = TopoDS::Edge(itLofE.Value());
487 TopAbs_Orientation O1 = E1.Orientation();
488 TopAbs_Orientation O2 = E2.Orientation();
489 Standard_Boolean IsSameE1 = BRep_Tool::IsClosed(E1,tdF);
490 Standard_Boolean IsSameE2 = BRep_Tool::IsClosed(E2,tdF);
491 Standard_Boolean AddE1 = Standard_True;
492 Standard_Boolean AddE2 = Standard_True;
493
494 //checking current edges in the list of added edges
495 TopTools_ListIteratorOfListOfShape itLofAddE(LofAddE);
496 for(; itLofAddE.More(); itLofAddE.Next() )
497 {
498 const TopoDS_Shape& LE = itLofAddE.Value();
499 TopAbs_Orientation OLE = LE.Orientation();
500 if(E1.IsSame(LE) && !IsSameE1) { AddE1 = Standard_False; E1.Orientation(OLE); O1 = OLE; }
501 if(E2.IsSame(LE) && !IsSameE2) { AddE2 = Standard_False; E2.Orientation(OLE); O2 = OLE; }
502 }
503 Standard_Integer chkORI = FUN_CheckORI(O1,O2);
504 if(chkORI == 0){ AddE1 = Standard_False; AddE2 = Standard_False; }
505 if(chkORI == 1)
506 {
507 TopAbs_Orientation ori = FUN_ReOrientIntExtEdge(E2,O2,E1);
508 if(ori == TopAbs_FORWARD) { E1.Orientation(TopAbs_FORWARD); neFORWARD++; }
509 if(ori == TopAbs_REVERSED){ E1.Orientation(TopAbs_REVERSED); neREVERSED++; }
510 if(ori == TopAbs_REVERSED || ori == TopAbs_FORWARD)
511 {
512 if(O1 == TopAbs_INTERNAL) neINTERNAL--;
513 else neEXTERNAL--;
514 }
515 }
516 if(chkORI == 2)
517 {
518 TopAbs_Orientation ori = FUN_ReOrientIntExtEdge(E1,O1,E2);
519 if(ori == TopAbs_FORWARD) { E2.Orientation(TopAbs_FORWARD); neFORWARD++; }
520 if(ori == TopAbs_REVERSED){ E2.Orientation(TopAbs_REVERSED); neREVERSED++; }
521 if(ori == TopAbs_REVERSED || ori == TopAbs_FORWARD)
522 {
523 if(O2 == TopAbs_INTERNAL) neINTERNAL--;
524 else neEXTERNAL--;
525 }
526 }
527
528
529
530 if(AddE1)
531 {
532 FABU.AddEdgeWire(E1,newWire);
533 if(!IsSameE1) LofAddE.Append(E1);
534 else naddsame++;
535 }
536 if(AddE2)
537 {
538 FABU.AddEdgeWire(E2,newWire);
539 if(!IsSameE2) LofAddE.Append(E2);
540 else naddsame++;
541 }
542 }//for StepMap
543 } // while ne >
544 } // not regular
545 } // neINTERNAL(neEXTERNAL) != 0
546 } // !isold
547 //--ofv.
548
0797d9d3 549#ifdef OCCT_DEBUG
7fd59977 550 if ( tSPS ) cout<<"#--- GFABUMakeFaces "<<iF<<" : "<<ne<<" edges"<<endl;
551#endif
552
553 // xpu : 13-11-97
554 if (ne != 0) {
555 Standard_Integer iow = isold? 1: 0;
556 MWisOld.Bind(newWire,iow);
557 }
558
559 // <newWire> is empty :
560 if ( !isold ) {
561 if (ne == 0) continue;
562 else if (nbw == 1 && (ne == neINTERNAL+neEXTERNAL)) continue;
563 else nbnewWwithe++;
564 }
565
566 // caractere Closed() du nouveau wire newWire
567 if ( !isold ) {
568 Standard_Boolean closed = FUN_tool_ClosedW(newWire);
569 myBuildTool.Closed(newWire,closed);
570 } // !isold
571
572 myBuildTool.AddFaceWire(newFace,newWire);
573
574 } // FABU.MoreWire()
575
576 if ( nbnewWwithe == 0 && nboldW == 0 ) {
577 continue;
578 }
579
580 Standard_Boolean topurge = FUN_purgeFon1nonoriE(newFace);
581 if (topurge) {
7fd59977 582 continue;
583 }
584
585// Le changement de surface de trim a basis causait la perte des regularites de l'edge
586// j'ai change par un recadrage du trim en attendant mieux. DPF le 29/07/1998.
587// Le danger est de modifier une donnee d'entree.
588 Handle(Standard_Type) T = Surf->DynamicType();
589 Standard_Boolean istrim = ( T == STANDARD_TYPE(Geom_RectangularTrimmedSurface) );
590 if (istrim) {
591 Handle(Geom_RectangularTrimmedSurface)
c5f3a425 592 hrts=Handle(Geom_RectangularTrimmedSurface)::DownCast (Surf);
7fd59977 593 Standard_Real oumin,oumax,ovmin,ovmax;
594 hrts->Bounds(oumin,oumax,ovmin,ovmax);
595 Standard_Real umin,umax,vmin,vmax;
596 BRepTools::UVBounds(newFace, umin, umax, vmin, vmax);
597 if (umin < oumin) oumin=umin;
598 if (umax > oumax) oumax=umax;
599 if (vmin < ovmin) ovmin=vmin;
600 if (vmax > ovmax) ovmax=vmax;
601 hrts->SetTrim(oumin, oumax, ovmin, ovmax, Standard_True, Standard_True);
602 }
603 lnewFace.Append(newFace);
604
605 } // FABU.MoreFace()
606
0797d9d3 607#ifdef OCCT_DEBUG
7fd59977 608 if(tSPS) {
609 cout<<endl;GdumpSHA(FF, (char *) "#--- GFABUMakeFaces avant regularize");cout<<endl;
610 GdumpFABU(FABU);debgfabu(iF);
611 }
612#endif
613
614 // xpu281098 : regularisation after purge processings (cto009L2,f4ou)
615// RegularizeFaces(FF,lnewFace,LOF);
616// Standard_Integer nLOF = LOF.Extent(); // DEB
617 LOF.Append(lnewFace);
618
619} // GFABUMakeFaces