{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# Sphere example\n\nSubclassing Anatomist objects\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "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()"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.11.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}