lib/rubyvis/layout/network.rb in rubyvis-0.3.2 vs lib/rubyvis/layout/network.rb in rubyvis-0.3.3
- old
+ new
@@ -73,48 +73,60 @@
# @see Rubyvis::Layout::Matrix
# @see Rubyvis::Layout::Arc
# @see Rubyvis::Layout::Rollup
class Network < Rubyvis::Layout
@properties=Layout.properties.dup
- attr_accessor :node, :link, :node_label
+ # The node prototype. This prototype is intended to be used with a
+ # Dot mark in conjunction with the link prototype.
+ attr_accessor :node
+ # The link prototype, which renders edges between source nodes and target
+ # nodes. This prototype is intended to be used with a Line mark in
+ # conjunction with the node prototype.
+ attr_accessor :link
+ # The node label prototype, which renders the node name adjacent to the node.
+ # This prototype is provided as an alternative to using the anchor on the
+ # node mark; it is primarily intended to be used with radial node-link
+ # layouts, since it provides a convenient mechanism to set the text angle.
+ #
+ # NOTE FOR PROTOVIS USERS: The original name of method was +label+
+ # but it was replaced to not conflict with rubyvis shortcut
+ # method Mark.label()
+ attr_accessor :node_label
attr_accessor :_id
def initialize
super
@_id=Rubyvis.id()
@node=_node
@link=_link
@node_label=_node_label
end
- # The node prototype. This prototype is intended to be used with a
- # Dot mark in conjunction with the link prototype.
- def _node
+
+ def _node #:nodoc:
that=self
m=Mark.new().
data(lambda {that.nodes}).
stroke_style("#1f77b4").
fill_style("#fff").
left(lambda {|n| n.x }).
top(lambda {|n| n.y })
m.parent = self
m
end
- module LinkAdd
+ module LinkAdd # :nodoc:
attr_accessor :that
def add(type)
that=@that
return that.add(Rubyvis::Panel).
data(lambda {that.links}).
add(type).
mark_extend(self)
end
end
- # The link prototype, which renders edges between source nodes and target
- # nodes. This prototype is intended to be used with a Line mark in
- # conjunction with the node prototype.
+
- def _link
+ def _link # :nodoc:
that=self
l=Mark.new().
mark_extend(@node).
data(lambda {|d| [d.source_node, d.target_node] }).
fill_style(nil).
@@ -123,18 +135,12 @@
l.extend LinkAdd
l.that=self
l
end
- # The node label prototype, which renders the node name adjacent to the node.
- # This prototype is provided as an alternative to using the anchor on the
- # node mark; it is primarily intended to be used with radial node-link
- # layouts, since it provides a convenient mechanism to set the text angle.
- #
- # NOTE FOR PROTOVIS USERS: The original name of method was +label+
- # but it was replaced to not conflict with Mark.label()
- def _node_label
+
+ def _node_label #:nodoc:
that=self
nl=Mark.new().
mark_extend(@node).
text_margin(7).
text_baseline("middle").
@@ -147,26 +153,43 @@
Rubyvis::Wedge.upright(n.mid_angle) ? "left" : "right"
})
nl.parent = self
nl
end
+
##
- # :class: Node
- # Represents a node in a network layout. There is no explicit
- # constructor; this class merely serves to document the attributes that are
- # used on nodes in network layouts. (Note that hierarchical nodes place
- # additional requirements on node representation, vis Rubyvis::Dom::Node
+ # :attr: nodes
+ #
+ # an array of objects representing nodes. Objects in this array must conform to the Rubyvis::Layout::Network::Node interface; which is
+ # to say, be careful to avoid naming collisions with automatic attributes such
+ # as <tt>index</tt> and <tt>link_degree</tt>. If the nodes property is defined
+ # as an array of 'primitives' (objects which doesn't respond to node_value)
+ # these primitives are automatically wrapped in an OpenStruct object;
+ # the resulting object's <tt>node_value</tt>
+ # attribute points to the original primitive value.
attr_accessor_dsl [:nodes, lambda {|v|
out=[]
v.each_with_index {|d,i|
d=OpenStruct.new({:node_value=>d}) unless d.respond_to? :node_value
d.index=i
out.push(d)
}
out
}]
+
+ ##
+ # :attr: links
+ #
+ # an array of objects representing links. Objects in
+ # this array must conform to the Rubyvis::Layout::Network::Link interface; at a
+ # minimum, either <tt>source</tt> and <tt>target</tt> indexes or
+ # <tt>source_node</tt> and <tt>target_node</tt> references must be set.
+ # Note that if the links property is defined after the nodes property,
+ # the links can be defined in terms of <tt>self.nodes()</tt>.
+
+
attr_accessor_dsl [:links, lambda {|v|
out=[]
v.map {|d|
if !d.link_value.is_a? Numeric
d.link_value = !d.value.is_a?(Numeric) ? 1 : d.value
@@ -187,22 +210,22 @@
self
end
# @private Skip evaluating properties if cached. */
- def build_properties(s, properties)
+ def build_properties(s, properties) # :nodoc:
s_id=s._id
s_id||=0
if (s_id < self._id)
layout_build_properties(s,properties)
end
end
- def build_implied(s)
+ def build_implied(s) # :nodoc:
network_build_implied(s)
end
- def network_build_implied(s)
+ def network_build_implied(s) # :nodoc:
layout_build_implied(s)
return true if (!s._id.nil? and s._id >= self._id)
s._id= self._id
s.nodes.each do |d|
@@ -222,12 +245,12 @@
end
false
end
- # Represents a node in a network layout. There is no explicit
- # constructor; this class merely serves to document the attributes that are
+ # Represents a node in a network layout.
+ # This class mostly serves to document the attributes that are
# used on nodes in network layouts. (Note that hierarchical nodes place
# additional requirements on node representation, vis Rubyvis::Dom::Node.)
#
class Node
# The node index, zero-based. This attribute is populated automatically based
@@ -243,27 +266,23 @@
# @type number
attr_accessor :link_degree
# The node name; optional. If present, this attribute will be used to provide
# the text for node labels. If not present, the label text will fallback to the
- # <tt>nodeValue</tt> attribute.
+ # <tt>node_value</tt> attribute.
#
# @type string
attr_accessor :node_name
- # The node value; optional. If present, and no <tt>nodeName</tt> attribute is
- # present, the node value will be used as the label text. This attribute is
- # also automatically populated if the nodes are specified as an array of
- # primitives, such as strings or numbers.
- #
- # @type object
+ # The node value; optional. If present, and no <tt>node_name</tt> attribute is present, the node value will be used as the label text.
+ # This attribute is also automatically populated if the nodes are specified as an array of 'primitives', such as strings or numbers.
attr_accessor :node_value
end
- # Represents a link in a network layout. There is no explicit
- # constructor; this class merely serves to document the attributes that are
+ # Represents a link in a network layout.
+ # This class mostly serves to document the attributes that are
# used on links in network layouts. For hierarchical layouts, this class is
# used to represent the parent-child links.
#
# @see pv.Layout.Network
# @name pv.Layout.Network.Link
@@ -275,40 +294,40 @@
end
# The link value, or weight; optional. If not specified (or not a number), the
# default value of 1 is used.
#
# @type number
- # @name pv.Layout.Network.Link.prototype.linkValue
- #/
+
+
attr_accessor :link_value
# The link's source node. If not set, this value will be derived from the
# <tt>source</tt> attribute index.
#
# @type pv.Layout.Network.Node
- # @name pv.Layout.Network.Link.prototype.sourceNode
+
attr_accessor :source_node
# The link's target node. If not set, this value will be derived from the
# <tt>target</tt> attribute index.
#
# @type pv.Layout.Network.Node
- # @name pv.Layout.Network.Link.prototype.targetNode
+
attr_accessor :target_node
# Alias for <tt>sourceNode</tt>, as expressed by the index of the source node.
# This attribute is not populated automatically, but may be used as a more
# convenient identification of the link's source, for example in a static JSON
# representation.
#
# @type number
- # @name pv.Layout.Network.Link.prototype.source
+
attr_accessor :source
# Alias for <tt>targetNode</tt>, as expressed by the index of the target node.
# This attribute is not populated automatically, but may be used as a more
# convenient identification of the link's target, for example in a static JSON
# representation.
#
# @type number
- # @name pv.Layout.Network.Link.prototype.target
+
attr_accessor :target
# Alias for <tt>linkValue</tt>. This attribute is not populated automatically,
# but may be used instead of the <tt>linkValue</tt> attribute when specifying
# links.
#