Creating layouts: data visualisation

Macro file: datamap.lym

This application creates a 2-dimensional function plot by employing differently colored layers to display the pixel of the data map. 256 Layers are created representing values from 0 to 1.0 of the function "sin(r)/r". To make the picture more attractive, five functions starting from different origins are superimposed. The function is evaluated on the 500x500 grid, each grid point is assigned a value, the value is mapped to a layer and a box is created to represent the pixel.

Source code

module Examples

  app = RBA::Application.instance
  mw = app.main_window
  
  #  creates a new layout 
  mw.create_layout(0)
  view = mw.current_view
  cv = view.cellview(0)
  
  #  creates a new layer in that layout
  layout = cv.layout 
  
  layer_ids = []
  
  #  computes a table for the anti-gamma correction
  gamma = 2.2
  gamma_map = []
  256.times do |l|
    gamma_map << (((l / 255.0) ** (1.0 / gamma)) * 255.0 + 0.5).to_i
  end
  
  #  initializes the layer table with a color map:
  #    0            -> blue
  #    128 (== 0.5) -> green
  #    255 (== 1.0) -> red
  
  256.times do |l|
  
    linfo = RBA::LayerInfo.new 
    layer_id = layout.insert_layer(linfo)
  
    #  computes the color per value
    if l >= 128 
      c = gamma_map[(l - 128) * 2] * 0x10000 + gamma_map[2 * (255 - l)] * 0x100
    elsif l > 0
      c = gamma_map[(128 - l) * 2] + gamma_map[2 * l] * 0x100
    else 
      c = 0xff
    end
    
    #  creates a layer view for that layer
    ln = RBA::LayerPropertiesNode::new
    ln.dither_pattern = 0 
    ln.fill_color = c
    ln.frame_color = c
    ln.width = 1
    ln.source_layer_index = layer_id
    view.insert_layer(view.end_layers, ln)
  
    layer_ids.push(layer_id)
  
  end
  
  #  replicates last layer to allow values of 256 (mapped to 255) ..
  layer_ids.push(layer_ids[255])
  
  #  creates a top cell
  topcell = layout.create_cell("top")
  
  #  creates the image
  
  nx = 500
  ny = 500
  radius = 100
  
  pts = [ 
    [ -nx * 0.25, ny * 0.25 ],
    [ nx * 0.25, ny * 0.25 ],
    [ -nx * 0.25, -ny * 0.25 ],
    [ nx * 0.25, -ny * 0.25 ],
    [ -nx * 0.15, -ny * 0.35 ],
    [ 0, -ny * 0.37 ],
    [ nx * 0.15, -ny * 0.35 ]
  ]
  
  x = -nx / 2
  nx.times do
    y = -ny / 2
    ny.times do 
      v = 0.0
      pts.each do |pt|
        r = Math::sqrt((x - pt[0]) ** 2 + (y - pt[1]) ** 2) * Math::PI * 2.0 / radius
        if r.abs < 1e-6
          v += 1.0
        else
          v += Math::sin(r) / r
        end
      end
      vi = ([ 1.0, v ].min ** 2 * 255.0 + 0.5).to_i
      box = RBA::Box::new(x * 100, y * 100, (x + 1) * 100, (y + 1) * 100)
      topcell.shapes(layer_ids[vi]).insert_box(box)
      y += 1
    end
    x += 1
  end
  
  #  selects his cell as the top cell, fits all and switches on all hierarchy levels
  cv.cell = topcell
  view.zoom_fit
  view.max_hier
  

end