jenncad 1.0.0.pre.alpha1 → 1.0.0.pre.alpha4

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.
@@ -4,5 +4,184 @@ module JennCad
4
4
  def initialize(args)
5
5
  @color = args
6
6
  end
7
+
8
+ def self.parse(a)
9
+ case a
10
+ when Array
11
+ check_color_array(a)
12
+ else
13
+ a
14
+ end
15
+ end
16
+
17
+ def self.check_color_array(a)
18
+ if a.max > 1.0
19
+ a.map{|l| l.to_f/255.0}
20
+ else
21
+ a
22
+ end
23
+ end
24
+
25
+ def self.random
26
+ named_colors.random
27
+ end
28
+
29
+ def self.named_colors
30
+ named_color_values.map{|k,v| k}
31
+ end
32
+
33
+ def self.named_color_values
34
+ {
35
+ aliceblue: [240,248,255,0],
36
+ antiquewhite: [250,235,215,0],
37
+ aqua: [0,255,255,0],
38
+ aquamarine: [127,255,212,0],
39
+ azure: [240,255,255,0],
40
+ beige: [245,245,220,0],
41
+ bisque: [255,228,196,0],
42
+ black: [0,0,0,0],
43
+ blanchedalmond: [255,235,205,0],
44
+ blue: [0,0,255,0],
45
+ blueviolet: [138,43,226,0],
46
+ brown: [165,42,42,0],
47
+ burlywood: [222,184,135,0],
48
+ cadetblue: [95,158,160,0],
49
+ chartreuse: [127,255,0,0],
50
+ chocolate: [210,105,30,0],
51
+ coral: [255,127,80,0],
52
+ cornflowerblue: [100,149,237,0],
53
+ cornsilk: [255,248,220,0],
54
+ crimson: [220,20,60,0],
55
+ cyan: [0,255,255,0],
56
+ darkblue: [0,0,139,0],
57
+ darkcyan: [0,139,139,0],
58
+ darkgoldenrod: [184,134,11,0],
59
+ darkgray: [169,169,169,0],
60
+ darkgreen: [0,100,0,0],
61
+ darkgrey: [169,169,169,0],
62
+ darkkhaki: [189,183,107,0],
63
+ darkmagenta: [139,0,139,0],
64
+ darkolivegreen: [85,107,47,0],
65
+ darkorange: [255,140,0,0],
66
+ darkorchid: [153,50,204,0],
67
+ darkred: [139,0,0,0],
68
+ darksalmon: [233,150,122,0],
69
+ darkseagreen: [143,188,143,0],
70
+ darkslateblue: [72,61,139,0],
71
+ darkslategray: [47,79,79,0],
72
+ darkslategrey: [47,79,79,0],
73
+ darkturquoise: [0,206,209,0],
74
+ darkviolet: [148,0,211,0],
75
+ deeppink: [255,20,147,0],
76
+ deepskyblue: [0,191,255,0],
77
+ dimgray: [105,105,105,0],
78
+ dimgrey: [105,105,105,0],
79
+ dodgerblue: [30,144,255,0],
80
+ firebrick: [178,34,34,0],
81
+ floralwhite: [255,250,240,0],
82
+ forestgreen: [34,139,34,0],
83
+ fuchsia: [255,0,255,0],
84
+ gainsboro: [220,220,220,0],
85
+ ghostwhite: [248,248,255,0],
86
+ gold: [255,215,0,0],
87
+ goldenrod: [218,165,32,0],
88
+ gray: [128,128,128,0],
89
+ green: [0,128,0,0],
90
+ greenyellow: [173,255,47,0],
91
+ grey: [128,128,128,0],
92
+ honeydew: [240,255,240,0],
93
+ hotpink: [255,105,180,0],
94
+ indianred: [205,92,92,0],
95
+ indigo: [75,0,130,0],
96
+ ivory: [255,255,240,0],
97
+ khaki: [240,230,140,0],
98
+ lavender: [230,230,250,0],
99
+ lavenderblush: [255,240,245,0],
100
+ lawngreen: [124,252,0,0],
101
+ lemonchiffon: [255,250,205,0],
102
+ lightblue: [173,216,230,0],
103
+ lightcoral: [240,128,128,0],
104
+ lightcyan: [224,255,255,0],
105
+ lightgoldenrodyellow: [250,250,210,0],
106
+ lightgray: [211,211,211,0],
107
+ lightgreen: [144,238,144,0],
108
+ lightgrey: [211,211,211,0],
109
+ lightpink: [255,182,193,0],
110
+ lightsalmon: [255,160,122,0],
111
+ lightseagreen: [32,178,170,0],
112
+ lightskyblue: [135,206,250,0],
113
+ lightslategray: [119,136,153,0],
114
+ lightslategrey: [119,136,153,0],
115
+ lightsteelblue: [176,196,222,0],
116
+ lightyellow: [255,255,224,0],
117
+ lime: [0,255,0,0],
118
+ limegreen: [50,205,50,0],
119
+ linen: [250,240,230,0],
120
+ magenta: [255,0,255,0],
121
+ maroon: [128,0,0,0],
122
+ mediumaquamarine: [102,205,170,0],
123
+ mediumblue: [0,0,205,0],
124
+ mediumorchid: [186,85,211,0],
125
+ mediumpurple: [147,112,219,0],
126
+ mediumseagreen: [60,179,113,0],
127
+ mediumslateblue: [123,104,238,0],
128
+ mediumspringgreen: [0,250,154,0],
129
+ mediumturquoise: [72,209,204,0],
130
+ mediumvioletred: [199,21,133,0],
131
+ midnightblue: [25,25,112,0],
132
+ mintcream: [245,255,250,0],
133
+ mistyrose: [255,228,225,0],
134
+ moccasin: [255,228,181,0],
135
+ navajowhite: [255,222,173,0],
136
+ navy: [0,0,128,0],
137
+ oldlace: [253,245,230,0],
138
+ olive: [128,128,0,0],
139
+ olivedrab: [107,142,35,0],
140
+ orange: [255,165,0,0],
141
+ orangered: [255,69,0,0],
142
+ orchid: [218,112,214,0],
143
+ palegoldenrod: [238,232,170,0],
144
+ palegreen: [152,251,152,0],
145
+ paleturquoise: [175,238,238,0],
146
+ palevioletred: [219,112,147,0],
147
+ papayawhip: [255,239,213,0],
148
+ peachpuff: [255,218,185,0],
149
+ peru: [205,133,63,0],
150
+ pink: [255,192,203,0],
151
+ plum: [221,160,221,0],
152
+ powderblue: [176,224,230,0],
153
+ purple: [128,0,128,0],
154
+ rebeccapurple: [102,51,153,0],
155
+ red: [255,0,0,0],
156
+ rosybrown: [188,143,143,0],
157
+ royalblue: [65,105,225,0],
158
+ saddlebrown: [139,69,19,0],
159
+ salmon: [250,128,114,0],
160
+ sandybrown: [244,164,96,0],
161
+ seagreen: [46,139,87,0],
162
+ seashell: [255,245,238,0],
163
+ sienna: [160,82,45,0],
164
+ silver: [192,192,192,0],
165
+ skyblue: [135,206,235,0],
166
+ slateblue: [106,90,205,0],
167
+ slategray: [112,128,144,0],
168
+ slategrey: [112,128,144,0],
169
+ snow: [255,250,250,0],
170
+ springgreen: [0,255,127,0],
171
+ steelblue: [70,130,180,0],
172
+ tan: [210,180,140,0],
173
+ teal: [0,128,128,0],
174
+ thistle: [216,191,216,0],
175
+ tomato: [255,99,71,0],
176
+ turquoise: [64,224,208,0],
177
+ violet: [238,130,238,0],
178
+ wheat: [245,222,179,0],
179
+ white: [255,255,255,0],
180
+ whitesmoke: [245,245,245,0],
181
+ yellow: [255,255,0,0],
182
+ yellowgreen: [154,205,50,0],
183
+ transparent: [0,0,0,0],
184
+ }
185
+ end
7
186
  end
8
187
  end
@@ -1,7 +1,9 @@
1
1
  module JennCad
2
+ attr_accessor :scale
2
3
  class Scale < Transformation
3
4
  def initialize(args)
4
5
  super(args)
6
+ @scale = args
5
7
  end
6
8
  end
7
9
  end
@@ -1,4 +1,4 @@
1
1
  module JennCad
2
- VERSION = "1.0.0-alpha1"
2
+ VERSION = "1.0.0-alpha4"
3
3
  end
4
4
 
data/lib/jenncad.rb CHANGED
@@ -20,30 +20,8 @@ require "jenncad/part"
20
20
  require "jenncad/project"
21
21
  require "jenncad/commands"
22
22
 
23
- require "jenncad/primitives/primitive"
24
- require "jenncad/primitives/aggregation"
25
- require "jenncad/primitives/openscad_include"
26
-
27
- require "jenncad/primitives/circle"
28
-
29
- require "jenncad/primitives/cylinder"
30
- require "jenncad/primitives/sphere"
31
- require "jenncad/primitives/cube"
32
- require "jenncad/primitives/rounded_cube"
33
- require "jenncad/primitives/polygon"
34
- require "jenncad/primitives/slot"
35
-
36
- require "jenncad/primitives/boolean_object"
37
- require "jenncad/primitives/union_object"
38
- require "jenncad/primitives/subtract_object"
39
- require "jenncad/primitives/hull_object"
40
- require "jenncad/primitives/intersection_object"
41
- require "jenncad/primitives/projection"
42
- require "jenncad/primitives/linear_extrude"
43
- require "jenncad/primitives/rotate_extrude"
44
-
45
-
46
-
23
+ require "jenncad/features"
24
+ require "jenncad/primitives"
47
25
 
48
26
 
49
27
  require "jenncad/transformation/transformation"
@@ -55,9 +33,7 @@ require "jenncad/transformation/color"
55
33
  require "jenncad/transformation/multmatrix"
56
34
 
57
35
 
58
-
59
-
60
-
36
+ # TODO: extras need be split from the package to external hardware lib
61
37
  require "jenncad/extras/hardware"
62
38
  require "jenncad/extras/din912"
63
39
  require "jenncad/extras/din933"
@@ -66,8 +42,7 @@ require "jenncad/extras/iso7380"
66
42
 
67
43
 
68
44
 
69
-
70
45
  require "jenncad/register"
71
46
  require "jenncad/shortcuts"
72
- require "jenncad/jenncad"
73
- require "jenncad/openscad"
47
+ require "jenncad/exporters/openscad"
48
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jenncad
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.alpha1
4
+ version: 1.0.0.pre.alpha4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jennifer Glauche
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-23 00:00:00.000000000 Z
11
+ date: 2022-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: geo3d
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: observr
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: TBD
70
84
  email:
71
85
  - "=^.^=@jenncad.kittenme.ws"
@@ -74,6 +88,7 @@ executables:
74
88
  extensions: []
75
89
  extra_rdoc_files: []
76
90
  files:
91
+ - README.md
77
92
  - Rakefile
78
93
  - bin/jenncad
79
94
  - examples/old/cube.rb
@@ -88,16 +103,22 @@ files:
88
103
  - lib/jenncad.rb
89
104
  - lib/jenncad/commands.rb
90
105
  - lib/jenncad/default_profile.rb
106
+ - lib/jenncad/exporters/openscad.rb
91
107
  - lib/jenncad/extras/din912.rb
92
108
  - lib/jenncad/extras/din933.rb
93
109
  - lib/jenncad/extras/din934.rb
94
110
  - lib/jenncad/extras/hardware.rb
95
111
  - lib/jenncad/extras/iso7380.rb
96
- - lib/jenncad/jenncad.rb
97
- - lib/jenncad/openscad.rb
112
+ - lib/jenncad/features.rb
113
+ - lib/jenncad/features/aggregation.rb
114
+ - lib/jenncad/features/climb.rb
115
+ - lib/jenncad/features/cuttable.rb
116
+ - lib/jenncad/features/feature.rb
117
+ - lib/jenncad/features/openscad_include.rb
118
+ - lib/jenncad/features/stl_import.rb
98
119
  - lib/jenncad/part.rb
99
120
  - lib/jenncad/patches/array.rb
100
- - lib/jenncad/primitives/aggregation.rb
121
+ - lib/jenncad/primitives.rb
101
122
  - lib/jenncad/primitives/boolean_object.rb
102
123
  - lib/jenncad/primitives/circle.rb
103
124
  - lib/jenncad/primitives/cube.rb
@@ -105,7 +126,6 @@ files:
105
126
  - lib/jenncad/primitives/hull_object.rb
106
127
  - lib/jenncad/primitives/intersection_object.rb
107
128
  - lib/jenncad/primitives/linear_extrude.rb
108
- - lib/jenncad/primitives/openscad_include.rb
109
129
  - lib/jenncad/primitives/polygon.rb
110
130
  - lib/jenncad/primitives/primitive.rb
111
131
  - lib/jenncad/primitives/projection.rb
@@ -133,7 +153,7 @@ homepage: ''
133
153
  licenses:
134
154
  - LGPL-3
135
155
  metadata: {}
136
- post_install_message:
156
+ post_install_message:
137
157
  rdoc_options: []
138
158
  require_paths:
139
159
  - lib
@@ -141,15 +161,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
141
161
  requirements:
142
162
  - - ">="
143
163
  - !ruby/object:Gem::Version
144
- version: 2.5.0
164
+ version: 2.6.0
145
165
  required_rubygems_version: !ruby/object:Gem::Requirement
146
166
  requirements:
147
167
  - - ">"
148
168
  - !ruby/object:Gem::Version
149
169
  version: 1.3.1
150
170
  requirements: []
151
- rubygems_version: 3.0.3
152
- signing_key:
171
+ rubygems_version: 3.0.9
172
+ signing_key:
153
173
  specification_version: 4
154
174
  summary: TBD
155
175
  test_files: []
@@ -1,3 +0,0 @@
1
- module JennCad
2
- include Primitives
3
- end
@@ -1,274 +0,0 @@
1
- module JennCad
2
-
3
- class OpenScad
4
- def initialize(part, fn=64)
5
- @imports = []
6
- @modules = {}
7
- part = part.make_openscad_compatible
8
- @main = root(part, "$fn=#{fn};\n")
9
-
10
- @export = ""
11
- @imports.uniq.each do |val|
12
- @export += "use <#{val}.scad>\n"
13
- end
14
- @modules.each do |key, val|
15
- @export += val
16
- end
17
- @export += @main
18
- end
19
-
20
- def save(file)
21
- File.open(file,"w") do |f|
22
- f.puts @export
23
- end
24
- end
25
-
26
- def root(part, head="", tabindex=0)
27
- res = head
28
-
29
- res += transform(part) do
30
- parse(part, tabindex)
31
- end
32
- res
33
- end
34
-
35
- def transform(part, &block)
36
- res += handle_color(part)
37
- if part.transformations
38
- part.transformations.reverse.each do |trans|
39
- res += transformation(trans)
40
- end
41
- end
42
- res += block.yield
43
- end
44
-
45
- def print_tree(part, level=0)
46
- arr = []
47
- arr << parse(part) unless level == 0
48
- if part.respond_to?(:parts)
49
- part.parts.each do |p|
50
- arr << print_tree(p,level+1)
51
- end
52
- end
53
- arr
54
- end
55
-
56
-
57
- def parse(part, tabindex=0)
58
- case part
59
- when JennCad::OpenScadImport
60
- handle_import(part)
61
- when JennCad::Aggregation
62
- handle_aggregation(part)
63
- when JennCad::UnionObject
64
- cmd('union', nil, part.parts, tabindex)
65
- when JennCad::SubtractObject
66
- part.analyze_z_fighting
67
- cmd('difference', nil, part.parts, tabindex)
68
- when JennCad::IntersectionObject
69
- cmd('intersection', nil, part.parts, tabindex)
70
- when JennCad::HullObject
71
- cmd('hull', nil, part.parts, tabindex)
72
- when JennCad::Primitives::Circle
73
- cmd('circle', collect_params(part), nil, tabindex)
74
- when JennCad::Primitives::Cylinder
75
- cmd('cylinder', collect_params(part), nil, tabindex)
76
- when JennCad::Primitives::Sphere
77
- cmd('sphere', collect_params(part), nil, tabindex)
78
- when JennCad::Primitives::Cube
79
- handle_cube(part, tabindex)
80
- when JennCad::Primitives::LinearExtrude
81
- cmd('linear_extrude', part.openscad_params, part.parts, tabindex)
82
- when JennCad::Primitives::RotateExtrude
83
- cmd('rotate_extrude', part.openscad_params, part.parts, tabindex)
84
- when JennCad::Primitives::Projection
85
- cmd('projection', collect_params(part), part.parts, tabindex)
86
- when JennCad::Primitives::Polygon
87
- cmd('polygon', collect_params(part), nil, tabindex)
88
- else
89
- if part.respond_to?(:parts) && part.parts != nil && !part.parts.empty?
90
- res = ""
91
- part.parts.each do |p|
92
- res += root(p, "", tabindex)
93
- end
94
- return res
95
- elsif part.respond_to?(:part)
96
- return root(part.part, "", tabindex)
97
- end
98
- puts "no idea what to do with #{part.inspect}"
99
- return ""
100
- end
101
- end
102
-
103
- def fmt_params(args)
104
- return "" if args == nil
105
- if args.kind_of? String
106
- return "\"#{args}\""
107
- elsif args.kind_of? Array
108
- return args.map do |l|
109
- if l == nil
110
- 0
111
- elsif l.kind_of? Array
112
- l # skipping check of 2-dmin Arrays for now (used in multmatrix)
113
- elsif l.to_i == l.to_f
114
- l.to_i
115
- else
116
- l.to_f
117
- end
118
- end
119
- else
120
- res = []
121
- args.each do |k,v|
122
- if k.to_s == "fn"
123
- k = "$fn"
124
- end
125
- if v == nil
126
- next
127
- end
128
- if !v.kind_of?(Array) && !v.kind_of?(TrueClass) && !v.kind_of?(FalseClass) && v == v.to_i
129
- v = v.to_i
130
- end
131
- res << "#{k}=#{v}"
132
- end
133
- res.join(",")
134
- end
135
- end
136
-
137
- def cmd(name, args, items, tabindex = 0)
138
- items ||= []
139
- res = cmd_call(name,args)
140
- if items.size > 1
141
- res << "\n"
142
- res << tabs(tabindex) { "{\n" }
143
- items.each do |item|
144
- res << tabs(tabindex+1) do
145
- transform(item) do
146
- parse(item, tabindex+1)
147
- end
148
- end
149
- end
150
- res << tabs(tabindex) { "}\n" }
151
- elsif items.size == 1
152
- item = items.first
153
- res << transform(item) do
154
- parse(item, tabindex)
155
- end
156
- res << ";\n"
157
- else
158
- res << ";\n"
159
- end
160
- return res
161
- end
162
-
163
- def tabs(i, &block)
164
- " " * i + block.yield
165
- end
166
-
167
- def handle_import(part, tabindex=0)
168
- @imports << part.import
169
- return tabs(tabindex){ "#{part.name}(#{fmt_params(part.args)});\n" }
170
- end
171
-
172
- def handle_aggregation(part, tabindex=0)
173
- register_module(part) unless @modules[part.name]
174
- use_module(part.name, tabindex)
175
- end
176
-
177
- # check children for color values
178
- # if none of the children has a color value, we can apply color to this object and all children
179
- # if any of the children (excluding children of the kind of BooleanObject) has a color value (that is different from ours), we will apply a fallback color to all children that do not have a color value themselves.
180
-
181
- def handle_color(part)
182
- if part && part.respond_to?(:color) && part.color
183
- if part.respond_to?(:parts)
184
- if part.children_list(JennCad::Aggregation).map{|l| l.color != nil && l.color != part.color}.include?(true)
185
- part.children_list(JennCad::Aggregation).each do |child|
186
- if child.color == nil && child.color != part.color && !child.kind_of?(BooleanObject)
187
- child.set_option :fallback_color, part.color
188
- end
189
- end
190
- return ""
191
- end
192
- end
193
- end
194
- return apply_color(part)
195
- end
196
-
197
- def apply_color(part)
198
- if part && part.respond_to?(:color_or_fallback)
199
- color = part.color_or_fallback
200
- return "" if color == nil
201
- # Allowing color to be string, OpenScad compatible RGBA values of 0..1 or RGBA values of 0..255
202
- if color.kind_of?(Array) && color.map{|l| l.to_f > 1.0 ? true : false}.include?(true)
203
- color = color.map{|l| l.to_f/255.0}
204
- end
205
- return cmd_call("color", color)
206
- end
207
- return ""
208
- end
209
-
210
- def register_module(part)
211
- # can only accept aggregation
212
- @modules[part.name] = "module #{part.name}(){\n"
213
- @modules[part.name] += root(part.part)
214
- @modules[part.name] += "}\n"
215
- end
216
-
217
- def use_module(name, tabindex)
218
- tabs(tabindex){ cmd_call(name, nil).to_s+";" }
219
- end
220
-
221
- def cmd_call(name, args)
222
- args = fmt_params(args)
223
- return "#{name}(#{args})"
224
- end
225
-
226
- def collect_params(part)
227
- res = {}
228
- [:d, :r, :h, :r1, :r2, :d1, :d2, :size, :fn, :points].each do |var|
229
- if part.respond_to? var
230
- res[var] = part.send var
231
- end
232
- end
233
- res
234
- end
235
-
236
- def transformation(trans)
237
- case trans
238
- when JennCad::Move
239
- cmd_call("translate",trans.coordinates)
240
- when JennCad::Rotate
241
- cmd_call("rotate",trans.coordinates)
242
- when JennCad::Mirror
243
- cmd_call("mirror",trans.coordinates)
244
- when JennCad::Multmatrix
245
- cmd_call("multmatrix",trans.m)
246
- else
247
- puts "[openscad exporter] Unkown transformation #{trans.class}"
248
- ""
249
- end
250
- end
251
-
252
- # cubes are now centered in xy by default in jenncad
253
- # TODO: should this not be to_openscad in Cube?
254
- def handle_cube(part, tabindex)
255
- res = ""
256
- if part.option(:center)
257
- res += transformation(Move.new(x: -part.x/2.0, y: -part.y/2.0))
258
- else
259
- if part.option(:center_x)
260
- res += transformation(Move.new(x: -part.x/2.0))
261
- end
262
- if part.option(:center_y)
263
- res += transformation(Move.new(y: -part.y/2.0))
264
- end
265
- if part.option(:center_z)
266
- res += transformation(Move.new(z: -part.z/2.0))
267
- end
268
- end
269
-
270
- res += cmd('cube', collect_params(part), nil)
271
- end
272
-
273
- end
274
- end
@@ -1,12 +0,0 @@
1
- module JennCad::Primitives
2
- class Aggregation < Primitive
3
- attr_accessor :part
4
-
5
- def initialize(name=nil, part=nil)
6
- super({})
7
- @name = name
8
- @part = part
9
- end
10
-
11
- end
12
- end