joseph 0.1.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +97 -2
  3. data/.gitlab-ci.yml +21 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +2 -2
  6. data/{MIT-LICENSE → LICENSE.txt} +3 -1
  7. data/README.md +33 -7
  8. data/Rakefile +4 -21
  9. data/examples/fiducials.rb +31 -0
  10. data/examples/panelize.rb +36 -0
  11. data/joseph.gemspec +25 -18
  12. data/lib/core_extensions/float/conversions.rb +13 -0
  13. data/lib/core_extensions/integer/conversions.rb +9 -0
  14. data/lib/joseph.rb +25 -29
  15. data/lib/joseph/aperture.rb +12 -0
  16. data/lib/joseph/bridge.rb +45 -0
  17. data/lib/joseph/cirseg.rb +11 -0
  18. data/lib/joseph/file_info.rb +17 -0
  19. data/lib/joseph/gdk_color.rb +35 -0
  20. data/lib/joseph/image.rb +143 -0
  21. data/lib/joseph/image_info.rb +25 -0
  22. data/lib/joseph/knockout.rb +13 -0
  23. data/lib/joseph/layer.rb +11 -0
  24. data/lib/joseph/net.rb +38 -0
  25. data/lib/joseph/project.rb +87 -0
  26. data/lib/joseph/render_info.rb +11 -0
  27. data/lib/joseph/render_size.rb +50 -0
  28. data/lib/joseph/step_and_repeat.rb +9 -0
  29. data/lib/joseph/user_transformation.rb +18 -0
  30. data/lib/joseph/version.rb +1 -1
  31. data/spec/assets/3_hat.boardoutline.ger +1628 -0
  32. data/spec/assets/3_hat.bottomlayer.ger +2038 -0
  33. data/spec/assets/3_hat.toplayer.ger +3103 -0
  34. data/spec/assets/test.EXTREP +20 -0
  35. data/spec/assets/test_wrong.GBL +20 -0
  36. data/spec/assets/vesc-capbank.topsilkscreen.ger +520 -0
  37. data/spec/bridge_spec.rb +10 -0
  38. data/spec/image_spec.rb +75 -0
  39. data/spec/project_spec.rb +48 -0
  40. data/spec/render_size_spec.rb +25 -0
  41. data/spec/results/bottomlayer_mirrored.png +0 -0
  42. data/spec/results/toplayer_as_png.png +0 -0
  43. data/spec/spec_helper.rb +16 -0
  44. metadata +172 -79
  45. data/Gemfile.lock +0 -26
  46. data/example.rb +0 -32
  47. data/spec/joseph_spec.rb +0 -32
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ec2a3944a1b9ca6248a276959433ea03c7c05844
4
+ data.tar.gz: 3f2cff40d93104f9d4fc62bd5a0e245a371b2633
5
+ SHA512:
6
+ metadata.gz: b9ad7c83e1670e8daab89cc10f88b1fcdf57ff907e80aca37da26984229a41799ecfa9255849347ad9900d2ef29a3dbb538ef8d1eae22c0ea5509c99b5178275
7
+ data.tar.gz: bfabbbc2458a14ebc65f60cfa757bb5531f6de6be51b52281b845c9402ef582f509e64099ed4c5c9368d4d103610b086463fafec3618d12ceb2df141a6cfc596
data/.gitignore CHANGED
@@ -1,3 +1,98 @@
1
- pkg/*
1
+
2
+ # Created by https://www.gitignore.io/api/ruby,node,osx,linux
3
+
4
+ ### Ruby ###
2
5
  *.gem
3
- .bundle
6
+ *.rbc
7
+ /.config
8
+ /coverage/
9
+ /InstalledFiles
10
+ /pkg/
11
+ /spec/reports/
12
+ /spec/examples.txt
13
+ /test/tmp/
14
+ /test/version_tmp/
15
+ /tmp/
16
+ Gemfile.lock
17
+ .rbenv-vars
18
+
19
+ # Used by dotenv library to load environment variables.
20
+ # .env
21
+
22
+ ## Specific to RubyMotion:
23
+ .dat*
24
+ .repl_history
25
+ build/
26
+ *.bridgesupport
27
+ build-iPhoneOS/
28
+ build-iPhoneSimulator/
29
+
30
+ ## Specific to RubyMotion (use of CocoaPods):
31
+ #
32
+ # We recommend against adding the Pods directory to your .gitignore. However
33
+ # you should judge for yourself, the pros and cons are mentioned at:
34
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
35
+ #
36
+ # vendor/Pods/
37
+
38
+ ## Documentation cache and generated files:
39
+ /.yardoc/
40
+ /_yardoc/
41
+ # /doc/
42
+ /rdoc/
43
+
44
+ ## Environment normalization:
45
+ /.bundle/
46
+ /vendor/bundle
47
+ /lib/bundler/man/
48
+
49
+ # for a library or gem, you might want to ignore these files since the code is
50
+ # intended to run in multiple environments; otherwise, check them in:
51
+ # Gemfile.lock
52
+ # .ruby-version
53
+ # .ruby-gemset
54
+
55
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
56
+ .rvmrc
57
+
58
+ ### OSX ###
59
+ *.DS_Store
60
+ .AppleDouble
61
+ .LSOverride
62
+
63
+ # Icon must end with two \r
64
+ Icon
65
+
66
+
67
+ # Thumbnails
68
+ ._*
69
+
70
+ # Files that might appear in the root of a volume
71
+ .DocumentRevisions-V100
72
+ .fseventsd
73
+ .Spotlight-V100
74
+ .TemporaryItems
75
+ .Trashes
76
+ .VolumeIcon.icns
77
+ .com.apple.timemachine.donotpresent
78
+
79
+ # Directories potentially created on remote AFP share
80
+ .AppleDB
81
+ .AppleDesktop
82
+ Network Trash Folder
83
+ Temporary Items
84
+ .apdisk
85
+
86
+
87
+ ### Linux ###
88
+ *~
89
+
90
+ # temporary files which can be created if a process still has a handle open of a deleted file
91
+ .fuse_hidden*
92
+
93
+ # KDE directory preferences
94
+ .directory
95
+
96
+ # Linux trash folder which might appear on any partition or disk
97
+ .Trash-*
98
+
@@ -0,0 +1,21 @@
1
+ before_script:
2
+ - ruby -v
3
+ - which ruby
4
+ - gem install bundler --no-ri --no-rdoc
5
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
6
+
7
+ stages:
8
+ - test
9
+ - deploy
10
+
11
+
12
+ rspec_job:
13
+ stage: test
14
+ script:
15
+ - bundle exec rspec
16
+
17
+ deploy_job:
18
+ stage: deploy
19
+ script:
20
+ - bundle exec rake build
21
+ - bundle exec gem inabox -g https://gems.aisler.net
@@ -0,0 +1 @@
1
+ 2.3.3
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in joseph.gemspec
3
+ # Specify your gem's dependencies in aisler_eda.gemspec
4
4
  gemspec
@@ -1,4 +1,6 @@
1
- Copyright 2010 Martin Schuerrer http://schuerrer.org
1
+ Copyright (c) 2016 AISLER B.V.
2
+
3
+ MIT License
2
4
 
3
5
  Permission is hereby granted, free of charge, to any person obtaining
4
6
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,12 +1,38 @@
1
- Joseph
2
- ======
1
+ # Joseph
3
2
 
4
- Yet another take on application configuration.
3
+ Make working with gerber files great again! See [talk @ FOSDEM 2017](https://docs.google.com/presentation/d/1P0TlYbtU38EL7d7HRAupMRoa70ejif5nWAY0IsgneYI/edit?usp=sharing) for more information.
5
4
 
6
- Named after [Joseph Finder](http://www.nytimes.com/1987/02/22/magazine/about-men-a-male-secretary.html?pagewanted=all).
7
5
 
8
- License
9
- =======
10
6
 
11
- MIT License. Copyright 2010 [Martin Schuerrer](http://schuerrer.org).
7
+ ## Installation
12
8
 
9
+ Make sure gerbv is installed on your system.
10
+
11
+ ### MacOS
12
+ ```bash
13
+ brew install gerbv
14
+ ```
15
+
16
+ ### Debian / Ubuntu via apt-get
17
+ ```bash
18
+ sudo apt-get install gerbv
19
+ ```
20
+
21
+ Windows is not supported yet because of Ruby FF's missing support for this platform.
22
+
23
+
24
+ ## Usage
25
+ See examples directory. More specific examples coming soon.
26
+
27
+ ## License
28
+
29
+ Joseph is Copyright © 2017 by AISLER B.V. It is free software, and may be
30
+ redistributed under the terms specified in the MIT-LICENSE file.
31
+
32
+ ## About AISLER
33
+
34
+ ![AISLER](https://cdn-2.aisler.net/assets/logo_invert_orange-7ca49b7abecdf2f857639df2c0de142889a9dc23d33af4b9f875db54c0bc417e.png)
35
+
36
+ Joseph is developed and funded by AISLER B.V.
37
+
38
+ Looking for industry quality and affordable PCBs, visit us at [AISLER GO](https://go.aisler.net)
data/Rakefile CHANGED
@@ -1,24 +1,7 @@
1
- require 'bundler'
2
- Bundler.setup
3
-
1
+ require "bundler/gem_tasks"
4
2
  require "rspec/core/rake_task"
5
3
 
6
- Bundler::GemHelper.install_tasks
7
-
8
- desc "Run all examples"
9
- RSpec::Core::RakeTask.new(:spec) do |t|
10
- t.rspec_opts = %w[--color]
11
- t.verbose = false
12
- end
13
-
14
- desc("Open IRB console")
15
- task :console do
16
- require 'irb'
17
- require 'irb/completion'
18
- require 'joseph'
19
- ARGV.clear
20
- IRB.start
21
- end
22
-
23
- task :default => [:spec]
4
+ RSpec::Core::RakeTask.new
24
5
 
6
+ task :default => :spec
7
+ task :test => :spec
@@ -0,0 +1,31 @@
1
+ require 'fileutils'
2
+ require 'joseph'
3
+
4
+ # Create new project and load files
5
+ project = Joseph::Project.create
6
+ Dir.glob('./gerbers/*.ger').each { |file| project.add_file file, /\.([a-z]+)\.ger/.match(file)[1].to_sym }
7
+
8
+ # Use boardoutline layer as bounding box
9
+ bb = Joseph::RenderSize.from_image(project.file(:boardoutline).image)
10
+
11
+ fiducials = []
12
+ spacing = 0.05
13
+ diameter_copper = 0.03
14
+ diameter_soldermask = 0.05
15
+ # Copper layer
16
+ fiducials << { x: bb[:left] - spacing, y: bb[:bottom] + spacing, d: diameter_copper, layer: :toplayer }
17
+ fiducials << { x: bb[:right] + spacing, y: bb[:top] - spacing, d: diameter_copper, layer: :toplayer }
18
+ fiducials << { x: bb[:left] - spacing, y: bb[:top] - spacing, d: diameter_copper, layer: :toplayer }
19
+ # Soldermask layer
20
+ fiducials << { x: bb[:left] - spacing, y: bb[:bottom] + spacing, d: diameter_soldermask, layer: :topsoldermask }
21
+ fiducials << { x: bb[:right] + spacing, y: bb[:top] - spacing, d: diameter_soldermask, layer: :topsoldermask }
22
+ fiducials << { x: bb[:left] - spacing, y: bb[:top] - spacing, d: diameter_soldermask, layer: :topsoldermask }
23
+
24
+ fiducials.each do |fid|
25
+ Joseph::Bridge.gerbv_image_create_line_object(project.file(fid[:layer]).image, fid[:x], fid[:y], fid[:x], fid[:y], fid[:d], :circle)
26
+ end
27
+
28
+ # Save output files
29
+ project.index.each do |k, ix|
30
+ FileUtils.cp(project.file(ix).image.to_output.file, "with_fiducial.#{k}.ger")
31
+ end
@@ -0,0 +1,36 @@
1
+ require 'zip'
2
+ require 'joseph'
3
+
4
+ rows = 10
5
+ columns = 10
6
+
7
+ # Create new project and load files
8
+ project = Joseph::Project.create
9
+ Dir.glob('./*.ger').each { |file| project.add_file file, /\.([a-z]+)\.ger/.match(file)[1].to_sym }
10
+
11
+ # Use boardoutline layer as bounding box
12
+ bb = Joseph::RenderSize.from_image(project.file(:boardoutline).image)
13
+
14
+ # Create panel containing all images
15
+ panel = {}
16
+ project.index.each { |k, ix| panel[k] = Joseph::Image.create }
17
+
18
+ # Panelize!
19
+ rows.times do |row|
20
+ columns.times do |col|
21
+ transform = Joseph::UserTransformation.new
22
+ transform[:translate_x] = bb.width * col
23
+ transform[:translate_y] = bb.height * row
24
+
25
+ panel.each do |k, image|
26
+ image.add project.file(k).image, transform
27
+ end
28
+ end
29
+ end
30
+
31
+ # Build ZIP as output format
32
+ io = Zip::File.open('./panel.zip', Zip::File::CREATE)
33
+ panel.each do |k, image|
34
+ io.get_output_stream("panel.#{k}.ger") { |f| f.puts(image.to_output.data) }
35
+ end
36
+ io.close
@@ -1,22 +1,29 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "joseph/version"
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'joseph/version'
4
5
 
5
- Gem::Specification.new do |s|
6
- s.name = "joseph"
7
- s.version = Joseph::VERSION
8
- s.platform = Gem::Platform::RUBY
9
- s.authors = ["Martin Schuerrer"]
10
- s.email = ["martin@schuerrer.org"]
11
- s.homepage = "http://schuerrer.org"
12
- s.summary = %q{Yet another take on application configuration}
13
- s.description = %q{Yet another take on application configuration}
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "joseph"
8
+ spec.version = Joseph::VERSION
9
+ spec.authors = ["Patrick Franken", "AISLER B.V."]
10
+ spec.email = ["p.franken@aisler.net"]
11
+ spec.summary = "Make working with gerber files great again"
12
+ spec.description = "Read, modify and writer Gerber RS274X files with ruby using libgerbv bindings and some sugar."
13
+ spec.homepage = "http://aisler.net"
14
+ spec.license = "MIT"
14
15
 
15
- s.files = `git ls-files`.split("\n")
16
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
- s.require_paths = ["lib"]
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
19
20
 
20
- s.add_development_dependency("rspec", ["~> 2.1.0"])
21
- s.add_development_dependency("rake", ["~> 0.8.7"])
21
+ spec.add_runtime_dependency 'ffi', '~> 1.9'
22
+ spec.add_runtime_dependency 'ramdo', '~> 0.2'
23
+
24
+ spec.add_development_dependency "bundler"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "rspec"
27
+ spec.add_development_dependency "geminabox"
28
+ spec.add_development_dependency "chunky_png"
22
29
  end
@@ -0,0 +1,13 @@
1
+ module CoreExtensions
2
+ module Float
3
+ module Conversions
4
+ def to_inches
5
+ self / 25.4
6
+ end
7
+
8
+ def to_mm
9
+ self * 25.4
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ module CoreExtensions
2
+ module Integer
3
+ module Conversions
4
+ def to_gdk_color
5
+ 2**16 / 2**8 * self
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,32 +1,28 @@
1
- require 'ostruct'
1
+ require 'pp'
2
+ require 'ffi'
3
+ require 'ramdo'
2
4
 
3
- module Joseph
4
- def self.included(base)
5
- if base.class == Module
6
- base.extend self
7
- else
8
- super
9
- end
10
- end
11
-
12
- def config
13
- @config ||= OpenStruct.new
14
- end
5
+ # Apply monkey patches
6
+ require 'core_extensions/float/conversions'
7
+ require 'core_extensions/integer/conversions'
8
+ Float.include CoreExtensions::Float::Conversions
9
+ Integer.include CoreExtensions::Integer::Conversions
15
10
 
16
- def configure
17
- yield config
18
- end
11
+ require 'joseph/gdk_color'
12
+ require 'joseph/cirseg'
13
+ require 'joseph/render_size'
14
+ require 'joseph/render_info'
15
+ require 'joseph/net'
16
+ require 'joseph/user_transformation'
17
+ require 'joseph/aperture'
18
+ require 'joseph/knockout'
19
+ require 'joseph/step_and_repeat'
20
+ require 'joseph/layer'
21
+ require 'joseph/image_info'
22
+ require 'joseph/image'
23
+ require 'joseph/file_info'
24
+ require 'joseph/project'
25
+ require 'joseph/bridge'
19
26
 
20
- def [](key)
21
- config.send key
22
- end
23
-
24
- # Lifted from http://github.com/stephencelis/app/blob/master/lib/app.rb#L69-76
25
- def method_missing(method, *args, &block)
26
- super if (key = method.to_s).end_with?("=")
27
- boolean = key.chomp!("?")
28
- value = self[key]
29
- value = value.call(*args, &block) if value.respond_to?(:call)
30
- boolean ? !!value : value
31
- end
32
- end
27
+ module Joseph
28
+ end
@@ -0,0 +1,12 @@
1
+ module Joseph
2
+ class Aperture < FFI::Struct
3
+ layout :type, :int,
4
+ :amacro, :pointer,
5
+ :simplified_amacro, :pointer,
6
+ :parameter_0, :double,
7
+ :parameter_1, :double,
8
+ :parameters, :double, FFI::Type::FLOAT.size * 102, # APERTURE_PARAMETERS_MAX
9
+ :nuf_parameters, :int,
10
+ :unit, :int
11
+ end
12
+ end
@@ -0,0 +1,45 @@
1
+ module Joseph
2
+ module Bridge
3
+ extend FFI::Library
4
+ ffi_lib 'libgerbv'
5
+
6
+ # http://gerbv.geda-project.org/doxygen/gerbv_8h.html#ac99303749c4afdc6a24eafbfa37e1237
7
+ enum :aptype, [:none, 1,
8
+ :circle,
9
+ :rectangle,
10
+ :oval,
11
+ :polygon,
12
+ :macro ]
13
+
14
+ # http://gerbv.geda-project.org/doxygen/index.html
15
+ attach_function :gerbv_create_project, [], Project.ptr
16
+ attach_function :gerbv_create_image, [:pointer, :pointer], Image.ptr
17
+
18
+ attach_function :gerbv_open_layer_from_filename, [:pointer, :string], :void
19
+ attach_function :gerbv_open_layer_from_filename_with_color, [:pointer, :string, :int, :int, :int, :int], :void
20
+
21
+ attach_function :gerbv_export_png_file_from_project, [:pointer, :pointer, :string], :void
22
+ attach_function :gerbv_export_png_file_from_project_autoscaled, [:pointer, :int, :int, :string], :void
23
+ attach_function :gerbv_export_svg_file_from_project_autoscaled, [:pointer, :string], :void
24
+
25
+ attach_function :gerbv_export_rs274x_file_from_image, [:string, :pointer, :pointer], :bool
26
+ attach_function :gerbv_export_drill_file_from_image, [:string, :pointer, :pointer], :bool
27
+
28
+ attach_function :gerbv_render_get_boundingbox, [:pointer, :pointer], :void
29
+ attach_function :gerbv_render_zoom_to_fit_display, [:pointer, :pointer], :void
30
+
31
+ attach_function :gerbv_image_copy_image, [:pointer, :pointer, :pointer], :void
32
+ attach_function :gerbv_image_duplicate_image, [:pointer, :pointer], Image.ptr
33
+ attach_function :gerbv_image_create_line_object, [:pointer, :double, :double, :double, :double, :double, :aptype], :void
34
+ attach_function :gerbv_image_create_arc_object, [:pointer, :double, :double, :double, :double, :double, :double, :aptype], :void
35
+ attach_function :gerbv_image_create_rectangle_object, [:pointer, :double, :double, :double, :double], :void
36
+ attach_function :gerbv_image_delete_net, [:pointer], :void
37
+
38
+ attach_function :gerbv_image_return_new_layer, [:pointer], Layer.ptr
39
+ attach_function :gerber_create_new_net, [:pointer, :pointer, :pointer], Net.ptr
40
+
41
+ attach_function :gerbv_destroy_project, [:pointer], :void
42
+ attach_function :gerbv_destroy_image, [:pointer], :void
43
+ end
44
+
45
+ end