summaryrefslogtreecommitdiff
path: root/src/RWStepGeom/RWStepGeom_RWBSplineCurveWithKnotsAndRationalBSplineCurve.cxx
blob: 991e8f51bf1ef82ba3585001f32382a8ae6e0b01 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
// sln 04.10.2001. BUC61003. Correction of looking for items of complex entity
#include <RWStepGeom_RWBSplineCurveWithKnotsAndRationalBSplineCurve.ixx>
#include <StepGeom_BSplineCurveWithKnots.hxx>
#include <StepGeom_RationalBSplineCurve.hxx>
#include <StepGeom_HArray1OfCartesianPoint.hxx>
#include <StepGeom_CartesianPoint.hxx>
#include <StepGeom_BSplineCurveForm.hxx>
#include <StepData_Logical.hxx>
#include <TColStd_HArray1OfInteger.hxx>
#include <TColStd_HArray1OfReal.hxx>
#include <StepGeom_KnotType.hxx>

#include <RWStepGeom_RWBSplineCurveWithKnots.hxx>
#include <RWStepGeom_RWRationalBSplineCurve.hxx>


#include <Interface_EntityIterator.hxx>


#include <StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve.hxx>



	// --- Enum : BSplineCurveForm ---
static TCollection_AsciiString bscfEllipticArc(".ELLIPTIC_ARC.");
static TCollection_AsciiString bscfPolylineForm(".POLYLINE_FORM.");
static TCollection_AsciiString bscfParabolicArc(".PARABOLIC_ARC.");
static TCollection_AsciiString bscfCircularArc(".CIRCULAR_ARC.");
static TCollection_AsciiString bscfUnspecified(".UNSPECIFIED.");
static TCollection_AsciiString bscfHyperbolicArc(".HYPERBOLIC_ARC.");

	// --- Enum : KnotType ---
static TCollection_AsciiString ktUniformKnots(".UNIFORM_KNOTS.");
static TCollection_AsciiString ktQuasiUniformKnots(".QUASI_UNIFORM_KNOTS.");
static TCollection_AsciiString ktPiecewiseBezierKnots(".PIECEWISE_BEZIER_KNOTS.");
static TCollection_AsciiString ktUnspecified(".UNSPECIFIED.");

RWStepGeom_RWBSplineCurveWithKnotsAndRationalBSplineCurve::RWStepGeom_RWBSplineCurveWithKnotsAndRationalBSplineCurve () {}

void RWStepGeom_RWBSplineCurveWithKnotsAndRationalBSplineCurve::ReadStep
	(const Handle(StepData_StepReaderData)& data,
	 const Standard_Integer num0,
	 Handle(Interface_Check)& ach,
	 const Handle(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve)& ent) const
{

// sln 04.10.2001. BUC61003. Correction of looking for items of complex entity
	Standard_Integer num = 0;  // num0
	data->NamedForComplex("BOUNDED_CURVE BNDCRV",num0,num,ach);

	// --- Instance of plex componant BoundedCurve ---

	if (!data->CheckNbParams(num,0,ach,"bounded_curve")) return;

//	num = data->NextForComplex(num);
// sln 04.10.2001. BUC61003. Correction of looking for items of complex entity
//        num =  0; gka TRJ9
        data->NamedForComplex("B_SPLINE_CURVE BSPCR",num0,num,ach);

	// --- Instance of common supertype BSplineCurve ---

	if (!data->CheckNbParams(num,5,ach,"b_spline_curve")) return;
	// --- field : degree ---


	Standard_Integer aDegree;
	//szv#4:S4163:12Mar99 `Standard_Boolean stat1 =` not needed
	data->ReadInteger (num,1,"degree",ach,aDegree);
	// --- field : controlPointsList ---


	Handle(StepGeom_HArray1OfCartesianPoint) aControlPointsList;
	Handle(StepGeom_CartesianPoint) anent2;
	Standard_Integer nsub2;
	if (data->ReadSubList (num,2,"control_points_list",ach,nsub2)) {
	  Standard_Integer nb2 = data->NbParams(nsub2);
	  aControlPointsList = new StepGeom_HArray1OfCartesianPoint (1, nb2);
	  for (Standard_Integer i2 = 1; i2 <= nb2; i2 ++) {
	    //szv#4:S4163:12Mar99 `Standard_Boolean stat2 =` not needed
	    if (data->ReadEntity (nsub2, i2,"cartesian_point", ach,
				  STANDARD_TYPE(StepGeom_CartesianPoint), anent2))
	      aControlPointsList->SetValue(i2, anent2);
	  }
	}

	// --- field : curveForm ---


	StepGeom_BSplineCurveForm aCurveForm = StepGeom_bscfPolylineForm;
	if (data->ParamType(num,3) == Interface_ParamEnum) {
	  Standard_CString text = data->ParamCValue(num,3);
	  if      (bscfEllipticArc.IsEqual(text)) aCurveForm = StepGeom_bscfEllipticArc;
	  else if (bscfPolylineForm.IsEqual(text)) aCurveForm = StepGeom_bscfPolylineForm;
	  else if (bscfParabolicArc.IsEqual(text)) aCurveForm = StepGeom_bscfParabolicArc;
	  else if (bscfCircularArc.IsEqual(text)) aCurveForm = StepGeom_bscfCircularArc;
	  else if (bscfUnspecified.IsEqual(text)) aCurveForm = StepGeom_bscfUnspecified;
	  else if (bscfHyperbolicArc.IsEqual(text)) aCurveForm = StepGeom_bscfHyperbolicArc;
	  else ach->AddFail("Enumeration b_spline_curve_form has not an allowed value");
	}
	else ach->AddFail("Parameter #3 (curve_form) is not an enumeration");
	// --- field : closedCurve ---


	StepData_Logical aClosedCurve;
	//szv#4:S4163:12Mar99 `Standard_Boolean stat4 =` not needed
	data->ReadLogical (num,4,"closed_curve",ach,aClosedCurve);
	// --- field : selfIntersect ---


	StepData_Logical aSelfIntersect;
	//szv#4:S4163:12Mar99 `Standard_Boolean stat5 =` not needed
	data->ReadLogical (num,5,"self_intersect",ach,aSelfIntersect);

//	num = data->NextForComplex(num);
// sln 04.10.2001. BUC61003. Correction of looking for items of complex entity
//        num =  0; //gka TRJ9
	data->NamedForComplex("B_SPLINE_CURVE_WITH_KNOTS BSCWK",num0,num,ach);

	// --- Instance of plex componant BSplineCurveWithKnots ---

	if (!data->CheckNbParams(num,3,ach,"b_spline_curve_with_knots")) return;

	// --- field : knotMultiplicities ---

	Handle(TColStd_HArray1OfInteger) aKnotMultiplicities;
	Standard_Integer aKnotMultiplicitiesItem;
	Standard_Integer nsub6;
	if (data->ReadSubList (num,1,"knot_multiplicities",ach,nsub6)) {
	  Standard_Integer nb6 = data->NbParams(nsub6);
	  aKnotMultiplicities = new TColStd_HArray1OfInteger (1, nb6);
	  for (Standard_Integer i6 = 1; i6 <= nb6; i6 ++) {
	    //szv#4:S4163:12Mar99 `Standard_Boolean stat6 =` not needed
	    if (data->ReadInteger (nsub6,i6,"knot_multiplicities",ach,aKnotMultiplicitiesItem))
	      aKnotMultiplicities->SetValue(i6,aKnotMultiplicitiesItem);
	  }
	}

	// --- field : knots ---

	Handle(TColStd_HArray1OfReal) aKnots;
	Standard_Real aKnotsItem;
	Standard_Integer nsub7;
	if (data->ReadSubList (num,2,"knots",ach,nsub7)) {
	  Standard_Integer nb7 = data->NbParams(nsub7);
	  aKnots = new TColStd_HArray1OfReal (1, nb7);
	  for (Standard_Integer i7 = 1; i7 <= nb7; i7 ++) {
	    //szv#4:S4163:12Mar99 `Standard_Boolean stat7 =` not needed
	    if (data->ReadReal (nsub7,i7,"knots",ach,aKnotsItem))
	      aKnots->SetValue(i7,aKnotsItem);
	  }
	}

	// --- field : knotSpec ---

	StepGeom_KnotType aKnotSpec = StepGeom_ktUniformKnots;
	if (data->ParamType(num,3) == Interface_ParamEnum) {
	  Standard_CString text = data->ParamCValue(num,3);
	  if      (ktUniformKnots.IsEqual(text)) aKnotSpec = StepGeom_ktUniformKnots;
	  else if (ktQuasiUniformKnots.IsEqual(text)) aKnotSpec = StepGeom_ktQuasiUniformKnots;
	  else if (ktPiecewiseBezierKnots.IsEqual(text)) aKnotSpec = StepGeom_ktPiecewiseBezierKnots;
	  else if (ktUnspecified.IsEqual(text)) aKnotSpec = StepGeom_ktUnspecified;
	  else ach->AddFail("Enumeration knot_type has not an allowed value");
	}
	else ach->AddFail("Parameter #3 (knot_spec) is not an enumeration");

//	num = data->NextForComplex(num);
// sln 04.10.2001. BUC61003. Correction of looking for items of complex entity
//        num =  0; gka TRJ9
	data->NamedForComplex("CURVE",num0,num,ach);

	// --- Instance of plex componant Curve ---

	if (!data->CheckNbParams(num,0,ach,"curve")) return;

//	num = data->NextForComplex(num);
// sln 04.10.2001. BUC61003. Correction of looking for items of complex entity
        //num =  0;
	data->NamedForComplex("GEOMETRIC_REPRESENTATION_ITEM GMRPIT",num0,num,ach);

	// --- Instance of plex componant GeometricRepresentationItem ---

	if (!data->CheckNbParams(num,0,ach,"geometric_representation_item")) return;

//	num = data->NextForComplex(num);
// sln 04.10.2001. BUC61003. Correction of looking for items of complex entity
        //num =  0;
	data->NamedForComplex("RATIONAL_B_SPLINE_CURVE RBSC",num0,num,ach);

	// --- Instance of plex componant RationalBSplineCurve ---

	if (!data->CheckNbParams(num,1,ach,"rational_b_spline_curve")) return;

	// --- field : weightsData ---

	Handle(TColStd_HArray1OfReal) aWeightsData;
	Standard_Real aWeightsDataItem;
	Standard_Integer nsub9;
	if (data->ReadSubList (num,1,"weights_data",ach,nsub9)) {
	  Standard_Integer nb9 = data->NbParams(nsub9);
	  aWeightsData = new TColStd_HArray1OfReal (1, nb9);
	  for (Standard_Integer i9 = 1; i9 <= nb9; i9 ++) {
	    //szv#4:S4163:12Mar99 `Standard_Boolean stat9 =` not needed
	    if (data->ReadReal (nsub9,i9,"weights_data",ach,aWeightsDataItem))
	      aWeightsData->SetValue(i9,aWeightsDataItem);
	  }
	}

//	num = data->NextForComplex(num);
// sln 04.10.2001. BUC61003. Correction of looking for items of complex entity
        //num =  0;
	data->NamedForComplex("REPRESENTATION_ITEM RPRITM",num0,num,ach);

	// --- Instance of plex componant RepresentationItem ---

	if (!data->CheckNbParams(num,1,ach,"representation_item")) return;

	// --- field : name ---

	Handle(TCollection_HAsciiString) aName;
	//szv#4:S4163:12Mar99 `Standard_Boolean stat10 =` not needed
	data->ReadString (num,1,"name",ach,aName);

	//--- Initialisation of the red entity ---

	ent->Init(aName,aDegree,aControlPointsList,aCurveForm,aClosedCurve,aSelfIntersect,aKnotMultiplicities,aKnots,aKnotSpec,aWeightsData);
}


void RWStepGeom_RWBSplineCurveWithKnotsAndRationalBSplineCurve::WriteStep
	(StepData_StepWriter& SW,
	 const Handle(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve)& ent) const
{

	// --- Instance of plex componant BoundedCurve ---

	SW.StartEntity("BOUNDED_CURVE");

	// --- Instance of common supertype BSplineCurve ---

	SW.StartEntity("B_SPLINE_CURVE");
	// --- field : degree ---

	SW.Send(ent->Degree());
	// --- field : controlPointsList ---

	SW.OpenSub();
	for (Standard_Integer i2 = 1;  i2 <= ent->NbControlPointsList();  i2 ++) {
	  SW.Send(ent->ControlPointsListValue(i2));
	}
	SW.CloseSub();
	// --- field : curveForm ---

	switch(ent->CurveForm()) {
	  case StepGeom_bscfEllipticArc : SW.SendEnum (bscfEllipticArc); break;
	  case StepGeom_bscfPolylineForm : SW.SendEnum (bscfPolylineForm); break;
	  case StepGeom_bscfParabolicArc : SW.SendEnum (bscfParabolicArc); break;
	  case StepGeom_bscfCircularArc : SW.SendEnum (bscfCircularArc); break;
	  case StepGeom_bscfUnspecified : SW.SendEnum (bscfUnspecified); break;
	  case StepGeom_bscfHyperbolicArc : SW.SendEnum (bscfHyperbolicArc); break;
	}
	// --- field : closedCurve ---

	SW.SendLogical(ent->ClosedCurve());
	// --- field : selfIntersect ---

	SW.SendLogical(ent->SelfIntersect());

	// --- Instance of plex componant BSplineCurveWithKnots ---

	SW.StartEntity("B_SPLINE_CURVE_WITH_KNOTS");
	// --- field : knotMultiplicities ---

	SW.OpenSub();
	for (Standard_Integer i6 = 1;  i6 <= ent->NbKnotMultiplicities();  i6 ++) {
	  SW.Send(ent->KnotMultiplicitiesValue(i6));
	}
	SW.CloseSub();
	// --- field : knots ---

	SW.OpenSub();
	for (Standard_Integer i7 = 1;  i7 <= ent->NbKnots();  i7 ++) {
	  SW.Send(ent->KnotsValue(i7));
	}
	SW.CloseSub();
	// --- field : knotSpec ---

	switch(ent->KnotSpec()) {
	  case StepGeom_ktUniformKnots : SW.SendEnum (ktUniformKnots); break;
	  case StepGeom_ktQuasiUniformKnots : SW.SendEnum (ktQuasiUniformKnots); break;
	  case StepGeom_ktPiecewiseBezierKnots : SW.SendEnum (ktPiecewiseBezierKnots); break;
	  case StepGeom_ktUnspecified : SW.SendEnum (ktUnspecified); break;
	}

	// --- Instance of plex componant Curve ---

	SW.StartEntity("CURVE");

	// --- Instance of plex componant GeometricRepresentationItem ---

	SW.StartEntity("GEOMETRIC_REPRESENTATION_ITEM");

	// --- Instance of plex componant RationalBSplineCurve ---

	SW.StartEntity("RATIONAL_B_SPLINE_CURVE");
	// --- field : weightsData ---

	SW.OpenSub();
	for (Standard_Integer i9 = 1;  i9 <= ent->NbWeightsData();  i9 ++) {
	  SW.Send(ent->WeightsDataValue(i9));
	}
	SW.CloseSub();

	// --- Instance of plex componant RepresentationItem ---

	SW.StartEntity("REPRESENTATION_ITEM");
	// --- field : name ---

	SW.Send(ent->Name());
}


void RWStepGeom_RWBSplineCurveWithKnotsAndRationalBSplineCurve::Share(const Handle(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve)& ent, Interface_EntityIterator& iter) const
{

	Standard_Integer nbElem1 = ent->NbControlPointsList();
	for (Standard_Integer is1=1; is1<=nbElem1; is1 ++) {
	  iter.GetOneItem(ent->ControlPointsListValue(is1));
	}

}



void RWStepGeom_RWBSplineCurveWithKnotsAndRationalBSplineCurve::Check
  (const Handle(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve)& ent,
   const Interface_ShareTool& aShto,
   Handle(Interface_Check)& ach) const
{
  Handle(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve) aRationalBSC =
    Handle(StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve)::DownCast(ent);
  Handle(StepGeom_BSplineCurveWithKnots) aBSCWK =
    aRationalBSC->BSplineCurveWithKnots();
  RWStepGeom_RWBSplineCurveWithKnots t1;
  t1.Check(aBSCWK,aShto,ach);
  Handle(StepGeom_RationalBSplineCurve) aRBSC =
    aRationalBSC->RationalBSplineCurve();
  RWStepGeom_RWRationalBSplineCurve t2;
  t2.Check(aRBSC,aShto,ach);
}