scad-btw 0.1.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
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: []