ctioga2 0.9 → 0.10
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.
- data/Changelog +27 -0
- data/bin/ct2-make-movie +92 -45
- data/lib/ctioga2/commands/doc/html.rb +1 -1
- data/lib/ctioga2/commands/doc/introspection.rb +52 -0
- data/lib/ctioga2/commands/doc/markup.rb +4 -0
- data/lib/ctioga2/commands/general-commands.rb +19 -0
- data/lib/ctioga2/commands/general-functions.rb +8 -1
- data/lib/ctioga2/commands/general-types.rb +14 -3
- data/lib/ctioga2/commands/parsers/file.rb +20 -3
- data/lib/ctioga2/data/backends/backends/math.rb +1 -1
- data/lib/ctioga2/data/backends/backends/text.rb +3 -3
- data/lib/ctioga2/data/point.rb +1 -1
- data/lib/ctioga2/graphics/elements.rb +1 -0
- data/lib/ctioga2/graphics/elements/curve2d.rb +5 -0
- data/lib/ctioga2/graphics/elements/primitive.rb +16 -14
- data/lib/ctioga2/graphics/elements/style-lists.rb +353 -0
- data/lib/ctioga2/graphics/elements/subplot.rb +17 -2
- data/lib/ctioga2/graphics/elements/tangent.rb +16 -17
- data/lib/ctioga2/graphics/styles.rb +1 -0
- data/lib/ctioga2/graphics/styles/axes.rb +63 -0
- data/lib/ctioga2/graphics/styles/base.rb +13 -0
- data/lib/ctioga2/graphics/styles/colorbrewer.rb +316 -0
- data/lib/ctioga2/graphics/styles/colormap.rb +47 -7
- data/lib/ctioga2/graphics/styles/image.rb +83 -0
- data/lib/ctioga2/graphics/styles/plot.rb +43 -7
- data/lib/ctioga2/graphics/styles/sets.rb +47 -5
- data/lib/ctioga2/graphics/styles/sheet.rb +18 -3
- data/lib/ctioga2/graphics/styles/texts.rb +49 -8
- data/lib/ctioga2/graphics/subplot-commands.rb +13 -13
- data/lib/ctioga2/graphics/types.rb +42 -10
- data/lib/ctioga2/graphics/types/boundaries.rb +3 -2
- data/lib/ctioga2/graphics/types/boxes.rb +13 -0
- data/lib/ctioga2/graphics/types/dimensions.rb +4 -1
- data/lib/ctioga2/graphics/types/location.rb +13 -2
- data/lib/ctioga2/graphics/types/point.rb +86 -0
- data/lib/ctioga2/metabuilder/types/styles.rb +2 -2
- data/lib/ctioga2/plotmaker.rb +3 -0
- data/lib/ctioga2/ruby.rb +49 -0
- data/lib/ctioga2/utils.rb +34 -0
- data/lib/ctioga2/version.rb +2 -2
- metadata +8 -4
| @@ -49,17 +49,23 @@ module CTioga2 | |
| 49 49 | 
             
                    # @todo These are currently not implemented.
         | 
| 50 50 | 
             
                    attr_accessor :below, :above
         | 
| 51 51 |  | 
| 52 | 
            -
                    # Whether the map  | 
| 53 | 
            -
                    # default.
         | 
| 52 | 
            +
                    # Whether the map is interpolated in the RGB (true) or HLS
         | 
| 53 | 
            +
                    # (false) color space. On by default.
         | 
| 54 54 | 
             
                    #
         | 
| 55 55 | 
             
                    # It does not change anything with respect to how the colors
         | 
| 56 56 | 
             
                    # are interpreted: whatever happens, the values are RGB.
         | 
| 57 57 | 
             
                    attr_accessor :rgb
         | 
| 58 58 |  | 
| 59 | 
            +
                    # Whether or not the map should be considered symmetric around
         | 
| 60 | 
            +
                    # a given value.
         | 
| 61 | 
            +
                    attr_accessor :symmetry_center
         | 
| 62 | 
            +
             | 
| 59 63 | 
             
                    def initialize(values = [], colors = [])
         | 
| 60 64 | 
             
                      @values = values.dup
         | 
| 61 65 | 
             
                      @colors = colors.dup
         | 
| 62 66 |  | 
| 67 | 
            +
                      @symmetry_center = nil
         | 
| 68 | 
            +
             | 
| 63 69 | 
             
                      @rgb = true
         | 
| 64 70 | 
             
                    end
         | 
| 65 71 |  | 
| @@ -77,12 +83,33 @@ module CTioga2 | |
| 77 83 | 
             
                    def self.from_text(str)
         | 
| 78 84 | 
             
                      str = str.dup
         | 
| 79 85 | 
             
                      hls = false
         | 
| 80 | 
            -
                      re = /natural:?/i     # Not too bad ?
         | 
| 86 | 
            +
                      re = /(natural|hls|wheel):?/i     # Not too bad ?
         | 
| 81 87 | 
             
                      if str =~ re
         | 
| 82 88 | 
             
                        str.sub!(re,'')
         | 
| 83 89 | 
             
                        hls = true
         | 
| 84 90 | 
             
                      end
         | 
| 85 91 |  | 
| 92 | 
            +
                      sym = nil
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                      re = /:(?:sym|around):(.*)$/i
         | 
| 95 | 
            +
                      if str =~ re
         | 
| 96 | 
            +
                        sym = $1.to_f
         | 
| 97 | 
            +
                        str.sub!(re,'')
         | 
| 98 | 
            +
                      end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                      # We first try to see if it could be a color set ?
         | 
| 101 | 
            +
                      colorsettype = Commands::CommandType.get_type('color-set')
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                      begin 
         | 
| 104 | 
            +
                        set = colorsettype.string_to_type(str)
         | 
| 105 | 
            +
                        cm = ColorMap.new([nil] * set.size, set)
         | 
| 106 | 
            +
                        cm.rgb = ! hls
         | 
| 107 | 
            +
                        cm.symmetry_center = sym
         | 
| 108 | 
            +
                        return cm
         | 
| 109 | 
            +
                      rescue Exception => e
         | 
| 110 | 
            +
                        # This is not a color set
         | 
| 111 | 
            +
                      end
         | 
| 112 | 
            +
             | 
| 86 113 | 
             
                      l = str.split(/::/)
         | 
| 87 114 |  | 
| 88 115 |  | 
| @@ -141,6 +168,7 @@ module CTioga2 | |
| 141 168 | 
             
                      cm.above = above
         | 
| 142 169 | 
             
                      cm.below = below
         | 
| 143 170 | 
             
                      cm.rgb = ! hls
         | 
| 171 | 
            +
                      cm.symmetry_center = sym
         | 
| 144 172 | 
             
                      return cm
         | 
| 145 173 | 
             
                    end
         | 
| 146 174 |  | 
| @@ -241,6 +269,19 @@ module CTioga2 | |
| 241 269 | 
             
                    def z_values(zmin, zmax)
         | 
| 242 270 | 
             
                      # Real Z values.
         | 
| 243 271 | 
             
                      z_values = @values.dup
         | 
| 272 | 
            +
             | 
| 273 | 
            +
                      # We tweak the zmin and zmax to be symmetric around the
         | 
| 274 | 
            +
                      # symmetry_center should that be needed.
         | 
| 275 | 
            +
                      if @symmetry_center
         | 
| 276 | 
            +
                        dmin = (zmin - @symmetry_center).abs
         | 
| 277 | 
            +
                        dmax = (zmax - @symmetry_center).abs
         | 
| 278 | 
            +
                        
         | 
| 279 | 
            +
                        dfin = [dmin, dmax].max
         | 
| 280 | 
            +
                        zmin = @symmetry_center - dfin
         | 
| 281 | 
            +
                        zmax = @symmetry_center + dfin
         | 
| 282 | 
            +
                        
         | 
| 283 | 
            +
                      end
         | 
| 284 | 
            +
             | 
| 244 285 | 
             
                      z_values[0] ||= zmin
         | 
| 245 286 | 
             
                      z_values[-1] ||= zmax
         | 
| 246 287 |  | 
| @@ -252,10 +293,9 @@ module CTioga2 | |
| 252 293 | 
             
                        if z_values[i]
         | 
| 253 294 | 
             
                          if last_value + 1 < i
         | 
| 254 295 | 
             
                            (last_value+1).upto(i - 1) do |j|
         | 
| 255 | 
            -
                              frac = (j - last_value)/(i - last_value | 
| 256 | 
            -
                               | 
| 257 | 
            -
             | 
| 258 | 
            -
                                z_values[i] * (1 - frac)
         | 
| 296 | 
            +
                              frac = (j - last_value )/(i - last_value*1.0)
         | 
| 297 | 
            +
                              z_values[j] = z_values[last_value] * (1 - frac) + 
         | 
| 298 | 
            +
                                z_values[i] * frac
         | 
| 259 299 | 
             
                            end
         | 
| 260 300 | 
             
                          end
         | 
| 261 301 | 
             
                          last_value = i
         | 
| @@ -0,0 +1,83 @@ | |
| 1 | 
            +
            # image.rb: style of images
         | 
| 2 | 
            +
            # copyright (c) 2014 by Vincent Fourmond
         | 
| 3 | 
            +
              
         | 
| 4 | 
            +
            # This program is free software; you can redistribute it and/or modify
         | 
| 5 | 
            +
            # it under the terms of the GNU General Public License as published by
         | 
| 6 | 
            +
            # the Free Software Foundation; either version 2 of the License, or
         | 
| 7 | 
            +
            # (at your option) any later version.
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
            # This program is distributed in the hope that it will be useful,
         | 
| 10 | 
            +
            # but WITHOUT ANY WARRANTY; without even the implied warranty of
         | 
| 11 | 
            +
            # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
         | 
| 12 | 
            +
            # GNU General Public License for more details (in the COPYING file).
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            require 'ctioga2/utils'
         | 
| 15 | 
            +
            require 'ctioga2/log'
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            # This module contains all the classes used by ctioga
         | 
| 18 | 
            +
            module CTioga2
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              module Graphics
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                # All the styles
         | 
| 23 | 
            +
                module Styles
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  AspectRatioRE = {
         | 
| 26 | 
            +
                    /ignore/i => :ignore,
         | 
| 27 | 
            +
                    /expand/i => :expand,
         | 
| 28 | 
            +
                    /contract/i => :contract,
         | 
| 29 | 
            +
                  }
         | 
| 30 | 
            +
                  
         | 
| 31 | 
            +
                  AspectRatioType = 
         | 
| 32 | 
            +
                    CmdType.new('aspect-ratio', 
         | 
| 33 | 
            +
                                {:type => :re_list,
         | 
| 34 | 
            +
                                  :list => AspectRatioRE}, <<EOD)
         | 
| 35 | 
            +
            How the {command: draw-image} command respects the original image
         | 
| 36 | 
            +
            aspect ratio:
         | 
| 37 | 
            +
             * @ignore@ (the default) ignores the original aspect ratio
         | 
| 38 | 
            +
             * @expand@ expand the original box to respect aspect ratio
         | 
| 39 | 
            +
             * @contract@ contract the original box to respect aspect ratio
         | 
| 40 | 
            +
            EOD
         | 
| 41 | 
            +
                    
         | 
| 42 | 
            +
             | 
| 43 | 
            +
             | 
| 44 | 
            +
                  # This class represents the style for an image
         | 
| 45 | 
            +
                  class ImageStyle < BasicStyle
         | 
| 46 | 
            +
                    # The line style
         | 
| 47 | 
            +
                    typed_attribute :aspect_ratio, 'aspect-ratio'
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    # The line width
         | 
| 50 | 
            +
                    typed_attribute :transparency, 'float'
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                    # Automatically rotate
         | 
| 53 | 
            +
                    typed_attribute :auto_rotate, 'boolean'
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                    # Draws an image according to this
         | 
| 56 | 
            +
                    def draw_image(t, file, tl, br)
         | 
| 57 | 
            +
                      info = t.jpg_info(file)
         | 
| 58 | 
            +
                      if ! info
         | 
| 59 | 
            +
                        info = t.load_png(file)
         | 
| 60 | 
            +
                      end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                      r = Types::Rect.new(tl, br)
         | 
| 63 | 
            +
                      ul, ll, lr = r.make_corners(t, (@auto_rotate == nil ? true : @auto_rotate), @aspect_ratio || :ignore,
         | 
| 64 | 
            +
                                                  info['width']*1.0/info['height'])
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                      dict = info.dup
         | 
| 67 | 
            +
                      dict.merge!('ul' => ul,
         | 
| 68 | 
            +
                                  'll' => ll,
         | 
| 69 | 
            +
                                  'lr' => lr,)
         | 
| 70 | 
            +
                      
         | 
| 71 | 
            +
                      # @todo provide a way to reuse images ?
         | 
| 72 | 
            +
                      t.context do
         | 
| 73 | 
            +
                        if @transparency
         | 
| 74 | 
            +
                          t.fill_opacity = 1 - @transparency
         | 
| 75 | 
            +
                        end
         | 
| 76 | 
            +
                        t.show_image(dict)
         | 
| 77 | 
            +
                      end
         | 
| 78 | 
            +
                    end
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
              end
         | 
| 82 | 
            +
            end
         | 
| 83 | 
            +
             | 
| @@ -79,6 +79,11 @@ module CTioga2 | |
| 79 79 | 
             
                    # Mode for auto-adjust
         | 
| 80 80 | 
             
                    attr_accessor :text_auto_adjust
         | 
| 81 81 |  | 
| 82 | 
            +
                    # If not nil, then the boundaries are computed from the real
         | 
| 83 | 
            +
                    # dimensions of the plot frame, using the given number as a
         | 
| 84 | 
            +
                    # conversion factor from the output dimensions.
         | 
| 85 | 
            +
                    attr_accessor :frame_real_size
         | 
| 86 | 
            +
             | 
| 82 87 |  | 
| 83 88 | 
             
                    @@current_index = 0
         | 
| 84 89 |  | 
| @@ -108,7 +113,6 @@ module CTioga2 | |
| 108 113 | 
             
                        StyleSheet.style_for(TextLabel, 'title',
         | 
| 109 114 | 
             
                                             nil, 
         | 
| 110 115 | 
             
                                             Types::PlotLocation.new(:top))
         | 
| 111 | 
            -
             | 
| 112 116 | 
             
                      @plot_margin = nil
         | 
| 113 117 |  | 
| 114 118 | 
             
                      @transforms = CoordinateTransforms.new
         | 
| @@ -307,7 +311,7 @@ module CTioga2 | |
| 307 311 | 
             
                          exts << @title.label_extension(t, 'title', @title.loc) * 
         | 
| 308 312 | 
             
                            (@text_scale || 1)
         | 
| 309 313 | 
             
                        end
         | 
| 310 | 
            -
                        Types::Dimension.new(:dy, exts.max)
         | 
| 314 | 
            +
                        Types::Dimension.new(:dy, exts.max || 0)
         | 
| 311 315 | 
             
                      end
         | 
| 312 316 |  | 
| 313 317 | 
             
                      box = Types::MarginsBox.new(*margins)
         | 
| @@ -319,6 +323,15 @@ module CTioga2 | |
| 319 323 | 
             
                      return box
         | 
| 320 324 | 
             
                    end
         | 
| 321 325 |  | 
| 326 | 
            +
                    # Clear all axes
         | 
| 327 | 
            +
                    def clear_axes()
         | 
| 328 | 
            +
                      [:left, :right, :top, :bottom].each do |loc|
         | 
| 329 | 
            +
                        style = get_axis_style(loc)
         | 
| 330 | 
            +
                        style.decoration = Tioga::FigureConstants::AXIS_HIDDEN
         | 
| 331 | 
            +
                        style.axis_label.text = false
         | 
| 332 | 
            +
                      end
         | 
| 333 | 
            +
                    end
         | 
| 334 | 
            +
             | 
| 322 335 | 
             
                    # Computes the margins based on the text information.
         | 
| 323 336 | 
             
                    #
         | 
| 324 337 | 
             
                    # This is very different from the one above, since this one
         | 
| @@ -433,11 +446,7 @@ EOH | |
| 433 446 | 
             
                  ClearAxesCommand = 
         | 
| 434 447 | 
             
                      Cmd.new("clear-axes",nil,"--clear-axes"
         | 
| 435 448 | 
             
                              ) do |plotmaker, opts|
         | 
| 436 | 
            -
                     | 
| 437 | 
            -
                      style = AxisStyle.current_axis_style(plotmaker, loc)
         | 
| 438 | 
            -
                      style.decoration = Tioga::FigureConstants::AXIS_HIDDEN
         | 
| 439 | 
            -
                      style.axis_label.text = false
         | 
| 440 | 
            -
                    end
         | 
| 449 | 
            +
                    PlotStyle.current_plot_style(plotmaker).clear_axes
         | 
| 441 450 | 
             
                  end
         | 
| 442 451 | 
             
                  ClearAxesCommand.
         | 
| 443 452 | 
             
                    describe("Clear all axes",
         | 
| @@ -445,6 +454,33 @@ EOH | |
| 445 454 | 
             
            Removes all the axes and their associated labels
         | 
| 446 455 | 
             
            EOH
         | 
| 447 456 |  | 
| 457 | 
            +
                  DrawingFrameCommand = 
         | 
| 458 | 
            +
                    Cmd.new("drawing-frame",nil,"--drawing-frame", [],
         | 
| 459 | 
            +
                            { 'units' => CmdArg.new('text') 
         | 
| 460 | 
            +
                            }) do |plotmaker, opts|
         | 
| 461 | 
            +
                    style = PlotStyle.current_plot_style(plotmaker)
         | 
| 462 | 
            +
                    style.clear_axes
         | 
| 463 | 
            +
                    style.padding = nil
         | 
| 464 | 
            +
                    u = opts['units'] || 'cm'
         | 
| 465 | 
            +
                    if u =~ /([\d.]+)?\s*(cm|in|bp|pt|mm)/
         | 
| 466 | 
            +
                      nb = $1 ? $1.to_f : 1.0
         | 
| 467 | 
            +
                      un = $2
         | 
| 468 | 
            +
                      style.frame_real_size = 10 * nb * 
         | 
| 469 | 
            +
                        Types::Dimension::DimensionConversion.fetch(un)
         | 
| 470 | 
            +
                    else
         | 
| 471 | 
            +
                      raise 'Invalid unit'
         | 
| 472 | 
            +
                    end
         | 
| 473 | 
            +
                  end
         | 
| 474 | 
            +
                  DrawingFrameCommand.
         | 
| 475 | 
            +
                    describe("Setup a drawing frame",
         | 
| 476 | 
            +
                             <<"EOH", AxisGroup)
         | 
| 477 | 
            +
            Setup a drawing frame, ie a frame in which the top-left point is at
         | 
| 478 | 
            +
            0,0, with X and Y values positive over the whole frame, and counted in
         | 
| 479 | 
            +
            centimeters (or with the unit given using the @/units@ option, ie
         | 
| 480 | 
            +
            @/units=mm@ expressed in millimeters or @/units=12pt@ expressed in
         | 
| 481 | 
            +
            multiple of 12 TeX points).
         | 
| 482 | 
            +
            EOH
         | 
| 483 | 
            +
             | 
| 448 484 |  | 
| 449 485 | 
             
                  TicksCommand = 
         | 
| 450 486 | 
             
                      Cmd.new("ticks",nil,"--ticks", 
         | 
| @@ -1,5 +1,5 @@ | |
| 1 | 
            -
            #  | 
| 2 | 
            -
            # copyright (c) 2009 by Vincent Fourmond
         | 
| 1 | 
            +
            # sets.rb: sets
         | 
| 2 | 
            +
            # copyright (c) 2009, 2014 by Vincent Fourmond
         | 
| 3 3 |  | 
| 4 4 | 
             
            # This program is free software; you can redistribute it and/or modify
         | 
| 5 5 | 
             
            # it under the terms of the GNU General Public License as published by
         | 
| @@ -14,6 +14,8 @@ | |
| 14 14 | 
             
            require 'ctioga2/utils'
         | 
| 15 15 | 
             
            require 'ctioga2/log'
         | 
| 16 16 |  | 
| 17 | 
            +
            require 'ctioga2/graphics/styles/colorbrewer'
         | 
| 18 | 
            +
             | 
| 17 19 | 
             
            # This module contains all the classes used by ctioga
         | 
| 18 20 | 
             
            module CTioga2
         | 
| 19 21 |  | 
| @@ -39,16 +41,56 @@ module CTioga2 | |
| 39 41 | 
             
                      [LightPlum, PaleGreen, Gold, RedBrown, SkyBlue ],
         | 
| 40 42 | 
             
                      "gnuplot" => 
         | 
| 41 43 | 
             
                      [Red, [0,1.0,0], Blue, Magenta, Cyan, Yellow, Black, Coral, Gray],
         | 
| 42 | 
            -
             | 
| 43 44 | 
             
                    }
         | 
| 45 | 
            +
                    
         | 
| 46 | 
            +
                    begin
         | 
| 47 | 
            +
                      t = Tioga::FigureMaker.new
         | 
| 48 | 
            +
                      lst = []
         | 
| 49 | 
            +
                      10.times do |i|
         | 
| 50 | 
            +
                        lst << t.hls_to_rgb([36*i, 0.5, 1.0])
         | 
| 51 | 
            +
                      end
         | 
| 52 | 
            +
                      ColorSets['wheel10'] = lst
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                      lst = []
         | 
| 55 | 
            +
                      20.times do |i|
         | 
| 56 | 
            +
                        lst << t.hls_to_rgb([18*i, 0.5, 1.0])
         | 
| 57 | 
            +
                      end
         | 
| 58 | 
            +
                      ColorSets['wheel20'] = lst
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                      colortype = Commands::CommandType.get_type('color')
         | 
| 61 | 
            +
                      for k,v in ColorBrewerSets
         | 
| 62 | 
            +
                        for n, a in v
         | 
| 63 | 
            +
                          if n > 4
         | 
| 64 | 
            +
                            ColorSets["cb-#{k.downcase}-#{n}"] = a.map do |c|
         | 
| 65 | 
            +
                              colortype.string_to_type(c)
         | 
| 66 | 
            +
                            end
         | 
| 67 | 
            +
                          end
         | 
| 68 | 
            +
                        end
         | 
| 69 | 
            +
                      end
         | 
| 70 | 
            +
                      
         | 
| 71 | 
            +
                    end
         | 
| 44 72 |  | 
| 45 73 | 
             
                    MarkerSets = { 
         | 
| 46 74 | 
             
                      "default" => 
         | 
| 47 | 
            -
                      [Bullet, TriangleUp, Square, Plus, Times],
         | 
| 75 | 
            +
                      [Bullet, TriangleUp, Square, Plus, Times, Diamond, TriangleDown],
         | 
| 48 76 | 
             
                      "open" => 
         | 
| 49 | 
            -
                      [BulletOpen, TriangleUpOpen, SquareOpen, PlusOpen, TimesOpen | 
| 77 | 
            +
                      [BulletOpen, TriangleUpOpen, SquareOpen, PlusOpen, TimesOpen, 
         | 
| 78 | 
            +
                       DiamondOpen, TriangleDownOpen],
         | 
| 50 79 | 
             
                    }
         | 
| 51 80 |  | 
| 81 | 
            +
                    for k, b in { 
         | 
| 82 | 
            +
                        'number1' => 171, 
         | 
| 83 | 
            +
                        'number2' => 181, 
         | 
| 84 | 
            +
                        'number3' => 191, 
         | 
| 85 | 
            +
                        'number4' => 201
         | 
| 86 | 
            +
                      }
         | 
| 87 | 
            +
                      lst = []
         | 
| 88 | 
            +
                      1.upto(10) do |i|
         | 
| 89 | 
            +
                        lst << [14, b + i]
         | 
| 90 | 
            +
                      end
         | 
| 91 | 
            +
                      MarkerSets[k] = lst
         | 
| 92 | 
            +
                    end
         | 
| 93 | 
            +
             | 
| 52 94 | 
             
                    LineWidthSets = {
         | 
| 53 95 | 
             
                      'default' => [1.0]
         | 
| 54 96 | 
             
                    }
         | 
| @@ -152,6 +152,15 @@ module CTioga2 | |
| 152 152 | 
             
                    def self.current_sheet()
         | 
| 153 153 | 
             
                      return @sheet
         | 
| 154 154 | 
             
                    end
         | 
| 155 | 
            +
             | 
| 156 | 
            +
             | 
| 157 | 
            +
                    # Updates the style sheet concerning the _what_ of class _cls_
         | 
| 158 | 
            +
                    # with the given values
         | 
| 159 | 
            +
                    def self.update_style(cls, what, values)
         | 
| 160 | 
            +
                      StyleSheet.current_sheet.own_styles[cls] ||= {}
         | 
| 161 | 
            +
                      StyleSheet.current_sheet.own_styles[cls][what] ||= {}
         | 
| 162 | 
            +
                      StyleSheet.current_sheet.own_styles[cls][what].merge!(values)
         | 
| 163 | 
            +
                    end
         | 
| 155 164 |  | 
| 156 165 | 
             
                  end
         | 
| 157 166 |  | 
| @@ -183,6 +192,7 @@ EOD | |
| 183 192 | 
             
                           ['marker', MarkerStringStyle, 'marker'],
         | 
| 184 193 | 
             
                           ['box', BoxStyle, 'boxes'],
         | 
| 185 194 | 
             
                           ['arrow', ArrowStyle, 'arrows'],
         | 
| 195 | 
            +
                           ['image', ImageStyle, 'image'],
         | 
| 186 196 | 
             
                           ['line', StrokeStyle, 'lines']
         | 
| 187 197 | 
             
                          ]
         | 
| 188 198 |  | 
| @@ -200,9 +210,7 @@ EOD | |
| 200 210 | 
             
                              ], 
         | 
| 201 211 | 
             
                              cls.options_hash
         | 
| 202 212 | 
             
                              ) do |plotmaker, what, opts|
         | 
| 203 | 
            -
                      StyleSheet. | 
| 204 | 
            -
                      StyleSheet.current_sheet.own_styles[cls][what] ||= {}
         | 
| 205 | 
            -
                      StyleSheet.current_sheet.own_styles[cls][what].merge!(opts)
         | 
| 213 | 
            +
                      StyleSheet.update_style(cls, what, opts)
         | 
| 206 214 | 
             
                    end
         | 
| 207 215 | 
             
                    StyleSheetCommands[name].
         | 
| 208 216 | 
             
                      describe("Sets the default style for the given #{desc}.", 
         | 
| @@ -340,7 +348,14 @@ Axis styles have lots of parameters: | |
| 340 348 | 
             
             * @background-lines-@ parameters define the style of background lines, 
         | 
| 341 349 | 
             
               as in {command: define-line-style}
         | 
| 342 350 | 
             
            EOD
         | 
| 351 | 
            +
             | 
| 352 | 
            +
             | 
| 353 | 
            +
                  # Here, a few defaults styles
         | 
| 343 354 |  | 
| 355 | 
            +
                  StyleSheet.update_style(TextLabel, 'title', {
         | 
| 356 | 
            +
                                            'text_width' => 
         | 
| 357 | 
            +
                                            Types::Dimension.new(:frame, 1.0, :x)
         | 
| 358 | 
            +
                                          })
         | 
| 344 359 | 
             
                end
         | 
| 345 360 | 
             
              end
         | 
| 346 361 | 
             
            end
         | 
| @@ -44,15 +44,23 @@ module CTioga2 | |
| 44 44 | 
             
                    # The vertical alignment 
         | 
| 45 45 | 
             
                    typed_attribute :alignment, 'alignment'
         | 
| 46 46 |  | 
| 47 | 
            +
                    alias_for :valign, :alignment
         | 
| 48 | 
            +
             | 
| 47 49 | 
             
                    # The horizontal alignment
         | 
| 48 50 | 
             
                    typed_attribute :justification, 'justification'
         | 
| 49 51 |  | 
| 52 | 
            +
                    alias_for :halign, :justification
         | 
| 53 | 
            +
             | 
| 50 54 | 
             
                    # A text width
         | 
| 51 | 
            -
                    typed_attribute :text_width, " | 
| 55 | 
            +
                    typed_attribute :text_width, "dimension-or-no"
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                    # A text alignment within the box, only useful if text_width
         | 
| 58 | 
            +
                    # is specified.
         | 
| 59 | 
            +
                    typed_attribute :text_align, 'text-align'
         | 
| 52 60 |  | 
| 53 61 | 
             
                    # Draw the _text_ at the given location with the given style.
         | 
| 54 | 
            -
                    # If _y_ is _nil_, then _x_or_loc_ is taken | 
| 55 | 
            -
                    # (see FigureMaker#show_text).
         | 
| 62 | 
            +
                    # If _y_ is _nil_, or [:pos, _value_] then _x_or_loc_ is taken
         | 
| 63 | 
            +
                    # to be a location (see FigureMaker#show_text).
         | 
| 56 64 | 
             
                    def draw_text(t, text, x_or_loc, y = nil, measure = nil)
         | 
| 57 65 | 
             
                      t.context do
         | 
| 58 66 | 
             
                        dict = prepare_show_text_dict(t, text, x_or_loc, y, measure)
         | 
| @@ -88,18 +96,24 @@ module CTioga2 | |
| 88 96 | 
             
                      return dict
         | 
| 89 97 | 
             
                    end
         | 
| 90 98 |  | 
| 99 | 
            +
                    def vertical?(loc)
         | 
| 100 | 
            +
                      if loc
         | 
| 101 | 
            +
                        return Types::PlotLocation.new(loc).vertical?
         | 
| 102 | 
            +
                      else
         | 
| 103 | 
            +
                        ang = angle || 0
         | 
| 104 | 
            +
                        return Math.sin(ang*3.14/180)**2 > 0.5
         | 
| 105 | 
            +
                      end
         | 
| 106 | 
            +
                    end
         | 
| 107 | 
            +
             | 
| 91 108 | 
             
                    protected
         | 
| 92 109 |  | 
| 93 110 | 
             
                    # Prepares the dictionnary for use with show_text
         | 
| 94 111 | 
             
                    def prepare_show_text_dict(t, text, x_or_loc, y = nil, measure = nil)
         | 
| 95 112 | 
             
                      dict = self.hash_for_tioga(t)
         | 
| 96 | 
            -
                      if @text_width
         | 
| 97 | 
            -
                        text = "\\parbox{#{@text_width}}{#{text}}"
         | 
| 98 | 
            -
                      end
         | 
| 99 113 |  | 
| 100 | 
            -
                       | 
| 114 | 
            +
                      loc = nil
         | 
| 101 115 |  | 
| 102 | 
            -
                      if y
         | 
| 116 | 
            +
                      if y && (! y.is_a?(Array))
         | 
| 103 117 | 
             
                        dict['at'] = [x_or_loc, y]
         | 
| 104 118 | 
             
                      else
         | 
| 105 119 | 
             
                        # Perform automatic conversion on the location
         | 
| @@ -107,13 +121,40 @@ module CTioga2 | |
| 107 121 | 
             
                        when Symbol, Types::PlotLocation
         | 
| 108 122 | 
             
                          ## @todo It won't be easy to implement shifts for this,
         | 
| 109 123 | 
             
                          ## though it may be useful eventually.
         | 
| 124 | 
            +
                          loc = x_or_loc
         | 
| 110 125 | 
             
                          x_or_loc = Types::PlotLocation.new(x_or_loc).tioga_location
         | 
| 111 126 | 
             
                        end
         | 
| 112 127 | 
             
                        dict['loc'] = x_or_loc
         | 
| 128 | 
            +
                        if y
         | 
| 129 | 
            +
                          dict['position'] = y[1]
         | 
| 130 | 
            +
                        end
         | 
| 113 131 | 
             
                      end
         | 
| 114 132 | 
             
                      if measure
         | 
| 115 133 | 
             
                        dict['measure'] = measure
         | 
| 116 134 | 
             
                      end
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                      if @text_width
         | 
| 137 | 
            +
                        dir = (vertical?(loc) ? :y : :x)
         | 
| 138 | 
            +
                        dim = @text_width.to_bp(t, dir)
         | 
| 139 | 
            +
                        dim /= t.default_text_scale
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                        aln = @text_align || @justification || Tioga::FigureConstants::CENTERED
         | 
| 142 | 
            +
                        cmd = 
         | 
| 143 | 
            +
                          case aln
         | 
| 144 | 
            +
                          when Tioga::FigureConstants::CENTERED
         | 
| 145 | 
            +
                            '\centering{}'
         | 
| 146 | 
            +
                          when Tioga::FigureConstants::LEFT_JUSTIFIED
         | 
| 147 | 
            +
                            '\raggedright{}'
         | 
| 148 | 
            +
                          when Tioga::FigureConstants::RIGHT_JUSTIFIED
         | 
| 149 | 
            +
                            '\raggedleft{}'
         | 
| 150 | 
            +
                          else
         | 
| 151 | 
            +
                            ''
         | 
| 152 | 
            +
                          end
         | 
| 153 | 
            +
                        text = "\\parbox{#{dim}bp}{#{cmd}#{text}}"
         | 
| 154 | 
            +
                      end
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                      dict['text'] = text
         | 
| 157 | 
            +
             | 
| 117 158 | 
             
                      return dict
         | 
| 118 159 | 
             
                    end
         | 
| 119 160 | 
             
                  end
         |