{
  "nbformat_minor": 0, 
  "nbformat": 4, 
  "cells": [
    {
      "execution_count": null, 
      "cell_type": "code", 
      "source": [
        "%matplotlib inline"
      ], 
      "outputs": [], 
      "metadata": {
        "collapsed": false
      }
    }, 
    {
      "source": [
        "\n3D Text annotations on a graph\n==============================\n\nDisplay graph labels as 3D text annotations. This code is somewhat equivalent to what happens using the 'A' key in selection control mode (actually this is an ancestor of the module which has been incorporated in Anatomist).\n\n"
      ], 
      "cell_type": "markdown", 
      "metadata": {}
    }, 
    {
      "execution_count": null, 
      "cell_type": "code", 
      "source": [
        "from __future__ import print_function\n\nfrom __future__ import absolute_import\nimport anatomist.direct.api as ana\nfrom soma import aims\nimport os\nimport numpy\nimport sys\nfrom soma.qt_gui.qt_backend import QtGui\nimport six\n\nbyvertex = False\n\n\nclass Props(object):\n\n    def __init__(self):\n        self.lvert = []\n        self.lpoly = []\n        self.usespheres = True\n        self.colorlabels = True\n        self.center = aims.Point3df()\n\n\ndef makelabel(label, gc, pos, color, props):\n    objects = []\n    to = ana.cpp.TextObject(label)\n    to.setScale(0.1)\n    to.setName('label: ' + label)\n    a.registerObject(to, False)\n    a.releaseObject(to)\n    if label in colors:\n        color = colors[label]\n    if props.usespheres:\n        sph = aims.SurfaceGenerator.icosphere(gc, 2, 50)\n        asph = a.toAObject(sph)\n        asph.setMaterial(diffuse=color)\n        asph.setName('gc: ' + label)\n        a.unregisterObject(asph)\n        a.registerObject(asph, False)\n        a.releaseObject(asph)\n        objects.append(asph)\n    if props.colorlabels:\n        to.GetMaterial().set({'diffuse': color})\n    texto = ana.cpp.TransformedObject([to], False, True, pos)\n    texto.setDynamicOffsetFromPoint(props.center)\n    texto.setName('annot: ' + label)\n    objects.append(texto)\n    props.lpoly.append(aims.AimsVector_U32_2((len(props.lvert),\n                                              len(props.lvert) + 1)))\n    props.lvert += [gc, pos]\n    a.registerObject(texto, False)\n    a.releaseObject(texto)\n    return objects\n\n\nrunloop = False\nif QtGui.QApplication.startingUp():\n    runloop = True\n\na = ana.Anatomist()\nqapp = QtGui.QApplication.instance()\nshare = aims.carto.Paths.globalShared()\nnomenclname = os.path.join(aims.carto.Paths.shfjShared(), 'nomenclature',\n                           'hierarchy', 'sulcal_root_colors.hie')\ngraphname = os.path.join(share, 'doc', 'pyanatomist-' + '.'.join(\n    [str(x) for x in aims.version()]), 'examples', 'Rbase.arg')\nlabelatt = 'name'\n\nnomenclature = a.loadObject(nomenclname)\ngraph = aims.read(graphname)\nif 'label_property' in graph:\n    labelatt = graph['label_property']\nagraph = a.toAObject(graph)\nagraph.releaseAppRef()\nw = a.createWindow('3D')\nw.addObjects(agraph, add_graph_nodes=True)\n# lgraphaims = aims.Graph( 'labelsGraph' )\n# lgraph = a.toAObject( lgraphaims )\n\nbbox = agraph.boundingbox()\nbbox = (aims.Point3df(bbox[0][:3]), aims.Point3df(bbox[1][:3]))\nprops = Props()\nprops.center = (bbox[0] + bbox[1]) / 2\n\nsize = (bbox[1] - bbox[0]).norm() * 0.2\nvs = graph['voxel_size'][:3]\nobjects = []\nlines = aims.TimeSurface(2)\n\n\nelements = {}\ncolors = {}\n\nfor v in graph.vertices():\n    if 'gravity_center' in v and labelatt in v:\n        gc = aims.Point3df(numpy.array(v['gravity_center']) * vs)\n        label = v[labelatt]\n        if label != 'unknown':\n            if label not in elements:\n                elem = [aims.Point3df(0, 0, 0), 0.]\n                elements[label] = elem\n            else:\n                elem = elements[label]\n            sz = v['size']\n            elem[0] += gc * sz\n            elem[1] += sz\n            color = [0, 0, 0, 1]\n            if 'ana_object' in v:\n                av = v['ana_object']\n                color = av.GetMaterial().genericDescription()['diffuse']\n                colors[label] = color\n            if byvertex:\n                pos = gc + (gc - props.center).normalize() * size\n                objects += makelabel(label, gc, pos, color, props)\n\n\nif not byvertex:\n    for label, elem in six.iteritems(elements):\n        gc = elem[0] / elem[1]\n        pos = gc + (gc - props.center).normalize() * size\n        if label in colors:\n            color = colors[label]\n        else:\n            color = [0, 0, 0, 1]\n        objects += makelabel(label, gc, pos, color, props)\n\nlines.vertex().assign(props.lvert)\nlines.polygon().assign(props.lpoly)\nalines = a.toAObject(lines)\na.unregisterObject(alines)\na.registerObject(alines, False)\na.releaseObject(alines)\ndel lines\nalines.setMaterial(diffuse=[0, 0, 0, 1])\nobjects.append(alines)\ndel alines\nlabels = a.groupObjects(objects)\nlabels.releaseAppRef()\nw.addObjects(labels, add_children=True)\n\nif 'sphinx_gallery' in sys.modules:\n    w.windowConfig(view_size=[907, 568])\n    w.camera(view_quaternion=[0.520213842391968,\n                              -0.42516353726387,\n                              -0.470633894205093,\n                              0.571941733360291],\n             zoom=0.8187)\n    # display in matplotlib for sphinx_gallery\n    w.sphinx_gallery_snapshot()\n    runloop = False\n\nif runloop:\n    qapp.exec_()\n\nif runloop or 'sphinx_gallery' in sys.modules:\n    del w, nomenclature, agraph, graph, objects, labels, elements, colors"
      ], 
      "outputs": [], 
      "metadata": {
        "collapsed": false
      }
    }
  ], 
  "metadata": {
    "kernelspec": {
      "display_name": "Python 2", 
      "name": "python2", 
      "language": "python"
    }, 
    "language_info": {
      "mimetype": "text/x-python", 
      "nbconvert_exporter": "python", 
      "name": "python", 
      "file_extension": ".py", 
      "version": "2.7.17", 
      "pygments_lexer": "ipython2", 
      "codemirror_mode": {
        "version": 2, 
        "name": "ipython"
      }
    }
  }
}