microstation 0.4.1 → 0.8.3
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.
- checksums.yaml +7 -0
- data/.autotest +23 -23
- data/.rspec +2 -2
- data/Gemfile +28 -10
- data/History.txt +6 -6
- data/LICENSE.adoc +22 -0
- data/Manifest.txt +81 -60
- data/README.adoc +131 -0
- data/Rakefile +71 -30
- data/bin/dgn2pdf +36 -37
- data/bin/dgn_template +107 -0
- data/bin/microstation +231 -0
- data/bin/pw_print +35 -0
- data/cad_files/drawing_faatitle_in_non_default_model.dgn +0 -0
- data/cad_files/drawing_no_block.dgn +0 -0
- data/cad_files/drawing_with_3_block.dgn +0 -0
- data/cad_files/drawing_with_block.dgn +0 -0
- data/cad_files/seed2d.dgn +0 -0
- data/cad_files/test.dgn +0 -0
- data/lib/microstation.rb +252 -88
- data/lib/microstation/app.rb +781 -286
- data/lib/microstation/cad_input_queue.rb +100 -25
- data/lib/microstation/cell.rb +191 -0
- data/lib/microstation/changer.rb +70 -0
- data/lib/microstation/configuration.rb +193 -57
- data/lib/microstation/criteria_creation_t.rb +23 -0
- data/lib/microstation/dir.rb +252 -252
- data/lib/microstation/directory.rb +46 -0
- data/lib/microstation/drawing.rb +690 -189
- data/lib/microstation/element.rb +311 -0
- data/lib/microstation/enumerator.rb +32 -29
- data/lib/microstation/errors.rb +17 -0
- data/lib/microstation/event_handler.rb +28 -0
- data/lib/microstation/ext/pathname.rb +23 -25
- data/lib/microstation/ext/win32ole.rb +7 -0
- data/lib/microstation/extensions/faa.rb +124 -0
- data/lib/microstation/file_tests.rb +68 -0
- data/lib/microstation/functions.rb +60 -0
- data/lib/microstation/graphics.rb +35 -0
- data/lib/microstation/line.rb +19 -0
- data/lib/microstation/model.rb +45 -0
- data/lib/microstation/model_trait.rb +189 -0
- data/lib/microstation/ole_cad_input_message.rb +101 -0
- data/lib/microstation/ole_helper.rb +152 -0
- data/lib/microstation/pdf_support.rb +40 -40
- data/lib/microstation/point3d.rb +71 -0
- data/lib/microstation/primitive_command_interface.rb +66 -0
- data/lib/microstation/properties.rb +61 -57
- data/lib/microstation/property_handler.rb +48 -0
- data/lib/microstation/scan/color.rb +38 -38
- data/lib/microstation/scan/criteria.rb +89 -85
- data/lib/microstation/scan/klass.rb +43 -43
- data/lib/microstation/scan/level.rb +38 -38
- data/lib/microstation/scan/line_style.rb +45 -45
- data/lib/microstation/scan/line_weight.rb +33 -33
- data/lib/microstation/scan/range.rb +19 -0
- data/lib/microstation/scan/scan_trait.rb +51 -0
- data/lib/microstation/scan/subtype.rb +40 -40
- data/lib/microstation/scan/type.rb +134 -109
- data/lib/microstation/scan_trait.rb +62 -0
- data/lib/microstation/scanner.rb +24 -24
- data/lib/microstation/tag.rb +87 -58
- data/lib/microstation/tag_set.rb +385 -280
- data/lib/microstation/tag_set_trait.rb +51 -0
- data/lib/microstation/tagged_element.rb +105 -0
- data/lib/microstation/template.rb +90 -84
- data/lib/microstation/template_info.rb +172 -0
- data/lib/microstation/template_runner.rb +65 -0
- data/lib/microstation/text.rb +79 -54
- data/lib/microstation/text_node.rb +124 -74
- data/lib/microstation/ts/attribute.rb +140 -139
- data/lib/microstation/ts/instance.rb +146 -112
- data/lib/microstation/ts/tagset_trait.rb +49 -0
- data/lib/microstation/types.rb +91 -91
- data/lib/microstation/version.rb +5 -0
- data/lib/microstation/wrap.rb +28 -214
- data/plot/pdf-bw.plt +164 -164
- data/plot/pdf.plt +163 -163
- data/plot/png.plt +383 -383
- data/plot/tiff.plt +384 -384
- data/plot/wmbw.tbl +324 -66
- data/plot/wmcolor.tbl +62 -62
- metadata +301 -86
- data/.gemtest +0 -0
- data/README.txt +0 -75
- data/lib/microstation/attributes.rb +0 -35
- data/lib/microstation/extensions/hash.rb +0 -27
- data/spec/app_spec.rb +0 -267
- data/spec/configuration_spec.rb +0 -122
- data/spec/drawing_spec.rb +0 -247
- data/spec/drawings/new_drawing.dgn +0 -0
- data/spec/drawings/test.dgn +0 -0
- data/spec/drawings/test1.dgn +0 -0
- data/spec/drawings/testfile.pdf +0 -0
- data/spec/enumerator_spec.rb +0 -60
- data/spec/microstation_spec.rb +0 -36
- data/spec/scanner_spec.rb +0 -155
- data/spec/spec_app.rb +0 -11
- data/spec/spec_helper.rb +0 -31
- data/spec/tag_set_spec.rb +0 -123
- data/spec/text_node_spec.rb +0 -92
- data/spec/text_spec.rb +0 -62
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
require 'microstation/property_handler'
|
|
2
|
+
|
|
3
|
+
class WIN32OLE
|
|
4
|
+
|
|
5
|
+
def to_ole
|
|
6
|
+
self
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
end
|
|
10
|
+
module Microstation
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module Microstation
|
|
14
|
+
|
|
15
|
+
module ElementTrait
|
|
16
|
+
|
|
17
|
+
#
|
|
18
|
+
#
|
|
19
|
+
#
|
|
20
|
+
# @return [Boolean] true if ole type is Text
|
|
21
|
+
#
|
|
22
|
+
def text?
|
|
23
|
+
ole_obj.Type == ::Microstation::MSD::MsdElementTypeText
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# @return [Boolean] true if ole type is TextNode
|
|
27
|
+
def text_node?
|
|
28
|
+
ole_obj.Type == ::Microstation::MSD::MsdElementTypeTextNode
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def has_tags?
|
|
32
|
+
ole_obj.HasAnyTags
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def to_ole
|
|
36
|
+
ole_obj
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def cell?
|
|
40
|
+
ole_obj.Type == ::Microstation::MSD::MsdElementTypeCellHeader
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def complex?
|
|
44
|
+
ole_obj.IsComplexElement
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# @return [Boolean] true if Text or TextNode
|
|
48
|
+
def textual?
|
|
49
|
+
text? || text_node?
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def microstation_id()
|
|
53
|
+
id = ole_obj.Id || ole_obj.ID64
|
|
54
|
+
return nil unless id
|
|
55
|
+
id_from_record(id)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @return [Boolean] true if ole type is TypeLine
|
|
59
|
+
def line?
|
|
60
|
+
ole_obj.Type == ::Microstation::MSD::MsdElementTypeLine
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def graphical?
|
|
64
|
+
ole_obj.IsGraphical
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def parent
|
|
68
|
+
parent_id = ole_obj.ParentID
|
|
69
|
+
return nil unless parent_id
|
|
70
|
+
id = id_from_record(parent_id)
|
|
71
|
+
app.active_design_file.find_by_id(id)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def id_from_record(id)
|
|
75
|
+
if id.class == WIN32OLE_RECORD
|
|
76
|
+
if id.Low > id.High
|
|
77
|
+
return id.Low
|
|
78
|
+
else
|
|
79
|
+
return id.High
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def select
|
|
85
|
+
app.active_model_reference.select_element(self)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# def Type
|
|
89
|
+
# ole_obj.Type
|
|
90
|
+
# end
|
|
91
|
+
|
|
92
|
+
def microstation_type
|
|
93
|
+
ole_obj.Type
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def model
|
|
98
|
+
Model.new(app, app.current_drawing, ole_obj.ModelReference)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
class Element
|
|
104
|
+
|
|
105
|
+
include ElementTrait
|
|
106
|
+
|
|
107
|
+
def self.convert_item(ole,app, cell=nil)
|
|
108
|
+
return Point3d.from_ole(ole) if ole.class == WIN32OLE_RECORD && ole.typename == 'Point3d'
|
|
109
|
+
return ole unless ole.class == WIN32OLE
|
|
110
|
+
case ole.Type
|
|
111
|
+
when ::Microstation::MSD::MsdElementTypeText
|
|
112
|
+
::Microstation::Text.new(ole,app,cell)
|
|
113
|
+
when ::Microstation::MSD::MsdElementTypeLine
|
|
114
|
+
::Microstation::Line.new(ole,app,cell)
|
|
115
|
+
when ::Microstation::MSD::MsdElementTypeTextNode
|
|
116
|
+
::Microstation::TextNode.new(ole,app,cell)
|
|
117
|
+
when ::Microstation::MSD::MsdElementTypeTag
|
|
118
|
+
::Microstation::Tag.new(ole,app,cell)
|
|
119
|
+
when ::Microstation::MSD::MsdElementTypeCellHeader
|
|
120
|
+
::Microstation::Cell.new(ole,app,cell)
|
|
121
|
+
when ::Microstation::MSD::MsdElementTypeSharedCell
|
|
122
|
+
::Microstation::Cell.new(ole,app,cell)
|
|
123
|
+
when ::Microstation::MSD::MsdElementTypeArc
|
|
124
|
+
::Microstation::Arc.new(ole,app,cell)
|
|
125
|
+
when ::Microstation::MSD::MsdElementTypeEllipse
|
|
126
|
+
::Microstation::Ellipse.new(ole,app,cell)
|
|
127
|
+
when ::Microstation::MSD::MsdElementTypeBsplineSurface
|
|
128
|
+
::Microstation::BSplineSurface.new(ole,app,cell)
|
|
129
|
+
when ::Microstation::MSD::MsdElementTypeBsplineCurve
|
|
130
|
+
::Microstation::BSplineCurve.new(ole,app,cell)
|
|
131
|
+
|
|
132
|
+
else
|
|
133
|
+
new(ole,app,cell)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def self.ole_object?
|
|
138
|
+
ole.class == WIN32OLE
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
attr_reader :ole_obj, :app, :original
|
|
143
|
+
|
|
144
|
+
def initialize(ole,app, cell = nil)
|
|
145
|
+
@ole_obj = ole
|
|
146
|
+
@original = read_ole(ole)
|
|
147
|
+
@app = app
|
|
148
|
+
@cell = cell
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def in_cell?
|
|
152
|
+
!!@cell
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def read_ole(ole)
|
|
156
|
+
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def write_ole(value)
|
|
160
|
+
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def method_missing(meth,*args,&block)
|
|
164
|
+
if meth.to_s =~ /^[A-Z]/
|
|
165
|
+
result = ole_obj.send(meth,*args,&block)
|
|
166
|
+
Element.convert_item(result,app)
|
|
167
|
+
else
|
|
168
|
+
super(meth,*args,&block)
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def get_property_handler
|
|
174
|
+
ph_ole = app_ole_obj.CreatePropertyHandler(ole_obj)
|
|
175
|
+
PropertyHandler.new(ph_ole)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def property_handler
|
|
179
|
+
@property_handler ||= get_property_handler
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def [](name)
|
|
183
|
+
property_handler[name]
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def do_update(value)
|
|
188
|
+
return false if value == original
|
|
189
|
+
saved_original = original
|
|
190
|
+
begin
|
|
191
|
+
write_ole(value)
|
|
192
|
+
@original = read_ole(ole_obj)
|
|
193
|
+
return true
|
|
194
|
+
|
|
195
|
+
rescue => e
|
|
196
|
+
@original = saved_original
|
|
197
|
+
false
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def update(value)
|
|
202
|
+
redraw_el = ole_obj
|
|
203
|
+
if do_update(value)
|
|
204
|
+
if in_cell?
|
|
205
|
+
@cell.ReplaceCurrentElement @ole_obj
|
|
206
|
+
redraw_el = @cell
|
|
207
|
+
end
|
|
208
|
+
redraw(redraw_el)
|
|
209
|
+
@updated = true
|
|
210
|
+
true
|
|
211
|
+
else
|
|
212
|
+
@updated = false
|
|
213
|
+
false
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def updated?
|
|
218
|
+
@updated
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def redraw(el = ole_obj)
|
|
222
|
+
el.Redraw ::Microstation::MSD::MsdDrawingModeNormal
|
|
223
|
+
el.Rewrite
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def app_ole_obj
|
|
227
|
+
app.ole_obj
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def ole_cell(ole)
|
|
231
|
+
ole.IsCellElement || ole.IsSharedCellElement
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def each_cell(ole,&block)
|
|
235
|
+
cell = ole if ole_cell(ole)
|
|
236
|
+
ole.ResetElementEnumeration rescue binding.pry
|
|
237
|
+
while ole.MoveToNextElement
|
|
238
|
+
component = ole.CopyCurrentElement
|
|
239
|
+
if component.IsTextNodeElement
|
|
240
|
+
yield Microstation::Wrap.wrap(component.AsTextNodeElement,app,cell)
|
|
241
|
+
elsif component.IsTextElement
|
|
242
|
+
yield Microstation::Wrap.wrap(component.AsTextElement,app,cell)
|
|
243
|
+
elsif component.IsComplexElement
|
|
244
|
+
each(component)
|
|
245
|
+
else
|
|
246
|
+
yield Microstation::Wrap.wrap(component,app,cell)
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
def each(ole = ole_obj,&block)
|
|
252
|
+
return unless ole.IsComplexElement
|
|
253
|
+
return to_enum(:each) unless block_given?
|
|
254
|
+
if ole.IsCellElement
|
|
255
|
+
each_cell(ole,&block)
|
|
256
|
+
else
|
|
257
|
+
each_complex(ole,&block)
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
def each_complex(ole,&block)
|
|
262
|
+
cell = nil
|
|
263
|
+
components = ole.GetSubElements
|
|
264
|
+
while components.MoveNext
|
|
265
|
+
component = components.Current
|
|
266
|
+
if component.IsTextNodeElement
|
|
267
|
+
yield Microstation::Wrap.wrap(component.AsTextNodeElement,app,cell)
|
|
268
|
+
elsif component.IsTextElement
|
|
269
|
+
yield Microstation::Wrap.wrap(component.AsTextElement,app,cell)
|
|
270
|
+
elsif component.IsComplexElement
|
|
271
|
+
each(component,&block)
|
|
272
|
+
else
|
|
273
|
+
yield Microstation::Wrap.wrap(component,app,cell)
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
class App
|
|
282
|
+
|
|
283
|
+
def ole_to_ruby(ole)
|
|
284
|
+
Element.convert_item(ole,self)
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
module Microstation
|
|
294
|
+
class Arc < Element
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
module Microstation
|
|
299
|
+
class Ellipse < Element
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
module Microstation
|
|
304
|
+
class BSplineSurface < Element
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
module Microstation
|
|
309
|
+
class BSplineCurve < Element
|
|
310
|
+
end
|
|
311
|
+
end
|
|
@@ -1,29 +1,32 @@
|
|
|
1
|
-
require_relative 'wrap'
|
|
2
|
-
|
|
3
|
-
module Microstation
|
|
4
|
-
|
|
5
|
-
class Enumerator
|
|
6
|
-
|
|
7
|
-
include Enumerable
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
1
|
+
require_relative 'wrap'
|
|
2
|
+
|
|
3
|
+
module Microstation
|
|
4
|
+
|
|
5
|
+
class Enumerator
|
|
6
|
+
|
|
7
|
+
include Enumerable
|
|
8
|
+
|
|
9
|
+
attr_reader :app
|
|
10
|
+
|
|
11
|
+
def initialize(ole,app)
|
|
12
|
+
@ole_obj = ole
|
|
13
|
+
@app = app
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def each
|
|
17
|
+
return enum_for(:each) unless block_given?
|
|
18
|
+
while @ole_obj.MoveNext
|
|
19
|
+
item = @ole_obj.Current
|
|
20
|
+
yield Microstation::Wrap.wrap(item,app)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def reset
|
|
25
|
+
@ole_obj.reset
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Microstation
|
|
2
|
+
|
|
3
|
+
Error = Class.new(::RuntimeError)
|
|
4
|
+
NonDGNFile = Class.new(Error)
|
|
5
|
+
FileNotFound = Class.new(Error)
|
|
6
|
+
MultipleUpdateError = Class.new(Error)
|
|
7
|
+
class ExistingFile < Error
|
|
8
|
+
|
|
9
|
+
def initialize(path)
|
|
10
|
+
msg = "File at path #{path} already exists"
|
|
11
|
+
super(msg)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Microstation
|
|
2
|
+
|
|
3
|
+
class EventHandler
|
|
4
|
+
def initialize
|
|
5
|
+
@handlers = {}
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def add_handler(event, &block)
|
|
9
|
+
if block_given?
|
|
10
|
+
@handlers[event] = block
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def get_handler(event)
|
|
15
|
+
@handlers[event]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def method_missing(event, *args)
|
|
19
|
+
if @handlers[event.to_s]
|
|
20
|
+
@handlers[event.to_s].call(*args)
|
|
21
|
+
else
|
|
22
|
+
puts "Unhandled event: #{event} args: #{args}"
|
|
23
|
+
super
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
@@ -1,25 +1,23 @@
|
|
|
1
|
-
require 'pathname'
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class Pathname
|
|
5
|
-
|
|
6
|
-
def ext(newext = '')
|
|
7
|
-
str = self.to_s
|
|
8
|
-
return self.dup if ['.', '..'].include? str
|
|
9
|
-
if newext != ''
|
|
10
|
-
newext = (newext =~ /^\./) ? newext : ("." + newext)
|
|
11
|
-
end
|
|
12
|
-
Pathname.new(str.dup.sub!(%r(([^/\\])\.[^./\\]*$)) { $1 + newext } || str + newext)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def extstr(newext='')
|
|
16
|
-
Pathname.new( self.to_s.ext(newext))
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
end
|
|
1
|
+
require 'pathname'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Pathname
|
|
5
|
+
|
|
6
|
+
def ext(newext = '')
|
|
7
|
+
str = self.to_s
|
|
8
|
+
return self.dup if ['.', '..'].include? str
|
|
9
|
+
if newext != ''
|
|
10
|
+
newext = (newext =~ /^\./) ? newext : ("." + newext)
|
|
11
|
+
end
|
|
12
|
+
Pathname.new(str.dup.sub!(%r(([^/\\])\.[^./\\]*$)) { $1 + newext } || str + newext)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def extstr(newext='')
|
|
16
|
+
Pathname.new( self.to_s.ext(newext))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def glob(pattern)
|
|
20
|
+
self.class.glob("#{self.to_s}/#{pattern}")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|