1 // Created on: 1998-08-21
2 // Created by: Yves FRICAUD
3 // Copyright (c) 1998-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
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
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
18 #include <Standard_OutOfRange.hxx>
19 #include <Standard_Type.hxx>
20 #include <TopoDS_Shape.hxx>
21 #include <TopOpeBRepDS_Curve.hxx>
22 #include <TopOpeBRepDS_CurvePointInterference.hxx>
23 #include <TopOpeBRepDS_GapTool.hxx>
24 #include <TopOpeBRepDS_HDataStructure.hxx>
25 #include <TopOpeBRepDS_Interference.hxx>
26 #include <TopOpeBRepDS_ListIteratorOfListOfInterference.hxx>
28 IMPLEMENT_STANDARD_RTTIEXT(TopOpeBRepDS_GapTool,Standard_Transient)
30 //=======================================================================
31 //function : TopOpeBRepDS_GapTool
33 //=======================================================================
35 TopOpeBRepDS_GapTool::TopOpeBRepDS_GapTool()
39 //=======================================================================
40 //function : TopOpeBRepDS_GapTool
42 //=======================================================================
44 TopOpeBRepDS_GapTool::TopOpeBRepDS_GapTool(const Handle(TopOpeBRepDS_HDataStructure)& HDS)
49 //=======================================================================
50 //function : StoreGToI
52 //=======================================================================
54 static void StoreGToI(TopOpeBRepDS_DataMapOfIntegerListOfInterference& GToI,
55 const Handle(TopOpeBRepDS_Interference)& I)
57 Standard_Integer G = I->Geometry();
58 if (!GToI.IsBound(G)) {
59 TopOpeBRepDS_ListOfInterference empty;
64 //=======================================================================
67 //=======================================================================
69 void TopOpeBRepDS_GapTool::Init(const Handle(TopOpeBRepDS_HDataStructure)& HDS)
72 Standard_Integer i,Nb = myHDS->NbShapes();
73 for (i = 1; i <= Nb; i++) {
74 const TopoDS_Shape& S = myHDS->Shape(i);
75 const TopOpeBRepDS_ListOfInterference& LI = myHDS->DS().ShapeInterferences(S);
76 for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
77 if (it.Value()->GeometryType() == TopOpeBRepDS_POINT) {
78 myInterToShape.Bind(it.Value(),S);
79 StoreGToI(myGToI,it.Value());
83 Standard_Integer NbCurves = myHDS->NbCurves();
84 for (i = 1; i <= NbCurves; i++) {
85 TopOpeBRepDS_ListOfInterference& LI = myHDS->ChangeDS().ChangeCurveInterferences(i);
86 for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
87 if (it.Value()->GeometryType() == TopOpeBRepDS_POINT)
88 StoreGToI(myGToI,it.Value());
93 //=======================================================================
96 //=======================================================================
98 Standard_Boolean TopOpeBRepDS_GapTool::Curve(const Handle(TopOpeBRepDS_Interference)& I,
99 TopOpeBRepDS_Curve& C) const
101 if (I->GeometryType() == TopOpeBRepDS_POINT) {
102 TopOpeBRepDS_Kind GK,SK;
103 Standard_Integer G,S;
105 I->GKGSKS(GK,G,SK,S);
106 if (SK == TopOpeBRepDS_CURVE) {
110 const TopOpeBRepDS_ListOfInterference& LI = myGToI(G);
111 for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
112 it.Value()->GKGSKS(GK,G,SK,S);
113 if (SK == TopOpeBRepDS_CURVE) {
123 //=======================================================================
124 //function :Interferences
126 //=======================================================================
128 const TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_GapTool::Interferences(const Standard_Integer IP) const
134 //=======================================================================
135 //function : SameInterferences
137 //=======================================================================
139 const TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_GapTool::SameInterferences
140 (const Handle(TopOpeBRepDS_Interference)& I) const
142 return myGToI(I->Geometry());
146 //=======================================================================
147 //function : ChangeSameInterferences
149 //=======================================================================
151 TopOpeBRepDS_ListOfInterference& TopOpeBRepDS_GapTool::ChangeSameInterferences
152 (const Handle(TopOpeBRepDS_Interference)& I)
154 return myGToI.ChangeFind (I->Geometry());
158 //=======================================================================
159 //function : ShapeSupport
161 //=======================================================================
163 Standard_Boolean TopOpeBRepDS_GapTool::EdgeSupport(const Handle(TopOpeBRepDS_Interference)& I,
164 TopoDS_Shape& E) const
166 if (I->GeometryType() == TopOpeBRepDS_POINT) {
167 if (myInterToShape.IsBound(I)) {
168 const TopoDS_Shape& S = myInterToShape(I);
169 if (S.ShapeType() == TopAbs_EDGE) {
174 const TopOpeBRepDS_ListOfInterference& LI = myGToI(I->Geometry());
175 for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
176 const Handle(TopOpeBRepDS_Interference)& II = it.Value();
177 if (myInterToShape.IsBound(II)) {
178 const TopoDS_Shape& S = myInterToShape(II);
179 if (S.ShapeType() == TopAbs_EDGE) {
190 //=======================================================================
191 //function : FacesSupport
193 //=======================================================================
195 Standard_Boolean TopOpeBRepDS_GapTool::FacesSupport(const Handle(TopOpeBRepDS_Interference)& I,
197 TopoDS_Shape& F2) const
199 TopOpeBRepDS_Curve C;
208 //=======================================================================
209 //function : ParameterOnEdge
211 //=======================================================================
213 Standard_Boolean TopOpeBRepDS_GapTool::ParameterOnEdge(const Handle(TopOpeBRepDS_Interference)& I,
214 const TopoDS_Shape& E,
215 Standard_Real& U) const
217 if (I->GeometryType() == TopOpeBRepDS_POINT) {
218 if (myInterToShape.IsBound(I)) {
219 const TopoDS_Shape& S = myInterToShape(I);
221 U = Handle(TopOpeBRepDS_CurvePointInterference)::DownCast (I)->Parameter();
225 const TopOpeBRepDS_ListOfInterference& LI = myGToI(I->Geometry());
226 for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
227 const Handle(TopOpeBRepDS_Interference)& II = it.Value();
228 if (myInterToShape.IsBound(II)) {
229 const TopoDS_Shape& S = myInterToShape(II);
231 U = Handle(TopOpeBRepDS_CurvePointInterference)::DownCast (II)->Parameter();
240 //=======================================================================
241 //function : ParameterOnEdge
243 //=======================================================================
245 void TopOpeBRepDS_GapTool::SetParameterOnEdge(const Handle(TopOpeBRepDS_Interference)& I,
246 const TopoDS_Shape& E,
247 const Standard_Real U)
249 if (I->GeometryType() == TopOpeBRepDS_POINT) {
250 if (myInterToShape.IsBound(I)) {
251 const TopoDS_Shape& S = myInterToShape(I);
253 Handle(TopOpeBRepDS_CurvePointInterference)::DownCast (I)->Parameter(U);
256 const TopOpeBRepDS_ListOfInterference& LI = myGToI(I->Geometry());
257 for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
258 const Handle(TopOpeBRepDS_Interference)& II = it.Value();
259 if (myInterToShape.IsBound(II)) {
260 const TopoDS_Shape& S = myInterToShape(II);
262 Handle(TopOpeBRepDS_CurvePointInterference)::DownCast (II)->Parameter(U);
269 //=======================================================================
270 //function : SetPoint
272 //=======================================================================
274 void TopOpeBRepDS_GapTool::SetPoint(const Handle(TopOpeBRepDS_Interference)& I,
275 const Standard_Integer IP)
277 if (IP != I->Geometry()) {
278 const TopOpeBRepDS_ListOfInterference& LI = myGToI(I->Geometry());
279 for (TopOpeBRepDS_ListIteratorOfListOfInterference it(LI); it.More(); it.Next()) {
280 Handle(TopOpeBRepDS_Interference) II = it.Value();
282 StoreGToI(myGToI,II);