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,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scad
4
+ module Btw
5
+ module Concerns
6
+ module ComponentArgs
7
+ extend ActiveSupport::Concern
8
+
9
+ class_methods do
10
+ def component_args(args)
11
+ args.select do |key, _|
12
+ component_args_key_map.keys.include?(key)
13
+ end.transform_keys(component_args_key_map)
14
+ end
15
+
16
+ def component_args_key_map
17
+ self::ARGS[:args].keys
18
+ .to_h do |k|
19
+ ["#{self::ARGS[:prefix]}_#{k}".to_sym, k.to_sym]
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scad
4
+ module Btw
5
+ module Concerns
6
+ module FlangeHeights
7
+ extend ActiveSupport::Concern
8
+
9
+ FLANGE_INNER_HEIGHT = 2.5
10
+ FLANGE_OUTER_HEIGHT = 1
11
+
12
+ private
13
+
14
+ def calculated_inner_flange_height(height)
15
+ height || FLANGE_INNER_HEIGHT
16
+ end
17
+
18
+ def calculated_outer_flange_height(height)
19
+ height || FLANGE_OUTER_HEIGHT
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scad
4
+ module Btw
5
+ module Concerns
6
+ module JointArgs
7
+ extend ActiveSupport::Concern
8
+
9
+ MIN_HOLE_WALL_THICKNESS = 1
10
+ HOLE_DIAMETER = 4.8
11
+ DIST_FROM_CENTER = 8
12
+ MIN_DIST_FROM_CENTER = 6.8
13
+
14
+ ARGS = {
15
+ prefix: :joint,
16
+ args: {
17
+ diameter: {
18
+ description: 'Joint base diameter. Minimum diameter of ' \
19
+ "#{HOLE_DIAMETER + (2 * MIN_HOLE_WALL_THICKNESS)} " \
20
+ 'will be used if provided/default value is smaller.',
21
+ default: HOLE_DIAMETER + (2 * MIN_HOLE_WALL_THICKNESS),
22
+ type: :numeric
23
+ },
24
+ height: {
25
+ description: 'Joint height. Defaults to: Wheel height defined ' \
26
+ 'by wheel thickness (`wheel_is_thin` flag).',
27
+ type: :numeric,
28
+ hide: true
29
+ },
30
+ dist_from_center: {
31
+ description: 'Distance from center of joint to center of ' \
32
+ "wheel. Minimum of #{MIN_DIST_FROM_CENTER} will be" \
33
+ 'used if provided value is smaller.',
34
+ default: DIST_FROM_CENTER,
35
+ type: :numeric
36
+ }
37
+ }
38
+ }.freeze
39
+
40
+ def initialize(args = {})
41
+ super
42
+
43
+ @height = args.fetch(:height)
44
+ @dist_from_center = args[:dist_from_center]
45
+ @diameter = args[:diameter]
46
+ end
47
+
48
+ private
49
+
50
+ def calculated_dist_from_center
51
+ ret = dist_from_center || DIST_FROM_CENTER
52
+
53
+ [ret, MIN_DIST_FROM_CENTER].max
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scad
4
+ module Btw
5
+ module Concerns
6
+ module PartCommons
7
+ extend ActiveSupport::Concern
8
+
9
+ OVERLAP = 0.01
10
+
11
+ class_methods do
12
+ def to_openscad(args = {})
13
+ new(args).to_openscad
14
+ end
15
+ end
16
+
17
+ def initialize(args = {})
18
+ super
19
+
20
+ @overlap = args.fetch(:overlap, OVERLAP)
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :overlap
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scad
4
+ module Btw
5
+ module Concerns
6
+ module TreadWidth
7
+ extend ActiveSupport::Concern
8
+
9
+ OUTER_INNER_DIAMETER_RATIO = 1.12
10
+ MIN_TREAD_WIDTH = 1
11
+
12
+ def calculated_tread_width(width:, diameter:)
13
+ calculated_width = width ||
14
+ ((diameter * (OUTER_INNER_DIAMETER_RATIO - 1)) / 2)
15
+
16
+ [calculated_width, MIN_TREAD_WIDTH].max.round(2)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ptools'
4
+
5
+ module Scad
6
+ module Btw
7
+ module Converters
8
+ class Openscad2AsciiStl
9
+ OPENSCAD_EXECUTABLES = %w[
10
+ openscad
11
+ OpenSCAD
12
+ ].freeze
13
+
14
+ def self.convert(in_path:, out_path:)
15
+ new(in_path: in_path, out_path: out_path).convert
16
+ end
17
+
18
+ def convert
19
+ return if system(openscad, '--export-format', 'asciistl', '-o', out_path, in_path)
20
+
21
+ raise 'OpenSCAD error: Conversion failed!'
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :in_path, :out_path
27
+
28
+ def initialize(in_path:, out_path:)
29
+ @in_path = in_path
30
+ @out_path = out_path
31
+ end
32
+
33
+ def openscad
34
+ @openscad ||= OPENSCAD_EXECUTABLES.map { |exe| File.which(exe) }.find { |exe| !exe.nil? }
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'scad/btw/solid'
4
+
5
+ module Scad
6
+ module Btw
7
+ module Presets
8
+ module Scale138
9
+ class CargoWheelThin36Inch < Scad::Btw::Solid
10
+ SIZE = 7
11
+
12
+ def initialize(args = {})
13
+ super
14
+
15
+ @args = args.merge(wheel_size: SIZE, wheel_is_thin: true)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'scad/btw/solid'
4
+ require 'scad/btw/concerns/tread_width'
5
+
6
+ module Scad
7
+ module Btw
8
+ module Presets
9
+ module Scale138
10
+ class V20 < Scad::Btw::Spoked
11
+ include Scad::Btw::Concerns::TreadWidth
12
+
13
+ UPPER_LOWER_TREAD_DIAMETER_DIFF =
14
+ Scad::Btw::Component::Tread::UPPER_LOWER_DIAMETER_DIFF
15
+ TREAD_GROOVE_DEPTH = 0.15
16
+ V20_ARGS = {
17
+ counterweight_deviation: 1.5,
18
+ counterweight_height: DEFAULTS[:THIN_HEIGHT],
19
+ counterweigth_width: 5,
20
+ joint_dist_from_center: 6.8,
21
+ spokes_count: 11,
22
+ spokes_rotate_180_degree: true,
23
+ wheel_is_thin: true,
24
+ wheel_size: 7,
25
+ wheel_with_counterweight: true,
26
+ wheel_with_joint: true
27
+ }.freeze
28
+
29
+ def initialize(args = {})
30
+ super
31
+
32
+ @args = args.merge(V20_ARGS)
33
+ end
34
+
35
+ private
36
+
37
+ def parts_substractions
38
+ super + decorations
39
+ end
40
+
41
+ # components
42
+
43
+ def decorations
44
+ tread_groove + cw_holes
45
+ end
46
+
47
+ def tread_groove
48
+ (cylinder(d: outer_tread_groove_diameter, h: 2) -
49
+ cylinder(d: innner_tread_groove_diameter, h: 2))
50
+ .mz(height - TREAD_GROOVE_DEPTH)
51
+ end
52
+
53
+ def cw_holes
54
+ res = cw_hole.mx(-9)
55
+ res += cw_hole.move(x: -8.8, y: 2, z: 0)
56
+ res += cw_hole.move(x: -8.8, y: -2, z: 0)
57
+ res
58
+ end
59
+
60
+ def cw_hole
61
+ cylinder(d: 1, h: height + 1).mz(-0.5)
62
+ end
63
+
64
+ # functions
65
+
66
+ def outer_tread_groove_diameter
67
+ size_2_diameter - UPPER_LOWER_TREAD_DIAMETER_DIFF -
68
+ calc_tread_width
69
+ end
70
+
71
+ def innner_tread_groove_diameter
72
+ size_2_diameter - UPPER_LOWER_TREAD_DIAMETER_DIFF -
73
+ (calc_tread_width * 2) - 0.03
74
+ end
75
+
76
+ def calc_tread_width
77
+ calculated_tread_width(width: nil, diameter: size_2_diameter)
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Scad
6
+ module Btw
7
+ class Solid < Base
8
+ def self.skip_components
9
+ [:spokes]
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Scad
6
+ module Btw
7
+ class Spoked < Base
8
+ def self.skip_components
9
+ [:solid]
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scad
4
+ module Btw
5
+ VERSION = '0.1.0.pre1'
6
+ end
7
+ end
data/lib/scad/btw.rb ADDED
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ # workaround for jenncad method_missing issue with ruby >= 3.2.0
4
+ require 'extensions/kernel'
5
+ Object.prepend Extensions::Kernel
6
+
7
+ require 'jenncad'
8
+ require 'extensions/jenncad'
9
+ JennCad::Commands::Run.prepend Extensions::JennCad::Commands::Run
10
+ JennCad::Commands::NewPart.prepend Extensions::JennCad::Commands::NewPart
11
+
12
+ class Object
13
+ include JennCad
14
+ end
15
+
16
+ require_relative 'btw/version'
17
+ require_relative 'btw/solid'
18
+ require_relative 'btw/spoked'
19
+ require_relative 'btw/converters/openscad_2_ascii_stl'
20
+
21
+ module Scad
22
+ module Btw
23
+ module Presets
24
+ Dir[
25
+ File.join(File.expand_path('./btw', __dir__), 'presets/**/*.rb')
26
+ ].each { |f| require f }
27
+ end
28
+ end
29
+ end
data/sig/scad/btw.rbs ADDED
@@ -0,0 +1,6 @@
1
+ module Scad
2
+ module Btw
3
+ VERSION: String
4
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
5
+ end
6
+ end
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: scad-btw
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.pre1
5
+ platform: ruby
6
+ authors:
7
+ - empunkt
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-09-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 7.0.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 7.0.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: jenncad
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.0.pre.alpha22
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.0.0.pre.alpha22
41
+ - !ruby/object:Gem::Dependency
42
+ name: ptools
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.5.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.5.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.2.2
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.2.2
69
+ description:
70
+ email:
71
+ - empunkt@mailbox.org
72
+ executables:
73
+ - scad-btw
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".rspec"
78
+ - ".rubocop.yml"
79
+ - ".ruby-version"
80
+ - CODE_OF_CONDUCT.md
81
+ - Gemfile
82
+ - LICENSE.txt
83
+ - README.md
84
+ - Rakefile
85
+ - exe/scad-btw
86
+ - flake.lock
87
+ - flake.nix
88
+ - lib/extensions/jenncad.rb
89
+ - lib/extensions/kernel.rb
90
+ - lib/extensions/thor.rb
91
+ - lib/scad/btw.rb
92
+ - lib/scad/btw/base.rb
93
+ - lib/scad/btw/cli/base.rb
94
+ - lib/scad/btw/cli/concerns/export_formats.rb
95
+ - lib/scad/btw/cli/concerns/export_options.rb
96
+ - lib/scad/btw/cli/presets.rb
97
+ - lib/scad/btw/cli/solid.rb
98
+ - lib/scad/btw/cli/spoked.rb
99
+ - lib/scad/btw/component/axle_hole.rb
100
+ - lib/scad/btw/component/center.rb
101
+ - lib/scad/btw/component/counterweight.rb
102
+ - lib/scad/btw/component/flange.rb
103
+ - lib/scad/btw/component/joint.rb
104
+ - lib/scad/btw/component/joint_base.rb
105
+ - lib/scad/btw/component/o_ring_groove.rb
106
+ - lib/scad/btw/component/solid.rb
107
+ - lib/scad/btw/component/spokes.rb
108
+ - lib/scad/btw/component/tread.rb
109
+ - lib/scad/btw/concerns/component_args.rb
110
+ - lib/scad/btw/concerns/flange_heights.rb
111
+ - lib/scad/btw/concerns/joint_args.rb
112
+ - lib/scad/btw/concerns/part_commons.rb
113
+ - lib/scad/btw/concerns/tread_width.rb
114
+ - lib/scad/btw/converters/openscad_2_ascii_stl.rb
115
+ - lib/scad/btw/presets/scale_1_38/cargo_wheel_thin_36_inch.rb
116
+ - lib/scad/btw/presets/scale_1_38/v20.rb
117
+ - lib/scad/btw/solid.rb
118
+ - lib/scad/btw/spoked.rb
119
+ - lib/scad/btw/version.rb
120
+ - sig/scad/btw.rbs
121
+ homepage: https://codeberg.org/empunkt/brick-train-wheels
122
+ licenses:
123
+ - MIT
124
+ metadata:
125
+ allowed_push_host: https://rubygems.org
126
+ homepage_uri: https://codeberg.org/empunkt/brick-train-wheels
127
+ source_code_uri: https://codeberg.org/empunkt/brick-train-wheels
128
+ changelog_uri: https://codeberg.org/empunkt/brick-train-wheels
129
+ rubygems_mfa_required: 'true'
130
+ post_install_message:
131
+ rdoc_options: []
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: 3.0.0
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">"
142
+ - !ruby/object:Gem::Version
143
+ version: 1.3.1
144
+ requirements: []
145
+ rubygems_version: 3.4.14
146
+ signing_key:
147
+ specification_version: 4
148
+ summary: This gem provides a command line tool to create \*.scad and \*.stl files
149
+ of Brick Train Wheels.
150
+ test_files: []