0027525: Coding - eliminate warnings on Windows for OCCT with static type of libraries
[occt.git] / src / TopOpeBRep / TopOpeBRep_VPointInter.cxx
CommitLineData
b311480e 1// Created on: 1993-11-10
2// Created by: Jean Yves LEBEY
3// Copyright (c) 1993-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.
7fd59977 16
7fd59977 17
7fd59977 18#include <Adaptor2d_HCurve2d.hxx>
42cf5bc1 19#include <Adaptor3d_HVertex.hxx>
7fd59977 20#include <BRepAdaptor_Curve2d.hxx>
42cf5bc1 21#include <BRepAdaptor_HCurve2d.hxx>
22#include <BRepTopAdaptor_HVertex.hxx>
23#include <gp_Pnt.hxx>
7fd59977 24#include <gp_Pnt2d.hxx>
42cf5bc1 25#include <IntPatch_Point.hxx>
7fd59977 26#include <Precision.hxx>
42cf5bc1 27#include <Standard_DomainError.hxx>
28#include <TCollection_AsciiString.hxx>
29#include <TopoDS.hxx>
30#include <TopoDS_Edge.hxx>
31#include <TopoDS_Face.hxx>
32#include <TopoDS_Shape.hxx>
7fd59977 33#include <TopOpeBRep_define.hxx>
42cf5bc1 34#include <TopOpeBRep_FFTransitionTool.hxx>
35#include <TopOpeBRep_VPointInter.hxx>
36#include <TopOpeBRepDS_Transition.hxx>
37#include <TopOpeBRepTool_ShapeTool.hxx>
7fd59977 38
0797d9d3 39#ifdef OCCT_DEBUG
7fd59977 40static TCollection_AsciiString PRODINP("dinp ");
41#endif
42
43//=======================================================================
44//function : SetPoint
45//purpose :
46//=======================================================================
47void TopOpeBRep_VPointInter::SetPoint(const IntPatch_Point& P)
48{
49 myPPOI = (IntPatch_Point*)&P;
50
51 Standard_Boolean isOn1 = P.IsOnDomS1();
52 Standard_Boolean isOn2 = P.IsOnDomS2();
53 if (isOn1 && isOn2) myShapeIndex = 3;
54 else if (isOn2) myShapeIndex = 2;
55 else if (isOn1) myShapeIndex = 1;
56 else myShapeIndex = 0;
57}
58
59//=======================================================================
60//function : ArcOnS1
61//purpose :
62//=======================================================================
63const TopoDS_Shape& TopOpeBRep_VPointInter::ArcOnS1() const
64{
65 const Handle(Adaptor2d_HCurve2d)& HAHC2 = myPPOI->ArcOnS1();
66 const BRepAdaptor_Curve2d& BRAC2P = *((BRepAdaptor_Curve2d*)&(HAHC2->Curve2d()));
67 return BRAC2P.Edge();
68}
69
70//=======================================================================
71//function : ArcOnS2
72//purpose :
73//=======================================================================
74const TopoDS_Shape& TopOpeBRep_VPointInter::ArcOnS2() const
75{
76 const Handle(Adaptor2d_HCurve2d)& HAHC2 = myPPOI->ArcOnS2();
77 const BRepAdaptor_Curve2d& BRAC2P = *((BRepAdaptor_Curve2d*)&(HAHC2->Curve2d()));
78 return BRAC2P.Edge();
79}
80
81//=======================================================================
82//function : VertexOnS1
83//purpose :
84//=======================================================================
85const TopoDS_Shape& TopOpeBRep_VPointInter::VertexOnS1() const
86{
87 if ( !myPPOI->IsVertexOnS1() )
88 Standard_DomainError::Raise("TopOpeBRep_VPointInter::VertexOnS1");
89
90 const Handle(BRepTopAdaptor_HVertex)* HBRTAHV = (Handle(BRepTopAdaptor_HVertex)*)&(myPPOI->VertexOnS1());
91 return (*HBRTAHV)->Vertex();
92}
93
94//=======================================================================
95//function : VertexOnS2
96//purpose :
97//=======================================================================
98const TopoDS_Shape& TopOpeBRep_VPointInter::VertexOnS2() const
99{
100 if ( !myPPOI->IsVertexOnS2() )
101 Standard_DomainError::Raise("TopOpeBRep_VPointInter::VertexOnS2");
102
103 const Handle(BRepTopAdaptor_HVertex)* HBRTAHV = (Handle(BRepTopAdaptor_HVertex)*)&(myPPOI->VertexOnS2());
104 return (*HBRTAHV)->Vertex();
105}
106
107//=======================================================================
108//function : State
109//purpose :
110//=======================================================================
111void TopOpeBRep_VPointInter::State(const TopAbs_State S,const Standard_Integer I)
112{
113 if (I == 1) myState1 = S;
114 else if (I == 2) myState2 = S;
115 else Standard_DomainError::Raise("TopOpeBRep_VPointInter::State");
116 UpdateKeep();
117}
118
119//=======================================================================
120//function : State
121//purpose :
122//=======================================================================
123TopAbs_State TopOpeBRep_VPointInter::State(const Standard_Integer I) const
124{
125 if (I == 1) return myState1;
126 else if (I == 2) return myState2;
127 else { Standard_DomainError::Raise("TopOpeBRep_VPointInter::State"); return TopAbs_UNKNOWN; }
128}
129
130//=======================================================================
131//function : EdgeON
132//purpose :
133//=======================================================================
134void TopOpeBRep_VPointInter::EdgeON(const TopoDS_Shape& Eon,const Standard_Real Par,const Standard_Integer I)
135{
136 if (I == 1) {
137 myEdgeON1 = Eon;
138 myEdgeONPar1 = Par;
139 }
140 else if (I == 2) {
141 myEdgeON2 = Eon;
142 myEdgeONPar2 = Par;
143 }
144}
145
146//=======================================================================
147//function : EdgeON
148//purpose :
149//=======================================================================
150const TopoDS_Shape& TopOpeBRep_VPointInter::EdgeON(const Standard_Integer I) const
151{
152 if (I == 1) return myEdgeON1;
153 else if (I == 2) return myEdgeON2;
154 else Standard_DomainError::Raise("TopOpeBRep_VPointInter::EdgeON");
155 return myNullShape;
156}
157
158//=======================================================================
159//function : EdgeONParameter
160//purpose :
161//=======================================================================
162Standard_Real TopOpeBRep_VPointInter::EdgeONParameter(const Standard_Integer I) const
163{
164 if (I == 1) return myEdgeONPar1;
165 else if (I == 2) return myEdgeONPar2;
166 else Standard_DomainError::Raise("TopOpeBRep_VPointInter::EdgeONParameter");
167 return 0.;
168}
169
170//=======================================================================
171//function : Edge
172//purpose :
173//=======================================================================
174const TopoDS_Shape& TopOpeBRep_VPointInter::Edge(const Standard_Integer I) const
175{
176 if (I == 1 && IsOnDomS1() ) return ArcOnS1();
177 else if (I == 2 && IsOnDomS2() ) return ArcOnS2();
178
179 return myNullShape;
180}
181
182//=======================================================================
183//function : EdgeParameter
184//purpose :
185//=======================================================================
186Standard_Real TopOpeBRep_VPointInter::EdgeParameter(const Standard_Integer I) const
187{
188 if (I == 1 && IsOnDomS1() ) return ParameterOnArc1();
189 else if (I == 2 && IsOnDomS2() ) return ParameterOnArc2();
190 return 0.;
191}
192
193//=======================================================================
194//function : EdgeParameter
195//purpose :
196//=======================================================================
197gp_Pnt2d TopOpeBRep_VPointInter::SurfaceParameters(const Standard_Integer I) const
198{
199 Standard_Real u = 0., v = 0.;
200 //if (I == 1 && IsOnDomS1() ) ParametersOnS1(u,v);
201 //else if (I == 2 && IsOnDomS1() ) ParametersOnS2(u,v);
202 if (I == 1 ) ParametersOnS1(u,v);
203 else if (I == 2 ) ParametersOnS2(u,v);
204 gp_Pnt2d p2d(u,v);
205 return p2d;
206}
207
208//=======================================================================
209//function : IsVertex
210//purpose :
211//=======================================================================
212Standard_Boolean TopOpeBRep_VPointInter::IsVertex(const Standard_Integer I) const
213{
214 if ( I == 0 ) return Standard_False;
215 if ( I == 1 && IsVertexOnS1() ) return Standard_True;
216 else if ( I == 2 && IsVertexOnS2() ) return Standard_True;
217 return Standard_False;
218}
219
220//=======================================================================
221//function : Vertex
222//purpose :
223//=======================================================================
224const TopoDS_Shape& TopOpeBRep_VPointInter::Vertex(const Standard_Integer I) const
225{
226 if ( I == 1 && IsVertexOnS1() ) return VertexOnS1();
227 else if ( I == 2 && IsVertexOnS2() ) return VertexOnS2();
228 return myNullShape;
229}
230
231//=======================================================================
232//function : UpdateKeep
233//purpose :
234//=======================================================================
235void TopOpeBRep_VPointInter::UpdateKeep()
236{
237#define M_SINON(s) (((s) == TopAbs_IN) || ((s) == TopAbs_ON))
238
239 TopAbs_State pos1 = State(1);
240 TopAbs_State pos2 = State(2);
241
242 Standard_Integer SI = ShapeIndex();
243
7fd59977 244 Standard_Boolean condition=Standard_False;
1d47d8d0 245
7fd59977 246 if (SI == 1) condition = M_SINON(pos2);
247 else if (SI == 2) condition = M_SINON(pos1);
248 else if (SI == 0) condition = M_SINON(pos1) && M_SINON(pos2);
249 else if (SI == 3) condition = M_SINON(pos1) && M_SINON(pos2);
250 // NYI : SI == 3 --> le VP devrait toujours etre Keep() (par definition)
251
252 myKeep = condition;
253}
254
255//=======================================================================
256//function : EqualpP
257//purpose : returns <True> if the 3d points and the parameters of the
258// VPoints are same.
259//=======================================================================
260Standard_Boolean TopOpeBRep_VPointInter::EqualpP(const TopOpeBRep_VPointInter& VP) const
261{
262 Standard_Real p1 = ParameterOnLine();
263 Standard_Real p2 = VP.ParameterOnLine();
264 Standard_Boolean pequal = fabs(p1-p2) < Precision::PConfusion();
265 gp_Pnt P1 = Value(); gp_Pnt P2 = VP.Value();
266 Standard_Real Ptol1 = Tolerance(), Ptol2 = VP.Tolerance();
267 Standard_Real Ptol = (Ptol1 > Ptol2) ? Ptol1 : Ptol2;
268 Standard_Boolean Pequal = P1.IsEqual(P2,Ptol);
269 Standard_Boolean pPequal = ( pequal && Pequal );
270 return pPequal;
271}
272
273//=======================================================================
274//function :
275//purpose :
276//=======================================================================
277Standard_Boolean TopOpeBRep_VPointInter::ParonE(const TopoDS_Edge& E,Standard_Real& par) const
278{
279 Standard_Boolean found = Standard_False;
280 if (IsOnDomS1()) {
281 if(E.IsSame(ArcOnS1())) found = Standard_True;
282 if (found) {par = ParameterOnArc1(); return found;}
283 }
284 if (IsOnDomS2()) {
285 if(E.IsSame(ArcOnS2())) found = Standard_True;
286 if (found) {par = ParameterOnArc2(); return found;}
287 }
288
289 for (Standard_Integer i = 1; i <= 2; i++) {
290 if (State(i) != TopAbs_ON) continue;
291 if (EdgeON(i).IsSame(E)) {
292 par = EdgeONParameter(i);
293 return Standard_True;
294 }
295 }
296 return found;
297}
298
299//=======================================================================
300//function : DumpEdge
301//purpose :
302//=======================================================================
303Standard_OStream& TopOpeBRep_VPointInter::Dump(const Standard_Integer I,const TopoDS_Face& F,Standard_OStream& OS) const
304{
305 const TopoDS_Edge& E = TopoDS::Edge(Edge(I));
0797d9d3 306#ifdef OCCT_DEBUG
7fd59977 307 Standard_Real Epar =
308#endif
309 EdgeParameter(I);
0797d9d3 310#ifdef OCCT_DEBUG
7fd59977 311 TopAbs_Orientation O =
312#endif
313 E.Orientation();
0797d9d3 314#ifdef OCCT_DEBUG
7fd59977 315 Standard_Boolean closingedge =
316#endif
317 TopOpeBRepTool_ShapeTool::Closed(E,F);
318
0797d9d3 319#ifdef OCCT_DEBUG
7fd59977 320 if (closingedge) OS<<"on closing edge "; else OS<<"on edge "; TopAbs::Print(O,cout);
321 cout<<" of "<<I<<" : par : "<<Epar<<endl;
536a3cb8 322 TopOpeBRep_FFTransitionTool::ProcessLineTransition(*this,I,O);
7fd59977 323 OS<<"line transition ";
324 if (closingedge) OS<<"on closing edge "; else OS<<"on edge "; TopAbs::Print(O,cout);
536a3cb8 325 OS<<" of "<<I<<endl;
7fd59977 326#endif
327
328 return OS;
329}
330
331//=======================================================================
332//function : Dump
333//purpose :
334//=======================================================================
0797d9d3 335#ifdef OCCT_DEBUG
7fd59977 336Standard_OStream& TopOpeBRep_VPointInter::Dump(const TopoDS_Face& FF1,const TopoDS_Face& FF2,Standard_OStream& OS) const
337{
7fd59977 338 const TopoDS_Face& F1 = TopoDS::Face(FF1);
339 const TopoDS_Face& F2 = TopoDS::Face(FF2);
340 OS<<"VP "<<myIndex<<" on "<<myShapeIndex<<" :";
341 Standard_Real Cpar = ParameterOnLine(); OS<<" on curve : "<<Cpar;
342 if (!myKeep) OS<<" NOT kept";
343 OS<<endl;
344 const gp_Pnt& P = Value();
345 OS<<PRODINP<<"P"<<myIndex<<" "; OS<<P.X()<<" "<<P.Y()<<" "<<P.Z();
346 OS<<"; #draw"<<endl;
347
7fd59977 348 if (IsVertexOnS1()) { OS<<"is vertex of 1"<<endl; }
349 if (IsVertexOnS2()) { OS<<"is vertex of 2"<<endl; }
350 if (IsMultiple()) { OS<<"is multiple"<<endl; }
351 if (IsInternal()) { OS<<"is internal"<<endl; }
352
353 if (myShapeIndex == 1) {
354 Dump(1,F1,OS);
355 }
356 else if (myShapeIndex == 2) {
357 Dump(2,F2,OS);
358 }
359 else if (myShapeIndex == 3) {
360 Dump(1,F1,OS);
361 Dump(2,F2,OS);
362 }
498ce76b 363#else
364Standard_OStream& TopOpeBRep_VPointInter::Dump(const TopoDS_Face&,const TopoDS_Face&,Standard_OStream& OS) const
365{
7fd59977 366#endif
367
368 return OS;
369}
370
371//=======================================================================
372//function : PThePointOfIntersectionDummy
373//purpose :
374//=======================================================================
375TopOpeBRep_PThePointOfIntersection TopOpeBRep_VPointInter::PThePointOfIntersectionDummy() const
376{
377 return myPPOI;
378}