Commit | Line | Data |
---|---|---|
b311480e | 1 | // Created on: 1995-03-29 |
2 | // Created by: Frederic MAUPAS | |
3 | // Copyright (c) 1995-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. | |
b311480e | 16 | |
7fd59977 | 17 | // gka 21.08.98 PRO7656 |
18 | // gka 15.12.98 UKI60591 #1274560 | |
19 | //pdn 18.12.98 to keep pcurves | |
20 | //:o0 abv 16.02.99: POLYLINE allowed as 3d curve of edge | |
21 | //: abv 07.04.99: S4136: improve tolerance management and dealing with pcurves | |
22 | // rln 02.06.99 removing #include <StepToTopoDS_DegeneratedTool.hxx> | |
23 | // smh 31.01.01 BUC60810 : IsNull protection | |
7fd59977 | 24 | |
25 | #include <BRep_Builder.hxx> | |
7fd59977 | 26 | #include <BRep_CurveRepresentation.hxx> |
7fd59977 | 27 | #include <BRep_ListIteratorOfListOfCurveRepresentation.hxx> |
42cf5bc1 | 28 | #include <BRep_ListOfCurveRepresentation.hxx> |
29 | #include <BRep_TEdge.hxx> | |
30 | #include <BRep_Tool.hxx> | |
31 | #include <ElCLib.hxx> | |
7fd59977 | 32 | #include <Geom2d_BoundedCurve.hxx> |
42cf5bc1 | 33 | #include <Geom2d_Curve.hxx> |
7fd59977 | 34 | #include <Geom2d_Line.hxx> |
42cf5bc1 | 35 | #include <Geom_Curve.hxx> |
36 | #include <Geom_Plane.hxx> | |
37 | #include <Geom_RectangularTrimmedSurface.hxx> | |
38 | #include <Geom_Surface.hxx> | |
7fd59977 | 39 | #include <gp_Pnt.hxx> |
40 | #include <gp_Pnt2d.hxx> | |
7fd59977 | 41 | #include <Interface_Static.hxx> |
42cf5bc1 | 42 | #include <Precision.hxx> |
7fd59977 | 43 | #include <ShapeAlgo.hxx> |
44 | #include <ShapeAlgo_AlgoContainer.hxx> | |
45 | #include <ShapeAlgo_ToolContainer.hxx> | |
42cf5bc1 | 46 | #include <ShapeAnalysis_Curve.hxx> |
47 | #include <ShapeAnalysis_Edge.hxx> | |
48 | #include <ShapeBuild_Edge.hxx> | |
49 | #include <ShapeExtend_WireData.hxx> | |
50 | #include <ShapeFix_EdgeProjAux.hxx> | |
d088c9c2 | 51 | #include <Standard_ErrorHandler.hxx> |
42cf5bc1 | 52 | #include <StdFail_NotDone.hxx> |
53 | #include <StepGeom_Curve.hxx> | |
54 | #include <StepGeom_Pcurve.hxx> | |
55 | #include <StepGeom_PcurveOrSurface.hxx> | |
ec357c5c | 56 | #include <StepGeom_Polyline.hxx> |
42cf5bc1 | 57 | #include <StepGeom_Surface.hxx> |
58 | #include <StepGeom_SurfaceCurve.hxx> | |
59 | #include <StepRepr_DefinitionalRepresentation.hxx> | |
60 | #include <StepShape_Edge.hxx> | |
61 | #include <StepShape_EdgeCurve.hxx> | |
62 | #include <StepShape_EdgeLoop.hxx> | |
63 | #include <StepShape_FaceBound.hxx> | |
64 | #include <StepShape_OrientedEdge.hxx> | |
65 | #include <StepShape_Vertex.hxx> | |
caaeed1b | 66 | #include <StepToGeom.hxx> |
42cf5bc1 | 67 | #include <StepToTopoDS.hxx> |
68 | #include <StepToTopoDS_GeometricTool.hxx> | |
69 | #include <StepToTopoDS_NMTool.hxx> | |
70 | #include <StepToTopoDS_Tool.hxx> | |
71 | #include <StepToTopoDS_TranslateEdge.hxx> | |
72 | #include <StepToTopoDS_TranslateEdgeLoop.hxx> | |
73 | #include <StepToTopoDS_TranslateVertex.hxx> | |
74 | #include <TopAbs.hxx> | |
75 | #include <TopExp.hxx> | |
76 | #include <TopExp_Explorer.hxx> | |
77 | #include <TopLoc_Location.hxx> | |
78 | #include <TopoDS.hxx> | |
79 | #include <TopoDS_Edge.hxx> | |
80 | #include <TopoDS_Face.hxx> | |
81 | #include <TopoDS_Iterator.hxx> | |
82 | #include <TopoDS_Shape.hxx> | |
83 | #include <TopoDS_Vertex.hxx> | |
84 | #include <TopoDS_Wire.hxx> | |
85 | #include <Transfer_TransientProcess.hxx> | |
86 | #include <XSAlgo.hxx> | |
87 | #include <XSAlgo_AlgoContainer.hxx> | |
7fd59977 | 88 | |
89 | // ============================================================================ | |
90 | // Method : RemoveSinglePCurve | |
91 | // Purpose : | |
92 | // ============================================================================ | |
7fd59977 | 93 | static void RemoveSinglePCurve (const TopoDS_Edge& aEdge, const TopoDS_Face& aFace) |
94 | { | |
95 | ShapeBuild_Edge().RemovePCurve (aEdge, aFace); | |
96 | } | |
97 | ||
98 | // ============================================================================ | |
99 | // Method : RemovePCurves | |
100 | // Purpose : | |
101 | // ============================================================================ | |
102 | ||
103 | static void RemovePCurves(const TopoDS_Wire& aWire, const TopoDS_Face& aFace) | |
104 | { | |
105 | TopExp_Explorer EdgeExp(aWire, TopAbs_EDGE); | |
106 | while (EdgeExp.More()) { | |
107 | const TopoDS_Edge& myEdge = TopoDS::Edge(EdgeExp.Current()); | |
108 | RemoveSinglePCurve(myEdge,aFace); | |
109 | EdgeExp.Next(); | |
110 | } | |
111 | } | |
112 | ||
113 | // ============================================================================ | |
114 | // Method : CheckPCurves | |
115 | // Purpose : Checks the pcurves topological trimming parameter consistency | |
116 | // and deviation between 2D ans 3D | |
117 | // ============================================================================ | |
118 | ||
119 | static void CheckPCurves (TopoDS_Wire& aWire, const TopoDS_Face& aFace, | |
120 | const Standard_Boolean isPlane,const Standard_Real preci ) | |
121 | { | |
122 | if (isPlane) { RemovePCurves (aWire,aFace);return; } | |
123 | BRep_Builder B; | |
124 | Standard_Real w1, w2, cf, cl; | |
125 | Handle(Geom_Surface) mySurf = BRep_Tool::Surface(aFace); | |
126 | ||
127 | Handle(ShapeExtend_WireData) sbwd = new ShapeExtend_WireData ( aWire ); | |
128 | for (Standard_Integer i = 1; i <= sbwd->NbEdges(); i++) { | |
129 | const TopoDS_Edge& myEdge = sbwd->Edge(i); | |
130 | // B.SameRange( myEdge, Standard_True ); | |
131 | // B.SameParameter ( myEdge, Standard_True ); | |
132 | ||
133 | // First Check : 2D Parameters on Edge : | |
134 | // Case 1 : w1 == w2 illegal => Drop the PCurve | |
135 | // Case 2 : on bounded curve w1 < FirstParameter => w1 = FirstParameter | |
136 | // w2 > LastParameter => w2 = LastParameter | |
137 | ||
138 | Handle(Geom2d_Curve) thePC; | |
139 | ShapeAnalysis_Edge sae; | |
140 | if (!sae.PCurve (myEdge, aFace, thePC, w1, w2, Standard_False )) { | |
141 | continue; | |
142 | } | |
143 | cf = thePC->FirstParameter(); | |
144 | cl = thePC->LastParameter(); | |
145 | ||
146 | if (w1 == w2) { | |
147 | RemoveSinglePCurve(myEdge,aFace); | |
0797d9d3 | 148 | #ifdef OCCT_DEBUG |
7fd59977 | 149 | cout<<"Removing pcuve w1=w2"<<endl; |
150 | #endif | |
151 | continue; | |
152 | } | |
153 | ||
154 | if (w1 < cf) { | |
155 | B.Range(myEdge, aFace, cf, w2); | |
156 | w1 = cf; | |
157 | } | |
158 | if (w2 > cl) { | |
159 | B.Range(myEdge, aFace, w1, cl); | |
160 | w2 = cf; | |
161 | } | |
bcf045cf | 162 | |
163 | if (w1 > w2 && mySurf->IsUPeriodic()) | |
164 | { | |
165 | Standard_Real u1,u2,v1,v2; | |
166 | mySurf->Bounds(u1,u2,v1,v2); | |
167 | ElCLib::AdjustPeriodic(u1, u2, | |
168 | Min(Abs(w2-w1)/2,Precision::PConfusion()), | |
169 | w1, w2); | |
170 | B.Range(myEdge, aFace, w1, w2); | |
171 | } | |
172 | ||
7fd59977 | 173 | |
174 | // advanced check | |
175 | XSAlgo::AlgoContainer()->CheckPCurve (myEdge, aFace, preci, sbwd->IsSeam(i) ); | |
176 | } | |
177 | } | |
178 | ||
179 | // ============================================================================ | |
180 | // Method : StepToTopoDS_TranslateEdgeLoop::StepToTopoDS_TranslateEdgeLoop | |
181 | // Purpose : Empty Constructor | |
182 | // ============================================================================ | |
183 | ||
184 | StepToTopoDS_TranslateEdgeLoop::StepToTopoDS_TranslateEdgeLoop() | |
185 | { | |
186 | done = Standard_False; | |
187 | } | |
188 | ||
189 | // ============================================================================ | |
190 | // Method : StepToTopoDS_TranslateEdgeLoop::StepToTopoDS_TranslateEdgeLoop | |
191 | // Purpose : Constructor with a FaceSurface and a Tool | |
192 | // ============================================================================ | |
193 | ||
194 | StepToTopoDS_TranslateEdgeLoop::StepToTopoDS_TranslateEdgeLoop(const Handle(StepShape_FaceBound)& FB, | |
195 | const TopoDS_Face& Face, | |
196 | const Handle(Geom_Surface)& GeomSurf, | |
197 | const Handle(StepGeom_Surface)& StepSurf, | |
198 | const Standard_Boolean sameSense, | |
199 | StepToTopoDS_Tool& T, | |
200 | StepToTopoDS_NMTool& NMTool) { | |
201 | Init(FB, Face, GeomSurf, StepSurf, sameSense, T, NMTool); | |
202 | } | |
203 | ||
204 | // ============================================================================ | |
205 | // Method : Init | |
206 | // Purpose : Init with a EdgeLoop and a Tool | |
207 | // ============================================================================ | |
208 | ||
209 | void StepToTopoDS_TranslateEdgeLoop::Init(const Handle(StepShape_FaceBound)& FaceBound, | |
210 | const TopoDS_Face& Face, | |
211 | const Handle(Geom_Surface)& GeomSurf, | |
212 | const Handle(StepGeom_Surface)& StepSurf, | |
213 | const Standard_Boolean sameSense, | |
214 | StepToTopoDS_Tool& aTool, | |
215 | StepToTopoDS_NMTool& NMTool) { | |
216 | done = Standard_True; | |
217 | Handle(StepShape_EdgeLoop) EL = | |
218 | Handle(StepShape_EdgeLoop)::DownCast(FaceBound->Bound()); | |
219 | ||
220 | if (aTool.IsBound(EL)) { | |
221 | myResult = TopoDS::Wire(aTool.Find(EL)); | |
222 | myError = StepToTopoDS_TranslateEdgeLoopDone; | |
223 | done = Standard_True; | |
224 | return; | |
225 | } | |
226 | Standard_Integer modepcurve = Interface_Static::IVal("read.surfacecurve.mode"); | |
227 | // 0,1 : suivre le code, 2 : ne prendre que pcurve, 3 : ne prendre que C3D | |
228 | ||
229 | BRep_Builder B; | |
230 | Handle(Transfer_TransientProcess) TP = aTool.TransientProcess(); | |
231 | ||
232 | Standard_Real preci = Precision(); | |
233 | TopoDS_Wire W; | |
234 | TopoDS_Edge E; | |
235 | TopoDS_Vertex V; | |
236 | ||
237 | // Standard_Real U1,U2, U1a, U1b, U2a, U2b; | |
238 | ||
239 | Standard_Boolean isSeam, isLikeSeam; | |
240 | ||
241 | Handle(StepShape_Edge) StepEdge, StepEdge1; | |
242 | Handle(StepShape_OrientedEdge) OrEdge1, OrEdge2; | |
243 | Handle(StepGeom_Curve) StepCurve, StepCurve1, StepCurve2; | |
244 | // Handle(StepGeom_Pcurve) StepPCurve, StepPCurve1, StepPCurve2; | |
245 | Handle(StepRepr_DefinitionalRepresentation) DRI, Dri1, Dri2; | |
246 | ||
247 | Handle(Geom2d_Curve) C2d, C2d1, C2d2, WhichC2d1, WhichC2d2; | |
248 | // unused gp_Pnt Pdeb, Pmil, Pfin, pV1, pV2; | |
249 | ||
250 | TopoDS_Edge suspectE; //:f1, degEdge; | |
251 | ||
252 | Standard_Integer j, NbEdge = EL->NbEdgeList(); | |
253 | if( NbEdge == 0) { | |
254 | TP->AddWarning(EL,"Wire not done. EdgeLoop does not contain edges."); | |
255 | done = Standard_False; | |
256 | return; | |
257 | } | |
258 | // PTV 16.09.2000 | |
259 | // default value set as Standard_True (if not correct see logic of algorithm). | |
260 | Standard_Boolean hasPcurve = Standard_True; | |
261 | Standard_Boolean isPlane = GeomSurf->IsKind(STANDARD_TYPE(Geom_Plane)); | |
262 | Handle(Geom_Surface) ConvSurf = GeomSurf; | |
263 | if (GeomSurf->IsKind(STANDARD_TYPE(Geom_RectangularTrimmedSurface))) { | |
264 | Handle(Geom_RectangularTrimmedSurface) theRTS = | |
265 | Handle(Geom_RectangularTrimmedSurface)::DownCast(GeomSurf); | |
266 | ConvSurf = theRTS->BasisSurface(); | |
267 | } | |
268 | ||
269 | aTool.ComputePCurve(Standard_False); | |
270 | ||
271 | // What is the Wire Orientation | |
272 | Standard_Boolean ForwardWire = FaceBound->Orientation(); | |
273 | ||
274 | // --- Initialize target Wire --- | |
275 | ||
276 | B.MakeWire(W); | |
277 | ||
278 | // Standard_Integer lastpcurve = 0; | |
279 | ||
280 | // ----------------------------------------------- | |
281 | // Preparation : Make Vertices + Curves3d | |
282 | // Hence, a closed curve limited by distinct vertices | |
283 | // will give a unique vertex (if same coords) | |
284 | // | |
285 | // In addition : detect shared PCurve (cf SYRKO) | |
286 | // This case may not be processed, PCurves has to be recomputed from scratch | |
287 | // ----------------------------------------------- | |
288 | // Standard_Integer theSame = 1; //gka 15.12.98 | |
289 | ||
290 | for (j=1; j<=NbEdge; j++ ) { | |
291 | OrEdge1 = EL->EdgeListValue(j); | |
292 | StepEdge = OrEdge1->EdgeElement(); | |
293 | // if(j>1 && StepEdge == StepEdge1) theSame++; //gka 15.12.98 | |
294 | StepEdge1 = StepEdge; // | |
295 | Handle(StepShape_EdgeCurve) EC = Handle(StepShape_EdgeCurve)::DownCast(StepEdge); | |
296 | Handle(StepGeom_Curve) C = EC->EdgeGeometry(); | |
2a141d40 | 297 | if (!C.IsNull()){ |
298 | if (C->IsKind(STANDARD_TYPE(StepGeom_SurfaceCurve))) { | |
299 | Handle(StepGeom_SurfaceCurve) Sc = Handle(StepGeom_SurfaceCurve)::DownCast(C); | |
300 | C = Sc->Curve3d(); | |
7fd59977 | 301 | // if (modepcurve != 3) { |
302 | // lastpcurve = StepToTopoDS_GeometricTool::PCurve (Sc,StepSurf,StepPCurve1); | |
303 | // if (StepPCurve1 == StepPCurve) modepcurve = -1; | |
304 | // StepPCurve = StepPCurve1; | |
305 | // } | |
2a141d40 | 306 | } |
7fd59977 | 307 | } |
308 | //// else if (C->IsKind(STANDARD_TYPE(StepGeom_Polyline))) { } | |
309 | // else if (C->IsKind(STANDARD_TYPE(StepGeom_Pcurve))) { | |
310 | // if (modepcurve != 3) { | |
311 | // if (C == StepPCurve) modepcurve = -1; | |
312 | // StepPCurve = Handle(StepGeom_Pcurve)::DownCast(C); | |
313 | // } | |
314 | // } | |
315 | Handle(Geom_Curve) C1; | |
316 | if (!C.IsNull()) { | |
d088c9c2 | 317 | try |
318 | { | |
319 | OCC_CATCH_SIGNALS | |
320 | C1 = Handle(Geom_Curve)::DownCast (TP->FindTransient(C)); | |
321 | if (C1.IsNull()) { | |
caaeed1b | 322 | C1 = StepToGeom::MakeCurve (C); |
323 | if (! C1.IsNull()) | |
d088c9c2 | 324 | TP->BindTransient (C,C1); |
325 | else | |
326 | TP->AddWarning(C,"Could not convert a curve. Curve definition is incorrect"); | |
327 | } | |
328 | } | |
329 | catch (Standard_Failure) | |
330 | { | |
331 | TP->AddFail(C,"Exeption was raised. Curve geometry definition is incorrect"); | |
332 | #ifdef OCCT_DEBUG | |
333 | cout << "Warning: StepToTopoDS_TranslateEdgeLoop: Exception: "; | |
334 | Standard_Failure::Caught()->Print(cout); cout << endl; | |
335 | #endif | |
7fd59977 | 336 | } |
337 | } | |
338 | ||
339 | Handle(StepShape_Vertex) Vstart, Vend; | |
340 | if (EC->SameSense()) { | |
341 | Vstart = EC->EdgeStart(); | |
342 | Vend = EC->EdgeEnd(); | |
343 | } | |
344 | else { | |
345 | Vend = EC->EdgeStart(); | |
346 | Vstart = EC->EdgeEnd(); | |
347 | } | |
348 | ||
349 | Standard_Boolean istV = aTool.IsBound(Vstart); | |
350 | Standard_Boolean iseV = aTool.IsBound(Vend); | |
351 | TopoDS_Vertex V1, V2; | |
352 | StepToTopoDS_TranslateVertex myTranVertex1(Vstart, aTool, NMTool); | |
353 | StepToTopoDS_TranslateVertex myTranVertex2(Vend, aTool, NMTool); | |
354 | ||
355 | if (myTranVertex1.IsDone()) { | |
356 | V1 = TopoDS::Vertex(myTranVertex1.Value()); | |
357 | } | |
358 | // if (Vend == Vstart) { cas normal deja assure par aTool | |
359 | // aTool.Bind (Vend,V1); | |
360 | // } | |
361 | // else | |
362 | if (myTranVertex2.IsDone()) { | |
363 | V2 = TopoDS::Vertex(myTranVertex2.Value()); | |
364 | gp_Pnt p1 = BRep_Tool::Pnt(V1); | |
365 | gp_Pnt p2 = BRep_Tool::Pnt(V2); | |
366 | if (p1.Distance(p2) <= Precision::Confusion() ) { //:S4136: preci) { | |
367 | Standard_Boolean Fixed = Standard_True; | |
368 | if(!iseV) aTool.Bind(Vend,V1); //gka 21.08.1998 bug PRO7656 | |
369 | else if(!istV) aTool.Bind (Vstart,V2); | |
370 | else aTool.Bind (Vend,V1); | |
371 | //Fixed = Standard_False; | |
372 | //aTool.Bind (Vend,V1); | |
373 | if (!C1.IsNull() && !C1->IsClosed() && Fixed) | |
374 | TP->AddWarning(EL->EdgeListValue(j), | |
375 | "Vertex of same coordinates, set confused"); | |
376 | } | |
377 | } | |
378 | } | |
379 | // if (NbEdge!=1 && theSame == NbEdge) { | |
380 | // TP->AddWarning(EL,"Wire was ignored. All edges are the same."); | |
381 | // done = Standard_False; | |
382 | // return; | |
383 | // } | |
384 | // Fixed=Standard_True; | |
385 | // if (modepcurve == -1) { | |
386 | // modepcurve = 3; | |
387 | // TP->AddWarning(EL,"Shared Pcurve not allowed, Pcurves are recomputed"); | |
388 | // } | |
389 | ||
390 | //:f6 abv 29 Apr 98: BUC50070 #3815: make sure that each two edges are | |
391 | // connected by the same vertex; else check that vertices confuse | |
392 | // and make it be one vertex | |
393 | // NOTE: this is done only for the case if at least one of edges | |
394 | // was not yet translated; else nothing will help | |
395 | for (j=1; j<=NbEdge; j++ ) { | |
396 | OrEdge1 = EL->EdgeListValue ( j ); | |
397 | OrEdge2 = EL->EdgeListValue ( j < NbEdge ? j + 1 : 1 ); | |
398 | Handle(StepShape_EdgeCurve) EC1 = | |
399 | Handle(StepShape_EdgeCurve)::DownCast ( OrEdge1->EdgeElement() ); | |
400 | Handle(StepShape_EdgeCurve) EC2 = | |
401 | Handle(StepShape_EdgeCurve)::DownCast ( OrEdge2->EdgeElement() ); | |
402 | ||
403 | Handle(StepShape_Vertex) Vs1, Vs2,Vs11,Vs22; | |
404 | Vs1 = ( OrEdge1->Orientation() ? EC1->EdgeEnd() : EC1->EdgeStart() ); | |
405 | Vs2 = ( OrEdge2->Orientation() ? EC2->EdgeStart() : EC2->EdgeEnd() ); | |
406 | ||
407 | Vs11 = ( OrEdge1->Orientation() ? EC1->EdgeStart() : EC1->EdgeEnd()); | |
408 | Vs22 = ( OrEdge2->Orientation() ? EC2->EdgeEnd() : EC2->EdgeStart() ); | |
409 | ||
410 | if((Vs1 == Vs2) || (Vs1 == Vs22) || (Vs2 == Vs11) || (Vs22 == Vs11)) continue; | |
411 | //?? if ( Vs1.IsSame(Vs2) ) continue; // OK | |
412 | ||
413 | StepToTopoDS_TranslateVertex myTranVertex1 (Vs1, aTool, NMTool); | |
414 | StepToTopoDS_TranslateVertex myTranVertex2 (Vs2, aTool, NMTool); | |
415 | ||
416 | TopoDS_Vertex V1, V2; | |
417 | if ( myTranVertex1.IsDone() ) | |
418 | V1 = TopoDS::Vertex ( myTranVertex1.Value() ); | |
419 | if ( myTranVertex2.IsDone() ) | |
420 | V2 = TopoDS::Vertex ( myTranVertex2.Value() ); | |
421 | if ( V1.IsNull() || V2.IsNull() ) continue; // not treated | |
422 | if ( V1.IsSame(V2) ) continue; // OK | |
423 | ||
424 | gp_Pnt p1 = BRep_Tool::Pnt(V1); | |
425 | gp_Pnt p2 = BRep_Tool::Pnt(V2); | |
426 | Standard_Boolean locFixed = Standard_True; | |
427 | if (p1.Distance(p2) <= preci) { | |
428 | if ( ! aTool.IsBound ( EC1 ) ) aTool.Bind ( Vs1, V2 ); | |
429 | else if ( ! aTool.IsBound ( EC2 ) ) aTool.Bind ( Vs2, V1 ); | |
430 | else locFixed = Standard_False; | |
431 | } | |
432 | else locFixed = Standard_False; | |
433 | if ( locFixed ) TP->AddWarning(EL,"Adjacent edges do not have common vertex; set confused"); | |
434 | else TP->AddWarning(EL,"Adjacent edges are not connected"); | |
435 | } | |
436 | ||
437 | // ----------------------------------------------- | |
438 | // Iteration on each Oriented Edge of the EdgeLoop | |
439 | // ----------------------------------------------- | |
440 | ||
441 | for (j=1; j<=NbEdge; j++ ) { | |
442 | ||
443 | Standard_Boolean ThereIsLikeSeam = Standard_False; | |
444 | ||
0797d9d3 | 445 | #ifdef OCCT_DEBUG |
7fd59977 | 446 | cout << " Processing Edge :" << j << endl; |
447 | #endif | |
448 | ||
449 | OrEdge1 = EL->EdgeListValue(j); | |
450 | StepEdge = OrEdge1->EdgeElement(); | |
451 | Handle(StepShape_EdgeCurve) EC = Handle(StepShape_EdgeCurve)::DownCast(StepEdge); | |
452 | ||
453 | // ---------------- | |
454 | // Map the StepEdge | |
455 | // ---------------- | |
456 | ||
457 | StepToTopoDS_TranslateEdge myTranEdge; | |
458 | ||
459 | myTranEdge.SetPrecision(preci); | |
460 | myTranEdge.SetMaxTol(MaxTol()); | |
461 | myTranEdge.Init(OrEdge1, aTool, NMTool); | |
462 | ||
463 | if (myTranEdge.IsDone()) { | |
464 | ||
465 | E = TopoDS::Edge(myTranEdge.Value()); | |
466 | if (E.IsNull()) continue; // NULL, on saute | |
467 | ||
468 | Handle(StepGeom_Curve) C = EC->EdgeGeometry(); | |
469 | ||
470 | if (OrEdge1->Orientation() && EC->SameSense()) | |
471 | E.Orientation(TopAbs_FORWARD); | |
472 | else if (!OrEdge1->Orientation() && !EC->SameSense()) | |
473 | E.Orientation(TopAbs_FORWARD); | |
474 | else E.Orientation(TopAbs_REVERSED); | |
475 | ||
476 | isSeam = isLikeSeam = Standard_False; | |
477 | ||
478 | // ------------------------------------------ | |
479 | // Map the StepEdge parametric representation | |
480 | // ------------------------------------------ | |
481 | ||
482 | // -------------------------------------------- | |
483 | // CASE 1 : The Edge Geometry is of Pcurve Type | |
484 | // -------------------------------------------- | |
2a141d40 | 485 | if (C.IsNull()) |
486 | { | |
487 | aTool.ComputePCurve(Standard_True); | |
488 | hasPcurve = Standard_False; | |
489 | } | |
490 | else if (C->IsKind(STANDARD_TYPE(StepGeom_Pcurve))) { | |
7fd59977 | 491 | Handle(StepGeom_Pcurve) StepPCurve = Handle(StepGeom_Pcurve)::DownCast(C); |
492 | C2d = myTranEdge.MakePCurve (StepPCurve,ConvSurf); | |
493 | // -- Statistics -- | |
494 | aTool.AddContinuity (C2d); | |
495 | } | |
496 | ||
497 | // ----------------------------------------- | |
498 | // CASE 2 : The curve is a SurfaceCurve i.e. | |
499 | // - a 3D Curve (mandatory) | |
500 | // - 2 PCurveOrSurface | |
501 | // If modepcurve = 3, PCurve are ignored here | |
502 | // ----------------------------------------- | |
503 | ||
504 | else if (modepcurve == 3) { | |
505 | aTool.ComputePCurve(Standard_True); | |
506 | hasPcurve = Standard_False; | |
507 | } | |
508 | else if (C->IsKind(STANDARD_TYPE(StepGeom_SurfaceCurve)) ) { | |
509 | // recouvre les cas SeamCurve et IntersectionCurve | |
510 | ||
511 | Handle(StepGeom_SurfaceCurve) SurfCurve = | |
512 | Handle(StepGeom_SurfaceCurve)::DownCast(C); | |
513 | ||
514 | Handle(StepGeom_Pcurve) StepPCurve, StepPCurve1, StepPCurve2; | |
515 | Standard_Integer lastpcurve = StepToTopoDS_GeometricTool::PCurve(SurfCurve,StepSurf,StepPCurve,0); | |
516 | hasPcurve = !StepPCurve.IsNull(); | |
517 | ||
518 | // De toute facon, on recalcule | |
519 | ||
520 | if (isPlane) hasPcurve = Standard_False; | |
521 | ||
522 | // ------------------------------------------- | |
523 | // --- Special Mapping Cases : --- | |
524 | // --- the SurfaceCurve is a SeamCurve --- | |
525 | // --- or is like a seam curve --- | |
526 | // --- (see CATIA cylinder) --- | |
527 | // ------------------------------------------- | |
528 | isLikeSeam = StepToTopoDS_GeometricTool::IsLikeSeam(SurfCurve,StepSurf,StepEdge,EL); | |
529 | ||
530 | isSeam = StepToTopoDS_GeometricTool::IsSeamCurve(SurfCurve, StepSurf,StepEdge, EL); | |
531 | ||
532 | if (isSeam || isLikeSeam) { | |
533 | // isLikeSeam = Two faces on the same Surface | |
534 | StepPCurve1 = SurfCurve->AssociatedGeometryValue(1).Pcurve(); | |
535 | StepPCurve2 = SurfCurve->AssociatedGeometryValue(2).Pcurve(); | |
536 | if (StepPCurve1.IsNull() || StepPCurve2.IsNull()) hasPcurve = Standard_False; //smh : BUC60810 | |
537 | else { | |
538 | C2d1 = myTranEdge.MakePCurve (StepPCurve1,ConvSurf); | |
539 | C2d2 = myTranEdge.MakePCurve (StepPCurve2,ConvSurf); | |
540 | hasPcurve = (!C2d1.IsNull() && !C2d2.IsNull()); | |
541 | } | |
542 | ||
543 | if (isLikeSeam) { | |
544 | suspectE = E; | |
545 | ThereIsLikeSeam = Standard_True; | |
546 | hasPcurve = Standard_True; | |
547 | } | |
548 | } | |
549 | else if (hasPcurve) { | |
550 | // GeometricTool : Pcurve a retourne StepPCurve | |
551 | while (lastpcurve > 0) { | |
552 | C2d1 = myTranEdge.MakePCurve (StepPCurve,ConvSurf); | |
553 | if (C2d1.IsNull()) { | |
82314bdf | 554 | TP->AddWarning(EC,"Incorrect pcurve is not translated. Pcurve definition is not correct"); |
7fd59977 | 555 | hasPcurve = Standard_False; |
556 | break; | |
557 | } | |
558 | else C2d = C2d1; | |
559 | lastpcurve = StepToTopoDS_GeometricTool::PCurve(SurfCurve,StepSurf,StepPCurve,lastpcurve); | |
560 | // -- Statistics -- | |
561 | aTool.AddContinuity (C2d); | |
562 | } | |
563 | } | |
564 | if (!hasPcurve) { | |
565 | // The edge geometry has no 2D representation | |
566 | aTool.ComputePCurve(Standard_True); | |
567 | } | |
568 | } | |
569 | ||
570 | // ---------------------------------------------------------- | |
571 | // CASE 3 : The EdgeCurve Geometry is not a Pcurve | |
572 | // nor a SurfaceCurve (i.e. it is a single 3D curve) | |
573 | // ---------------------------------------------------------- | |
574 | ||
575 | else { | |
576 | aTool.ComputePCurve(Standard_True); | |
577 | hasPcurve = Standard_False; | |
578 | } | |
579 | ||
580 | // ---------------------------------- | |
581 | // update the edge with the pcurve(s) | |
582 | // ---------------------------------- | |
583 | ||
584 | if (hasPcurve && (isSeam || ThereIsLikeSeam)) { | |
585 | ||
586 | // ----------------------------------------------------------- | |
587 | // The Edge is a Seam Edge : The pcurve wich is FORWARD has to | |
588 | // be identified | |
589 | // ----------------------------------------------------------- | |
590 | ||
591 | if ((!C2d1.IsNull()) && (!C2d2.IsNull())) { | |
592 | TopAbs_Orientation CumulO, EdgeO, WireO, FaceO; | |
593 | EdgeO = E.Orientation(); | |
594 | if (ForwardWire) WireO = TopAbs_FORWARD; | |
595 | else WireO = TopAbs_REVERSED; | |
596 | if (sameSense) FaceO = TopAbs_FORWARD; | |
597 | else FaceO = TopAbs_REVERSED; | |
598 | ||
599 | CumulO = TopAbs::Compose(EdgeO, WireO); | |
600 | CumulO = TopAbs::Compose(CumulO, FaceO); | |
601 | ||
602 | Standard_Boolean ForwardEdge = (CumulO == TopAbs_FORWARD); | |
603 | ||
604 | // if(!ThereIsLikeSeam) ForwardEdge = Standard_True; | |
605 | Standard_Integer forwardPC = | |
606 | ShapeAnalysis_Curve().SelectForwardSeam (C2d1,C2d2); | |
607 | if (forwardPC == 0) { | |
608 | TP->AddFail(StepEdge," Seam curve not mapped"); | |
609 | done = Standard_False; | |
610 | myError = StepToTopoDS_TranslateEdgeLoopOther; | |
611 | continue; | |
612 | } | |
613 | else if (!ForwardEdge) forwardPC = 3 - forwardPC; // inverser 1-2 | |
614 | ||
615 | if (forwardPC == 1) { | |
616 | if(isSeam) { | |
617 | // When the edge is a Seam, it is better to find the topological | |
618 | // trimming right now. | |
619 | // Remarque : pour bien faire, il faudrait, si necessaire, recalculer | |
620 | // les trois courbes de maniere a ce qu`elles soient | |
621 | // immediatement Same Range et Same Parameter. | |
622 | B.UpdateEdge(E, C2d1, C2d2, Face, 0.); | |
623 | //:S4136 FindParameter(C2d1, C2d2, E, Face, preci); | |
624 | } | |
625 | else | |
626 | B.UpdateEdge(E, C2d1, Face, 0.); //preci | |
627 | } | |
628 | else { | |
629 | if(isSeam) { | |
630 | // When the edge is a Seam, it is better to find the topological | |
631 | // trimming right now. | |
632 | B.UpdateEdge(E, C2d2, C2d1, Face, 0.); | |
633 | //:S4136 FindParameter(C2d1, C2d2, E, Face, preci); | |
634 | } | |
635 | else | |
636 | B.UpdateEdge(E, C2d2, Face, 0.); | |
637 | } | |
638 | } | |
639 | else { | |
640 | TP->AddFail(StepEdge," Seam curve not mapped"); | |
641 | done = Standard_False; | |
642 | myError = StepToTopoDS_TranslateEdgeLoopOther; | |
643 | continue; | |
644 | } | |
645 | } | |
646 | else { | |
647 | ||
648 | // --------------------------- | |
649 | // The Edge is a "normal" edge | |
650 | // --------------------------- | |
651 | ||
652 | if (hasPcurve) { | |
653 | if ( !C2d.IsNull() && !isLikeSeam ) { | |
654 | B.UpdateEdge(E, C2d, Face, 0.); | |
655 | } | |
656 | else { | |
657 | TP->AddFail(StepEdge," Edge: Trimming of 2D curve failed"); | |
658 | // cout << "2D curve type : " << C2d->DynamicType() << endl; | |
659 | done = Standard_False; | |
660 | myError = StepToTopoDS_TranslateEdgeLoopOther; | |
661 | continue; | |
662 | } | |
663 | } | |
664 | } | |
665 | ||
666 | if (!E.IsNull()) { | |
667 | // B.Add(W,E); -- DABORD regarder degeneree manquante !!! | |
668 | } | |
669 | else { | |
670 | TP->AddFail(StepEdge," an Edge not mapped"); | |
671 | done = Standard_False; | |
672 | myError = StepToTopoDS_TranslateEdgeLoopOther; | |
673 | // continue; | |
674 | } | |
675 | } | |
676 | else { // The Edge is Not mapped => switch to next wire ? | |
677 | TP->AddFail(StepEdge," an Edge not mapped"); | |
678 | done = Standard_False; | |
679 | myError = StepToTopoDS_TranslateEdgeLoopOther; | |
680 | // continue; | |
681 | } | |
682 | ||
683 | if (done) B.Add (W,E); // on le fait ici. Sauf si erreur rencontree ... ! | |
684 | else { | |
685 | Handle(StepShape_Vertex) Vs1, Vs2; | |
686 | Vs1 = StepEdge->EdgeStart(); | |
687 | Vs2 = StepEdge->EdgeEnd(); | |
688 | if(!Vs1.IsNull() && !Vs2.IsNull() && Vs1==Vs2) { | |
689 | done = Standard_True; | |
690 | TP->AddFail(EL," Edge with equal vertices failed, scipped"); | |
691 | } | |
692 | } | |
693 | } | |
694 | ||
695 | // The EdgeLoop is binded in the Wire | |
696 | ||
697 | if (!done) { | |
698 | TP->AddFail(EL,"At least one edge failed : wire not done"); | |
699 | return; | |
700 | } | |
ab860031 | 701 | W.Closed (BRep_Tool::IsClosed (W)); |
7fd59977 | 702 | aTool.Bind(EL, W); |
703 | ||
704 | // ---------------------------------------------- | |
705 | // Computes the 2D parameter of Vertices on Edges | |
706 | // ---------------------------------------------- | |
707 | //pdn compute parameter of Vertices using progecting | |
708 | if (!aTool.ComputePCurve()) | |
709 | for (TopoDS_Iterator EdgeIt(W);EdgeIt.More();EdgeIt.Next()){ | |
710 | TopoDS_Edge edge = TopoDS::Edge(EdgeIt.Value()); | |
711 | Handle(ShapeFix_EdgeProjAux) myEdgePro = ShapeAlgo::AlgoContainer()->ToolContainer()->EdgeProjAux(); | |
712 | myEdgePro->Init (Face, edge); | |
713 | myEdgePro->Compute(preci); | |
714 | if (myEdgePro->IsFirstDone() && myEdgePro->IsLastDone()) { | |
e65d641a A |
715 | if (Abs (myEdgePro->FirstParam() - myEdgePro->LastParam()) < Precision::PConfusion()) |
716 | continue; | |
717 | B.Range(edge, Face,myEdgePro->FirstParam(), myEdgePro->LastParam()); | |
7fd59977 | 718 | } |
719 | else { | |
720 | RemoveSinglePCurve(edge, Face); | |
0797d9d3 | 721 | #ifdef OCCT_DEBUG |
7fd59977 | 722 | cout <<"Removing after prj"<<endl; |
723 | #endif | |
724 | } | |
725 | } | |
726 | ||
727 | myResult = W; | |
728 | myError = StepToTopoDS_TranslateEdgeLoopDone; | |
729 | done = Standard_True; | |
730 | // Check des PCurves SYSTEMATIQUE, s il n y en a que quelques unes | |
731 | // if (isPlane) RemovePCurves (W, Face); | |
732 | // else CheckPCurves (W, Face); | |
733 | CheckPCurves (W, Face,isPlane,preci); | |
734 | ||
735 | // -------------------------------------------- | |
736 | // Control the UVLoop (Closed and Head To Tail) | |
737 | // -------------------------------------------- | |
738 | ||
739 | // StepToTopoDS_GeometricToolError tError = | |
740 | // StepToTopoDS_GeometricTool::CloseUV(W, Face, aTool); | |
741 | // if(tError != StepToTopoDS_GeometricToolDone) { | |
742 | // TP->AddWarning(StepEdge,StepToTopoDS::DecodeGeometricToolError(tError)); | |
743 | // } | |
744 | return; | |
745 | } | |
746 | ||
747 | ||
748 | // ============================================================================ | |
749 | // Method : Value | |
750 | // Purpose : Return the mapped Shape | |
751 | // ============================================================================ | |
752 | ||
753 | const TopoDS_Shape& StepToTopoDS_TranslateEdgeLoop::Value() const | |
754 | { | |
755 | StdFail_NotDone_Raise_if(!done,""); | |
756 | return myResult; | |
757 | } | |
758 | ||
759 | // ============================================================================ | |
760 | // Method : Error | |
761 | // Purpose : Return the TranslateEdgeLoop error | |
762 | // ============================================================================ | |
763 | ||
764 | StepToTopoDS_TranslateEdgeLoopError StepToTopoDS_TranslateEdgeLoop::Error() const | |
765 | { | |
766 | return myError; | |
767 | } | |
768 |