scad-btw 0.1.0.pre1

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 (46) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +17 -0
  4. data/.ruby-version +1 -0
  5. data/CODE_OF_CONDUCT.md +84 -0
  6. data/Gemfile +13 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +31 -0
  9. data/Rakefile +12 -0
  10. data/exe/scad-btw +6 -0
  11. data/flake.lock +306 -0
  12. data/flake.nix +63 -0
  13. data/lib/extensions/jenncad.rb +91 -0
  14. data/lib/extensions/kernel.rb +17 -0
  15. data/lib/extensions/thor.rb +11 -0
  16. data/lib/scad/btw/base.rb +224 -0
  17. data/lib/scad/btw/cli/base.rb +31 -0
  18. data/lib/scad/btw/cli/concerns/export_formats.rb +43 -0
  19. data/lib/scad/btw/cli/concerns/export_options.rb +62 -0
  20. data/lib/scad/btw/cli/presets.rb +66 -0
  21. data/lib/scad/btw/cli/solid.rb +33 -0
  22. data/lib/scad/btw/cli/spoked.rb +33 -0
  23. data/lib/scad/btw/component/axle_hole.rb +53 -0
  24. data/lib/scad/btw/component/center.rb +58 -0
  25. data/lib/scad/btw/component/counterweight.rb +117 -0
  26. data/lib/scad/btw/component/flange.rb +96 -0
  27. data/lib/scad/btw/component/joint.rb +57 -0
  28. data/lib/scad/btw/component/joint_base.rb +34 -0
  29. data/lib/scad/btw/component/o_ring_groove.rb +95 -0
  30. data/lib/scad/btw/component/solid.rb +67 -0
  31. data/lib/scad/btw/component/spokes.rb +118 -0
  32. data/lib/scad/btw/component/tread.rb +109 -0
  33. data/lib/scad/btw/concerns/component_args.rb +26 -0
  34. data/lib/scad/btw/concerns/flange_heights.rb +24 -0
  35. data/lib/scad/btw/concerns/joint_args.rb +58 -0
  36. data/lib/scad/btw/concerns/part_commons.rb +29 -0
  37. data/lib/scad/btw/concerns/tread_width.rb +21 -0
  38. data/lib/scad/btw/converters/openscad_2_ascii_stl.rb +39 -0
  39. data/lib/scad/btw/presets/scale_1_38/cargo_wheel_thin_36_inch.rb +21 -0
  40. data/lib/scad/btw/presets/scale_1_38/v20.rb +83 -0
  41. data/lib/scad/btw/solid.rb +13 -0
  42. data/lib/scad/btw/spoked.rb +13 -0
  43. data/lib/scad/btw/version.rb +7 -0
  44. data/lib/scad/btw.rb +29 -0
  45. data/sig/scad/btw.rbs +6 -0
  46. metadata +150 -0
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'scad/btw/concerns/component_args'
4
+ require 'scad/btw/concerns/part_commons'
5
+ require 'scad/btw/concerns/tread_width'
6
+
7
+ module Scad
8
+ module Btw
9
+ module Component
10
+ class Counterweight < JennCad::Part
11
+ include Scad::Btw::Concerns::PartCommons
12
+ include Scad::Btw::Concerns::ComponentArgs
13
+ include Scad::Btw::Concerns::TreadWidth
14
+
15
+ TYPE = :addition
16
+ DEFAULT_DEVIATION = 0
17
+
18
+ ARGS = {
19
+ prefix: :counterweight,
20
+ args: {
21
+ height: {
22
+ description: 'Counterweight height. Defaults to: Height of ' \
23
+ 'spokes or web defined be `wheel_inner_height` ' \
24
+ 'option.',
25
+ type: :numeric
26
+ },
27
+ diameter: {
28
+ description: 'Wheel diameter. Defaults to: Wheel diameter ' \
29
+ 'defined by `wheel_size` option.',
30
+ type: :numeric,
31
+ hide: true
32
+ },
33
+ tread_width: {
34
+ description: "Tread width. Minimum width of #{MIN_TREAD_WIDTH} " \
35
+ 'will be used if provided/default value is ' \
36
+ 'smaller. Defaults to: Diameter * 0.06',
37
+ type: :numeric,
38
+ hide: true
39
+ },
40
+ deviation: {
41
+ description: 'Defines convexity of the counterweight top.',
42
+ default: DEFAULT_DEVIATION,
43
+ type: :numeric
44
+ },
45
+ width: {
46
+ description: 'Distance from tread to counterweight top. ' \
47
+ 'Defaults to: Diameter / 4',
48
+ type: :numeric
49
+ }
50
+ }
51
+ }.freeze
52
+
53
+ def initialize(args = {})
54
+ super
55
+
56
+ @height = args.fetch(:height)
57
+ @diameter = args.fetch(:diameter)
58
+ @tread_width = args[:tread_width]
59
+ @deviation = args[:deviation] || DEFAULT_DEVIATION
60
+ @width = args[:width]
61
+ end
62
+
63
+ def part
64
+ cylinder(d: calculated_diameter, h: height) - substraction
65
+ end
66
+
67
+ private
68
+
69
+ attr_reader :width, :height, :deviation, :diameter, :tread_width
70
+
71
+ # components
72
+
73
+ def substraction
74
+ deviation.positive? ? deviation_substraction : straight_substraction
75
+ end
76
+
77
+ def deviation_substraction
78
+ x = calculated_width - deviation + deviation_diff_radius -
79
+ (calculated_diameter / 2)
80
+ cylinder(r: deviation_diff_radius, h: height + 1)
81
+ .move(x: x, y: 0, z: -0.5)
82
+ end
83
+
84
+ def straight_substraction
85
+ cube(x: calculated_diameter, y: calculated_diameter, z: height + 1,
86
+ center: true)
87
+ .move(x: calculated_width, y: 0, z: -0.5)
88
+ end
89
+
90
+ # functions
91
+
92
+ def calculated_width
93
+ width || (calculated_diameter / 4)
94
+ end
95
+
96
+ def calculated_diameter
97
+ calc_width = calculated_tread_width(width: tread_width,
98
+ diameter: diameter)
99
+
100
+ diameter - calc_width + (2 * overlap)
101
+ end
102
+
103
+ def half_upper_counterweight_length
104
+ Math.sqrt(
105
+ ((calculated_diameter / 2)**2) -
106
+ (((calculated_diameter / 2) - calculated_width)**2)
107
+ )
108
+ end
109
+
110
+ def deviation_diff_radius
111
+ ((half_upper_counterweight_length**2) + (deviation**2)) /
112
+ (2 * deviation)
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'scad/btw/concerns/component_args'
4
+ require 'scad/btw/concerns/flange_heights'
5
+ require 'scad/btw/concerns/part_commons'
6
+
7
+ module Scad
8
+ module Btw
9
+ module Component
10
+ class Flange < JennCad::Part
11
+ include Scad::Btw::Concerns::PartCommons
12
+ include Scad::Btw::Concerns::ComponentArgs
13
+ include Scad::Btw::Concerns::FlangeHeights
14
+
15
+ TYPE = :addition
16
+ WIDTH = 2
17
+ BOTTOM_Z_OFFSET = 1
18
+
19
+ ARGS = {
20
+ prefix: :flange,
21
+ args: {
22
+ diameter: {
23
+ description: 'Wheel diameter. Defaults to: Wheel diameter ' \
24
+ 'defined by `wheel_size` option.',
25
+ type: :numeric,
26
+ hide: true
27
+ },
28
+ inner_height: {
29
+ description: 'Flange height on tread.',
30
+ default: FLANGE_INNER_HEIGHT,
31
+ type: :numeric
32
+ },
33
+ outer_height: {
34
+ description: 'Flange height on edge.',
35
+ default: FLANGE_OUTER_HEIGHT,
36
+ type: :numeric
37
+ },
38
+ width: {
39
+ description: 'Flange width.',
40
+ default: WIDTH,
41
+ type: :numeric
42
+ }
43
+ }
44
+ }.freeze
45
+
46
+ def initialize(args = {})
47
+ super
48
+
49
+ @diameter = args.fetch(:diameter)
50
+ @width = args[:width] || WIDTH
51
+ @inner_height = args[:inner_height]
52
+ @outer_height = args[:outer_height]
53
+ end
54
+
55
+ def part
56
+ lower_part + upper_part - inner_space
57
+ end
58
+
59
+ private
60
+
61
+ attr_reader :diameter, :width, :inner_height, :outer_height
62
+
63
+ # components
64
+
65
+ def lower_part
66
+ cylinder(d1: outer_diameter + 0.5, d2: outer_diameter,
67
+ h: calc_outer_height).mz(BOTTOM_Z_OFFSET)
68
+ end
69
+
70
+ def upper_part
71
+ cylinder(d1: outer_diameter - 1, d2: diameter - overlap,
72
+ h: calc_inner_height - calc_outer_height - BOTTOM_Z_OFFSET)
73
+ .mz(calc_outer_height + BOTTOM_Z_OFFSET - overlap)
74
+ end
75
+
76
+ def inner_space
77
+ cylinder(d: diameter - (2 * overlap), h: calc_inner_height + 2).mz(-1)
78
+ end
79
+
80
+ # functions
81
+
82
+ def calc_inner_height
83
+ calculated_inner_flange_height(inner_height)
84
+ end
85
+
86
+ def calc_outer_height
87
+ calculated_outer_flange_height(outer_height)
88
+ end
89
+
90
+ def outer_diameter
91
+ diameter + (2 * width)
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'scad/btw/concerns/component_args'
4
+ require 'scad/btw/concerns/part_commons'
5
+ require 'scad/btw/concerns/joint_args'
6
+
7
+ module Scad
8
+ module Btw
9
+ module Component
10
+ class Joint < JennCad::Part
11
+ include Scad::Btw::Concerns::PartCommons
12
+ include Scad::Btw::Concerns::ComponentArgs
13
+ include Scad::Btw::Concerns::JointArgs
14
+
15
+ TYPE = :substraction
16
+ HOLE_BEVEL_DIAMETER = 6.2
17
+ HOLE_BEVEL_HEIGHT = 0.9
18
+
19
+ def part
20
+ (hole + lower_bevel + upper_bevel).mx(calculated_dist_from_center)
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :height, :dist_from_center
26
+
27
+ # components
28
+
29
+ def hole
30
+ cylinder(d: HOLE_DIAMETER, h: height + 1).mz(-0.5)
31
+ end
32
+
33
+ def lower_bevel
34
+ bevel.mz(lower_bevel_z_offset)
35
+ end
36
+
37
+ def upper_bevel
38
+ bevel.mz(upper_bevel_z_offset)
39
+ end
40
+
41
+ def bevel
42
+ cylinder(d: HOLE_BEVEL_DIAMETER, h: HOLE_BEVEL_HEIGHT + 0.1)
43
+ end
44
+
45
+ # functions
46
+
47
+ def lower_bevel_z_offset
48
+ -0.1
49
+ end
50
+
51
+ def upper_bevel_z_offset
52
+ height - HOLE_BEVEL_HEIGHT
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'scad/btw/concerns/component_args'
4
+ require 'scad/btw/concerns/part_commons'
5
+ require 'scad/btw/concerns/joint_args'
6
+
7
+ module Scad
8
+ module Btw
9
+ module Component
10
+ class JointBase < JennCad::Part
11
+ include Scad::Btw::Concerns::PartCommons
12
+ include Scad::Btw::Concerns::ComponentArgs
13
+ include Scad::Btw::Concerns::JointArgs
14
+
15
+ TYPE = :addition
16
+
17
+ def part
18
+ cylinder(d: calculated_diameter, h: height)
19
+ .mx(calculated_dist_from_center)
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :height, :dist_from_center, :diameter
25
+
26
+ def calculated_diameter
27
+ min_diameter = HOLE_DIAMETER + (2 * MIN_HOLE_WALL_THICKNESS)
28
+
29
+ [diameter || min_diameter, min_diameter].max
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'scad/btw/concerns/component_args'
4
+ require 'scad/btw/concerns/flange_heights'
5
+ require 'scad/btw/concerns/part_commons'
6
+ require_relative 'flange'
7
+
8
+ module Scad
9
+ module Btw
10
+ module Component
11
+ class ORingGroove < JennCad::Part
12
+ include Scad::Btw::Concerns::PartCommons
13
+ include Scad::Btw::Concerns::ComponentArgs
14
+ include Scad::Btw::Concerns::FlangeHeights
15
+
16
+ TYPE = :substraction
17
+ GROOVE_DIAMETER = 1.5
18
+ THIN_GROOVE_DIAMETER = 1
19
+ THIN_GROOVE = false
20
+
21
+ ARGS = {
22
+ prefix: :o_ring_groove,
23
+ args: {
24
+ diameter: {
25
+ description: 'Wheel diameter. Defaults to: Wheel diameter ' \
26
+ 'defined by `wheel_size` option.',
27
+ type: :numeric,
28
+ hide: true
29
+ },
30
+ flange_height: {
31
+ description: 'Flange height on tread.',
32
+ default: FLANGE_INNER_HEIGHT,
33
+ type: :numeric,
34
+ hide: true
35
+ },
36
+ thin: {
37
+ description: 'Whether groove is thin (1 mm) or not (1.5 mm). ' \
38
+ 'Defaults to: true if wheel is thin, false ' \
39
+ 'otherwise.',
40
+ type: :boolean
41
+ }
42
+ }
43
+ }.freeze
44
+
45
+ def initialize(args = {})
46
+ super
47
+
48
+ @diameter = args.fetch(:diameter)
49
+ @flange_height = args[:flange_height]
50
+ @thin = args[:thin] || THIN_GROOVE
51
+ end
52
+
53
+ def part
54
+ res = cross_section.rotate_extrude
55
+
56
+ res.mz(z_offset)
57
+ end
58
+
59
+ private
60
+
61
+ attr_reader :diameter, :flange_height, :thin
62
+
63
+ # components
64
+
65
+ def cross_section
66
+ (cs_circle + cs_square).mx((diameter - (groove_diameter * 4 / 5)) / 2)
67
+ end
68
+
69
+ def cs_circle
70
+ circle(d: groove_diameter)
71
+ end
72
+
73
+ def cs_square
74
+ square(x: groove_diameter, y: groove_diameter, center: true)
75
+ .mx(groove_diameter / 2)
76
+ end
77
+
78
+ # functions
79
+
80
+ def groove_diameter
81
+ (thin ? GROOVE_DIAMETER : THIN_GROOVE_DIAMETER) * 4 / 5
82
+ end
83
+
84
+ def z_offset
85
+ (calc_flange_height + (groove_diameter / 2)) -
86
+ 0.1 + (thin ? 0.15 : 1)
87
+ end
88
+
89
+ def calc_flange_height
90
+ calculated_inner_flange_height(flange_height)
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'scad/btw/concerns/component_args'
4
+ require 'scad/btw/concerns/part_commons'
5
+ require 'scad/btw/concerns/tread_width'
6
+
7
+ module Scad
8
+ module Btw
9
+ module Component
10
+ class Solid < JennCad::Part
11
+ include Scad::Btw::Concerns::PartCommons
12
+ include Scad::Btw::Concerns::ComponentArgs
13
+ include Scad::Btw::Concerns::TreadWidth
14
+
15
+ TYPE = :addition
16
+
17
+ ARGS = {
18
+ prefix: :solid,
19
+ args: {
20
+ height: {
21
+ description: 'Web height. Defaults to: Value/default of ' \
22
+ '`wheel_inner_height` option.',
23
+ type: :numeric,
24
+ hide: true
25
+ },
26
+ diameter: {
27
+ description: 'Wheel diameter. Defaults to: Wheel diameter ' \
28
+ 'defined by `wheel_size` option.',
29
+ type: :numeric,
30
+ hide: true
31
+ },
32
+ tread_width: {
33
+ description: "Tread width. Minimum width of #{MIN_TREAD_WIDTH} " \
34
+ 'will be used if provided/default value is ' \
35
+ 'smaller. Defaults to: Diameter * 0.06',
36
+ type: :numeric,
37
+ hide: true
38
+ }
39
+ }
40
+ }.freeze
41
+
42
+ def initialize(args = {})
43
+ super
44
+
45
+ @height = args.fetch(:height)
46
+ @diameter = args.fetch(:diameter)
47
+ @tread_width = args[:tread_width]
48
+ end
49
+
50
+ def part
51
+ cylinder(d: calculated_diameter, h: height)
52
+ end
53
+
54
+ private
55
+
56
+ attr_reader :height, :diameter, :tread_width
57
+
58
+ def calculated_diameter
59
+ calc_width = calculated_tread_width(width: tread_width,
60
+ diameter: diameter)
61
+
62
+ diameter - calc_width + (2 * overlap)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'scad/btw/concerns/component_args'
4
+ require 'scad/btw/concerns/part_commons'
5
+ require 'scad/btw/concerns/tread_width'
6
+
7
+ module Scad
8
+ module Btw
9
+ module Component
10
+ class Spokes < JennCad::Part
11
+ include Scad::Btw::Concerns::PartCommons
12
+ include Scad::Btw::Concerns::ComponentArgs
13
+ include Scad::Btw::Concerns::TreadWidth
14
+
15
+ TYPE = :addition
16
+ ROTATE_180_DEGREE = false
17
+ WIDTH = 1
18
+
19
+ ARGS = {
20
+ prefix: :spokes,
21
+ args: {
22
+ count: {
23
+ description: 'Spokes count.',
24
+ required: true,
25
+ type: :numeric
26
+ },
27
+ width: {
28
+ description: 'Spokes width.',
29
+ default: WIDTH,
30
+ type: :numeric
31
+ },
32
+ height: {
33
+ description: 'Spokes height. Defaults to: Value/default of ' \
34
+ '`wheel_inner_height` option.',
35
+ type: :numeric,
36
+ hide: true
37
+ },
38
+ diameter: {
39
+ description: 'Wheel diameter. Defaults to: Wheel diameter ' \
40
+ 'defined by `wheel_size` option.',
41
+ type: :numeric,
42
+ hide: true
43
+ },
44
+ tread_width: {
45
+ description: "Tread width. Minimum width of #{MIN_TREAD_WIDTH} " \
46
+ 'will be used if provided/default value is ' \
47
+ 'smaller. Defaults to: Diameter * 0.06',
48
+ type: :numeric,
49
+ hide: true
50
+ },
51
+ rotate_180_degree: {
52
+ description: 'Whether to start at 180 degree instead of 0 ' \
53
+ 'degree when having an odd spokes count.',
54
+ default: ROTATE_180_DEGREE,
55
+ type: :boolean
56
+ }
57
+ }
58
+ }.freeze
59
+
60
+ def initialize(args = {})
61
+ super
62
+
63
+ @count = args.fetch(:count)
64
+ @width = args[:width] || WIDTH
65
+ @height = args.fetch(:height)
66
+ @diameter = args.fetch(:diameter)
67
+ @tread_width = args[:tread_width]
68
+ @rotate_180_degree = args[:rotate_180_degree] || ROTATE_180_DEGREE
69
+ end
70
+
71
+ def part
72
+ res = nil
73
+ start.step(by: step, to: stop) do |degree|
74
+ step_spoke = spoke.rz(degree)
75
+ if degree == start
76
+ res = step_spoke
77
+ else
78
+ res += step_spoke
79
+ end
80
+ end
81
+ res
82
+ end
83
+
84
+ private
85
+
86
+ attr_reader :count, :width, :height, :diameter, :tread_width,
87
+ :rotate_180_degree
88
+
89
+ # components
90
+
91
+ def spoke
92
+ cube(x: length, y: width, z: height).mx(length / 2)
93
+ end
94
+
95
+ # functions
96
+
97
+ def length
98
+ calc_width = calculated_tread_width(width: tread_width,
99
+ diameter: diameter)
100
+
101
+ (diameter - calc_width + (2 * overlap)) / 2
102
+ end
103
+
104
+ def start
105
+ rotate_180_degree ? 180 : 0
106
+ end
107
+
108
+ def stop
109
+ (rotate_180_degree ? 540 : 360) - step
110
+ end
111
+
112
+ def step
113
+ 360.to_f / count
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'scad/btw/concerns/component_args'
4
+ require 'scad/btw/concerns/flange_heights'
5
+ require 'scad/btw/concerns/part_commons'
6
+ require 'scad/btw/concerns/tread_width'
7
+ require_relative 'flange'
8
+
9
+ module Scad
10
+ module Btw
11
+ module Component
12
+ class Tread < JennCad::Part
13
+ include Scad::Btw::Concerns::PartCommons
14
+ include Scad::Btw::Concerns::ComponentArgs
15
+ include Scad::Btw::Concerns::TreadWidth
16
+ include Scad::Btw::Concerns::FlangeHeights
17
+
18
+ TYPE = :addition
19
+ UPPER_LOWER_DIAMETER_DIFF = 0.2
20
+
21
+ ARGS = {
22
+ prefix: :tread,
23
+ args: {
24
+ diameter: {
25
+ description: 'Wheel diameter. Defaults to: Wheel diameter ' \
26
+ 'defined by `wheel_size` option.',
27
+ type: :numeric,
28
+ hide: true
29
+ },
30
+ height: {
31
+ description: 'Tread height. Defaults to: Wheel height defined ' \
32
+ 'by wheel thickness (`wheel_is_thin` flag).',
33
+ type: :numeric,
34
+ hide: true
35
+ },
36
+ width: {
37
+ description: "Tread width. Minimum width of #{MIN_TREAD_WIDTH} " \
38
+ 'will be used if provided/default value is ' \
39
+ 'smaller. Defaults to: Diameter * 0.06',
40
+ type: :numeric,
41
+ hide: true
42
+ },
43
+ flange_height: {
44
+ description: 'Flange height on tread.',
45
+ default: FLANGE_INNER_HEIGHT,
46
+ type: :numeric,
47
+ hide: true
48
+ }
49
+ }
50
+ }.freeze
51
+
52
+ def initialize(args = {})
53
+ super
54
+
55
+ @diameter = args.fetch(:diameter)
56
+ @height = args.fetch(:height)
57
+ @width = args[:width]
58
+ @flange_height = args[:flange_height]
59
+ @upper_lower_diameter_diff = args[:upper_lower_diameter_diff] ||
60
+ UPPER_LOWER_DIAMETER_DIFF
61
+ end
62
+
63
+ def part
64
+ upper_part + lower_part - inner_space
65
+ end
66
+
67
+ private
68
+
69
+ attr_reader :diameter, :height, :width, :flange_height,
70
+ :upper_lower_diameter_diff
71
+
72
+ # components
73
+
74
+ def upper_part
75
+ cylinder(d: diameter, h: calc_flange_height)
76
+ end
77
+
78
+ def lower_part
79
+ cylinder(d1: diameter, d2: upper_diameter, h: tread_height)
80
+ .mz(calc_flange_height - overlap)
81
+ end
82
+
83
+ def inner_space
84
+ cylinder(d: inner_diameter - (2 * overlap), h: height + 2).mz(-1)
85
+ end
86
+
87
+ # functions
88
+
89
+ def upper_diameter
90
+ diameter - upper_lower_diameter_diff
91
+ end
92
+
93
+ def tread_height
94
+ height - calc_flange_height + overlap
95
+ end
96
+
97
+ def inner_diameter
98
+ calc_width = calculated_tread_width(width: width, diameter: diameter)
99
+
100
+ diameter - upper_lower_diameter_diff - (2 * calc_width)
101
+ end
102
+
103
+ def calc_flange_height
104
+ calculated_inner_flange_height(flange_height)
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end