scad-btw 0.1.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +17 -0
- data/.ruby-version +1 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +13 -0
- data/LICENSE.txt +21 -0
- data/README.md +31 -0
- data/Rakefile +12 -0
- data/exe/scad-btw +6 -0
- data/flake.lock +306 -0
- data/flake.nix +63 -0
- data/lib/extensions/jenncad.rb +91 -0
- data/lib/extensions/kernel.rb +17 -0
- data/lib/extensions/thor.rb +11 -0
- data/lib/scad/btw/base.rb +224 -0
- data/lib/scad/btw/cli/base.rb +31 -0
- data/lib/scad/btw/cli/concerns/export_formats.rb +43 -0
- data/lib/scad/btw/cli/concerns/export_options.rb +62 -0
- data/lib/scad/btw/cli/presets.rb +66 -0
- data/lib/scad/btw/cli/solid.rb +33 -0
- data/lib/scad/btw/cli/spoked.rb +33 -0
- data/lib/scad/btw/component/axle_hole.rb +53 -0
- data/lib/scad/btw/component/center.rb +58 -0
- data/lib/scad/btw/component/counterweight.rb +117 -0
- data/lib/scad/btw/component/flange.rb +96 -0
- data/lib/scad/btw/component/joint.rb +57 -0
- data/lib/scad/btw/component/joint_base.rb +34 -0
- data/lib/scad/btw/component/o_ring_groove.rb +95 -0
- data/lib/scad/btw/component/solid.rb +67 -0
- data/lib/scad/btw/component/spokes.rb +118 -0
- data/lib/scad/btw/component/tread.rb +109 -0
- data/lib/scad/btw/concerns/component_args.rb +26 -0
- data/lib/scad/btw/concerns/flange_heights.rb +24 -0
- data/lib/scad/btw/concerns/joint_args.rb +58 -0
- data/lib/scad/btw/concerns/part_commons.rb +29 -0
- data/lib/scad/btw/concerns/tread_width.rb +21 -0
- data/lib/scad/btw/converters/openscad_2_ascii_stl.rb +39 -0
- data/lib/scad/btw/presets/scale_1_38/cargo_wheel_thin_36_inch.rb +21 -0
- data/lib/scad/btw/presets/scale_1_38/v20.rb +83 -0
- data/lib/scad/btw/solid.rb +13 -0
- data/lib/scad/btw/spoked.rb +13 -0
- data/lib/scad/btw/version.rb +7 -0
- data/lib/scad/btw.rb +29 -0
- data/sig/scad/btw.rbs +6 -0
- 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
|
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
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: []
|