microstation 0.8.3 → 0.8.4
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 +4 -4
- data/Manifest.txt +12 -2
- 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/drawing_with_text.dgn +0 -0
- data/cad_files/seed2d.dgn +0 -0
- data/cad_files/seed3d.dgn +0 -0
- data/lib/microstation/version.rb +1 -1
- data/spec/microstation/app_spec.rb +184 -0
- data/spec/microstation/configuration_spec.rb +131 -0
- data/spec/microstation/drawing_spec.rb +245 -0
- data/spec/microstation/functions_spec.rb +36 -0
- data/spec/microstation/tag_set_spec.rb +159 -0
- data/spec/microstation/template_spec.rb +159 -0
- data/spec/microstation/text_node_spec.rb +67 -0
- data/spec/microstation/text_spec.rb +42 -0
- data/spec/microstation_spec.rb +47 -0
- data/spec/spec_helper.rb +97 -0
- metadata +13 -4
- data/bin/microstation +0 -231
- data/cad_files/test.dgn +0 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../spec_helper'
|
4
|
+
|
5
|
+
describe 'points by rectangle' do
|
6
|
+
include Minitest::Hooks
|
7
|
+
|
8
|
+
before(:all) do
|
9
|
+
@app = Microstation::App.new(visible: true)
|
10
|
+
config_app(@app)
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:all) do
|
14
|
+
delete_current_drawing
|
15
|
+
@app.quit rescue nil
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:app) { @app }
|
19
|
+
|
20
|
+
it 'should be a function on app' do
|
21
|
+
skip
|
22
|
+
require 'pry'; binding.pry
|
23
|
+
drawing = app.new_drawing('temp.dgn')
|
24
|
+
pts = app.get_points_by_rectangle
|
25
|
+
puts pts.value
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#points_by_line' do
|
29
|
+
it 'should not error' do
|
30
|
+
skip
|
31
|
+
drawing = app.new_drawing('temp.dgn')
|
32
|
+
require 'pry'; binding.pry
|
33
|
+
pts = app.get_points_by_line
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../spec_helper'
|
4
|
+
|
5
|
+
describe 'Lets start the Microstation once' do
|
6
|
+
include Minitest::Hooks
|
7
|
+
before(:all) do
|
8
|
+
@app = Microstation::App.new
|
9
|
+
config_app(@app)
|
10
|
+
end
|
11
|
+
|
12
|
+
after(:all) do
|
13
|
+
@app.quit rescue nil
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'a new drawing' do
|
17
|
+
let(:drawing) { new_drawing('temp.dgn', seedfile: 'seed2d') }
|
18
|
+
|
19
|
+
describe 'creating a new tag set' do
|
20
|
+
let(:tagsets) { drawing.tagsets }
|
21
|
+
|
22
|
+
it 'should have no initial tagsets' do
|
23
|
+
_(tagsets.size).must_equal 0
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should create a tagset' do
|
27
|
+
ts = tagsets.create('test')
|
28
|
+
_(ts).must_be_instance_of Microstation::TagSet
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should be the same as a found tagset' do
|
32
|
+
ts = tagsets.create('test')
|
33
|
+
_(tagsets['test']).must_equal ts
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should allow you to remove a tagset' do
|
37
|
+
tagsets.create('test')
|
38
|
+
_(tagsets.size).must_equal 1
|
39
|
+
tagsets.remove('test')
|
40
|
+
_(tagsets.size).must_equal 0
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'A TagSet' do
|
45
|
+
let(:drawing) { new_drawing('temp.dgn', seedfile: 'seed2d') }
|
46
|
+
|
47
|
+
describe '#create_tagset' do
|
48
|
+
it 'should allow you to create' do
|
49
|
+
ts = drawing.create_tagset('faatitle')
|
50
|
+
_(ts).must_be_instance_of Microstation::TagSet
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should yield to block if block_given' do
|
54
|
+
drawing.create_tagset('faatitle') do |ts|
|
55
|
+
_(ts).must_be_instance_of Microstation::TagSet
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe 'given a TagSet' do
|
60
|
+
let(:tagset) { drawing.create_tagset('faatitle') }
|
61
|
+
|
62
|
+
it 'should initially have no attributes' do
|
63
|
+
_(tagset.attributes).must_be_empty
|
64
|
+
end
|
65
|
+
|
66
|
+
it '#add_attribute adds TS::Attribute' do
|
67
|
+
_(tagset.attributes).must_be_empty
|
68
|
+
td = tagset.add_attribute('title', String, prompt: 'My title')
|
69
|
+
_(td.prompt).must_equal('My title')
|
70
|
+
_(tagset.attributes.size).must_equal 1
|
71
|
+
_(td).must_be_instance_of Microstation::TS::Attribute
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should exist and can be found in drawing' do
|
75
|
+
tagset_local = tagset
|
76
|
+
ts = drawing.find_tagset('faatitle')
|
77
|
+
_(ts.name).must_equal tagset_local.name
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe 'given a tagset with tag defintions' do
|
82
|
+
let(:tagset) { drawing.create_tagset('faatitle') }
|
83
|
+
|
84
|
+
before do
|
85
|
+
tagset.add_attribute('title', String)
|
86
|
+
tagset.add_attribute('city', String)
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#attributes' do
|
90
|
+
it 'should have the correct size' do
|
91
|
+
_(tagset.attributes.size).must_equal 2
|
92
|
+
end
|
93
|
+
|
94
|
+
it '#attributes should be Array of TS::Attributes' do
|
95
|
+
tagset.attributes.each do |ta|
|
96
|
+
_(ta).must_be_instance_of Microstation::TS::Attribute
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe '#attribute_names' do
|
102
|
+
it 'returns an array of the correct names' do
|
103
|
+
_(tagset.attribute_names).must_equal %w[title city]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe '#[]' do
|
108
|
+
it 'should allow you to retrieve a tagset definition that exists' do
|
109
|
+
_(tagset['title']).must_be_instance_of Microstation::TS::Attribute
|
110
|
+
end
|
111
|
+
|
112
|
+
it "returns nil if attribute doesn't exist" do
|
113
|
+
_(tagset['bogus']).must_be_nil
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe 'a drawing with tagsets placed in drawing' do
|
122
|
+
let(:drawing) { open_existing_drawing('drawing_with_block.dgn') }
|
123
|
+
let(:tagsets) { drawing.tagsets }
|
124
|
+
let(:tset) { tagsets.first }
|
125
|
+
|
126
|
+
it 'has tagsets' do
|
127
|
+
_(tagsets).wont_be_empty
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'has the correct tagsets' do
|
131
|
+
_(tagsets.size).must_equal 1
|
132
|
+
_(tset.name).must_equal 'electrical_panel_42'
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'has tagset instances' do
|
136
|
+
_(tset.instances.size).must_equal 1
|
137
|
+
tagset_instance = tset.instances.first
|
138
|
+
_(tagset_instance.name).must_equal 'electrical_panel_42'
|
139
|
+
_(tagset_instance).must_be_instance_of Microstation::TS::Instance
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe 'a drawing with 3 instances of same tagset in drawing' do
|
144
|
+
let(:drawing) { open_existing_drawing('drawing_with_3_block.dgn') }
|
145
|
+
let(:tagsets) { drawing.tagsets }
|
146
|
+
let(:tset) { tagsets.first }
|
147
|
+
|
148
|
+
it 'has the correct number of tagsets' do
|
149
|
+
_(tagsets.size).must_equal 1
|
150
|
+
_(tagsets.names).must_equal %w[electrical_panel_42]
|
151
|
+
_(tset.name).must_equal 'electrical_panel_42'
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'has the correct instances' do
|
155
|
+
_(tset.instances.size).must_equal 3
|
156
|
+
_(tset.instances.map(&:name)).must_equal %w[electrical_panel_42 electrical_panel_42 electrical_panel_42]
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../spec_helper'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'digest/md5'
|
6
|
+
|
7
|
+
require 'minitest/spec'
|
8
|
+
require 'minitest/autorun'
|
9
|
+
|
10
|
+
require 'microstation/template'
|
11
|
+
|
12
|
+
module TestHelper
|
13
|
+
def digest_for_path(file)
|
14
|
+
Digest::MD5.hexdigest(File.read(file))
|
15
|
+
end
|
16
|
+
|
17
|
+
def file_same?(p, p2)
|
18
|
+
digest_path(p) == digest_path(p2)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe Microstation::Template do
|
23
|
+
include TestHelper
|
24
|
+
|
25
|
+
describe 'initialization' do
|
26
|
+
it 'needs a drawing argument' do
|
27
|
+
assert_raises { Microstation::Template.new }
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'requires a valid and existing microstation file' do
|
31
|
+
%w[draw.dgn file://adoc.doc file://anexcel.xls file://autocad.dwg].each do |ftype|
|
32
|
+
assert_raises { Microstation::Template.new(ftype) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'given a good dgn file and file exists' do
|
37
|
+
let(:file) { 'file.dgn' }
|
38
|
+
|
39
|
+
it 'does not error' do
|
40
|
+
mock = Minitest::Mock.new
|
41
|
+
mock.expect(:file?, true)
|
42
|
+
File.stub :file?, true do
|
43
|
+
Microstation::Template.new(file)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'sets the template' do
|
48
|
+
mock = Minitest::Mock.new
|
49
|
+
mock.expect(:file?, true)
|
50
|
+
File.stub :file?, true do
|
51
|
+
temp = Microstation::Template.new(file)
|
52
|
+
_(temp.template).must_equal(file)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe 'a drawing with tags' do
|
59
|
+
before do
|
60
|
+
@dgn_name = 'drawing_with_block.dgn'
|
61
|
+
@dgn_file = drawing_path('drawing_with_block.dgn')
|
62
|
+
@template = Microstation::Template.new(@dgn_file)
|
63
|
+
end
|
64
|
+
|
65
|
+
subject { @template }
|
66
|
+
|
67
|
+
describe '.render' do
|
68
|
+
let(:dgn_name) { @dgn_name }
|
69
|
+
let(:template) { @template }
|
70
|
+
let(:dgn_file) { @dgn_file }
|
71
|
+
let(:copied_file) { drawing_path('copied_file.dgn') }
|
72
|
+
let(:output_file) { output_path(dgn_name) }
|
73
|
+
let(:changed_name) { 'changed_name.dgn' }
|
74
|
+
let(:locals) do
|
75
|
+
{ 'a1' => 'change 1', 'a2' => 'change 2',
|
76
|
+
'a3' => 'c3', 'a4' => 'c4' }
|
77
|
+
end
|
78
|
+
|
79
|
+
before do
|
80
|
+
FileUtils.rm(copied_file) if File.exist? copied_file
|
81
|
+
FileUtils.cp(dgn_file, copied_file)
|
82
|
+
FileUtils.rm(output_file) if File.exist? output_file
|
83
|
+
FileUtils.rm(output_path(changed_name)) if File.exist?(output_path(changed_name))
|
84
|
+
end
|
85
|
+
|
86
|
+
after do
|
87
|
+
FileUtils.rm(output_file) if File.exist? output_file
|
88
|
+
FileUtils.rm(output_path(changed_name)) if File.exist?(output_path(changed_name))
|
89
|
+
end
|
90
|
+
|
91
|
+
it "it doesn't error" do
|
92
|
+
template.render(output_dir: OUTPUT_DIR)
|
93
|
+
end
|
94
|
+
|
95
|
+
describe 'when locals or tagsets not input' do
|
96
|
+
it 'does nothing unless either locals or tagsets' do
|
97
|
+
template.render(output_dir: OUTPUT_DIR)
|
98
|
+
_(File.file?(output_file)).must_equal false
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe 'when locals or tagset is set' do
|
103
|
+
it 'creates a file' do
|
104
|
+
template.render(output_dir: OUTPUT_DIR, locals: locals)
|
105
|
+
_(File.file?(output_file)).must_equal true
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'changes text' do
|
109
|
+
template.render(output_dir: OUTPUT_DIR,
|
110
|
+
locals: { 'a1' => 'change 1', 'a2' => 'change 2', 'a3' => 'c3', 'a4' => 'c4' })
|
111
|
+
text = Microstation.get_text(output_file)
|
112
|
+
['text1 change 1', 'text2 change 2', 'text3 c3', "node1 c4\nnode1 ", "node2 \nnode2 ",
|
113
|
+
'text a1 again change 1'].each do |t|
|
114
|
+
_(text).must_include(t)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
it "doesn't change input file" do
|
119
|
+
template.render(output_dir: OUTPUT_DIR, locals: locals)
|
120
|
+
_(FileUtils.compare_file(dgn_file, copied_file)).must_equal true
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'changes the output' do
|
124
|
+
template.render(output_dir: OUTPUT_DIR, locals: locals)
|
125
|
+
_(FileUtils.compare_file(output_file, copied_file)).must_equal false
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe 'a drawing with multiple blocks of the same block' do
|
130
|
+
# before :all do
|
131
|
+
# @dgn_file = drawing_path('drawing_with_block.dgn')
|
132
|
+
# @template = Microstation::Template.new(@dgn_file)
|
133
|
+
# end
|
134
|
+
|
135
|
+
let(:filename) { 'drawing_with_3_block.dgn' }
|
136
|
+
let(:drawing_file) { drawing_path(filename) }
|
137
|
+
let(:template) { Microstation::Template.new(drawing_file) }
|
138
|
+
let(:output_file) { output_path(filename) }
|
139
|
+
|
140
|
+
before do
|
141
|
+
FileUtils.rm(output_file) if File.exist? output_file
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'updates the drawing_blocks' do
|
145
|
+
panel = { 'brk_1_service' => 'OUTLETS',
|
146
|
+
'brk_2_service' => 'AIR CONDITIONER',
|
147
|
+
'microstation_id' => 324 }
|
148
|
+
template.render(output_dir: OUTPUT_DIR, tagsets: [{ 'electrical_panel_42' => panel }])
|
149
|
+
Microstation.run do |app|
|
150
|
+
drawing = app.open_drawing(output_file)
|
151
|
+
ts = drawing.find_tagset_instance_by_name_and_id('electrical_panel_42', 324)
|
152
|
+
_(ts.brk_2_service).must_equal('AIR CONDITIONER')
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../spec_helper'
|
4
|
+
|
5
|
+
describe 'Microstation::TextNode' do
|
6
|
+
include Minitest::Hooks
|
7
|
+
before(:all) do
|
8
|
+
@app = Microstation::App.new
|
9
|
+
config_app(@app)
|
10
|
+
end
|
11
|
+
|
12
|
+
after(:all) do
|
13
|
+
@app.quit rescue nil
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'given a TextNode' do
|
17
|
+
let(:app) { @app }
|
18
|
+
let(:scanner) { app.create_scanner(:text, &:include_text_nodes) }
|
19
|
+
let(:drawing) { open_existing_drawing('drawing_with_text.dgn') }
|
20
|
+
let(:text_node) { drawing.scan_model(scanner).find { |t| !t.empty? } }
|
21
|
+
|
22
|
+
it 'should forward Capitalized methods to @ole_obj' do
|
23
|
+
ole = Minitest::Mock.new
|
24
|
+
ole.expect(:Type, 'A ole type')
|
25
|
+
text_node.stub(:ole_obj, ole) do
|
26
|
+
_(text_node.Type).must_equal 'A ole type'
|
27
|
+
end
|
28
|
+
ole.verify
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'ruby string methods' do
|
32
|
+
describe "calling with methods that don't change the string" do
|
33
|
+
it 'should not call the update method' do
|
34
|
+
skip
|
35
|
+
ole = Minitest::Mock.new
|
36
|
+
mock.expect(:update, true)
|
37
|
+
text_node.stub(:upcase, true)
|
38
|
+
|
39
|
+
ole = Minitest::Mock.new
|
40
|
+
text_node.reverse
|
41
|
+
text_node.downcase
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should give the correct value' do
|
45
|
+
value = text_node.to_s
|
46
|
+
_(text_node.reverse.to_s).must_equal(value.reverse)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should retain the same value' do
|
50
|
+
value = text_node.to_s
|
51
|
+
result = text_node.reverse
|
52
|
+
_(text_node.to_s).must_equal(value)
|
53
|
+
_(text_node.to_s).wont_equal result
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe 'calling with methods that change the string' do
|
58
|
+
it 'should change the value' do
|
59
|
+
value = text_node.to_s
|
60
|
+
result = text_node.reverse!
|
61
|
+
_(text_node.to_s).must_equal(result)
|
62
|
+
_(text_node.to_s).wont_equal(value)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../spec_helper'
|
4
|
+
|
5
|
+
describe 'Microstation:Text and Microstation::TextNode' do
|
6
|
+
include Minitest::Hooks
|
7
|
+
before(:all) do
|
8
|
+
@app = Microstation::App.new
|
9
|
+
config_app(@app)
|
10
|
+
end
|
11
|
+
after(:all) do
|
12
|
+
@app.quit rescue nil
|
13
|
+
end
|
14
|
+
|
15
|
+
describe 'given a text node initialized by a scan' do
|
16
|
+
let(:drawing) { open_existing_drawing('drawing_with_text.dgn') }
|
17
|
+
let(:criteria) { @app.create_scanner(&:include_textual) }
|
18
|
+
|
19
|
+
before do
|
20
|
+
text_array = drawing.scan_model(criteria).to_a
|
21
|
+
@text = text_array.find { |t| t.instance_of?(Microstation::Text) }
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:text) { @text }
|
25
|
+
|
26
|
+
it 'should be an instance of text' do
|
27
|
+
_(text).must_be_instance_of Microstation::Text
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should forward all the Microstation commands to ole_obj' do
|
31
|
+
_(text.IsTextElement).must_equal true
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should update the drawing if the text is changed' do
|
35
|
+
id = text.microstation_id
|
36
|
+
val = text.to_s
|
37
|
+
text.reverse!
|
38
|
+
drawing_text = drawing.find_by_id(id)
|
39
|
+
_(drawing_text.to_s).must_equal(val.reverse)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|