dicom 0.9.7 → 0.9.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,121 +1,121 @@
1
- module DICOM
2
-
3
- # The Elemental mix-in module contains methods that
4
- # are common among the various element type classes:
5
- # * Element
6
- # * Item
7
- # * Sequence
8
- #
9
- module Elemental
10
-
11
- # The encoded, binary value of the elemental (String).
12
- attr_reader :bin
13
- # The elemental's length (Fixnum).
14
- attr_reader :length
15
- # The elemental's name (String).
16
- attr_reader :name
17
- # The parent of this elemental (which may be an Item, Sequence or DObject).
18
- attr_reader :parent
19
- # The elemental's tag (String).
20
- attr_reader :tag
21
- # The elemental's value representation (String).
22
- attr_reader :vr
23
-
24
- # Gives the method (symbol) corresponding to the name string of this element.
25
- #
26
- # @return [Symbol, NilClass] the matched element method (or nil, if no match is made)
27
- #
28
- def name_as_method
29
- LIBRARY.as_method(@name)
30
- end
31
-
32
- # Retrieves the entire chain of parents connected to this elemental
33
- # (or an empty array, if the element is parent-less).
34
- #
35
- # @return [Array] array of parents (immediate parent first, top parent last)
36
- #
37
- def parents
38
- all_parents = Array.new
39
- # Extract all parents and add to array recursively:
40
- if parent
41
- all_parents = parent.parents if parent.parent
42
- all_parents.insert(0, parent)
43
- end
44
- return all_parents
45
- end
46
-
47
- # Sets a specified parent instance as this elemental's parent, while taking
48
- # care to delete this elemental from any previous parent, as well as adding
49
- # itself to the new parent (unless new parent is nil).
50
- #
51
- # @param [DObject, Item, Sequence, NilClass] new_parent the new parent object for this elemental
52
- # @example Create a new Sequence and connect it to a DObject instance
53
- # structure_set_roi = Sequence.new("3006,0020")
54
- # structure_set_roi.parent = dcm
55
- #
56
- def parent=(new_parent)
57
- # First take care of 'dependencies':
58
- if self.parent
59
- # Remove ourselves from the previous parent:
60
- if self.is_a?(Item)
61
- self.parent.delete(self.index, :no_follow => true)
62
- else
63
- self.parent.delete(self.tag, :no_follow => true)
64
- end
65
- end
66
- if new_parent
67
- # Add ourselves to the new parent:
68
- if self.is_a?(Item)
69
- new_parent.add_item(self, :no_follow => true)
70
- else
71
- new_parent.add(self, :no_follow => true)
72
- end
73
- end
74
- # Set the new parent (should we bother to test for parent validity here?):
75
- @parent = new_parent
76
- end
77
-
78
- # Sets a specified parent instance as this elemental's parent, without doing any other updates,
79
- # like removing the elemental from any previous parent or adding itself to the new parent.
80
- #
81
- # @param [DObject, Item, Sequence, NilClass] new_parent the new parent object for this elemental
82
- #
83
- def set_parent(new_parent)
84
- # Set the new parent (should we bother to test for parent validity here?):
85
- @parent = new_parent
86
- end
87
-
88
- # Returns a Stream instance which can be used for encoding a value to binary.
89
- #
90
- # @note Retrieves the Stream instance of the top parent DObject instance.
91
- # If this fails, a new Stream instance is created (with little endian encoding assumed).
92
- #
93
- def stream
94
- if top_parent.is_a?(DObject)
95
- return top_parent.stream
96
- else
97
- return Stream.new(nil, file_endian=false)
98
- end
99
- end
100
-
101
- # Returns the top parent of a particular elemental.
102
- #
103
- # @note Unless the elemental, or one of its parent instances, are independent,
104
- # the top parent will be a DObject instance.
105
- #
106
- def top_parent
107
- # The top parent is determined recursively:
108
- if parent
109
- if parent.is_a?(DObject)
110
- return parent
111
- else
112
- return parent.top_parent
113
- end
114
- else
115
- return self
116
- end
117
- end
118
-
119
- end
120
-
121
- end
1
+ module DICOM
2
+
3
+ # The Elemental mix-in module contains methods that
4
+ # are common among the various element type classes:
5
+ # * Element
6
+ # * Item
7
+ # * Sequence
8
+ #
9
+ module Elemental
10
+
11
+ # The encoded, binary value of the elemental (String).
12
+ attr_reader :bin
13
+ # The elemental's length (Integer).
14
+ attr_reader :length
15
+ # The elemental's name (String).
16
+ attr_reader :name
17
+ # The parent of this elemental (which may be an Item, Sequence or DObject).
18
+ attr_reader :parent
19
+ # The elemental's tag (String).
20
+ attr_reader :tag
21
+ # The elemental's value representation (String).
22
+ attr_reader :vr
23
+
24
+ # Gives the method (symbol) corresponding to the name string of this element.
25
+ #
26
+ # @return [Symbol, NilClass] the matched element method (or nil, if no match is made)
27
+ #
28
+ def name_as_method
29
+ LIBRARY.as_method(@name)
30
+ end
31
+
32
+ # Retrieves the entire chain of parents connected to this elemental
33
+ # (or an empty array, if the element is parent-less).
34
+ #
35
+ # @return [Array] array of parents (immediate parent first, top parent last)
36
+ #
37
+ def parents
38
+ all_parents = Array.new
39
+ # Extract all parents and add to array recursively:
40
+ if parent
41
+ all_parents = parent.parents if parent.parent
42
+ all_parents.insert(0, parent)
43
+ end
44
+ return all_parents
45
+ end
46
+
47
+ # Sets a specified parent instance as this elemental's parent, while taking
48
+ # care to delete this elemental from any previous parent, as well as adding
49
+ # itself to the new parent (unless new parent is nil).
50
+ #
51
+ # @param [DObject, Item, Sequence, NilClass] new_parent the new parent object for this elemental
52
+ # @example Create a new Sequence and connect it to a DObject instance
53
+ # structure_set_roi = Sequence.new("3006,0020")
54
+ # structure_set_roi.parent = dcm
55
+ #
56
+ def parent=(new_parent)
57
+ # First take care of 'dependencies':
58
+ if self.parent
59
+ # Remove ourselves from the previous parent:
60
+ if self.is_a?(Item)
61
+ self.parent.delete(self.index, :no_follow => true)
62
+ else
63
+ self.parent.delete(self.tag, :no_follow => true)
64
+ end
65
+ end
66
+ if new_parent
67
+ # Add ourselves to the new parent:
68
+ if self.is_a?(Item)
69
+ new_parent.add_item(self, :no_follow => true)
70
+ else
71
+ new_parent.add(self, :no_follow => true)
72
+ end
73
+ end
74
+ # Set the new parent (should we bother to test for parent validity here?):
75
+ @parent = new_parent
76
+ end
77
+
78
+ # Sets a specified parent instance as this elemental's parent, without doing any other updates,
79
+ # like removing the elemental from any previous parent or adding itself to the new parent.
80
+ #
81
+ # @param [DObject, Item, Sequence, NilClass] new_parent the new parent object for this elemental
82
+ #
83
+ def set_parent(new_parent)
84
+ # Set the new parent (should we bother to test for parent validity here?):
85
+ @parent = new_parent
86
+ end
87
+
88
+ # Returns a Stream instance which can be used for encoding a value to binary.
89
+ #
90
+ # @note Retrieves the Stream instance of the top parent DObject instance.
91
+ # If this fails, a new Stream instance is created (with little endian encoding assumed).
92
+ #
93
+ def stream
94
+ if top_parent.is_a?(DObject)
95
+ return top_parent.stream
96
+ else
97
+ return Stream.new(nil, file_endian=false)
98
+ end
99
+ end
100
+
101
+ # Returns the top parent of a particular elemental.
102
+ #
103
+ # @note Unless the elemental, or one of its parent instances, are independent,
104
+ # the top parent will be a DObject instance.
105
+ #
106
+ def top_parent
107
+ # The top parent is determined recursively:
108
+ if parent
109
+ if parent.is_a?(DObject)
110
+ return parent
111
+ else
112
+ return parent.top_parent
113
+ end
114
+ else
115
+ return self
116
+ end
117
+ end
118
+
119
+ end
120
+
121
+ end
@@ -168,7 +168,10 @@ module DICOM
168
168
  'ISO_IR 126' => 'ISO-8859-7',
169
169
  'ISO_IR 138' => 'ISO-8859-8',
170
170
  'ISO_IR 148' => 'ISO-8859-9',
171
- 'ISO_IR 13' => 'JIS_X0201',
171
+ 'ISO_IR 13' => 'Shift_JIS',
172
+ 'ISO 2022 IR 13' => 'Shift_JIS',
173
+ 'ISO 2022 IR 13\\ISO 2022 IR 87' => 'Shift_JIS',
174
+ 'ISO 2022 IR 87' => 'ISO-2022-JP',
172
175
  'ISO_IR 166' => 'ISO-8859-11',
173
176
  'GB18030' => 'GB18030',
174
177
  'ISO_IR 192' => 'UTF-8'
@@ -1,6 +1,6 @@
1
1
  module DICOM
2
2
 
3
3
  # The ruby-dicom version string.
4
- VERSION = '0.9.7'
4
+ VERSION = '0.9.8'
5
5
 
6
6
  end
@@ -349,13 +349,13 @@ module DICOM
349
349
  raise "Missing Rows and/or Columns Element. Unable to construct pixel data array." unless num_rows and num_cols
350
350
  if num_frames > 1 or options[:volume]
351
351
  # Create an empty 3D NArray. fill it with pixels frame by frame, then reassign the pixels variable to it:
352
- narr = NArray.int(num_frames, num_cols, num_rows)
352
+ narr = Numo::Int16.zeros(num_frames, num_cols, num_rows)
353
353
  num_frames.times do |i|
354
- narr[i, true, true] = NArray.to_na(pixels[(i * num_cols * num_rows)..((i + 1) * num_cols * num_rows - 1)]).reshape!(num_cols, num_rows)
354
+ narr[i, true, true] = Numo::NArray[*pixels[(i * num_cols * num_rows)..((i + 1) * num_cols * num_rows - 1)]].reshape!(num_cols, num_rows)
355
355
  end
356
356
  pixels = narr
357
357
  else
358
- pixels = NArray.to_na(pixels).reshape!(num_cols, num_rows)
358
+ pixels = Numo::NArray[*pixels].reshape!(num_cols, num_rows)
359
359
  end
360
360
  # Remap the image from pixel values to presentation values if the user has requested this:
361
361
  pixels = process_presentation_values_narray(pixels, -65535, 65535, options[:level]) if options[:remap] or options[:level]
@@ -680,7 +680,7 @@ module DICOM
680
680
  end
681
681
  # Need to convert to NArray?
682
682
  if pixel_data.is_a?(Array)
683
- n_arr = NArray.to_na(pixel_data)
683
+ n_arr = Numo::NArray[*pixel_data]
684
684
  else
685
685
  n_arr = pixel_data
686
686
  end
@@ -779,7 +779,7 @@ module DICOM
779
779
  # Number of bytes used per pixel will determine how to unpack this:
780
780
  case depth
781
781
  when 8 # (1 byte)
782
- template = 'BY' # Byte/Character/Fixnum
782
+ template = 'BY' # Byte/Character/Integer
783
783
  when 16 # (2 bytes)
784
784
  if pixel_representation == 1
785
785
  template = 'SS' # Signed short
@@ -834,4 +834,4 @@ module DICOM
834
834
  end
835
835
 
836
836
  end
837
- end
837
+ end
@@ -1,122 +1,122 @@
1
- module DICOM
2
-
3
- # The Item class handles information related to items - the elements contained in sequences.
4
- #
5
- # === Inheritance
6
- #
7
- # As the Item class inherits from the ImageItem class, which itself inherits from the Parent class,
8
- # all ImageItem and Parent methods are also available to instances of Item.
9
- #
10
- class Item < ImageItem
11
-
12
- include Elemental
13
- include ElementalParent
14
-
15
- # The index of this Item in the group of items belonging to its parent. If the Item is without parent, index is nil.
16
- attr_accessor :index
17
-
18
- # Creates an Item instance.
19
- #
20
- # Normally, an Item contains data elements and/or sequences. However,
21
- # in some cases, an Item will instead/also carry binary string data,
22
- # like the pixel data of an encapsulated image fragment.
23
- #
24
- # @param [Hash] options the options to use for creating the item
25
- # @option options [String] :bin a binary string to be carried by the item
26
- # @option options [String] :indexif the item is to be inserted at a specific index (Item number), this option parameter needs to set
27
- # @option options [String] :length theiItem length (which either refers to the length of the encoded string of children of this item, or the length of its binary data)
28
- # @option options [String] :name the name of the item may be specified upon creation (if not, a default name is used)
29
- # @option options [String] :parent a Sequence or DObject instance which the item instance shall belong to
30
- # @option options [String] :vr the value representation of the item may be specified upon creation (if not, a default vr is used)
31
- #
32
- # @example Create an empty Item and connect it to the "Structure Set ROI Sequence"
33
- # item = Item.new(:parent => dcm["3006,0020"])
34
- # @example Create a "Pixel Data Item" which carries an encapsulated image frame (a pre-encoded binary)
35
- # pixel_item = Item.new(:bin => processed_pixel_data, :parent => dcm["7FE0,0010"][1])
36
- #
37
- def initialize(options={})
38
- # Set common parent variables:
39
- initialize_parent
40
- # Set instance variables:
41
- @tag = ITEM_TAG
42
- @value = nil
43
- @name = options[:name] || "Item"
44
- @vr = options[:vr] || ITEM_VR
45
- if options[:bin]
46
- self.bin = options[:bin]
47
- else
48
- @length = options[:length] || -1
49
- end
50
- if options[:parent]
51
- @parent = options[:parent]
52
- @index = options[:index] if options[:index]
53
- @parent.add_item(self, :index => options[:index], :no_follow => true)
54
- end
55
- end
56
-
57
- # Checks for equality.
58
- #
59
- # Other and self are considered equivalent if they are
60
- # of compatible types and their attributes are equivalent.
61
- #
62
- # @param other an object to be compared with self.
63
- # @return [Boolean] true if self and other are considered equivalent
64
- #
65
- def ==(other)
66
- if other.respond_to?(:to_item)
67
- other.send(:state) == state
68
- end
69
- end
70
-
71
- alias_method :eql?, :==
72
-
73
- # Sets the binary string that the Item will contain.
74
- #
75
- # @param [String] new_bin a binary string of encoded data
76
- # @example Insert a custom jpeg in the (encapsulated) pixel data element (in it's first pixel data item)
77
- # dcm['7FE0,0010'][1].children.first.bin = jpeg_binary_string
78
- #
79
- def bin=(new_bin)
80
- raise ArgumentError, "Invalid parameter type. String was expected, got #{new_bin.class}." unless new_bin.is_a?(String)
81
- # Add an empty byte at the end if the length of the binary is odd:
82
- if new_bin.length.odd?
83
- @bin = new_bin + "\x00"
84
- else
85
- @bin = new_bin
86
- end
87
- @value = nil
88
- @length = @bin.length
89
- end
90
-
91
- # Computes a hash code for this object.
92
- #
93
- # @note Two objects with the same attributes will have the same hash code.
94
- #
95
- # @return [Fixnum] the object's hash code
96
- #
97
- def hash
98
- state.hash
99
- end
100
-
101
- # Returns self.
102
- #
103
- # @return [Item] self
104
- #
105
- def to_item
106
- self
107
- end
108
-
109
-
110
- private
111
-
112
-
113
- # Collects the attributes of this instance.
114
- #
115
- # @return [Array<String, Sequence, Element>] an array of attributes
116
- #
117
- def state
118
- [@vr, @name, @tags]
119
- end
120
-
121
- end
122
- end
1
+ module DICOM
2
+
3
+ # The Item class handles information related to items - the elements contained in sequences.
4
+ #
5
+ # === Inheritance
6
+ #
7
+ # As the Item class inherits from the ImageItem class, which itself inherits from the Parent class,
8
+ # all ImageItem and Parent methods are also available to instances of Item.
9
+ #
10
+ class Item < ImageItem
11
+
12
+ include Elemental
13
+ include ElementalParent
14
+
15
+ # The index of this Item in the group of items belonging to its parent. If the Item is without parent, index is nil.
16
+ attr_accessor :index
17
+
18
+ # Creates an Item instance.
19
+ #
20
+ # Normally, an Item contains data elements and/or sequences. However,
21
+ # in some cases, an Item will instead/also carry binary string data,
22
+ # like the pixel data of an encapsulated image fragment.
23
+ #
24
+ # @param [Hash] options the options to use for creating the item
25
+ # @option options [String] :bin a binary string to be carried by the item
26
+ # @option options [String] :indexif the item is to be inserted at a specific index (Item number), this option parameter needs to set
27
+ # @option options [String] :length theiItem length (which either refers to the length of the encoded string of children of this item, or the length of its binary data)
28
+ # @option options [String] :name the name of the item may be specified upon creation (if not, a default name is used)
29
+ # @option options [String] :parent a Sequence or DObject instance which the item instance shall belong to
30
+ # @option options [String] :vr the value representation of the item may be specified upon creation (if not, a default vr is used)
31
+ #
32
+ # @example Create an empty Item and connect it to the "Structure Set ROI Sequence"
33
+ # item = Item.new(:parent => dcm["3006,0020"])
34
+ # @example Create a "Pixel Data Item" which carries an encapsulated image frame (a pre-encoded binary)
35
+ # pixel_item = Item.new(:bin => processed_pixel_data, :parent => dcm["7FE0,0010"][1])
36
+ #
37
+ def initialize(options={})
38
+ # Set common parent variables:
39
+ initialize_parent
40
+ # Set instance variables:
41
+ @tag = ITEM_TAG
42
+ @value = nil
43
+ @name = options[:name] || "Item"
44
+ @vr = options[:vr] || ITEM_VR
45
+ if options[:bin]
46
+ self.bin = options[:bin]
47
+ else
48
+ @length = options[:length] || -1
49
+ end
50
+ if options[:parent]
51
+ @parent = options[:parent]
52
+ @index = options[:index] if options[:index]
53
+ @parent.add_item(self, :index => options[:index], :no_follow => true)
54
+ end
55
+ end
56
+
57
+ # Checks for equality.
58
+ #
59
+ # Other and self are considered equivalent if they are
60
+ # of compatible types and their attributes are equivalent.
61
+ #
62
+ # @param other an object to be compared with self.
63
+ # @return [Boolean] true if self and other are considered equivalent
64
+ #
65
+ def ==(other)
66
+ if other.respond_to?(:to_item)
67
+ other.send(:state) == state
68
+ end
69
+ end
70
+
71
+ alias_method :eql?, :==
72
+
73
+ # Sets the binary string that the Item will contain.
74
+ #
75
+ # @param [String] new_bin a binary string of encoded data
76
+ # @example Insert a custom jpeg in the (encapsulated) pixel data element (in it's first pixel data item)
77
+ # dcm['7FE0,0010'][1].children.first.bin = jpeg_binary_string
78
+ #
79
+ def bin=(new_bin)
80
+ raise ArgumentError, "Invalid parameter type. String was expected, got #{new_bin.class}." unless new_bin.is_a?(String)
81
+ # Add an empty byte at the end if the length of the binary is odd:
82
+ if new_bin.length.odd?
83
+ @bin = new_bin + "\x00"
84
+ else
85
+ @bin = new_bin
86
+ end
87
+ @value = nil
88
+ @length = @bin.length
89
+ end
90
+
91
+ # Computes a hash code for this object.
92
+ #
93
+ # @note Two objects with the same attributes will have the same hash code.
94
+ #
95
+ # @return [Integer] the object's hash code
96
+ #
97
+ def hash
98
+ state.hash
99
+ end
100
+
101
+ # Returns self.
102
+ #
103
+ # @return [Item] self
104
+ #
105
+ def to_item
106
+ self
107
+ end
108
+
109
+
110
+ private
111
+
112
+
113
+ # Collects the attributes of this instance.
114
+ #
115
+ # @return [Array<String, Sequence, Element>] an array of attributes
116
+ #
117
+ def state
118
+ [@vr, @name, @tags]
119
+ end
120
+
121
+ end
122
+ end