1 // File: GEOMAlgo_Tools_1.cxx
2 // Created: Thu May 6 10:46:21 2010
3 // Author: Peter KURNEV
7 #include <GEOMAlgo_Tools.ixx>
9 #include <NCollection_DataMap.hxx>
11 #include <gp_Pnt2d.hxx>
14 #include <Geom2dAdaptor_Curve.hxx>
15 #include <Geom2dInt_GInter.hxx>
16 #include <Geom2d_Curve.hxx>
17 #include <Geom_Curve.hxx>
18 #include <Geom_Surface.hxx>
19 #include <GeomAdaptor_Surface.hxx>
21 #include <IntRes2d_Domain.hxx>
22 #include <IntRes2d_IntersectionPoint.hxx>
23 #include <IntRes2d_Transition.hxx>
25 #include <TopoDS_Iterator.hxx>
26 #include <TopoDS_Face.hxx>
27 #include <TopoDS_Wire.hxx>
28 #include <TopoDS_Edge.hxx>
29 #include <TopoDS_Vertex.hxx>
30 #include <TopExp_Explorer.hxx>
32 #include <BRep_Tool.hxx>
33 #include <BRep_Builder.hxx>
35 #include <TopTools_MapOfShape.hxx>
36 #include <TopTools_ShapeMapHasher.hxx>
37 #include <TopTools_ListOfShape.hxx>
38 #include <TopTools_DataMapOfShapeListOfShape.hxx>
39 #include <TopTools_ListOfShape.hxx>
40 #include <TopTools_DataMapIteratorOfDataMapOfShapeListOfShape.hxx>
43 inline Standard_Boolean IsEqual(const TopoDS_Shape& aS1,
44 const TopoDS_Shape& aS2) {
45 return TopTools_ShapeMapHasher::IsEqual(aS1, aS2);
49 Standard_Boolean CorrectWire(const TopoDS_Wire& aW,
50 const TopoDS_Face& aF);
52 //=======================================================================
53 //function : CorrectWires
55 //=======================================================================
56 Standard_Boolean GEOMAlgo_Tools::CorrectWires(const TopoDS_Shape& aShape)
58 Standard_Boolean bRet;
61 TopTools_MapOfShape aMF;
62 GeomAdaptor_Surface aGAS;
63 GeomAbs_SurfaceType aTS;
68 aExp.Init(aShape, TopAbs_FACE);
69 for (; aExp.More(); aExp.Next()) {
70 const TopoDS_Face& aF=*((TopoDS_Face*)&aExp.Current());
72 const Handle(Geom_Surface)& aS=BRep_Tool::Surface(aF, aLoc);
75 if (aTS==GeomAbs_Cylinder) {
77 for (; aItF.More(); aItF.Next()) {
78 const TopoDS_Wire& aW=*((TopoDS_Wire*)&aItF.Value());
79 if (CorrectWire(aW, aF)) {
88 //=======================================================================
89 //class: GEOMAlgo_InfoEdge
91 //=======================================================================
92 class GEOMAlgo_InfoEdge {
100 ~GEOMAlgo_InfoEdge(){
103 void Init(const TopoDS_Edge& aE,
104 const TopoDS_Face& aF);
106 void SetTolInt(const Standard_Real aTolInt) {
110 const Standard_Real TolInt() const {
114 const Geom2dAdaptor_Curve& Adaptor() const {
118 const IntRes2d_Domain& Domain()const {
122 const Handle(Geom2d_Curve)& CurveOnSurface()const {
126 const Handle(Geom_Curve)& Curve()const {
130 Standard_Integer ErrorStatus()const {
131 return myErrorStatus;
135 Standard_Integer myErrorStatus;
136 Standard_Real myTolInt;
137 Geom2dAdaptor_Curve myGAC2D;
138 IntRes2d_Domain myDomain;
139 Handle(Geom2d_Curve) myC2D;
140 Handle(Geom_Curve) myC3D;
143 typedef NCollection_DataMap<TopoDS_Shape, GEOMAlgo_InfoEdge> GEOMAlgo_DataMapOfShapeInfoEdge;
144 typedef GEOMAlgo_DataMapOfShapeInfoEdge::Iterator GEOMAlgo_DataMapIteratorOfDataMapOfShapeInfoEdge;
146 //=======================================================================
149 //=======================================================================
150 void GEOMAlgo_InfoEdge::Init(const TopoDS_Edge& aE,
151 const TopoDS_Face& aF)
153 Standard_Real aT1, aT2, aT1x, aT2x;
154 gp_Pnt2d aP2D1, aP2D2;
158 myC3D=BRep_Tool::Curve(aE, aT1, aT2);
159 myC2D=BRep_Tool::CurveOnSurface(aE ,aF, aT1, aT2);
160 if (!myC2D.IsNull() && aT2>aT1) {
162 if(!myGAC2D.IsPeriodic()) {
163 aT1x=myGAC2D.FirstParameter();
164 aT2x=myGAC2D.LastParameter();
173 BRep_Tool::UVPoints(aE, aF, aP2D1, aP2D2);
174 myDomain.SetValues(aP2D1, aT1, myTolInt, aP2D2, aT2, myTolInt);
181 //=======================================================================
182 //function : CorrectWire
184 //=======================================================================
185 Standard_Boolean CorrectWire(const TopoDS_Wire& aW,
186 const TopoDS_Face& aF)
188 Standard_Boolean bRet;
189 Standard_Real aTolInt;
190 Standard_Integer iErr, aNbV, aNbE;
191 TopoDS_Iterator aItW, aItE;
192 Geom2dInt_GInter aInter;
193 GEOMAlgo_DataMapOfShapeInfoEdge aDMEIE;
194 TopTools_DataMapOfShapeListOfShape aDMVLE;
195 TopTools_DataMapIteratorOfDataMapOfShapeListOfShape aItDMVLE;
201 for (; aItW.More(); aItW.Next()) {
202 const TopoDS_Edge& aE=*((TopoDS_Edge*)&aItW.Value());
205 for (aNbV=0; aItE.More(); aItE.Next(), ++aNbV) {
211 if (!aDMEIE.IsBound(aE)) {
212 GEOMAlgo_InfoEdge aInfoEdge;
214 aInfoEdge.Init (aE, aF);
215 iErr=aInfoEdge.ErrorStatus();
220 aDMEIE.Bind(aE, aInfoEdge);
224 for (; aItE.More(); aItE.Next()) {
225 const TopoDS_Shape& aV=aItE.Value();
226 if (aDMVLE.IsBound(aV)) {
227 TopTools_ListOfShape& aLE=aDMVLE.ChangeFind(aV);
231 TopTools_ListOfShape aLE;
233 aDMVLE.Bind(aV, aLE);
239 Standard_Real aTolV, aD1, aD2, aDmax, aCoeff;
241 Handle(Geom_Surface) aS;
245 aS=BRep_Tool::Surface(aF);
247 aItDMVLE.Initialize(aDMVLE);
248 for(; aItDMVLE.More(); aItDMVLE.Next()) {
249 const TopoDS_Vertex& aV=*((TopoDS_Vertex*)&aItDMVLE.Key());
250 const TopTools_ListOfShape& aLE=aItDMVLE.Value();
256 aPV=BRep_Tool::Pnt(aV);
257 aTolV=BRep_Tool::Tolerance(aV);
259 const TopoDS_Edge& aE1=*((TopoDS_Edge*)&aLE.First());
260 const GEOMAlgo_InfoEdge& aIE1=aDMEIE.Find(aE1);
261 const Geom2dAdaptor_Curve& aGAC1=aIE1.Adaptor();
262 const IntRes2d_Domain& aDomain1=aIE1.Domain();
264 const TopoDS_Edge& aE2=*((TopoDS_Edge*)&aLE.Last());
265 const GEOMAlgo_InfoEdge& aIE2=aDMEIE.Find(aE2);
266 const Geom2dAdaptor_Curve& aGAC2=aIE2.Adaptor();
267 const IntRes2d_Domain& aDomain2=aIE2.Domain();
269 aInter.Perform(aGAC1, aDomain1,aGAC2, aDomain2, aTolInt, aTolInt);
270 if(!aInter.IsDone()) {
274 Standard_Integer i, aNbP;
275 Standard_Real aIP_ParamOnFirst, aIP_ParamOnSecond;
277 gp_Pnt2d aP2D1, aP2D2;
278 IntRes2d_Transition aTr1, aTr2;
280 aNbP=aInter.NbPoints();
281 for (i=1; i<=aNbP; ++i) {
282 const IntRes2d_IntersectionPoint& aIP = aInter.Point(i);
283 aIP_ParamOnFirst = aIP.ParamOnFirst();
284 aIP_ParamOnSecond = aIP.ParamOnSecond();
285 aTr1 =aIP.TransitionOfFirst();
286 aTr2 =aIP.TransitionOfSecond();
287 if(aTr1.PositionOnCurve()==IntRes2d_Middle ||
288 aTr2.PositionOnCurve()==IntRes2d_Middle) {
290 const Handle(Geom_Curve)& aC3D1=aIE1.Curve();
291 if (!aC3D1.IsNull()) {
292 aP3D1=aC3D1->Value(aIP_ParamOnFirst);
295 aP2D1=aGAC1.Value(aIP_ParamOnFirst);
296 aS->D0(aP2D1.X(), aP2D1.Y(), aP3D1);
299 const Handle(Geom_Curve)& aC3D2=aIE2.Curve();
300 if (!aC3D2.IsNull()) {
301 aP3D2=aC3D2->Value(aIP_ParamOnSecond);
304 aP2D2=aGAC2.Value(aIP_ParamOnSecond);
305 aS->D0(aP2D2.X(), aP2D2.Y(), aP3D2);
308 aD1=aPV.Distance(aP3D1);
309 aD2=aPV.Distance(aP3D2);
310 aDmax=(aD1>aD2)? aD1 : aD2;
311 if (aDmax>aCoeff*aTolV) {
312 if (aDmax<10.*aTolV){
313 aBB.UpdateVertex(aV, aDmax);
318 }//for (i=1; i<=aNbP; ++i) {
319 }//for(; aItDMVLE.More(); aItDMVLE.Next()) {