b311480e |
1 | // Created by: CKY / Contract Toubro-Larsen |
2 | // Copyright (c) 1993-1999 Matra Datavision |
973c2be1 |
3 | // Copyright (c) 1999-2014 OPEN CASCADE SAS |
b311480e |
4 | // |
973c2be1 |
5 | // This file is part of Open CASCADE Technology software library. |
7fd59977 |
6 | // |
d5f74e42 |
7 | // This library is free software; you can redistribute it and/or modify it under |
8 | // the terms of the GNU Lesser General Public License version 2.1 as published |
973c2be1 |
9 | // by the Free Software Foundation, with special exception defined in the file |
10 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT |
11 | // distribution for complete text of the license and disclaimer of any warranty. |
7fd59977 |
12 | // |
973c2be1 |
13 | // Alternatively, this file may be used under the terms of Open CASCADE |
14 | // commercial license or contractual agreement. |
b311480e |
15 | |
16 | //-------------------------------------------------------------------- |
7fd59977 |
17 | //-------------------------------------------------------------------- |
18 | |
7fd59977 |
19 | #include <IGESBasic_HArray2OfHArray1OfReal.hxx> |
42cf5bc1 |
20 | #include <IGESData_DirChecker.hxx> |
7fd59977 |
21 | #include <IGESData_Dump.hxx> |
42cf5bc1 |
22 | #include <IGESData_IGESDumper.hxx> |
23 | #include <IGESData_IGESReaderData.hxx> |
24 | #include <IGESData_IGESWriter.hxx> |
25 | #include <IGESData_ParamCursor.hxx> |
26 | #include <IGESData_ParamReader.hxx> |
27 | #include <IGESGeom_SplineSurface.hxx> |
28 | #include <IGESGeom_ToolSplineSurface.hxx> |
29 | #include <Interface_Check.hxx> |
30 | #include <Interface_CopyTool.hxx> |
31 | #include <Interface_EntityIterator.hxx> |
7fd59977 |
32 | #include <Interface_Macros.hxx> |
42cf5bc1 |
33 | #include <Interface_ShareTool.hxx> |
34 | #include <Message_Messenger.hxx> |
7fd59977 |
35 | #include <Message_Msg.hxx> |
42cf5bc1 |
36 | #include <Standard_DomainError.hxx> |
37 | #include <TColStd_HArray1OfReal.hxx> |
7fd59977 |
38 | |
42cf5bc1 |
39 | // MGE 30/07/98 |
7fd59977 |
40 | IGESGeom_ToolSplineSurface::IGESGeom_ToolSplineSurface () { } |
41 | |
42 | |
43 | void IGESGeom_ToolSplineSurface::ReadOwnParams |
44 | (const Handle(IGESGeom_SplineSurface)& ent, |
45 | const Handle(IGESData_IGESReaderData)& /* IR */, IGESData_ParamReader& PR) const |
46 | { |
47 | |
48 | // MGE 30/07/98 |
49 | |
50 | Standard_Integer aBoundaryType, aPatchType, allNbUSegments, allNbVSegments; |
51 | Standard_Integer i, j, k; |
52 | Standard_Boolean ubreak=Standard_False, vbreak=Standard_False; |
53 | Handle(TColStd_HArray1OfReal) allUBreakPoints; |
54 | Handle(TColStd_HArray1OfReal) allVBreakPoints; |
55 | Handle(IGESBasic_HArray2OfHArray1OfReal) allXCoeffs; |
56 | Handle(IGESBasic_HArray2OfHArray1OfReal) allYCoeffs; |
57 | Handle(IGESBasic_HArray2OfHArray1OfReal) allZCoeffs; |
58 | |
59 | //Standard_Boolean st; //szv#4:S4163:12Mar99 moved down |
60 | |
61 | //szv#4:S4163:12Mar99 `st=` not needed |
62 | if (!PR.ReadInteger(PR.Current(), aBoundaryType)){ |
63 | Message_Msg Msg140("XSTEP_140"); |
64 | PR.SendFail(Msg140); |
65 | } |
66 | if (!PR.ReadInteger(PR.Current(), aPatchType)){ |
67 | Message_Msg Msg278("XSTEP_278"); |
68 | PR.SendFail(Msg278); |
69 | } |
70 | //st = PR.ReadInteger(PR.Current(), Msg141, allNbUSegments); //szv#4:S4163:12Mar99 moved in if |
71 | if (PR.ReadInteger(PR.Current(),allNbUSegments)) { |
72 | ubreak = Standard_True; |
73 | allUBreakPoints = new TColStd_HArray1OfReal(1, allNbUSegments+1); |
74 | } |
75 | else{ |
76 | Message_Msg Msg141("XSTEP_141"); |
77 | PR.SendFail(Msg141); |
78 | } |
79 | |
80 | //st = PR.ReadInteger(PR.Current(), Msg142, allNbVSegments); //szv#4:S4163:12Mar99 moved in if |
81 | //st = PR.ReadInteger(PR.Current(), "Number Of V Segments", allNbVSegments); |
82 | if (PR.ReadInteger(PR.Current(),allNbVSegments)) { |
83 | vbreak = Standard_True; |
84 | allVBreakPoints = new TColStd_HArray1OfReal(1, allNbVSegments+1); |
85 | } |
86 | else{ |
87 | Message_Msg Msg142("XSTEP_142"); |
88 | PR.SendFail(Msg142); |
89 | } |
90 | |
91 | |
92 | if (!allUBreakPoints.IsNull()){ |
93 | Message_Msg Msg143("XSTEP_143"); |
94 | PR.ReadReals(PR.CurrentList(allNbUSegments+1), Msg143, allUBreakPoints); //szv#4:S4163:12Mar99 `st=` not needed |
95 | //st = PR.ReadReals(PR.CurrentList(allNbUSegments+1), "U Break Points", allUBreakPoints); |
96 | } |
97 | |
98 | if (!allVBreakPoints.IsNull()){ |
99 | Message_Msg Msg144("XSTEP_144"); |
100 | PR.ReadReals(PR.CurrentList(allNbVSegments+1), Msg144, allVBreakPoints); //szv#4:S4163:12Mar99 `st=` not needed |
101 | //st = PR.ReadReals(PR.CurrentList(allNbVSegments+1), "V Break Points", allVBreakPoints); |
102 | } |
103 | |
104 | if (ubreak && vbreak) |
105 | { |
106 | allXCoeffs = new IGESBasic_HArray2OfHArray1OfReal(1, allNbUSegments, 1, allNbVSegments); |
107 | allYCoeffs = new IGESBasic_HArray2OfHArray1OfReal(1, allNbUSegments, 1, allNbVSegments); |
108 | allZCoeffs = new IGESBasic_HArray2OfHArray1OfReal(1, allNbUSegments, 1, allNbVSegments); |
109 | } |
110 | |
111 | Handle(TColStd_HArray1OfReal) Temp; // = new TColStd_HArray1OfReal(1, 16); |
112 | |
113 | if (! allXCoeffs.IsNull()) { |
114 | Standard_Boolean st; |
115 | |
116 | Message_Msg Msg145_X("XSTEP_145"); |
117 | Msg145_X.Arg("X"); |
118 | |
119 | Message_Msg Msg145_Y("XSTEP_145"); |
120 | Msg145_Y.Arg("Y"); |
121 | |
122 | Message_Msg Msg145_Z("XSTEP_145"); |
123 | Msg145_Z.Arg("Z"); |
124 | |
125 | for (i = 1; i <= allNbUSegments; i++) { |
126 | for (j = 1; j <= allNbVSegments; j++) { |
127 | st = PR.ReadReals (PR.CurrentList(16),Msg145_X,Temp); |
128 | //st = PR.ReadReals (PR.CurrentList(16),"X Coefficient Of Patch",Temp); |
129 | if (st && Temp->Length() == 16) allXCoeffs->SetValue(i,j,Temp); |
130 | else { |
131 | Message_Msg Msg147_X("XSTEP_147"); |
132 | Msg147_X.Arg("X"); |
133 | PR.SendFail (Msg147_X); |
134 | } |
135 | st = PR.ReadReals (PR.CurrentList(16),Msg145_Y,Temp); |
136 | //st = PR.ReadReals (PR.CurrentList(16),"Y Coefficient Of Patch",Temp); |
137 | if (st && Temp->Length() == 16) allYCoeffs->SetValue(i, j, Temp); |
138 | else { |
139 | Message_Msg Msg147_Y("XSTEP_147"); |
140 | Msg147_Y.Arg("Y"); |
141 | PR.SendFail (Msg147_Y); |
142 | } |
143 | st = PR.ReadReals (PR.CurrentList(16),Msg145_Z,Temp); |
144 | //st = PR.ReadReals (PR.CurrentList(16),"Z Coefficient Of Patch",Temp); |
145 | if (st && Temp->Length() == 16) allZCoeffs->SetValue(i, j, Temp); |
146 | else if (i < allNbUSegments || j < allNbVSegments) { |
147 | Message_Msg Msg147_Z("XSTEP_147"); |
148 | Msg147_Z.Arg("Z"); |
149 | PR.SendFail (Msg147_Z); |
150 | } |
151 | else { |
152 | // Si fin manquante ... On refait temp ! |
153 | // Les valeurs n ont pas ete lues ... il faut d abord les relire ! |
154 | Temp = new TColStd_HArray1OfReal (1,16); Temp->Init(0.); |
155 | for (k = 1; k <= 16; k ++) { |
156 | Standard_Real vl; |
157 | if (!PR.ReadReal (PR.Current(),vl)) { |
158 | Message_Msg Msg146("XSTEP_146"); |
159 | PR.SendFail(Msg146); |
160 | break; |
161 | } |
162 | //if (!PR.ReadReal (PR.Current(),"Z of very last patch",vl)) break; |
163 | Temp->SetValue(k,vl); |
164 | } |
165 | allZCoeffs->SetValue(i, j, Temp); |
166 | PR.Mend("Last patch incomplete, defaulted"); |
167 | } |
168 | } |
169 | for (Standard_Integer kk = 1; kk <= 48; kk++) |
170 | PR.SetCurrentNumber(PR.CurrentNumber() + 1); |
171 | //Skip the Arbitrary Values |
172 | } |
173 | } |
174 | if (vbreak) |
175 | for (k = 1; k <= 48*(allNbVSegments+1); k++) |
176 | PR.SetCurrentNumber(PR.CurrentNumber() + 1); |
177 | // Skip the Arbitrary Values |
178 | |
179 | DirChecker(ent).CheckTypeAndForm(PR.CCheck(),ent); |
180 | ent->Init |
181 | (aBoundaryType , aPatchType, allUBreakPoints, allVBreakPoints, |
182 | allXCoeffs, allYCoeffs, allZCoeffs); |
183 | } |
184 | |
185 | void IGESGeom_ToolSplineSurface::WriteOwnParams |
186 | (const Handle(IGESGeom_SplineSurface)& ent, IGESData_IGESWriter& IW) const |
187 | { |
188 | Standard_Integer I,J,k; |
189 | |
190 | IW.Send(ent->BoundaryType()); |
191 | IW.Send(ent->PatchType()); |
192 | |
193 | Standard_Integer nbUSegs = ent->NbUSegments(); |
194 | Standard_Integer nbVSegs = ent->NbVSegments(); |
195 | IW.Send(nbUSegs); |
196 | IW.Send(nbVSegs); |
197 | |
198 | for (I = 1; I <= nbUSegs + 1; I ++) |
199 | IW.Send(ent->UBreakPoint(I)); |
200 | |
201 | for (I = 1; I <= nbVSegs + 1; I ++) |
202 | IW.Send(ent->VBreakPoint(I)); |
203 | |
204 | for (I = 1; I <= nbUSegs; I++) |
205 | { |
206 | for (J = 1 ; J <= nbVSegs; J++) |
207 | { |
208 | for (k = 1; k <= 16; k++) |
209 | IW.Send((ent->XPolynomial(I, J))->Value(k)); |
210 | for (k = 1; k <= 16; k++) |
211 | IW.Send((ent->YPolynomial(I, J))->Value(k)); |
212 | for (k = 1; k <= 16; k++) |
213 | IW.Send((ent->ZPolynomial(I, J))->Value(k)); |
214 | } |
215 | for (k = 1; k <= 48; k++) |
216 | IW.Send( 0.0); //Send Arbitrary Values |
217 | } |
218 | for (J = 1; J <= (nbVSegs+1)*48; J++) |
219 | IW.Send( 0.0); //Send Arbitrary Values |
220 | } |
221 | |
222 | void IGESGeom_ToolSplineSurface::OwnShared |
223 | (const Handle(IGESGeom_SplineSurface)& /* ent */, Interface_EntityIterator& /* iter */) const |
224 | { |
225 | } |
226 | |
227 | void IGESGeom_ToolSplineSurface::OwnCopy |
228 | (const Handle(IGESGeom_SplineSurface)& another, |
229 | const Handle(IGESGeom_SplineSurface)& ent, Interface_CopyTool& /* TC */) const |
230 | { |
231 | |
232 | Standard_Integer aBoundaryType, aPatchType, allNbUSegments, allNbVSegments; |
233 | Standard_Integer I, J; |
234 | |
235 | aBoundaryType = another->BoundaryType(); |
236 | aPatchType = another->PatchType(); |
237 | allNbUSegments = another->NbUSegments(); |
238 | allNbVSegments = another->NbVSegments(); |
239 | |
240 | Handle(TColStd_HArray1OfReal) allUBreakPoints = |
241 | new TColStd_HArray1OfReal(1, allNbUSegments+1); |
242 | |
243 | Handle(TColStd_HArray1OfReal) allVBreakPoints = |
244 | new TColStd_HArray1OfReal(1, allNbVSegments+1); |
245 | |
246 | for ( I =1; I <= allNbUSegments+1; I++) |
247 | allUBreakPoints->SetValue(I, another->UBreakPoint(I)); |
248 | |
249 | for ( I =1; I <= allNbVSegments+1; I++) |
250 | allVBreakPoints->SetValue(I, another->VBreakPoint(I)); |
251 | |
252 | Handle(IGESBasic_HArray2OfHArray1OfReal) allXCoeffs = new |
253 | IGESBasic_HArray2OfHArray1OfReal(1,allNbUSegments,1,allNbVSegments); |
254 | |
255 | Handle(IGESBasic_HArray2OfHArray1OfReal) allYCoeffs = new |
256 | IGESBasic_HArray2OfHArray1OfReal(1,allNbUSegments,1,allNbVSegments); |
257 | |
258 | Handle(IGESBasic_HArray2OfHArray1OfReal) allZCoeffs = new |
259 | IGESBasic_HArray2OfHArray1OfReal(1,allNbUSegments,1,allNbVSegments); |
260 | |
261 | Handle(TColStd_HArray1OfReal) temp = |
262 | new TColStd_HArray1OfReal(1, 16); |
263 | |
264 | for (I =1; I <= allNbUSegments; I++) |
265 | for (J = 1; J <= allNbVSegments; J++) |
266 | { |
267 | temp = another->XPolynomial(I, J); |
268 | allXCoeffs->SetValue(I,J,temp); |
269 | temp = another->YPolynomial(I,J); |
270 | allYCoeffs->SetValue(I,J,temp); |
271 | temp = another->ZPolynomial(I,J); |
272 | allZCoeffs->SetValue(I,J,temp); |
273 | } |
274 | |
275 | ent->Init(aBoundaryType , aPatchType, allUBreakPoints, allVBreakPoints, |
276 | allXCoeffs, allYCoeffs, allZCoeffs); |
277 | } |
278 | |
279 | |
280 | IGESData_DirChecker IGESGeom_ToolSplineSurface::DirChecker |
281 | (const Handle(IGESGeom_SplineSurface)& /* ent */ ) const |
282 | { |
283 | IGESData_DirChecker DC(114,0); |
284 | DC.Structure(IGESData_DefVoid); |
285 | DC.LineFont(IGESData_DefAny); |
286 | // DC.LineWeight(IGESData_DefValue); |
287 | DC.Color(IGESData_DefAny); |
288 | DC.HierarchyStatusIgnored (); |
289 | return DC; |
290 | } |
291 | |
292 | void IGESGeom_ToolSplineSurface::OwnCheck |
293 | (const Handle(IGESGeom_SplineSurface)& ent, |
294 | const Interface_ShareTool& , Handle(Interface_Check)& ach) const |
295 | { |
296 | |
297 | // MGE 30/07/98 |
298 | // Building of messages |
299 | //======================================== |
300 | // Message_Msg Msg140("XSTEP_140"); |
301 | //======================================== |
302 | |
303 | if (ent->BoundaryType() < 1 || ent->BoundaryType() > 6){ |
304 | Message_Msg Msg140("XSTEP_140"); |
305 | ach->SendFail(Msg140); |
306 | } |
307 | // if (ent->PatchType() < 0 || ent->PatchType() > 1) |
308 | // ach.AddFail("Incorrect Patch Type not in [0-1]"); |
309 | } |
310 | |
311 | void IGESGeom_ToolSplineSurface::OwnDump |
312 | (const Handle(IGESGeom_SplineSurface)& ent, const IGESData_IGESDumper& /* dumper */, |
0ebe5b0a |
313 | Standard_OStream& S, const Standard_Integer level) const |
7fd59977 |
314 | { |
0ebe5b0a |
315 | S << "IGESGeom_SplineSurface\n"; |
7fd59977 |
316 | |
317 | Standard_Integer I, J; |
318 | Standard_Integer nbUSegs = ent->NbUSegments(); |
319 | Standard_Integer nbVSegs = ent->NbVSegments(); |
320 | Handle(TColStd_HArray1OfReal) temp; |
321 | |
322 | S << "The Spline Boundary Type : " << ent->BoundaryType() ; |
323 | switch (ent->BoundaryType()) |
324 | { |
325 | case 1 : S << " (Linear)"; break; |
326 | case 2 : S << " (Quadratic)"; break; |
327 | case 3 : S << " (Cubic)"; break; |
328 | case 4 : S << " (Wilson-Fowler)"; break; |
329 | case 5 : S << " (Modified Wison-Fowler)"; break; |
330 | case 6 : S << " (B-Spline)"; break; |
331 | default : S << " (Invalid value)"; break; |
332 | } |
0ebe5b0a |
333 | S << "\n" |
334 | << "The Patch Type : " << ent->PatchType(); |
7fd59977 |
335 | if (ent->PatchType() == 1) S << " (Cartesian Product)"; |
336 | else S << " (Unspecified)"; |
0ebe5b0a |
337 | S << "\n" |
338 | << "Number Of Segments. In U : " |
339 | << nbUSegs << " In V : " << nbVSegs << "\n" |
340 | << "The U Break Points : "; |
341 | IGESData_DumpVals(S,level,1, nbUSegs+1,ent->UBreakPoint); |
342 | S << "\nThe V Break Points : "; |
343 | IGESData_DumpVals(S,level,1, nbVSegs+1,ent->VBreakPoint); |
344 | |
345 | S << "\n X-Y-Z Polynomials Of Segments :\n"; |
7fd59977 |
346 | if (level > 4) |
347 | { |
348 | for (I = 1; I <= nbUSegs; I++) |
349 | for (J = 1; J <= nbVSegs; J++) |
350 | { |
0ebe5b0a |
351 | S << "[" << I <<"," << J << "]:\n" |
352 | << "X Polynomial : "; |
7fd59977 |
353 | temp = ent->XPolynomial(I,J); |
354 | IGESData_DumpVals(S,level,1, temp->Length(),temp->Value); |
0ebe5b0a |
355 | S << "\n" |
356 | << "Y Polynomial : "; |
7fd59977 |
357 | temp = ent->YPolynomial(I,J); |
358 | IGESData_DumpVals(S,level,1, temp->Length(),temp->Value); |
0ebe5b0a |
359 | S << "\n" |
360 | << "Z Polynomial : "; |
7fd59977 |
361 | temp = ent->ZPolynomial(I,J); |
362 | IGESData_DumpVals(S,level,1, temp->Length(),temp->Value); |
0ebe5b0a |
363 | S << "\n"; |
7fd59977 |
364 | } |
365 | } |
0ebe5b0a |
366 | else S << std::endl; |
7fd59977 |
367 | } |