dyi 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES ADDED
@@ -0,0 +1,20 @@
1
+ = DYI Changelog
2
+
3
+ == Version 0.0.2 / 2011-09-05
4
+
5
+ * Minor Enhancements
6
+ * Modify header comments of output file.
7
+
8
+ * Bug Fixes
9
+ * A path is not drawn correctly.
10
+ * Miter length is not set corrently.
11
+
12
+ == Version 0.0.1 / 2011-07-15
13
+
14
+ * Bug Fixes
15
+ * Clipping is not possible for a shape object.
16
+ * A path is not drawn correctly.
17
+
18
+ == Version 0.0.0 / 2011-06-30
19
+
20
+ * First public release
@@ -1,4 +1,7 @@
1
- require '../lib/dyi'
1
+ # -*- encoding: UTF-8 -*-
2
+
3
+ require 'rubygems'
4
+ require 'dyi'
2
5
 
3
6
  class ClassBox
4
7
  def initialize class_name
@@ -148,4 +151,4 @@ pen.draw_rectangle(canvas, [310, 600], 770, 200)
148
151
  pen.draw_text(canvas, [730, 620], 'DYI::Shape')
149
152
  base_class.draw(canvas, pen, [650,630])
150
153
 
151
- canvas.save 'output/test.svg'
154
+ canvas.save 'output/class_diagram.svg'
@@ -1,6 +1,7 @@
1
1
  # -*- encoding: UTF-8 -*-
2
2
 
3
- require '../lib/dyi'
3
+ require 'rubygems'
4
+ require 'dyi'
4
5
 
5
6
  chart = DYI::Chart::LineChart.new 800,500,
6
7
  :use_y_second_axises => [true, nil],
@@ -21,6 +22,6 @@ chart = DYI::Chart::LineChart.new 800,500,
21
22
  reader = DYI::Chart::CsvReader.read('data/money.csv', :data_types => [:number, :number, :string], :title_column=>0, :column_skip => 1)
22
23
  chart.load_data reader
23
24
 
24
- chart.save 'output/test.svg'
25
- chart.save 'output/test.eps', :eps
26
- chart.save 'output/test.emf', :emf if defined? IRONRUBY_VERSION
25
+ chart.save 'output/line_and_bar.svg'
26
+ chart.save 'output/line_and_bar.eps', :eps
27
+ chart.save 'output/line_and_bar.emf', :emf if defined? IRONRUBY_VERSION
@@ -1,6 +1,7 @@
1
1
  # -*- encoding: UTF-8 -*-
2
2
 
3
- require '../lib/dyi'
3
+ require 'rubygems'
4
+ require 'dyi'
4
5
 
5
6
  gr = DYI::Drawing::ColorEffect::LinearGradient.new([0,0],[0,1])
6
7
  gr.add_color(0, '#8FD3F5')
@@ -24,7 +25,7 @@ chart = DYI::Chart::LineChart.new 720,300,
24
25
  reader = DYI::Chart::ExcelReader.read('data/03311056.xlsx', :sheet => 'Sheet2', :title_column=>1, :column_skip=>2, :title_row=>1, :row_skip=>2)
25
26
  chart.load_data reader
26
27
 
27
- chart.save 'output/test.svg'
28
- chart.save 'output/test.xaml', :xaml
29
- chart.save 'output/test.eps', :eps
30
- chart.save 'output/test.emf', :emf if defined? IRONRUBY_VERSION
28
+ chart.save 'output/line_chart.svg'
29
+ chart.save 'output/line_chart.xaml', :xaml
30
+ chart.save 'output/line_chart.eps', :eps
31
+ chart.save 'output/line_chart.emf', :emf if defined? IRONRUBY_VERSION
data/examples/logo.rb CHANGED
@@ -1,5 +1,7 @@
1
+ # -*- encoding: UTF-8 -*-
2
+
1
3
  require 'rubygems'
2
- require '../lib/dyi'
4
+ require 'dyi'
3
5
 
4
6
  canvas = DYI::Drawing::Canvas.new(287.008, 162.637)
5
7
 
@@ -1,6 +1,7 @@
1
1
  # -*- encoding: UTF-8 -*-
2
2
 
3
- require '../lib/dyi'
3
+ require 'rubygems'
4
+ require 'dyi'
4
5
 
5
6
  chart = DYI::Chart::PieChart.new 400,500,
6
7
  :data_label_format => "{name}\n{percent}",
@@ -13,7 +14,7 @@ chart = DYI::Chart::PieChart.new 400,500,
13
14
  reader = DYI::Chart::ExcelReader.read('data/currency.xlsx', :title_column=>0, :column_skip=>1)
14
15
  chart.load_data reader
15
16
 
16
- chart.save 'output/test.svg'
17
- chart.save 'output/test.xaml', :xaml
18
- chart.save 'output/test.eps', :eps
19
- chart.save 'output/test.emf', :emf if defined? IRONRUBY_VERSION
17
+ chart.save 'output/pie_chart.svg'
18
+ chart.save 'output/pie_chart.xaml', :xaml
19
+ chart.save 'output/pie_chart.eps', :eps
20
+ chart.save 'output/pie_chart.emf', :emf if defined? IRONRUBY_VERSION
@@ -1,4 +1,7 @@
1
- require '../lib/dyi'
1
+ # -*- encoding: UTF-8 -*-
2
+
3
+ require 'rubygems'
4
+ require 'dyi'
2
5
 
3
6
  canvas = DYI::Drawing::Canvas.new(500, 500)
4
7
 
@@ -12,4 +15,4 @@ brush.draw_circle(canvas, center_point, 20)
12
15
  pen = DYI::Drawing::Pen.new(:color => '#CCFFCC', :width => 5)
13
16
  pen.draw_line(canvas, [150,70], [80,140])
14
17
 
15
- canvas.save 'output/test.svg'
18
+ canvas.save 'output/simple_shape.svg'
data/lib/dyi.rb CHANGED
@@ -21,7 +21,8 @@
21
21
 
22
22
 
23
23
  module DYI
24
- VERSION = '0.0.0'
24
+ VERSION = '0.0.2'
25
+ URL = 'http://sourceforge.net/projects/dyi/'
25
26
  end
26
27
 
27
28
  %w(
@@ -75,7 +75,7 @@ module DYI #:nodoc:
75
75
  if represent_3d?
76
76
  brush = Drawing::ColumnBrush.new(back_translate_value.merge(chart_stroke_color ? {:stroke_width => chart_stroke_width, :stroke => chart_stroke_color} : {}))
77
77
  else
78
- brush = Drawing::Brush.new(chart_stroke_color ? {:stroke_width => chart_stroke_width, :stroke => chart_stroke_color, :stroke_miterlimit => chart_stroke_width / 2.0} : {})
78
+ brush = Drawing::Brush.new(chart_stroke_color ? {:stroke_width => chart_stroke_width, :stroke => chart_stroke_color, :stroke_miterlimit => chart_stroke_width} : {})
79
79
  end
80
80
  @chart_canvas = Shape::ShapeGroup.draw_on(@canvas)
81
81
  @data_label_canvas = Shape::ShapeGroup.draw_on(@canvas)
@@ -129,11 +129,11 @@ module DYI #:nodoc:
129
129
  legend_point = Coordinate.new(
130
130
  chart_radius_x * (data_label_position + (dr || 0)) * Math.cos(((accumulation * 2.0 + value) / total_value - 0.5) * Math::PI),
131
131
  chart_radius_y * (data_label_position + (dr || 0)) * Math.sin(((accumulation * 2.0 + value) / total_value - 0.5) * Math::PI))
132
- Drawing::Pen.black_pen(:font => legend_font).draw_text(
132
+ Drawing::Pen.black_pen(:font => data_label_font).draw_text(
133
133
  @data_label_canvas,
134
134
  center_point + legend_point,
135
135
  data_label_format.gsub(/\{name\}/, name).gsub(/\{value\}/, value.to_s).gsub(/\{percent\}/, '%.1f%' % (ratio * 100.0).to_s),
136
- :text_anchor => 'middle', :font => data_label_font)
136
+ :text_anchor => 'middle')
137
137
  end if hide_data_label_ratio < ratio
138
138
  end
139
139
  end
@@ -175,7 +175,7 @@ module DYI #:nodoc:
175
175
  end
176
176
 
177
177
  def generator_comment
178
- %Q{<!-- Create with DYI #{VERSION} (http://xxxx/) -->}
178
+ %Q{<!-- Create with DYI #{DYI::VERSION} (#{DYI::URL}) -->}
179
179
  end
180
180
 
181
181
  def declaration
@@ -29,6 +29,7 @@ module DYI #:nodoc:
29
29
  def header_comment
30
30
  <<-EOS
31
31
  %!PS-Adobe-3.0 EPSF-3.0
32
+ %%Creator: DYI #{DYI::VERSION} (#{DYI::URL})
32
33
  %%CreationDate: #{Time.now.strftime('%a %b %d %H:%M:%S %Y')}
33
34
  %%BoundingBox: 0 0 #{@canvas.real_width.to_f('pt').ceil} #{@canvas.real_height.to_f('pt').ceil}
34
35
  %%EndComments
@@ -19,6 +19,7 @@
19
19
  # You should have received a copy of the GNU General Public License
20
20
  # along with DYI. If not, see <http://www.gnu.org/licenses/>.
21
21
 
22
+ require 'enumerator'
22
23
  require 'rexml/document'
23
24
 
24
25
  module DYI #:nodoc:
@@ -70,42 +71,75 @@ module DYI #:nodoc:
70
71
 
71
72
  def create_path(element)
72
73
  color = DYI::Color.new(element.attributes['fill']) if element.attributes['fill'] != 'none'
73
- pathes = element.attributes['d'].scan(/(M|L|l|H|h|V|v|C|c|z)\s*(\s*(?:\s*,?[\-\.0-9]+)*)/)
74
- path = nil
75
- if pathes.first.first == 'M'
76
- pathes.each do |p_el|
77
- coors = p_el[1].scan(/-?[\.0-9]+/).map {|s| s.to_f}
78
- case p_el.first
79
- when 'M'
80
- if path
81
- path.move_to(coors)
82
- else
83
- path = DYI::Shape::Path.new(coors, :painting => {:fill => color})
74
+ paths = element.attributes['d'].scan(/([MmZzLlHhVvCcSsQqTtAa])\s*([+-]?(?:\d+\.?\d*|\.\d+)(?:\s*,?\s*[+-]?(?:\d+\.?\d*|\.\d+))*)?/)
75
+ enumerator = paths.each
76
+ path_element = enumerator.next
77
+ if path_element.first.upcase == 'M'
78
+ lengths = path_element[1].scan(/[+-]?(?:\d+\.?\d*|\.\d+)/).map{|n| DYI::Length.new(n)}
79
+ return if lengths.count % 2 == 1
80
+ points = lengths.each_slice(2).map{|x, y| DYI::Coordinate.new(x, y)}
81
+ path_data = DYI::Shape::Path::PathData.new(*points)
82
+ loop do
83
+ path_element = enumerator.next
84
+ case path_element.first
85
+ when 'M', 'm', 'L', 'l', 'C', 'c', 'S', 's', 'Q', 'q', 'T', 't'
86
+ lengths = path_element[1].scan(/[+-]?(?:\d+\.?\d*|\.\d+)/).map{|n| DYI::Length.new(n)}
87
+ return unless lengths.size % 2 == 0
88
+ command_type = case path_element.first
89
+ when 'M' then :move_to
90
+ when 'm' then :rmove_to
91
+ when 'L' then :line_to
92
+ when 'l' then :rline_to
93
+ when 'C' then :curve_to
94
+ when 'c' then :rcurve_to
95
+ when 'S' then :shorthand_curve_to
96
+ when 's' then :rshorthand_curve_to
97
+ when 'Q' then :quadratic_curve_to
98
+ when 'q' then :rquadratic_curve_to
99
+ when 'T' then :shorthand_quadratic_curve_to
100
+ when 't' then :rshorthand_quadratic_curve_to
101
+ end
102
+ points = lengths.each_slice(2).map{|x, y| DYI::Coordinate.new(x, y)}
103
+ path_data.push_command(command_type, *points)
104
+ when 'Z', 'z'
105
+ path_data.push_command(:close_path, *lengths)
106
+ when 'H', 'h', 'V', 'v'
107
+ lengths = path_element[1].scan(/[+-]?(?:\d+\.?\d*|\.\d+)/).map{|n| DYI::Length.new(n)}
108
+ command_type = case path_element.first
109
+ when 'H' then :horizontal_lineto_to
110
+ when 'h' then :rhorizontal_lineto_to
111
+ when 'V' then :vertical_lineto_to
112
+ when 'v' then :rvertical_lineto_to
113
+ end
114
+ path_data.push_command(command_type, *lengths)
115
+ when 'A', 'a'
116
+ params = []
117
+ enumerator = path_element[1].scan(/[+-]?(?:\d+\.?\d*|\.\d+)/).each
118
+ return unless enumerator.count % 7 == 0
119
+ loop do
120
+ rx = enumerator.next
121
+ ry = enumerator.next
122
+ rotation = enumerator.next
123
+ is_large_arc = enumerator.next
124
+ is_clockwise = enumerator.next
125
+ cx = enumerator.next
126
+ cy = enumerator.next
127
+ params << DYI::Length.new(rx) << DYI::Length.new(ry)
128
+ params << rotation.to_f
129
+ [is_large_arc, is_clockwise].each do |flg|
130
+ case flg
131
+ when '0' then params << false
132
+ when '1' then params << true
133
+ else return
134
+ end
135
+ end
136
+ params << Coordinate.new(cx, cy)
84
137
  end
85
- when 'L'
86
- path.line_to(coors)
87
- when 'l'
88
- path.line_to(coors, true)
89
- when 'H'
90
- p 'H'
91
- path.line_to([coors.first, path.current_point.y])
92
- when 'h'
93
- path.line_to([coors.first, 0], true)
94
- when 'V'
95
- p 'V'
96
- path.line_to([path.current_point.x, coors.first])
97
- when 'v'
98
- path.line_to([0, coors.first], true)
99
- when 'C'
100
- path.curve_to([coors[0..1], coors[2..3], coors[4..5]])
101
- when 'c'
102
- path.curve_to([coors[0..1], coors[2..3], coors[4..5]], true)
103
- when 'z'
104
- path.close_path
138
+ path_data.push_command(path_element.first == 'A' ? :arc_to : :rarc_to, *params)
105
139
  end
106
140
  end
107
141
  end
108
- path
142
+ DYI::Shape::Path.new(path_data, :painting => {:fill => color})
109
143
  end
110
144
  end
111
145
  end
@@ -286,7 +286,7 @@ module DYI #:nodoc:
286
286
  if linejoin = STROKE_LINE_JOIN[painting.stroke_linejoin]
287
287
  attr[:StrokeLineJoin] = linejoin
288
288
  end
289
- attr[:StrokeMitterLimit] = painting.stroke_miterlimit if painting.stroke_miterlimit
289
+ attr[:StrokeMiterLimit] = painting.stroke_miterlimit if painting.stroke_miterlimit
290
290
  if painting.stroke_width
291
291
  attr[:StrokeThickness] = painting.stroke_width.to_user_unit
292
292
  end
data/lib/dyi/painting.rb CHANGED
@@ -134,7 +134,7 @@ module DYI #:nodoc:
134
134
  end
135
135
 
136
136
  def stroke_miterlimit=(miterlimit)
137
- @stroke_miterlimit = miterlimit.nil? ? nil : miterlimit.to_f
137
+ @stroke_miterlimit = miterlimit.nil? ? nil : [miterlimit.to_f, 1].max
138
138
  end
139
139
 
140
140
  def stroke_dasharray=(array)
data/lib/dyi/shape.rb CHANGED
@@ -391,7 +391,10 @@ module DYI #:nodoc:
391
391
  attr_painting :painting
392
392
 
393
393
  def initialize(start_point, options={})
394
- @path_data = PathData.new(start_point)
394
+ @path_data = case start_point
395
+ when PathData then start_point
396
+ else PathData.new(start_point)
397
+ end
395
398
  @attributes = init_attributes(options)
396
399
  end
397
400
 
@@ -946,7 +949,7 @@ module DYI #:nodoc:
946
949
  end
947
950
 
948
951
  def to_compatible_commands(preceding_command)
949
- LineCommand.new(relative?, preceding_command, pt)
952
+ LineCommand.new(relative?, preceding_command, @point)
950
953
  end
951
954
 
952
955
  def to_concise_syntax_fragments
@@ -964,7 +967,7 @@ module DYI #:nodoc:
964
967
  end
965
968
 
966
969
  def to_compatible_commands(preceding_command)
967
- LineCommand.new(relative?, preceding_command, pt)
970
+ LineCommand.new(relative?, preceding_command, @point)
968
971
  end
969
972
 
970
973
  def to_concise_syntax_fragments
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dyi
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Yuo
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-07-15 00:00:00 Z
18
+ date: 2011-09-05 00:00:00 Z
19
19
  dependencies: []
20
20
 
21
21
  description: " DYI is a 2D graphics library, very rich and expressive.\n DYI have been optimized for SVG format, but it is also possible\n to output other format; for example, EPS.\n"
@@ -27,6 +27,7 @@ extensions: []
27
27
  extra_rdoc_files: []
28
28
 
29
29
  files:
30
+ - CHANGES
30
31
  - COPYING
31
32
  - examples/class_diagram.rb
32
33
  - examples/data/03311056.xlsx