7fd59977 |
1 | // File: BOPTools_PCurveMaker.cxx |
2 | // Created: Wed May 30 09:45:32 2001 |
3 | // Author: Peter KURNEV |
4 | // <pkv@irinox> |
5 | |
6 | |
7 | #include <BOPTools_PCurveMaker.ixx> |
8 | |
9 | #include <gp_Pnt2d.hxx> |
10 | |
11 | #include <Precision.hxx> |
12 | |
13 | #include <Geom_Curve.hxx> |
14 | #include <Geom_TrimmedCurve.hxx> |
15 | #include <Geom2d_Curve.hxx> |
16 | #include <GeomAdaptor_Curve.hxx> |
17 | #include <GeomAdaptor_HCurve.hxx> |
18 | |
19 | #include <TopoDS.hxx> |
20 | #include <TopoDS_Face.hxx> |
21 | #include <TopoDS_Edge.hxx> |
22 | #include <TopoDS_Vertex.hxx> |
23 | |
24 | #include <TopExp.hxx> |
25 | #include <TopTools_IndexedMapOfShape.hxx> |
26 | |
27 | #include <BRep_Tool.hxx> |
28 | #include <BRep_Builder.hxx> |
29 | #include <BRepAdaptor_HSurface.hxx> |
30 | |
31 | #include <BRepAdaptor_Surface.hxx> |
32 | #include <BRepTools.hxx> |
33 | |
34 | #include <BooleanOperations_ShapesDataStructure.hxx> |
35 | |
36 | #include <IntTools_Curve.hxx> |
37 | |
38 | #include <BOPTools_InterferencePool.hxx> |
39 | #include <BOPTools_CArray1OfSSInterference.hxx> |
40 | #include <BOPTools_SSInterference.hxx> |
41 | #include <BOPTools_SequenceOfCurves.hxx> |
42 | #include <BOPTools_Curve.hxx> |
43 | #include <BOPTools_ListOfPaveBlock.hxx> |
44 | #include <BOPTools_ListIteratorOfListOfPaveBlock.hxx> |
45 | #include <BOPTools_PaveBlock.hxx> |
46 | #include <BOPTools_Tools2D.hxx> |
47 | |
48 | |
49 | //======================================================================= |
50 | // function: BOPTools_PCurveMaker |
51 | // purpose: |
52 | //======================================================================= |
53 | BOPTools_PCurveMaker::BOPTools_PCurveMaker(const BOPTools_PaveFiller& aFiller) |
54 | : |
55 | myIsDone(Standard_False) |
56 | { |
57 | myFiller=(BOPTools_PaveFiller*) &aFiller; |
58 | myDS=myFiller->DS(); |
59 | } |
60 | //======================================================================= |
61 | // function: IsDone |
62 | // purpose: |
63 | //======================================================================= |
64 | Standard_Boolean BOPTools_PCurveMaker::IsDone() const |
65 | { |
66 | return myIsDone; |
67 | } |
68 | //======================================================================= |
69 | // function: Do |
70 | // purpose: |
71 | //======================================================================= |
72 | void BOPTools_PCurveMaker::Do() |
73 | { |
74 | |
75 | BOPTools_CArray1OfSSInterference& aFFs=(myFiller->InterfPool())->SSInterferences(); |
76 | |
77 | Standard_Integer i, aNb, nF1, nF2, nE; |
78 | BOPTools_ListIteratorOfListOfPaveBlock anIt; |
79 | |
80 | aNb=aFFs.Extent(); |
81 | for (i=1; i<=aNb; i++) { |
82 | BOPTools_SSInterference& aFF=aFFs(i); |
83 | // Faces |
84 | nF1=aFF.Index1(); |
85 | const TopoDS_Face& aF1=TopoDS::Face(myDS->Shape(nF1)); |
86 | nF2=aFF.Index2(); |
87 | const TopoDS_Face& aF2=TopoDS::Face(myDS->Shape(nF2)); |
88 | // |
89 | // 1.Forwarding the Faces |
90 | TopoDS_Face aF1FWD=aF1; |
91 | aF1FWD.Orientation(TopAbs_FORWARD); |
92 | TopoDS_Face aF2FWD=aF2; |
93 | aF2FWD.Orientation(TopAbs_FORWARD); |
94 | // |
95 | // 2. In, On parts processing |
96 | const BOPTools_ListOfPaveBlock& aLPBInOn=aFF.PaveBlocks(); |
97 | anIt.Initialize(aLPBInOn); |
98 | for (; anIt.More(); anIt.Next()) { |
99 | const BOPTools_PaveBlock& aPBInOn=anIt.Value(); |
100 | nE=aPBInOn.Edge(); |
101 | const TopoDS_Edge& aE=TopoDS::Edge(myDS->Shape(nE)); |
102 | |
103 | BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF1FWD); |
104 | BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF2FWD); |
105 | } |
106 | // |
107 | // 3. Section Edges processing |
108 | Standard_Integer j, aNbCurves, k, aNbV; |
109 | BOPTools_SequenceOfCurves& aSC=aFF.Curves(); |
110 | aNbCurves=aSC.Length(); |
111 | for (j=1; j<=aNbCurves; j++) { |
112 | const BOPTools_Curve& aBC=aSC(j); |
113 | const BOPTools_ListOfPaveBlock& aLPB=aBC.NewPaveBlocks(); |
114 | anIt.Initialize(aLPB); |
115 | for (; anIt.More(); anIt.Next()) { |
116 | const BOPTools_PaveBlock& aPB=anIt.Value(); |
117 | nE=aPB.Edge(); |
118 | const TopoDS_Edge& aE=TopoDS::Edge(myDS->Shape(nE)); |
119 | // |
120 | Standard_Real aTolEdge, aTolR2D, aTolFact, aTolV, aTolVmax; |
121 | // |
122 | aTolEdge=BRep_Tool::Tolerance(aE); |
123 | aTolR2D=aFF.TolR2D(); |
124 | aTolFact=Max(aTolEdge, aTolR2D); |
125 | // |
126 | // Check vertices tolerances and correct them if necessary |
127 | // to prevent situation when TolE > TolV |
128 | // |
129 | TopTools_IndexedMapOfShape aVMap; |
130 | TopExp::MapShapes(aE, TopAbs_VERTEX, aVMap); |
131 | |
132 | aTolVmax=-1.; |
133 | aNbV=aVMap.Extent(); |
134 | for (k=1; k<=aNbV; ++k) { |
135 | const TopoDS_Vertex& aV=TopoDS::Vertex(aVMap(k)); |
136 | aTolV=BRep_Tool::Tolerance(aV); |
137 | if (aTolV>aTolVmax) { |
138 | aTolVmax=aTolV; |
139 | } |
140 | } |
141 | // |
142 | if (aTolFact>aTolVmax) { |
143 | aTolFact=aTolVmax; |
144 | } |
145 | // |
146 | BRep_Builder aBB; |
147 | const IntTools_Curve& aIC=aBC.Curve(); |
148 | |
149 | //ZZ const Handle(Geom_Curve)& aC3D=aIC.Curve(); |
150 | // |
151 | Standard_Real aTFirst, aTLast, aOutFirst, aOutLast, aOutTol; |
152 | const Handle(Geom_Curve)& aC3DE=BRep_Tool::Curve(aE, aTFirst, aTLast); |
153 | Handle(Geom_TrimmedCurve)aC3DETrim=new Geom_TrimmedCurve(aC3DE, aTFirst, aTLast); |
154 | // |
155 | //modified by NIZNHY-PKV Wed Sep 3 11:13:41 2003 f |
156 | Handle(Geom2d_Curve) aC2D1, aC2D1A, aC2D2, aC2D2A; |
157 | // |
158 | aC2D1=aIC.FirstCurve2d(); |
159 | if (aC2D1.IsNull()) { |
160 | BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF1FWD); |
161 | BOPTools_Tools2D::CurveOnSurface(aE, aF1FWD, aC2D1, aOutFirst, aOutLast, aOutTol, Standard_True); |
162 | } |
163 | //const Handle(Geom2d_Curve)& aC2D1=aIC.FirstCurve2d(); |
164 | //Handle(Geom2d_Curve) aC2D1A; |
165 | //modified by NIZNHY-PKV Wed Sep 3 11:13:48 2003 t |
166 | // |
167 | if (aC3DE->IsPeriodic()) { |
168 | BOPTools_Tools2D::AdjustPCurveOnFace(aF1FWD, aTFirst, aTLast, aC2D1, aC2D1A); |
169 | } |
170 | else { |
171 | BOPTools_Tools2D::AdjustPCurveOnFace(aF1FWD, aC3DETrim, aC2D1, aC2D1A); |
172 | } |
173 | // |
174 | aBB.UpdateEdge(aE, aC2D1A, aF1FWD, aTolFact); |
175 | |
176 | //modified by NIZNHY-PKV Wed Sep 3 11:23:00 2003 f |
177 | aC2D2=aIC.SecondCurve2d(); |
178 | if (aC2D2.IsNull()) { |
179 | BOPTools_Tools2D::BuildPCurveForEdgeOnFace(aE, aF2FWD); |
180 | BOPTools_Tools2D::CurveOnSurface(aE, aF2FWD, aC2D2, aOutFirst, aOutLast, aOutTol, Standard_True); |
181 | } |
182 | //const Handle(Geom2d_Curve)& aC2D2=aIC.SecondCurve2d(); |
183 | //Handle(Geom2d_Curve) aC2D2A; |
184 | //modified by NIZNHY-PKV Wed Sep 3 11:23:12 2003 t |
185 | // |
186 | if (aC3DE->IsPeriodic()) { |
187 | BOPTools_Tools2D::AdjustPCurveOnFace(aF2FWD, aTFirst, aTLast, aC2D2, aC2D2A); |
188 | } |
189 | else { |
190 | BOPTools_Tools2D::AdjustPCurveOnFace(aF2FWD, aC3DETrim, aC2D2, aC2D2A); |
191 | } |
192 | // |
193 | aBB.UpdateEdge(aE, aC2D2A, aF2FWD, aTolFact); |
194 | } |
195 | }// for (j=1; j<=aNbCurves; j++) |
196 | |
197 | } // for (i=1; i<=aNb; i++) |
198 | myIsDone=Standard_True; |
199 | } |
200 | |