joseph 0.1.0 → 0.5.0

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.
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