1 // File: NMTTools_Tools.cxx
2 // Created: Mon Dec 8 10:35:15 2003
3 // Author: Peter KURNEV
7 #include <NMTTools_Tools.ixx>
9 #include <TColStd_IndexedMapOfInteger.hxx>
13 #include <gp_Pnt2d.hxx>
15 #include <Geom_Surface.hxx>
16 #include <GeomAPI_ProjectPointOnSurf.hxx>
19 #include <TopoDS_Vertex.hxx>
20 #include <TopoDS_Shape.hxx>
21 #include <TopoDS_Edge.hxx>
25 #include <TopTools_ListIteratorOfListOfShape.hxx>
26 #include <TopTools_IndexedMapOfShape.hxx>
28 #include <BRep_Tool.hxx>
29 #include <BRep_Builder.hxx>
30 #include <BRepTools.hxx>
32 #include <BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger.hxx>
33 #include <BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger.hxx>
35 #include <BOPTools_VVInterference.hxx>
36 #include <BOPTools_SSInterference.hxx>
38 #include <BOPTools_Tools2D.hxx>
39 #include <BOPTools_Tools.hxx>
40 #include <NMTTools_ListIteratorOfListOfCoupleOfShape.hxx>
41 #include <NMTTools_IndexedDataMapOfShapeIndexedMapOfShape.hxx>
42 #include <NMTTools_CoupleOfShape.hxx>
43 #include <TopTools_IndexedMapOfShape.hxx>
44 #include <Geom2d_Curve.hxx>
45 #include <Geom_Curve.hxx>
46 #include <Geom_TrimmedCurve.hxx>
47 #include <BOPTools_Tools2D.hxx>
48 #include <BRepLib.hxx>
49 #include <BOPTools_Tools3D.hxx>
50 #include <TopExp_Explorer.hxx>
53 void ProcessBlock(const Standard_Integer iV,
54 const BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMCV,
55 TColStd_IndexedMapOfInteger& aProcessed,
56 TColStd_IndexedMapOfInteger& aChain);
58 void ProcessBlock(const TopoDS_Shape& aF,
59 const NMTTools_IndexedDataMapOfShapeIndexedMapOfShape& aMCV,
60 TopTools_IndexedMapOfShape& aProcessed,
61 TopTools_IndexedMapOfShape& aChain);
63 //=======================================================================
64 // function: MakePCurve
66 //=======================================================================
67 void NMTTools_Tools::MakePCurve(const TopoDS_Edge& aE,
68 const TopoDS_Face& aF,
69 const Handle(Geom2d_Curve)& aC2Dx,
70 const Standard_Real aTolR2D)
72 Standard_Integer k, aNbV;
73 Standard_Real aTolEdge, aTolFact, aTolV, aTolVmax;
74 Standard_Real aTFirst, aTLast, aOutFirst, aOutLast, aOutTol;
76 TopTools_IndexedMapOfShape aVMap;
80 aFFWD.Orientation(TopAbs_FORWARD);
82 aTolEdge=BRep_Tool::Tolerance(aE);
83 aTolFact=Max(aTolEdge, aTolR2D);
85 TopExp::MapShapes(aE, TopAbs_VERTEX, aVMap);
89 for (k=1; k<=aNbV; ++k) {
90 const TopoDS_Vertex& aV=TopoDS::Vertex(aVMap(k));
91 aTolV=BRep_Tool::Tolerance(aV);
97 if (aTolFact>aTolVmax) {
101 const Handle(Geom_Curve)& aC3DE=BRep_Tool::Curve(aE, aTFirst, aTLast);
102 Handle(Geom_TrimmedCurve)aC3DETrim=new Geom_TrimmedCurve(aC3DE, aTFirst, aTLast);
104 Handle(Geom2d_Curve) aC2D, aC2DA;
108 BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aFFWD);
109 BOPTools_Tools2D::CurveOnSurface(aE, aFFWD, aC2D, aOutFirst, aOutLast, aOutTol, Standard_True);
111 if (aC3DE->IsPeriodic()) {
112 BOPTools_Tools2D::AdjustPCurveOnFace(aFFWD, aTFirst, aTLast, aC2D, aC2DA);
115 BOPTools_Tools2D::AdjustPCurveOnFace(aFFWD, aC3DETrim, aC2D, aC2DA);
118 aBB.UpdateEdge(aE, aC2DA, aFFWD, aTolFact);
119 BRepLib::SameParameter(aE);
122 //=======================================================================
123 // function: IsSplitInOnFace
125 //=======================================================================
126 Standard_Boolean NMTTools_Tools::IsSplitInOnFace(const TopoDS_Edge& aE,
127 const TopoDS_Face& aF,
128 IntTools_Context& aContext)
130 Standard_Boolean bFlag;
131 Standard_Real aT, aTolE, aTolF, aTol, aDist, aU, aV;
135 aTolE=BRep_Tool::Tolerance(aE);
136 aTolF=BRep_Tool::Tolerance(aF);
139 GeomAPI_ProjectPointOnSurf& aProjector=aContext.ProjPS(aF);
141 aT=BOPTools_Tools2D::IntermediatePoint(aE);
142 BOPTools_Tools::PointOnEdge(aE, aT, aP);
144 aProjector.Perform(aP);
145 bFlag=aProjector.IsDone();
150 aDist=aProjector.LowerDistance();
151 bFlag=(aDist <= aTol);
156 aProjector.LowerDistanceParameters(aU, aV);
157 aP2D.SetCoord(aU, aV);
158 bFlag=aContext.IsPointInOnFace (aF, aP2D);
161 //=======================================================================
162 // function: NMTTools_Tools::MakeNewVertex
164 //=======================================================================
165 void NMTTools_Tools::MakeNewVertex(const TopTools_ListOfShape& aLVs,
166 TopoDS_Vertex& aNewVertex)
168 Standard_Integer aNb;
169 Standard_Real aTi, aDi, aDmax=-1.e5;
171 gp_XYZ aXYZ(0.,0.,0.), aXYZi;
172 TopTools_ListIteratorOfListOfShape anIt;
179 anIt.Initialize(aLVs);
180 for (; anIt.More(); anIt.Next()) {
181 TopoDS_Vertex aVi=TopoDS::Vertex(anIt.Value());
182 aPi=BRep_Tool::Pnt(aVi);
187 aXYZ.Divide((Standard_Real)aNb);
190 anIt.Initialize(aLVs);
191 for (; anIt.More(); anIt.Next()) {
192 TopoDS_Vertex aVi=TopoDS::Vertex(anIt.Value());
193 aPi=BRep_Tool::Pnt(aVi);
194 aTi=BRep_Tool::Tolerance(aVi);
195 aDi=aP.Distance(aPi);
202 aBB.MakeVertex (aNewVertex, aP, aDmax);
204 //=======================================================================
205 // function: FindChains
207 //=======================================================================
208 void NMTTools_Tools::FindChains(const BOPTools_CArray1OfSSInterference& FFs,
209 BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapChains)
211 Standard_Boolean bIsTangentFaces;
212 Standard_Integer j, aNb, anIndex1, anIndex2;
213 BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger aMCV;
216 for (j=1; j<=aNb; ++j) {
217 const BOPTools_SSInterference& aFF=FFs(j);
219 bIsTangentFaces=aFF.IsTangentFaces();
220 if (!bIsTangentFaces) {
224 aFF.Indices(anIndex1, anIndex2);
226 if (aMCV.Contains(anIndex1)) {
227 TColStd_IndexedMapOfInteger& aMV=aMCV.ChangeFromKey(anIndex1);
232 TColStd_IndexedMapOfInteger aMV;
235 aMCV.Add(anIndex1, aMV);
238 if (aMCV.Contains(anIndex2)) {
239 TColStd_IndexedMapOfInteger& aMV=aMCV.ChangeFromKey(anIndex2);
244 TColStd_IndexedMapOfInteger aMV;
247 aMCV.Add(anIndex2, aMV);
250 NMTTools_Tools::FindChains(aMCV, aMapChains);
252 //=======================================================================
253 // function: FindChains
255 //=======================================================================
256 void NMTTools_Tools::FindChains(const BOPTools_CArray1OfVVInterference& VVs,
257 BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapChains)
259 Standard_Integer j, aNb, anIndex1, anIndex2;
260 BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger aMCV;
263 for (j=1; j<=aNb; ++j) {
264 const BOPTools_VVInterference& VV=VVs(j);
265 VV.Indices(anIndex1, anIndex2);
267 if (aMCV.Contains(anIndex1)) {
268 TColStd_IndexedMapOfInteger& aMV=aMCV.ChangeFromKey(anIndex1);
273 TColStd_IndexedMapOfInteger aMV;
276 aMCV.Add(anIndex1, aMV);
279 if (aMCV.Contains(anIndex2)) {
280 TColStd_IndexedMapOfInteger& aMV=aMCV.ChangeFromKey(anIndex2);
285 TColStd_IndexedMapOfInteger aMV;
288 aMCV.Add(anIndex2, aMV);
291 NMTTools_Tools::FindChains(aMCV, aMapChains);
294 //=======================================================================
295 // function: FindChains
297 //=======================================================================
298 void NMTTools_Tools::FindChains(const BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMCV,
299 BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMapChains)
301 Standard_Integer i, j, aNbCV, aNbV, iV, iVx;
302 TColStd_IndexedMapOfInteger aProcessed, aChain;
305 for (i=1; i<=aNbCV; ++i) {
307 if (aProcessed.Contains(iV)) {
314 const TColStd_IndexedMapOfInteger& aMV=aMCV(i);
316 for (j=1; j<=aNbV; ++j) {
318 ProcessBlock(iVx, aMCV, aProcessed, aChain);
320 aMapChains.Add(i, aChain);
324 //=======================================================================
325 // function: ProcessBlock
327 //=======================================================================
328 void ProcessBlock(const Standard_Integer iV,
329 const BOPTColStd_IndexedDataMapOfIntegerIndexedMapOfInteger& aMCV,
330 TColStd_IndexedMapOfInteger& aProcessed,
331 TColStd_IndexedMapOfInteger& aChain)
333 Standard_Integer j, aNbV, iVx;
335 if (aProcessed.Contains(iV)) {
341 const TColStd_IndexedMapOfInteger& aMV=aMCV.FindFromKey(iV);
343 for (j=1; j<=aNbV; ++j) {
345 ProcessBlock(iVx, aMCV, aProcessed, aChain);
348 //=======================================================================
349 // function: AreFacesSameDomain
351 //=======================================================================
352 Standard_Boolean NMTTools_Tools::AreFacesSameDomain(const TopoDS_Face& aF1x,
353 const TopoDS_Face& aF2y,
354 IntTools_Context& aCtx)
356 Standard_Boolean bFlag;
357 Standard_Integer i, aNbE1, aNbE2;
359 TopTools_IndexedMapOfShape aME1, aME2;
360 TopoDS_Edge aEF1, aEF2;
361 TopoDS_Face aF1, aF2;
364 aF1.Orientation(TopAbs_FORWARD);
366 aF2.Orientation(TopAbs_FORWARD);
368 TopExp::MapShapes(aF1, TopAbs_EDGE, aME1);
369 TopExp::MapShapes(aF2, TopAbs_EDGE, aME2);
371 bFlag=Standard_False;
376 if(!aNbE1 || !aNbE2){
384 for (i=1; i<=aNbE1; ++i) {
385 const TopoDS_Edge& aE1=TopoDS::Edge(aME1(i));
386 if (BRep_Tool::Degenerated(aE1)) {
387 // not try to compare deg edges because it
388 // can not have same TShape on different faces at all
391 if (!aME2.Contains(aE1)) {
396 Standard_Real aTolF1, aTolF2, aTol;
399 TopExp_Explorer anExp;
401 aTolF1=BRep_Tool::Tolerance(aF1);
402 aTolF2=BRep_Tool::Tolerance(aF2);
405 anExp.Init(aF1, TopAbs_EDGE);
406 for (; anExp.More(); anExp.Next()) {
407 const TopoDS_Edge& aE1=TopoDS::Edge(anExp.Current());
408 if (!BRep_Tool::Degenerated(aE1)) {
409 BOPTools_Tools3D::PointNearEdge(aE1, aF1, aP2D, aP);
410 bFlag=aCtx.IsValidPointForFace(aP, aF2, aTol);
417 Standard_Real aU1, aU2, aV1, aV2;
418 Standard_Real dU, dV, aU, aV;
419 Standard_Integer aNbP=5, aNbP1, j;
423 aTolF1=BRep_Tool::Tolerance(aF1);
424 aTolF2=BRep_Tool::Tolerance(aF2);
427 BRepTools::UVBounds(aF1, aU1, aU2, aV1, aV2);
428 Handle(Geom_Surface) aS1=BRep_Tool::Surface(aF1);
434 for (i=1; i<=aNbP; ++i) {
436 for (j=1; j<=aNbP; ++j) {
438 aP2D.SetCoord(aU, aV);
440 if(aCtx.IsPointInFace(aF1, aP2D)) {
441 aP=aS1->Value(aU, aV);
442 bFlag=aCtx.IsValidPointForFace(aP, aF2, aTol);
453 //=======================================================================
454 // function: FindChains
456 //=======================================================================
457 void NMTTools_Tools::FindChains(const NMTTools_ListOfCoupleOfShape& aLCS,
458 NMTTools_IndexedDataMapOfShapeIndexedMapOfShape& aMapChains)
460 NMTTools_ListIteratorOfListOfCoupleOfShape aItCS;
461 NMTTools_IndexedDataMapOfShapeIndexedMapOfShape aMCV;
463 aItCS.Initialize(aLCS);
464 for (; aItCS.More(); aItCS.Next()) {
465 const NMTTools_CoupleOfShape& aCS=aItCS.Value();
467 const TopoDS_Shape& aF1=aCS.Shape1();
468 const TopoDS_Shape& aF2=aCS.Shape2();
471 if (aMCV.Contains(aF1)) {
472 TopTools_IndexedMapOfShape& aMV=aMCV.ChangeFromKey(aF1);
477 TopTools_IndexedMapOfShape aMV;
483 if (aMCV.Contains(aF2)) {
484 TopTools_IndexedMapOfShape& aMV=aMCV.ChangeFromKey(aF2);
489 TopTools_IndexedMapOfShape aMV;
495 NMTTools_Tools::FindChains(aMCV, aMapChains);
497 //=======================================================================
498 // function: FindChains
500 //=======================================================================
501 void NMTTools_Tools::FindChains(const NMTTools_IndexedDataMapOfShapeIndexedMapOfShape& aMCV,
502 NMTTools_IndexedDataMapOfShapeIndexedMapOfShape& aMapChains)
504 Standard_Integer i, j, aNbCV, aNbV;
505 TopTools_IndexedMapOfShape aProcessed, aChain;
508 for (i=1; i<=aNbCV; ++i) {
509 const TopoDS_Shape& aF=aMCV.FindKey(i);
510 if (aProcessed.Contains(aF)) {
517 const TopTools_IndexedMapOfShape& aMV=aMCV(i);
519 for (j=1; j<=aNbV; ++j) {
520 const TopoDS_Shape& aFx=aMV(j);
521 ProcessBlock(aFx, aMCV, aProcessed, aChain);
523 aMapChains.Add(aF, aChain);
527 //=======================================================================
528 // function: ProcessBlock
530 //=======================================================================
531 void ProcessBlock(const TopoDS_Shape& aF,
532 const NMTTools_IndexedDataMapOfShapeIndexedMapOfShape& aMCV,
533 TopTools_IndexedMapOfShape& aProcessed,
534 TopTools_IndexedMapOfShape& aChain)
536 Standard_Integer j, aNbV;
538 if (aProcessed.Contains(aF)) {
544 const TopTools_IndexedMapOfShape& aMV=aMCV.FindFromKey(aF);
546 for (j=1; j<=aNbV; ++j) {
547 const TopoDS_Shape& aFx=aMV(j);
548 ProcessBlock(aFx, aMCV, aProcessed, aChain);