Hello,

I'm using infoviz and web2py and trying to create the Force Directed graph.

here is my code:
************************************************************************controller:
def visual():
    import json
    import os
    infile = open(os.path.join(request.folder, 'private', 'jsondata.txt'))
    data = json.load(infile)
    return dict(data=data)

************************************************************************ 
view:
{{extend 'layout.html'}}

<head>
<title>ForceDirected - Force Directed Static Graph</title>

<!-- CSS Files -->
<link type="text/css" href="{{=URL('static','css/base.css')}}" 
rel="stylesheet" />
<link type="text/css" href="{{=URL('static','css/ForceDirected.css')}}" 
rel="stylesheet" />

<!-- JIT Library File -->
<script language="javascript" type="text/javascript" 
src="{{=URL('static','js/jit.js')}}"></script>

<!-- Example File -->
<script language="javascript" type="text/javascript" 
src="{{=URL('static','js/example1.js')}}"></script>
</head>
{{=data}}
<body onload="init();">
<div id="container">

<div id="left-container">



        <div class="text">
        <h4>
Force Directed Static Graph    
        </h4> 

            A static JSON Graph structure is used as input for this 
visualization.<br /><br />
            You can <b>zoom</b> and <b>pan</b> the visualization by 
<b>scrolling</b> and <b>dragging</b>.<br /><br />
            You can <b>change node positions</b> by <b>dragging the nodes 
around</b>.<br /><br />
            The clicked node's connections are displayed in a relations 
list in the right column.<br /><br />
            The JSON static data is customized to provide different node 
types, colors and widths.
            
        </div>

        <div id="id-list"></div>


          
</div>

<div id="center-container">
    <div id="infovis"></div>    
</div>

<div id="right-container">

<div id="inner-details"></div>

</div>

<div id="log"></div>
</div>
</body>
</html>


************************************************************************example1.js
 
file:
var labelType, useGradients, nativeTextSupport, animate;

(function() {
  var ua = navigator.userAgent,
      iStuff = ua.match(/iPhone/i) || ua.match(/iPad/i),
      typeOfCanvas = typeof HTMLCanvasElement,
      nativeCanvasSupport = (typeOfCanvas == 'object' || typeOfCanvas == 
'function'),
      textSupport = nativeCanvasSupport 
        && (typeof 
document.createElement('canvas').getContext('2d').fillText == 'function');
  //I'm setting this based on the fact that ExCanvas provides text support 
for IE
  //and that as of today iPhone/iPad current text support is lame
  labelType = (!nativeCanvasSupport || (textSupport && !iStuff))? 'Native' 
: 'HTML';
  nativeTextSupport = labelType == 'Native';
  useGradients = nativeCanvasSupport;
  animate = !(iStuff || !nativeCanvasSupport);
})();

var Log = {
  elem: false,
  write: function(text){
    if (!this.elem) 
      this.elem = document.getElementById('log');
    this.elem.innerHTML = text;
    this.elem.style.left = (500 - this.elem.offsetWidth / 2) + 'px';
  }
};


function init(){
  // init data
  var json = {{=XML(data)}};
  // end
  // init ForceDirected
  var fd = new $jit.ForceDirected({
    //id of the visualization container
    injectInto: 'infovis',
    //Enable zooming and panning
    //by scrolling and DnD
    Navigation: {
      enable: true,
      //Enable panning events only if we're dragging the empty
      //canvas (and not a node).
      panning: 'avoid nodes',
      zooming: 10 //zoom speed. higher is more sensible
    },
    // Change node and edge styles such as
    // color and width.
    // These properties are also set per node
    // with dollar prefixed data-properties in the
    // JSON structure.
    Node: {
      overridable: true
    },
    Edge: {
      overridable: true,
      color: '#23A4FF',
      lineWidth: 0.4
    },
    //Native canvas text styling
    Label: {
      type: labelType, //Native or HTML
      size: 10,
      style: 'bold'
    },
    //Add Tips
    Tips: {
      enable: true,
      onShow: function(tip, node) {
        //count connections
        var count = 0;
        node.eachAdjacency(function() { count++; });
        //display node info in tooltip
        tip.innerHTML = "<div class=\"tip-title\">" + node.name + "</div>"
          + "<div class=\"tip-text\"><b>connections:</b> " + count + 
"</div>";
      }
    },
    // Add node events
    Events: {
      enable: true,
      type: 'Native',
      //Change cursor style when hovering a node
      onMouseEnter: function() {
        fd.canvas.getElement().style.cursor = 'move';
      },
      onMouseLeave: function() {
        fd.canvas.getElement().style.cursor = '';
      },
      //Update node positions when dragged
      onDragMove: function(node, eventInfo, e) {
          var pos = eventInfo.getPos();
          node.pos.setc(pos.x, pos.y);
          fd.plot();
      },
      //Implement the same handler for touchscreens
      onTouchMove: function(node, eventInfo, e) {
        $jit.util.event.stop(e); //stop default touchmove event
        this.onDragMove(node, eventInfo, e);
      },
      //Add also a click handler to nodes
      onClick: function(node) {
        if(!node) return;
        // Build the right column relations list.
        // This is done by traversing the clicked node connections.
        var html = "<h4>" + node.name + "</h4><b> connections:</b><ul><li>",
            list = [];
        node.eachAdjacency(function(adj){
          list.push(adj.nodeTo.name);
        });
        //append connections information
        $jit.id('inner-details').innerHTML = html + list.join("</li><li>") 
+ "</li></ul>";
      }
    },
    //Number of iterations for the FD algorithm
    iterations: 200,
    //Edge length
    levelDistance: 130,
    // Add text to the labels. This method is only triggered
    // on label creation and only for DOM labels (not native canvas ones).
    onCreateLabel: function(domElement, node){
      domElement.innerHTML = node.name;
      var style = domElement.style;
      style.fontSize = "0.8em";
      style.color = "#ddd";
    },
    // Change node styles when DOM labels are placed
    // or moved.
    onPlaceLabel: function(domElement, node){
      var style = domElement.style;
      var left = parseInt(style.left);
      var top = parseInt(style.top);
      var w = domElement.offsetWidth;
      style.left = (left - w / 2) + 'px';
      style.top = (top + 10) + 'px';
      style.display = '';
    }
  });
  // load JSON data.
  fd.loadJSON(json);
  // compute positions incrementally and animate.
  fd.computeIncremental({
    iter: 40,
    property: 'end',
    onStep: function(perc){
      Log.write(perc + '% loaded...');
    },
    onComplete: function(){
      Log.write('done');
      fd.animate({
        modes: ['linear'],
        transition: $jit.Trans.Elastic.easeOut,
        duration: 2500
      });
    }
  });
  // end
}
**********************************************************

I've been trying to follow the examples of first converting the json data 
to XML, and it looks correct in the view when I type {{=data}} to make sure 
the json is getting passed properly.

However when I type   var json = {{=XML(data)}}; in my example1.js folder 
nothing happens. Do I need to somehow load the data into the view before 
the javascript starts processing it?

Here is the json data:

[{u'adjacencies': [u'graphnode21', {u'nodeTo': u'graphnode1', u'nodeFrom': 
u'graphnode0', u'data': {u'$color': u'#557EAA'}}, {u'nodeTo': 
u'graphnode13', u'nodeFrom': u'graphnode0', u'data': {u'$color': 
u'#909291'}}, {u'nodeTo': u'graphnode14', u'nodeFrom': u'graphnode0', 
u'data': {u'$color': u'#557EAA'}}, {u'nodeTo': u'graphnode15', u'nodeFrom': 
u'graphnode0', u'data': {u'$color': u'#557EAA'}}, {u'nodeTo': 
u'graphnode16', u'nodeFrom': u'graphnode0', u'data': {u'$color': 
u'#557EAA'}}, {u'nodeTo': u'graphnode17', u'nodeFrom': u'graphnode0', 
u'data': {u'$color': u'#557EAA'}}], u'data': {u'$type': u'circle', u'$dim': 
10, u'$color': u'#83548B'}, u'id': u'graphnode0', u'name': u'graphnode0'}, 
{u'adjacencies': [{u'nodeTo': u'graphnode2', u'nodeFrom': u'graphnode1', 
u'data': {u'$color': u'#557EAA'}}, {u'nodeTo': u'graphnode4', u'nodeFrom': 
u'graphnode1', u'data': {u'$color': u'#909291'}}, {u'nodeTo': 
u'graphnode5', u'nodeFrom': u'graphnode1', u'data': {u'$color': 
u'#909291'}}, {u'nodeTo': u'graphnode6', u'nodeFrom': u'graphnode1', 
u'data': {u'$color': u'#909291'}}, {u'nodeTo': u'graphnode7', u'nodeFrom': 
u'graphnode1', u'data': {u'$color': u'#909291'}}, {u'nodeTo': 
u'graphnode8', u'nodeFrom': u'graphnode1', u'data': {u'$color': 
u'#909291'}}, {u'nodeTo': u'graphnode10', u'nodeFrom': u'graphnode1', 
u'data': {u'$color': u'#557EAA'}}, {u'nodeTo': u'graphnode11', u'nodeFrom': 
u'graphnode1', u'data': {u'$color': u'#909291'}}, {u'nodeTo': 
u'graphnode12', u'nodeFrom': u'graphnode1', u'data': {u'$color': 
u'#909291'}}, {u'nodeTo': u'graphnode13', u'nodeFrom': u'graphnode1', 
u'data': {u'$color': u'#557EAA'}}, {u'nodeTo': u'graphnode14', u'nodeFrom': 
u'graphnode1', u'data': {u'$color': u'#557EAA'}}, {u'nodeTo': 
u'graphnode15', u'nodeFrom': u'graphnode1', u'data': {u'$color': 
u'#557EAA'}}, {u'nodeTo': u'graphnode16', u'nodeFrom': u'graphnode1', 
u'data': {u'$color': u'#909291'}}, {u'nodeTo': u'graphnode17', u'nodeFrom': 
u'graphnode1', u'data': {u'$color': u'#557EAA'}}], u'data': {u'$type': 
u'circle', u'$dim': 11, u'$color': u'#EBB056'}, u'id': u'graphnode1', 
u'name': u'graphnode1'}, {u'adjacencies': [{u'nodeTo': u'graphnode5', 
u'nodeFrom': u'graphnode2', u'data': {u'$color': u'#909291'}}, {u'nodeTo': 
u'graphnode9', u'nodeFrom': u'graphnode2', u'data': {u'$color': 
u'#557EAA'}}, {u'nodeTo': u'graphnode18', u'nodeFrom': u'graphnode2', 
u'data': {u'$color': u'#557EAA'}}], u'data': {u'$type': u'circle', u'$dim': 
7, u'$color': u'#416D9C'}, u'id': u'graphnode2', u'name': u'graphnode2'}, 
{u'adjacencies': [{u'nodeTo': u'graphnode5', u'nodeFrom': u'graphnode3', 
u'data': {u'$color': u'#909291'}}, {u'nodeTo': u'graphnode9', u'nodeFrom': 
u'graphnode3', u'data': {u'$color': u'#557EAA'}}, {u'nodeTo': 
u'graphnode10', u'nodeFrom': u'graphnode3', u'data': {u'$color': 
u'#557EAA'}}, {u'nodeTo': u'graphnode12', u'nodeFrom': u'graphnode3', 
u'data': {u'$color': u'#557EAA'}}], u'data': {u'$type': u'square', u'$dim': 
10, u'$color': u'#416D9C'}, u'id': u'graphnode3', u'name': u'graphnode3'}, 
{u'adjacencies': [], u'data': {u'$type': u'square', u'$dim': 11, u'$color': 
u'#83548B'}, u'id': u'graphnode4', u'name': u'graphnode4'}, 
{u'adjacencies': [{u'nodeTo': u'graphnode9', u'nodeFrom': u'graphnode5', 
u'data': {u'$color': u'#909291'}}], u'data': {u'$type': u'triangle', 
u'$dim': 8, u'$color': u'#C74243'}, u'id': u'graphnode5', u'name': 
u'graphnode5'}, {u'adjacencies': [{u'nodeTo': u'graphnode10', u'nodeFrom': 
u'graphnode6', u'data': {u'$color': u'#557EAA'}}, {u'nodeTo': 
u'graphnode11', u'nodeFrom': u'graphnode6', u'data': {u'$color': 
u'#557EAA'}}], u'data': {u'$type': u'circle', u'$dim': 11, u'$color': 
u'#83548B'}, u'id': u'graphnode6', u'name': u'graphnode6'}, 
{u'adjacencies': [], u'data': {u'$type': u'triangle', u'$dim': 12, 
u'$color': u'#EBB056'}, u'id': u'graphnode7', u'name': u'graphnode7'}, 
{u'adjacencies': [], u'data': {u'$type': u'star', u'$dim': 10, u'$color': 
u'#C74243'}, u'id': u'graphnode8', u'name': u'graphnode8'}, 
{u'adjacencies': [], u'data': {u'$type': u'circle', u'$dim': 12, u'$color': 
u'#83548B'}, u'id': u'graphnode9', u'name': u'graphnode9'}, 
{u'adjacencies': [{u'nodeTo': u'graphnode11', u'nodeFrom': u'graphnode10', 
u'data': {u'$color': u'#909291'}}], u'data': {u'$type': u'triangle', 
u'$dim': 11, u'$color': u'#70A35E'}, u'id': u'graphnode10', u'name': 
u'graphnode10'}, {u'adjacencies': [], u'data': {u'$type': u'circle', 
u'$dim': 11, u'$color': u'#70A35E'}, u'id': u'graphnode11', u'name': 
u'graphnode11'}, {u'adjacencies': [], u'data': {u'$type': u'triangle', 
u'$dim': 10, u'$color': u'#83548B'}, u'id': u'graphnode12', u'name': 
u'graphnode12'}, {u'adjacencies': [{u'nodeTo': u'graphnode14', u'nodeFrom': 
u'graphnode13', u'data': {u'$color': u'#557EAA'}}], u'data': {u'$type': 
u'star', u'$dim': 7, u'$color': u'#EBB056'}, u'id': u'graphnode13', 
u'name': u'graphnode13'}, {u'adjacencies': [], u'data': {u'$type': 
u'triangle', u'$dim': 12, u'$color': u'#EBB056'}, u'id': u'graphnode14', 
u'name': u'graphnode14'}, {u'adjacencies': [{u'nodeTo': u'graphnode16', 
u'nodeFrom': u'graphnode15', u'data': {u'$color': u'#557EAA'}}, {u'nodeTo': 
u'graphnode17', u'nodeFrom': u'graphnode15', u'data': {u'$color': 
u'#557EAA'}}], u'data': {u'$type': u'triangle', u'$dim': 11, u'$color': 
u'#83548B'}, u'id': u'graphnode15', u'name': u'graphnode15'}, 
{u'adjacencies': [{u'nodeTo': u'graphnode17', u'nodeFrom': u'graphnode16', 
u'data': {u'$color': u'#557EAA'}}], u'data': {u'$type': u'star', u'$dim': 
7, u'$color': u'#C74243'}, u'id': u'graphnode16', u'name': u'graphnode16'}, 
{u'adjacencies': [], u'data': {u'$type': u'circle', u'$dim': 7, u'$color': 
u'#416D9C'}, u'id': u'graphnode17', u'name': u'graphnode17'}, 
{u'adjacencies': [{u'nodeTo': u'graphnode19', u'nodeFrom': u'graphnode18', 
u'data': {u'$color': u'#557EAA'}}, {u'nodeTo': u'graphnode20', u'nodeFrom': 
u'graphnode18', u'data': {u'$color': u'#557EAA'}}], u'data': {u'$type': 
u'triangle', u'$dim': 9, u'$color': u'#EBB056'}, u'id': u'graphnode18', 
u'name': u'graphnode18'}, {u'adjacencies': [], u'data': {u'$type': 
u'circle', u'$dim': 8, u'$color': u'#70A35E'}, u'id': u'graphnode19', 
u'name': u'graphnode19'}, {u'adjacencies': [], u'data': {u'$type': u'star', 
u'$dim': 8, u'$color': u'#C74243'}, u'id': u'graphnode20', u'name': 
u'graphnode20'}]

Its right out of the example from infoviz

Really appreciate any help and thank you for such a beautiful framework.

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to