microstation 0.4.1

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.
Files changed (61) hide show
  1. data/.autotest +23 -0
  2. data/.gemtest +0 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +17 -0
  5. data/History.txt +6 -0
  6. data/Manifest.txt +60 -0
  7. data/README.txt +75 -0
  8. data/Rakefile +30 -0
  9. data/bin/dgn2pdf +37 -0
  10. data/lib/microstation.rb +88 -0
  11. data/lib/microstation/app.rb +286 -0
  12. data/lib/microstation/attributes.rb +35 -0
  13. data/lib/microstation/cad_input_queue.rb +25 -0
  14. data/lib/microstation/configuration.rb +57 -0
  15. data/lib/microstation/dir.rb +252 -0
  16. data/lib/microstation/drawing.rb +189 -0
  17. data/lib/microstation/enumerator.rb +29 -0
  18. data/lib/microstation/ext/pathname.rb +25 -0
  19. data/lib/microstation/extensions/hash.rb +27 -0
  20. data/lib/microstation/pdf_support.rb +40 -0
  21. data/lib/microstation/properties.rb +57 -0
  22. data/lib/microstation/scan/color.rb +38 -0
  23. data/lib/microstation/scan/criteria.rb +85 -0
  24. data/lib/microstation/scan/klass.rb +43 -0
  25. data/lib/microstation/scan/level.rb +38 -0
  26. data/lib/microstation/scan/line_style.rb +45 -0
  27. data/lib/microstation/scan/line_weight.rb +33 -0
  28. data/lib/microstation/scan/subtype.rb +40 -0
  29. data/lib/microstation/scan/type.rb +109 -0
  30. data/lib/microstation/scanner.rb +24 -0
  31. data/lib/microstation/tag.rb +58 -0
  32. data/lib/microstation/tag_set.rb +280 -0
  33. data/lib/microstation/template.rb +84 -0
  34. data/lib/microstation/text.rb +54 -0
  35. data/lib/microstation/text_node.rb +74 -0
  36. data/lib/microstation/ts/attribute.rb +139 -0
  37. data/lib/microstation/ts/instance.rb +112 -0
  38. data/lib/microstation/types.rb +91 -0
  39. data/lib/microstation/wrap.rb +214 -0
  40. data/plot/pdf-bw.plt +164 -0
  41. data/plot/pdf.plt +163 -0
  42. data/plot/png.plt +383 -0
  43. data/plot/tiff.plt +384 -0
  44. data/plot/wmbw.tbl +66 -0
  45. data/plot/wmcolor.tbl +62 -0
  46. data/spec/app_spec.rb +267 -0
  47. data/spec/configuration_spec.rb +122 -0
  48. data/spec/drawing_spec.rb +247 -0
  49. data/spec/drawings/new_drawing.dgn +0 -0
  50. data/spec/drawings/test.dgn +0 -0
  51. data/spec/drawings/test1.dgn +0 -0
  52. data/spec/drawings/testfile.pdf +0 -0
  53. data/spec/enumerator_spec.rb +60 -0
  54. data/spec/microstation_spec.rb +36 -0
  55. data/spec/scanner_spec.rb +155 -0
  56. data/spec/spec_app.rb +11 -0
  57. data/spec/spec_helper.rb +31 -0
  58. data/spec/tag_set_spec.rb +123 -0
  59. data/spec/text_node_spec.rb +92 -0
  60. data/spec/text_spec.rb +62 -0
  61. metadata +241 -0
@@ -0,0 +1,23 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'autotest/restart'
4
+
5
+ # Autotest.add_hook :initialize do |at|
6
+ # at.extra_files << "../some/external/dependency.rb"
7
+ #
8
+ # at.libs << ":../some/external"
9
+ #
10
+ # at.add_exception 'vendor'
11
+ #
12
+ # at.add_mapping(/dependency.rb/) do |f, _|
13
+ # at.files_matching(/test_.*rb$/)
14
+ # end
15
+ #
16
+ # %w(TestA TestB).each do |klass|
17
+ # at.extra_class_map[klass] = "test/test_misc.rb"
18
+ # end
19
+ # end
20
+
21
+ # Autotest.add_hook :run_command do |at|
22
+ # system "rake build"
23
+ # end
File without changes
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ # -*- ruby -*-
2
+
3
+ # DO NOT EDIT THIS FILE. Instead, edit Rakefile, and run `rake bundler:gemfile`.
4
+
5
+ source "https://rubygems.org/"
6
+
7
+ gem "methadone", ">=0.0.0"
8
+ gem "liquid", ">0.0.0"
9
+ gem "virtus", ">0.0.0"
10
+
11
+ gem "minitest", "~>4.6", :group => [:development, :test]
12
+ gem "rdoc", "~>3.10", :group => [:development, :test]
13
+ gem "rspec", ">0.0.0", :group => [:development, :test]
14
+ gem "pry-nav", ">0.0.0", :group => [:development, :test]
15
+ gem "hoe", "~>3.5", :group => [:development, :test]
16
+
17
+ # vim: syntax=ruby
@@ -0,0 +1,6 @@
1
+ === 1.0.0 / 2012-01-03
2
+
3
+ * 1 major enhancement
4
+
5
+ * Birthday!
6
+
@@ -0,0 +1,60 @@
1
+ .autotest
2
+ .rspec
3
+ Gemfile
4
+ History.txt
5
+ Manifest.txt
6
+ README.txt
7
+ Rakefile
8
+ bin/dgn2pdf
9
+ lib/microstation.rb
10
+ lib/microstation/app.rb
11
+ lib/microstation/attributes.rb
12
+ lib/microstation/cad_input_queue.rb
13
+ lib/microstation/configuration.rb
14
+ lib/microstation/dir.rb
15
+ lib/microstation/drawing.rb
16
+ lib/microstation/enumerator.rb
17
+ lib/microstation/ext/pathname.rb
18
+ lib/microstation/extensions/hash.rb
19
+ lib/microstation/pdf_support.rb
20
+ lib/microstation/properties.rb
21
+ lib/microstation/scan/color.rb
22
+ lib/microstation/scan/criteria.rb
23
+ lib/microstation/scan/klass.rb
24
+ lib/microstation/scan/level.rb
25
+ lib/microstation/scan/line_style.rb
26
+ lib/microstation/scan/line_weight.rb
27
+ lib/microstation/scan/subtype.rb
28
+ lib/microstation/scan/type.rb
29
+ lib/microstation/scanner.rb
30
+ lib/microstation/tag.rb
31
+ lib/microstation/tag_set.rb
32
+ lib/microstation/template.rb
33
+ lib/microstation/text.rb
34
+ lib/microstation/text_node.rb
35
+ lib/microstation/ts/attribute.rb
36
+ lib/microstation/ts/instance.rb
37
+ lib/microstation/types.rb
38
+ lib/microstation/wrap.rb
39
+ plot/pdf-bw.plt
40
+ plot/pdf.plt
41
+ plot/png.plt
42
+ plot/tiff.plt
43
+ plot/wmbw.tbl
44
+ plot/wmcolor.tbl
45
+ spec/app_spec.rb
46
+ spec/configuration_spec.rb
47
+ spec/drawing_spec.rb
48
+ spec/drawings/new_drawing.dgn
49
+ spec/drawings/test.dgn
50
+ spec/drawings/test1.dgn
51
+ spec/drawings/testfile.pdf
52
+ spec/enumerator_spec.rb
53
+ spec/microstation_spec.rb
54
+ spec/scanner_spec.rb
55
+ spec/spec_app.rb
56
+ spec/spec_helper.rb
57
+ spec/tag_set_spec.rb
58
+ spec/text_node_spec.rb
59
+ spec/text_spec.rb
60
+
@@ -0,0 +1,75 @@
1
+ = microstation
2
+
3
+ http://github.com/dsisnero/microstation
4
+
5
+ == DESCRIPTION:
6
+
7
+ this is a gem that wraps Bentley Microstation using the WIN32OLE
8
+ library.
9
+
10
+ == FEATURES/PROBLEMS:
11
+
12
+
13
+
14
+ == SYNOPSIS:
15
+ text_in_drawing = []
16
+ Microstation.run do |app|
17
+ sc = create_scanner do
18
+ include_color(3)
19
+ include_level(3)
20
+ end
21
+ app.open_drawing('./test.dgn') do |drawing|
22
+ drawing.scan_text do |text|
23
+ text.reverse! if text =~ /Reverse/ # things that modify thetext_in_drawing
24
+ puts text.to_s
25
+ end
26
+ drawing.scan( sc) do |ele|
27
+
28
+ end
29
+
30
+
31
+ drawing.save_as_pdf
32
+ end
33
+ end
34
+
35
+ == REQUIREMENTS:
36
+
37
+ An installed version of Microstation
38
+
39
+ == INSTALL:
40
+
41
+ * sudo gem install microstation
42
+
43
+ == DEVELOPERS:
44
+
45
+ After checking out the source, run:
46
+
47
+ $ rake
48
+
49
+ This task will install any missing dependencies, run the tests/specs,
50
+ and generate the RDoc.
51
+
52
+ == LICENSE:
53
+
54
+ (The MIT License)
55
+
56
+ Copyright (c) 2012 FIX
57
+
58
+ Permission is hereby granted, free of charge, to any person obtaining
59
+ a copy of this software and associated documentation files (the
60
+ 'Software'), to deal in the Software without restriction, including
61
+ without limitation the rights to use, copy, modify, merge, publish,
62
+ distribute, sublicense, and/or sell copies of the Software, and to
63
+ permit persons to whom the Software is furnished to do so, subject to
64
+ the following conditions:
65
+
66
+ The above copyright notice and this permission notice shall be
67
+ included in all copies or substantial portions of the Software.
68
+
69
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
70
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
71
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
72
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
73
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
74
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
75
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,30 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'rake/clean'
5
+ require 'hoe'
6
+ #require 'hoe/git'
7
+
8
+ require 'rake/testtask'
9
+
10
+ CLEAN.include("**/#*.*#")
11
+ Hoe.plugin :bundler
12
+ Hoe.plugin :minitest
13
+ Hoe.plugin :git
14
+ # Hoe.plugin :rubyforge
15
+
16
+ Hoe.spec 'microstation' do
17
+ developer('Dominic Sisneros', 'dsisnero@gmail.com')
18
+ clean_globs << '**/#*.*#'
19
+ dependency('rspec', '> 0.0.0', :dev)
20
+ dependency('methadone','>= 0.0.0')
21
+ dependency('liquid', '> 0.0.0')
22
+ dependency('virtus', '> 0.0.0')
23
+ dependency('pry-nav', '>0.0.0',:dev)
24
+
25
+ # self.rubyforge_name = 'microstation' # if different than 'microstation'
26
+ end
27
+
28
+
29
+
30
+ # vim: syntax=ruby
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'methadone'
5
+ require 'microstation'
6
+
7
+ class App
8
+ include Methadone::Main
9
+ include Methadone::CLILogging
10
+
11
+ main do |directory, output_dir|
12
+
13
+ directory_path = Pathname.new(directory).expand_path
14
+ exit_now! "arg directory: #{directory_path} doesn't exist" unless directory_path.directory?
15
+
16
+ Microstation.dgn2pdf(directory_path, output_dir)
17
+ # your program code here
18
+ # You can access CLI options via
19
+ # the options Hash
20
+ end
21
+
22
+ # supplemental methods here
23
+
24
+ # Declare command-line interface here
25
+
26
+ description "Convert a directory of Microstation files (*.dgn) to pdf"
27
+
28
+ on("-o","--output_dir","Output Dir")
29
+
30
+
31
+ arg :directory
32
+ arg :output_dir, :optional
33
+
34
+ use_log_level_option
35
+
36
+ go!
37
+ end
@@ -0,0 +1,88 @@
1
+ require 'win32ole'
2
+ require 'microstation/app'
3
+ require 'microstation/drawing'
4
+ require 'microstation/configuration'
5
+ require 'microstation/ext/pathname'
6
+ require 'microstation/cad_input_queue'
7
+ require 'microstation/scan/criteria'
8
+ require 'microstation/enumerator'
9
+ require 'microstation/text'
10
+ require 'microstation/text_node'
11
+ require 'microstation/template'
12
+ require 'microstation/tag_set'
13
+ require 'microstation/tag'
14
+ require 'microstation/dir'
15
+
16
+ require 'erb'
17
+
18
+ module Microstation
19
+ VERSION = '0.4.1'
20
+
21
+ def self.root
22
+ Pathname.new( File.dirname(__FILE__)).parent
23
+ end
24
+
25
+
26
+ def self.app
27
+ Microstation::App.new
28
+ end
29
+
30
+
31
+ def self.plot_driver_directory
32
+ root + "plot"
33
+ end
34
+
35
+ def self.use_template(template,context)
36
+ def context.binding
37
+ binding
38
+ end
39
+ opts = {:read_only => true}
40
+ Microstation::App.run do |app|
41
+ tmpfile = Tempfile.new('drawing')
42
+ app.new_drawing(tmpfile,template) do |drawing|
43
+ drawing.scan_text do |text|
44
+ compiled_template = ERB.new(text)
45
+ new_text = compiled_template.result(context.binding)
46
+ text = new_text
47
+ end
48
+ end
49
+ end
50
+ tempfile.read
51
+ end
52
+
53
+ def self.drawings_in_dir(dir)
54
+ dirpath = Pathname.new(dir).expand_path
55
+ drawings = Pathname.glob("#{dirpath}/*.d{gn,wg}")
56
+ end
57
+
58
+ def self.dgn2pdf(dir,output = dir)
59
+ drawings = drawings_in_dir(dir)
60
+ self.with_drawings(drawings) do |drawing|
61
+ drawing.save_as_pdf(drawing.name,output)
62
+ end
63
+ end
64
+
65
+ def self.open_drawing(drawing,options = {}, &block)
66
+ Microstation::App.open_drawing(drawing,options,&block)
67
+ end
68
+
69
+ def self.with_drawings_in_dir(dir,&block)
70
+ drawings = self.drawings_in_dir(dir)
71
+ self.with_drawings(drawings,&block)
72
+ end
73
+
74
+ def self.with_drawings(*files, &block)
75
+ Microstation::App.with_drawings(*files,&block)
76
+ end
77
+
78
+ def self.run(options={}, &block)
79
+ options = {:visible => false}.merge(options)
80
+ begin
81
+ app = Microstation::App.new(options)
82
+ block.arity < 1 ? app.instance_eval(&block) : block.call(app)
83
+ ensure
84
+ app.quit
85
+ end
86
+ end
87
+
88
+ end
@@ -0,0 +1,286 @@
1
+ require_relative 'wrap'
2
+
3
+ module Windows
4
+
5
+ class FileSystem
6
+
7
+ def self.windows_path(path)
8
+ obj = new
9
+ obj.windows_path(path)
10
+ end
11
+
12
+ def fs_object
13
+ @fs_object ||= WIN32OLE.new('Scripting.FileSystemObject')
14
+ end
15
+
16
+ def windows_path(path)
17
+ path = path.to_path if path.respond_to? :to_path
18
+ fs_object.GetAbsolutePathName(path.to_str)
19
+ end
20
+
21
+ end
22
+ end
23
+
24
+ module Microstation
25
+
26
+ module MSD
27
+ end
28
+
29
+ def self.win_fs
30
+ @windows_fs ||= Windows::FileSystem.new
31
+ end
32
+
33
+ class App
34
+
35
+ include Wrap
36
+
37
+ def self.run(options={})
38
+ begin
39
+ the_app = new(options)
40
+
41
+ yield the_app
42
+ ensure
43
+ the_app.quit
44
+ end
45
+ end
46
+
47
+ def self.open_drawing(drawing,options={},&block)
48
+ self.run(options) do |app|
49
+ app.open_drawing(drawing,options,&block)
50
+ end
51
+ end
52
+
53
+ def self.with_drawings(*files,&block)
54
+ files = files[0] if files[0].kind_of? Array
55
+ opts = {:read_only => true}
56
+ self.run do |app|
57
+ files.each do |file|
58
+ puts "opening #{file}.."
59
+ app.open_drawing(file,opts) do |draw|
60
+ block.call draw
61
+ end
62
+
63
+ end
64
+ end
65
+ end
66
+
67
+ def load_constants
68
+ WIN32OLE.const_load(@ole_obj, MSD) unless MSD.constants.size > 0
69
+ end
70
+
71
+ attr_reader :scanners
72
+
73
+ def initialize(options = {})
74
+ visible = options.fetch(:visible){ true }
75
+
76
+ @ole_obj = WIN32OLE.new('MicrostationDGN.Application')
77
+ @windows = Windows::FileSystem.new
78
+ make_visible(visible)
79
+ @scanners = []
80
+ end
81
+
82
+ def visible?
83
+ @visible
84
+ end
85
+
86
+ def project_dir
87
+ @project_dir
88
+ end
89
+
90
+ def project_dir=(dir)
91
+ @project_dir = dir ? Pathname.new(dir) : dir
92
+ end
93
+
94
+ def base_dir
95
+ project_dir ? project_dir : Pathname.getwd
96
+ end
97
+
98
+ def normalize_name(name)
99
+ name = Pathname.new(name) unless name.kind_of? Pathname
100
+ name = name.ext('.dgn') unless name.extname.to_s == /\.(dgn|dwg)$/
101
+ return (base_dir + name).expand_path
102
+ end
103
+
104
+ def make_visible(visible)
105
+ @visible = visible
106
+ @ole_obj.Visible = @visible
107
+ end
108
+
109
+ attr_reader :ole_obj
110
+
111
+ # def method_missing(name,*args,&block)
112
+ # @ole_obj.send(name,*args,&block)
113
+ # end
114
+
115
+ def with_drawing(drawing)
116
+ begin
117
+ yield drawing
118
+ ensure
119
+ drawing.close
120
+ end
121
+ end
122
+
123
+ def with_template(template)
124
+ template = Template.new(template,self)
125
+ yield template
126
+ template = nil
127
+ end
128
+
129
+ def open_drawing(filename,options = {})
130
+ filename = Pathname(filename)
131
+ raise FileNotFound unless filename.file?
132
+ readonly = options.fetch(:read_only){ false}
133
+ ole = @ole_obj.OpenDesignFile(windows_path(filename), "ReadOnly" => readonly)
134
+ drawing = drawing_from_ole(ole)
135
+ return drawing unless block_given?
136
+ begin
137
+ yield drawing
138
+ rescue
139
+ puts "got error"
140
+ ensure
141
+ drawing.close
142
+ end
143
+
144
+ end
145
+
146
+ def windows_path(path)
147
+ @windows.windows_path(path)
148
+ end
149
+
150
+ def active_workspace
151
+ @ole_obj.ActiveWorkspace
152
+ end
153
+
154
+ def configuration
155
+ @config ||= Microstation::Configuration.new(self)
156
+ end
157
+
158
+ def username
159
+ configuration["USERNAME"]
160
+ end
161
+
162
+ # seedfile A String expression. The name of the seed file. Should not include a path. The default extension is ".dgn".
163
+ # Typical values are "seed2d" or "seed3d".
164
+ # open
165
+ # If the open argument is True, CreateDesignFile returns the newly-opened DesignFile object; this is the same value as
166
+ # ActiveDesignFile. If the Open argument is False, CreateDesignFile returns Nothing.
167
+ def new_drawing(filename, seedfile=nil ,open = true,&block)
168
+ #drawing_name = normalize_name(filename)
169
+ seedfile = determine_seed(seedfile)
170
+ windows_name = windows_path(filename)
171
+ ole = @ole_obj.CreateDesignFile(seedfile, windows_name, open)
172
+ drawing = drawing_from_ole(ole)
173
+ return drawing unless block_given?
174
+ begin
175
+ yield drawing
176
+ rescue
177
+ ensure
178
+ drawing.close
179
+ end
180
+
181
+ end
182
+
183
+ def drawing_from_ole(ole)
184
+ Drawing.new(self,ole)
185
+ end
186
+
187
+ def determine_seed(seedfile)
188
+ return "seed2d" unless seedfile
189
+ return windows_path( File.expand_path(seedfile))
190
+ end
191
+
192
+ def eval_cexpression(string)
193
+ @ole_obj.GetCExpressionValue(string)
194
+ end
195
+
196
+ def quit
197
+ active_design_file.close if active_file?
198
+ @scanners.each{|sc| sc.close}
199
+ @ole_obj.quit
200
+ end
201
+
202
+ def active_design_file
203
+ ole = @ole_obj.ActiveDesignFile rescue nil
204
+ drawing_from_ole(ole) if ole
205
+ end
206
+
207
+ def current_drawing
208
+ active_design_file
209
+ end
210
+
211
+ # alias :current_drawing :active_design_file
212
+
213
+ def close_active_drawing
214
+ active_design_file.close if active_design_file
215
+ end
216
+
217
+ def active_file?
218
+ !!active_design_file
219
+ end
220
+
221
+ def file_exists?(file)
222
+ File.file?( File.expand_path(file) )
223
+ end
224
+
225
+ def create_scanner(&block)
226
+ Microstation::Scan::Criteria.create_scanner(self,&block)
227
+ end
228
+
229
+ def find_by_id(id)
230
+ model = active_model_reference.GetElementById64(id)
231
+ wrap(model)
232
+ end
233
+
234
+ def scan(criteria = nil)
235
+ result = []
236
+ raise 'NoActiveModel' unless active_model_reference
237
+ if criteria
238
+ criteria.resolve
239
+ ee = active_model_reference.Scan(criteria.ole_obj)
240
+ else
241
+ ee = active_model_reference.Scan(nil)
242
+ end
243
+ scan_result = Microstation::Enumerator.new ee
244
+ return scan_result.to_enum unless block_given?
245
+ scan_result.each do |item|
246
+ yield item
247
+ end
248
+ nil
249
+ end
250
+
251
+ def cad_input_queue
252
+ queue = init_cad_input_queue
253
+ return queue unless block_given?
254
+ begin
255
+ yield queue
256
+ rescue
257
+
258
+ ensure
259
+ queue.close
260
+ queue = nil
261
+ end
262
+ end
263
+
264
+ def can_open?(filename)
265
+ ext = File.extname(filename)
266
+ (ext == ".dwg") || (ext == ".dgn")
267
+ end
268
+
269
+ def active_model_reference
270
+ @ole_obj.ActiveModelReference rescue nil
271
+ end
272
+
273
+ private
274
+
275
+
276
+
277
+
278
+ def init_cad_input_queue
279
+ Microstation::CadInputQueue.new(@ole_obj.CadInputQueue)
280
+ end
281
+
282
+
283
+ end
284
+
285
+ end
286
+