0030058: Visualization, Select3D_SensitivePrimitiveArray - the selection is not fast...
[occt.git] / src / BRepTools / BRepTools_Modifier.cxx
CommitLineData
b311480e 1// Created on: 1994-08-25
2// Created by: Jacques GOUSSARD
3// Copyright (c) 1994-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
0d969553 17// IFV 04.06.99 - PRO18974 - processing of INTERNAL shapes.
7fd59977 18
42cf5bc1 19#include <BRepTools_Modification.hxx>
20#include <BRepTools_Modifier.hxx>
21#include <Message_ProgressIndicator.hxx>
22#include <Standard_NoSuchObject.hxx>
23#include <Standard_NullObject.hxx>
24#include <TColStd_ListIteratorOfListOfTransient.hxx>
25#include <TColStd_ListOfTransient.hxx>
26#include <TopExp_Explorer.hxx>
7fd59977 27#include <TopoDS_Edge.hxx>
28#include <TopoDS_Face.hxx>
42cf5bc1 29#include <TopoDS_Iterator.hxx>
7fd59977 30#include <TopoDS_Shape.hxx>
42cf5bc1 31#include <TopoDS_Vertex.hxx>
7fd59977 32#include <TopTools_DataMapIteratorOfDataMapOfShapeShape.hxx>
33#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
7fd59977 34#include <TopTools_ListIteratorOfListOfShape.hxx>
42cf5bc1 35#include <TopTools_ListOfShape.hxx>
7fd59977 36
37#if 0
38#include <Poly_Triangulation.hxx>
39#include <Poly_Polygon3D.hxx>
40#include <BRepMesh_IncrementalMesh.hxx>
41#endif
42
43#include <Geom2d_Line.hxx>
44#include <BRep_Builder.hxx>
45#include <BRep_Tool.hxx>
46#include <TopoDS.hxx>
47#include <BRepTools.hxx>
48#include <TopAbs.hxx>
49#include <TopExp.hxx>
50#include <gp_Pnt.hxx>
51
52#include <gp.hxx>
53
54#include <Standard_NullObject.hxx>
55#include <gp_Trsf.hxx>
56#include <BRepTools_TrsfModification.hxx>
b350f6ee 57#include <Message_ProgressSentry.hxx>
c04c30b3 58#include <Geom_Surface.hxx>
7fd59977 59
b47bcd7e 60static void SetShapeFlags(const TopoDS_Shape& theInSh, TopoDS_Shape& theOutSh);
7fd59977 61
62//=======================================================================
63//function : BRepTools_Modifier
64//purpose :
65//=======================================================================
66
b47bcd7e 67BRepTools_Modifier::BRepTools_Modifier (Standard_Boolean theMutableInput):
68myDone(Standard_False), myMutableInput (theMutableInput)
7fd59977 69{}
70
71//=======================================================================
72//function : BRepTools_Modifier
73//purpose :
74//=======================================================================
75
76BRepTools_Modifier::BRepTools_Modifier (const TopoDS_Shape& S) :
b47bcd7e 77myShape(S),myDone(Standard_False), myMutableInput (Standard_False)
7fd59977 78{
7fd59977 79 Put(S);
80}
81
82//=======================================================================
83//function : BRepTools_Modifier
84//purpose :
85//=======================================================================
86
87BRepTools_Modifier::BRepTools_Modifier
88 (const TopoDS_Shape& S,
b47bcd7e 89 const Handle(BRepTools_Modification)& M)
90 : myShape(S), myDone(Standard_False),
91 myMutableInput (Standard_False)
7fd59977 92{
7fd59977 93 Put(S);
94 Perform(M);
95}
96
97
98//=======================================================================
99//function : Init
100//purpose :
101//=======================================================================
102
103void BRepTools_Modifier::Init(const TopoDS_Shape& S)
104{
105 myShape = S;
106 myDone = Standard_False;
7fd59977 107 Put(S);
108}
109
110
111//=======================================================================
112//function : Perform
113//purpose :
114//=======================================================================
b47bcd7e 115#ifdef DEBUG_Modifier
116static TopTools_IndexedMapOfShape MapE, MapF;
117#endif
7fd59977 118
b350f6ee 119void BRepTools_Modifier::Perform(const Handle(BRepTools_Modification)& M, const Handle(Message_ProgressIndicator) & aProgress)
7fd59977 120{
121 if (myShape.IsNull()) {
9775fa61 122 throw Standard_NullObject();
7fd59977 123 }
b47bcd7e 124#ifdef DEBUG_Modifier
125 MapE.Clear(); MapF.Clear();
126 TopExp::MapShapes(myShape, TopAbs_EDGE, MapE);
127 TopExp::MapShapes(myShape, TopAbs_FACE, MapF);
128#endif
7fd59977 129 TopTools_DataMapIteratorOfDataMapOfShapeShape theIter(myMap);
130
b47bcd7e 131 Message_ProgressSentry aPSentry(aProgress, "Converting Shape", 0, 2, 1);
7fd59977 132
b47bcd7e 133 TopTools_IndexedDataMapOfShapeListOfShape aMVE, aMEF;
134 TopExp::MapShapesAndAncestors(myShape, TopAbs_VERTEX, TopAbs_EDGE, aMVE);
135 TopExp::MapShapesAndAncestors(myShape, TopAbs_EDGE, TopAbs_FACE, aMEF);
7fd59977 136
b47bcd7e 137 CreateNewVertices(aMVE, M);
7fd59977 138
b47bcd7e 139 FillNewCurveInfo(aMEF, M);
140
141 FillNewSurfaceInfo(M);
b350f6ee 142
b47bcd7e 143 if (!myMutableInput)
144 CreateOtherVertices(aMVE, aMEF, M);
145
146 Standard_Boolean aNewGeom;
147 Rebuild(myShape, M, aNewGeom, aProgress);
b350f6ee 148
149 if (!aPSentry.More())
150 {
151 // The processing was broken
152 return;
153 }
154
155 aPSentry.Next();
7fd59977 156
157 if (myShape.ShapeType() == TopAbs_FACE) {
158 if (myShape.Orientation() == TopAbs_REVERSED) {
159 myMap(myShape).Reverse();
160 }
161 else{
162 myMap(myShape).Orientation(myShape.Orientation());
163 }
164 }
165 else {
166 myMap(myShape).Orientation(myShape.Orientation());
167 }
168
0d969553 169 // Update the continuities
7fd59977 170
b47bcd7e 171
172 BRep_Builder aBB;
7fd59977 173
174/*
175 Standard_Boolean RecomputeTriangles = Standard_False;
176 Standard_Real MaxDeflection = RealFirst();
177 Handle(Poly_Triangulation) Tr;
178 Handle(Poly_Polygon3D) Po;
179 TopLoc_Location Loc;
180*/
181
b47bcd7e 182 for (int ii = 1; ii <= aMEF.Extent(); ii++)
183 {
184 const TopoDS_Edge& CurE = TopoDS::Edge(aMEF.FindKey(ii));
185 const TopoDS_Edge& NewE = TopoDS::Edge(myMap(CurE));
186 if (!CurE.IsSame(NewE)) {
7fd59977 187 TopTools_ListIteratorOfListOfShape it;
b47bcd7e 188 it.Initialize(aMEF.FindFromKey(CurE));
7fd59977 189 TopoDS_Face F1,F2;
190 while (it.More() && F2.IsNull()) {
b350f6ee 191 if (F1.IsNull()) {
192 F1 = TopoDS::Face(it.Value());
193 }
194 else {
195 F2 = TopoDS::Face(it.Value());
196 }
197 it.Next();
7fd59977 198 }
199 if (!F2.IsNull()) {
b350f6ee 200 const TopoDS_Face& newf1 = TopoDS::Face(myMap(F1));
201 const TopoDS_Face& newf2 = TopoDS::Face(myMap(F2));
b47bcd7e 202 GeomAbs_Shape Newcont = M->Continuity(CurE,F1,F2,NewE,newf1,newf2);
b350f6ee 203 if (Newcont > GeomAbs_C0) {
b47bcd7e 204 aBB.Continuity(NewE,newf1,newf2,Newcont);
b350f6ee 205 }
7fd59977 206 }
207 }
208 theIter.Next();
209 }
210/*
211 if (RecomputeTriangles) {
212 BRepMesh_IncrementalMesh(myMap(myShape),MaxDeflection);
213 }
214*/
215
216 myDone = Standard_True;
217
218}
219
220//=======================================================================
221//function : Put
222//purpose :
223//=======================================================================
224
225void BRepTools_Modifier::Put(const TopoDS_Shape& S)
226{
227 if (!myMap.IsBound(S)) {
228 myMap.Bind(S,TopoDS_Shape());
229 for(TopoDS_Iterator theIterator(S,Standard_False);theIterator.More();theIterator.Next()) {
230
231 Put(theIterator.Value());
232 }
233 }
234}
235
236//=======================================================================
237//function : Rebuild
238//purpose :
239//=======================================================================
240
241Standard_Boolean BRepTools_Modifier::Rebuild
242 (const TopoDS_Shape& S,
b350f6ee 243 const Handle(BRepTools_Modification)& M,
b47bcd7e 244 Standard_Boolean& theNewGeom,
b350f6ee 245 const Handle(Message_ProgressIndicator)& aProgress)
7fd59977 246{
b47bcd7e 247#ifdef DEBUG_Modifier
248 int iF = MapF.Contains(S) ? MapF.FindIndex(S) : 0;
249 int iE = MapE.Contains(S) ? MapE.FindIndex(S) : 0;
250#endif
251 TopAbs_ShapeEnum ts = S.ShapeType();
7fd59977 252 TopoDS_Shape& result = myMap(S);
b47bcd7e 253 if (!result.IsNull())
254 {
255 theNewGeom = myHasNewGeom.Contains(S);
256 return !S.IsSame(result);
257 }
7fd59977 258 Standard_Boolean rebuild = Standard_False, RevWires = Standard_False;
259 TopAbs_Orientation ResOr = TopAbs_FORWARD;
260 BRep_Builder B;
261 Standard_Real tol;
262 Standard_Boolean No3DCurve = Standard_False; // en fait, si on n`a pas de
0d969553 263 //modif geometry 3d , it is necessary to test the existence of a curve 3d.
7fd59977 264
265 // new geometry ?
266
7fd59977 267 switch (ts) {
268 case TopAbs_FACE:
269 {
b47bcd7e 270 rebuild = myNSInfo.IsBound(TopoDS::Face(S));
271 if (rebuild)
272 {
273 const NewSurfaceInfo& aNSinfo = myNSInfo(TopoDS::Face(S));
274 RevWires = aNSinfo.myRevWires;
275 B.MakeFace(TopoDS::Face(result),aNSinfo.mySurface,
276 aNSinfo.myLoc.Predivided(S.Location()),aNSinfo.myToler);
277 result.Location(S.Location());
278 if (aNSinfo.myRevFace)
279 ResOr = TopAbs_REVERSED;
280 // set specifics flags of a Face
281 B.NaturalRestriction(TopoDS::Face(result), BRep_Tool::NaturalRestriction(TopoDS::Face(S)));
7fd59977 282 }
55e738d2 283
284 // update triangulation on the copied face
285 Handle(Poly_Triangulation) aTriangulation;
286 if (M->NewTriangulation(TopoDS::Face(S), aTriangulation))
287 {
288 if (rebuild) // the copied face already exists => update it
289 B.UpdateFace(TopoDS::Face(result), aTriangulation);
290 else
291 { // create new face with bare triangulation
292 B.MakeFace(TopoDS::Face(result), aTriangulation);
293 result.Location(S.Location());
294 }
295 rebuild = Standard_True;
296 }
7fd59977 297 }
298 break;
299
300 case TopAbs_EDGE:
301 {
b47bcd7e 302 rebuild = myNCInfo.IsBound(TopoDS::Edge(S));
303 if (rebuild)
304 {
305 const NewCurveInfo& aNCinfo = myNCInfo(TopoDS::Edge(S));
306 if (aNCinfo.myCurve.IsNull()) {
7fd59977 307 B.MakeEdge(TopoDS::Edge(result));
308 B.Degenerated(TopoDS::Edge(result),
309 BRep_Tool::Degenerated(TopoDS::Edge(S)));
b47bcd7e 310 B.UpdateEdge(TopoDS::Edge(result),aNCinfo.myToler); //OCC217
7fd59977 311 No3DCurve = Standard_True;
312 }
313 else {
b47bcd7e 314 B.MakeEdge(TopoDS::Edge(result),aNCinfo.myCurve,
315 aNCinfo.myLoc.Predivided(S.Location()),aNCinfo.myToler);
7fd59977 316 No3DCurve = Standard_False;
317 }
318 result.Location(S.Location());
319// result.Orientation(S.Orientation());
320
321 // set specifics flags of an Edge
322 B.SameParameter(TopoDS::Edge(result),
323 BRep_Tool::SameParameter(TopoDS::Edge(S)));
324 B.SameRange(TopoDS::Edge(result),
325 BRep_Tool::SameRange(TopoDS::Edge(S)));
326 }
8156dddd 327
328 // update polygonal structure on the edge
329 Handle(Poly_Polygon3D) aPolygon;
330 if (M->NewPolygon(TopoDS::Edge(S), aPolygon))
331 {
332 if (rebuild) // the copied edge already exists => update it
333 B.UpdateEdge(TopoDS::Edge(result), aPolygon, S.Location());
334 else
335 { // create new edge with bare polygon
336 B.MakeEdge(TopoDS::Edge(result), aPolygon);
337 result.Location(S.Location());
338 }
339 rebuild = Standard_True;
340 }
7fd59977 341 }
342 break;
7fd59977 343 default:
b47bcd7e 344 ;
7fd59977 345 }
346
347 // rebuild sub-shapes and test new sub-shape ?
348
349 Standard_Boolean newgeom = rebuild;
b47bcd7e 350 theNewGeom = rebuild;
7fd59977 351
352 TopoDS_Iterator it;
353
b350f6ee 354 {
355 Standard_Integer aShapeCount = 0;
356 {
357 for (it.Initialize(S, Standard_False); it.More(); it.Next()) ++aShapeCount;
358 }
359
360 Message_ProgressSentry aPSentry(aProgress, "Converting SubShapes", 0, aShapeCount, 1);
361 //
362 for (it.Initialize(S, Standard_False); it.More() && aPSentry.More(); it.Next(), aPSentry.Next()) {
363 // always call Rebuild
b47bcd7e 364 Standard_Boolean isSubNewGeom = Standard_False;
365 Standard_Boolean subrebuilt = Rebuild(it.Value(), M, isSubNewGeom, aProgress);
b350f6ee 366 rebuild = subrebuilt || rebuild ;
b47bcd7e 367 theNewGeom = theNewGeom || isSubNewGeom;
b350f6ee 368 }
369 if (!aPSentry.More())
370 {
371 // The processing was broken
372 return Standard_False;
373 }
7fd59977 374 }
b47bcd7e 375 if (theNewGeom)
376 myHasNewGeom.Add(S);
7fd59977 377
378 // make an empty copy
379 if (rebuild && !newgeom) {
380 result = S.EmptyCopied();
381 result.Orientation(TopAbs_FORWARD);
382 }
383
384 // copy the sub-elements
385
386 if (rebuild) {
387 TopAbs_Orientation orient;
388 for (it.Initialize(S,Standard_False); it.More(); it.Next()) {
389 orient = it.Value().Orientation();
390 if (RevWires || myMap(it.Value()).Orientation() == TopAbs_REVERSED) {
391 orient = TopAbs::Reverse(orient);
392 }
393 B.Add(result,myMap(it.Value()).Oriented(orient));
394 }
395
396
397 if (ts == TopAbs_FACE) {
398 // pcurves
399 Handle(Geom2d_Curve) curve2d; //,curve2d1;
400 TopoDS_Face face = TopoDS::Face(S);
401 TopAbs_Orientation fcor = face.Orientation();
402 if(fcor != TopAbs_REVERSED) fcor = TopAbs_FORWARD;
403
404 TopExp_Explorer ex(face.Oriented(fcor),TopAbs_EDGE);
405 for (;ex.More(); ex.Next())
406 {
b350f6ee 407 const TopoDS_Edge& edge = TopoDS::Edge(ex.Current());
7fd59977 408
b47bcd7e 409#ifdef DEBUG_Modifier
410 iE = MapE.Contains(edge) ? MapE.FindIndex(edge) : 0;
411#endif
412 if (theNewGeom && M->NewCurve2d
413 (edge, face, TopoDS::Edge(myMap(ex.Current())), TopoDS::Face(result), curve2d, tol))
7fd59977 414 {
b350f6ee 415 // rem dub 16/09/97 : Make constant topology or not make at all.
416 // Do not make if CopySurface = 1
417 // Atention, TRUE sewing edges (RealyClosed)
418 // stay even if CopySurface is true.
7fd59977 419
420 // check that edge contains two pcurves on this surface:
421 // either it is true seam on the current face, or belongs to two faces
422 // built on that same surface (see OCC21772)
423 // Note: this check could be made separate method in BRepTools
424 Standard_Boolean isClosed = Standard_False;
425 if(BRep_Tool::IsClosed(edge,face))
426 {
427 isClosed = ( ! newgeom || BRepTools::IsReallyClosed(edge,face) );
428 if ( ! isClosed )
429 {
430 TopLoc_Location aLoc;
431 TopoDS_Shape resface = (myMap.IsBound(face) ? myMap(face) : face);
432 if(resface.IsNull())
433 resface = face;
434 Handle(Geom_Surface) aSurf = BRep_Tool::Surface(TopoDS::Face(resface), aLoc);
435 // check other faces sharing the same surface
436 TopExp_Explorer aExpF(myShape,TopAbs_FACE);
437 for( ; aExpF.More() && !isClosed; aExpF.Next())
438 {
439 TopoDS_Face anOther = TopoDS::Face(aExpF.Current());
440 if(anOther.IsSame(face))
441 continue;
442 TopoDS_Shape resface2 = (myMap.IsBound(anOther) ? myMap(anOther) : anOther);
443 if(resface2.IsNull())
444 resface2 = anOther;
445 TopLoc_Location anOtherLoc;
446 Handle(Geom_Surface) anOtherSurf =
447 BRep_Tool::Surface(TopoDS::Face(resface2), anOtherLoc);
448 if ( aSurf == anOtherSurf && aLoc.IsEqual (anOtherLoc) )
449 {
450 TopExp_Explorer aExpE(anOther,TopAbs_EDGE);
451 for( ; aExpE.More() && !isClosed ; aExpE.Next())
452 isClosed = edge.IsSame(aExpE.Current());
453 }
454 }
455 }
456 }
b350f6ee 457 if (isClosed)
458 {
459 TopoDS_Edge CurE = TopoDS::Edge(myMap(edge));
460 TopoDS_Shape aLocalResult = result;
461 aLocalResult.Orientation(TopAbs_FORWARD);
462 TopoDS_Face CurF = TopoDS::Face(aLocalResult);
463 Handle(Geom2d_Curve) curve2d1, currcurv;
464 Standard_Real f,l;
465 if ((!RevWires && fcor != edge.Orientation()) ||
466 ( RevWires && fcor == edge.Orientation())) {
467 CurE.Orientation(TopAbs_FORWARD);
468 curve2d1 = BRep_Tool::CurveOnSurface(CurE,CurF,f,l);
469 if (curve2d1.IsNull()) curve2d1 = new Geom2d_Line(gp::OX2d());
470 B.UpdateEdge (CurE, curve2d1, curve2d, CurF, 0.);
471 }
472 else {
473 CurE.Orientation(TopAbs_REVERSED);
474 curve2d1 = BRep_Tool::CurveOnSurface(CurE,CurF,f,l);
475 if (curve2d1.IsNull()) curve2d1 = new Geom2d_Line(gp::OX2d());
476 B.UpdateEdge (CurE, curve2d, curve2d1, CurF, 0.);
477 }
b47bcd7e 478 currcurv = BRep_Tool::CurveOnSurface(CurE,CurF,f,l);
479 B.Range(CurE,f,l);
b350f6ee 480 }
481 else {
482 B.UpdateEdge(TopoDS::Edge(myMap(ex.Current())),
483 curve2d,
484 TopoDS::Face(result), 0.);
485 }
7fd59977 486
b350f6ee 487 TopLoc_Location theLoc;
488 Standard_Real theF,theL;
489 Handle(Geom_Curve) C3D = BRep_Tool::Curve(TopoDS::Edge(myMap(ex.Current())), theLoc, theF, theL);
490 if (C3D.IsNull()) { // Update vertices
491 Standard_Real param;
492 TopExp_Explorer ex2(edge,TopAbs_VERTEX);
493 while (ex2.More()) {
494 const TopoDS_Vertex& vertex = TopoDS::Vertex(ex2.Current());
495 if (!M->NewParameter(vertex, edge, param, tol)) {
496 tol = BRep_Tool::Tolerance(vertex);
497 param = BRep_Tool::Parameter(vertex,edge);
498 }
499
500 TopAbs_Orientation vtxrelat = vertex.Orientation();
501 if (edge.Orientation() == TopAbs_REVERSED) {
502 // Update considere l'edge FORWARD, et le vertex en relatif
503 vtxrelat= TopAbs::Reverse(vtxrelat);
504 }
505 //if (myMap(edge).Orientation() == TopAbs_REVERSED) {
506 // vtxrelat= TopAbs::Reverse(vtxrelat);
507 //}
508
509 TopoDS_Vertex aLocalVertex = TopoDS::Vertex(myMap(vertex));
510 aLocalVertex.Orientation(vtxrelat);
511 //B.UpdateVertex(TopoDS::Vertex
512 //(myMap(vertex).Oriented(vtxrelat)),
513 B.UpdateVertex(aLocalVertex, param, TopoDS::Edge(myMap(edge)), tol);
514 ex2.Next();
515 }
516 }
517 }
8156dddd 518
519 // Copy polygon on triangulation
520 Handle(Poly_PolygonOnTriangulation) aPolyOnTria_1, aPolyOnTria_2;
521 Standard_Boolean aNewPonT = M->NewPolygonOnTriangulation(edge, face, aPolyOnTria_1);
522 if (BRepTools::IsReallyClosed(edge, face))
523 {
524 // Obtain triangulation on reversed edge
525 TopoDS_Edge anEdgeRev = edge;
526 anEdgeRev.Reverse();
527 aNewPonT = M->NewPolygonOnTriangulation(anEdgeRev, face, aPolyOnTria_2) || aNewPonT;
528 // It there is only one polygon on triangulation, store it to aPolyOnTria_1
529 if (aPolyOnTria_1.IsNull() && !aPolyOnTria_2.IsNull())
530 {
531 aPolyOnTria_1 = aPolyOnTria_2;
532 aPolyOnTria_2 = Handle(Poly_PolygonOnTriangulation)();
533 }
534 }
535 if (aNewPonT)
536 {
537 TopLoc_Location aLocation;
538 Handle(Poly_Triangulation) aNewFaceTria =
539 BRep_Tool::Triangulation(TopoDS::Face(myMap(face)), aLocation);
540 TopoDS_Edge aNewEdge = TopoDS::Edge(myMap(edge));
541 if (aPolyOnTria_2.IsNull())
542 B.UpdateEdge(aNewEdge, aPolyOnTria_1, aNewFaceTria, aLocation);
543 else
544 {
545 if (edge.Orientation() == TopAbs_FORWARD)
546 B.UpdateEdge(aNewEdge, aPolyOnTria_1, aPolyOnTria_2, aNewFaceTria, aLocation);
547 else
548 B.UpdateEdge(aNewEdge, aPolyOnTria_2, aPolyOnTria_1, aNewFaceTria, aLocation);
549 }
550 }
7fd59977 551 }
552
553 }
554
555// else if (ts == TopAbs_EDGE) {
556 else if (ts == TopAbs_EDGE && !No3DCurve) {
557 // Vertices
558 Standard_Real param;
559 const TopoDS_Edge& edge = TopoDS::Edge(S);
560 TopAbs_Orientation edor = edge.Orientation();
561 if(edor != TopAbs_REVERSED) edor = TopAbs_FORWARD;
562 TopExp_Explorer ex(edge.Oriented(edor), TopAbs_VERTEX);
563 while (ex.More()) {
b350f6ee 564 const TopoDS_Vertex& vertex = TopoDS::Vertex(ex.Current());
565
566 if (!M->NewParameter(vertex, edge, param, tol)) {
567 tol = BRep_Tool::Tolerance(vertex);
568 param = BRep_Tool::Parameter(vertex,edge);
569 }
570
571 TopAbs_Orientation vtxrelat = vertex.Orientation();
572 if (edor == TopAbs_REVERSED) {
573 // Update considere l'edge FORWARD, et le vertex en relatif
574 vtxrelat= TopAbs::Reverse(vtxrelat);
575 }
576
577 //if (result.Orientation() == TopAbs_REVERSED) {
578 // vtxrelat= TopAbs::Reverse(vtxrelat);
579 //}
580 TopoDS_Vertex aLocalVertex = TopoDS::Vertex(myMap(vertex));
581 aLocalVertex.Orientation(vtxrelat);
582 //B.UpdateVertex(TopoDS::Vertex(myMap(vertex).Oriented(vtxrelat)),
b47bcd7e 583 if (myMutableInput || !aLocalVertex.IsSame(vertex))
584 B.UpdateVertex(aLocalVertex, param, TopoDS::Edge(result), tol);
b350f6ee 585 ex.Next();
7fd59977 586 }
587
588 }
589
590 // update flags
591
592 result.Orientable(S.Orientable());
593 result.Closed(S.Closed());
594 result.Infinite(S.Infinite());
595 }
596 else
597 result = S;
598
599 // Set flag of the shape.
600 result.Orientation(ResOr);
601
b47bcd7e 602 SetShapeFlags(S, result);
7fd59977 603
604 return rebuild;
605}
606
b47bcd7e 607void BRepTools_Modifier::CreateNewVertices( const TopTools_IndexedDataMapOfShapeListOfShape& theMVE, const Handle(BRepTools_Modification)& M)
608{
609 double aToler;
610 BRep_Builder aBB;
611 gp_Pnt aPnt;
612 for (int i = 1; i <= theMVE.Extent(); i++ )
613 {
614 //fill MyMap only with vertices with NewPoint == true
615 const TopoDS_Vertex& aV = TopoDS::Vertex(theMVE.FindKey(i));
616 Standard_Boolean IsNewP = M->NewPoint(aV, aPnt, aToler);
617 if (IsNewP)
618 {
619 TopoDS_Vertex aNewV;
620 aBB.MakeVertex(aNewV, aPnt, aToler);
621 SetShapeFlags(aV, aNewV);
622 myMap(aV) = aNewV;
623 myHasNewGeom.Add(aV);
624 }
625 else if (myMutableInput)
626 myMap(aV) = aV.Oriented(TopAbs_FORWARD);
627 }
628}
629
630void BRepTools_Modifier::FillNewCurveInfo(const TopTools_IndexedDataMapOfShapeListOfShape& theMEF, const Handle(BRepTools_Modification)& M)
631{
632 Handle(Geom_Curve) aCurve;
633 TopLoc_Location aLocation;
634 BRepTools_Modifier::NewCurveInfo aNCinfo;
635 double aToler;
636 for (int i = 1; i <= theMEF.Extent(); i++ )
637 {
638 const TopoDS_Edge& anE = TopoDS::Edge(theMEF.FindKey(i));
639 Standard_Boolean IsNewCur = M->NewCurve(anE, aCurve, aLocation, aToler);
640 if (IsNewCur)
641 {
642 aNCinfo.myCurve = aCurve;
643 aNCinfo.myLoc = aLocation;
644 aNCinfo.myToler = aToler;
645 myNCInfo.Bind(anE, aNCinfo);
646 myHasNewGeom.Add(anE);
647 }
648 }
649}
650
651void BRepTools_Modifier::FillNewSurfaceInfo(const Handle(BRepTools_Modification)& M)
652{
653 TopTools_IndexedMapOfShape aMF;
654 TopExp::MapShapes(myShape, TopAbs_FACE, aMF);
655 BRepTools_Modifier::NewSurfaceInfo aNSinfo;
656 for (int i = 1; i <= aMF.Extent(); i++ )
657 {
658 const TopoDS_Face& aF = TopoDS::Face(aMF(i));
659 Standard_Boolean RevFace;
660 Standard_Boolean RevWires;
661 Handle(Geom_Surface) aSurface;
662 TopLoc_Location aLocation;
663 double aToler1;
664 Standard_Boolean IsNewSur = M->NewSurface(aF, aSurface, aLocation, aToler1, RevWires,RevFace);
665 if (IsNewSur)
666 {
667 aNSinfo.mySurface = aSurface;
668 aNSinfo.myLoc = aLocation;
669 aNSinfo.myToler = aToler1;
670 aNSinfo.myRevWires = RevWires;
671 aNSinfo.myRevFace = RevFace;
672 myNSInfo.Bind(aF, aNSinfo);
673 myHasNewGeom.Add(aF);
674 }
675 else
676 {
677 //check if subshapes will be modified
678 Standard_Boolean notRebuilded = Standard_True;
679 TopExp_Explorer exE(aF, TopAbs_EDGE);
680 while (exE.More() && notRebuilded)
681 {
682 const TopoDS_Edge& anEE = TopoDS::Edge(exE.Current());
683 if (myNCInfo.IsBound(anEE))
684 {
685 notRebuilded = Standard_False;
686 break;
687 }
688 TopExp_Explorer exV(anEE, TopAbs_VERTEX);
689 while (exV.More() && notRebuilded)
690 {
691 const TopoDS_Vertex& aVV = TopoDS::Vertex(exV.Current());
692 if (!myMap(aVV).IsNull())
693 {
694 notRebuilded = Standard_False;
695 break;
696 }
697 exV.Next();
698 }
699 exE.Next();
700 }
701 if (notRebuilded)
702 {
703 //subshapes is not going to be modified
704 myNonUpdFace.Add(aF);
705 }
706 }
707 }
708
709}
710
711void BRepTools_Modifier::CreateOtherVertices(const TopTools_IndexedDataMapOfShapeListOfShape& theMVE,
712 const TopTools_IndexedDataMapOfShapeListOfShape& theMEF,
713 const Handle(BRepTools_Modification)& M)
714{
715 double aToler;
716 //The following logic in some ways repeats the logic from the Rebuild() method.
717 //If the face with its subshapes is not going to be modified
718 //(i.e. NewSurface() for this face and NewCurve(), NewPoint() for its edges/vertices returns false)
719 //then the calling of NewCurve2d() for this face with its edges is not performed.
720 //Therefore, the updating of vertices will not present in such cases and
721 //the EmptyCopied() operation for vertices from this face is not needed.
722
723 for (int i = 1; i <= theMVE.Extent(); i++ )
724 {
725 const TopoDS_Vertex& aV = TopoDS::Vertex(theMVE.FindKey(i));
726 TopoDS_Vertex aNewV = TopoDS::Vertex(myMap(aV));
727 if ( aNewV.IsNull())
728 {
729 const TopTools_ListOfShape& aLEdges = theMVE(i);
730 Standard_Boolean toReplace = Standard_False;
731 TopTools_ListIteratorOfListOfShape it(aLEdges);
732 for (; it.More() && !toReplace; it.Next())
733 {
734 const TopoDS_Edge& anE = TopoDS::Edge(it.Value());
735 if (myNCInfo.IsBound(anE) && !myNCInfo(anE).myCurve.IsNull())
736 toReplace = Standard_True;
737
738 if (!toReplace)
739 {
740 const TopTools_ListOfShape& aLFaces = theMEF.FindFromKey(anE);
741 TopTools_ListIteratorOfListOfShape it2(aLFaces);
742 for (; it2.More(); it2.Next())
743 {
744 const TopoDS_Face& aF = TopoDS::Face(it2.Value());
745 if (!myNonUpdFace.Contains(aF))
746 {
747 Handle(Geom2d_Curve) aCurve2d;
748 //some NewCurve2d()s may use NewE arg internally, so the
749 //null TShape as an arg may lead to the exceptions
750 TopoDS_Edge aDummyE = TopoDS::Edge(anE.EmptyCopied());
751 if (M->NewCurve2d(anE, aF, aDummyE, TopoDS_Face(), aCurve2d, aToler))
752 {
753 toReplace = true;
754 break;
755 }
756 }
757 }
758 }
759 }
760 if (toReplace)
761 aNewV = TopoDS::Vertex(aV.EmptyCopied());
762 else
763 aNewV = aV;
764 aNewV.Orientation(TopAbs_FORWARD);
765 myMap(aV) = aNewV;
766 }
767 }
768}
769
770
771static void SetShapeFlags(const TopoDS_Shape& theInSh, TopoDS_Shape& theOutSh)
772{
773 theOutSh.Modified (theInSh.Modified());
774 theOutSh.Checked (theInSh.Checked());
775 theOutSh.Orientable(theInSh.Orientable());
776 theOutSh.Closed (theInSh.Closed());
777 theOutSh.Infinite (theInSh.Infinite());
778 theOutSh.Convex (theInSh.Convex());
779}
780
781
782Standard_Boolean BRepTools_Modifier::IsMutableInput() const
783{
784 return myMutableInput;
785}
786
787void BRepTools_Modifier::SetMutableInput(Standard_Boolean theMutableInput)
788{
789 myMutableInput = theMutableInput;
790}
7fd59977 791