laser-cutter 0.5.3 → 1.0.0
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/.travis.yml +1 -1
- data/README.md +20 -16
- data/bin/laser-cutter +4 -158
- data/lib/laser-cutter.rb +2 -0
- data/lib/laser-cutter/aggregator.rb +57 -0
- data/lib/laser-cutter/box.rb +37 -24
- data/lib/laser-cutter/cli/opt_parser.rb +131 -0
- data/lib/laser-cutter/cli/serializer.rb +51 -0
- data/lib/laser-cutter/configuration.rb +3 -2
- data/lib/laser-cutter/geometry.rb +0 -3
- data/lib/laser-cutter/geometry/dimensions.rb +3 -3
- data/lib/laser-cutter/geometry/point.rb +0 -46
- data/lib/laser-cutter/geometry/shape/line.rb +40 -1
- data/lib/laser-cutter/geometry/shape/rect.rb +2 -2
- data/lib/laser-cutter/geometry/tuple.rb +73 -27
- data/lib/laser-cutter/notching.rb +10 -0
- data/lib/laser-cutter/notching/base.rb +13 -0
- data/lib/laser-cutter/notching/edge.rb +87 -0
- data/lib/laser-cutter/notching/path_generator.rb +249 -0
- data/lib/laser-cutter/renderer/base.rb +1 -1
- data/lib/laser-cutter/renderer/box_renderer.rb +2 -2
- data/lib/laser-cutter/renderer/layout_renderer.rb +19 -8
- data/lib/laser-cutter/renderer/meta_renderer.rb +8 -9
- data/lib/laser-cutter/version.rb +1 -1
- data/spec/aggregator_spec.rb +65 -0
- data/spec/box_spec.rb +5 -1
- data/spec/dimensions_spec.rb +0 -1
- data/spec/edge_spec.rb +43 -0
- data/spec/line_spec.rb +42 -19
- data/spec/path_generator_spec.rb +30 -36
- data/spec/point_spec.rb +2 -2
- data/spec/rect_spec.rb +1 -1
- data/spec/renderer_spec.rb +14 -5
- metadata +13 -5
- data/lib/laser-cutter/geometry/edge.rb +0 -33
- data/lib/laser-cutter/geometry/notched_path.rb +0 -46
- data/lib/laser-cutter/geometry/path_generator.rb +0 -129
data/lib/laser-cutter/version.rb
CHANGED
@@ -0,0 +1,65 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
module Laser
|
4
|
+
module Cutter
|
5
|
+
describe Aggregator do
|
6
|
+
let(:p1) { Geometry::Point[0, 0] }
|
7
|
+
let(:p2) { Geometry::Point[2, 0] }
|
8
|
+
let(:p3) { Geometry::Point[5, 0] }
|
9
|
+
let(:p4) { Geometry::Point[10, 0] }
|
10
|
+
let(:p5) { Geometry::Point[0, 12] }
|
11
|
+
|
12
|
+
let(:l1) { Geometry::Line.new(p1, p3) }
|
13
|
+
let(:l2) { Geometry::Line.new(p2, p4) }
|
14
|
+
let(:l3) { Geometry::Line.new(p2, p5) }
|
15
|
+
let(:l4) { Geometry::Line.new(p1, p2) }
|
16
|
+
let(:l5) { Geometry::Line.new(p3, p4) }
|
17
|
+
|
18
|
+
let(:lines) { [ l1, l2 ]}
|
19
|
+
|
20
|
+
let(:aggregator) { Aggregator.new(lines) }
|
21
|
+
|
22
|
+
context '#initialize' do
|
23
|
+
it 'should initialize with passed in parameters' do
|
24
|
+
expect(aggregator.lines.size).to eql(2)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context '#dedup' do
|
29
|
+
let(:a) { [1,5,3,1,2,2,2,2 ] }
|
30
|
+
let(:unique_lines) { [ l1, l2, l3, l4, l5 ]}
|
31
|
+
it 'should remove dups from a simple array' do
|
32
|
+
expect(Aggregator.new(a).dedup!.lines).to eql([3,5])
|
33
|
+
end
|
34
|
+
context 'short array' do
|
35
|
+
let(:lines) { [ l1, l2, l1, l1 ]}
|
36
|
+
let(:result) { [ l2 ]}
|
37
|
+
it 'should remove dupes from lines array' do
|
38
|
+
expect(Aggregator.new(lines).dedup!.lines.map(&:to_s)).to eql(result.map(&:to_s))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
context 'long array' do
|
42
|
+
let(:lines) { [ l4, l1, l2, l3, l4, l3, l4, l5 ]}
|
43
|
+
let(:result) { [ l1, l2, l5 ]}
|
44
|
+
it 'should remove dupes from lines array' do
|
45
|
+
expect(Aggregator.new(lines).dedup!.lines.map(&:to_s)).to eql(result.map(&:to_s))
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context '#deoverlap' do
|
51
|
+
let(:lines) { [ l1, l2, l3 ]}
|
52
|
+
|
53
|
+
let(:deoverlapped) { [ l4, l5, l3 ].sort }
|
54
|
+
it 'should remove lines that overlap' do
|
55
|
+
expect(aggregator.lines.size).to eql(3)
|
56
|
+
aggregator.deoverlap!
|
57
|
+
expect(aggregator.lines.size).to eql(3)
|
58
|
+
expect(aggregator.lines.map(&:to_s)).to eql(deoverlapped.map(&:to_s))
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
p
|
data/spec/box_spec.rb
CHANGED
@@ -20,9 +20,13 @@ module Laser
|
|
20
20
|
end
|
21
21
|
|
22
22
|
context '#notches' do
|
23
|
+
before do
|
24
|
+
box1.generate_notches
|
25
|
+
box2.generate_notches
|
26
|
+
end
|
23
27
|
it 'should generate notches' do
|
24
28
|
expect(box1.notches).to_not be_nil
|
25
|
-
expect(box1.notches.size).to eql(
|
29
|
+
expect(box1.notches.size).to eql(368)
|
26
30
|
end
|
27
31
|
|
28
32
|
it 'should properly calculate enclosure' do
|
data/spec/dimensions_spec.rb
CHANGED
data/spec/edge_spec.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
module Laser
|
4
|
+
module Cutter
|
5
|
+
|
6
|
+
describe "Notching::Edge" do
|
7
|
+
context 'left vertical side' do
|
8
|
+
let(:notch_width) { 2 }
|
9
|
+
let(:inside) { Geometry::Line.new(Geometry::Point[1, 1], Geometry::Point[1, 9])}
|
10
|
+
let(:outside) { Geometry::Line.new(Geometry::Point[0, 0], Geometry::Point[0, 10]) }
|
11
|
+
let(:edge) { Notching::Edge.new(inside, outside,
|
12
|
+
center_out: true,
|
13
|
+
fill_corners: true,
|
14
|
+
notch_width: notch_width,
|
15
|
+
kerf: 0.02,
|
16
|
+
thickness: 1) }
|
17
|
+
|
18
|
+
it 'should create a node correctly' do
|
19
|
+
expect(inside.length).to eql(8.0)
|
20
|
+
expect(outside.length).to eql(10.0)
|
21
|
+
expect(edge.center_out).to be_truthy
|
22
|
+
expect(edge.kerf).to be_within(0.0001).of(0.02)
|
23
|
+
expect(edge.thickness).to be_within(0.0001).of(1)
|
24
|
+
expect(edge.notch_width).to be_within(notch_width / 3.0).of(notch_width)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should calculate notch width correctly' do
|
28
|
+
expect(inside.length).to eql(8.0)
|
29
|
+
expect(outside.length).to eql(10.0)
|
30
|
+
expect(edge.center_out).to be_truthy
|
31
|
+
|
32
|
+
expect(edge.kerf).to be_within(0.0001).of(0.02)
|
33
|
+
expect(edge.thickness).to be_within(0.0001).of(1)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should correctly calculate v1 and v2' do
|
37
|
+
expect(edge.v1.to_a).to eql([1.0,1.0])
|
38
|
+
expect(edge.v2.to_a).to eql([1.0,-1.0])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/spec/line_spec.rb
CHANGED
@@ -6,7 +6,7 @@ module Laser
|
|
6
6
|
describe Line do
|
7
7
|
let(:p1) { Point.new(1, 1) }
|
8
8
|
let(:p2) { Point.new(7, 11) }
|
9
|
-
let(:center) { Point.new(
|
9
|
+
let(:center) { Point.new((7 + 1) / 2, (11 + 1) / 2) }
|
10
10
|
let(:line) { Line.new(p1, p2) }
|
11
11
|
|
12
12
|
context '#center' do
|
@@ -16,11 +16,11 @@ module Laser
|
|
16
16
|
end
|
17
17
|
|
18
18
|
context '#initialize' do
|
19
|
-
let(:line2) { Line.new(from: [1,1], to: [7,11])}
|
20
|
-
let(:line3) { Line.new(from: Point.new(1,1), to: Point.new(7,11))}
|
19
|
+
let(:line2) { Line.new(from: [1, 1], to: [7, 11]) }
|
20
|
+
let(:line3) { Line.new(from: Point.new(1, 1), to: Point.new(7, 11)) }
|
21
21
|
it 'should create' do
|
22
|
-
expect(line2.p1).to eql(Point.new(1,1))
|
23
|
-
expect(line2.p2).to eql(Point.new(7,11))
|
22
|
+
expect(line2.p1).to eql(Point.new(1, 1))
|
23
|
+
expect(line2.p2).to eql(Point.new(7, 11))
|
24
24
|
end
|
25
25
|
it 'should properly equal identical line' do
|
26
26
|
expect(line).to eql(line2)
|
@@ -41,38 +41,61 @@ module Laser
|
|
41
41
|
end
|
42
42
|
|
43
43
|
context 'ordering and equality' do
|
44
|
-
let(:l1) { Line.new(Point[0,0], Point[10,10]) }
|
45
|
-
let(:l2) { Line.new(Point[0,1], Point[10,10]) }
|
46
|
-
let(:l3) { Line.new(Point[0,0], Point[11,10]) }
|
47
|
-
let(:l4) { Line.new(Point[20,20], Point[1,1]) }
|
48
|
-
let(:l5) { Line.new(Point[11,10], Point[0,0]) }
|
44
|
+
let(:l1) { Line.new(Point[0, 0], Point[10, 10]) }
|
45
|
+
let(:l2) { Line.new(Point[0, 1], Point[10, 10]) }
|
46
|
+
let(:l3) { Line.new(Point[0, 0], Point[11, 10]) }
|
47
|
+
let(:l4) { Line.new(Point[20, 20], Point[1, 1]) }
|
48
|
+
let(:l5) { Line.new(Point[11, 10], Point[0, 0]) }
|
49
49
|
it 'should detect equality' do
|
50
50
|
expect(l1).to eql(Line.new(l1.p1, l1.p2))
|
51
|
-
expect(l1).to_not eql(Line.new(l1.p1, Point[2,4]))
|
51
|
+
expect(l1).to_not eql(Line.new(l1.p1, Point[2, 4]))
|
52
52
|
expect(l5).to eql(l3)
|
53
53
|
expect(l5.hash).to eql(l3.hash)
|
54
54
|
end
|
55
55
|
|
56
56
|
it 'should properly compare' do
|
57
|
-
list = [l4,l3,l1,l2]
|
57
|
+
list = [l4, l3, l1, l2]
|
58
58
|
list.sort!
|
59
|
-
expect(list).to eql([l1,l3,l2,l4])
|
59
|
+
expect(list).to eql([l1, l3, l2, l4])
|
60
60
|
end
|
61
61
|
|
62
62
|
it 'should properly uniq' do
|
63
63
|
list = [l4, l1, l4, l2, l3, l3, l2, l1]
|
64
64
|
list.sort!.uniq!
|
65
|
-
expect(list).to eql([l1,l3,l2,l4])
|
65
|
+
expect(list).to eql([l1, l3, l2, l4])
|
66
66
|
end
|
67
|
+
end
|
68
|
+
context 'overlaps and such' do
|
69
|
+
let(:l1) { Line.new(Point[0, 0], Point[10, 0]) }
|
70
|
+
let(:l2) { Line.new(Point[7, 0], Point[15, 0]) }
|
71
|
+
let(:l3) { Line.new(Point[20, 0], Point[25, 0]) }
|
72
|
+
let(:l4) { Line.new(Point[0, 1], Point[0, 3]) }
|
73
|
+
let(:l5) { Line.new(Point[0, -1], Point[0, 2]) }
|
74
|
+
|
67
75
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
76
|
+
context '#overlaps?' do
|
77
|
+
it 'should detect overlap' do
|
78
|
+
expect(l1.overlaps?(l2)).to be_truthy
|
79
|
+
expect(l1.overlaps?(l3)).to be_falsey
|
80
|
+
expect(l2.overlaps?(l3)).to be_falsey
|
81
|
+
expect(l1.overlaps?(l4)).to be_falsey
|
82
|
+
expect(l2.overlaps?(l4)).to be_falsey
|
83
|
+
expect(l4.overlaps?(l5)).to be_truthy
|
84
|
+
end
|
72
85
|
end
|
73
86
|
|
87
|
+
context '#xor' do
|
88
|
+
let(:xor) { [ Line.new(Point[0, 0], Point[7, 0]), Line.new(Point[10, 0], Point[15, 0])]}
|
89
|
+
it 'should subtract lines' do
|
90
|
+
expect(l1.xor(l2)).to eql(xor)
|
91
|
+
expect(l1.overlaps?(l3)).to be_falsey
|
92
|
+
expect(l2.overlaps?(l3)).to be_falsey
|
93
|
+
expect(l1.overlaps?(l4)).to be_falsey
|
94
|
+
expect(l2.overlaps?(l4)).to be_falsey
|
95
|
+
expect(l4.overlaps?(l5)).to be_truthy
|
96
|
+
end
|
97
|
+
end
|
74
98
|
end
|
75
|
-
|
76
99
|
end
|
77
100
|
end
|
78
101
|
end
|
data/spec/path_generator_spec.rb
CHANGED
@@ -2,19 +2,23 @@ require_relative 'spec_helper'
|
|
2
2
|
|
3
3
|
module Laser
|
4
4
|
module Cutter
|
5
|
-
module
|
5
|
+
module Notching
|
6
6
|
describe PathGenerator do
|
7
7
|
let(:notch) { 2 }
|
8
8
|
let(:thickness) { 1 }
|
9
9
|
let(:center_out) { true }
|
10
|
-
let(:
|
11
|
-
|
12
|
-
let(:
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
let(:corners) { true }
|
11
|
+
|
12
|
+
let(:options) { {notch_width: notch,
|
13
|
+
thickness: thickness,
|
14
|
+
center_out: center_out,
|
15
|
+
corners: corners} }
|
16
|
+
|
17
|
+
let(:outside) { Geometry::Line.new(from: [0, 0], to: [10, 0]) }
|
18
|
+
let(:inside) { Geometry::Line.new(from: [1, 1], to: [9, 1]) }
|
19
|
+
let(:edge) { Edge.new(outside, inside, options) }
|
20
|
+
let(:generator) { PathGenerator.new(edge) }
|
21
|
+
|
18
22
|
context 'edge' do
|
19
23
|
it 'should properly calculate notch size' do
|
20
24
|
expect(edge.notch_width).to be_within(0.001).of(1.6)
|
@@ -29,19 +33,20 @@ module Laser
|
|
29
33
|
end
|
30
34
|
|
31
35
|
context 'alternating iterator' do
|
32
|
-
let(:
|
36
|
+
let(:a) { "hello" }
|
37
|
+
let(:b) { "again" }
|
38
|
+
let(:iterator) { InfiniteIterator.new([a,b]) }
|
33
39
|
it 'returns things in alternating order' do
|
34
|
-
expect(iterator.next).to eq(
|
35
|
-
expect(iterator.next).to eq(
|
36
|
-
expect(iterator.next).to eq(
|
37
|
-
expect(iterator.next).to eq(:a)
|
40
|
+
expect(iterator.next).to eq(a)
|
41
|
+
expect(iterator.next).to eq(b)
|
42
|
+
expect(iterator.next).to eq(a)
|
38
43
|
end
|
39
44
|
end
|
40
45
|
|
41
46
|
context 'shift definition' do
|
42
47
|
|
43
48
|
it 'correctly defines shifts' do
|
44
|
-
shifts = generator.send(:define_shifts
|
49
|
+
shifts = generator.send(:define_shifts)
|
45
50
|
expect(edge.outside.length).to eql(10.0)
|
46
51
|
expect(edge.inside.length).to eql(8.0)
|
47
52
|
expect(edge.notch_width).to be_within(0.001).of(1.6)
|
@@ -53,41 +58,30 @@ module Laser
|
|
53
58
|
|
54
59
|
context 'path generation' do
|
55
60
|
# let(:outside) { Line.new(
|
56
|
-
# from: inside.p1.
|
57
|
-
# to: inside.p2.
|
61
|
+
# from: inside.p1.plus(-thickness, -thickness),
|
62
|
+
# to: inside.p2.plus(thickness, -thickness)) }
|
58
63
|
|
59
64
|
context 'center out' do
|
60
65
|
it 'generates correct path vertices' do
|
61
|
-
inside.freeze
|
62
66
|
expect(inside.p1).to_not eql(inside.p2)
|
63
|
-
|
64
|
-
expect(
|
65
|
-
expect(path.size).to be > 5
|
67
|
+
lines = generator.generate
|
68
|
+
expect(lines.size).to be > 5
|
66
69
|
|
67
|
-
expect(Line.new(
|
68
|
-
expect(Line.new(
|
70
|
+
expect(Geometry::Line.new(lines.first.p1, inside.p1).length).to be_within(0.001).of(0)
|
71
|
+
expect(Geometry::Line.new(lines.last.p2, inside.p2).length).to be_within(0.001).of(0)
|
69
72
|
|
70
73
|
# Sanity Check
|
71
|
-
expect(Point.new(1, 1)).to eql(inside.p1)
|
72
|
-
expect(Point.new(9, 1)).to eql(inside.p2)
|
74
|
+
expect(Geometry::Point.new(1, 1)).to eql(inside.p1)
|
75
|
+
expect(Geometry::Point.new(9, 1)).to eql(inside.p2)
|
73
76
|
end
|
74
77
|
|
75
78
|
it 'generates correct lines' do
|
76
|
-
|
77
|
-
lines
|
78
|
-
expect(path.size).to eq(12)
|
79
|
-
expect(lines.size).to be > 1
|
79
|
+
lines = generator.generate
|
80
|
+
expect(lines.size).to eq(19)
|
80
81
|
end
|
81
82
|
end
|
82
83
|
end
|
83
84
|
|
84
|
-
context 'remove dupes' do
|
85
|
-
let(:a) { [1,5,3,1,2,2,2,2 ] }
|
86
|
-
it 'should remove dups' do
|
87
|
-
expect(PathGenerator.deduplicate(a)).to eql([3,5])
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
85
|
end
|
92
86
|
end
|
93
87
|
end
|
data/spec/point_spec.rb
CHANGED
@@ -42,12 +42,12 @@ module Laser
|
|
42
42
|
|
43
43
|
context 'move by' do
|
44
44
|
it 'should move properly' do
|
45
|
-
p = p1.
|
45
|
+
p = p1.plus(10, -2)
|
46
46
|
expect(p.x).to be_within(0.001).of(11)
|
47
47
|
expect(p.y).to be_within(0.001).of(0)
|
48
48
|
end
|
49
49
|
it 'should move cloned version properly' do
|
50
|
-
p2 = p1.clone.
|
50
|
+
p2 = p1.clone.plus(10, -2)
|
51
51
|
expect(p2.x).to be_within(0.001).of(11)
|
52
52
|
expect(p2.y).to be_within(0.001).of(0)
|
53
53
|
end
|
data/spec/rect_spec.rb
CHANGED
@@ -28,7 +28,7 @@ module Laser
|
|
28
28
|
expect(rect1.sides.first.p1).to eql(p1)
|
29
29
|
expect(rect1.sides[0].p1.to_s).to eql("{1.00000,3.00000}")
|
30
30
|
expect(rect1.sides[1].p1.to_s).to eql("{11.00000,3.00000}")
|
31
|
-
expect(rect1.sides[2].p1).to eql(p1.
|
31
|
+
expect(rect1.sides[2].p1).to eql(p1.plus(10, 20))
|
32
32
|
end
|
33
33
|
it 'can be moved' do
|
34
34
|
expect(rect1.sides[0].p1.to_s).to eql("{1.00000,3.00000}")
|
data/spec/renderer_spec.rb
CHANGED
@@ -9,17 +9,26 @@ module Laser
|
|
9
9
|
let(:file) { File.expand_path("../../laser-cutter-pdf-test.#{$$}.pdf", __FILE__) }
|
10
10
|
|
11
11
|
def render_file filename
|
12
|
+
real_file = ENV['RSPEC_SAVE_PDF'] ? true : false
|
12
13
|
config.validate!
|
13
|
-
expect(!File.exists?(filename))
|
14
|
+
expect(!File.exists?(filename)) if real_file
|
14
15
|
renderer.render
|
15
|
-
expect(File.exist?(filename))
|
16
|
-
expect(File.size(filename) > 0)
|
16
|
+
expect(File.exist?(filename)) if real_file
|
17
|
+
expect(File.size(filename) > 0) if real_file
|
17
18
|
rescue Exception => e
|
18
19
|
STDERR.puts e.backtrace.join("\n")
|
19
20
|
fail e.message
|
20
21
|
ensure
|
21
|
-
|
22
|
-
|
22
|
+
if real_file
|
23
|
+
File.delete(filename) rescue nil
|
24
|
+
expect(!File.exists?(filename))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
before do
|
29
|
+
unless ENV['RSPEC_SAVE_PDF']
|
30
|
+
expect_any_instance_of(Prawn::Document).to receive(:render_file).once
|
31
|
+
end
|
23
32
|
end
|
24
33
|
|
25
34
|
context 'metric' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: laser-cutter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Konstantin Gredeskoul
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: prawn
|
@@ -146,18 +146,22 @@ files:
|
|
146
146
|
- doc/comparison.jpg
|
147
147
|
- laser-cutter.gemspec
|
148
148
|
- lib/laser-cutter.rb
|
149
|
+
- lib/laser-cutter/aggregator.rb
|
149
150
|
- lib/laser-cutter/box.rb
|
151
|
+
- lib/laser-cutter/cli/opt_parser.rb
|
152
|
+
- lib/laser-cutter/cli/serializer.rb
|
150
153
|
- lib/laser-cutter/configuration.rb
|
151
154
|
- lib/laser-cutter/geometry.rb
|
152
155
|
- lib/laser-cutter/geometry/dimensions.rb
|
153
|
-
- lib/laser-cutter/geometry/edge.rb
|
154
|
-
- lib/laser-cutter/geometry/notched_path.rb
|
155
|
-
- lib/laser-cutter/geometry/path_generator.rb
|
156
156
|
- lib/laser-cutter/geometry/point.rb
|
157
157
|
- lib/laser-cutter/geometry/shape.rb
|
158
158
|
- lib/laser-cutter/geometry/shape/line.rb
|
159
159
|
- lib/laser-cutter/geometry/shape/rect.rb
|
160
160
|
- lib/laser-cutter/geometry/tuple.rb
|
161
|
+
- lib/laser-cutter/notching.rb
|
162
|
+
- lib/laser-cutter/notching/base.rb
|
163
|
+
- lib/laser-cutter/notching/edge.rb
|
164
|
+
- lib/laser-cutter/notching/path_generator.rb
|
161
165
|
- lib/laser-cutter/page_manager.rb
|
162
166
|
- lib/laser-cutter/renderer.rb
|
163
167
|
- lib/laser-cutter/renderer/base.rb
|
@@ -167,9 +171,11 @@ files:
|
|
167
171
|
- lib/laser-cutter/renderer/meta_renderer.rb
|
168
172
|
- lib/laser-cutter/renderer/rect_renderer.rb
|
169
173
|
- lib/laser-cutter/version.rb
|
174
|
+
- spec/aggregator_spec.rb
|
170
175
|
- spec/box_spec.rb
|
171
176
|
- spec/configuration_spec.rb
|
172
177
|
- spec/dimensions_spec.rb
|
178
|
+
- spec/edge_spec.rb
|
173
179
|
- spec/line_spec.rb
|
174
180
|
- spec/page_manager_spec.rb
|
175
181
|
- spec/path_generator_spec.rb
|
@@ -203,9 +209,11 @@ specification_version: 4
|
|
203
209
|
summary: Creates notched box outlines for laser-cut boxes which are geometrically
|
204
210
|
symmetric and pleasing to the eye.
|
205
211
|
test_files:
|
212
|
+
- spec/aggregator_spec.rb
|
206
213
|
- spec/box_spec.rb
|
207
214
|
- spec/configuration_spec.rb
|
208
215
|
- spec/dimensions_spec.rb
|
216
|
+
- spec/edge_spec.rb
|
209
217
|
- spec/line_spec.rb
|
210
218
|
- spec/page_manager_spec.rb
|
211
219
|
- spec/path_generator_spec.rb
|