rtp-connect 1.4 → 1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,7 +4,7 @@ module RTP
4
4
  #
5
5
  # @note Relations:
6
6
  # * Parent: Plan
7
- # * Children: SiteSetup, Field
7
+ # * Children: SiteSetup, SimulationField, Field
8
8
  #
9
9
  class Prescription < Record
10
10
 
@@ -12,6 +12,8 @@ module RTP
12
12
  attr_reader :parent
13
13
  # The SiteSetup record (if any) that belongs to this Prescription.
14
14
  attr_reader :site_setup
15
+ # An array of SimulationField records (if any) that belongs to this Prescription.
16
+ attr_reader :simulation_fields
15
17
  # An array of Field records (if any) that belongs to this Prescription.
16
18
  attr_reader :fields
17
19
  attr_reader :course_id
@@ -66,6 +68,7 @@ module RTP
66
68
  # Child objects:
67
69
  @site_setup = nil
68
70
  @fields = Array.new
71
+ @simulation_fields = Array.new
69
72
  # Parent relation (may get more than one type of record here):
70
73
  @parent = get_parent(parent.to_record, Plan)
71
74
  @parent.add_prescription(self)
@@ -96,6 +99,14 @@ module RTP
96
99
  @fields << child.to_field
97
100
  end
98
101
 
102
+ # Adds a simulation field record to this instance.
103
+ #
104
+ # @param [Field] child a SimulationField instance which is to be associated with self
105
+ #
106
+ def add_simulation_field(child)
107
+ @simulation_fields << child.to_simulation_field
108
+ end
109
+
99
110
  # Adds a site setup record to this instance.
100
111
  #
101
112
  # @param [SiteSetup] child a SiteSetup instance which is to be associated with self
@@ -106,10 +117,10 @@ module RTP
106
117
 
107
118
  # Collects the child records of this instance in a properly sorted array.
108
119
  #
109
- # @return [Array<SiteSetup, Field>] a sorted array of self's child records
120
+ # @return [Array<SiteSetup, SimulationField, Field>] a sorted array of self's child records
110
121
  #
111
122
  def children
112
- return [@site_setup, @fields].flatten.compact
123
+ return [@site_setup, @simulation_fields, @fields].flatten.compact
113
124
  end
114
125
 
115
126
  # Computes a hash code for this object.
@@ -26,7 +26,7 @@ module RTP
26
26
  # @return [String] a proper RTPConnect type CSV string
27
27
  #
28
28
  def encode
29
- content = values.encode + ","
29
+ content = CSV.generate_line(values, force_quotes: true, row_sep: '') + ","
30
30
  checksum = content.checksum
31
31
  # Complete string is content + checksum (in double quotes) + carriage return + line feed
32
32
  return (content + checksum.to_s.wrap + "\r\n").encode('ISO8859-1')
@@ -26,24 +26,27 @@ class String
26
26
  self.split(',')
27
27
  end
28
28
 
29
- # Removes double quotes from a string.
29
+ # Removes leading & trailing double quotes from a string.
30
30
  #
31
- # @return [String] the string stripped of double-quotes
31
+ # @return [String] the processed string
32
32
  #
33
33
  def value
34
- self.gsub('"', '')
34
+ self.gsub(/\A"|"\Z/, '')
35
35
  end
36
36
 
37
- # Splits the elements of a CSV string (comma separated values),
38
- # and removes double-quotes from the resulting string elements.
37
+ # Splits the elements of a CSV string (comma separated values) and removes
38
+ # quotation (leading and trailing double-quote characters) from the extracted
39
+ # string elements.
39
40
  #
40
41
  # @return [Array<String>] an array of the comma separated values
41
42
  #
42
43
  def values
43
- original = CSV.parse(self).first
44
- processed = Array.new
45
- original.collect {|element| processed << element.gsub('"', '')}
46
- return processed
44
+ begin
45
+ CSV.parse(self).first
46
+ rescue StandardError => e
47
+ RTP.logger.error("Unable to parse the given string record. Probably invalid CSV format: #{self}")
48
+ raise e
49
+ end
47
50
  end
48
51
 
49
52
  # Wraps double quotes around the string.
@@ -0,0 +1,702 @@
1
+ module RTP
2
+
3
+ # The simulation field class.
4
+ #
5
+ # @note Relations:
6
+ # * Parent: Prescription
7
+ # * Children: none
8
+ #
9
+ class SimulationField < Record
10
+
11
+ # The Record which this instance belongs to.
12
+ attr_reader :parent
13
+ attr_reader :rx_site_name
14
+ attr_reader :field_name
15
+ attr_reader :field_id
16
+ attr_reader :field_note
17
+ attr_reader :treatment_machine
18
+ attr_reader :gantry_angle
19
+ attr_reader :collimator_angle
20
+ attr_reader :field_x_mode
21
+ attr_reader :field_x
22
+ attr_reader :collimator_x1
23
+ attr_reader :collimator_x2
24
+ attr_reader :field_y_mode
25
+ attr_reader :field_y
26
+ attr_reader :collimator_y1
27
+ attr_reader :collimator_y2
28
+ attr_reader :couch_vertical
29
+ attr_reader :couch_lateral
30
+ attr_reader :couch_longitudinal
31
+ attr_reader :couch_angle
32
+ attr_reader :couch_pedestal
33
+ attr_reader :sad
34
+ attr_reader :ap_separation
35
+ attr_reader :pa_separation
36
+ attr_reader :lateral_separation
37
+ attr_reader :tangential_separation
38
+ attr_reader :other_label_1
39
+ attr_reader :ssd_1
40
+ attr_reader :sfd_1
41
+ attr_reader :other_label_2
42
+ attr_reader :other_measurement_1
43
+ attr_reader :other_measurement_2
44
+ attr_reader :other_label_3
45
+ attr_reader :other_measurement_3
46
+ attr_reader :other_measurement_4
47
+ attr_reader :other_label_4
48
+ attr_reader :other_measurement_5
49
+ attr_reader :other_measurement_6
50
+ attr_reader :blade_x_mode
51
+ attr_reader :blade_x
52
+ attr_reader :blade_x1
53
+ attr_reader :blade_x2
54
+ attr_reader :blade_y_mode
55
+ attr_reader :blade_y
56
+ attr_reader :blade_y1
57
+ attr_reader :blade_y2
58
+ attr_reader :ii_lateral
59
+ attr_reader :ii_longitudinal
60
+ attr_reader :ii_vertical
61
+ attr_reader :kvp
62
+ attr_reader :ma
63
+ attr_reader :seconds
64
+
65
+ # Creates a new SimulationField by parsing a RTPConnect string line.
66
+ #
67
+ # @param [#to_s] string the simulation field definition record string line
68
+ # @param [Record] parent a record which is used to determine the proper parent of this instance
69
+ # @return [Field] the created SimulationField instance
70
+ # @raise [ArgumentError] if given a string containing an invalid number of elements
71
+ #
72
+ def self.load(string, parent)
73
+ # Get the quote-less values:
74
+ values = string.to_s.values
75
+ low_limit = 17
76
+ high_limit = 53
77
+ raise ArgumentError, "Invalid argument 'string': Expected at least #{low_limit} elements, got #{values.length}." if values.length < low_limit
78
+ RTP.logger.warn "The number of elements (#{values.length}) for this Simulation Field record exceeds the known number of data items for this record (#{high_limit}). This may indicate an invalid record or that the RTP format has recently been expanded with new items." if values.length > high_limit
79
+ sf = self.new(parent)
80
+ # Assign the values to attributes:
81
+ sf.keyword = values[0]
82
+ sf.rx_site_name = values[1]
83
+ sf.field_name = values[2]
84
+ sf.field_id = values[3]
85
+ sf.field_note = values[4]
86
+ sf.treatment_machine = values[5]
87
+ sf.gantry_angle = values[6]
88
+ sf.collimator_angle = values[7]
89
+ sf.field_x_mode = values[8]
90
+ sf.field_x = values[9]
91
+ sf.collimator_x1 = values[10]
92
+ sf.collimator_x2 = values[11]
93
+ sf.field_y_mode = values[12]
94
+ sf.field_y = values[13]
95
+ sf.collimator_y1 = values[14]
96
+ sf.collimator_y2 = values[15]
97
+ sf.couch_vertical = values[16]
98
+ sf.couch_lateral = values[17]
99
+ sf.couch_longitudinal = values[18]
100
+ sf.couch_angle = values[19]
101
+ sf.couch_pedestal = values[20]
102
+ sf.sad = values[21]
103
+ sf.ap_separation = values[22]
104
+ sf.pa_separation = values[23]
105
+ sf.lateral_separation = values[24]
106
+ sf.tangential_separation = values[25]
107
+ sf.other_label_1 = values[26]
108
+ sf.ssd_1 = values[27]
109
+ sf.sfd_1 = values[28]
110
+ sf.other_label_2 = values[29]
111
+ sf.other_measurement_1 = values[30]
112
+ sf.other_measurement_2 = values[31]
113
+ sf.other_label_3 = values[32]
114
+ sf.other_measurement_3 = values[33]
115
+ sf.other_measurement_4 = values[34]
116
+ sf.other_label_4 = values[35]
117
+ sf.other_measurement_5 = values[36]
118
+ sf.other_measurement_6 = values[37]
119
+ sf.blade_x_mode = values[38]
120
+ sf.blade_x = values[39]
121
+ sf.blade_x1 = values[40]
122
+ sf.blade_x2 = values[41]
123
+ sf.blade_y_mode = values[42]
124
+ sf.blade_y = values[43]
125
+ sf.blade_y1 = values[44]
126
+ sf.blade_y2 = values[45]
127
+ sf.ii_lateral = values[46]
128
+ sf.ii_longitudinal = values[47]
129
+ sf.ii_vertical = values[48]
130
+ sf.kvp = values[49]
131
+ sf.ma = values[50]
132
+ sf.seconds = values[51]
133
+ sf.crc = values[-1]
134
+ return sf
135
+ end
136
+
137
+ # Creates a new SimulationField.
138
+ #
139
+ # @param [Record] parent a record which is used to determine the proper parent of this instance
140
+ #
141
+ def initialize(parent)
142
+ # Parent relation (may get more than one type of record here):
143
+ @parent = get_parent(parent.to_record, Prescription)
144
+ @parent.add_simulation_field(self)
145
+ @keyword = 'SIM_DEF'
146
+ end
147
+
148
+ # Checks for equality.
149
+ #
150
+ # Other and self are considered equivalent if they are
151
+ # of compatible types and their attributes are equivalent.
152
+ #
153
+ # @param other an object to be compared with self.
154
+ # @return [Boolean] true if self and other are considered equivalent
155
+ #
156
+ def ==(other)
157
+ if other.respond_to?(:to_simulation_field)
158
+ other.send(:state) == state
159
+ end
160
+ end
161
+
162
+ alias_method :eql?, :==
163
+
164
+ # Collects the child records of this instance in a properly sorted array.
165
+ #
166
+ # @return [Array] an emtpy array
167
+ #
168
+ def children
169
+ return Array.new
170
+ end
171
+
172
+ # Computes a hash code for this object.
173
+ #
174
+ # @note Two objects with the same attributes will have the same hash code.
175
+ #
176
+ # @return [Fixnum] the object's hash code
177
+ #
178
+ def hash
179
+ state.hash
180
+ end
181
+
182
+ # Collects the values (attributes) of this instance.
183
+ #
184
+ # @note The CRC is not considered part of the actual values and is excluded.
185
+ # @return [Array<String>] an array of attributes (in the same order as they appear in the RTP string)
186
+ #
187
+ def values
188
+ return [
189
+ @keyword,
190
+ @rx_site_name,
191
+ @field_name,
192
+ @field_id,
193
+ @field_note,
194
+ @treatment_machine,
195
+ @gantry_angle,
196
+ @collimator_angle,
197
+ @field_x_mode,
198
+ @field_x,
199
+ @collimator_x1,
200
+ @collimator_x2,
201
+ @field_y_mode,
202
+ @field_y,
203
+ @collimator_y1,
204
+ @collimator_y2,
205
+ @couch_vertical,
206
+ @couch_lateral,
207
+ @couch_longitudinal,
208
+ @couch_angle,
209
+ @couch_pedestal,
210
+ @sad,
211
+ @ap_separation,
212
+ @pa_separation,
213
+ @lateral_separation,
214
+ @tangential_separation,
215
+ @other_label_1,
216
+ @ssd_1,
217
+ @sfd_1,
218
+ @other_label_2,
219
+ @other_measurement_1,
220
+ @other_measurement_2,
221
+ @other_label_3,
222
+ @other_measurement_3,
223
+ @other_measurement_4,
224
+ @other_label_4,
225
+ @other_measurement_5,
226
+ @other_measurement_6,
227
+ @blade_x_mode,
228
+ @blade_x,
229
+ @blade_x1,
230
+ @blade_x2,
231
+ @blade_y_mode,
232
+ @blade_y,
233
+ @blade_y1,
234
+ @blade_y2,
235
+ @ii_lateral,
236
+ @ii_longitudinal,
237
+ @ii_vertical,
238
+ @kvp,
239
+ @ma,
240
+ @seconds
241
+ ]
242
+ end
243
+
244
+ # Returns self.
245
+ #
246
+ # @return [SimulationField] self
247
+ #
248
+ def to_simulation_field
249
+ self
250
+ end
251
+
252
+ # Encodes the SimulationField object + any hiearchy of child objects,
253
+ # to a properly formatted RTPConnect ascii string.
254
+ #
255
+ # @return [String] an RTP string with a single or multiple lines/records
256
+ #
257
+ def to_s
258
+ str = encode
259
+ if children
260
+ children.each do |child|
261
+ str += child.to_s
262
+ end
263
+ end
264
+ return str
265
+ end
266
+
267
+ alias :to_str :to_s
268
+
269
+ # Sets the keyword attribute.
270
+ #
271
+ # @note Since only a specific string is accepted, this is more of an argument check than a traditional setter method
272
+ # @param [#to_s] value the new attribute value
273
+ # @raise [ArgumentError] if given an unexpected keyword
274
+ #
275
+ def keyword=(value)
276
+ value = value.to_s.upcase
277
+ raise ArgumentError, "Invalid keyword. Expected 'SIM_DEF', got #{value}." unless value == "SIM_DEF"
278
+ @keyword = value
279
+ end
280
+
281
+ # Sets the rx_site_name attribute.
282
+ #
283
+ # @param [nil, #to_s] value the new attribute value
284
+ #
285
+ def rx_site_name=(value)
286
+ @rx_site_name = value && value.to_s
287
+ end
288
+
289
+ # Sets the field_name attribute.
290
+ #
291
+ # @param [nil, #to_s] value the new attribute value
292
+ #
293
+ def field_name=(value)
294
+ @field_name = value && value.to_s
295
+ end
296
+
297
+ # Sets the field_id attribute.
298
+ #
299
+ # @param [nil, #to_s] value the new attribute value
300
+ #
301
+ def field_id=(value)
302
+ @field_id = value && value.to_s
303
+ end
304
+
305
+ # Sets the field_note attribute.
306
+ #
307
+ # @param [nil, #to_s] value the new attribute value
308
+ #
309
+ def field_note=(value)
310
+ @field_note = value && value.to_s
311
+ end
312
+
313
+ # Sets the treatment_machine attribute.
314
+ #
315
+ # @param [nil, #to_s] value the new attribute value
316
+ #
317
+ def treatment_machine=(value)
318
+ @treatment_machine = value && value.to_s
319
+ end
320
+
321
+ # Sets the gantry_angle attribute.
322
+ #
323
+ # @param [nil, #to_s] value the new attribute value
324
+ #
325
+ def gantry_angle=(value)
326
+ @gantry_angle = value && value.to_s.strip
327
+ end
328
+
329
+ # Sets the collimator_angle attribute.
330
+ #
331
+ # @param [nil, #to_s] value the new attribute value
332
+ #
333
+ def collimator_angle=(value)
334
+ @collimator_angle = value && value.to_s.strip
335
+ end
336
+
337
+ # Sets the field_x_mode attribute.
338
+ #
339
+ # @param [nil, #to_s] value the new attribute value
340
+ #
341
+ def field_x_mode=(value)
342
+ @field_x_mode = value && value.to_s
343
+ end
344
+
345
+ # Sets the field_x attribute.
346
+ #
347
+ # @param [nil, #to_s] value the new attribute value
348
+ #
349
+ def field_x=(value)
350
+ @field_x = value && value.to_s.strip
351
+ end
352
+
353
+ # Sets the collimator_x1 attribute.
354
+ #
355
+ # @param [nil, #to_s] value the new attribute value
356
+ #
357
+ def collimator_x1=(value)
358
+ @collimator_x1 = value && value.to_s.strip
359
+ end
360
+
361
+ # Sets the collimator_x2 attribute.
362
+ #
363
+ # @param [nil, #to_s] value the new attribute value
364
+ #
365
+ def collimator_x2=(value)
366
+ @collimator_x2 = value && value.to_s.strip
367
+ end
368
+
369
+ # Sets the field_y_mode attribute.
370
+ #
371
+ # @param [nil, #to_s] value the new attribute value
372
+ #
373
+ def field_y_mode=(value)
374
+ @field_y_mode = value && value.to_s
375
+ end
376
+
377
+ # Sets the field_y attribute.
378
+ #
379
+ # @param [nil, #to_s] value the new attribute value
380
+ #
381
+ def field_y=(value)
382
+ @field_y = value && value.to_s.strip
383
+ end
384
+
385
+ # Sets the collimator_y1 attribute.
386
+ #
387
+ # @param [nil, #to_s] value the new attribute value
388
+ #
389
+ def collimator_y1=(value)
390
+ @collimator_y1 = value && value.to_s.strip
391
+ end
392
+
393
+ # Sets the collimator_y2 attribute.
394
+ #
395
+ # @param [nil, #to_s] value the new attribute value
396
+ #
397
+ def collimator_y2=(value)
398
+ @collimator_y2 = value && value.to_s.strip
399
+ end
400
+
401
+ # Sets the couch_vertical attribute.
402
+ #
403
+ # @param [nil, #to_s] value the new attribute value
404
+ #
405
+ def couch_vertical=(value)
406
+ @couch_vertical = value && value.to_s.strip
407
+ end
408
+
409
+ # Sets the couch_lateral attribute.
410
+ #
411
+ # @param [nil, #to_s] value the new attribute value
412
+ #
413
+ def couch_lateral=(value)
414
+ @couch_lateral = value && value.to_s.strip
415
+ end
416
+
417
+ # Sets the couch_longitudinal attribute.
418
+ #
419
+ # @param [nil, #to_s] value the new attribute value
420
+ #
421
+ def couch_longitudinal=(value)
422
+ @couch_longitudinal = value && value.to_s.strip
423
+ end
424
+
425
+ # Sets the couch_angle attribute.
426
+ #
427
+ # @param [nil, #to_s] value the new attribute value
428
+ #
429
+ def couch_angle=(value)
430
+ @couch_angle = value && value.to_s.strip.strip
431
+ end
432
+
433
+ # Sets the couch_pedestal attribute.
434
+ #
435
+ # @param [nil, #to_s] value the new attribute value
436
+ #
437
+ def couch_pedestal=(value)
438
+ @couch_pedestal = value && value.to_s.strip
439
+ end
440
+
441
+ # Sets the sad attribute.
442
+ #
443
+ # @param [nil, #to_s] value the new attribute value
444
+ #
445
+ def sad=(value)
446
+ @sad = value && value.to_s.strip
447
+ end
448
+
449
+ # Sets the ap_separation attribute.
450
+ #
451
+ # @param [nil, #to_s] value the new attribute value
452
+ #
453
+ def ap_separation=(value)
454
+ @ap_separation = value && value.to_s
455
+ end
456
+
457
+ # Sets the pa_separation attribute.
458
+ #
459
+ # @param [nil, #to_s] value the new attribute value
460
+ #
461
+ def pa_separation=(value)
462
+ @pa_separation = value && value.to_s.strip
463
+ end
464
+
465
+ # Sets the lateral_separation attribute.
466
+ #
467
+ # @param [nil, #to_s] value the new attribute value
468
+ #
469
+ def lateral_separation=(value)
470
+ @lateral_separation = value && value.to_s.strip
471
+ end
472
+
473
+ # Sets the tangential_separation attribute.
474
+ #
475
+ # @param [nil, #to_s] value the new attribute value
476
+ #
477
+ def tangential_separation=(value)
478
+ @tangential_separation = value && value.to_s.strip
479
+ end
480
+
481
+ # Sets the other_label_1 attribute.
482
+ #
483
+ # @param [nil, #to_s] value the new attribute value
484
+ #
485
+ def other_label_1=(value)
486
+ @other_label_1 = value && value.to_s
487
+ end
488
+
489
+ # Sets the ssd_1 attribute.
490
+ #
491
+ # @param [nil, #to_s] value the new attribute value
492
+ #
493
+ def ssd_1=(value)
494
+ @ssd_1 = value && value.to_s
495
+ end
496
+
497
+ # Sets the sfd_1 attribute.
498
+ #
499
+ # @param [nil, #to_s] value the new attribute value
500
+ #
501
+ def sfd_1=(value)
502
+ @sfd_1 = value && value.to_s
503
+ end
504
+
505
+ # Sets the other_label_2 attribute.
506
+ #
507
+ # @param [nil, #to_s] value the new attribute value
508
+ #
509
+ def other_label_2=(value)
510
+ @other_label_2 = value && value.to_s
511
+ end
512
+
513
+ # Sets the other_measurement_1 attribute.
514
+ #
515
+ # @param [nil, #to_s] value the new attribute value
516
+ #
517
+ def other_measurement_1=(value)
518
+ @other_measurement_1 = value && value.to_s
519
+ end
520
+
521
+ # Sets the other_measurement_2 attribute.
522
+ #
523
+ # @param [nil, #to_s] value the new attribute value
524
+ #
525
+ def other_measurement_2=(value)
526
+ @other_measurement_2 = value && value.to_s
527
+ end
528
+
529
+ # Sets the other_label_3 attribute.
530
+ #
531
+ # @param [nil, #to_s] value the new attribute value
532
+ #
533
+ def other_label_3=(value)
534
+ @other_label_3 = value && value.to_s
535
+ end
536
+
537
+ # Sets the other_measurement_3 attribute.
538
+ #
539
+ # @param [nil, #to_s] value the new attribute value
540
+ #
541
+ def other_measurement_3=(value)
542
+ @other_measurement_3 = value && value.to_s
543
+ end
544
+
545
+ # Sets the other_measurement_4 attribute.
546
+ #
547
+ # @param [nil, #to_s] value the new attribute value
548
+ #
549
+ def other_measurement_4=(value)
550
+ @other_measurement_4 = value && value.to_s
551
+ end
552
+
553
+ # Sets the other_label_4 attribute.
554
+ #
555
+ # @param [nil, #to_s] value the new attribute value
556
+ #
557
+ def other_label_4=(value)
558
+ @other_label_4 = value && value.to_s
559
+ end
560
+
561
+ # Sets the other_measurement_5 attribute.
562
+ #
563
+ # @param [nil, #to_s] value the new attribute value
564
+ #
565
+ def other_measurement_5=(value)
566
+ @other_measurement_5 = value && value.to_s
567
+ end
568
+
569
+ # Sets the other_measurement_6 attribute.
570
+ #
571
+ # @param [nil, #to_s] value the new attribute value
572
+ #
573
+ def other_measurement_6=(value)
574
+ @other_measurement_6 = value && value.to_s
575
+ end
576
+
577
+ # Sets the blade_x_mode attribute.
578
+ #
579
+ # @param [nil, #to_s] value the new attribute value
580
+ #
581
+ def blade_x_mode=(value)
582
+ @blade_x_mode = value && value.to_s
583
+ end
584
+
585
+ # Sets the blade_x attribute.
586
+ #
587
+ # @param [nil, #to_s] value the new attribute value
588
+ #
589
+ def blade_x=(value)
590
+ @blade_x = value && value.to_s
591
+ end
592
+
593
+ # Sets the blade_x1 attribute.
594
+ #
595
+ # @param [nil, #to_s] value the new attribute value
596
+ #
597
+ def blade_x1=(value)
598
+ @blade_x1 = value && value.to_s
599
+ end
600
+
601
+ # Sets the blade_x2 attribute.
602
+ #
603
+ # @param [nil, #to_s] value the new attribute value
604
+ #
605
+ def blade_x2=(value)
606
+ @blade_x2 = value && value.to_s
607
+ end
608
+
609
+ # Sets the blade_y_mode attribute.
610
+ #
611
+ # @param [nil, #to_s] value the new attribute value
612
+ #
613
+ def blade_y_mode=(value)
614
+ @blade_y_mode = value && value.to_s
615
+ end
616
+
617
+ # Sets the blade_y attribute.
618
+ #
619
+ # @param [nil, #to_s] value the new attribute value
620
+ #
621
+ def blade_y=(value)
622
+ @blade_y = value && value.to_s
623
+ end
624
+
625
+ # Sets the blade_y1 attribute.
626
+ #
627
+ # @param [nil, #to_s] value the new attribute value
628
+ #
629
+ def blade_y1=(value)
630
+ @blade_y1 = value && value.to_s
631
+ end
632
+
633
+ # Sets the blade_y2 attribute.
634
+ #
635
+ # @param [nil, #to_s] value the new attribute value
636
+ #
637
+ def blade_y2=(value)
638
+ @blade_y2 = value && value.to_s
639
+ end
640
+
641
+ # Sets the ii_lateral attribute.
642
+ #
643
+ # @param [nil, #to_s] value the new attribute value
644
+ #
645
+ def ii_lateral=(value)
646
+ @ii_lateral = value && value.to_s
647
+ end
648
+
649
+ # Sets the ii_longitudinal attribute.
650
+ #
651
+ # @param [nil, #to_s] value the new attribute value
652
+ #
653
+ def ii_longitudinal=(value)
654
+ @ii_longitudinal = value && value.to_s
655
+ end
656
+
657
+ # Sets the ii_vertical attribute.
658
+ #
659
+ # @param [nil, #to_s] value the new attribute value
660
+ #
661
+ def ii_vertical=(value)
662
+ @ii_vertical = value && value.to_s
663
+ end
664
+
665
+ # Sets the kvp attribute.
666
+ #
667
+ # @param [nil, #to_s] value the new attribute value
668
+ #
669
+ def kvp=(value)
670
+ @kvp = value && value.to_s
671
+ end
672
+
673
+ # Sets the ma attribute.
674
+ #
675
+ # @param [nil, #to_s] value the new attribute value
676
+ #
677
+ def ma=(value)
678
+ @ma = value && value.to_s
679
+ end
680
+
681
+ # Sets the seconds attribute.
682
+ #
683
+ # @param [nil, #to_s] value the new attribute value
684
+ #
685
+ def seconds=(value)
686
+ @seconds = value && value.to_s
687
+ end
688
+
689
+
690
+ private
691
+
692
+
693
+ # Collects the attributes of this instance.
694
+ #
695
+ # @note The CRC is not considered part of the attributes of interest and is excluded
696
+ # @return [Array<String>] an array of attributes
697
+ #
698
+ alias_method :state, :values
699
+
700
+ end
701
+
702
+ end