0033661: Data Exchange, Step Import - Tessellated GDTs are not imported
[occt.git] / src / IGESGeom / IGESGeom_ToolSplineCurve.cxx
CommitLineData
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
42cf5bc1 19#include <IGESData_DirChecker.hxx>
7fd59977 20#include <IGESData_Dump.hxx>
42cf5bc1 21#include <IGESData_IGESDumper.hxx>
22#include <IGESData_IGESReaderData.hxx>
23#include <IGESData_IGESWriter.hxx>
42cf5bc1 24#include <IGESData_ParamReader.hxx>
25#include <IGESGeom_SplineCurve.hxx>
26#include <IGESGeom_ToolSplineCurve.hxx>
27#include <Interface_Check.hxx>
28#include <Interface_CopyTool.hxx>
29#include <Interface_EntityIterator.hxx>
42cf5bc1 30#include <Interface_ShareTool.hxx>
7fd59977 31#include <Message_Msg.hxx>
42cf5bc1 32#include <TColStd_HArray1OfReal.hxx>
33#include <TColStd_HArray2OfReal.hxx>
7fd59977 34
42cf5bc1 35#include <stdio.h>
36// MGE 29/07/98
7fd59977 37IGESGeom_ToolSplineCurve::IGESGeom_ToolSplineCurve () { }
38
39
40void IGESGeom_ToolSplineCurve::ReadOwnParams
41 (const Handle(IGESGeom_SplineCurve)& ent,
42 const Handle(IGESData_IGESReaderData)& /* IR */, IGESData_ParamReader& PR) const
43{
44 // MGE 29/07/98
45 // Building of messages
46
47 //Standard_Boolean st; //szv#4:S4163:12Mar99 not needed
48 Standard_Integer nbSegments;
8c2d3314 49 Standard_Integer aType, aDegree, nbDimensions;
7fd59977 50 Handle(TColStd_HArray1OfReal) allBreakPoints;
51 Handle(TColStd_HArray2OfReal) allXPolynomials;
52 Handle(TColStd_HArray2OfReal) allYPolynomials;
53 Handle(TColStd_HArray2OfReal) allZPolynomials;
54 Handle(TColStd_HArray1OfReal) allXvalues = new TColStd_HArray1OfReal(1, 4);
55 Handle(TColStd_HArray1OfReal) allYvalues = new TColStd_HArray1OfReal(1, 4);
56 Handle(TColStd_HArray1OfReal) allZvalues = new TColStd_HArray1OfReal(1, 4);
57
58 //szv#4:S4163:12Mar99 `st=` not needed
59 if (!PR.ReadInteger(PR.Current(), aType)){
60 Message_Msg Msg91("XSTEP_91");
61 PR.SendFail(Msg91);
62 }
63 if (!PR.ReadInteger(PR.Current(), aDegree)){
64 Message_Msg Msg92("XSTEP_92");
65 PR.SendFail(Msg92);
66 }
67 if (!PR.ReadInteger(PR.Current(), nbDimensions)){
68 Message_Msg Msg93("XSTEP_93");
69 PR.SendFail(Msg93);
70 }
71 //st = PR.ReadInteger(PR.Current(), Msg94, nbSegments); //szv#4:S4163:12Mar99 moved in if
72
73/*
74 st = PR.ReadInteger(PR.Current(), "Spline Type", aType);
75 st = PR.ReadInteger(PR.Current(), "Degree Continuity", aDegree);
76 st = PR.ReadInteger(PR.Current(), "Number Of Dimensions", nbDimensions);
77 st = PR.ReadInteger(PR.Current(), "Number Of Segments", nbSegments);
78*/
79 if (PR.ReadInteger(PR.Current(), nbSegments)) {
80 if (nbSegments <= 0){
81 Message_Msg Msg94("XSTEP_94");
82 PR.SendFail(Msg94);
83 }
84 else {
85 allXPolynomials = new TColStd_HArray2OfReal (1, nbSegments, 1, 4);
86 allYPolynomials = new TColStd_HArray2OfReal (1, nbSegments, 1, 4);
87 allZPolynomials = new TColStd_HArray2OfReal (1, nbSegments, 1, 4);
88 allBreakPoints = new TColStd_HArray1OfReal (1, (nbSegments + 1));
89 }
90 Message_Msg Msg95("XSTEP_95");
91 PR.ReadReals(PR.CurrentList(nbSegments + 1), Msg95, allBreakPoints); //szv#4:S4163:12Mar99 `st=` not needed
92/*
93 st = PR.ReadReals(PR.CurrentList(nbSegments + 1), "Break Points",
94 allBreakPoints);
95*/
96 }
97 else{
98 Message_Msg Msg94("XSTEP_94");
99 PR.SendFail(Msg94);
100 }
101
102 Handle(TColStd_HArray1OfReal) temp;
103 temp = new TColStd_HArray1OfReal(1,4);
104
105 if (! allXPolynomials.IsNull()) {
106 Standard_Integer I;
107 for (I = 1; I <= nbSegments; I++)
108 {
109 //st = PR.ReadReals(PR.CurrentList(4),"X-Coordinate Polynomial",temp); //szv#4:S4163:12Mar99 moved in if
110 if (PR.ReadReals(PR.CurrentList(4),"X-Coordinate Polynomial",temp)) {
111 Standard_Integer J;
112 for (J = 1; J <= 4; J++)
113 allXPolynomials->SetValue(I, J, temp->Value(J));
114 }
115
116 //st = PR.ReadReals(PR.CurrentList(4),"Y-Coordinate Polynomial",temp); //szv#4:S4163:12Mar99 moved in if
117 if (PR.ReadReals(PR.CurrentList(4),"Y-Coordinate Polynomial",temp)) {
118 Standard_Integer J;
119 for (J = 1; J <= 4; J++)
120 allYPolynomials->SetValue(I, J, temp->Value(J));
121 }
122
123 //st = PR.ReadReals(PR.CurrentList(4),"Z-Coordinate Polynomial",temp); //szv#4:S4163:12Mar99 moved in if
124 if (PR.ReadReals(PR.CurrentList(4),"Z-Coordinate Polynomial",temp)) {
125 Standard_Integer J;
126 for (J = 1; J <= 4; J++)
127 allZPolynomials->SetValue(I, J, temp->Value(J));
128 }
129 }
130 }
131
132 //st = PR.ReadReals(PR.CurrentList(4), "TerminatePoint X-Values", temp); //szv#4:S4163:12Mar99 moved in if
133 if (PR.ReadReals(PR.CurrentList(4), "TerminatePoint X-Values", temp)) {
134 Standard_Integer J;
135 for (J = 1; J <= 4; J++)
136 allXvalues->SetValue(J, temp->Value(J));
137 }
138
139 //st = PR.ReadReals(PR.CurrentList(4), "TerminatePoint Y-Values", temp); //szv#4:S4163:12Mar99 moved in if
140 if (PR.ReadReals(PR.CurrentList(4), "TerminatePoint Y-Values", temp)) {
141 Standard_Integer J;
142 for (J = 1; J <= 4; J++)
143 allYvalues->SetValue(J, temp->Value(J));
144 }
145
146 //st = PR.ReadReals(PR.CurrentList(4), "TerminatePoint Z-Values", temp); //szv#4:S4163:12Mar99 moved in if
147 if (PR.ReadReals(PR.CurrentList(4), "TerminatePoint Z-Values", temp)) {
148 Standard_Integer J;
149 for (J = 1; J <= 4; J++)
150 allZvalues->SetValue(J, temp->Value(J));
151 }
152
153 //sln 28.09.2001, BUC61004, If the condition is true function ent->Init is not called in order to avoid exception
154 if(allBreakPoints.IsNull() || allXPolynomials.IsNull() || allYPolynomials.IsNull() || allZPolynomials.IsNull())
155 return;
156 else
157 {
158 DirChecker(ent).CheckTypeAndForm(PR.CCheck(),ent);
159 ent->Init
160 (aType, aDegree, nbDimensions, allBreakPoints,
161 allXPolynomials, allYPolynomials, allZPolynomials,
162 allXvalues, allYvalues, allZvalues);
163 }
164}
165
166void IGESGeom_ToolSplineCurve::WriteOwnParams
167 (const Handle(IGESGeom_SplineCurve)& ent, IGESData_IGESWriter& IW) const
168{
169 IW.Send(ent->SplineType());
170 IW.Send(ent->Degree());
171 IW.Send(ent->NbDimensions());
172 Standard_Integer nbSegments = ent->NbSegments();
173 IW.Send(nbSegments);
174
175 Standard_Integer I;
176 for (I = 1; I <= nbSegments + 1; I++)
177 IW.Send(ent->BreakPoint(I));
178 Standard_Real AX,BX,CX,DX, AY,BY,CY,DY, AZ,BZ,CZ,DZ;
179 for (I = 1; I <= nbSegments; I++) {
180//no need to declare (hides the same name in an outer scope)
181// Standard_Real AX,BX,CX,DX, AY,BY,CY,DY, AZ,BZ,CZ,DZ;
182 ent->XCoordPolynomial(I,AX,BX,CX,DX);
183 ent->YCoordPolynomial(I,AY,BY,CY,DY);
184 ent->ZCoordPolynomial(I,AZ,BZ,CZ,DZ);
185 IW.Send(AX); IW.Send(BX); IW.Send(CX); IW.Send(DX);
186 IW.Send(AY); IW.Send(BY); IW.Send(CY); IW.Send(DY);
187 IW.Send(AZ); IW.Send(BZ); IW.Send(CZ); IW.Send(DZ);
188 }
189 ent->XValues(AX,BX,CX,DX);
190 ent->YValues(AY,BY,CY,DY);
191 ent->ZValues(AZ,BZ,CZ,DZ);
192 IW.Send(AX); IW.Send(BX); IW.Send(CX); IW.Send(DX);
193 IW.Send(AY); IW.Send(BY); IW.Send(CY); IW.Send(DY);
194 IW.Send(AZ); IW.Send(BZ); IW.Send(CZ); IW.Send(DZ);
195}
196
197void IGESGeom_ToolSplineCurve::OwnShared
198 (const Handle(IGESGeom_SplineCurve)& /* ent */, Interface_EntityIterator& /* iter */) const
199{
200}
201
202void IGESGeom_ToolSplineCurve::OwnCopy
203 (const Handle(IGESGeom_SplineCurve)& another,
204 const Handle(IGESGeom_SplineCurve)& ent, Interface_CopyTool& /* TC */) const
205{
206 Standard_Integer I;
207 Standard_Real A, B, C, D;
208 Standard_Integer aType = another->SplineType();
209 Standard_Integer aDegree = another->Degree();
210 Standard_Integer nbDimensions = another->NbDimensions();
211 Standard_Integer nbSegments = another->NbSegments();
212
213 Handle(TColStd_HArray1OfReal) allBreakPoints =
214 new TColStd_HArray1OfReal(1, nbSegments+1);
215 for (I = 1; I <= (nbSegments + 1); I++)
216 allBreakPoints->SetValue(I, another->BreakPoint(I));
217
218 Handle(TColStd_HArray2OfReal) allXPolynomials =
219 new TColStd_HArray2OfReal(1, nbSegments, 1, 4);
220 Handle(TColStd_HArray2OfReal) allYPolynomials =
221 new TColStd_HArray2OfReal(1, nbSegments, 1, 4);
222 Handle(TColStd_HArray2OfReal) allZPolynomials =
223 new TColStd_HArray2OfReal(1, nbSegments, 1, 4);
224
225 for (I = 1; I <= nbSegments; I++) {
226 another->XCoordPolynomial(I, A, B, C, D);
227 allXPolynomials->SetValue(I, 1, A);
228 allXPolynomials->SetValue(I, 2, B);
229 allXPolynomials->SetValue(I, 3, C);
230 allXPolynomials->SetValue(I, 4, D);
231
232 another->YCoordPolynomial(I, A, B, C, D);
233 allYPolynomials->SetValue(I, 1, A);
234 allYPolynomials->SetValue(I, 2, B);
235 allYPolynomials->SetValue(I, 3, C);
236 allYPolynomials->SetValue(I, 4, D);
237
238 another->ZCoordPolynomial(I, A, B, C, D);
239 allZPolynomials->SetValue(I, 1, A);
240 allZPolynomials->SetValue(I, 2, B);
241 allZPolynomials->SetValue(I, 3, C);
242 allZPolynomials->SetValue(I, 4, D);
243 }
244
245 Handle(TColStd_HArray1OfReal) allXvalues =
246 new TColStd_HArray1OfReal(1, 4);
247 Handle(TColStd_HArray1OfReal) allYvalues =
248 new TColStd_HArray1OfReal(1, 4);
249 Handle(TColStd_HArray1OfReal) allZvalues =
250 new TColStd_HArray1OfReal(1, 4);
251
252 another->XValues(A, B, C, D);
253 allXvalues->SetValue(1, A);
254 allXvalues->SetValue(2, B);
255 allXvalues->SetValue(3, C);
256 allXvalues->SetValue(4, D);
257
258 another->YValues(A, B, C, D);
259 allYvalues->SetValue(1, A);
260 allYvalues->SetValue(2, B);
261 allYvalues->SetValue(3, C);
262 allYvalues->SetValue(4, D);
263
264 another->ZValues(A, B, C, D);
265 allZvalues->SetValue(1, A);
266 allZvalues->SetValue(2, B);
267 allZvalues->SetValue(3, C);
268 allZvalues->SetValue(4, D);
269
270 ent->Init(aType, aDegree, nbDimensions, allBreakPoints,
271 allXPolynomials, allYPolynomials, allZPolynomials,
272 allXvalues, allYvalues, allZvalues);
273}
274
275
276IGESData_DirChecker IGESGeom_ToolSplineCurve::DirChecker
277 (const Handle(IGESGeom_SplineCurve)& /* ent */ ) const
278{
279 IGESData_DirChecker DC(112, 0);
280 DC.Structure(IGESData_DefVoid);
281 DC.LineFont(IGESData_DefAny);
282// DC.LineWeight(IGESData_DefValue);
283 DC.Color(IGESData_DefAny);
284 DC.HierarchyStatusIgnored();
285
286 return DC;
287}
288
289void IGESGeom_ToolSplineCurve::OwnCheck
290 (const Handle(IGESGeom_SplineCurve)& ent,
291 const Interface_ShareTool& , Handle(Interface_Check)& ach) const
292{
293 // MGE 29/07/98
294 // Building of messages
295
296 if (ent->SplineType() < 1 || ent->SplineType() > 6){
297 Message_Msg Msg91("XSTEP_91");
298 ach->SendFail(Msg91);
299 }
300 if (ent->NbDimensions() == 2) {
301 Standard_Integer nbSegments = ent->NbSegments();
302 Standard_Real AZ,BZ,CZ,DZ;
303 Message_Msg Msg96("XSTEP_96");
304 for (Standard_Integer I = 1; I <= nbSegments; I ++) {
305 ent->ZCoordPolynomial(I,AZ,BZ,CZ,DZ);
306 if (BZ != 0 || CZ != 0 || DZ != 0) {
307 ach->SendFail(Msg96);
308 }
309 }
310 }
311 else if (ent->NbDimensions() != 3){
312 Message_Msg Msg93("XSTEP_93");
313 ach->SendFail(Msg93);
314 }
315}
316
317void IGESGeom_ToolSplineCurve::OwnDump
318 (const Handle(IGESGeom_SplineCurve)& ent, const IGESData_IGESDumper& /* dumper */,
0ebe5b0a 319 Standard_OStream& S, const Standard_Integer level) const
7fd59977 320{
0ebe5b0a 321 S << "IGESGeom_SplineCurve\n";
7fd59977 322
323 Standard_Integer nbSegments = ent->NbSegments();
324 S << "Spline Type : " << ent->SplineType() << " ";
325 switch (ent->SplineType())
326 {
327 case 1 : S << "(Linear)"; break;
328 case 2 : S << "(Quadratic)"; break;
329 case 3 : S << "(Cubic)"; break;
330 case 4 : S << "(Wilson-Fowler)"; break;
331 case 5 : S << "(Modified Wison-Fowler)"; break;
332 case 6 : S << "(B-Spline)"; break;
333 default : S << "(Invalid value)"; break;
334 }
0ebe5b0a 335 S << "\n"
336 << "Degree Of Continuity : " << ent->Degree() << "\n"
337 << "Number Of Dimensions : " << ent->NbDimensions() << "\n"
338 << "Number Of Segments : " << ent->NbSegments() << "\n"
339 << "Segment Break Points : ";
340 IGESData_DumpVals(S,level,1, nbSegments+1,ent->BreakPoint);
7fd59977 341 if (level <= 4) {
0ebe5b0a 342 S << " [ also ask level > 4 for X-Y-Z Polynomials ]" << std::endl;
7fd59977 343 return;
344 }
0ebe5b0a 345 S << " -- Polynomial Values --\n";
7fd59977 346 Standard_Real AX,BX,CX,DX, AY,BY,CY,DY, AZ,BZ,CZ,DZ;
347 for (Standard_Integer I = 1; I <= nbSegments; I++) {
348//no need to declare (hides the same name in an outer scope)
349// Standard_Real AX,BX,CX,DX, AY,BY,CY,DY, AZ,BZ,CZ,DZ;
350 ent->XCoordPolynomial(I,AX,BX,CX,DX);
351 ent->YCoordPolynomial(I,AY,BY,CY,DY);
352 ent->ZCoordPolynomial(I,AZ,BZ,CZ,DZ);
0ebe5b0a 353 S << "Segment "<<I<<" : X Y Z"<<"\n"
354 << " A ... "<<AX<<" "<<AY<<" "<<AZ<<"\n"
355 << " B ... "<<BX<<" "<<BY<<" "<<BZ<<"\n"
356 << " C ... "<<CX<<" "<<CY<<" "<<CZ<<"\n"
357 << " D ... "<<DX<<" "<<DY<<" "<<DZ<<"\n";
7fd59977 358 }
359 ent->XValues(AX,BX,CX,DX);
360 ent->YValues(AY,BY,CY,DY);
361 ent->ZValues(AZ,BZ,CZ,DZ);
0ebe5b0a 362 S << "Terminate Point : X Y Z"<<"\n"
363 << " Value "<<AX<<" "<<AY<<" "<<AZ<<"\n"
364 << " 1st Derivative "<<BX<<" "<<BY<<" "<<BZ<<"\n"
365 << " 2nd Der./2! "<<CX<<" "<<CY<<" "<<CZ<<"\n"
366 << " 3rd Der./3! "<<DX<<" "<<DY<<" "<<DZ<<std::endl;
7fd59977 367}