1 // Created by: CKY / Contract Toubro-Larsen
2 // Copyright (c) 1993-1999 Matra Datavision
3 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
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
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.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 //--------------------------------------------------------------------
17 //--------------------------------------------------------------------
19 #include <IGESData_DirChecker.hxx>
20 #include <IGESData_Dump.hxx>
21 #include <IGESData_IGESDumper.hxx>
22 #include <IGESData_IGESReaderData.hxx>
23 #include <IGESData_IGESWriter.hxx>
24 #include <IGESData_ParamCursor.hxx>
25 #include <IGESData_ParamReader.hxx>
26 #include <IGESGeom_SplineCurve.hxx>
27 #include <IGESGeom_ToolSplineCurve.hxx>
28 #include <Interface_Check.hxx>
29 #include <Interface_CopyTool.hxx>
30 #include <Interface_EntityIterator.hxx>
31 #include <Interface_Macros.hxx>
32 #include <Interface_ShareTool.hxx>
33 #include <Message_Messenger.hxx>
34 #include <Message_Msg.hxx>
35 #include <Standard_DomainError.hxx>
36 #include <TColStd_HArray1OfReal.hxx>
37 #include <TColStd_HArray2OfReal.hxx>
41 IGESGeom_ToolSplineCurve::IGESGeom_ToolSplineCurve () { }
44 void IGESGeom_ToolSplineCurve::ReadOwnParams
45 (const Handle(IGESGeom_SplineCurve)& ent,
46 const Handle(IGESData_IGESReaderData)& /* IR */, IGESData_ParamReader& PR) const
49 // Building of messages
51 //Standard_Boolean st; //szv#4:S4163:12Mar99 not needed
52 Standard_Integer nbSegments;
53 Standard_Integer aType, aDegree, nbDimensions;
54 Handle(TColStd_HArray1OfReal) allBreakPoints;
55 Handle(TColStd_HArray2OfReal) allXPolynomials;
56 Handle(TColStd_HArray2OfReal) allYPolynomials;
57 Handle(TColStd_HArray2OfReal) allZPolynomials;
58 Handle(TColStd_HArray1OfReal) allXvalues = new TColStd_HArray1OfReal(1, 4);
59 Handle(TColStd_HArray1OfReal) allYvalues = new TColStd_HArray1OfReal(1, 4);
60 Handle(TColStd_HArray1OfReal) allZvalues = new TColStd_HArray1OfReal(1, 4);
62 //szv#4:S4163:12Mar99 `st=` not needed
63 if (!PR.ReadInteger(PR.Current(), aType)){
64 Message_Msg Msg91("XSTEP_91");
67 if (!PR.ReadInteger(PR.Current(), aDegree)){
68 Message_Msg Msg92("XSTEP_92");
71 if (!PR.ReadInteger(PR.Current(), nbDimensions)){
72 Message_Msg Msg93("XSTEP_93");
75 //st = PR.ReadInteger(PR.Current(), Msg94, nbSegments); //szv#4:S4163:12Mar99 moved in if
78 st = PR.ReadInteger(PR.Current(), "Spline Type", aType);
79 st = PR.ReadInteger(PR.Current(), "Degree Continuity", aDegree);
80 st = PR.ReadInteger(PR.Current(), "Number Of Dimensions", nbDimensions);
81 st = PR.ReadInteger(PR.Current(), "Number Of Segments", nbSegments);
83 if (PR.ReadInteger(PR.Current(), nbSegments)) {
85 Message_Msg Msg94("XSTEP_94");
89 allXPolynomials = new TColStd_HArray2OfReal (1, nbSegments, 1, 4);
90 allYPolynomials = new TColStd_HArray2OfReal (1, nbSegments, 1, 4);
91 allZPolynomials = new TColStd_HArray2OfReal (1, nbSegments, 1, 4);
92 allBreakPoints = new TColStd_HArray1OfReal (1, (nbSegments + 1));
94 Message_Msg Msg95("XSTEP_95");
95 PR.ReadReals(PR.CurrentList(nbSegments + 1), Msg95, allBreakPoints); //szv#4:S4163:12Mar99 `st=` not needed
97 st = PR.ReadReals(PR.CurrentList(nbSegments + 1), "Break Points",
102 Message_Msg Msg94("XSTEP_94");
106 Handle(TColStd_HArray1OfReal) temp;
107 temp = new TColStd_HArray1OfReal(1,4);
109 if (! allXPolynomials.IsNull()) {
111 for (I = 1; I <= nbSegments; I++)
113 //st = PR.ReadReals(PR.CurrentList(4),"X-Coordinate Polynomial",temp); //szv#4:S4163:12Mar99 moved in if
114 if (PR.ReadReals(PR.CurrentList(4),"X-Coordinate Polynomial",temp)) {
116 for (J = 1; J <= 4; J++)
117 allXPolynomials->SetValue(I, J, temp->Value(J));
120 //st = PR.ReadReals(PR.CurrentList(4),"Y-Coordinate Polynomial",temp); //szv#4:S4163:12Mar99 moved in if
121 if (PR.ReadReals(PR.CurrentList(4),"Y-Coordinate Polynomial",temp)) {
123 for (J = 1; J <= 4; J++)
124 allYPolynomials->SetValue(I, J, temp->Value(J));
127 //st = PR.ReadReals(PR.CurrentList(4),"Z-Coordinate Polynomial",temp); //szv#4:S4163:12Mar99 moved in if
128 if (PR.ReadReals(PR.CurrentList(4),"Z-Coordinate Polynomial",temp)) {
130 for (J = 1; J <= 4; J++)
131 allZPolynomials->SetValue(I, J, temp->Value(J));
136 //st = PR.ReadReals(PR.CurrentList(4), "TerminatePoint X-Values", temp); //szv#4:S4163:12Mar99 moved in if
137 if (PR.ReadReals(PR.CurrentList(4), "TerminatePoint X-Values", temp)) {
139 for (J = 1; J <= 4; J++)
140 allXvalues->SetValue(J, temp->Value(J));
143 //st = PR.ReadReals(PR.CurrentList(4), "TerminatePoint Y-Values", temp); //szv#4:S4163:12Mar99 moved in if
144 if (PR.ReadReals(PR.CurrentList(4), "TerminatePoint Y-Values", temp)) {
146 for (J = 1; J <= 4; J++)
147 allYvalues->SetValue(J, temp->Value(J));
150 //st = PR.ReadReals(PR.CurrentList(4), "TerminatePoint Z-Values", temp); //szv#4:S4163:12Mar99 moved in if
151 if (PR.ReadReals(PR.CurrentList(4), "TerminatePoint Z-Values", temp)) {
153 for (J = 1; J <= 4; J++)
154 allZvalues->SetValue(J, temp->Value(J));
157 //sln 28.09.2001, BUC61004, If the condition is true function ent->Init is not called in order to avoid exception
158 if(allBreakPoints.IsNull() || allXPolynomials.IsNull() || allYPolynomials.IsNull() || allZPolynomials.IsNull())
162 DirChecker(ent).CheckTypeAndForm(PR.CCheck(),ent);
164 (aType, aDegree, nbDimensions, allBreakPoints,
165 allXPolynomials, allYPolynomials, allZPolynomials,
166 allXvalues, allYvalues, allZvalues);
170 void IGESGeom_ToolSplineCurve::WriteOwnParams
171 (const Handle(IGESGeom_SplineCurve)& ent, IGESData_IGESWriter& IW) const
173 IW.Send(ent->SplineType());
174 IW.Send(ent->Degree());
175 IW.Send(ent->NbDimensions());
176 Standard_Integer nbSegments = ent->NbSegments();
180 for (I = 1; I <= nbSegments + 1; I++)
181 IW.Send(ent->BreakPoint(I));
182 Standard_Real AX,BX,CX,DX, AY,BY,CY,DY, AZ,BZ,CZ,DZ;
183 for (I = 1; I <= nbSegments; I++) {
184 //no need to declare (hides the same name in an outer scope)
185 // Standard_Real AX,BX,CX,DX, AY,BY,CY,DY, AZ,BZ,CZ,DZ;
186 ent->XCoordPolynomial(I,AX,BX,CX,DX);
187 ent->YCoordPolynomial(I,AY,BY,CY,DY);
188 ent->ZCoordPolynomial(I,AZ,BZ,CZ,DZ);
189 IW.Send(AX); IW.Send(BX); IW.Send(CX); IW.Send(DX);
190 IW.Send(AY); IW.Send(BY); IW.Send(CY); IW.Send(DY);
191 IW.Send(AZ); IW.Send(BZ); IW.Send(CZ); IW.Send(DZ);
193 ent->XValues(AX,BX,CX,DX);
194 ent->YValues(AY,BY,CY,DY);
195 ent->ZValues(AZ,BZ,CZ,DZ);
196 IW.Send(AX); IW.Send(BX); IW.Send(CX); IW.Send(DX);
197 IW.Send(AY); IW.Send(BY); IW.Send(CY); IW.Send(DY);
198 IW.Send(AZ); IW.Send(BZ); IW.Send(CZ); IW.Send(DZ);
201 void IGESGeom_ToolSplineCurve::OwnShared
202 (const Handle(IGESGeom_SplineCurve)& /* ent */, Interface_EntityIterator& /* iter */) const
206 void IGESGeom_ToolSplineCurve::OwnCopy
207 (const Handle(IGESGeom_SplineCurve)& another,
208 const Handle(IGESGeom_SplineCurve)& ent, Interface_CopyTool& /* TC */) const
211 Standard_Real A, B, C, D;
212 Standard_Integer aType = another->SplineType();
213 Standard_Integer aDegree = another->Degree();
214 Standard_Integer nbDimensions = another->NbDimensions();
215 Standard_Integer nbSegments = another->NbSegments();
217 Handle(TColStd_HArray1OfReal) allBreakPoints =
218 new TColStd_HArray1OfReal(1, nbSegments+1);
219 for (I = 1; I <= (nbSegments + 1); I++)
220 allBreakPoints->SetValue(I, another->BreakPoint(I));
222 Handle(TColStd_HArray2OfReal) allXPolynomials =
223 new TColStd_HArray2OfReal(1, nbSegments, 1, 4);
224 Handle(TColStd_HArray2OfReal) allYPolynomials =
225 new TColStd_HArray2OfReal(1, nbSegments, 1, 4);
226 Handle(TColStd_HArray2OfReal) allZPolynomials =
227 new TColStd_HArray2OfReal(1, nbSegments, 1, 4);
229 for (I = 1; I <= nbSegments; I++) {
230 another->XCoordPolynomial(I, A, B, C, D);
231 allXPolynomials->SetValue(I, 1, A);
232 allXPolynomials->SetValue(I, 2, B);
233 allXPolynomials->SetValue(I, 3, C);
234 allXPolynomials->SetValue(I, 4, D);
236 another->YCoordPolynomial(I, A, B, C, D);
237 allYPolynomials->SetValue(I, 1, A);
238 allYPolynomials->SetValue(I, 2, B);
239 allYPolynomials->SetValue(I, 3, C);
240 allYPolynomials->SetValue(I, 4, D);
242 another->ZCoordPolynomial(I, A, B, C, D);
243 allZPolynomials->SetValue(I, 1, A);
244 allZPolynomials->SetValue(I, 2, B);
245 allZPolynomials->SetValue(I, 3, C);
246 allZPolynomials->SetValue(I, 4, D);
249 Handle(TColStd_HArray1OfReal) allXvalues =
250 new TColStd_HArray1OfReal(1, 4);
251 Handle(TColStd_HArray1OfReal) allYvalues =
252 new TColStd_HArray1OfReal(1, 4);
253 Handle(TColStd_HArray1OfReal) allZvalues =
254 new TColStd_HArray1OfReal(1, 4);
256 another->XValues(A, B, C, D);
257 allXvalues->SetValue(1, A);
258 allXvalues->SetValue(2, B);
259 allXvalues->SetValue(3, C);
260 allXvalues->SetValue(4, D);
262 another->YValues(A, B, C, D);
263 allYvalues->SetValue(1, A);
264 allYvalues->SetValue(2, B);
265 allYvalues->SetValue(3, C);
266 allYvalues->SetValue(4, D);
268 another->ZValues(A, B, C, D);
269 allZvalues->SetValue(1, A);
270 allZvalues->SetValue(2, B);
271 allZvalues->SetValue(3, C);
272 allZvalues->SetValue(4, D);
274 ent->Init(aType, aDegree, nbDimensions, allBreakPoints,
275 allXPolynomials, allYPolynomials, allZPolynomials,
276 allXvalues, allYvalues, allZvalues);
280 IGESData_DirChecker IGESGeom_ToolSplineCurve::DirChecker
281 (const Handle(IGESGeom_SplineCurve)& /* ent */ ) const
283 IGESData_DirChecker DC(112, 0);
284 DC.Structure(IGESData_DefVoid);
285 DC.LineFont(IGESData_DefAny);
286 // DC.LineWeight(IGESData_DefValue);
287 DC.Color(IGESData_DefAny);
288 DC.HierarchyStatusIgnored();
293 void IGESGeom_ToolSplineCurve::OwnCheck
294 (const Handle(IGESGeom_SplineCurve)& ent,
295 const Interface_ShareTool& , Handle(Interface_Check)& ach) const
298 // Building of messages
300 if (ent->SplineType() < 1 || ent->SplineType() > 6){
301 Message_Msg Msg91("XSTEP_91");
302 ach->SendFail(Msg91);
304 if (ent->NbDimensions() == 2) {
305 Standard_Integer nbSegments = ent->NbSegments();
306 Standard_Real AZ,BZ,CZ,DZ;
307 Message_Msg Msg96("XSTEP_96");
308 for (Standard_Integer I = 1; I <= nbSegments; I ++) {
309 ent->ZCoordPolynomial(I,AZ,BZ,CZ,DZ);
310 if (BZ != 0 || CZ != 0 || DZ != 0) {
311 ach->SendFail(Msg96);
315 else if (ent->NbDimensions() != 3){
316 Message_Msg Msg93("XSTEP_93");
317 ach->SendFail(Msg93);
321 void IGESGeom_ToolSplineCurve::OwnDump
322 (const Handle(IGESGeom_SplineCurve)& ent, const IGESData_IGESDumper& /* dumper */,
323 const Handle(Message_Messenger)& S, const Standard_Integer level) const
325 S << "IGESGeom_SplineCurve" << Message_EndLine;
327 Standard_Integer nbSegments = ent->NbSegments();
328 S << "Spline Type : " << ent->SplineType() << " ";
329 switch (ent->SplineType())
331 case 1 : S << "(Linear)"; break;
332 case 2 : S << "(Quadratic)"; break;
333 case 3 : S << "(Cubic)"; break;
334 case 4 : S << "(Wilson-Fowler)"; break;
335 case 5 : S << "(Modified Wison-Fowler)"; break;
336 case 6 : S << "(B-Spline)"; break;
337 default : S << "(Invalid value)"; break;
339 S << Message_EndLine;
340 S << "Degree Of Continuity : " << ent->Degree() << Message_EndLine;
341 S << "Number Of Dimensions : " << ent->NbDimensions() << Message_EndLine;
342 S << "Number Of Segments : " << ent->NbSegments() << Message_EndLine;
343 S << "Segment Break Points : ";
344 IGESData_DumpVals(S ,level,1, nbSegments+1,ent->BreakPoint);
346 S << " [ also ask level > 4 for X-Y-Z Polynomials ]" << Message_EndLine;
349 S << " -- Polynomial Values --" << Message_EndLine;
350 Standard_Real AX,BX,CX,DX, AY,BY,CY,DY, AZ,BZ,CZ,DZ;
351 for (Standard_Integer I = 1; I <= nbSegments; I++) {
352 //no need to declare (hides the same name in an outer scope)
353 // Standard_Real AX,BX,CX,DX, AY,BY,CY,DY, AZ,BZ,CZ,DZ;
354 ent->XCoordPolynomial(I,AX,BX,CX,DX);
355 ent->YCoordPolynomial(I,AY,BY,CY,DY);
356 ent->ZCoordPolynomial(I,AZ,BZ,CZ,DZ);
357 S << "Segment "<<I<<" : X Y Z"<<Message_EndLine;
358 S << " A ... "<<AX<<" "<<AY<<" "<<AZ<<Message_EndLine;
359 S << " B ... "<<BX<<" "<<BY<<" "<<BZ<<Message_EndLine;
360 S << " C ... "<<CX<<" "<<CY<<" "<<CZ<<Message_EndLine;
361 S << " D ... "<<DX<<" "<<DY<<" "<<DZ<<Message_EndLine;
363 ent->XValues(AX,BX,CX,DX);
364 ent->YValues(AY,BY,CY,DY);
365 ent->ZValues(AZ,BZ,CZ,DZ);
366 S << "Terminate Point : X Y Z"<<Message_EndLine;
367 S << " Value "<<AX<<" "<<AY<<" "<<AZ<<Message_EndLine;
368 S << " 1st Derivative "<<BX<<" "<<BY<<" "<<BZ<<Message_EndLine;
369 S << " 2nd Der./2! "<<CX<<" "<<CY<<" "<<CZ<<Message_EndLine;
370 S << " 3rd Der./3! "<<DX<<" "<<DY<<" "<<DZ<<Message_EndLine;