Class: CTioga2::Graphics::Elements::Parametric2D

Inherits:
PlotBasedElement show all
Includes:
Log, Dobjects
Defined in:
lib/ctioga2/graphics/elements/parametric2d.rb

Overview

TODO:

Find a mechanism to really say what varies. Ideally, one

This class represents a 3D (or more, to be seen later) dataset as markers with various parameters parametrized (color, transparency, marker scale, marker type (discrete), possibly stroke and fill colors ?

would want to say:

  • Y2 is marker color

  • Y3 is marker size

  • Y4 only takes discrete values and represents markers

However, this is complex enough to be left out of the curve factory, I think. Color maps can be used for colors, but for the rest, things will have to be implemented as parameters to the curve generator, or even separated commands.

Constant Summary

Constants inherited from TiogaElement

TiogaElement::StyleBaseOptions

Instance Attribute Summary collapse

Attributes inherited from PlotBasedElement

#curve_style, #dataset

Attributes inherited from TiogaElement

#clipped, #depth, #hidden, #location, #object_classes, #object_id, #object_parent, #parent

Instance Method Summary collapse

Methods included from Log

context, counts, debug, error, fatal, #format_exception, #identify, info, init_logger, log_to, logger, set_level, #spawn, warn

Methods inherited from PlotBasedElement

#clipped, #depth, #location

Methods inherited from TiogaElement

all_styles, base_style, #check_styled, define_style, #do, find_object, find_objects, #get_style, #has_style?, inherited, #inspect, register_object, register_style, #setup_style, #style_class, style_class, style_name, #style_name, styled_classes, #update_style

Constructor Details

#initialize(dataset, style = nil, parametric_plot_style = nil) ⇒ Parametric2D

Creates a new Curve2D object with the given dataset and style.



58
59
60
61
62
63
64
# File 'lib/ctioga2/graphics/elements/parametric2d.rb', line 58

def initialize(dataset, style = nil, parametric_plot_style = nil)
  @dataset = dataset
  @curve_style = style
  
  @parametric_style = parametric_plot_style
  prepare_data
end

Instance Attribute Details

#functionObject

For convenience only: xy functions



47
48
49
# File 'lib/ctioga2/graphics/elements/parametric2d.rb', line 47

def function
  @function
end

#parametric_styleObject

A ParametricPlotStyle object handling the correspondance between Z axis and stylistic aspects



54
55
56
# File 'lib/ctioga2/graphics/elements/parametric2d.rb', line 54

def parametric_style
  @parametric_style
end

#planesObject

A hash Z value -> corresponding XY functions.



50
51
52
# File 'lib/ctioga2/graphics/elements/parametric2d.rb', line 50

def planes
  @planes
end

Instance Method Details

#draw_markers(t) ⇒ Object

Draws the markers, if applicable.



122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/ctioga2/graphics/elements/parametric2d.rb', line 122

def draw_markers(t)
  if @curve_style.has_marker?
    # We use a default color map for the markers
    @curve_style.marker_color_map ||= 
      Styles::ColorMap.from_text("Red--Green")

    @dataset.each_values do |i,x,y,*z|
      ms = @parametric_style.marker_style(@curve_style, 
                                          z, @zmin, @zmax)
      ms.draw_markers_at(t, x, y)
    end
  end
end

#draw_path(t) ⇒ Object

Draws the path lines, if applicable.



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/ctioga2/graphics/elements/parametric2d.rb', line 98

def draw_path(t)
  min = @dataset.z.values.min
  max = @dataset.z.values.max
  if @curve_style.has_line?
    # We use a default color map for the lines
    @curve_style.color_map ||= 
      Styles::ColorMap.from_text("Red--Green")
    cmap = @curve_style.color_map

    for zs in @planes.keys.sort ## \todo have the sort
                                ## direction configurable.
      f = @planes[zs]
      color = cmap.z_color(zs, min, max)
      t.context do 
        @curve_style.line.set_stroke_style(t)
        t.stroke_color = color
        t.show_polyline(f.x, f.y)
      end
    end
  end
end

#get_boundariesObject

Returns the Types::Boundaries of this curve.



93
94
95
# File 'lib/ctioga2/graphics/elements/parametric2d.rb', line 93

def get_boundaries
  return Types::Boundaries.bounds(@function.x, @function.y)
end

#real_do(t) ⇒ Object

Actually draws the curve



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/ctioga2/graphics/elements/parametric2d.rb', line 137

def real_do(t)
  debug { "Plotting curve #{inspect}" }
  t.context do
    ## \todo allow customization of the order of drawing,
    ## using a simple user-specificable array of path,
    ## markers... and use the corresponding #draw_path or
    ## #draw_markers... Ideally, any string could be used, and
    ## warnings should be issued on missing symbols.

    # draw_fill(t)
    # draw_errorbars(t)

    @parametric_style.prepare
    if @dataset.z_columns < @parametric_style.z_columns_needed
      error { "Need #{@parametric_style.z_columns_needed} Z columns, but have only #{@dataset.z_columns} for dataset #{@dataset.name}" }
      return
    end
      
    draw_path(t)
    draw_markers(t)

    if @curve_style.zaxis
      begin
        @parent.style.get_axis_style(@curve_style.zaxis).
          set_color_map(@curve_style.marker_color_map, 
                        @dataset.z.values.min,
                        @dataset.z.values.max)
      rescue
        error { "Could not set Z info to non-existent axis #{@curve_style.zaxis}" }
      end
    end

    # draw_error_bars(t) ??
  end
end