microstation 0.4.1 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +7 -0
  2. data/.autotest +23 -23
  3. data/.rspec +2 -2
  4. data/Gemfile +28 -10
  5. data/History.txt +6 -6
  6. data/LICENSE.adoc +22 -0
  7. data/Manifest.txt +81 -60
  8. data/README.adoc +131 -0
  9. data/Rakefile +71 -30
  10. data/bin/dgn2pdf +36 -37
  11. data/bin/dgn_template +107 -0
  12. data/bin/microstation +231 -0
  13. data/bin/pw_print +35 -0
  14. data/cad_files/drawing_faatitle_in_non_default_model.dgn +0 -0
  15. data/cad_files/drawing_no_block.dgn +0 -0
  16. data/cad_files/drawing_with_3_block.dgn +0 -0
  17. data/cad_files/drawing_with_block.dgn +0 -0
  18. data/cad_files/seed2d.dgn +0 -0
  19. data/cad_files/test.dgn +0 -0
  20. data/lib/microstation.rb +252 -88
  21. data/lib/microstation/app.rb +781 -286
  22. data/lib/microstation/cad_input_queue.rb +100 -25
  23. data/lib/microstation/cell.rb +191 -0
  24. data/lib/microstation/changer.rb +70 -0
  25. data/lib/microstation/configuration.rb +193 -57
  26. data/lib/microstation/criteria_creation_t.rb +23 -0
  27. data/lib/microstation/dir.rb +252 -252
  28. data/lib/microstation/directory.rb +46 -0
  29. data/lib/microstation/drawing.rb +690 -189
  30. data/lib/microstation/element.rb +311 -0
  31. data/lib/microstation/enumerator.rb +32 -29
  32. data/lib/microstation/errors.rb +17 -0
  33. data/lib/microstation/event_handler.rb +28 -0
  34. data/lib/microstation/ext/pathname.rb +23 -25
  35. data/lib/microstation/ext/win32ole.rb +7 -0
  36. data/lib/microstation/extensions/faa.rb +124 -0
  37. data/lib/microstation/file_tests.rb +68 -0
  38. data/lib/microstation/functions.rb +60 -0
  39. data/lib/microstation/graphics.rb +35 -0
  40. data/lib/microstation/line.rb +19 -0
  41. data/lib/microstation/model.rb +45 -0
  42. data/lib/microstation/model_trait.rb +189 -0
  43. data/lib/microstation/ole_cad_input_message.rb +101 -0
  44. data/lib/microstation/ole_helper.rb +152 -0
  45. data/lib/microstation/pdf_support.rb +40 -40
  46. data/lib/microstation/point3d.rb +71 -0
  47. data/lib/microstation/primitive_command_interface.rb +66 -0
  48. data/lib/microstation/properties.rb +61 -57
  49. data/lib/microstation/property_handler.rb +48 -0
  50. data/lib/microstation/scan/color.rb +38 -38
  51. data/lib/microstation/scan/criteria.rb +89 -85
  52. data/lib/microstation/scan/klass.rb +43 -43
  53. data/lib/microstation/scan/level.rb +38 -38
  54. data/lib/microstation/scan/line_style.rb +45 -45
  55. data/lib/microstation/scan/line_weight.rb +33 -33
  56. data/lib/microstation/scan/range.rb +19 -0
  57. data/lib/microstation/scan/scan_trait.rb +51 -0
  58. data/lib/microstation/scan/subtype.rb +40 -40
  59. data/lib/microstation/scan/type.rb +134 -109
  60. data/lib/microstation/scan_trait.rb +62 -0
  61. data/lib/microstation/scanner.rb +24 -24
  62. data/lib/microstation/tag.rb +87 -58
  63. data/lib/microstation/tag_set.rb +385 -280
  64. data/lib/microstation/tag_set_trait.rb +51 -0
  65. data/lib/microstation/tagged_element.rb +105 -0
  66. data/lib/microstation/template.rb +90 -84
  67. data/lib/microstation/template_info.rb +172 -0
  68. data/lib/microstation/template_runner.rb +65 -0
  69. data/lib/microstation/text.rb +79 -54
  70. data/lib/microstation/text_node.rb +124 -74
  71. data/lib/microstation/ts/attribute.rb +140 -139
  72. data/lib/microstation/ts/instance.rb +146 -112
  73. data/lib/microstation/ts/tagset_trait.rb +49 -0
  74. data/lib/microstation/types.rb +91 -91
  75. data/lib/microstation/version.rb +5 -0
  76. data/lib/microstation/wrap.rb +28 -214
  77. data/plot/pdf-bw.plt +164 -164
  78. data/plot/pdf.plt +163 -163
  79. data/plot/png.plt +383 -383
  80. data/plot/tiff.plt +384 -384
  81. data/plot/wmbw.tbl +324 -66
  82. data/plot/wmcolor.tbl +62 -62
  83. metadata +301 -86
  84. data/.gemtest +0 -0
  85. data/README.txt +0 -75
  86. data/lib/microstation/attributes.rb +0 -35
  87. data/lib/microstation/extensions/hash.rb +0 -27
  88. data/spec/app_spec.rb +0 -267
  89. data/spec/configuration_spec.rb +0 -122
  90. data/spec/drawing_spec.rb +0 -247
  91. data/spec/drawings/new_drawing.dgn +0 -0
  92. data/spec/drawings/test.dgn +0 -0
  93. data/spec/drawings/test1.dgn +0 -0
  94. data/spec/drawings/testfile.pdf +0 -0
  95. data/spec/enumerator_spec.rb +0 -60
  96. data/spec/microstation_spec.rb +0 -36
  97. data/spec/scanner_spec.rb +0 -155
  98. data/spec/spec_app.rb +0 -11
  99. data/spec/spec_helper.rb +0 -31
  100. data/spec/tag_set_spec.rb +0 -123
  101. data/spec/text_node_spec.rb +0 -92
  102. data/spec/text_spec.rb +0 -62
@@ -0,0 +1,7 @@
1
+ class WIN32OLE
2
+
3
+ def ole_obj
4
+ self
5
+ end
6
+
7
+ end
@@ -0,0 +1,124 @@
1
+ module Microstation
2
+ class Drawing
3
+ class Number
4
+ end
5
+ end
6
+ end
7
+
8
+
9
+ module Microstation
10
+
11
+
12
+ class Drawing
13
+
14
+
15
+
16
+ def number
17
+ binding.pry
18
+ Drawing::Number.from_string(self.basename)
19
+ end
20
+
21
+ class Number
22
+
23
+ DRAWING_RE = /(.+)-.+-(.+)-(.+).dgn/
24
+
25
+ def self.from_string(drawing_name)
26
+ md = DRAWING_RE.match(drawing_name.to_s)
27
+ new(md[1],md[2],md[3])
28
+ end
29
+
30
+
31
+ def Index(str)
32
+ return str if str == Drawing::Index
33
+ Drawing::Index.new(str.to_s)
34
+ end
35
+
36
+
37
+
38
+ attr_reader :locid, :factype, :index
39
+
40
+ def initialize(locid,factype, index)
41
+ @locid = locid.to_s.upcase
42
+ @factype = factype.to_s.upcase
43
+ @index = Index(index)
44
+ end
45
+
46
+
47
+
48
+ def to_s
49
+ [locid,'D',factype,index.to_s].join("-")
50
+ end
51
+
52
+ def discipline
53
+ index.discipline
54
+ end
55
+
56
+ def +(n)
57
+ self.class.new(locid,factype,index.+(n))
58
+ end
59
+
60
+ def -(n)
61
+ self.class.new(locid,factype,index.-(n))
62
+ end
63
+
64
+ end
65
+
66
+
67
+ class Index
68
+
69
+
70
+
71
+ def initialize(str)
72
+ return str if str === Index
73
+ @nbr = str
74
+ end
75
+
76
+ def discipline
77
+ @nbr[0].upcase
78
+ end
79
+
80
+ def digits
81
+ @nbr[1..-1]
82
+ end
83
+
84
+ def to_s
85
+ combined_string(digits_string)
86
+ end
87
+
88
+ def as_int
89
+ digits.to_i
90
+ end
91
+
92
+ def digits_string(n = digits)
93
+ "%03d" % n
94
+ end
95
+
96
+ def combined_string(dstring)
97
+ "#{discipline}#{dstring}"
98
+ end
99
+
100
+ def +(n)
101
+ self.class.new( combined_string( digits_string(as_int + n)))
102
+ end
103
+
104
+
105
+ def -(n)
106
+ self.class.new( combined_string( digits_string(as_int - n)))
107
+
108
+ end
109
+
110
+ def succ
111
+ self.+(1)
112
+ end
113
+
114
+ def pred
115
+ self.-(1)
116
+ end
117
+
118
+
119
+
120
+ end
121
+
122
+ end
123
+
124
+ end
@@ -0,0 +1,68 @@
1
+ module Microstation
2
+
3
+ module FileTests
4
+
5
+
6
+ def microstation_drawing?(f)
7
+ f = f.to_path if f.respond_to? :to_path
8
+ f = f.to_str
9
+ File.file?(f) && File.extname(f) == '.dgn'
10
+ end
11
+
12
+ def drawing?(f)
13
+ f = f.to_path if f.respond_to? :to_path
14
+ f = f.to_str
15
+ File.file?(f) && drawing_type?(f)
16
+ end
17
+
18
+
19
+ def drawing_type?(f)
20
+ f = f.to_path if f.respond_to? :to_path
21
+ f = f.to_str
22
+ ext = File.extname(f)
23
+ ext == '.dwg' || ext == '.dgn'
24
+ end
25
+
26
+ def check_is_drawing(f)
27
+ raise ArgumentError, 'File must be a dgn or dwg file' unless drawing?(f)
28
+ end
29
+ def check_is_dgn(f)
30
+ raise ArgumentError, 'File must be a dgn file' unless microstation_drawing?(f)
31
+ end
32
+ end
33
+
34
+ end
35
+
36
+
37
+ if $0 == __FILE__
38
+
39
+ class Test
40
+
41
+ include Microstation::FileChecks
42
+
43
+
44
+ end
45
+
46
+ module Microstation
47
+
48
+ class Test2
49
+
50
+ include FileChecks
51
+
52
+ end
53
+
54
+ end
55
+
56
+ t = Test.new
57
+ t2 = Microstation::Test2.new
58
+
59
+ def check_type(c,c2,f)
60
+ puts "c.drawing_type?(#{f}) == #{c.drawing_type?(f)}"
61
+ puts "c2.drawing_type?(#{f}) == #{c2.drawing_type?(f)}"
62
+ end
63
+
64
+ %w( doc.pdf doc.doc doc.rtf doc.dgn doc.dwg doc.rb).each do |f|
65
+ check_type(t,t2,f)
66
+ end
67
+
68
+ end
@@ -0,0 +1,60 @@
1
+ require 'dry/monads'
2
+ module Microstation
3
+
4
+ class App
5
+ include Dry::Monads[:result]
6
+ end
7
+
8
+ module Functions
9
+
10
+ extend Dry::Monads[:result]
11
+
12
+ def get_points_by_rectangle
13
+ queue = cad_input_queue
14
+ queue.show_command('Get points by block')
15
+ start_point = queue.get_point
16
+ if start_point.failure?
17
+ return Failure(:point1_reset)
18
+ end
19
+ queue.send_command "PLACE BLOCK"
20
+ queue.send_data_point start_point.value!
21
+ end_point = queue.get_point
22
+ if end_point.failure?
23
+ return Failure(:point2_reset)
24
+ end
25
+ Success([start_point.value!, end_point.value!])
26
+ end
27
+
28
+ def get_points_by_line
29
+ queue = cad_input_queue
30
+ queue.show_command("Get points by line")
31
+ start_point = queue.get_point
32
+ if start_point.failure?
33
+ return Failure(:point1_reset)
34
+ end
35
+ queue.send_command "PLACE LINE"
36
+ queue.send_data_point start_point.value!
37
+ end_point = queue.get_point("Enter next vertex")
38
+ if end_point.failure?
39
+ return Failure(:point2_reset)
40
+ end
41
+ Success([start_point.value!, end_point.value!])
42
+ end
43
+
44
+ def clear_ui
45
+ cad_input_queue.clear_ui
46
+ end
47
+
48
+ def get_point
49
+ cad_input_queue.get_point
50
+ end
51
+
52
+
53
+ end
54
+
55
+
56
+ class App
57
+ include Functions
58
+ end
59
+ end
60
+
@@ -0,0 +1,35 @@
1
+ module Microstation
2
+
3
+ module Graphics
4
+
5
+
6
+ def line(p1,p2,el = WIN32OLE_VARIANT::Nothing)
7
+ pt1 = app.to_ole_point3d(p1)
8
+ pt2 = app.to_ole_point3d(p2)
9
+ begin
10
+ ole = app.ole_obj.CreateLineElement2(el,pt1,pt2)
11
+ rescue Exception => ex
12
+ binding.pry
13
+ return nil
14
+ end
15
+ add_element(ole) if ole
16
+ end
17
+
18
+
19
+ def line_from_pts(pts, el = WIN32OLE_VARIANT::Nothing)
20
+ ole_points = pts.map{ |pt| app.to_ole_point3d(pt) }
21
+ ole = app.ole_obj.CreateLineElement1(el, ole_points)
22
+ if ole
23
+ add_element(ole)
24
+ else
25
+ binding.pry
26
+ end
27
+ rescue Exception => e
28
+ binding.pry
29
+ return nil
30
+ end
31
+ end
32
+
33
+
34
+ end
35
+
@@ -0,0 +1,19 @@
1
+ require 'microstation/element'
2
+
3
+ module Microstation
4
+
5
+ class Line < Element
6
+
7
+ def length
8
+ ole_obj.Length
9
+ end
10
+
11
+
12
+ def vertices
13
+ ole_obj.AsVertexList
14
+ n = ole_obj.VerticesCount
15
+ list = ole_obj.GetVertices
16
+ list
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,45 @@
1
+ #require_relative 'scan/scan_trait'
2
+ require 'microstation/wrap'
3
+ require_relative 'model_trait'
4
+
5
+ #require_relative 'ts/tagset_trait'
6
+ #require_relative 'graphics'
7
+ #require_relative 'ts/instance'
8
+
9
+
10
+ module Microstation
11
+
12
+ class DefaultModel
13
+
14
+ include ::Microstation::ModelTrait
15
+
16
+ attr_reader :app,:ole_obj
17
+
18
+ def initialize(app,ole)
19
+ @app = app
20
+ @ole_obj = ole
21
+ end
22
+
23
+ def drawing
24
+ @drawing ||= ::Microstation::Drawing.from_ole_obj(app,ole_obj)
25
+ end
26
+
27
+
28
+ end
29
+
30
+
31
+ class Model
32
+
33
+ include ::Microstation::ModelTrait
34
+
35
+ attr_reader :app,:drawing,:ole_obj
36
+
37
+ def initialize(app,drawing,ole)
38
+ @app = app
39
+ @drawing = drawing
40
+ @ole_obj = ole
41
+ end
42
+
43
+ end
44
+
45
+ end
@@ -0,0 +1,189 @@
1
+ require_relative 'graphics'
2
+ require_relative 'scan_trait'
3
+
4
+ module Microstation
5
+ module ModelTrait
6
+
7
+ include Graphics
8
+
9
+ include ScanTrait
10
+ # include TS::TagSetTrait
11
+
12
+ def name
13
+ ole_obj.name
14
+ end
15
+
16
+ def find_by_id(id)
17
+ ele = ole_obj.GetElementById64(id) rescue nil
18
+ return nil unless ele
19
+ app.ole_to_ruby(ele)
20
+ end
21
+
22
+ def active?
23
+ ole_obj.IsActive
24
+ end
25
+
26
+ def get_selected_elements
27
+ Enumerator.new(ole_obj.GetSelectedElements,app)
28
+ end
29
+
30
+ def get_selected_text
31
+ get_selected_elements.select{|t| t.textual?}
32
+ end
33
+
34
+ def get_matching_text(re)
35
+ result = []
36
+ get_selected_text.each do |t|
37
+ md = re.match( t)
38
+ if md
39
+ if block_given?
40
+ yield t,md
41
+ else
42
+ result << t
43
+ end
44
+ end
45
+ result
46
+ end
47
+ end
48
+
49
+ def change_text_suffix(reg,offset)
50
+ get_matching_text(reg) do |t,md|
51
+ pre = md[1]
52
+ suff = Integer( md[2] ) + offset
53
+ t.replace "#{pre}#{suff}"
54
+ end
55
+ end
56
+
57
+ def unselect_element(el)
58
+ ole_obj.UnselectElement(el.ole_obj)
59
+ end
60
+
61
+ def select_element(el)
62
+ ole_obj.SelectElement(el.ole_obj)
63
+ end
64
+
65
+ def readonly?
66
+ ole_obj.IsReadOnly
67
+ end
68
+
69
+ def activate
70
+ ole_obj.Activate
71
+ end
72
+
73
+ def locked?
74
+ ole_obj.IsLocked?
75
+ end
76
+
77
+ def to_s
78
+ "Microstation::Model-#{name}"
79
+ end
80
+
81
+
82
+ def add_element(el)
83
+ if el.respond_to? :ole_obj
84
+ el = el.ole_obj
85
+ ole_obj.AddElement(el)
86
+ self
87
+ end
88
+ end
89
+
90
+ def select_tagset_instances
91
+
92
+ end
93
+
94
+ def scan_tags_filtered( ts_name: nil, base_element_id: nil,&block)
95
+ case [ts_name, base_element_id]
96
+ in [nil, nil]
97
+ scan_tags(&block)
98
+ in [String,nil]
99
+ scan_tags.select{ |t| t.tagset_name == ts_name }
100
+ in [String, Numeric]
101
+ scan_tags.select{ |t| t.tagset_name == ts_name && t.base_element_id == base_element_id }
102
+ in [nil, Numeric]
103
+ scan_tags.select{ |t| t.base_element_id == base_element_id }
104
+
105
+ end
106
+ end
107
+
108
+ def tags_to_hash(tags)
109
+ return to_enum(__callee__,tags) unless block_given?
110
+ tsets = tags.group_by{ |t| t.tagset_name }
111
+ tsets.each do |tsname, tags|
112
+ elements = tags.group_by{|t| t.base_element_id}
113
+ elements.each do |id, tag_elts|
114
+ result_hash = {
115
+ name: tsname,
116
+ model: name,
117
+ tags: tag_elts,
118
+ base_element_id: id,
119
+ }
120
+ yield result_hash
121
+ end
122
+ end
123
+ end
124
+
125
+ def get_tagsets_in_model_hash(ts_name: nil, base_element_id: nil,&block)
126
+ tags = scan_tags_filtered(ts_name: ts_name, base_element_id: base_element_id)
127
+ tags_to_hash(tags, &block)
128
+ end
129
+
130
+ def get_tagsets_in_model_hash_old
131
+ results = []
132
+ tsets = scan_tags.group_by{|t| t.tagset_name}
133
+ tsets.each do |tsname, tags|
134
+ elements = tags.group_by{|t| t.base_element_id}
135
+ elements.each do |id, tag_elts|
136
+ result_hash = {
137
+ name: tsname,
138
+ model: name,
139
+ tags: tag_elts,
140
+ base_element_id: id,
141
+ }
142
+ if block_given?
143
+ yield result_hash
144
+ else
145
+ results << result_hash
146
+ end
147
+ end
148
+ results unless block_given?
149
+ end
150
+
151
+ end
152
+
153
+
154
+ # Scan the model with
155
+ # @param [Scan::Criteria] criteria - the criteria to scan
156
+ # @yield the item
157
+ def scan_model(criteria=nil)
158
+ # binding.pry
159
+ criteria = criteria || create_scanner(:nullscanner)
160
+ scan_result = ole_run_scan(criteria)
161
+ return [] unless scan_result
162
+ # binding.pry
163
+ scan_enum = ::Microstation::Enumerator.new(scan_result, app)
164
+ result = []
165
+ if block_given?
166
+ scan_enum.each do |item|
167
+ yield item
168
+ end
169
+ else
170
+ scan_enum.each do |item|
171
+ result << item
172
+ end
173
+ end
174
+
175
+ return result unless block_given?
176
+ end
177
+
178
+
179
+ private
180
+
181
+ def ole_run_scan(criteria)
182
+ criteria.resolve
183
+ scan_result = self.ole_obj.Scan(criteria.ole_obj) rescue nil
184
+ end
185
+
186
+
187
+ end
188
+
189
+ end