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.
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,51 @@
1
+ module Microstation
2
+
3
+ module TagSetTrait
4
+
5
+ def tagsets
6
+ @tagsets ||= TagSets.new(self,ole_obj_tagsets)
7
+ end
8
+
9
+ def tagset_names
10
+ tagsets.map{|ts| ts.name}
11
+ end
12
+
13
+ def reset_tagsets
14
+ @tagsets = nil
15
+ tagsets
16
+ end
17
+
18
+ def create_tagset(name,&block)
19
+ ts = tagsets.create(name)
20
+ reset_tagsets
21
+ block.call ts if block
22
+ ts
23
+ end
24
+
25
+ def create_tagset!(name,&block)
26
+ remove_tagset(name)
27
+ create_tagset(name,&block)
28
+ end
29
+
30
+ def remove_tagset(name)
31
+ tagsets.remove(name)
32
+ reset_tagsets
33
+ end
34
+
35
+ def find_tagset(name)
36
+ tagsets[name]
37
+ end
38
+
39
+ protected
40
+
41
+ def ole_obj_tagsets
42
+ @ole_obj.TagSets
43
+ end
44
+
45
+ def ensure_tags(tags)
46
+ tags.map{|t| t.class == WIN32OLE ? app.ole_to_ruby(t) : t }
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -0,0 +1,105 @@
1
+ module Microstation
2
+
3
+ class TaggedElement
4
+
5
+ class Set
6
+
7
+ attr_reader :element
8
+
9
+ def initialize(name,element)
10
+ @name = name
11
+ @element = element
12
+ end
13
+
14
+ def name
15
+ @name
16
+ end
17
+
18
+ def elements=(elements)
19
+ elements.each do |ele|
20
+ ele.base_element = @element
21
+ end
22
+ @elements = elements
23
+ end
24
+
25
+ def find_attribute(name)
26
+ @elements.find{|a| a.name == name.to_s}
27
+ end
28
+
29
+ def [](name)
30
+ find_attribute(name)
31
+ end
32
+
33
+ def attributes
34
+ @elements.map{|e| e.name}
35
+ end
36
+
37
+ def update_element(name,value)
38
+ find_attribute(name)._update(value)
39
+ end
40
+
41
+ def element_value(name)
42
+ find_attribute(name).value
43
+ end
44
+
45
+ def to_hash
46
+ result = {}
47
+ @elements.each do |ele|
48
+ result[ele.name] = ele.value unless (ele.value == "" || ele.value.nil?)
49
+ end
50
+ result
51
+ end
52
+
53
+ def stringify_keys(hash)
54
+ result = {}
55
+ hash.each do |key,value|
56
+ result[key.to_s] = value
57
+ end
58
+ result
59
+ end
60
+
61
+ def update(value_hash)
62
+ value_hash = stringify_keys(value_hash)
63
+ valid_atts = attributes & value_hash.keys
64
+ valid_atts.each do |att|
65
+ update_element(att,value_hash[att])
66
+ end
67
+ end
68
+
69
+ def method_missing(meth,*args,&block)
70
+ # binding.pry
71
+ base = meth.to_s.sub("=", "")
72
+ if attributes.include?(base)
73
+ if meth.match /(=)/
74
+ update_element(base,*args)
75
+ else
76
+ element_value(base.to_s)
77
+ end
78
+ else
79
+ super(meth,*args,&block)
80
+ end
81
+ end
82
+
83
+ end
84
+
85
+ def initialize(ole=nil)
86
+ @ole_obj = ole
87
+ @tag_sets = []
88
+ end
89
+
90
+ def add_tagset(name,elements)
91
+ ts = TaggedElement::Set.new(name,self)
92
+ ts.elements = elements
93
+ @tag_sets << ts
94
+ ts
95
+ end
96
+
97
+ def get_tagset(name)
98
+ @tagsets.find{|ts| ts.name == name}
99
+ end
100
+
101
+
102
+ end
103
+
104
+
105
+ end
@@ -1,84 +1,90 @@
1
- require 'erb'
2
- require 'liquid'
3
- require 'fileutils'
4
- require File.join(File.dirname(__FILE__), 'extensions/hash')
5
- module Microstation
6
-
7
- class Template
8
-
9
- def initialize(template,app = nil)
10
- # @app = app || Microstation::App.new
11
- @template = template
12
- end
13
-
14
- def close
15
- @app.quit
16
- end
17
-
18
- def render(context,locals={}, output)
19
- temp = Tempfile.new('working')
20
- temp.close
21
- __run__(context,locals,temp.path)
22
- FileUtils.mv(temp,output)
23
- puts "Printed drawing #{output}"
24
- end
25
-
26
- def add_binding(scope,locals={},&block)
27
- tagsets = locals.delete(:tagsets)
28
- nlocals = normalize_hash(locals)
29
- nscope = normalize_hash(scope)
30
- nlocals = locals.merge(nscope)
31
- nlocals['yield'] = block.nil? ? '' : yield
32
- nlocals['content'] = nlocals['yield']
33
- [nlocals,tagsets]
34
- end
35
-
36
- def normalize_hash(scope)
37
- scope = scope.to_h if scope.respond_to?(:to_h)
38
- if scope.kind_of? Hash
39
- scope = scope.map_k{|k| k.to_s}
40
- end
41
- scope
42
- end
43
-
44
- def update_tagset(drawing,name,values)
45
- tagset = drawing.find_tagset(name)
46
- tagset.update(values)
47
- end
48
-
49
- def add_binding_erb(object)
50
- class << object
51
- def get_binding
52
- binding
53
- end
54
- end
55
- end
56
-
57
- def __run__(context,locals={},file)
58
-
59
- Microstation.run do |app|
60
- app.new_drawing(file,@template) do |drawing|
61
- scope,tagsets = add_binding(context,locals)
62
- tagsets.each do |tagset_name,values|
63
- tagset = drawing.find_tagset(tagset_name.to_s).first
64
- require 'pry'
65
- binding.pry
66
- tagset.update(values) if tagset
67
- end
68
- drawing.scan_text do |text|
69
- # binding.pry if text =~ /usi_west|usi_east/
70
- compiled = ::Liquid::Template.parse(text.to_s)
71
- new_text = compiled.render(scope) rescue text #binding.pry
72
- if new_text != text.to_s
73
- text.replace(new_text)
74
- end
75
-
76
- end
77
- end
78
- #file
79
- end
80
- end
81
-
82
- end
83
-
84
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+ require 'microstation'
5
+ require 'liquid'
6
+ require 'fileutils'
7
+ require 'tmpdir'
8
+ require_relative 'changer'
9
+ require File.join(File.dirname(__FILE__), 'file_tests')
10
+ require File.join(File.dirname(__FILE__), 'errors')
11
+
12
+ module Microstation
13
+ class Template
14
+ EMPTY_ARRAY = [].freeze
15
+ EMPTY_HASH = {}.freeze
16
+ def initialize(template, output_dir: nil, app: nil, name: nil)
17
+ @changer = Changer.new(template, output_dir: output_dir, app: app, name: name)
18
+ end
19
+
20
+ def template
21
+ @changer.template
22
+ end
23
+
24
+ def render(name: nil, output_dir: nil, locals: EMPTY_HASH, tagsets: EMPTY_ARRAY)
25
+ return if locals == EMPTY_HASH && tagsets == EMPTY_ARRAY
26
+ @changer.run(name: name, output_dir: output_dir) do |drawing|
27
+ locals = normalize_hash(locals)
28
+ update_text(drawing, locals)
29
+ update_tagsets(drawing, tagsets)
30
+ end
31
+ end
32
+
33
+ def run(update = {})
34
+ @changer.run do |drawing|
35
+ locals = normalize_hash(update)
36
+ return if locals == {}
37
+
38
+ update_text(drawing, locals)
39
+ update_tagsets(drawing, tagsets)
40
+ end
41
+ end
42
+
43
+ def update_text(drawing, locals = {})
44
+ change_template_text_normal(drawing, locals)
45
+ change_template_text_in_cells(drawing, locals)
46
+ end
47
+
48
+ def change_template_text_normal(drawing, locals = {})
49
+ drawing.scan_text do |text|
50
+ new_text = update_liquid_text(text, locals)
51
+ text.replace new_text if new_text != text.to_s
52
+ end
53
+ end
54
+
55
+ def change_template_text_in_cells(drawing, locals = {})
56
+ drawing.scan_cells do |c|
57
+ c.text_elements do |text|
58
+ new_text = update_liquid_text(text, locals)
59
+ text.replace new_text if new_text != text.to_s
60
+ end
61
+ end
62
+ end
63
+
64
+ def update_liquid_text(text, locals)
65
+ update_hash = normalize_hash(locals)
66
+ compiled = ::Liquid::Template.parse(text.to_s)
67
+ new_text = begin
68
+ compiled.render(update_hash)
69
+ rescue StandardError
70
+ text
71
+ end
72
+ end
73
+
74
+ def normalize_hash(scope)
75
+ scope = scope.to_h if scope.respond_to?(:to_h)
76
+ scope = scope.transform_keys(&:to_s) if scope.is_a? Hash
77
+ scope
78
+ end
79
+
80
+ def update_tagsets(drawing, ts_arg)
81
+ return if ts_arg == []
82
+ return if ts_arg == {}
83
+
84
+ ts_arg = [ts_arg] if ts_arg.instance_of?(Hash)
85
+ ts_arg.each do |hash_pair|
86
+ drawing.update_tagset(hash_pair.keys[0], hash_pair.values[0])
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,172 @@
1
+ module Microstation
2
+
3
+ class TemplateInfo
4
+
5
+ class TagSetMap
6
+
7
+ def initialize(filter,block)
8
+ @filter = filter
9
+ @block = block
10
+ end
11
+
12
+ def call(tagsets)
13
+ instances = tagsets.select(&filter)
14
+ instances.map{ |ti| block.call(ti)}
15
+ end
16
+ end
17
+
18
+
19
+
20
+ LIQUID_REGEXP = /{{([^}}]+)}}/
21
+
22
+
23
+ attr_reader :drawing,:placeholder_keys, :template, :tagsets,:locals,:drawing_path, :tagset_filter,:tagset_map
24
+
25
+ def initialize(drawing, tagset_filter: nil, tagset_map: faa_map, visible: false)
26
+ case drawing
27
+ when ::Microstation::Drawing
28
+ initialize_attributes(drawing)
29
+ return
30
+ when String,Pathname
31
+ drawing_path = drawing
32
+ else
33
+ drawing_path = drawing.to_path
34
+ end
35
+ binding.pry
36
+ ::Microstation::App.run(visible: visible) do |app|
37
+ app.open_drawing(drawing_path) do |d|
38
+ initialize_attributes(d)
39
+ end
40
+ end
41
+ @tagset_filter = tagset_filter
42
+ @tagset_map = tagset_map
43
+ return self
44
+ end
45
+
46
+ def initialize_attributes(drawing)
47
+ @drawing_path = drawing.path
48
+ entry_points = get_entry_points(drawing)
49
+ @placeholder_keys = keys_from_entry_points(entry_points)
50
+ @locals = keys_to_h(@placeholder_keys)
51
+ @template = @drawing_path.to_s
52
+ @tagsets = drawing_tagsets(drawing)
53
+ @output_dir = output_dir(@drawing_path)
54
+ end
55
+
56
+ def drawing_tagsets(drawing)
57
+ #drawing.tagsets_in_drawing_to_hash
58
+ drawing.tagsets_in_drawing_to_hash
59
+ end
60
+
61
+ def output_dir(l_drawing_path = @drawing_path)
62
+ l_drawing_path.parent.to_s
63
+ end
64
+
65
+ def to_h
66
+ if tagset_filter
67
+ filtered = tagsets.select{|ts| tagset_filter.call(ts)}
68
+ else
69
+ filtered = tagsets.dup
70
+ end
71
+ mapped_tsets = filtered.map{|ts| tagset_map.call(ts)}
72
+ { template: template,
73
+ output_dir: output_dir,
74
+ name: drawing_name,
75
+ locals: locals,
76
+ tagsets: mapped_tsets
77
+ }
78
+ end
79
+
80
+ def default_filter
81
+ ->(ts){ ts.name == 'faatitle'}
82
+ end
83
+
84
+ def before_locals(locals)
85
+ locals
86
+ end
87
+
88
+ def map_tagset(mapname: , filter: tagset_name_filter, &block)
89
+ @tagset_mappings[tname] = TagSetMap.new(filter, block)
90
+ end
91
+
92
+ def do_tagset_mappings
93
+ @tagset_mappings.each do |ts_mapper|
94
+ ts_mapper.call(tagsets)
95
+ ti_instances = tagsets.select{|ts| ts['tag_name'] == k}
96
+ ti_instances.each do |ti|
97
+ ti.attributes.map
98
+ end
99
+ end
100
+ end
101
+
102
+ def faa_map
103
+ ->(ts){
104
+ if ts['tagset_name'] == 'faatitle'
105
+ atts = ts['attributes']
106
+ new_atts = atts.keep_if{|k,v| faa_title_keys.include? k}
107
+ ts['attributes']= new_atts
108
+ ts
109
+ else
110
+ ts
111
+ end
112
+ }
113
+ end
114
+
115
+ def faa_title_keys
116
+ %w(microstation_id fac title1 title2 title3 subnam subttle appname appttl file dnnew jcnno city state)
117
+ end
118
+
119
+
120
+ def drawing_name
121
+ drawing_path.basename.to_s
122
+ end
123
+
124
+ def yaml_filename
125
+ drawing_path.basename.ext('yaml')
126
+ end
127
+
128
+ def dump(dir = output_dir)
129
+ dir = Pathname(dir)
130
+ File.open(dir + yaml_filename, 'w'){|f| f.puts self.to_yaml}
131
+ end
132
+
133
+ def to_yaml
134
+ to_h.to_yaml
135
+ end
136
+
137
+ protected
138
+
139
+ def entry_points(drawing)
140
+ @entry_points ||= get_entry_points
141
+ end
142
+
143
+ def get_entry_points(drawing)
144
+ result = []
145
+ drawing.scan_all_text do |m,text|
146
+ binding.pry if text =~ /txt1/
147
+
148
+ result << [m, text.to_s] if text.to_s =~ /{{([^}}])+}}/
149
+ end
150
+ binding.pry
151
+ result
152
+ end
153
+
154
+ def keys_from_entry_points(entry_points= get_entry_points)
155
+ entry_points.reduce([]) do |result,(m,text)|
156
+ text.scan(LIQUID_REGEXP).flatten.map{|t| t.strip}.each do |a|
157
+ result << a
158
+ end
159
+ result.uniq
160
+ end
161
+ end
162
+
163
+ def keys_to_h(keys= @placeholder_keys)
164
+ keys.each_with_object({}) do |k,h|
165
+ h[k] = ""
166
+ end
167
+ end
168
+
169
+
170
+ end
171
+
172
+ end