1 // File: GEOMAlgo_Tools.cxx
2 // Created: Mon Dec 6 11:35:29 2004
3 // Author: Peter KURNEV
6 #include <GEOMAlgo_Tools.ixx>
10 #include <Geom_Surface.hxx>
11 #include <Geom_Curve.hxx>
13 #include <GeomAPI_ProjectPointOnSurf.hxx>
15 #include <TopAbs_ShapeEnum.hxx>
18 #include <TopoDS_Shape.hxx>
19 #include <TopoDS_Edge.hxx>
21 #include <TopTools_ListOfShape.hxx>
22 #include <TopTools_ListIteratorOfListOfShape.hxx>
23 #include <TopTools_IndexedMapOfShape.hxx>
25 #include <BRep_Tool.hxx>
26 #include <BOPTools_Tools2D.hxx>
27 #include <BRepTools.hxx>
29 #include <BOPTools_Tools2D.hxx>
30 #include <IntTools_Context.hxx>
32 #include <GEOMAlgo_PassKey.hxx>
33 #include <GEOMAlgo_IndexedDataMapOfPassKeyListOfShape.hxx>
35 //=======================================================================
36 //function : RefineSDShapes
38 //=======================================================================
39 Standard_Integer GEOMAlgo_Tools::RefineSDShapes(GEOMAlgo_IndexedDataMapOfPassKeyListOfShape &aMPKLE,
40 const Standard_Real aTol,
41 IntTools_Context& aCtx)
43 Standard_Integer i, aNbE, iErr, j, aNbEE, aNbToAdd;
44 TopTools_IndexedDataMapOfShapeListOfShape aMEE, aMSDE, aMEToAdd;
49 for (i=1; i<=aNbE; ++i) {
50 TopTools_ListOfShape& aLSDE=aMPKLE.ChangeFromIndex(i);
53 iErr=GEOMAlgo_Tools::FindSDShapes(aLSDE, aTol, aMEE, aCtx);
60 continue; // nothing to do
63 for (j=1; j<=aNbEE; ++j) {
64 TopTools_ListOfShape& aLEE=aMEE.ChangeFromIndex(j);
71 const TopoDS_Shape& aE1=aLEE.First();
72 aMEToAdd.Add(aE1, aLEE);
77 aNbToAdd=aMEToAdd.Extent();
82 for (i=1; i<=aNbToAdd; ++i) {
83 GEOMAlgo_PassKey aPKE1;
85 const TopoDS_Shape& aE1=aMEToAdd.FindKey(i);
86 const TopTools_ListOfShape& aLE=aMEToAdd(i);
89 aMPKLE.Add(aPKE1, aLE);
94 //=======================================================================
95 //function : FindSDShapes
97 //=======================================================================
98 Standard_Integer GEOMAlgo_Tools::FindSDShapes(const TopTools_ListOfShape& aLE,
99 const Standard_Real aTol,
100 TopTools_IndexedDataMapOfShapeListOfShape& aMEE,
101 IntTools_Context& aCtx)
103 Standard_Integer aNbE, aNbEProcessed, aNbESD, iErr;
104 TopTools_ListOfShape aLESD;
105 TopTools_ListIteratorOfListOfShape aIt, aIt1;
106 TopTools_IndexedMapOfShape aMProcessed;
114 aNbEProcessed=aMProcessed.Extent();
115 if (aNbEProcessed==aNbE) {
120 for (; aIt.More(); aIt.Next()) {
121 const TopoDS_Shape& aS=aIt.Value();
122 if (aMProcessed.Contains(aS)) {
127 iErr=GEOMAlgo_Tools::FindSDShapes(aS, aLE, aTol, aLESD, aCtx);
132 aNbESD=aLESD.Extent();
139 aIt1.Initialize(aLESD);
140 for (; aIt1.More(); aIt1.Next()) {
141 const TopoDS_Shape& aE1=aIt1.Value();
142 aMProcessed.Add(aE1);
148 //=======================================================================
149 //function : FindSDShapes
151 //=======================================================================
152 Standard_Integer GEOMAlgo_Tools::FindSDShapes(const TopoDS_Shape& aE1,
153 const TopTools_ListOfShape& aLE,
154 const Standard_Real aTol,
155 TopTools_ListOfShape& aLESD,
156 IntTools_Context& aCtx)
158 Standard_Boolean bIsDone;
159 Standard_Real aTol2, aD2;
161 TopTools_ListIteratorOfListOfShape aIt;
164 GEOMAlgo_Tools::PointOnShape(aE1, aP1);
167 for (; aIt.More(); aIt.Next()) {
168 const TopoDS_Shape& aE2=aIt.Value();
169 if (aE2.IsSame(aE1)) {
173 bIsDone=GEOMAlgo_Tools::ProjectPointOnShape(aP1, aE2, aP2, aCtx);
177 aD2=aP1.SquareDistance(aP2);
186 //=======================================================================
187 //function : ProjectPointOnShape
189 //=======================================================================
190 Standard_Boolean GEOMAlgo_Tools::ProjectPointOnShape(const gp_Pnt& aP1,
191 const TopoDS_Shape& aS,
193 IntTools_Context& aCtx)
195 Standard_Boolean bIsDone=Standard_False;
197 TopAbs_ShapeEnum aType;
199 aType=aS.ShapeType();
202 const TopoDS_Edge& aE2=TopoDS::Edge(aS);
204 bIsDone=aCtx.ProjectPointOnEdge(aP1, aE2, aT2);
209 GEOMAlgo_Tools::PointOnEdge(aE2, aT2, aP2);
214 const TopoDS_Face& aF2=TopoDS::Face(aS);
215 GeomAPI_ProjectPointOnSurf& aProj=aCtx.ProjPS(aF2);
218 bIsDone=aProj.IsDone();
223 aP2=aProj.NearestPoint();
232 //=======================================================================
233 //function : PointOnShape
235 //=======================================================================
236 void GEOMAlgo_Tools::PointOnShape(const TopoDS_Shape& aS,
239 TopAbs_ShapeEnum aType;
241 aP3D.SetCoord(99.,99.,99.);
242 aType=aS.ShapeType();
245 const TopoDS_Edge& aE=TopoDS::Edge(aS);
246 GEOMAlgo_Tools::PointOnEdge(aE, aP3D);
251 const TopoDS_Face& aF=TopoDS::Face(aS);
252 GEOMAlgo_Tools::PointOnFace(aF, aP3D);
260 //=======================================================================
261 //function : PointOnFace
263 //=======================================================================
264 void GEOMAlgo_Tools::PointOnFace(const TopoDS_Face& aF,
267 Standard_Real aU, aV, aUMin, aUMax, aVMin, aVMax;
269 BRepTools::UVBounds(aF, aUMin, aUMax, aVMin, aVMax);
271 aU=BOPTools_Tools2D::IntermediatePoint(aUMin, aUMax);
272 aV=BOPTools_Tools2D::IntermediatePoint(aVMin, aVMax);
274 GEOMAlgo_Tools::PointOnFace(aF, aU, aV, aP3D);
276 //=======================================================================
277 //function : PointOnFace
279 //=======================================================================
280 void GEOMAlgo_Tools::PointOnFace(const TopoDS_Face& aF,
281 const Standard_Real aU,
282 const Standard_Real aV,
285 Handle(Geom_Surface) aS;
287 aS=BRep_Tool::Surface(aF);
288 aS->D0(aU, aV, aP3D);
290 //=======================================================================
291 //function : PointOnEdge
293 //=======================================================================
294 void GEOMAlgo_Tools::PointOnEdge(const TopoDS_Edge& aE,
297 Standard_Real aTx, aT1, aT2;
299 BRep_Tool::Curve(aE, aT1, aT2);
300 aTx=BOPTools_Tools2D::IntermediatePoint(aT1, aT2);
301 GEOMAlgo_Tools::PointOnEdge(aE, aTx, aP3D);
303 //=======================================================================
304 //function : PointOnEdge
306 //=======================================================================
307 void GEOMAlgo_Tools::PointOnEdge(const TopoDS_Edge& aE,
308 const Standard_Real aT,
311 Standard_Real aT1, aT2;
312 Handle(Geom_Curve) aC3D;
314 aC3D=BRep_Tool::Curve(aE, aT1, aT2);
318 //=======================================================================
319 //function : FindSDEdges
321 //=======================================================================
322 Standard_Integer GEOMAlgo_Tools::FindSDEdges(const TopoDS_Edge& aE1,
323 const TopTools_ListOfShape& aLE,
324 const Standard_Real aTol,
325 TopTools_ListOfShape& aLESD,
326 IntTools_Context& aCtx)
328 Standard_Boolean bIsDone;
329 Standard_Real aT2, aTol2, aD2;
331 TopTools_ListIteratorOfListOfShape aIt;
335 GEOMAlgo_Tools::PointOnEdge(aE1, aP1);
337 for (; aIt.More(); aIt.Next()) {
338 const TopoDS_Edge& aE2=TopoDS::Edge(aIt.Value());
339 if (aE2.IsSame(aE1)) {
343 bIsDone=aCtx.ProjectPointOnEdge(aP1, aE2, aT2);
347 GEOMAlgo_Tools::PointOnEdge(aE2, aT2, aP2);
348 aD2=aP1.SquareDistance(aP2);
356 //=======================================================================
357 //function : FindSDFaces
359 //=======================================================================
360 Standard_Integer GEOMAlgo_Tools::FindSDFaces(const TopoDS_Face& aF1,
361 const TopTools_ListOfShape& aLF,
362 const Standard_Real aTol,
363 TopTools_ListOfShape& aLFSD,
364 IntTools_Context& aCtx)
366 Standard_Boolean bIsDone;
367 Standard_Real aTol2, aD2;
369 TopTools_ListIteratorOfListOfShape aIt;
373 GEOMAlgo_Tools::PointOnFace(aF1, aP1);
375 for (; aIt.More(); aIt.Next()) {
376 const TopoDS_Face& aF2=TopoDS::Face(aIt.Value());
377 if (aF2.IsSame(aF1)) {
381 GeomAPI_ProjectPointOnSurf& aProj=aCtx.ProjPS(aF2);
383 bIsDone=aProj.IsDone();
388 aP2=aProj.NearestPoint();
389 aD2=aP1.SquareDistance(aP2);