{
  "nbformat_minor": 0, 
  "nbformat": 4, 
  "cells": [
    {
      "execution_count": null, 
      "cell_type": "code", 
      "source": [
        "%matplotlib inline"
      ], 
      "outputs": [], 
      "metadata": {
        "collapsed": false
      }
    }, 
    {
      "source": [
        "\nSphere example\n--------------\n\nSubclassing Anatomist objects\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 anatomist\nfrom soma import aims\nimport six\n\n\nclass ASphere(anatomist.cpp.ASurface_3):\n\n    def __init__(self, mesh=None):\n        self._center = aims.Point3df(0, 0, 0)\n        self._radius = 100\n        if mesh is not None:\n            if type(mesh) is six.string_types:\n                # mesh is a filename: read it\n                anatomist.cpp.ASurface_3.__init__(self, mesh)\n                r = aims.Reader()\n                m = aims.rc_ptr_AimsTimeSurface_3(r.read(mesh))\n                self.setSurface(m)\n            else:\n                # mesh should be an Aims mesh: assign it\n                anatomist.cpp.ASurface_3.__init__(self)\n                self.setSurface(mesh)\n        else:\n            # generate a sphere mesh\n            anatomist.cpp.ASurface_3.__init__(self)\n            m = aims.rc_ptr_AimsTimeSurface_3(aims.SurfaceGenerator.sphere(\n                                              self._center, self._radius, 100))\n            self.setSurface(m)\n\n    def radius(self):\n        return self._radius\n\n    def center(self):\n        return self._center\n\n    def setCenter(self, c):\n        if type(c) is not aims.Point3df:\n            c = aims.Point3df(*c)\n        cdiff = c - self._center\n        self._center = c\n        # translate all\n        v = self.surface().vertex()\n        for vi in v:\n            vi += cdiff\n        self.setChanged()\n        self.UpdateMinAndMax()\n        self.notifyObservers()\n\n    def setRadius(self, r):\n        if r == 0:\n            print('can\\'t assign radius 0')\n            return\n        scl = float(r) / self._radius\n        self._radius = float(r)\n        # scale all\n        v = self.surface().vertex()\n        c = self._center\n        for vi in v:\n            vi.assign((vi - c) * scl + c)\n        self.setChanged()\n        self.UpdateMinAndMax()\n        self.notifyObservers()\n\n# example\n\n\nif __name__ == '__main__':\n    a = anatomist.Anatomist()\n    s = ASphere()\n    s.setName('sphere')\n    a.registerObject(s)\n\n    # import qt\n    # qt.qApp.exec_loop()"
      ], 
      "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"
      }
    }
  }
}