jenncad 1.0.0.pre.alpha3 → 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.
- checksums.yaml +4 -4
- data/README.md +83 -0
- data/lib/jenncad/exporters/openscad.rb +13 -3
- data/lib/jenncad/features/aggregation.rb +6 -2
- data/lib/jenncad/features/stl_import.rb +10 -0
- data/lib/jenncad/features.rb +2 -0
- data/lib/jenncad/part.rb +2 -2
- data/lib/jenncad/primitives/cylinder.rb +29 -1
- data/lib/jenncad/primitives/rotate_extrude.rb +1 -1
- data/lib/jenncad/shortcuts.rb +4 -0
- data/lib/jenncad/thing.rb +85 -14
- data/lib/jenncad/version.rb +1 -1
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea1fa04592f59d248c5801c3b645f16429bd7ae9f0b754aa467c8a401c89ec4b
|
4
|
+
data.tar.gz: 4df185f63b22b5945784cf820b4af937e4fbc660875f36093bbd5ebe9baa2aa9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0809987ec1b33518b17402acb27b659da2dc7b97ee304d1549abd857ae4448e0342d6ee4523e8d2277d7ce765e1278f996af9882b5da91b71c93acec8bd9ffd9'
|
7
|
+
data.tar.gz: e412b05272163c37096d36a44d83ac3d3c5ae07089d7d8d7236c1c53a263c24742566b691efbb5a03c9148960cb7734eb2859bc279e450e34c131fda2ae85af5
|
data/README.md
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
|
2
|
+
# jenncad
|
3
|
+
Create physical objects in Ruby, OpenScad export
|
4
|
+
|
5
|
+
This is a successor to my older project CrystalScad.
|
6
|
+
|
7
|
+
# Installation
|
8
|
+
|
9
|
+
A packaged release is not yet available, please build your own package in the meantime:
|
10
|
+
|
11
|
+
$ git clone git@github.com:jglauche/jenncad.git
|
12
|
+
$ cd jenncad
|
13
|
+
$ rake install
|
14
|
+
|
15
|
+
This will create a gem and a binary jenncad.
|
16
|
+
|
17
|
+
# Using Jenncad
|
18
|
+
|
19
|
+
**To create a new project directory, run:**
|
20
|
+
|
21
|
+
$ jenncad create meow
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
This will generate a directory meow/ and an executable ruby file meow.rb in its directory
|
27
|
+
|
28
|
+
$ cd meow
|
29
|
+
$ ./meow
|
30
|
+
|
31
|
+
This will generate a dummy project which generates a dummy cube as OpenSCAD output:
|
32
|
+
|
33
|
+
$ cat output/meow.scad
|
34
|
+
> $fn=64;
|
35
|
+
> translate([-5, -5, 0])cube([10, 10, 10.0]);
|
36
|
+
|
37
|
+
**Automatically refresh OpenSCAD output while developing**
|
38
|
+
|
39
|
+
Jenncad bundles the observr gem which will check if files were changed while developing. In the project directory run:
|
40
|
+
|
41
|
+
$ jenncad
|
42
|
+
This should display something like:
|
43
|
+
> refreshing...
|
44
|
+
> ok
|
45
|
+
> JennCad running, refreshing on file changes. Press ctrl+c to exit
|
46
|
+
|
47
|
+
**Note:** This does not check for new files in the project. You will have to restart it when you create a new part in a new file
|
48
|
+
|
49
|
+
**Create new part**
|
50
|
+
|
51
|
+
In your project directory, run:
|
52
|
+
|
53
|
+
$ jenncad new cat
|
54
|
+
part parts/cat.rb created. In your meow.rb add to class Meow:
|
55
|
+
def cat
|
56
|
+
Cat.new(config)
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
You will have to link the part to the project manually into the meow.rb file in your project directory. When you add it, your meow.rb should look like this:
|
61
|
+
|
62
|
+
#!/usr/bin/env ruby
|
63
|
+
require "jenncad"
|
64
|
+
include JennCad
|
65
|
+
|
66
|
+
class Meow < Project
|
67
|
+
def config
|
68
|
+
{}
|
69
|
+
end
|
70
|
+
|
71
|
+
def meow
|
72
|
+
cube(10,10,10)
|
73
|
+
end
|
74
|
+
|
75
|
+
def cat
|
76
|
+
Cat.new(config)
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
Meow.new.run
|
81
|
+
|
82
|
+
|
83
|
+
|
@@ -94,7 +94,12 @@ module JennCad::Exporters
|
|
94
94
|
if !v.kind_of?(Array) && !v.kind_of?(TrueClass) && !v.kind_of?(FalseClass) && v == v.to_i
|
95
95
|
v = v.to_i
|
96
96
|
end
|
97
|
-
|
97
|
+
if v.kind_of? String
|
98
|
+
q = "\""
|
99
|
+
else
|
100
|
+
q = ""
|
101
|
+
end
|
102
|
+
res << "#{k}=#{q}#{v}#{q}"
|
98
103
|
end
|
99
104
|
res.join(",").gsub("size=","")
|
100
105
|
else
|
@@ -165,6 +170,8 @@ module JennCad::Exporters
|
|
165
170
|
new_obj(part, :projection, collect_params(part), parse(part.parts))
|
166
171
|
when JennCad::Primitives::Polygon
|
167
172
|
new_obj(part, :polygon, collect_params(part))
|
173
|
+
when JennCad::StlImport
|
174
|
+
new_obj(part, :import, collect_params(part))
|
168
175
|
when JennCad::Part
|
169
176
|
parse(part.part)
|
170
177
|
when nil
|
@@ -192,8 +199,11 @@ module JennCad::Exporters
|
|
192
199
|
end
|
193
200
|
|
194
201
|
def collect_params(part)
|
202
|
+
if part.respond_to? :openscad_params
|
203
|
+
return part.openscad_params
|
204
|
+
end
|
195
205
|
res = {}
|
196
|
-
[:d, :h, :d1, :d2, :size, :fn, :points].each do |var|
|
206
|
+
[:d, :h, :d1, :d2, :size, :fn, :points, :file].each do |var|
|
197
207
|
if part.respond_to? var
|
198
208
|
res[var] = part.send var
|
199
209
|
end
|
@@ -239,7 +249,7 @@ module JennCad::Exporters
|
|
239
249
|
|
240
250
|
# accept aggregation
|
241
251
|
def register_module(part)
|
242
|
-
@modules[part.name] = OpenScadObject.new(:module,part.name, parse(part.part))
|
252
|
+
@modules[part.name] = OpenScadObject.new(:module, part.name, parse(part.part))
|
243
253
|
end
|
244
254
|
|
245
255
|
def handle_import(part)
|
@@ -1,11 +1,15 @@
|
|
1
1
|
module JennCad::Features
|
2
2
|
class Aggregation < Feature
|
3
|
-
attr_accessor :
|
3
|
+
attr_accessor :parts
|
4
4
|
|
5
5
|
def initialize(name=nil, part=nil)
|
6
6
|
super({})
|
7
7
|
@name = name
|
8
|
-
@
|
8
|
+
@parts = [part] # NOTE: single length arrayto make checking children easier
|
9
|
+
end
|
10
|
+
|
11
|
+
def part
|
12
|
+
@parts.first
|
9
13
|
end
|
10
14
|
|
11
15
|
end
|
data/lib/jenncad/features.rb
CHANGED
data/lib/jenncad/part.rb
CHANGED
@@ -3,10 +3,10 @@ module JennCad
|
|
3
3
|
class Part < Thing
|
4
4
|
|
5
5
|
def to_openscad #make_openscad_compatible
|
6
|
-
auto_color
|
6
|
+
# auto_color
|
7
7
|
a = Aggregation.new(self.class.to_s, self.part) #make_openscad_compatible!(self.part))
|
8
8
|
a.transformations = @transformations
|
9
|
-
a.color(
|
9
|
+
a.color(:auto)
|
10
10
|
a
|
11
11
|
end
|
12
12
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module JennCad::Primitives
|
2
2
|
class Cylinder < Primitive
|
3
|
-
attr_accessor :d, :r, :fn
|
3
|
+
attr_accessor :d, :d1, :d2, :r, :fn
|
4
4
|
def initialize(args)
|
5
5
|
if args.kind_of?(Array) && args[0].kind_of?(Hash)
|
6
6
|
args = args.first
|
@@ -43,6 +43,20 @@ module JennCad::Primitives
|
|
43
43
|
super(args)
|
44
44
|
end
|
45
45
|
|
46
|
+
def openscad_params
|
47
|
+
res = {}
|
48
|
+
if @opts[:d1]
|
49
|
+
[:d1, :d2, :h, :fn].each do |n|
|
50
|
+
res[n] = self.send n
|
51
|
+
end
|
52
|
+
else
|
53
|
+
[:d, :h, :fn].each do |n|
|
54
|
+
res[n] = self.send n
|
55
|
+
end
|
56
|
+
end
|
57
|
+
res
|
58
|
+
end
|
59
|
+
|
46
60
|
def handle_fn
|
47
61
|
case @opts[:fn]
|
48
62
|
when nil, 0
|
@@ -70,6 +84,20 @@ module JennCad::Primitives
|
|
70
84
|
@d = @opts[:d].to_f + @opts[:margins][:d].to_f
|
71
85
|
@r = @d / 2.0
|
72
86
|
end
|
87
|
+
|
88
|
+
case @opts[:d1]
|
89
|
+
when 0, nil
|
90
|
+
else
|
91
|
+
@d1 = @opts[:d1].to_f + @opts[:margins][:d].to_f
|
92
|
+
@d2 = @opts[:d2].to_f + @opts[:margins][:d].to_f
|
93
|
+
end
|
94
|
+
|
95
|
+
case @opts[:r1]
|
96
|
+
when 0, nil
|
97
|
+
else
|
98
|
+
@d1 = 2 * @opts[:r1].to_f + @opts[:margins][:d].to_f
|
99
|
+
@d2 = 2 * @opts[:r2].to_f + @opts[:margins][:d].to_f
|
100
|
+
end
|
73
101
|
end
|
74
102
|
|
75
103
|
def h
|
data/lib/jenncad/shortcuts.rb
CHANGED
data/lib/jenncad/thing.rb
CHANGED
@@ -251,38 +251,109 @@ module JennCad
|
|
251
251
|
item
|
252
252
|
end
|
253
253
|
|
254
|
+
def has_explicit_color?
|
255
|
+
if option(:auto_color) == false
|
256
|
+
return true
|
257
|
+
end
|
258
|
+
return false
|
259
|
+
end
|
260
|
+
|
261
|
+
def only_color?(parts, lvl=0)
|
262
|
+
return true if parts == nil
|
263
|
+
|
264
|
+
parts.each do |part|
|
265
|
+
# puts " " * lvl + "[only_color?] #{part}"
|
266
|
+
if part.has_explicit_color?
|
267
|
+
# puts " " * lvl + "found explicit color here"
|
268
|
+
return false
|
269
|
+
end
|
270
|
+
if !only_color?(part.parts, lvl+1)
|
271
|
+
return false
|
272
|
+
end
|
273
|
+
end
|
274
|
+
true
|
275
|
+
end
|
276
|
+
|
277
|
+
def set_auto_color_for_children(col, parts, lvl=0)
|
278
|
+
return if parts == nil
|
279
|
+
|
280
|
+
parts.each do |part|
|
281
|
+
unless part.has_explicit_color?
|
282
|
+
if only_color?(part.parts, lvl+1)
|
283
|
+
# puts " " * lvl + "children have no explicit color, setting it here"
|
284
|
+
part.set_auto_color(col)
|
285
|
+
else
|
286
|
+
# puts " " * lvl + "[set_auto_color_for_children] #{part}"
|
287
|
+
set_auto_color_for_children(col, part.parts, lvl+1)
|
288
|
+
end
|
289
|
+
else
|
290
|
+
# puts " " * lvl + "[set_auto_color_for_children] this part has a color, ignoring their children"
|
291
|
+
end
|
292
|
+
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
def set_auto_color(col)
|
297
|
+
set_option :color, col
|
298
|
+
set_option :auto_color, true
|
299
|
+
end
|
300
|
+
|
254
301
|
def color(args=nil)
|
255
|
-
|
256
|
-
when nil
|
302
|
+
if args == nil
|
257
303
|
return option(:color)
|
258
|
-
|
259
|
-
|
304
|
+
end
|
305
|
+
|
306
|
+
if args == :auto
|
307
|
+
ac = auto_color
|
308
|
+
unless ac.nil?
|
309
|
+
#puts "auto color to #{ac}"
|
310
|
+
if only_color?(self.parts)
|
311
|
+
set_option :color, ac
|
312
|
+
set_option :auto_color, true
|
313
|
+
else
|
314
|
+
set_auto_color_for_children(ac, self.parts)
|
315
|
+
end
|
316
|
+
|
317
|
+
end
|
318
|
+
return self
|
319
|
+
end
|
320
|
+
|
321
|
+
c = color_parse(args)
|
322
|
+
unless c.nil?
|
323
|
+
set_option :color, c
|
324
|
+
set_option :auto_color, false
|
325
|
+
end
|
326
|
+
|
327
|
+
self
|
328
|
+
end
|
329
|
+
|
330
|
+
def color_parse(args=nil)
|
331
|
+
case args
|
260
332
|
when :none
|
261
333
|
set_option :no_auto_color, true
|
262
334
|
when :random
|
263
|
-
|
335
|
+
return Color.random
|
264
336
|
when Array
|
265
|
-
|
337
|
+
return Color.parse(args)
|
266
338
|
when /(?<=#)(?<!^)(\h{6}|\h{3})/
|
267
|
-
|
339
|
+
return args
|
268
340
|
when /(?<!^)(\h{6}|\h{3})/
|
269
|
-
|
341
|
+
return "##{args}"
|
270
342
|
when String
|
271
|
-
|
272
|
-
else
|
273
|
-
puts "meow"
|
343
|
+
return args
|
274
344
|
end
|
275
|
-
|
345
|
+
nil
|
276
346
|
end
|
277
347
|
|
278
348
|
def auto_color
|
279
349
|
if option(:color) == nil && !option(:no_auto_color)
|
280
|
-
auto_color!
|
350
|
+
return auto_color!
|
281
351
|
end
|
352
|
+
nil
|
282
353
|
end
|
283
354
|
|
284
355
|
def auto_color!
|
285
|
-
|
356
|
+
color_parse($jenncad_profile.colors.pop)
|
286
357
|
end
|
287
358
|
|
288
359
|
def color_or_fallback
|
data/lib/jenncad/version.rb
CHANGED
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.
|
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:
|
11
|
+
date: 2022-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: geo3d
|
@@ -88,6 +88,7 @@ executables:
|
|
88
88
|
extensions: []
|
89
89
|
extra_rdoc_files: []
|
90
90
|
files:
|
91
|
+
- README.md
|
91
92
|
- Rakefile
|
92
93
|
- bin/jenncad
|
93
94
|
- examples/old/cube.rb
|
@@ -114,6 +115,7 @@ files:
|
|
114
115
|
- lib/jenncad/features/cuttable.rb
|
115
116
|
- lib/jenncad/features/feature.rb
|
116
117
|
- lib/jenncad/features/openscad_include.rb
|
118
|
+
- lib/jenncad/features/stl_import.rb
|
117
119
|
- lib/jenncad/part.rb
|
118
120
|
- lib/jenncad/patches/array.rb
|
119
121
|
- lib/jenncad/primitives.rb
|
@@ -151,7 +153,7 @@ homepage: ''
|
|
151
153
|
licenses:
|
152
154
|
- LGPL-3
|
153
155
|
metadata: {}
|
154
|
-
post_install_message:
|
156
|
+
post_install_message:
|
155
157
|
rdoc_options: []
|
156
158
|
require_paths:
|
157
159
|
- lib
|
@@ -166,8 +168,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
166
168
|
- !ruby/object:Gem::Version
|
167
169
|
version: 1.3.1
|
168
170
|
requirements: []
|
169
|
-
rubygems_version: 3.0.
|
170
|
-
signing_key:
|
171
|
+
rubygems_version: 3.0.9
|
172
|
+
signing_key:
|
171
173
|
specification_version: 4
|
172
174
|
summary: TBD
|
173
175
|
test_files: []
|