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