0024087: Eliminate compiler warning C4244 in MSVC++ with warning level 4
[occt.git] / src / BinTools / BinTools_LocationSet.cxx
1 // Created on: 2004-06-15
2 // Created by: Sergey ZARITCHNY
3 // Copyright (c) 2004-2012 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20
21 #include <BinTools_LocationSet.ixx>
22 #include <BinTools.hxx>
23 #include <gp_Ax3.hxx>
24 #include <gp_Vec.hxx>
25 #include <Precision.hxx>
26 #include <Standard_ErrorHandler.hxx>
27
28 //=======================================================================
29 //function : operator >> (gp_Trsf& T)
30 //purpose  : 
31 //=======================================================================
32 static Standard_IStream& operator >>(Standard_IStream& IS, gp_Trsf& T)
33 {
34   Standard_Real V1[3],V2[3],V3[3];
35   Standard_Real V[3];
36   
37   BinTools::GetReal(IS, V1[0]);
38   BinTools::GetReal(IS, V1[1]);
39   BinTools::GetReal(IS, V1[2]);
40   BinTools::GetReal(IS,  V[0]);
41
42   BinTools::GetReal(IS, V2[0]);
43   BinTools::GetReal(IS, V2[1]);
44   BinTools::GetReal(IS, V2[2]);
45   BinTools::GetReal(IS,  V[1]);
46
47   BinTools::GetReal(IS, V3[0]);
48   BinTools::GetReal(IS, V3[1]);
49   BinTools::GetReal(IS, V3[2]);
50   BinTools::GetReal(IS,  V[2]);
51
52   T.SetValues(V1[0],V1[1],V1[2],V[0],
53               V2[0],V2[1],V2[2],V[1],
54               V3[0],V3[1],V3[2],V[2],
55               Precision::Angular(),
56               Precision::Confusion());
57   return IS;
58 }
59
60 //=======================================================================
61 //function : operator << (gp_Trsf& T)
62 //purpose  : 
63 //=======================================================================
64 static Standard_OStream& operator <<(Standard_OStream& OS,const gp_Trsf& T)
65 {
66   gp_XYZ V = T.TranslationPart();
67   gp_Mat M = T.VectorialPart();
68
69   BinTools::PutReal(OS, M(1,1));
70   BinTools::PutReal(OS, M(1,2));
71   BinTools::PutReal(OS, M(1,3));
72   BinTools::PutReal(OS,V.Coord(1)); 
73
74   BinTools::PutReal(OS, M(2,1));
75   BinTools::PutReal(OS, M(2,2));
76   BinTools::PutReal(OS, M(2,3));
77   BinTools::PutReal(OS,V.Coord(2));  
78
79   BinTools::PutReal(OS, M(3,1));
80   BinTools::PutReal(OS, M(3,2));
81   BinTools::PutReal(OS, M(3,3));
82   BinTools::PutReal(OS,V.Coord(3));  
83
84   return OS;
85 }
86
87 //=======================================================================
88 //function : BinTools_LocationSet
89 //purpose  : 
90 //=======================================================================
91
92 BinTools_LocationSet::BinTools_LocationSet() 
93 {
94 }
95
96
97 //=======================================================================
98 //function : Clear
99 //purpose  : 
100 //=======================================================================
101
102 void  BinTools_LocationSet::Clear()
103 {
104   myMap.Clear();
105 }
106
107
108 //=======================================================================
109 //function : Add
110 //purpose  : 
111 //=======================================================================
112
113 Standard_Integer  BinTools_LocationSet::Add(const TopLoc_Location& L)
114 {
115   if (L.IsIdentity()) return 0;
116   Standard_Integer n = myMap.FindIndex(L);
117   if (n > 0) return n;
118   TopLoc_Location N = L;
119   do {
120     myMap.Add(N.FirstDatum());
121     N = N.NextLocation();
122   } while (!N.IsIdentity());
123   return myMap.Add(L);
124 }
125
126
127 //=======================================================================
128 //function : Location
129 //purpose  : 
130 //=======================================================================
131
132 const TopLoc_Location&  BinTools_LocationSet::Location
133   (const Standard_Integer I)const 
134 {
135   static TopLoc_Location identity;
136   if (I == 0) return identity;
137   else return myMap(I);
138 }
139
140
141 //=======================================================================
142 //function : Index
143 //purpose  : 
144 //=======================================================================
145
146 Standard_Integer  BinTools_LocationSet::Index(const TopLoc_Location& L) const
147 {
148   if (L.IsIdentity()) return 0;
149   return myMap.FindIndex(L);
150 }
151
152 //=======================================================================
153 //function : NbLocations
154 //purpose  : 
155 //=======================================================================
156
157 Standard_Integer  BinTools_LocationSet::NbLocations() const
158 {
159   return myMap.Extent();
160 }
161
162 //=======================================================================
163 //function : Write locations
164 //purpose  : 
165 //=======================================================================
166
167 void  BinTools_LocationSet::Write(Standard_OStream& OS) const 
168 {
169   
170   Standard_Integer i, nbLoc = myMap.Extent();
171   OS << "Locations "<< nbLoc <<endl; 
172   try {
173     OCC_CATCH_SIGNALS
174     for (i = 1; i <= nbLoc; i++) {
175       TopLoc_Location L = myMap(i);
176       
177       TopLoc_Location L2 = L.NextLocation();
178       Standard_Boolean simple = L2.IsIdentity();
179       Standard_Integer p = L.FirstPower();
180       TopLoc_Location L1 = L.FirstDatum();
181       Standard_Boolean elementary = (simple && p == 1);
182       if (elementary) {
183         
184         OS.put((Standard_Byte)1); // 1
185         OS << L.Transformation();
186       }
187       else {
188         OS.put((Standard_Byte)2); // 2
189         BinTools::PutInteger(OS, myMap.FindIndex(L1));
190         BinTools::PutInteger(OS, p);
191         while (!L2.IsIdentity()) {
192           L1 = L2.FirstDatum();
193           p  = L2.FirstPower();
194           L2 = L2.NextLocation();
195           BinTools::PutInteger(OS,  myMap.FindIndex(L1));
196           BinTools::PutInteger(OS, p);
197         }
198         
199         BinTools::PutInteger(OS, 0);
200       }
201     }
202   }
203   catch(Standard_Failure) {
204     Standard_SStream aMsg;
205     aMsg << "EXCEPTION in BinTools_LocatioSet::Write(..)" << endl;
206     Handle(Standard_Failure) anExc = Standard_Failure::Caught();
207     aMsg << anExc << endl;
208     Standard_Failure::Raise(aMsg);
209   }
210 }
211
212 //=======================================================================
213 //function : Read
214 //purpose  : 
215 //=======================================================================
216 void  BinTools_LocationSet::Read(Standard_IStream& IS)
217 {
218
219   myMap.Clear();
220   char buffer[255];
221   Standard_Integer l1,p;
222
223   IS >> buffer;
224   if (IS.fail() || (strcmp(buffer,"Locations"))) {
225     Standard_SStream aMsg;
226     aMsg << "BinTools_LocationSet::Read: Not a location table"<<endl;
227     Standard_Failure::Raise(aMsg);
228     return;
229   }
230
231   Standard_Integer i, nbLoc;
232   IS >> nbLoc;
233   IS.get();// remove lf
234   TopLoc_Location L;
235   gp_Trsf T;
236
237   try {
238     OCC_CATCH_SIGNALS
239     for (i = 1; i <= nbLoc; i++) { 
240       
241       const Standard_Byte aTypLoc = (Standard_Byte)IS.get();
242       if (aTypLoc == 1) {
243         IS >> T;
244         L = T;
245       }
246       
247       else if (aTypLoc == 2) {
248         L = TopLoc_Location();
249         BinTools::GetInteger(IS, l1); //Index
250         while (l1 != 0) { 
251           BinTools::GetInteger(IS, p);
252           TopLoc_Location L1 = myMap(l1);
253           L = L1.Powered(p) *L;
254           BinTools::GetInteger(IS, l1);
255         }
256       } else {
257         Standard_SStream aMsg;
258         aMsg << "Unexpected location's type = " << aTypLoc << endl;
259         Standard_Failure::Raise(aMsg);
260       }    
261       if (!L.IsIdentity()) myMap.Add(L);
262     }
263   }
264   catch(Standard_Failure) {
265     Standard_SStream aMsg;
266     aMsg << "EXCEPTION in BinTools_LocationSet::Read(..)" << endl;
267     Handle(Standard_Failure) anExc = Standard_Failure::Caught();
268     aMsg << anExc << endl;
269     Standard_Failure::Raise(aMsg);
270   }
271 }